rtracklayer/DESCRIPTION0000644000175400017540000000341013556147727015650 0ustar00biocbuildbiocbuildPackage: rtracklayer Title: R interface to genome annotation files and the UCSC genome browser Version: 1.46.0 Author: Michael Lawrence, Vince Carey, Robert Gentleman Depends: R (>= 3.3), methods, GenomicRanges (>= 1.37.2) Imports: XML (>= 1.98-0), BiocGenerics (>= 0.25.1), S4Vectors (>= 0.23.18), IRanges (>= 2.13.13), XVector (>= 0.19.7), GenomeInfoDb (>= 1.15.2), Biostrings (>= 2.47.6), zlibbioc, RCurl (>= 1.4-2), Rsamtools (>= 1.31.2), GenomicAlignments (>= 1.15.6), tools Suggests: BSgenome (>= 1.33.4), humanStemCell, microRNA (>= 1.1.1), genefilter, limma, org.Hs.eg.db, hgu133plus2.db, GenomicFeatures, BSgenome.Hsapiens.UCSC.hg19, TxDb.Hsapiens.UCSC.hg19.knownGene, RUnit LinkingTo: S4Vectors, IRanges, XVector Description: Extensible framework for interacting with multiple genome browsers (currently UCSC built-in) and manipulating annotation tracks in various formats (currently GFF, BED, bedGraph, BED15, WIG, BigWig and 2bit built-in). The user may export/import tracks to/from the supported browsers, as well as query and modify the browser state, such as the current viewport. Maintainer: Michael Lawrence License: Artistic-2.0 + file LICENSE Collate: io.R web.R ranges.R trackDb.R browser.R ucsc.R readGFF.R gff.R bed.R wig.R utils.R bigWig.R chain.R quickload.R twobit.R fasta.R tabix.R bam.R trackTable.R index.R compression.R test_rtracklayer_package.R ncbi.R igv.R zzz.R biocViews: Annotation,Visualization,DataImport git_url: https://git.bioconductor.org/packages/rtracklayer git_branch: RELEASE_3_10 git_last_commit: e9404ff git_last_commit_date: 2019-10-29 Date/Publication: 2019-10-29 NeedsCompilation: yes Packaged: 2019-10-29 23:48:39 UTC; biocbuild rtracklayer/INSTALL0000644000175400017540000000037313556116552015170 0ustar00biocbuildbiocbuildThe rtracklayer package can use openssl for accessing https URLs when e.g. importing BigWig files. One can set the OPENSSL_LIBS and OPENSSL_CFLAGS environment variables for specifying the relevant linker and preprocessor/compiler flags, respectively. rtracklayer/LICENSE0000644000175400017540000000067713556116552015153 0ustar00biocbuildbiocbuildThe contents of "src/ucsc" fall under the license below. Note that the "src/lib", "src/inc" and "src/utils" refer to directories within the original Kent source tree. In rtracklayer, the files are all under "src/ucsc". All files are copyrighted, but license is hereby granted for personal, academic, and non-profit use. A license is also granted for the contents of the src/lib, src/inc and src/utils and python directories for commercial users.rtracklayer/NAMESPACE0000644000175400017540000001177013556116552015361 0ustar00biocbuildbiocbuilduseDynLib(rtracklayer, .registration = TRUE) ## ============================================================ ## Import ## ============================================================ import(methods) import(BiocGenerics) import(zlibbioc) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### base packages ### importFrom("stats", offset, setNames) importFrom("utils", count.fields, URLdecode, URLencode, browseURL, download.file, read.table, type.convert, write.table, packageVersion, strcapture) importFrom("tools", file_path_as_absolute, file_ext, file_path_sans_ext) importFrom("grDevices", col2rgb, rgb) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Non-bioconductor packages ### importFrom("XML", getNodeSet, xmlValue, xmlAttrs, htmlTreeParse, xmlInternalTreeParse, parseURI, newXMLNode, xmlChildren, addChildren, removeChildren, readHTMLTable) importMethodsFrom("XML", saveXML) importFrom("RCurl", curlUnescape, fileUpload, getCurlHandle, getForm, getURL, postForm, url.exists, getCurlInfo) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Bioconductor packages ### import(S4Vectors) import(XVector) import(GenomeInfoDb) import(IRanges) import(GenomicRanges) importFrom("Biostrings", get_seqtype_conversion_lookup, writeXStringSet, DNAStringSet, DNA_BASES, DNA_ALPHABET, alphabetFrequency, reverseComplement) importMethodsFrom("Biostrings", masks, "masks<-", getSeq) importClassesFrom("Biostrings", DNAStringSet, XStringSet) importFrom("Rsamtools", indexTabix, bgzip, TabixFile, index) importMethodsFrom("Rsamtools", ScanBamParam, asBam, headerTabix, isOpen, scanTabix) importClassesFrom("Rsamtools", RsamtoolsFile, TabixFile, BamFile) importMethodsFrom("GenomicAlignments", readGAlignments, cigar, last, readGAlignmentPairs) importClassesFrom("GenomicAlignments", GAlignments) ## ============================================================ ## Export ## ============================================================ exportClasses(BrowserSession, BrowserView, BrowserViewList, UCSCSession, UCSCView, UCSCData, TrackLine, BasicTrackLine, GraphTrackLine, Bed15TrackLine, UCSCTrackModes, BigWigSelection, UCSCSchema, Quickload, QuickloadGenome) ## File classes exportClasses(RTLFile, CompressedFile, GFFFile, UCSCFile, BEDFile, WIGFile, ChainFile, FastaFile, GFF1File, GFF2File, GFF3File, BEDGraphFile, BED15File, GTFFile, GVFFile, BigWigFile, BigWigFileList, TwoBitFile, RTLFileList, BEDPEFile) exportMethods(activeView, "activeView<-", blocks, browseGenome, browserSession, "browserSession<-", browserView, browserViews, close, export, export.bed, export.bed15, export.bedGraph, export.gff, export.gff1, export.gff2, export.gff3, export.ucsc, export.wig, export.bw, export.2bit, import, import.bed, import.bed15, import.bedGraph, import.gff, import.gff1, import.gff2, import.gff3, import.ucsc, import.wig, import.bw, import.chain, import.2bit, exportToTabix, "track<-", track, trackNames, "trackNames<-", getTable, tableNames, trackName, "trackName<-", tableName, "tableName<-", ucscTrackModes, "ucscTrackModes<-", ucscSchema, coerce, initialize, show, summary, "[", ucscTableQuery, genome, "genome<-", chrom, "chrom<-", range, "range<-", visible, "visible<-", liftOver, offset, reversed, nrow, formatDescription, referenceSequence, "referenceSequence<-", asBED, asGFF, split, fileFormat, ## from IRanges start, end, "start<-", "end<-", score, "score<-", as.data.frame, space, mcols, ## from GenomicRanges strand, seqinfo, "seqinfo<-", ## from BSgenome organism, releaseDate, getSeq ) export(genomeBrowsers, start, end, strand, "start<-", "end<-", width, "width<-", ranges, values, GenomicData, GenomicSelection, score, "score<-", as.data.frame, space, ucscGenomes, readGFFPragmas, sniffGFFVersion, GFFcolnames, readGFF, readGFFAsGRanges, BigWigSelection, GRangesForUCSCGenome, GRangesForBSGenome, summary, seqinfo, genome, "genome<-", uri, Quickload, quickload, QuickloadGenome, organism, releaseDate, mcols, wigToBigWig, SeqinfoForBSGenome, SeqinfoForUCSCGenome, resource, path, FileForFormat, cleanupBigWigCache, viewURL) export(GFFFile, UCSCFile, BEDFile, WIGFile, ChainFile, FastaFile, GFF1File, GFF2File, GFF3File, BEDGraphFile, BED15File, GTFFile, GVFFile, BigWigFile, BigWigFileList, TwoBitFile, BEDPEFile) rtracklayer/NEWS0000644000175400017540000001113613556116552014635 0ustar00biocbuildbiocbuildCHANGES IN VERSION 1.30 ----------------------- NEW FEATURES o Add readGFF(), a fast and flexible GFF/GTF parser implemented in C. See ?readGFF for more information. SIGNIFICANT USER-VISIBLE CHANGES o import.gff() now uses readGFF() internally which makes it at least 5x faster in most use cases and dramatically reduces its memory footprint. CHANGES IN VERSION 1.26 ----------------------- NEW FEATURES o ucscGenomes() retrieves organism information o New function exportToTabix() exports a GRanges to a tabix-indexed tab separated file that contains all of the metadata columns. Use import,TabixFile to load specific ranges of data back into a GRanges. o BigWig import/export to/from Integer/Numeric/RleList is now much more efficient, and uses a more efficient storage format within the BigWig file, when possible. SIGNIFICANT USER-VISIBLE CHANGES o BSgenome export methods are now in BSgenome. BUG FIXES o Handling of quotes in GFF3 is now consistent with the spec. CHANGES IN VERSION 1.22 ----------------------- NEW FEATURES o import,BigWigFile gains an asRle parameter that returns the data as an RleList (assuming it tiles the sequence); much faster than importing a GRanges and calling coverage() on it. o add export,RleList,BigWigFile method for direct (and much more efficient) output of RleLists (like coverage) to BigWig files. SIGNIFICANT USER-VISIBLE CHANGES o UCSCData now extends GRanges instead of RangedData (thanks Herve) BUG FIXES o handle different Set-Cookie header field casing; often due to proxies (thanks to Altuna Akalin) o attempt to more gracefully handle UCSC truncation of large data downloads o handle re-directs due to UCSC mirroring (thanks Martin Morgan) CHANGES IN VERSION 1.20 ----------------------- NEW FEATURES o Table query interface supports multiple query ranges. o Files (RTLFile objects) can be directly uploaded to UCSC, via track<-. SIGNIFICANT USER-VISIBLE CHANGES o All methods with asRangedData argument now have it default to FALSE, instead of TRUE. A warning is issued if the argument is missing. Eventually, we will drop all support for RangedData import (export will still work via automatic coercion to GRanges). BUG FIXES o Chromosome list for a genome is now downloaded from the table browser, instead of the Genome Browser page. This supports genomes with more than 1000 contigs. o BEDX+Y formats now work when a track line is present, and the extraCols argument is used for the column names. o path.expand() is now called for paths passed off to the Kent library. o Order of metadata columns upon GFF import no longer depends on LC_COLLATE. CHANGES IN VERSION 1.17 ----------------------- NEW FEATURES o Export of GappedAlignments objects as BAM files. There is also a corresponding import method. o Support for BEDX+Y import using the extraCols parameter to import. o Direct export of RleList objects to BigWig files. CHANGES IN VERSION 1.15 ----------------------- NEW FEATURES o Integrated with tabix via Rsamtools. BED and GFF export methods now generate a tabix index, if index=TRUE. Most import() methods gain a 'which' argument that takes advantage of tabix, when available. o Added wigToBigWig() function for efficient conversion of WIG to BigWig. o Added SeqinfoForBSGenome() and SeqinfoForUCSCGenome() for conveniently retrieving Seqinfo objects for a given genome. o Added support for FASTA import/export via Biostrings. o GTF and GVF files are now parsed as GFF. SIGNIFICANT USER-VISIBLE CHANGES o The import/export API is now based on RTLFile objects, which wrap a file path, URL or connection. There is an RTLFile subclass for every file format. This makes it easier to extend rtracklayer (export, import) with new file types. The existing API is still supported (and even encouraged for most uses). o Handle CSV attributes in GFF3 using CharacterList columns. o BED columns thickStart/thickEnd translate to an IRanges column named "thick". The blockStarts/Sizes/Count columns now map to a single RangesList "blocks" column. BUG FIXES o Numerous fixes in the import/export methods, as a result of implementing a full unit test suite. If something was not working for you in the past, please try again. o Compression and connections should now work fairly uniformly across file types. (start date: 29 March, 2012) rtracklayer/R/0000755000175400017540000000000013556116552014335 5ustar00biocbuildbiocbuildrtracklayer/R/bam.R0000644000175400017540000001242413556116552015222 0ustar00biocbuildbiocbuild### ========================================================================= ### BAM support (wrappers around Rsamtools) ### ------------------------------------------------------------------------- setMethod("import", "BamFile", function(con, format, text, paired = FALSE, use.names = FALSE, param = ScanBamParam(...), genome = NA_character_, ...) { if (!missing(format)) checkArgFormat(con, format) stopifnot(isSingleStringOrNA(genome) || is(genome, "Seqinfo")) stopifnot(isTRUEorFALSE(paired)) if (paired) { ans <- readGAlignmentPairs(con, use.names = use.names, param = param) } else { ans <- readGAlignments(con, use.names = use.names, param = param) } if (isSingleStringOrNA(genome)) { genome <- Seqinfo(genome=genome) } seqinfo(ans) <- merge(seqinfo(ans), genome) ans }) setMethod("export", c("GAlignments", "BamFile"), function(object, con, format, index = TRUE) { sam_path <- paste(file_path_sans_ext(path(con)), ".sam", sep = "") sam_con <- file(sam_path, "w") on.exit(close(sam_con)) si <- seqinfo(object) has_info <- seqlevels(si)[!is.na(seqlevels(si)) & !is.na(seqlengths(si))] si <- si[has_info] if (length(si)) { header <- paste0("@SQ", "\tSN:", seqlevels(si), "\tLN:", seqlengths(si)) has_genome <- !is.na(genome(si)) header[has_genome] <- paste0(header[has_genome], "\tAS:", genome(si)[has_genome]) writeLines(header, sam_con) } emd <- mcols(object) aln <- paste(if (!is.null(names(object))) names(object) else "*", if (!is.null(emd[["flag"]])) emd[["flag"]] else ifelse(strand(object) == "-", "16", "0"), seqnames(object), start(object), if (!is.null(emd[["mapq"]])) emd[["mapq"]] else "255", cigar(object), if (!is.null(emd[["mrnm"]])) emd[["mrnm"]] else "*", if (!is.null(emd[["mpos"]])) emd[["mpos"]] else "0", if (!is.null(emd[["isize"]])) emd[["isize"]] else "0", if (is(object, "GappedReads")) object@qseq else if (!is.null(emd[["seq"]])) emd[["seq"]] else "*", if (!is.null(emd[["qual"]])) emd[["qual"]] else "*", sep = "\t") custom <- emd[nchar(names(emd)) == 2L] if (length(custom) > 0L) { type.map <- c(integer = "i", numeric = "f", character = "Z", factor = "Z") custom.class <- sapply(custom, class) custom.type <- type.map[custom.class] unknown.class <- custom.class[is.na(custom.type)] if (length(unknown.class) > 0L) { warning("these classes are not yet valid for BAM tag export: ", paste(unknown.class, collapse=", ")) custom <- custom[!is.na(custom.type)] } tags <- mapply(paste0, names(custom), ":", custom.type, ":", as.list(custom), SIMPLIFY=FALSE) aln <- do.call(paste, c(list(aln), tags, sep = "\t")) } writeLines(aln, sam_con) close(sam_con) on.exit() bam <- asBam(sam_path, file_path_sans_ext(sam_path), overwrite = TRUE, indexDestination = index) unlink(sam_path) invisible(bam) }) setMethod("export", c("GAlignmentPairs", "BamFile"), function(object, con, format, ...) { ga <- as(object, "GAlignments") collate_subscript <- S4Vectors:::make_XYZxyz_to_XxYyZz_subscript(length(object)) getMateAttribute <- function(FUN) { c(FUN(last(object)), FUN(first(object)))[collate_subscript] } if (is.null(mcols(ga)$mrnm)) { mcols(ga)$mrnm <- getMateAttribute(seqnames) } if (is.null(mcols(ga)$mpos)) { mcols(ga)$mpos <- getMateAttribute(start) } ### FIXME: we cannot infer whether the pair is 'proper' (0x2) ### nor whether the alignment is 'primary' (0x100) if (is.null(mcols(ga)$flag)) { mcols(ga)$flag <- 0x1 + # all paired ifelse(strand(ga) == "-", 0x10, 0) + ifelse(getMateAttribute(strand) == "-", 0x20, 0) + c(0x40, 0x80) # left vs. right } if (is.null(names(ga))) { names(ga) <- as.character(rep(seq_len(length(object)), each=2L)) } export(ga, con, ...) }) setMethod("export", c("ANY", "BamFile"), function(object, con, format, ...) { export(as(object, "GAlignments"), con, ...) }) rtracklayer/R/bed.R0000644000175400017540000006604713556116552015227 0ustar00biocbuildbiocbuild### ========================================================================= ### BED (Browser Extended Display) support (including bedGraph and BED15) ### ------------------------------------------------------------------------- ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Classes ### setClass("BEDFile", contains = "RTLFile") BEDFile <- function(resource) { new("BEDFile", resource = resource) } setClass("BEDGraphFile", contains = "BEDFile") BEDGraphFile <- function(resource) { new("BEDGraphFile", resource = resource) } setClass("BED15File", contains = "BEDFile") BED15File <- function(resource) { new("BED15File", resource = resource) } setClass("BEDPEFile", contains = "BEDFile") BEDPEFile <- function(resource) { new("BEDPEFile", resource = resource) } setClass("NarrowPeakFile", contains = "BEDFile") NarrowPeakFile <- function(resource) { new("NarrowPeakFile", resource = resource) } setClass("BroadPeakFile", contains = "BEDFile") BroadPeakFile <- function(resource) { new("BroadPeakFile", resource = resource) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Export ### setGeneric("export.bed", function(object, con, ...) standardGeneric("export.bed")) setMethod("export.bed", "ANY", function(object, con, ...) { export(object, con, "bed", ...) }) setMethod("export", c("ANY", "BEDFile"), function(object, con, format, ...) { if (!missing(format)) checkArgFormat(con, format) cl <- class(object) if (hasMethod("asBED", class(object))) object <- asBED(object) track <- try(as(object, "GRanges"), silent = TRUE) if (class(track) == "try-error") { track <- try(as(object, "GenomicRangesList"), silent = TRUE) if (is(track, "try-error")) stop("cannot export object of class '", cl, "'") } export(track, con, ...) }) setMethod("export", c("GenomicRanges", "BEDFile"), function(object, con, format, append = FALSE, index = FALSE, ignore.strand = FALSE, trackLine = NULL) { if (!is.null(trackLine)) { object <- UCSCData(object, trackLine) trackLine <- TRUE return(callGeneric()) } if (!missing(format)) checkArgFormat(con, format) name <- strand <- thickStart <- thickEnd <- color <- NULL blockCount <- blockSizes <- blockStarts <- NULL if (index) object <- sortBySeqnameAndStart(object) df <- data.frame(seqnames(object), start(object) - 1L, end(object)) score <- score(object) if (!is.null(score)) { if (!is.numeric(score) || any(is.na(score))) stop("Scores must be non-NA numeric values") } if (is(con, "BEDGraphFile")) { if (is.null(score)) ## bedGraph requires score score <- 0 df$score <- score } else { toCSV <- function(x) { if (is(x, "IntegerList")) { x <- unstrsplit(CharacterList(x), ",") } else if (!is.character(x) && !is.null(x)) stop("Could not convert block coordinates to CSV") x } blockSizes <- blockStarts <- NULL if (!is.null(object$blocks)) { blockSizes <- toCSV(width(object$blocks)) blockStarts <- toCSV(start(object$blocks) - 1L) } if (is(con, "BED15File") && is.null(blockSizes)) blockStarts <- blockSizes <- "" # bed15 must have all 15 cols if (!is.null(blockSizes) || !is.null(blockStarts)) { if (is.null(blockSizes)) stop("'blockStarts' specified without 'blockSizes'") if (is.null(blockStarts)) stop("'blockSizes' specified without 'blockStarts'") lastBlock <- function(x) as.integer(sub(".*,", "", sub(",$", "", x))) lastSize <- lastBlock(blockSizes) lastStart <- lastBlock(blockStarts) if (any(df[[2]] + lastSize + lastStart != df[[3]]) || any(sub(",.*", "", blockStarts) != "0")) stop("blocks must span entire feature,", " and be within its bounds") blockCount <- elementNROWS(object$blocks) if (!is.null(object$blockCount)) if (!identical(blockCount, as.integer(object$blockCount))) stop("incorrect block counts given block sizes") } if (is.null(color)) color <- object$itemRgb if (is.null(color) && !is.null(blockCount)) color <- "0" ## blocks require color else if (!is.null(color)) { nacol <- is.na(color) if (!is.matrix(color)) colmat <- col2rgb(color) color <- paste(colmat[1,], colmat[2,], colmat[3,], sep = ",") color[nacol] <- "0" } thickStart <- object$thickStart thickEnd <- object$thickEnd if (!is.null(object$thick)) { thickStart <- start(object$thick) thickEnd <- end(object$thick) } ## color requires thick ranges if (is.null(thickStart) && !is.null(color)) { thickStart <- start(object) thickEnd <- end(object) } strand <- if (ignore.strand) NULL else strand(object) if (!is.null(strand)) { strand[strand == "*"] <- NA } if (!is.null(thickStart) && is.null(strand)) { strand <- rep(NA, length(object)) } if (!is.null(strand) && is.null(score)) score <- rep(0, length(object)) name <- object$name if (is.null(name)) name <- names(object) if (!is.null(score) && is.null(name)) name <- rep(NA, length(object)) df$name <- name df$score <- score df$strand <- strand df$thickStart <- if (!is.null(thickStart)) thickStart - 1L else NULL df$thickEnd <- thickEnd df$itemRgb <- color df$blockCount <- blockCount df$blockSizes <- blockSizes df$blockStarts <- blockStarts if (is(con, "BED15File")) { df$expCount <- object$expCount df$expIds <- object$expIds df$expScores <- object$expScores } } scipen <- getOption("scipen") options(scipen = 100) # prevent use of scientific notation on.exit(options(scipen = scipen)) file <- con m <- manager() con <- connection(m, con, if (append) "a" else "w") write.table(df, con, sep = "\t", col.names = FALSE, row.names = FALSE, quote = FALSE, na = ".") release(m, con) if (index) invisible(indexTrack(file)) else invisible(file) }) setMethod("export", c("UCSCData", "BEDFile"), function(object, con, format, trackLine = TRUE, ...) { if (!missing(format)) checkArgFormat(con, format) if (trackLine) { export.ucsc(object, con, ...) } else { trackLine <- NULL callNextMethod() } invisible(con) }) setMethod("export", c("CompressedGRangesList", "BEDFile"), function(object, con, format, ...) { object <- asBED(object) callGeneric() }) setMethod("export", c("SimpleGRangesList", "BEDFile"), .export_SimpleGRangesList_RTLFile) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Import ### setGeneric("import.bed", function(con, ...) standardGeneric("import.bed")) setMethod("import.bed", "ANY", function(con, ...) { import(con, format = "bed", ...) }) scanTrackLine <- function(con) { m <- manager() con <- connectionForResource(m, con, "r") on.exit(release(m, con)) line <- "#" while(length(grep("^ *#", line))) # skip initial comments line <- readLines(con, 1, warn = FALSE) if (length(grep("^track", line)) > 0) line else { pushBack(line, con) NULL } } setMethod("import", "BEDFile", function(con, format, text, trackLine = TRUE, genome = NA, colnames = NULL, which = NULL, seqinfo = NULL, extraCols = character(), sep = c("\t", ""), na.strings=character(0L)) { if (!missing(format)) checkArgFormat(con, format) sep <- match.arg(sep) stopifnot(is.character(na.strings), !anyNA(na.strings)) file <- con m <- manager() con <- queryForConnection(m, con, which) on.exit(release(m, con)) if (attr(con, "usedWhich")) which <- NULL if (is(genome, "Seqinfo")) { seqinfo <- genome genome <- NA_character_ } if (is.null(seqinfo)) seqinfo <- attr(con, "seqinfo") ## check for a track line line <- scanTrackLine(con) if (!is.null(line) && trackLine) { pushBack(line, con) ans <- import.ucsc(initialize(file, resource = con), drop = TRUE, trackLine = FALSE, genome = genome, colnames = colnames, which = which, seqinfo = seqinfo, extraCols = extraCols) return(ans) } bedClasses <- colClasses(file) bedNames <- names(bedClasses) normArgColnames <- function(validNames) { if (is.null(colnames)) colnames <- validNames else { colnames <- unique(c(head(bedNames, 3), as.character(colnames))) if ("thick" %in% colnames) colnames <- c(setdiff(colnames, "thick"), "thickStart", "thickEnd") if ("blocks" %in% colnames) colnames <- c(setdiff(colnames, "blocks"), "blockStarts", "blockSizes", "blockCount") missingCols <- setdiff(colnames, validNames) if (length(missingCols)) stop("Requested column(s) ", paste("'", missingCols, "'", sep = "", collapse = ", "), " are not valid columns or were not found in the file") } colnames } ## read a single line to get ncols up-front, ## and thus specify all col classes ## FIXME: reading in 'as.is' to save memory, line <- readLines(con, 1, warn=FALSE) ## UCSC seems to use '#' at beginning to indicate comment. while(length(line) && (!nzchar(line) || substring(line, 1, 1) == "#")) { line <- readLines(con, 1, warn=FALSE) } if (length(line)) { `tail<-` <- function(x, n, value) if (n != 0) c(head(x, -n), value) else x pushBack(line, con) pattern <- if (sep == "") "\\s+" else "\\t" colsInFile <- seq_len(length(strsplit(line, pattern)[[1L]])) presentNames <- bedNames[colsInFile] lacksNames <- is.null(names(extraCols)) || any(names(extraCols) == "") || any(is.na(names(extraCols))) if (length(extraCols) > 0L && lacksNames) stop("'extraCols' must have valid names") reservedNames <- c(names(bedClasses), "thick", "blocks") conflictingNames <- intersect(reservedNames, names(extraCols)) if (length(conflictingNames) > 0L) { stop("'names(extraCols)' contains reserved name(s): ", paste0("'", conflictingNames, "'", collapse=", ")) } tail(presentNames, length(extraCols)) <- names(extraCols) bedNames <- presentNames presentClasses <- bedClasses[colsInFile] tail(presentClasses, length(extraCols)) <- unname(extraCols) colnames <- normArgColnames(presentNames) bedClasses <- ifelse(presentNames %in% colnames, presentClasses, "NULL") bed <- DataFrame(read.table(con, colClasses = bedClasses, as.is = TRUE, na.strings = c(".", na.strings), comment.char = "", sep = sep, quote = "")) } else { if (is.null(colnames)) colnames <- character() else colnames <- normArgColnames(bedNames) keepCols <- bedNames %in% colnames bed <- DataFrame(as.list(sapply(bedClasses[keepCols], vector))) } colnames(bed) <- bedNames[bedNames %in% colnames] bed <- bed[substring(bed$chrom, 1, 1) != "#",] if (!is.null(bed$thickStart)) { thickEnd <- bed$thickEnd if (is.null(thickEnd)) thickEnd <- bed$end bed$thick <- IRanges(bed$thickStart + 1L, thickEnd) bed$thickStart <- bed$thickEnd <- NULL } color <- bed$itemRgb if (is.character(color)) { # could be NULL spec <- color != "0" cols <- unlist(strsplit(color[spec], ",", fixed=TRUE), use.names=FALSE) cols <- matrix(as.integer(cols), 3) color <- rep(NA, nrow(bed)) color[spec] <- rgb(cols[1,], cols[2,], cols[3,], maxColorValue = 255L) bed$itemRgb <- color } fromCSV <- function(b) { as.integer(unlist(strsplit(b, ",", fixed = TRUE))) } if (!is.null(bed$blockStarts)) { blocks <- relist(IRanges(fromCSV(bed$blockStarts) + 1L, width = fromCSV(bed$blockSizes)), PartitioningByWidth(bed$blockCount)) names(blocks) <- NULL bed$blockStarts <- bed$blockSizes <- bed$blockCount <- NULL bed$blocks <- blocks } GenomicData(IRanges(bed$start + 1L, bed$end), bed[-(1:3)], chrom = bed$chrom, genome = genome, seqinfo = seqinfo, which = which) }) setGeneric("colClasses", function(x) standardGeneric("colClasses")) setMethod("colClasses", "BEDFile", function(x) { c(chrom="character", start="integer", end="integer", name="character", score="numeric", strand="character", thickStart="integer", thickEnd="integer", itemRgb="character", blockCount="integer", blockSizes="character", blockStarts="character") }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### narrowPeak support ### setGeneric("import.narrowPeak", function(con, ...) standardGeneric("import.narrowPeak")) setMethod("import.narrowPeak", "ANY", function(con, ...) { import(con, format = "narrowPeak", ...) }) setMethod("import", "NarrowPeakFile", function(con, ...) { callNextMethod(con = con, extraCols = c(signalValue = "numeric", pValue = "numeric", qValue = "numeric", peak = "integer"), ... ) }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### broadPeak support ### setGeneric("import.broadPeak", function(con, ...) standardGeneric("import.broadPeak")) setMethod("import.broadPeak", "ANY", function(con, ...) { import(con, format = "broadPeak", ...) }) setMethod("import", "BroadPeakFile", function(con, ...) { callNextMethod(con = con, extraCols = c(signalValue = "numeric", pValue = "numeric", qValue = "numeric"), ... ) }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### BED15 (Microarray) Support ### setMethod("import", "BED15File", function(con, format, text, trackLine = NULL, genome = NA, which = NULL) { if (!missing(format)) checkArgFormat(con, format) if (is.null(trackLine)) return(import.ucsc(con, drop = TRUE, genome = genome, which = which)) bed <- callNextMethod() if (!length(bed)) return(bed) ids <- strsplit(values(bed)$expIds[1], ",", fixed=TRUE)[[1]] expNames <- trackLine@expNames[as.integer(ids) + 1L] scores <- unlist(strsplit(values(bed)$expScores, ",", fixed=TRUE), use.names=FALSE) scores <- as.numeric(scores) scores[scores == -10000] <- NA # stupid UCSC convention scores <- split(scores, gl(length(expNames), 1, length(scores))) names(scores) <- expNames nonExpCols <- setdiff(colnames(values(bed)), c("expCount", "expScores", "expIds")) values(bed) <- values(bed)[,nonExpCols] values(bed) <- cbind(values(bed), do.call(DataFrame, scores)) bed }) setGeneric("import.bed15", function(con, ...) standardGeneric("import.bed15"), signature = "con") setMethod("import.bed15", "ANY", function(con, ...) { import(con, "bed15", ...) }) setGeneric("export.bed15", function(object, con, ...) standardGeneric("export.bed15")) setMethod("export.bed15", "ANY", function(object, con, ...) { export(object, con, "bed15", ...) }) ### FIXME: dispatch will break when 'object' is a UCSCData ### Possible solution: just merge this code with the main BEDFile method? setMethods("export", list(c("GenomicRanges", "BED15File"), c("UCSCData", "BED15File")), function(object, con, format, expNames = NULL, trackLine = NULL, ...) { if (!missing(format)) checkArgFormat(con, format) if (is.null(trackLine)) { ## ensure we do not override existing track line parameter if (is.null(expNames) && is(object, "UCSCData") && is(object@trackLine, "Bed15TrackLine")) expNames <- object@trackLine@expNames return(export.ucsc(object, con, expNames = expNames, ...)) } expNames <- trackLine@expNames object$expCount <- rep(length(expNames), length(object)) object$expIds <- rep(paste(seq_along(expNames)-1, collapse=","), length(object)) scores <- as.list(mcols(object)[expNames]) scores <- do.call(paste, c(scores, sep = ",")) scores <- gsub("NA", "-10000", scores, fixed=TRUE) if (length(scores) == 0L) { scores <- rep("", length(object)) } object$expScores <- scores callNextMethod(object, con, ...) }) setClass("Bed15TrackLine", representation(expStep = "numeric", expScale = "numeric", expNames = "character_OR_NULL"), prototype(expStep = 0.5, expScale = 3.0), contains = "BasicTrackLine") # not sure which fields work setAs("Bed15TrackLine", "character", function(from) { str <- as(as(from, "TrackLine"), "character") paste(str, " type=array ", " expScale=", from@expScale, " expStep=", from@expStep, " expNames=\"", paste(from@expNames, collapse=","), "\"", sep = "") }) setAs("character", "Bed15TrackLine", function(from) { line <- new("Bed15TrackLine", as(from, "TrackLine")) vals <- ucscParsePairs(from) line@expScale <- as.numeric(vals[["expScale"]]) line@expStep <- as.numeric(vals[["expStep"]]) line@expNames <- strsplit(vals[["expNames"]], ",", fixed=TRUE)[[1]] line }) setMethod("fileFormat", "Bed15TrackLine", function(x) "bed15") setMethod("colClasses", "BED15File", function(x) { c(callNextMethod(), expCount="integer", expIds="character", expScores="character") }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### bedGraph (formerly subset of WIG) support ### setGeneric("import.bedGraph", function(con, ...) standardGeneric("import.bedGraph"), signature = "con") setMethod("import.bedGraph", "ANY", function(con, ...) { import(con, "bedGraph", ...) }) setGeneric("export.bedGraph", function(object, con, ...) standardGeneric("export.bedGraph")) setMethod("export.bedGraph", "ANY", function(object, con, ...) { export(object, con, "bedGraph", ...) }) setMethod("colClasses", "BEDGraphFile", function(x) { c(chrom="character", start="integer", end="integer", score="numeric") }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### BEDPE (bedtools paired end) support ### setMethod("import", "BEDPEFile", function(con, format, text, ...) { gr <- callNextMethod() df <- mcols(gr) mcols(gr) <- NULL if (is.null(df$strand2)) df$strand2 <- "*" else df$strand2[is.na(df$strand2)] <- "*" seqlevels(gr) <- union(seqlevels(gr), unique(df$chrom2)) gr2 <- with(df, GRanges(chrom2, IRanges(start2+1L, end2), strand2, seqinfo=seqinfo(gr))) df <- subset(df, select=-(chrom2:end2)) df$strand2 <- NULL Pairs(gr, gr2, df) }) setMethod("colClasses", "BEDPEFile", function(x) { c(chrom="character", start="integer", end="integer", chrom2="character", start2="integer", end2="integer", name="character", score="numeric", strand="character", strand2="character") }) setMethod("export", c("ANY", "BEDPEFile"), function(object, con, format, ...) { if (!missing(format)) checkArgFormat(con, format) cl <- class(object) track <- try(as(object, "Pairs"), silent = TRUE) if (class(track) == "try-error") { stop("cannot export object of class '", cl, "': ", track) } export(track, con, ...) }) setMethod("export", c("Pairs", "BEDPEFile"), function(object, con, format, append = FALSE, ignore.strand = FALSE) { if (!missing(format)) checkArgFormat(con, format) df <- data.frame( seqnames(first(object)), start(first(object)) - 1L, end(first(object)), seqnames(second(object)), start(second(object)) - 1L, end(second(object)) ) score <- mcols(object)$score if (!is.null(score)) { if (!is.numeric(score) || any(is.na(score))) stop("Scores must be non-NA numeric values") } else { score <- 0 } name <- mcols(object)$name if (is.null(name)) name <- names(object) if (is.null(name)) name <- rep(NA, length(object)) df$name <- name df$score <- score if (ignore.strand) { strand1 <- NA # strand cannot be null in bedpe strand2 <- NA } else { strand1 <- strand(first(object)) strand2 <- strand(second(object)) strand1[strand1 == "*"] <- NA strand2[strand2 == "*"] <- NA } df$strand1 <- strand1 df$strand2 <- strand2 mcol_names <- setdiff(names(mcols(object)), c("name", "score")) df <- cbind(df, mcols(object)[,mcol_names]) scipen <- getOption("scipen") options(scipen = 100) # prevent use of scientific notation on.exit(options(scipen = scipen)) file <- con m <- manager() con <- connection(m, con, if (append) "a" else "w") on.exit(release(m, con), add=TRUE) write.table(df, con, sep = "\t", col.names = FALSE, row.names = FALSE, quote = FALSE, na = ".") invisible(file) }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Coercion ### setGeneric("asBED", function(x, ...) standardGeneric("asBED")) setMethod("asBED", "GRangesList", function(x) { x_range <- range(x) if (any(elementNROWS(x_range) != 1L)) stop("Empty or multi-strand/seqname elements not supported by BED") gr <- unlist(x_range, use.names=FALSE) mcols(gr) <- mcols(x) mcols(gr)$name <- names(x) x_ranges <- ranges(unlist(x, use.names=FALSE)) ord_start <- order(togroup(PartitioningByEnd(x)), start(x_ranges)) x_ranges <- shift(x_ranges, 1L - rep(start(gr), elementNROWS(x)))[ord_start] mcols(gr)$blocks <- relist(x_ranges, x) gr }) setMethod("asBED", "GAlignments", function(x) { x <- grglist(x) callGeneric() }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Utilities ### setGeneric("blocks", function(x, ...) standardGeneric("blocks")) setMethod("blocks", "GenomicRanges", function(x) { if (is.null(mcols(x)$blocks)) { return(as(x, "GRangesList")) } block_counts <- elementNROWS(mcols(x)$blocks) gr <- GRanges(rep(seqnames(x), block_counts), shift(unlist(mcols(x)$blocks, use.names = FALSE), rep(start(x), block_counts) - 1L), rep(strand(x), block_counts)) seqinfo(gr) <- seqinfo(x) ans <- relist(gr, mcols(x)$blocks) mcols(ans) <- subset(mcols(x), select=-blocks) names(ans) <- if (!is.null(names(x))) names(x) else x$name ans }) rtracklayer/R/bigWig.R0000644000175400017540000003232513556116552015675 0ustar00biocbuildbiocbuild### ========================================================================= ### BigWig support ### ------------------------------------------------------------------------- ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Classes ### setClass("BigWigFile", contains = "RTLFile") setClass("BWFile", contains = "BigWigFile") BigWigFile <- function(path) { if (!isSingleString(path)) stop("'filename' must be a single string, specifying a path") new("BigWigFile", resource = path) } BWFile <- BigWigFile setMethod("seqinfo", "BigWigFile", function(x) { seqlengths <- .Call(BWGFile_seqlengths, expandPath(path(x))) Seqinfo(names(seqlengths), seqlengths) # no circularity information }) setClass("BigWigFileList", contains = "RTLFileList", prototype = prototype(elementType = "BigWigFile")) BigWigFileList <- function(path) { new("BigWigFileList", listData = (lapply(path, BigWigFile))) } setMethod(path, "BigWigFileList", function(object, ...) { sapply(as.list(object), path) }) .allowedColNames <- list(bigWig = "score") .validateColNames <- function(object, format) { allowedColNames <- .allowedColNames[[format]] invalidColNames <- setdiff(colnames(object), allowedColNames) if (length(invalidColNames)) paste("Column names", paste("'", invalidColNames, "'", sep = "", collapse=", "), "are invalid for the", format, "format.") else NULL } setClass("BigWigSelection", prototype = prototype(colnames = "score"), contains = "RangedSelection") setValidity("BigWigSelection", function(object) { .validateColNames(object, "bigWig") }) BigWigSelection <- function(ranges=IRangesList(), colnames = "score") { if (!is.character(colnames) || (length(colnames) && !identical(colnames, "score"))) stop("'score' is the only valid column for BigWig") if (is.character(ranges)) new("BigWigSelection", GenomicSelection(ranges, colnames = colnames)) else { if (is(ranges, "BigWigFile")) ranges <- seqinfo(ranges) new("BigWigSelection", ranges = as(ranges, "IntegerRangesList"), colnames = colnames) } } setAs("IntegerRangesList", "BigWigSelection", function(from) { new("BigWigSelection", as(from, "RangedSelection"), colnames = "score") }) setAs("GenomicRanges", "BigWigSelection", function(from) { as(as(from, "IntegerRangesList"), "BigWigSelection") }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Export ### setGeneric("export.bw", function(object, con, ...) standardGeneric("export.bw")) setMethod("export.bw", "ANY", function(object, con, ...) { export(object, con, "BigWig", ...) }) setMethod("export", c("ANY", "BigWigFile"), function(object, con, format, ...) { object <- as(object, "GRanges") callGeneric() }) setMethod("export", c("GenomicRanges", "BigWigFile"), function(object, con, format, dataFormat = c("auto", "variableStep", "fixedStep", "bedGraph"), compress = TRUE, fixedSummaries = FALSE) { if (!missing(format)) checkArgFormat(con, format) con <- path.expand(path(con)) object <- sortBySeqnameAndStart(object) score <- score(object) if (isValidScore(score)) stop("The score must be numeric, without any NA's") if (!isTRUEorFALSE(compress)) stop("'compress' must be TRUE or FALSE") seqlengths <- seqlengths(object) if (any(is.na(seqlengths))) stop("Unable to determine seqlengths; either specify ", "'seqlengths' or specify a genome on 'object' that ", "is known to BSgenome or UCSC") sectionPtr <- NULL # keep adding to the same linked list .bigWigWriter <- function(chromData, con, dataFormat, append) { if (length(chromData) == 0L) return() if (any(tail(start(chromData), -1) <= head(end(chromData), -1))) stop("BigWig ranges cannot overlap") sectionPtr <<- .Call(BWGSectionList_add, sectionPtr, as.vector(seqnames(chromData)[1]), as(ranges(chromData), "IRanges"), as.numeric(score(chromData)), dataFormat) } dataFormat <- match.arg(dataFormat) if (dataFormat == "auto") format <- chooseGraphType(object) else format <- dataFormat on.exit(.Call(BWGSectionList_cleanup, sectionPtr)) if (format == "bedGraph") lapply(split(object, seqnames(object)), .bigWigWriter, con, dataFormat) else export.wig(object, con, dataFormat = dataFormat, writer = .bigWigWriter, trackLine = FALSE) storage.mode(seqlengths) <- "integer" invisible(BigWigFile(.Call(BWGSectionList_write, sectionPtr, seqlengths, compress, fixedSummaries, con))) }) setMethod("export", c("List", "BigWigFile"), function(object, con, format, compress = TRUE, fixedSummaries = FALSE) { if (!missing(format)) checkArgFormat(con, format) con <- path.expand(path(con)) if (!isTRUEorFALSE(compress)) stop("'compress' must be TRUE or FALSE") if (is.null(names(object))) stop("'object' must have names") seqlengths <- elementNROWS(object) sectionPtr <- NULL # keep adding to the same linked list on.exit(.Call(BWGSectionList_cleanup, sectionPtr)) writer <- BigWigWriter(object) for(chr in names(object)) { sectionPtr <- writer(chr, sectionPtr) } invisible(BigWigFile(.Call(BWGSectionList_write, sectionPtr, seqlengths, compress, fixedSummaries, con))) }) setGeneric("BigWigWriter", function(x) standardGeneric("BigWigWriter")) setMethod("BigWigWriter", "RleList", function(x) { function(chr, sectionPtr) { .Call(BWGSectionList_add, sectionPtr, chr, ranges(x[[chr]]), as.numeric(runValue(x[[chr]])), "bedGraph") } }) setMethods("BigWigWriter", list("IntegerList", "NumericList"), function(x) { function(chr, sectionPtr) { .Call(BWGSectionList_add, sectionPtr, chr, NULL, as.numeric(x[[chr]]), "fixedStep") } }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Import ### setGeneric("import.bw", function(con, ...) standardGeneric("import.bw")) setMethod("import.bw", "ANY", function(con, ...) { import(con, "BigWig", ...) }) ### Consider the use cases: ### - Extract whole genome or whole chromosome coverage as Rle (ChIP-seq) ### - Use coverage() fast path ### - Extract single position coverage for millions of variants ### - Slow to query by position, so extract whole genome/chromosome (above), ### then use findRun trick. ### - Extract single position coverage for a hundred hot-spot variants ### - coverage() should be fast enough, followed by findRun trick. ### - Extract coverage for one/all genes and summarize (RNA-seq?) ### - probably want summarize,BigWigFile setMethod("import", "BigWigFile", function(con, format, text, selection = BigWigSelection(which, ...), which = con, as = c("GRanges", "RleList", "NumericList"), ...) { if (!missing(format)) checkArgFormat(con, format) as <- match.arg(as) if (is(which, "GenomicRanges") && as == "NumericList") { orig_order <- order(seqnames(which)) } selection <- as(selection, "BigWigSelection") validObject(selection) si <- seqinfo(con) which <- ranges(selection) badSpaces <- setdiff(names(which)[lengths(which) > 0L], seqlevels(si)) if (length(badSpaces) > 0L) warning("'which' contains seqnames not known to BigWig file: ", paste(badSpaces, collapse = ", ")) which <- which[names(which) %in% seqlevels(si)] flatWhich <- unlist(which, use.names = FALSE) if (is.null(flatWhich)) flatWhich <- IRanges() which_rl <- split(flatWhich, factor(space(which), seqlevels(si))) if (as != "NumericList") { which_rl <- as(which, "NormalIRangesList") } which <- GRanges(which_rl) names(which) <- names(unlist(which_rl, use.names=FALSE)) C_ans <- .Call(BWGFile_query, expandPath(path(con)), as.character(seqnames(which)), ranges(which), identical(colnames(selection), "score"), as == "NumericList") if (as == "NumericList") { ans <- as(C_ans, "NumericList") names(ans) <- names(which) metadata(ans) <- list(ranges = as(which, "GRanges")) if (exists("orig_order")) { ans[orig_order] <- ans } ans } else { nhits <- C_ans[[3L]] gr <- GRanges(rep(seqnames(which), nhits), C_ans[[1L]], seqinfo=si) gr$score <- C_ans[[2L]] if (as == "RleList") { coverage(gr, weight="score") } else { strand(gr) <- "*" gr } } }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Summary ### setMethod("summary", "BigWigFile", function(object, which = as(seqinfo(object), "GenomicRanges"), size = 1L, type = c("mean", "min", "max", "coverage", "sd"), defaultValue = NA_real_, asRle = FALSE, as = c("GRangesList", "RleList", "matrix"), ...) { ### FIXME: could do with "GenomicRanges" here, but ### coercions generally only exist for GRanges specifically which <- as(which, "GRanges") if (!is.numeric(size)) stop("'size' must be numeric") size <- recycleIntegerArg(size, "size", length(which)) as <- match.arg(as) if (any(size > width(which)) && as != "matrix") stop("some 'which' are smaller than 'size'; ", "consider passing as='matrix'") if (as == "matrix" && (length(size) == 0L || any(size != size[1L]))) stop("for as='matrix', there must be one unique 'size'") type <- match.arg(type) if (!missing(asRle)) warning("argument asRle is deprecated; use as='RleList'") if (asRle) as <- "RleList" if (type == "sd") type <- "std" if (!isSingleNumberOrNA(defaultValue)) stop("'defaultValue' must be a single number or NA") summaryList <- .Call(BWGFile_summary, path.expand(path(object)), as.character(seqnames(which)), ranges(which), size, type, as.numeric(defaultValue)) if (as == "matrix") { return(do.call(rbind, summaryList)) } tiles <- tile(which, n = size) if (asRle) { setNames(RleList(mapply(Rle, summaryList, as.list(width(tiles))), compress=FALSE), names(which)) } else { tiles <- unlist(tiles) tiles$score <- unlist(summaryList) relist(tiles, summaryList) } }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Conversion ### wigToBigWig <- function(x, seqinfo, dest = paste(file_path_sans_ext(x, TRUE), "bw", sep = "."), clip = FALSE) { if (!isSingleString(x)) stop("'x' must be a single string, the path to a WIG file") if (!isSingleString(dest)) stop("'dest' must be a single string, the path to the BigWig output") if (!is(seqinfo, "Seqinfo")) stop("'seqinfo' must be NULL or a Seqinfo object") if (!isTRUEorFALSE(clip)) stop("'clip' must be TRUE or FALSE") seqlengths <- seqlengths(seqinfo) if (any(is.na(seqlengths))) stop("'seqlengths(seqinfo)' must not contain any 'NA' values") x <- path.expand(x) dest <- path.expand(dest) ans <- .Call(BWGFile_fromWIG, x, clip, seqlengths, dest) invisible(BigWigFile(ans)) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Utilities ### ## Remote data are cached locally. Need a way to cleanup. cleanupBigWigCache <- function(maxDays = 0) { stopifnot(isSingleNumber(maxDays)) dir <- "/tmp/udcCache" if (file.exists(dir)) { invisible(.Call(R_udcCleanup, maxDays)) } } rtracklayer/R/browser.R0000644000175400017540000001613713556116552016153 0ustar00biocbuildbiocbuild## central abstraction, represents a genome browser ## Question: is a browser session a database of tracks? No question ## that a browser has a track database. The question is of ## inheritance. Historically, browser session has had all the behavior ## we expect from a track database. But it is so much more. In ## particular, it has a list of views. We want to separate the data ## from the views. It is tempting to have the model (tracks) and views ## in separate objects, composed together in a session. However, the ## reality is that browser sessions are monolithic: UCSC can view only ## data UCSC knows, IGB can view only data IGB knows. Thus, we use ## simple inheritance here, saving many refactoring headaches. setClass("BrowserSession", contains = c("TrackDb", "VIRTUAL")) ## alias for names() for clarity in the session context setGeneric("trackNames", function(object, ...) standardGeneric("trackNames")) setGeneric("trackNames<-", function(object, ..., value) standardGeneric("trackNames<-")) setMethod("names", "BrowserSession", function(x) trackNames(x)) setMethod("trackNames", "BrowserSession", function(object) names(object)) ## a single genome view in a session setClass("BrowserView", representation(session = "BrowserSession"), contains = "VIRTUAL") # create one or more browser views setGeneric("browserView", function(object, range, track, ...) standardGeneric("browserView")) # get the views from the browser setGeneric("browserViews", function(object, ...) standardGeneric("browserViews")) # get/set active view setGeneric("activeView", function(object) standardGeneric("activeView")) setGeneric("activeView<-", function(object, value) standardGeneric("activeView<-")) setMethod("activeView", "BrowserSession", function(object) { views <- browserViews(object) active <- sapply(views, activeView) if (any(active)) views[[tail(which(active),1)]] else NULL }) setMethod("show", "BrowserSession", function(object) { cat("A genome browser session of class '", class(object), "' with ", length(browserViews(object)), " views and ", length(trackNames(object)), " tracks\n", sep ="") }) # close a session or view setGeneric("close", function(con, ...) standardGeneric("close")) # FIXME: what about isOpen? # get/set visibility of view tracks setGeneric("visible", function(object, ...) standardGeneric("visible")) setMethod("visible", "BrowserView", function(object) { trackNames(browserSession(object)) %in% trackNames(object) }) setGeneric("visible<-", function(object, ..., value) standardGeneric("visible<-")) setReplaceMethod("visible", "BrowserView", function(object, value) { trackNames(object) <- names(value)[value] object }) # get/set the selected features in e.g. a view # this can return a list, with a logical vector for each track setGeneric("selectedFeatures", function(object, ...) standardGeneric("selectedFeatures")) setGeneric("selectedFeatures<-", function(object, value) standardGeneric("selectedFeatures<-")) setMethod("show", "BrowserView", function(object) { range <- range(object) cat(class(object), "of", paste(names(range), ":", unlist(start(range)), "-", unlist(end(range)), sep = ""), "\n") nms <- paste("'", names(trackNames(object)), "'", sep = "") cat(S4Vectors:::labeledLine("trackNames", nms)) }) setClass("BrowserViewList", contains = "SimpleList", prototype = prototype(elementType = "BrowserView")) BrowserViewList <- function(...) { views <- list(...) if (length(views) == 1 && is.list(views[[1L]])) views <- views[[1L]] if (!all(sapply(views, is, "BrowserView"))) stop("all elements in '...' must be BrowserView objects") S4Vectors:::new_SimpleList_from_list("BrowserViewList", views) } # get genome range of active view (or default if no views) setMethod("range", "BrowserSession", function(x, ..., na.rm) { if (length(...) > 0) stop("arguments in '...' ignored") view <- activeView(x) if (!is.null(view)) range(view) else NULL }) setGeneric("range<-", function(x, ..., value) standardGeneric("range<-")) ## just the genome, for convenience setMethod("genome", "BrowserSession", function(x) genome(range(x))) setReplaceMethod("genome", "BrowserSession", function(x, value) { if (!isSingleString(value)) stop("'genome' must be a single string") genome(range(x)) <- value x }) # high-level entry point setGeneric("browseGenome", function(object, ...) standardGeneric("browseGenome")) setMethod("browseGenome", "missing", function(object, ...) browseGenome(GRangesList(compress=FALSE), ...)) setMethod("browseGenome", "GenomicRanges_OR_GenomicRangesList", function(object, browser = "UCSC", range = base::range(object), view = TRUE, trackParams = list(), viewParams = list(), name = "customTrack", ...) { # initialize session of type identified by 'browser' session <- browserSession(browser, ...) # load 'object' trackParams <- c(list(session), trackParams) if (is(object, "GenomicRanges")) trackParams <- c(trackParams, name = name) session <- do.call(`track<-`, c(trackParams, list(value = object))) # open view of 'range' if (view) { if (!missing(range)) range <- normGenomeRange(range, session) viewParams <- c(list(session, range), viewParams) do.call(browserView, viewParams) } session }) # list names of available genome browsers genomeBrowsers <- function(where = topenv(parent.frame())) { cl <- getClass("BrowserSession", where = where) browsers <- names(cl@subclasses) browsers <- browsers[!sapply(browsers, isVirtualClass, where)] sub("Session$", "", browsers) } # obtain a browser session setGeneric("browserSession", function(object, ...) standardGeneric("browserSession")) # instantiate a browser session by name setMethod("browserSession", "character", function(object, ...) { class <- paste(object, "Session", sep = "") if (!extends(class, "BrowserSession")) stop("Browser named '", object, "' is unsupported.") new(class, ...) }) setMethod("browserSession", "missing", function(object, ...) browserSession("UCSC", ...)) # get one from a view setMethod("browserSession", "BrowserView", function(object) object@session) setGeneric("login", function(x, username, password, ...) standardGeneric("login"), signature = "x") setGeneric("saveView", function(x, ...) standardGeneric("saveView")) setGeneric("restoreView", function(x, ...) standardGeneric("restoreView")) rtracklayer/R/chain.R0000644000175400017540000001325313556116552015546 0ustar00biocbuildbiocbuild### ========================================================================= ### Chain file parsing and lift over ### ------------------------------------------------------------------------- ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Classes ### setClass("ChainBlock", representation(ranges = "IRanges", # start in A, width offset = "integer", # offset to start in B score = "integer", # rle scores space = "character", # rle spaces reversed = "logical", # rle reversal length = "integer")) # lengths for rle slots ##setMethod("length", "ChainBlock", function(x) length(x@offset)) setClass("Chain", prototype = prototype(elementType = "ChainBlock"), contains = "SimpleList") setClass("ChainFile", contains = "RTLFile") ChainFile <- function(path) { if (!isSingleString(path)) stop("'filename' must be a single string, specifying a path") new("ChainFile", resource = path) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Import ### setGeneric("import.chain", function(con, ...) standardGeneric("import.chain")) setMethod("import.chain", "ANY", function(con, ...) { import(con, "chain", ...) }) setMethod("import", "ChainFile", function(con, format, text, exclude = "_") { if (!missing(format)) checkArgFormat(con, format) ### FIXME: use readLines() to read the file, parse lines in C if (!isSingleString(resource(con)) || isURL(resource(con))) { stop("chain import currently only handles local, uncompressed file paths") } .Call("readChain", path.expand(path(con)), as.character(exclude), PACKAGE="rtracklayer") }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Accessors ### setMethod("ranges", "ChainBlock", function(x, use.names=TRUE, use.mcols=FALSE) x@ranges ) setMethod("offset", "ChainBlock", function(object) object@offset) setMethod("score", "ChainBlock", function(x) Rle(x@score, x@length)) setMethod("space", "ChainBlock", function(x) Rle(x@space, x@length)) setGeneric("reversed", function(x, ...) standardGeneric("reversed")) setMethod("reversed", "ChainBlock", function(x) Rle(x@reversed, x@length)) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Liftover ### flipStrandSimple <- function(strand, flip) { strand <- as.vector(strand) flipped <- ifelse(flip, ifelse(strand == "+", "-", ifelse(strand == "-", "+", strand)), strand) strand(flipped) } flipStrandTricky <- function(strand, flip) { strandCodes <- c("+" = 1L, "-" = -1L, "*" = 0L) strandInt <- strandCodes[as.vector(strand)] flipped <- ifelse(flip, strandInt * -1L, strandInt) + 2L strandRevCodes <- factor(c("-", "*", "+"), levels(strand())) strandRevCodes[as.vector(flipped)] } smoothGaps <- function(qhits, ranges, offsets) { congruent_gaps <- width(gaps(ranges)) == abs(offsets) congruent_gaps_rle <- Rle(congruent) congruent_rle <- c(Rle(FALSE), congruent_gaps_rle) group_rle <- Rle(cumsum(!congruent_rle)) group_ranges <- disjoin(ranges(Rle(qhits)), ranges(group_rle)) ans <- range(relist(ranges, group_ranges)) mcols(ans)$qhits <- qhits[start(group_ranges)] mcols(ans)$offsets <- offsets[start(group_ranges)] ans } setGeneric("liftOver", function(x, chain, ...) standardGeneric("liftOver")) setMethod("liftOver", c("GenomicRanges", "Chain"), function(x, chain) { liftOverSpace <- function(gr, chain, subind) { r <- ranges(gr) ol <- findOverlaps(r, ranges(chain)) shits <- subjectHits(ol) r <- overlapsRanges(r, ranges(chain), ol) rev <- as.vector(reversed(chain)[shits]) starts <- ifelse(rev, start(reflect(r, ranges(chain)[shits])), start(r)) strand <- flipStrandTricky(strand(gr)[queryHits(ol)], rev) r <- IRanges(starts, width=width(r)) offsets <- offset(chain)[shits] spaces <- space(chain)[shits] ind[[as.character(seqnames(gr)[1])]] <<- subind[queryHits(ol)] GRanges(spaces, IRanges(start(r) - offsets, end(r) - offsets), strand = strand, values(gr)[queryHits(ol),,drop=FALSE]) } rl <- split(x, seqnames(x), drop = TRUE) unchainedNames <- setdiff(names(rl), names(chain)) if (length(unchainedNames)) message("Discarding unchained sequences: ", paste(unchainedNames, collapse = ", ")) sharedNames <- intersect(names(rl), names(chain)) ind <- split(seq_len(length(x)), as.vector(seqnames(x)))[sharedNames] liftedList <- mapply(liftOverSpace, rl[sharedNames], chain[sharedNames], ind, SIMPLIFY=FALSE) lifted <- unlist(GRangesList(liftedList), use.names=FALSE) f <- structure(as.integer(unlist(ind, use.names=FALSE)), levels=seq_len(length(x)), class="factor") setNames(split(lifted, f), names(x)) }) setMethod("liftOver", c("GRangesList", "Chain"), function(x, chain) { lifted <- liftOver(unlist(x), chain) IRanges:::regroupBySupergroup(lifted, PartitioningByEnd(x)) }) setMethod("liftOver", c("ANY", "ANY"), function(x, chain) { chain <- as(chain, "Chain") x <- granges(x) callGeneric() }) rtracklayer/R/compression.R0000644000175400017540000000664013556116552017027 0ustar00biocbuildbiocbuild### ========================================================================= ### Compression ### ------------------------------------------------------------------------- ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### General ### setClass("CompressedFile", contains = c("RTLFile", "VIRTUAL")) setGeneric("decompress", function(manager, con, ...) standardGeneric("decompress"), signature="con") setMethod("decompress", "ANY", function(manager, con, ...) con) setMethod("decompress", "CompressedFile", function(manager, con, ...) { resource <- resource(con) if (is.character(resource)) manage(manager, gzfile(resource)) # handles gzip, bzip2 and xz else stop("Cannot decompress connection") }) setMethod("decompress", "character", function(manager, con, ...) { file <- try(FileForFormat(con), silent = TRUE) if (!is(file, "try-error")) { decompressed <- decompress(manager, file) if (!identical(file, decompressed)) con <- decompressed } con }) setMethod("fileFormat", "CompressedFile", function(x) { file_ext(file_path_sans_ext(resourceDescription(x))) }) ## should only happen internally (user would not give compression as format) setMethod("import", c("CompressedFile", "missing"), function(con, format, text, ...) { con <- FileForFormat(resource(con), fileFormat(con)) import(con, ...) }) ## 'compress' is a simple alias for 'decompress', since connections are two-way compress <- decompress ## should only happen internally (user would not give compression as format) setMethod("export", c("ANY", "CompressedFile", "missing"), function(object, con, format, ...) { desc <- resourceDescription(con) con <- FileForFormat(resource(con), file_ext(file_path_sans_ext(desc))) export(object, con, ...) }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### GZip ### setClass("GZFile", contains = "CompressedFile") GZFile <- function(resource) { new("GZFile", resource = resource) } setMethod("decompress", "GZFile", function(manager, con) { ungzip(manager, resource(con)) }) setGeneric("ungzip", function(manager, x, ...) standardGeneric("ungzip"), signature="x") setMethod("ungzip", "character", function(manager, x) { uri <- .parseURI(x) if (uri$scheme != "" && uri$scheme != "file") con <- gzcon(url(x, open="rb"), text=TRUE) else con <- gzfile(uri$path) manage(manager, con) }) setMethod("ungzip", "connection", function(x) { gzcon(x, text=TRUE) }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### BGZip (Block-wise gzip files; extension used by Rsamtools::bgzip()) ### setClass("BGZFile", contains = "GZFile") BGZFile <- function(resource) { new("BGZFile", resource = resource) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### BZip2 ### setClass("BZ2File", contains = "CompressedFile") BZ2File <- function(resource) { new("BZ2File", resource = resource) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### XZ ### setClass("XZFile", contains = "CompressedFile") XZFile <- function(resource) { new("XZFile", resource = resource) } rtracklayer/R/fasta.R0000644000175400017540000000234513556116552015562 0ustar00biocbuildbiocbuild### ========================================================================= ### FASTA support ### ------------------------------------------------------------------------- ### ### Since we have 2bit, we might as well have FASTA ### setClass("FastaFile", contains = "RTLFile") FastaFile <- function(resource) { new("FastaFile", resource = resource) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Export ### setMethod("export", c("ANY", "FastaFile"), function(object, con, ...) { export(as(object, "DNAStringSet"), con, ...) }) setMethod("export", c("XStringSet", "FastaFile"), function(object, con, format, ...) { writeXStringSet(object, path(con), format = "fasta", ...) }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Import ### setMethod("import", "FastaFile", function(con, format, text, type = c("DNA", "RNA", "AA", "B"), ...) { if (!missing(format)) checkArgFormat(con, format) readFun <- get(paste0("read", match.arg(type), "StringSet"), getNamespace("Biostrings")) readFun(path(con), format = "fasta", ...) }) rtracklayer/R/gff.R0000644000175400017540000004515513556116552015234 0ustar00biocbuildbiocbuild### ========================================================================= ### GFF (General Feature Format) support (all three versions, plus GTF) ### ------------------------------------------------------------------------- ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Classes ### setClass("GFFFile", contains = "RTLFile") ## private GFFFile <- function(resource, version = c("", "1", "2", "3")) { version <- match.arg(version) new(gffFileClass(version), resource = resource) } setClass("GFF1File", contains = "GFFFile") GFF1File <- function(resource) { GFFFile(resource, "1") } setClass("GFF2File", contains = "GFFFile") GFF2File <- function(resource) { GFFFile(resource, "2") } setClass("GFF3File", contains = "GFFFile") GFF3File <- function(resource) { GFFFile(resource, "3") } setClass("GTFFile", contains = "GFF2File") GTFFile <- function(resource) { new("GTFFile", GFF2File(resource)) } setClass("GVFFile", contains = "GFF3File") GVFFile <- function(resource) { new("GVFFile", GFF3File(resource)) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Export ### setGeneric("export.gff", function(object, con, ...) standardGeneric("export.gff")) setMethod("export.gff", "ANY", function(object, con, ...) { export(object, con, ...) }) setMethod("export", c("ANY", "GFFFile"), function(object, con, format, ...) { if (hasMethod("asGFF", class(object))) object <- asGFF(object) res <- try(as(object, "GRanges"), silent = TRUE) if (is(res, "try-error")) { res <- try(as(object, "GenomicRangedDataList"), silent = TRUE) if (is(res, "try-error")) stop("cannot export object of class '", class(object), "'") } object <- res if (!missing(format)) checkArgFormat(con, format) export(object, con, ...) }) setMethod("export", c("CompressedGRangesList", "GFFFile"), function(object, con, format, ...) { object <- asGFF(object) callGeneric() } ) setMethod("export", c("GRangesList", "GTFFile"), function(object, con, format, ...) { stop("export of GRangesList to GTF is not yet supported") ## there is a start on asGTF() later in this file ## object <- asGTF(object) ## callGeneric() } ) setMethod("export", c("GenomicRanges", "GFFFile"), function(object, con, format, version = c("1", "2", "3"), source = "rtracklayer", append = FALSE, index = FALSE) { if (!missing(format)) checkArgFormat(con, format) if (!missing(version) || !length(gffFileVersion(con))) con <- asGFFVersion(con, match.arg(version)) version <- gffFileVersion(con) file <- con con <- resource(con) if (!append) { cat("", file = con) # clear any existing file gffComment(con, "gff-version", version) sourceVersion <- try(packageVersion(source), TRUE) if (!inherits(sourceVersion, "try-error")) gffComment(con, "source-version", source, sourceVersion) gffComment(con, "date", base::format(Sys.time(), "%Y-%m-%d")) genome <- singleGenome(genome(object)) if (!is.na(genome)) gffComment(con, "genome-build", paste(".", genome, sep = "\t")) } if (index) object <- sortBySeqnameAndStart(object) seqname <- seqnames(object) if (is.null(mcols(object)$ID)) mcols(object)$ID <- names(object) if (version == "3") seqname <- urlEncode(seqname, "a-zA-Z0-9.:^*$@!+_?|-") if (!is.null(mcols(object)$source) && missing(source)) source <- mcols(object)$source else source <- rep(source, length(object)) if (version == "3") source <- urlEncode(source, "\t\n\r;=%&,", FALSE) feature <- mcols(object)$type if (is.null(feature)) feature <- rep("sequence_feature", length(object)) score <- score(object) if (is.null(score)) { score <- rep(NA_real_, length(object)) } else { if (!("score" %in% colnames(mcols(object)))) ## avoid outputting as attribute colnames(mcols(object))[1] <- "score" } strand <- strand(object) if (is.null(strand)) strand <- rep(strand(NA_character_), length(object)) strand[strand == "*"] <- NA_integer_ frame <- mcols(object)$phase if (is.null(frame)) { frame <- rep(NA_integer_, length(object)) if ("CDS" %in% feature) warning(wmsg("The phase information is missing. ", "The written file will contain CDS with ", "no phase information.")) } else { if (anyNA(frame[feature %in% "CDS"])) warning(wmsg("The phase information is missing for some CDS. ", "The written file will contain some CDS with ", "no phase information.")) } table <- data.frame(seqname, source, feature, start(object), end(object), score, strand, frame) attrs <- NULL if (version == "1") { attrs <- mcols(object)$group if (is.null(attrs)) attrs <- as.vector(seqname) } else { builtin <- c("type", "score", "phase", "source") custom <- setdiff(colnames(mcols(object)), builtin) if (length(custom)) { if (version == "3") tvsep <- "=" else tvsep <- " " attrs <- mcols(object) attrs <- as.data.frame(sapply(custom, function(name) { x <- attrs[[name]] x_flat <- if (is(x, "List")) unlist(x, use.names=FALSE) else x x_char <- as.character(x_flat) x_char <- sub(" *$", "", sub("^ *", "", as.character(x_char))) if (version == "3") x_char <- urlEncode(x_char, "%\t\n\r;=&,", FALSE) if (is(x, "List")) { x_char[is.na(x_char)] <- "." x_char <- pasteCollapse(relist(x_char, x)) x_char[elementNROWS(x) == 0] <- NA } ## FIXME: add option so these become "." instead of removing x_char[is.na(x_char)] <- "\r" if (!is.numeric(x_flat) && version != "3") x_char <- paste0("\"", x_char, "\"") paste(name, x_char, sep = tvsep) }, simplify = FALSE)) if (version == "3") sep <- ";" else sep <- "; " attrs <- do.call(paste, c(attrs, sep = sep)) attrs <- gsub("[^;]*?\r\"?(;|$)", "", attrs) attrs[nchar(attrs) == 0] <- NA } } scipen <- getOption("scipen") options(scipen = 100) # prevent use of scientific notation on.exit(options(scipen = scipen)) if (!is.null(attrs)) { # write out the rows with attributes first write.table(cbind(table, attrs)[!is.na(attrs),], con, sep = "\t", na = ".", quote = FALSE, col.names = FALSE, row.names = FALSE, append = TRUE) table <- table[is.na(attrs),] } write.table(table, con, sep = "\t", na = ".", quote = FALSE, col.names = FALSE, row.names = FALSE, append = TRUE) if (index) indexTrack(file) invisible(NULL) }) setMethod("export", c("SimpleGRangesList", "GFFFile"), .export_SimpleGRangesList_RTLFile) setGeneric("export.gff1", function(object, con, ...) standardGeneric("export.gff1")) setMethod("export.gff1", "ANY", function(object, con, ...) export(object, con, "gff1", ...)) setGeneric("export.gff2", function(object, con, ...) standardGeneric("export.gff2")) setMethod("export.gff2", "ANY", function(object, con, ...) export(object, con, "gff2", ...)) setGeneric("export.gff3", function(object, con, ...) standardGeneric("export.gff3")) setMethod("export.gff3", "ANY", function(object, con, ...) export(object, con, "gff3", ...)) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Import ### setGeneric("import.gff", function(con, ...) standardGeneric("import.gff")) setMethod("import.gff", "ANY", function(con, ...) { import(con, "gff", ...) }) setMethod("import", "GFFFile", function(con, format, text, version = c("", "1", "2", "3"), genome = NA, colnames = NULL, which = NULL, feature.type = NULL, sequenceRegionsAsSeqinfo = FALSE) { if (!missing(format)) checkArgFormat(con, format) if (!missing(version)) con <- asGFFVersion(con, match.arg(version)) stopifnot(isTRUEorFALSE(sequenceRegionsAsSeqinfo)) ## download the file first if it's remote if (is.character(resource(con))) { uri <- .parseURI(resource(con)) if (uri$scheme %in% c("ftp", "http")) { destfile <- tempfile() download.file(resource(con), destfile) con@resource <- destfile } } m <- manager() sniff_con <- connection(m, con, "r") on.exit(release(m, sniff_con)) sniffed <- .sniffGFFVersion(sniff_con) version <- gffFileVersion(con) if (!length(version)) { if (is.null(sniffed)) sniffed <- "1" con <- asGFFVersion(con, sniffed) } if (length(version) && !is.null(sniffed) && !identical(sniffed, version)) warning("gff-version directive indicates version is ", sniffed, ", not ", version) if (is(genome, "Seqinfo") && length(genome) == 0L) { genome <- NA_character_ } if (is.na(genome)) { genome <- genome(con) if (is.null(genome)) genome <- NA } ### FIXME: a queryForLines() function would be more efficient ## Temporarily disable use of Tabix Index. ## TODO: Restore use of Tabix Index! #con <- queryForResource(m, con, which) resource <- queryForResource(m, con) on.exit(release(m, resource), add=TRUE) ans <- readGFFAsGRanges(resource, version=version, colnames=colnames, filter=list(type=feature.type), genome=genome, sequenceRegionsAsSeqinfo= sequenceRegionsAsSeqinfo, speciesAsMetadata=TRUE) if (!attr(resource, "usedWhich") && !is.null(which)) ans <- subsetByOverlaps(ans, which) ans }) setGeneric("import.gff1", function(con, ...) standardGeneric("import.gff1")) setMethod("import.gff1", "ANY", function(con, ...) import(con, "gff1", ...)) setGeneric("import.gff2", function(con, ...) standardGeneric("import.gff2")) setMethod("import.gff2", "ANY", function(con, ...) import(con, "gff2", ...)) setGeneric("import.gff3", function(con, ...) standardGeneric("import.gff3")) setMethod("import.gff3", "ANY", function(con, ...) import(con, "gff3", ...)) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### DNAStringSet from fasta data ### ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Coercion ### setGeneric("asGFF", function(x, ...) standardGeneric("asGFF")) setMethod("asGFF", "GRangesList", function(x, parentType = "mRNA", childType = "exon") { parent_range <- range(x) if (!all(elementNROWS(parent_range) == 1)) stop("Elements in a group must be on same sequence and strand") parents <- unlist(parent_range, use.names = FALSE) children <- unlist(x, use.names = FALSE) makeId <- function(x, prefix) { paste(prefix, seq_len(length(x)), sep = "") } parentIds <- makeId(parents, parentType) values(parents)$type <- parentType values(parents)$ID <- parentIds values(parents)$Name <- names(x) values(children)$type <- childType values(children)$ID <- makeId(children, childType) values(children)$Name <- names(children) values(children)$Parent <- rep.int(parentIds, elementNROWS(x)) allColumns <- union(colnames(values(parents)), colnames(values(children))) values(children) <- rectifyDataFrame(values(children), allColumns) values(parents) <- rectifyDataFrame(values(parents), allColumns) c(parents, children) }) rectifyDataFrame <- function(x, allColumns) { x[setdiff(allColumns, colnames(x))] <- DataFrame(NA) x[allColumns] } ### FIXME: We wrote this but never tested it, and it is not yet ### used. People should use GFF3 instead of this. ### ### KNOWN ISSUES: ### 1) The stop codon should not be included in the CDS (annoying) ### 2) pmapFromTranscripts() does not yet support our usage of it ### 3) Needs to move to GenomicFeatures setGeneric("asGTF", function(x, ...) standardGeneric("asGTF")) frame <- function(x) { cs <- cumsum(width(x)) ucs <- unlist(cs, use.names=FALSE) ucs[end(PartitioningByEnd(x))] <- 0L ucs <- c(0L, head(ucs, -1L)) ucs %% 3L } setMethod("asGTF", "GRangesList", function(x) { tx_ids <- names(x) if (is.null(tx_ids)) { tx_ids <- seq_along(x) } processFeatures <- function(f) { ans <- unlist(f, use.names=FALSE) ans$frame <- frame(f) if (is.null(ans$gene_id)) { ans$gene_id <- "" } if (is.null(ans$transcript_id)) { ans$transcript_id <- tx_ids[togroup(f)] } ans } start_codon_tx <- GenomicFeatures::pmapFromTranscripts(IRanges(1L, 3L), x) start_codon <- processFeatures(start_codon_tx) mcols(start_codon)$type <- "start_codon" stop_ranges <- IRanges(end=sum(width(x)), width=3L) stop_codon_tx <- GenomicFeatures::pmapFromTranscripts(stop_ranges, x) stop_codon <- processFeatures(stop_codon_tx) mcols(stop_codon)$type <- "stop_codon" codons <- c(start_codon, stop_codon) cds <- processFeatures(x) mcols(cds)$type <- "CDS" values(codons) <- rectifyDataFrame(values(codons), colnames(cds)) c(codons, cds) }) ## setMethod("asGTF", "TxDb", ## function(x, by) { ## cds <- cds(x, columns="tx_id") ## cds <- cds[togroup(cds$tx_id)] ## cds$transcript_id <- unlist(cds$tx_id) ## cds$tx_id <- NULL ## txGene <- transcriptsBy(x) ## txToGene <- setNames(names(txGene)[togroup(txGene)], ## unlist(txGene, use.names=FALSE)$tx_id) ## cds$gene_id <- txToGene[cds$transcript_id] ## processUTRs <- function(utr) { ## ans <- unlist(utr, use.names=FALSE) ## ans$transcript_id <- names(utr)[togroup(utr)] ## ans$gene_id <- txToGene[ans$transcript_id] ## ans ## } ## three_utr <- processUTRs(threeUTRsByTranscript(x)) ## three_utr$type <- "3UTR" ## five_utr <- processUTRs(fiveUTRsByTranscript(x)) ## five_utr$type <- "5UTR" ## c(asGTF(split(cds, cds$transcript_id)), five_utr, three_utr) ## }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Utilities ### scanGFFDirectives <- function(con, tag = NULL) { m <- manager() con <- connection(m, con, "r") on.exit(release(m, con)) directives <- character() lines <- line <- readLines(con, n = 1) while(grepl("^#", line)) { if (grepl("^##", line)) { directives <- c(directives, line) } line <- readLines(con, n = 1) if (length(line) == 0L) break lines <- c(lines, line) } pushBack(lines, con) sub("^[^[:space:]]* ", "", grep(paste0("^##", tag), directives, value = TRUE)) } gffGenomeBuild <- function(x) { genome_build <- scanGFFDirectives(x, "genome-build") unlist(strsplit(genome_build, "\t", fixed = TRUE)) } setMethod("provider", "GFFFile", function(x) { gffGenomeBuild(x)[1] }) setMethod("providerVersion", "GFFFile", function(x) { gffGenomeBuild(x)[2] }) setMethod("genome", "GFFFile", function(x) providerVersion(x)) gffComment <- function(con, ...) cat("##", paste(...), "\n", sep = "", file = con, append = TRUE) .sniffGFFVersion <- function(con) { version <- NULL lines <- line <- readLines(con, n = 1) while(grepl("^#", line)) { if (grepl("^##gff-version", line)) { version <- sub("^##gff-version *", "", line) break } line <- readLines(con, n = 1) lines <- c(lines, line) } pushBack(lines, con) version } gffFileClass <- function(version) { paste("GFF", version, "File", sep = "") } gffFileVersion <- function(file) { versions <- c("1", "2", "3") unlist(Filter(function(v) is(file, gffFileClass(v)), versions)) } asGFFVersion <- function(con, version) { if (!is(con, gffFileClass(version))) { if (class(con) != "GFFFile") warning("Treating a '", class(con), "' as GFF version '", version, "'") con <- GFFFile(resource(con), version) } con } rtracklayer/R/igv.R0000644000175400017540000000172013556116552015245 0ustar00biocbuildbiocbuild### ========================================================================= ### IGV Data Server Access ### ------------------------------------------------------------------------- readIGVRegistry <- function(url) { do.call(rbind, lapply(readLines(url), readIGVDataFile)) } handleCategory <- function(x) { paths <- unlist(getNodeSet(x, "Resource/@path")) names(paths) <- unlist(getNodeSet(x, "Resource/@name")) name <- factor(unname(xmlAttrs(x)["name"])) categories <- lapply(getNodeSet(x, "Category"), handleCategory) children <- do.call(rbind, categories) children$parenet <- name resources <- rtracklayer:::RTLFileList(lapply(paths, FileForFormat)) df <- DataFrame(category=name, parent=NA, name=names(paths), resources) rbind(df, children) } readIGVDataFile <- function(url) { lines <- readLines(url) doc <- xmlTreeParse(lines, asText=TRUE, useInternalNodes=TRUE) handleCategory(getNodeSet(doc, "/Global")[[1L]]) } rtracklayer/R/index.R0000644000175400017540000000603213556116552015570 0ustar00biocbuildbiocbuild### ========================================================================= ### Separate index support ### ------------------------------------------------------------------------- ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### queryForResource ### ## There is some question as to whether the import routines should ## recurse through import.tabix, or perform the query ## internally. Currently, we are taking the latter route, because it ## is consistent with (gzip) decoding and it allows the parsers more ## flexibility. setGeneric("queryForResource", function(manager, x, which = NULL, ...) standardGeneric("queryForResource"), signature="x") ## Attaches 'usedWhich' attribute, an optimization hint indicating ## that subsetting by 'which' has been performed and is no longer ## necessary. Probably premature. setMethod("queryForResource", "RTLFile", function(manager, x, which = NULL, ...) { r <- resource(x) ans <- structure(r, usedWhich = FALSE) if (!is.null(which) && is.character(r)) { x_tbi <- paste(r, "tbi", sep = ".") if (file.exists(x_tbi)) ans <- queryForResource(manager, TabixFile(r), which = which, ...) } ans }) setMethod("queryForResource", "TabixFile", function(manager, x, which, header = TRUE, ...) { tabixHeader <- headerTabix(x) si <- Seqinfo(tabixHeader$seqnames) if (is.null(which)) { buffer <- connectionForResource(manager, path(x), "r") if (!header) readLines(buffer, tabixHeader$skip) } else { buffer <- manage(manager, file()) if (header) { skippedLines <- readLines(path(x), tabixHeader$skip) writeLines(skippedLines, buffer) } lines <- unlist(scanTabix(x, param = which), use.names = FALSE) writeLines(lines, buffer) si <- merge(si, seqinfo(which)) } structure(buffer, usedWhich = TRUE, seqinfo = si) }) queryForConnection <- function(manager, x, which = NULL, ...) { resource <- queryForResource(manager, x, which = which, ...) con <- connectionForResource(manager, resource, open = "r") structure(con, usedWhich = attr(resource, "usedWhich")) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### indexTrack: attempt to build an index for a track ### ### This is an obscene hack ### indexTrack <- function(con, ...) { indexed <- NULL formats <- eval(formals(indexTabix)$format) uri <- path(con) parsed_uri <- .parseURI(uri) if (!uriIsLocal(parsed_uri)) stop("'con' must be a path to a local file") original_path <- parsed_uri$path path <- bgzip(original_path, overwrite = TRUE) format <- Find(function(f) { is(con, paste(toupper(f), "File", sep = "")) }, formats) if (!is.null(format)) { indexTabix(path, format, ...) } else { indexTabix(path, ...) } indexed <- TabixFile(path) unlink(original_path) invisible(indexed) } rtracklayer/R/io.R0000644000175400017540000002467613556116552015106 0ustar00biocbuildbiocbuild### ========================================================================= ### Import/export support ### ------------------------------------------------------------------------- ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Classes files and connections ### ### RTLFile is a base class for high-level file abstractions, where ### subclasses are associated with a particular file format/type. It ### wraps a low-level representation of a file, currently either a ### path/URL or connection. setClass("RTLFile", representation(resource = "characterORconnection"), contains = "VIRTUAL") setClass("RTLFileList", prototype = prototype(elementType = "RTLFile"), contains = "SimpleList") RTLFileList <- function(files) { new("RTLFileList", listData = files) } setMethod("showAsCell", "RTLFileList", function(object) { showAsCell(vapply(object, path, character(1L))) }) .ConnectionManager <- setRefClass("ConnectionManager", fields = c(connections = "list")) manager <- function() .ConnectionManager() resource <- function(x) x@resource `resource<-` <- function(x, value) { x@resource <- value x } connection <- function(manager, x, open = "") { connectionForResource(manager, resource(x), open = open) } resourceDescription <- function(x) { r <- resource(x) if (is(r, "connection")) r <- summary(r)$description r } setGeneric("fileFormat", function(x) NULL) setMethod("fileFormat", "character", function(x) fileFormat(FileForFormat(x))) setMethod("fileFormat", "RTLFile", function(x) tolower(sub("File$", "", class(x)))) setMethod("path", "RTLFile", function(object) { r <- resource(object) if (!is.character(r)) stop("Connection resource requested as a path") r }) setMethod("show", "RTLFile", function(object) { r <- resource(object) if (!isSingleString(r)) r <- summary(r)$description cat(class(object), "object\nresource:", r, "\n") }) FileForFormat <- function(path, format = file_ext(path)) { if (!(isSingleString(path) || is(path, "connection"))) stop("'path' must be a single string or a connection object") if (!isSingleString(format)) stop("'format' must be a single string") if (format == "") stop("Cannot detect format (no extension found in file name)") fileClassName <- paste0(format, "File") signatureClasses <- function(fun, pos) { matrix(unlist(findMethods(fun)@signatures), 3)[pos,] } fileClassNames <- unique(c(signatureClasses(export, 2), signatureClasses(import, 1))) fileClassNames <- fileClassNames[grepl("File$", fileClassNames)] fileSubClassNames <- unlist(lapply(fileClassNames, function(x) { names(getClassDef(x)@subclasses) }), use.names = FALSE) fileClassNames <- c(fileClassNames, fileSubClassNames) fileClassIndex <- match(tolower(fileClassName), tolower(fileClassNames)) if (is.na(fileClassIndex)) stop("Format '", format, "' unsupported") fileClassName <- fileClassNames[fileClassIndex] fileClass <- getClass(fileClassName) pkg <- packageSlot(fileClass) if (is.null(pkg) || identical(pkg, ".GlobalEnv")) ns <- topenv() else ns <- getNamespace(pkg[1]) constructorName <- fileClassName if(!exists(constructorName, ns)) { parentClassNames <- names(getClass(constructorName)@contains) constructorName <- names(which(sapply(parentClassNames, exists, ns)))[1] if (is.na(constructorName)) stop("No constructor found for ", fileClassName) } get(constructorName, ns)(path) } setMethod("as.character", "RTLFile", function(x) path(x)) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Export ### setGeneric("export", function(object, con, format, ...) standardGeneric("export")) setMethod("export", c(con = "connection", format = "character"), function(object, con, format, ...) { export(object, FileForFormat(con, format), ...) }) setMethod("export", c(con = "connection", format = "missing"), function(object, con, format, ...) { format <- file_ext(summary(con)$description) export(object, con, format, ...) }) setMethod("export", c(con = "missing", format = "character"), function(object, con, format, ...) { con <- file() on.exit(close(con)) export(object, con, format, ...) text <- readLines(con, warn = FALSE) text }) setMethod("export", c(con = "character", format = "missing"), function(object, con, format, ...) { export(object, FileForFormat(con), ...) }) setMethod("export", c(con = "character", format = "character"), function(object, con, format, ...) { export(object, FileForFormat(con, format), ...) }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Import ### setGeneric("import", function(con, format, text, ...) standardGeneric("import")) setMethod("import", c("connection", "character"), function(con, format, text, ...) { import(FileForFormat(con, format), ...) }) setMethod("import", c("connection", "missing"), function(con, format, text, ...) { format <- file_ext(summary(con)$description) import(con, format, ...) }) setMethod("import", c("character", "missing"), function(con, format, text, ...) { import(FileForFormat(con), ...) }) setMethod("import", c("character", "character"), function(con, format, text, ...) { import(FileForFormat(con, format), ...) }) setMethod("import", c(con = "missing", text = "character"), function(con, format, text, ...) { con <- file() on.exit(close(con)) writeLines(text, con) obj <- import(FileForFormat(con, format), ...) obj }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Utilities ### setGeneric("bestFileFormat", function(x, dest, ...) standardGeneric("bestFileFormat")) setMethod("bestFileFormat", c("GenomicRanges", "ANY"), function(x, dest) { ## have numbers on a single strand, use BigWig if (is.numeric(score(x)) && length(unique(strand(x))) == 1L) "bw" else "bed" }) setMethod("bestFileFormat", c("GRangesList", "ANY"), function(x, dest) { "bed" # need hierarchical structure }) setMethod("bestFileFormat", c("RleList", "ANY"), function(x, dest) { "bw" # e.g., coverage }) setMethod("bestFileFormat", c("IntegerRangesList", "ANY"), function(x, dest) { "bed" # just ranges... }) ## First checks for Windows drive letter. ## There are no known URI schemes that are only a single character. isURL <- function(uri) { if (!isSingleString(uri)) return(FALSE) windowsDriveLetter <- .Platform$OS.type == "windows" && grepl("^[A-Za-z]:[/\\]", uri) grepl("^[A-Za-z]+:", uri) && !windowsDriveLetter } ## Uses XML::parseURI, except custom check for whether it is a URL .parseURI <- function(uri) { if (!isURL(uri)) { parsed <- parseURI("") parsed$path <- uri } else { parsed <- parseURI(uri) if (parsed$scheme == "file" && .Platform$OS.type == "windows") parsed$path <- substring(parsed$path, 2) # trim '/' from '/C:/foo/bar.txt' } parsed } normURI <- function(x) { if (!isSingleString(x)) stop("URI must be a single, non-NA string") uri <- .parseURI(x) if (uri$scheme == "") # /// (vs. //) needed for Windows x <- paste("file:///", file_path_as_absolute(x), sep = "") x } createResource <- function(x, dir = FALSE, content = "") { uri <- .parseURI(x) if (uri$scheme == "file" || uri$scheme == "") { if (!file.exists(uri$path)) { if (dir) dir.create(uri$path, recursive = TRUE) else writeLines(content, uri$path) } else warning("Path '", uri$path, "' already exists") } else stop("Cannot create a resource that is not a local file") } uriExists <- function(x) { uri <- .parseURI(x) if (uriIsLocal(x)) { exists <- file.exists(uri$path) } else { txt <- getURL(x, header = TRUE) exists <- grepl("^HTTP/\\d+\\.\\d+ 200 OK", txt) } exists } uriIsLocal <- function(x) { x$scheme == "file" || x$scheme == "" } uriIsWritable <- function(x) { uri <- .parseURI(x) if (uriIsLocal(uri)) { !file.access(uri$path, 2) || (!file.exists(uri$path) && uriIsWritable(dirname(uri$path))) } else FALSE } checkArgFormat <- function(con, format) { if (toupper(format) != substring(toupper(sub("File$", "", class(con))), 1, nchar(format))) stop("Cannot treat a '", class(con), "' as format '", format, "'") } connectionForResource <- function(manager, x, open = "") { resource <- decompress(manager, x) if (is.character(resource)) { if (!nzchar(resource)) stop("path cannot be an empty string") uri <- .parseURI(resource) if (uri$scheme != "") con <- url(resource) else con <- file(resource) } else con <- resource if (!isOpen(con) && nzchar(open)) { open(con, open) con <- manage(manager, con) } con } ## Connection management (similar to memory management) manage <- function(manager, con) { manager$connections <- unique(c(manager$connections, list(con))) attr(con, "manager") <- manager con } managed <- function(manager, con) { con %in% manager$connections } unmanage <- function(manager, con) { manager$connections <- setdiff(manager$connections, con) attr(con, "manager") <- NULL con } release <- function(manager, con) { if (managed(manager, con)) { unmanage(manager, con) close(con) } con } ## manage <- function(con) { ## if (!is.null(attr(con, "finalizerEnv"))) ## return(con) ## env <- new.env() ## finalizer <- function(obj) { ## if (exists("con", parent.env(environment()), inherits=FALSE)) { ## close(con) ## rm(con, inherits = TRUE) ## TRUE ## } else FALSE ## } ## env$finalizer <- finalizer ## reg.finalizer(env, finalizer) ## attr(con, "finalizerEnv") <- env ## rm(env) ## con ## } ## unmanage <- function(con) { ## attr(con, "finalizerEnv") <- NULL ## con ## } ## release <- function(con) { ## env <- attr(con, "finalizerEnv") ## if (!is.null(env)) ## env$finalizer() ## else FALSE ## } rtracklayer/R/ncbi.R0000644000175400017540000000160213556116552015372 0ustar00biocbuildbiocbuildNCBI_TAX_URL <- "http://www.ncbi.nlm.nih.gov/Taxonomy/Browser/wwwtax.cgi" isNCBISpeciesURL <- function(url) { substring(url, 1L, nchar(NCBI_TAX_URL)) == NCBI_TAX_URL } metadataFromNCBI <- function(url) { html <- httpGet(url) list("Taxonomy ID"=parseTaxonomyIdFromNCBI(html), "Organism"=parseOrganismFromNCBI(html)) } parseTaxonomyIdFromNCBI <- function(html) { unlist(getNodeSet(html, "//input[@name='old_id']/@value"), use.names=FALSE) } taxonomyIdFromNCBI <- function(species) { url <- paste0(NCBI_TAX_URL, "?name=", URLencode(species)) parseTaxonomyIdFromNCBI(httpGet(url)) } parseOrganismFromNCBI <- function(html) { title <- xmlValue(getNodeSet(html, "//title/text()")[[1L]]) sub(".*\\((.*?)\\).*", "\\1", title) } speciesFromNCBI <- function(id) { url <- paste0(NCBI_TAX_URL, "?id=", URLencode(id)) parseOrganismFromNCBI(httpGet(url)) } rtracklayer/R/quickload.R0000644000175400017540000003015113556116552016434 0ustar00biocbuildbiocbuild### ========================================================================= ### Quickload support ### ------------------------------------------------------------------------- ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Quickload class ### setClass("Quickload", representation(uri = "character")) uri <- function(x, ...) x@uri Quickload_contents <- function(x) { read.table(contentsFile(x), sep = "\t", col.names = c("dir", "title"), colClasses = "character") } setMethod("genome", "Quickload", function(x) { contents <- Quickload_contents(x) as.character(structure(contents$dir, names = contents$title)) }) setMethod("names", "Quickload", genome) setMethod("length", "Quickload", function(x) length(names(x))) setMethod("[[", "Quickload", function (x, i, j, ...) { if (!missing(j)) warning("argument 'j' ignored") QuickloadGenome(x, i, ...) }) setMethod("$", "Quickload", function (x, name) { QuickloadGenome(x, name) }) Quickload <- function(uri = "quickload", create = FALSE) { if (!isTRUEorFALSE(create)) stop("'create' must be TRUE or FALSE") if (create) { if (uriExists(uri)) { message("NOTE: '", uri, "' already exists") create <- FALSE } ## must create this before calling normURI (requires existence) else createResource(uri, dir = TRUE) } ql <- new("Quickload", uri = normURI(uri)) if (create) createResource(contentsFile(ql)) ql } setAs("character", "Quickload", function(from) Quickload(from)) setMethod("show", "Quickload", function(object) { cat(class(object), "repository\nuri:", uri(object), "\n") cat(S4Vectors:::labeledLine("genomes", genome(object))) }) contentsFile <- function(x) file.path(uri(x), "contents.txt") ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### QuickloadGenome class ### setClass("QuickloadGenome", representation(quickload = "Quickload", genome = "character"), contains = "TrackDb") setMethod("uri", "QuickloadGenome", function(x) file.path(uri(quickload(x)), genome(x))) quickload <- function(x, ...) x@quickload setMethod("genome", "QuickloadGenome", function(x) x@genome) setMethod("seqinfo", "QuickloadGenome", function(x) { genome_info <- read.table(genomeFile(x), sep = "\t", col.names = c("seqnames", "seqlengths"), colClasses = c("character", "integer")) Seqinfo(genome_info$seqnames, genome_info$seqlengths, genome = rep(genome(x), nrow(genome_info))) }) setReplaceMethod("seqinfo", "QuickloadGenome", function(x, value) { if (uriIsWritable(genomeFile(x))) { df <- as.data.frame(value)[1] write.table(df, genomeFile(x), quote = FALSE, col.names = FALSE, sep = "\t") } else stop("Repository is read only; cannot write seqinfo") x }) setMethod("releaseDate", "QuickloadGenome", function(x) { sub(".*?_(.*?)_([^_]*)$", "\\1 \\2", genome(x)) }) setMethod("organism", "QuickloadGenome", function(object) { gsub("_", " ", sub("(.*?)_.*?_[^_]*$", "\\1", genome(object))) }) setMethod("length", "QuickloadGenome", function(x) { length(names(x)) }) QuickloadGenome_annotFiles <- function(x) { xmlChildren(xmlInternalTreeParse(annotsFile(x)))$files } setMethod("names", "QuickloadGenome", function(x) { x_mcols <- mcols(x) structure(sapply(as.character(x_mcols$name), URLdecode), names = as.character(x_mcols$title)) }) setMethod("mcols", "QuickloadGenome", function(x) { files <- QuickloadGenome_annotFiles(x) if (!length(xmlChildren(files))) new("DataFrame", nrows = length(x)) else Reduce(function(x, y) merge(as.data.frame(as.list(x)), as.data.frame(as.list(y)), all = TRUE), lapply(xmlChildren(files), xmlAttrs)) }) setMethod("toString", "QuickloadGenome", function(x) { Quickload_contents(quickload(x))[genome(x),"title"] }) addGenomeToContents <- function(x, title) { contents <- Quickload_contents(quickload(x)) if (!genome(x) %in% contents$dir) { contents <- rbind(contents, data.frame(genome(x), title)) if (uriIsWritable(contentsFile(quickload(x)))) write.table(contents, contentsFile(quickload(x)), quote = FALSE, row.names = FALSE, col.names = FALSE, sep = "\t") else stop("Repository is read only; cannot add genome to contents") } else warning("Genome '", genome(x), "' already in contents; not replaced") } setMethod("toString", "GenomeDescription", function(x) { paste(organism(x), provider(x), providerVersion(x)) }) ## Not sure where this method should land. I'm sure it will be useful ## for publishing adhoc genomes through Quickload. setMethod("seqinfo", "DNAStringSet", function(x) { x_names <- names(x) if (is.null(x_names)) x_names <- as.character(seq(length(x))) Seqinfo(x_names, width(x)) }) QuickloadGenome <- function(quickload, genome, create = FALSE, seqinfo = GenomicRanges::seqinfo(genome), title = toString(genome)) { if (!isTRUEorFALSE(create)) stop("'create' must be TRUE or FALSE") quickload <- as(quickload, "Quickload") genome <- normArgGenome(genome) genome_id <- quickloadGenomeId(genome) qlg <- new("QuickloadGenome", quickload = quickload, genome = genome_id) if (create) { if (is.character(genome) && missing(seqinfo)) stop("No seqinfo for genome '", genome, "'") createQuickloadGenome(qlg, seqinfo, title) } qlg } setMethod("show", "QuickloadGenome", function(object) { cat(class(object), "track database\ngenome:", genome(object), "\nquickload:", uri(quickload(object)), "\n") cat(S4Vectors:::labeledLine("names", names(object))) }) genomeFile <- function(x) file.path(uri(x), "mod_chromInfo.txt") annotsFile <- function(x) file.path(uri(x), "annots.xml") ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Import of tracks/sequence from Quickload ### setMethod("track", "QuickloadGenome", function(object, name, ...) { object_mcols <- mcols(object) if (!name %in% object_mcols$title) stop("Track '", name, "' does not exist") md <- as.list(object_mcols[object_mcols$title == name,]) rd <- import(file.path(uri(object), md$name), ...) metadata(rd)$quickload <- md rd }) ## Since a QuickloadGenome can store only a ## single referenece genome, it is best to treat it as a "slot". setGeneric("referenceSequence", function(x, ...) standardGeneric("referenceSequence")) referenceSequenceFile <- function(x) { paste(file.path(uri(x), genome(x)), ".2bit", sep = "") } setMethod("referenceSequence", "QuickloadGenome", function(x, which = as(seqinfo(x), "GenomicRanges"), ...) { import(referenceSequenceFile(x), which = which, ...) }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Export of tracks/sequence to Quickload ### ### FIXME: check for file URI scheme setGeneric("sortBySeqnameAndStart", function(x) standardGeneric("sortBySeqnameAndStart")) ## Seems not really possible for GRangesList setMethod("sortBySeqnameAndStart", "GenomicRanges", function(x) { x[order(as.factor(seqnames(x)), start(x)),] }) setMethod("sortBySeqnameAndStart", "IntegerRangesList", function(x) { x.flat <- unlist(x, use.names=FALSE) relist(x.flat[order(space(x), start(x.flat))], x) }) .exportToQuickload <- function(object, name, format = bestFileFormat(value, object), index = TRUE, metadata = character(), ..., value) { if (is(object, "Annotated")) { value_metadata <- metadata(value)$quickload value_metadata[names(metadata)] <- metadata metadata <- value_metadata } filename <- paste(name, format, sep = ".") path <- paste(uri(object), filename, sep = "/") seqinfo(value) <- seqinfo(object) file <- export(value, path, format = format, index = index, ...) track(object, name, index = FALSE, metadata = metadata) <- file object } setReplaceMethod("track", signature(object = "QuickloadGenome", value = "ANY"), .exportToQuickload) setReplaceMethod("track", signature(object = "QuickloadGenome", value = "RsamtoolsFile"), function(object, name, metadata = character(), ..., value) { if (missing(name)) name <- basename(path(value)) track(object, name, metadata = metadata) <- URLencode(path(value)) copyResourceToQuickload(object, URLencode(index(value))) object }) setReplaceMethod("track", signature(object = "QuickloadGenome", value = "RTLFile"), function(object, name, metadata = character(), ..., value) { if (missing(name)) name <- basename(path(value)) track(object, name, metadata = metadata) <- URLencode(path(value)) object }) copyResourceToQuickload <- function(object, uri) { parsed_uri <- .parseURI(uri) if (parsed_uri$scheme == "") uri <- paste("file://", uri, sep = "") filename <- basename(uri) object_uri <- .parseURI(uri(object)) if (uriIsLocal(object_uri)) { dest_file <- file.path(object_uri$path, filename) if (paste(uri(object), filename, sep = "/") != uri) ### FIXME: URLdecode() here because of R bug download.file(URLdecode(uri), dest_file) } else stop("Quickload is not local; cannot copy track") filename } setReplaceMethod("track", signature(object = "QuickloadGenome", value = "character"), function(object, name = basename(object), metadata = character(), ..., value) { file <- copyResourceToQuickload(object, value) files <- QuickloadGenome_annotFiles(object) ## make sure we have the three required attributes attrs <- c(name = file, title = name) attrs[names(metadata)] <- metadata filenames <- getNodeSet(files, "//@name") if (file %in% filenames) { removeChildren(files, match(file, filenames)) } files <- addChildren(files, newXMLNode("file", attrs = attrs)) saveXML(files, annotsFile(object)) object }) setGeneric("referenceSequence<-", function(x, ..., value) standardGeneric("referenceSequence<-")) setReplaceMethod("referenceSequence", signature(x = "QuickloadGenome", value = "ANY"), function(x, name, ..., value) { export.2bit(value, referenceSequenceFile(x)) x }) ### Not exported yet setGeneric("synonyms", function(x, ...) standardGeneric("synonyms")) synonymFile <- function(x) file.path(uri(x), "synonyms.txt") setMethod("synonyms", "QuickloadGenome", function(x) { CharacterList(strsplit(readLines(synonymFile(x)), "\t")) }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Utilities ### normArgGenome <- function(genome) { if (is.character(genome)) { bs_genome <- BSGenomeForID(genome) if (!is.null(bs_genome)) genome <- bs_genome } genome } quickloadGenomeId <- function(genome) { if (!is.character(genome)) { species <- sub("^(.).*? ", "\\1_", organism(genome)) date <- sub("\\. ", "_", releaseDate(genome)) paste(species, date, sep = "_") } else genome } createQuickloadGenome <- function(x, seqinfo, title) { if (genome(x) %in% genome(quickload(x))) { message("NOTE: Genome '", genome(x), "' already exists") return() } createResource(uri(x), dir = TRUE) createResource(annotsFile(x), content = "") seqinfo(x) <- seqinfo addGenomeToContents(x, title) } rtracklayer/R/ranges.R0000644000175400017540000002327513556116552015750 0ustar00biocbuildbiocbuild### ========================================================================= ### Genome-oriented methods for GRanges and IntegerRangesList objects ### ------------------------------------------------------------------------- ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### GRanges convenience constructor ### GenomicData <- function(ranges, ..., strand = NULL, chrom = NULL, genome = NA, seqinfo = NULL, which = NULL, metadata = list()) { if (is.null(genome)) genome <- NA if (!isSingleStringOrNA(genome)) stop("'genome' must be a single string, or NULL, or NA") if (!is.null(seqinfo) && !all(genome == genome(seqinfo), na.rm=TRUE)) { stop("'genome' ", genome, "' does not match that in 'seqinfo'") } if (length(seqinfo) == 0L) seqinfo <- seqinfoForGenome(genome) if (length(chrom) > length(ranges)) stop("length of 'chrom' greater than length of 'ranges'") if (length(chrom) > 0 && (length(ranges) %% length(chrom) != 0)) stop("length of 'ranges' not a multiple of 'chrom' length") normStrand <- function(strand) { strand <- as.character(strand) strand[is.na(strand)] <- "*" strand(strand) } if (!(is.null(strand) || is(strand, "Rle"))) strand <- normStrand(strand) if (is.null(chrom)) chrom <- droplevels(Rle(factor("1"), length(ranges))) dots <- list(...) if (length(dots) == 1) { dots <- dots[[1L]] if ((is(dots, "data.frame") || is(dots, "DataTable")) && !is.null(dots[["strand"]])) { strand <- dots[["strand"]] dots[["strand"]] <- NULL return(GenomicData(ranges = ranges, dots, strand = strand, chrom = chrom, genome = genome, seqinfo = seqinfo, which = which, metadata = metadata)) } } if (is.null(strand)) strand <- Rle("*", length(ranges)) df <- DataFrame(...) invalidNames <- names(df) %in% GenomicRanges:::INVALID.GR.COLNAMES names(df)[invalidNames] <- paste0(".", names(df)[invalidNames]) gd <- GRanges(seqnames = chrom, ranges = ranges, strand = strand, df, seqinfo = seqinfo) if (!is.na(genome)) genome(gd) <- genome if (!is.null(which)) { if (is(which, "IntegerRangesList")) which <- as(which, "GRanges") gd <- subsetByOverlaps(gd, which) } metadata(gd) <- metadata gd } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Automatic seqinfo lookup ### seqinfoForGenome <- function(genome, method = c("auto", "BSgenome", "UCSC")) { method <- match.arg(method) if (is.na(genome)) return(NULL) if (method == "auto" || method == "BSgenome") sl <- SeqinfoForBSGenome(genome) if (method == "UCSC" || (method == "auto" && is.null(sl))) sl <- SeqinfoForUCSCGenome(genome) sl } BSGenomeForID <- function(genome) { if (!suppressWarnings(requireNamespace("BSgenome", quietly=TRUE))) return(NULL) bsgenome <- try(BSgenome::getBSgenome(genome), silent=TRUE) if (inherits(bsgenome, "try-error")) return(NULL) bsgenome } SeqinfoForBSGenome <- function(genome) { bsgenome <- BSGenomeForID(genome) if (!is.null(bsgenome)) seqinfo(bsgenome) else NULL } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Convience constructor for GRanges over an entire genome ### GRangesForGenome <- function(genome, chrom = NULL, ranges = NULL, ..., method = c("auto", "BSgenome", "UCSC"), seqinfo = NULL) { if (missing(genome) || !isSingleString(genome)) stop("'genome' must be a single string identifying a genome") if (is.null(seqinfo)) seqinfo <- seqinfoForGenome(genome, match.arg(method)) if (is.null(seqinfo)) stop("Failed to obtain information for genome '", genome, "'") if (!is.null(ranges) && !is(ranges, "IntegerRanges")) stop("'ranges' must be NULL or an IntegerRanges object") if (is.null(chrom)) chrom <- seqnames(seqinfo) else { badChrom <- setdiff(chrom, seqnames(seqinfo)) if (length(badChrom)) stop("Chromosome(s) ", paste(badChrom, collapse = ", "), "are invalid for: ", genome) } if (is.null(ranges)) ranges <- IRanges(1L, seqlengths(seqinfo)[chrom]) gr <- GRanges(chrom, ranges, seqlengths = seqlengths(seqinfo), ...) seqinfo(gr) <- seqinfo gr } GRangesForBSGenome <- function(genome, chrom = NULL, ranges = NULL, ...) { GRangesForGenome(genome, chrom = chrom, ranges = ranges, method = "BSgenome", seqinfo = NULL, ...) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### score: for internal convenience ### setMethod("score", "ANY", function(x) NULL) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### chrom(): Returns chromosome name vector of length 'length(x)'. ### Not to be confused with 'seqnames', which returns a List for ### IntegerRangesList. ### More or less a pre-GenomicRanges relic. ### setGeneric("chrom", function(x, ...) standardGeneric("chrom")) setMethod("chrom", "GRanges", function(x) seqnames(x)) setMethod("chrom", "IntegerRangesList", function(x) { names(x) }) setGeneric("chrom<-", function(x, ..., value) standardGeneric("chrom<-")) setReplaceMethod("chrom", "GRanges", function(x, value) { seqnames(x) <- value x }) ### ========================================================================= ### Genome-oriented conveniences for RangedSelection classes ### ------------------------------------------------------------------------- GenomicSelection <- function(genome, chrom = NULL, colnames = character(0)) { if (missing(genome) || !isSingleString(genome)) stop("'genome' must be a single string identifying a genome") si <- seqinfoForGenome(genome) if (is.null(si)) stop("Failed to obtain information for genome '", genome, "'") lens <- seqlengths(si) if (is.null(chrom)) chrom <- names(lens) else { if (!is.character(chrom)) stop("'chrom' must be NULL or a character vector") invalidChroms <- setdiff(chrom, names(lens)) if (length(invalidChroms)) stop("'chrom' contains invalid chromosomes: ", paste(invalidChroms, collapse = ", ")) lens <- lens[chrom] } RangedSelection(split(IRanges(1, lens), factor(chrom, chrom)), colnames) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Utilities ### ## Individual sessions/views only support a single genome at a time, ## whereas range data structures can have multiple genomes. We try to ## rectify this here. singleGenome <- function(x) { x1 <- unname(x[1]) if (!all(is.na(x)) && (any(is.na(x)) || any(x != x1))) stop("Multiple genomes encountered; only one supported") x1 } ## normalize 'range', using 'session' for default genome ## if 'single' is 'TRUE', only one interval should come out of this normGenomeRange <- function(range, session, max.length = 1L) { ## the user can specify a portion of the genome in several ways: ## - String identifying a genome ## - IntegerRangesList ## - GRanges, the preferred way, possibly from GRangesForUCSCGenome() ## - We do not allow IntegerRanges, since it does not make sense to have ## one range over many chromosomes if (is.character(range)) { range <- singleGenome(range) genome(session) <- range return(GRangesForGenome(range, seqinfo = seqinfo(session))) } if (is(range, "Seqinfo")) range <- as(range, "GRanges") if (!is(range, "IntegerRangesList") && !is(range, "GenomicRanges")) stop("'range' should be a genome string, IntegerRangesList, GRanges or Seqinfo") genome <- genome(session) if (length(seqinfo(range)) == 0L) { ## hack: need to avoid calling seqlengths(session) here, so use 'foo' seqinfo(range) <- Seqinfo("foo", genome = genome) } else { rangeGenome <- singleGenome(genome(range)) if (!is.na(rangeGenome) && rangeGenome != genome) { genome(session) <- rangeGenome on.exit(genome(session) <- genome) } si <- seqinfo(session) seqinfo(range, new2old = match(seqlevels(si), seqlevels(range))) <- merge(si, seqinfo(range)) } if (is(range, "IntegerRangesList")) { range <- GRangesForGenome(singleGenome(genome(range)), names(range), unlist(range), seqinfo = seqinfo(session)) } else if (is(range, "GenomicRanges")) { strand(range) <- "*" mcols(range) <- NULL } if (length(range) > max.length) { warning("number of ranges (", length(range), ") exceeds limit of ", max.length) } if (max.length == 1L) { if (length(unique(seqnames(range))) > max.length) stop("'range' must contain ranges on a single chromosome") range(range) } else { head(range, max.length) } } spansGenome <- function(x) { strand(x) <- "*" x <- reduce(x) w <- structure(width(x), names = as.character(seqnames(x))) identical(w[names(seqlengths(x))], seqlengths(x)) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Questionable utilities ### # replace fields in 'x' with those in 'y', if given ## mergeRange <- function(x, y) ## { ## if (length(genome(y))) ## genome(x) <- genome(y) ## if (length(y)) ## x[[1]] <- y[[1]] ## if (length(names(y))) ## names(x)[1] <- names(y)[1] ## x ## } ## take 'y', filling in info from 'x' if necessary mergeRange <- function(x, y) { if (!length(genome(y))) { genome(y) <- genome(x) if (!length(names(y)) && length(y) == length(x)) { names(y) <- names(x) if (!length(unlist(y)) && length(x)) y[[1]] <- x[[1]] } } if (!length(genome(y))) stop("Genome must be specified") if (length(unlist(y)) && !length(names(y))) stop("Chromosome must be specified if an interval is specified") y } rtracklayer/R/readGFF.R0000644000175400017540000004337013556116552015725 0ustar00biocbuildbiocbuild### ========================================================================= ### readGFF() ### ------------------------------------------------------------------------- .make_filexp_from_filepath <- function(filepath) { if (isSingleString(filepath)) return(XVector:::open_input_files(filepath)[[1L]]) if (!is(filepath, "connection")) stop(wmsg("'filepath' must be a single string or a connection")) if (!isSeekable(filepath)) stop(wmsg("connection is not seekable")) filepath } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### readGFFPragmas() ### readGFFPragmas <- function(filepath) { filexp <- .make_filexp_from_filepath(filepath) if (is(filexp, "connection")) { if (!isOpen(filexp)) { open(filexp) on.exit(close(filexp)) } if (seek(filexp) != 0) { warning(wmsg("connection is not positioned at the start ", "of the file, rewinding it"), immediate.=TRUE) seek(filexp, where=0) } } .Call(read_gff_pragmas, filexp) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### sniffGFFVersion() ### .get_version_from_pragmas <- function(pragmas) { attrcol_fmt <- attr(pragmas, "attrcol_fmt") idx <- grep("^##gff-version", pragmas) if (length(idx) == 0L) { if (is.null(attrcol_fmt)) stop(wmsg("'attr(pragmas, \"attrcol_fmt\")' is NULL")) return(attrcol_fmt) } version <- sub("^##gff-version", "", pragmas[idx]) version <- unique(version) if (length(version) > 1L) { warning(wmsg("more than one GFF version specified in the file, ", "returning the first one")) version <- version[[1L]] } version <- suppressWarnings(as.integer(version)) if (is.na(version)) { warning(wmsg("unrecognized GFF version specified in the file")) if (is.null(attrcol_fmt)) stop(wmsg("'attr(pragmas, \"attrcol_fmt\")' is NULL")) return(attrcol_fmt) } version } sniffGFFVersion <- function(filepath) { pragmas <- readGFFPragmas(filepath) .get_version_from_pragmas(pragmas) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### GFFcolnames() ### ### Return the 9 standard GFF columns as specified at: ### http://www.sequenceontology.org/resources/gff3.html ### GFFcolnames <- function(GFF1=FALSE) { if (!isTRUEorFALSE(GFF1)) stop(wmsg("'GFF1' must be TRUE or FALSE")) .Call(gff_colnames, GFF1) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### readGFF() ### ### Returns 0L, 1L, 2L, or 3L. .normarg_version <- function(version=0) { if (is.character(version)) { ## For compatibility with "import" method for GFFFile objects. if (length(version) == 0L) return(0L) if (isSingleString(version)) { IMPORT_STYLE_VERSIONS <- c("", "1", "2", "3") m <- match(version, IMPORT_STYLE_VERSIONS) if (is.na(m)) stop(wmsg("when a single string, 'version' must ", "be \"\", \"1\", \"2\", or \"3\"")) version <- m - 1L return(version) } } if (isSingleNumber(version)) { if (!is.integer(version)) version <- as.integer(version) if (version < 0L || version > 3L) stop(wmsg("'version' must be 0, 1, 2, or 3")) return(version) } stop(wmsg("'version' must be a single number")) } .prepare_colmap_and_tags <- function(columns=NULL, tags=NULL, attrcol_fmt=0L) { ## Check 'columns'. if (!(is.null(columns) || is.character(columns))) stop(wmsg("'columns' must be NULL or a character vector")) GFF_colnames <- GFFcolnames(attrcol_fmt == 1L) ## Check 'tags'. if (!is.null(tags)) { if (!is.character(tags)) stop(wmsg("'tags' must be NULL or character vector")) if (any(is.na(tags)) || anyDuplicated(tags)) stop(wmsg("'tags' cannot contain NAs or duplicates")) if (attrcol_fmt == 1L) { ## Move any GFF colname found in 'tags' to 'columns'. columns <- union(columns, intersect(tags, GFF_colnames)) tags <- setdiff(tags, GFF_colnames) if (length(tags) != 0L) warning(wmsg("trying to extract tags from a GFF1 file")) } } ## Prepare 'colmap'. if (is.null(columns)) { colmap <- seq_along(GFF_colnames) if (attrcol_fmt != 1L) { stopifnot(GFF_colnames[[length(GFF_colnames)]] == "attributes") ## We don't load the "attributes" column unless the user ## requested no tags (i.e. by setting 'tags' to character(0)). if (!(is.character(tags) && length(tags) == 0L)) colmap[[length(GFF_colnames)]] <- NA_integer_ } } else if (is.character(columns)) { if (!all(columns %in% GFF_colnames)) { in1string <- paste0(GFF_colnames, collapse=", ") stop(wmsg("'columns' must contain valid GFF columns. ", "Valid GFF columns are: ", in1string)) } if (anyDuplicated(columns)) stop(wmsg("'columns' cannot contain duplicates")) colmap <- match(GFF_colnames, columns) } else { stop(wmsg("'columns' must be NULL or a character vector")) } list(colmap=colmap, tags=tags) } .normarg_filter <- function(filter, attrcol_fmt=0L) { GFF_colnames <- GFFcolnames(attrcol_fmt == 1L) if (is.null(filter)) return(NULL) if (!is.list(filter)) stop(wmsg("'filter' must be NULL or a named list")) filter_names <- names(filter) if (is.null(filter_names)) stop(wmsg("'filter' must have names")) if (attrcol_fmt == 1L) { valid_filter_names <- GFF_colnames } else { valid_filter_names <- head(GFF_colnames, n=-1L) } if (!all(filter_names %in% valid_filter_names)) { in1string <- paste0(valid_filter_names, collapse=", ") if (attrcol_fmt == 1L) { excluding_note <- "" } else { excluding_note <- "(excluding \"attributes\")" } stop(wmsg("The names on 'filter' must be valid GFF columns ", excluding_note, ". ", "Valid 'filter' names: ", in1string)) } if (anyDuplicated(filter_names)) stop(wmsg("the names on 'filter' must be unique")) unname(filter[valid_filter_names]) } ### 'df' must be a data-frame-like object (typically an ordinary data frame or ### a DataFrame object). .is_multi_tag <- function(df, ntag, attrcol_fmt=0L) { if (ntag == 0L || attrcol_fmt != 3L) return(logical(ntag)) multi_tags <- c("Parent", "Alias", "Note", "Dbxref", "Ontology_term") sapply(seq_len(ntag) + ncol(df) - ntag, function(j) colnames(df)[[j]] %in% multi_tags || any(grepl(",", df[[j]], fixed=TRUE))) } ### 'df' must be a data-frame-like object (typically an ordinary data frame or ### a DataFrame object). 'decode_idx' must be a non-empty integer vector ### indicating which columns to decode. The columns to decode must be character ### vectors. .url_decode_cols <- function(df, decode_idx) { decoded_cols <- lapply(setNames(decode_idx, colnames(df)[decode_idx]), function(j) urlDecode(df[[j]], na.strings=NA_character_)) df[decode_idx] <- decoded_cols df } ### 'df' must be a data-frame-like object (typically an ordinary data frame or ### a DataFrame object). 'split_idx' must be a non-empty integer vector ### indicating which columns to split. The columns to split must be character ### vectors. Split values are passed thru urlDecode() unless 'raw_data' is ### TRUE. Always returns a DataFrame. .strsplit_cols <- function(df, split_idx, raw_data) { split_cols <- lapply(setNames(split_idx, colnames(df)[split_idx]), function(j) { col <- df[[j]] ## Probably the most efficient way to create an empty CharacterList ## of arbitrary length. split_col <- relist(character(0), PartitioningByEnd(rep.int(0L, length(col)))) not_na <- !is.na(col) tmp <- strsplit(col[not_na], ",", fixed=TRUE) split_col[not_na] <- CharacterList(tmp) if (raw_data) return(split_col) relist(urlDecode(unlist(split_col)), split_col) }) ## Surprisingly sticking the CharacterList cols back into 'df' works ## even if 'df' is an ordinary data frame! df[split_idx] <- split_cols ans <- DataFrame(df, check.names=FALSE) ## "show" method for DataFrame is broken if some colnames are the empty ## string so we rename this column (in our case, we know there can only ## be one). m <- match("", colnames(ans)) if (!is.na(m)) colnames(ans)[m] <- "__empty_tag__" ans } readGFF <- function(filepath, version=0, columns=NULL, tags=NULL, filter=NULL, nrows=-1, raw_data=FALSE) { ## Check 'filepath'. filexp <- .make_filexp_from_filepath(filepath) if (is(filexp, "connection")) { if (!isOpen(filexp)) { open(filexp) on.exit(close(filexp)) } if (seek(filexp) != 0) { warning(wmsg("connection is not positioned at the start ", "of the file, rewinding it"), immediate.=TRUE) seek(filexp, where=0) } } ## Check 'version'. version <- .normarg_version(version) ## Get pragmas lines. pragmas <- .Call(read_gff_pragmas, filexp) ## Rewind file. if (is(filexp, "connection")) { seek(filexp, where=0) } else { XVector:::rewind_filexp(filexp) } if (version == 0L) { attrcol_fmt <- .get_version_from_pragmas(pragmas) } else { attrcol_fmt <- version } ## Prepare 'colmap' and normalize 'tags'. colmap_and_tags <- .prepare_colmap_and_tags(columns, tags, attrcol_fmt) colmap <- colmap_and_tags$colmap tags <- colmap_and_tags$tags ## Normalize 'filter'. filter <- .normarg_filter(filter, attrcol_fmt) ## Normalize 'nrows'. if (!isSingleNumber(nrows)) stop(wmsg("'nrows' must be a single number")) if (!is.integer(nrows)) nrows <- as.integer(nrows) ## Check 'raw_data'. if (!isTRUEorFALSE(raw_data)) stop(wmsg("'raw_data' must be TRUE or FALSE")) ## 1st pass. scan_ans <- .Call(scan_gff, filexp, attrcol_fmt, tags, filter, nrows) if (is.null(tags)) tags <- scan_ans[[1L]] nrows <- scan_ans[[2L]] ## Rewind file. if (is(filexp, "connection")) { seek(filexp, where=0) } else { XVector:::rewind_filexp(filexp) } ## 2nd pass: return 'ans' as an ordinary data frame. ans <- .Call(load_gff, filexp, attrcol_fmt, tags, filter, nrows, pragmas, colmap, raw_data) ncol0 <- attr(ans, "ncol0") ntag <- attr(ans, "ntag") # should be the same as 'length(tags)' ## Post-process standard GFF cols. if (!raw_data) { if (attrcol_fmt == 1L) { #factor_colnames <- c("seqid", "source", "type", "strand", "group") factor_colnames <- c("seqid", "source", "type", "group") } else { #factor_colnames <- c("seqid", "source", "type", "strand") factor_colnames <- c("seqid", "source", "type") } m <- match(factor_colnames, head(colnames(ans), n=ncol0)) m <- m[!is.na(m)] factor_cols <- lapply(setNames(m, colnames(ans)[m]), function(j) factor(ans[[j]], levels=unique(ans[[j]]))) ans[m] <- factor_cols } ## Post-process tags. if (ntag != 0L) { is_multi_tag <- .is_multi_tag(ans, ntag, attrcol_fmt) if (!raw_data) { decode_idx <- which(!is_multi_tag) + ncol0 if (length(decode_idx) != 0L) ans <- .url_decode_cols(ans, decode_idx) } split_idx <- which(is_multi_tag) + ncol0 if (length(split_idx) != 0L) { ## Returns 'ans' as a DataFrame. ans <- .strsplit_cols(ans, split_idx, raw_data) } } ## 'ans' could have lost its readGFF-specific attributes (e.g. if it was ## turned into a DataFrame), so we restore them and cross our fingers that ## they won't clash with the DataFrame slots the day the internals of ## DataFrame objects happen to change (very unlikely though). if (is.null(attr(ans, "pragmas"))) attr(ans, "pragmas") <- pragmas if (is.null(attr(ans, "attrcol_fmt"))) attr(ans, "attrcol_fmt") <- attrcol_fmt if (is.null(attr(ans, "ncol0"))) attr(ans, "ncol0") <- ncol0 if (is.null(attr(ans, "ntag"))) attr(ans, "ntag") <- ntag if (is.null(attr(ans, "raw_data"))) attr(ans, "raw_data") <- raw_data ans } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### readGFFAsGRanges() ### ### Used in "import" method for GFFFile objects. ### Not exported (user should use import()). ### ### sequence-region => Seqinfo -- by Michael .parseSequenceRegionsAsSeqinfo <- function(lines) { sr <- grep("##sequence-region", lines, value=TRUE) srcon <- file() on.exit(close(srcon)) writeLines(sr, srcon) srt <- read.table(srcon, comment.char="", colClasses=list(NULL, "character", "integer", "integer")) if (any(srt[[2L]] != 1L)) { warning("One or more ##sequence-region directives do not start at 1. ", "The assumptions made by 'sequenceRegionsAsSeqinfo=TRUE' ", "have been violated.") } Seqinfo(srt[[1L]], srt[[3L]]) } ### -- by Michael .parseSpeciesAsMetadata <- function(lines) { species <- unique(grep("##species", lines, fixed=TRUE, value=TRUE)) if (length(species) > 1L) { stop("multiple species definitions found") } metadata <- list() if (length(species) == 1L) { species <- sub("##species ", "", species, fixed=TRUE) if (isNCBISpeciesURL(species)) { ncbiError <- function(e) { warning("failed to retrieve organism information from NCBI") } metadata <- tryCatch(metadataFromNCBI(species), error = ncbiError) } } metadata } readGFFAsGRanges <- function(filepath, version=0, colnames=NULL, filter=NULL, genome=NA, sequenceRegionsAsSeqinfo=FALSE, speciesAsMetadata=FALSE) { if (!(isSingleStringOrNA(genome) || is(genome, "Seqinfo"))) stop(wmsg("'genome' must be a single string or NA, ", "or a Seqinfo object")) if (!isTRUEorFALSE(sequenceRegionsAsSeqinfo)) stop(wmsg("'sequenceRegionsAsSeqinfo' must be TRUE or FALSE")) if (!isTRUEorFALSE(speciesAsMetadata)) stop(wmsg("'speciesAsMetadata' must be TRUE or FALSE")) ## Read as data frame. if (is.null(colnames)) { df <- readGFF(filepath, version=version, filter=filter) } else { if (!is.character(colnames)) stop(wmsg("'colnames' must be a character vector")) ## Split 'colnames' between 'columns' and 'tags'. GFF_colnames <- GFFcolnames() columns <- intersect(colnames, GFF_colnames) tags <- setdiff(colnames, GFF_colnames) core_columns <- c("seqid", "start", "end", "strand") columns <- union(columns, core_columns) df <- readGFF(filepath, version=version, columns=columns, tags=tags, filter=filter) } ## Turn data frame into GRanges. ## TODO: Maybe we should be able to pass the metadata to ## makeGRangesFromDataFrame()? if (is.null(colnames)) { ans <- makeGRangesFromDataFrame(df, keep.extra.columns=TRUE, seqnames.field="seqid") } else { ans <- makeGRangesFromDataFrame(df, seqnames.field="seqid") mcols(ans) <- df[ , colnames, drop=FALSE] } ## Set seqinfo. ans_seqinfo <- NULL pragmas <- attr(df, "pragmas") attrcol_fmt <- attr(df, "attrcol_fmt") if (sequenceRegionsAsSeqinfo && attrcol_fmt == 3L) { ## Get 'ans_seqinfo' from pragmas. ans_seqinfo <- .parseSequenceRegionsAsSeqinfo(pragmas) } else if (is(genome, "Seqinfo")) { ans_seqinfo <- genome if (!all(seqlevels(ans) %in% seqlevels(ans_seqinfo))) stop(wmsg("the sequence names in the GTF or GFF file are in ", "disagreement with the Seqinfo object specified via ", "the 'genome' argument")) } else if (isSingleString(genome)) { ans_seqinfo <- seqinfoForGenome(genome) # can return NULL if (!is.null(ans_seqinfo) && !all(seqlevels(ans) %in% seqlevels(ans_seqinfo))) { warning(wmsg("cannot set the seqlengths or circularity flags on ", "the GRanges object to return because the sequence ", "names in the GTF or GFF file are in disagreement ", "with the sequence names implied by the genome ", "assembly (", genome, ") specified via the 'genome' ", "argument")) ans_seqinfo <- NULL } } if (!is.null(ans_seqinfo)) { seqlevels(ans) <- seqlevels(ans_seqinfo) seqinfo(ans) <- ans_seqinfo } if (isSingleString(genome)) genome(ans) <- genome ## Get 'ans_metadata' from pragmas. if (speciesAsMetadata) { ans_metadata <- .parseSpeciesAsMetadata(pragmas) } else { ans_metadata <- list() } metadata(ans) <- ans_metadata ans } rtracklayer/R/tabix.R0000644000175400017540000000336713556116552015600 0ustar00biocbuildbiocbuild### ========================================================================= ### Tabix support ### ------------------------------------------------------------------------- ### setMethod("import", "TabixFile", function(con, format, text, which = if (is.na(genome)) NULL else as(seqinfoForGenome(genome), "GenomicRanges"), genome = NA, header = TRUE, ...) { if (missing(format)) { format <- file_ext(file_path_sans_ext(path(con))) } m <- manager() buffer <- queryForResource(m, con, which, header = header) on.exit(release(m, buffer)) file <- try(FileForFormat(buffer, format), silent = TRUE) if (is(file, "try-error")) { tabixHeader <- headerTabix(con) args <- list(...) if (is.null(args$comment.char)) args$comment.char <- tabixHeader$comment skip <- tabixHeader$skip if (header) { skip <- skip - 1L } do.call(import.tabSeparated, c(list(buffer), genome = genome, tabixHeader$indexColumns, skip = skip, header = header, args)) } else import(file, genome = genome, ...) }) setGeneric("exportToTabix", function(object, con, ...) standardGeneric("exportToTabix")) setMethod("exportToTabix", c("ANY", "character"), function(object, con, ...) { con <- TabSeparatedFile(con) export(sort(object, ignore.strand=TRUE), con, row.names=FALSE, col.names=TRUE, ...) indexTrack(con, seq=1L, start=2L, end=3L, skip=1L) }) rtracklayer/R/test_rtracklayer_package.R0000644000175400017540000000007613556116552021520 0ustar00biocbuildbiocbuild.test <- function() BiocGenerics:::testPackage("rtracklayer") rtracklayer/R/trackDb.R0000644000175400017540000000255313556116552016037 0ustar00biocbuildbiocbuild### ========================================================================= ### TrackDb class ### ------------------------------------------------------------------------- ### ### Represents a database or source of tracks, i.e, interval datasets ### setClass("TrackDb") setGeneric("track<-", function(object, ..., value) standardGeneric("track<-")) ## load a track into a database setReplaceMethod("track", c("TrackDb", "ANY"), function(object, name = deparse(substitute(value)), ..., value) { track(object, name, ...) <- GRangesList(as(value, "GRanges", strict = FALSE), compress=FALSE) object }) setMethod("[[<-", c("TrackDb", value="ANY"), function(x, i, j, ..., value) { if (!missing(j)) warning("argument 'j' ignored") track(x, i, ...) <- value x }) setMethod("$<-", c("TrackDb", value="ANY"), function(x, name, value) { x[[name]] <- value x }) setGeneric("track", function(object, ...) standardGeneric("track")) setMethod("[[", "TrackDb", function (x, i, j, ...) { if (!missing(j)) warning("argument 'j' ignored") track(x, i, ...) }) setMethod("$", "TrackDb", function (x, name) { x[[name]] }) rtracklayer/R/trackTable.R0000644000175400017540000000337013556116552016537 0ustar00biocbuildbiocbuild### ========================================================================= ### Arbitrary track table support ### ------------------------------------------------------------------------- ### ### At this point, this is internal, in support of the tabix stuff ### setClass("TabSeparatedFile", contains = "RTLFile") TabSeparatedFile <- function(resource) { new("TabSeparatedFile", resource = resource) } setGeneric("import.tabSeparated", function(con, genome = NA, seqnames = 1L, start = 2L, end = 3L, ...) standardGeneric("import.tabSeparated"), signature = "con") setMethod("import.tabSeparated", "characterORconnection", function(con, genome = NA, seqnames = 1L, start = 2L, end = 3L, ...) { tab <- read.table(con, sep = "\t", ...) ans <- GRanges(tab[[seqnames]], IRanges(tab[[start]], tab[[end]]), strand=Rle(strand("*"), nrow(tab)), tab[-c(seqnames, start, end)]) metadata(ans) <- list(genome = genome) ans }) setGeneric("export.tabSeparated", function(object, con, ...) standardGeneric("export.tabSeparated")) setMethod("export.tabSeparated", "ANY", function(object, con, ...) { export(object, con, "tabSeparated", ...) }) setMethod("export", c("ANY", "TabSeparatedFile"), function(object, con, ...) { df <- as.data.frame(object) write.table(df, path(con), sep="\t", ...) }) setMethod("export", c("GenomicRanges", "TabSeparatedFile"), function(object, con, ...) { object <- as.data.frame(object, row.names=NULL) object$width <- NULL export(object, con, ...) }) rtracklayer/R/twobit.R0000644000175400017540000001147713556116552016002 0ustar00biocbuildbiocbuild### ========================================================================= ### UCSC 2bit support ### ------------------------------------------------------------------------- ### ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### TwoBitFile class ### setClass("TwoBitFile", contains = "RTLFile") setClass("2BitFile", contains = "TwoBitFile") twoBitPath <- function(path) { uri <- .parseURI(path) if (!uriIsLocal(uri)) stop("TwoBit driver handles only local file paths") path.expand(uri$path) } TwoBitFile <- function(path) { if (!isSingleString(path)) stop("'filename' must be a single string, specifying a path") new("TwoBitFile", resource = twoBitPath(path)) } `2BitFile` <- TwoBitFile .seqlengths_TwoBitFile <- function(x) { .Call(TwoBitFile_seqlengths, path(x)) } fastaSeqnames <- function(x) { sub(" .*", "", x) } setMethod("seqinfo", "TwoBitFile", function(x) { seqlengths <- .seqlengths_TwoBitFile(x) names(seqlengths) <- fastaSeqnames(names(seqlengths)) Seqinfo(names(seqlengths), seqlengths) }) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Export ### setGeneric("export.2bit", function(object, con, ...) standardGeneric("export.2bit")) setMethod("export.2bit", "ANY", function(object, con, ...) { export(object, con, "2bit", ...) }) setMethod("export", c("ANY", "TwoBitFile"), function(object, con, format, ...) { object <- as(object, "DNAStringSet") callGeneric() }) setMethod("export", c("DNAStringSet", "TwoBitFile"), function(object, con, format) { if (!missing(format)) checkArgFormat(con, format) seqnames <- names(object) if (is.null(seqnames)) seqnames <- as.character(seq(length(object))) freq <- alphabetFrequency(object) unsupported.chars <- setdiff(DNA_ALPHABET, c(DNA_BASES, "N")) if (any(uniqueLetters(object) %in% unsupported.chars)) { stop("One or more strings contain unsupported ambiguity ", "characters.\nStrings can contain only A, C, G, T or N.", "\nSee Biostrings::replaceAmbiguities().") } if (any(width(object) == 0L)) { stop("Empty strings are not yet supported") } invisible(.TwoBits_export(mapply(.DNAString_to_twoBit, object, seqnames), twoBitPath(path(con)))) }) ## Hidden export of a list of twoBit pointers. ## NOT exported (but used in the BSgenome package). .TwoBits_export <- function(object, con) { if (!isSingleString(con)) stop("'con' must be a single, non-NA string") if (!all(sapply(object, function(x) typeof(x) == "externalptr" && is(x, "twoBit")))) stop("'object' must be a list of 'twoBit' pointers") .Call(TwoBits_write, object, con) } ## NOT exported (but used in the BSgenome package). .DNAString_to_twoBit <- function(object, seqname) { if (!isSingleString(seqname)) stop("'seqname' must be a single, non-NA string") if (!is(object, "DNAString") && !is(object, "MaskedDNAString")) stop("'object' must be a DNAString") object_masks <- masks(object) if (!is.null(object_masks)) { object_mask <- collapse(object_masks)[[1]] active(masks(object)) <- FALSE # so we get the real sequence } else object_mask <- IRanges() .Call(DNAString_to_twoBit, as.character(object), object_mask, seqname) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Import ### setGeneric("import.2bit", function(con, ...) standardGeneric("import.2bit")) setMethod("import.2bit", "ANY", function(con, ...) { import(con, "2bit", ...) }) setMethod("import", "TwoBitFile", function(con, format, text, which = as(seqinfo(con), "GenomicRanges"), ...) { lkup <- get_seqtype_conversion_lookup("B", "DNA") sl <- .seqlengths_TwoBitFile(con) sn <- extractROWS(names(sl), match(seqnames(which), seqlevels(con))) if (any(is.na(sn))) { stop("'seqnames' not in 2bit file: ", paste0("'", unique(seqnames(which)[is.na(sn)]), "'", collapse=", ")) } ans <- .Call(TwoBitFile_read, twoBitPath(path(con)), sn, as(ranges(which), "IRanges"), lkup) names(ans) <- names(which) ans }) setMethod("getSeq", "TwoBitFile", function(x, which = as(seqinfo(x), "GenomicRanges")) { ans <- import(x, which = which) rc <- strand(which) == "-" ans[rc] <- reverseComplement(ans[rc]) ans }) rtracklayer/R/ucsc.R0000644000175400017540000017777113556116552015441 0ustar00biocbuildbiocbuild# UCSC genome browser interface # every UCSC session is identified by a 'hguid' setClass("UCSCSession", representation(url = "character", hguid = "character", views = "environment"), contains = "BrowserSession") # gets an 'hgsid' to initialize the session setMethod("initialize", "UCSCSession", function(.Object, url = "http://genome.ucsc.edu/cgi-bin/", user = NULL, session = NULL, force = FALSE, ...) { .Object@url <- url .Object@views <- new.env() gwURL <- ucscURL(.Object, "gateway", force=force) gw <- httpGet(gwURL, cookiefile = tempfile(), header = TRUE, .parse=FALSE, ...) if (grepl("redirectTd", gw)) { url <- sub(".*?a href=\"h([^[:space:]]+cgi-bin/).*", "h\\1", gw) return(initialize(.Object, url, user=user, session=session, force=TRUE, ...)) } cookie <- grep("Set-[Cc]ookie: hguid[^=]*=", gw) if (!length(cookie)) stop("Failed to obtain 'hguid' cookie") hguid <- sub(".*Set-Cookie: (hguid[^=]*=[^;]*);.*", "\\1", gw) .Object@hguid <- hguid if (!is.null(user) && !is.null(session)) { ## bring in other session ucscGet(.Object, "tracks", list(hgS_doOtherUser = "submit", hgS_otherUserName = user, hgS_otherUserSessionName = session)) } .Object }) setMethod("seqlengths", "UCSCSession", function(x) { query <- ucscTableQuery(x, range = GRanges(), table = "chromInfo", check=FALSE) chromInfo <- getTable(query, check=FALSE) ans <- setNames(chromInfo$size, chromInfo$chrom) ans[sortSeqlevels(names(ans))] }) setMethod("seqnames", "UCSCSession", function(x) names(seqlengths(x))) setMethod("seqinfo", "UCSCSession", function(x) { sl <- seqlengths(x) Seqinfo(names(sl), sl, genome = genome(x)) # no circularity information }) normArgTrackData <- function(value, session) { genomes <- vapply(value, function(x) singleGenome(genome(x)), character(1L)) genomes[is.na(genomes)] <- "" tapply(value, unlist(genomes), function(tracks) { genome <- singleGenome(genome(tracks[[1]])) if (!is.na(genome)) genome(session) <- genome spaces <- do.call(c, unname(lapply(tracks, seqnames))) badSpaces <- setdiff(spaces, seqnames(session)) if (length(badSpaces) > 0L) stop("Invalid chromosomes for ", genome(session), ": ", paste(badSpaces, collapse = ", ")) }) value } handleError <- function(response) { msg <- getNodeSet(response, "//span[text()='Error']/../text()") if (length(msg) == 2L) stop(sub(".*? - ", "", xmlValue(msg[[2L]]))) } setReplaceMethod("track", c("UCSCSession", "SimpleGRangesList"), function(object, name = names(value), format = c("auto", "bed", "wig", "gff1", "bed15", "bedGraph"), ..., value) { format <- match.arg(format) if (length(value)) { ## upload values in blocks, one for each genome value <- normArgTrackData(value, object) names(value) <- name genomes <- sapply(value, function(x) singleGenome(genome(x))) genomes[is.na(genomes)] <- "" tapply(value, unlist(genomes), function(tracks) { form <- ucscForm(tracks, format, ...) response <- ucscPost(object, "custom", form) handleError(response) }) } object }) setReplaceMethod("track", c("UCSCSession", "RTLFile"), function(object, name = names(value), ..., value) { form <- ucscForm(value, genome(object), ...) response <- ucscPost(object, "custom", form) object }) setMethod("browserViews", "UCSCSession", function(object) object@views$instances) ## get the list of track names setMethod("trackNames", "UCSCSession", function(object) ucscTracks(object)@ids) ## get the current range setMethod("range", "UCSCSession", function(x, ..., na.rm) range(ucscCart(x))) setReplaceMethod("range", "UCSCSession", function(x, value) { ucscGet(x, "cart", ucscForm(normGenomeRange(value, x))) x }) setMethod("genome", "UCSCSession", function(x) { genome(ucscCart(x)) }) setReplaceMethod("genome", "UCSCSession", function(x, value) { if (!isSingleString(value)) stop("'genome' must be a single non-NA string") ucscGet(x, "gateway", list(db = value)) if (genome(x) != value) stop("Failed to set session genome to '", value, "'") x }) SeqinfoForUCSCGenome <- function(genome) { tryCatch({ session <- browserSession("UCSC") genome(session) <- genome seqinfo(session) }, error = function(cond) NULL) } GRangesForUCSCGenome <- function(genome, chrom = NULL, ranges = NULL, ...) { GRangesForGenome(genome, chrom = chrom, ranges = ranges, method = "UCSC", seqinfo = NULL, ...) } ## context for querying UCSC tables setClass("UCSCTableQuery", representation(session = "UCSCSession", track = "character_OR_NULL", table = "character_OR_NULL", range = "GRanges", outputType = "character_OR_NULL", NAMES = "character_OR_NULL", intersectTrack = "character_OR_NULL")) setMethod("show", "UCSCTableQuery", function(object) { cat("Get ") if (!is.null(tableName(object))) cat("table '", tableName(object), "' from ", sep = "") cat("track '", names(trackName(object)), "' within ", sep = "") range <- range(object) if (length(range) > 1) start <- end <- chrom <- "*" else { chrom <- as.character(seqnames(range)) start <- start(range) end <- end(range) } cat(genome(range)[1], ":", chrom, ":", start, "-", end, sep="") for (itrack in names(intersectTrack(object))) cat(" &", itrack) cat("\n") }) setMethod("browserSession", "UCSCTableQuery", function(object) { object@session }) setGeneric("browserSession<-", function(object, ..., value) standardGeneric("browserSession<-")) setReplaceMethod("browserSession", c("UCSCTableQuery", "UCSCSession"), function(object, value) { object@session <- value object }) setMethod("range", "UCSCTableQuery", function(x, ..., na.rm) x@range) setReplaceMethod("range", "UCSCTableQuery", function(x, value) { x@range <- normTableQueryRange(value, browserSession(x)) x }) setGeneric("trackName", function(x, ...) standardGeneric("trackName")) setMethod("trackName", "UCSCTableQuery", function(x) x@track) setGeneric("trackName<-", function(x, ..., value) standardGeneric("trackName<-")) setReplaceMethod("trackName", "UCSCTableQuery", function(x, value) { x@track <- normArgTrack(value, x) x }) setGeneric("tableName", function(x, ...) standardGeneric("tableName")) setMethod("tableName", "UCSCTableQuery", function(x) x@table) normArgTable <- function(name, query) { if (!is.null(name)) { if (!isSingleString(name)) stop("table name must be a single string or NULL") if (!name %in% tableNames(query)) stop("Table '", name, "' is unavailable") } name } setGeneric("tableName<-", function(x, ..., value) standardGeneric("tableName<-")) ### FIXME: we need '...' in the formals due to a bug in R 3.5, remove for 3.6 setReplaceMethod("tableName", "UCSCTableQuery", function(x, check=TRUE, ..., value) { if (!missing(...)) warning("arguments in '...' ignored") if (check) value <- normArgTable(value, x) x@table <- value x }) setMethod("names", "UCSCTableQuery", function(x) x@NAMES) setReplaceMethod("names", "UCSCTableQuery", function(x, value) { x@NAMES <- value x }) setGeneric("intersectTrack", function(x, ...) standardGeneric("intersectTrack")) setMethod("intersectTrack", "UCSCTableQuery", function(x) x@intersectTrack) setGeneric("intersectTrack<-", function(x, ..., value) standardGeneric("intersectTrack<-")) setReplaceMethod("intersectTrack", "UCSCTableQuery", function(x, value) { x@intersectTrack <- normArgTrack(value, x) x }) ## not exported setGeneric("outputType", function(x, ...) standardGeneric("outputType")) setMethod("outputType", "UCSCTableQuery", function(x) x@outputType) setGeneric("outputType<-", function(x, ..., value) standardGeneric("outputType<-")) setReplaceMethod("outputType", "UCSCTableQuery", function(x, value) { x@outputType <- value x }) normArgTrack <- function(name, trackids) { if (is.null(name)) return(name) if (!isSingleString(name)) stop("'track' must be a single string") if (is(trackids, "UCSCTableQuery")) trackids <- trackNames(trackids) if (!(name %in% trackids)) { mapped_name <- trackids[name] if (is.na(mapped_name)) stop("Unknown track: ", name) name <- mapped_name } else names(name) <- name name } normTableQueryRange <- function(range, x) { normGenomeRange(range, x, max.length = 1000L) } setGeneric("ucscTableQuery", function(x, ...) standardGeneric("ucscTableQuery")) setMethod("ucscTableQuery", "UCSCSession", function(x, track = NULL, range = seqinfo(x), table = NULL, names = NULL, intersectTrack = NULL, check = TRUE) { if (!is(names, "character_OR_NULL")) stop("'names' must be 'NULL' or a character vector") ## only inherit the genome from the session if (missing(range) || !check) range <- as(range, "GRanges") else range <- normTableQueryRange(range, x) query <- new("UCSCTableQuery", session = x, range = range, NAMES = names) ## the following line must always happen to initialize the session ## otherwise stuff can go haywire trackids <- trackNames(query) if (!is.null(track) || !is.null(intersectTrack)) { query@track <- normArgTrack(track, trackids) query@intersectTrack <- normArgTrack(intersectTrack, trackids) } tableName(query, check=check) <- table query }) setMethod("ucscTableQuery", "character", function(x, ...) { stopifnot(isSingleString(x)) session <- browserSession() genome(session) <- x ucscTableQuery(session, ...) }) ucscTableGet <- function(query, .parse = TRUE, tracks = FALSE, ...) ucscGet(browserSession(query), "tables", c(ucscForm(query, tracks = tracks), ...), .parse = .parse) dropCookie <- function(object) { object@hguid <- character() object } ucscTablePost <- function(query, .parse = TRUE, tracks = FALSE, ...) ucscPost(dropCookie(browserSession(query)), "tables", c(ucscForm(query, tracks = tracks), list(...)), .parse = .parse) ## gets the track names available from the table browser setMethod("trackNames", "UCSCTableQuery", function(object) { doc <- ucscTableGet(object, tracks = TRUE) track_path <- "//select[@name = 'hgta_track']/option/@value" tracks <- unlist(getNodeSet(doc, track_path)) label_path <- "//select[@name = 'hgta_track']/option/text()" labels <- sub("\n.*$", "", sapply(getNodeSet(doc, label_path), xmlValue)) names(tracks) <- labels tracks }) ## returns a character vector of table names for a given track name + range setGeneric("tableNames", function(object, ...) standardGeneric("tableNames")) getTableNames <- function(object) { doc <- ucscTableGet(object) table_path <- "//select[@name = 'hgta_table']/option/@value" unlist(getNodeSet(doc, table_path)) } setMethod("tableNames", "UCSCTableQuery", function(object, trackOnly = FALSE) { tables <- getTableNames(object) outputType <- outputType(object) if (trackOnly) { trackOutputs <- c("wigData", "wigBed", "bed") if (!is.null(outputType)) outputType <- intersect(trackOutputs, outputType) else outputType <- trackOutputs } if (!is.null(outputType)) { tables <- tables[sapply(tables, tableHasOutput, object=object)] } unname(tables) }) tableHasOutput <- function(object, table) { tableName(object, check=FALSE) <- table any(outputType(object) %in% ucscTableOutputs(object)) } firstTableName <- function(object) { tables <- getTableNames(object) for (table in tables) if (tableHasOutput(object, table)) return(table) } setGeneric("ucscTableOutputs", function(object, ...) standardGeneric("ucscTableOutputs")) ## returns a character vector of available output types for the table ## not exported setMethod("ucscTableOutputs", "UCSCTableQuery", function(object) { doc <- ucscTableGet(object) output_path <- "//select[@name = 'hgta_outputType']/option/@value" unlist(getNodeSet(doc, output_path)) }) setClass("UCSCSchema", representation(genome = "character", tableName = "character", rowCount = "integer", formatDescription = "character"), contains = "DFrame") setMethod("genome", "UCSCSchema", function(x) { x@genome }) setMethod("tableName", "UCSCSchema", function(x) { x@tableName }) setMethod("nrow", "UCSCSchema", function(x) { x@rowCount }) setGeneric("formatDescription", function(x, ...) standardGeneric("formatDescription")) setMethod("formatDescription", "UCSCSchema", function(x) { x@formatDescription }) setClass("UCSCLinks", representation(genome = "character", tableName = "character", fieldName = "character", viaName = "character")) setClass("UCSCSchemaDescription", representation(schema = "UCSCSchema", links = "UCSCLinks", sample = "DataFrame")) setGeneric("ucscSchemaDescription", function(object, ...) standardGeneric("ucscSchemaDescription")) ## not currently exported, just ucscSchema() is public setMethod("ucscSchemaDescription", "UCSCTableQuery", function(object) { alphaNum <- function(x) gsub("^ *", "", gsub("[^a-zA-Z0-9()+,. _'-]", "", x)) getBoldLabeledField <- function(name) { expr <- sprintf("//b[text() = '%s:']/following::text()[1]", name) alphaNum(xmlValue(getNodeSet(doc, expr)[[1]])) } getDataFrame <- function(tableNode) { getColumn <- function(ind) { ## FIXME: special treatment required for missing cells ## Is there a way to get child counts for every node in XPath? expr <- sprintf("tr/td[%d]", ind) children <- sapply(getNodeSet(tableNode, expr), xmlChildren) col <- rep(NA, length(children)) col[elementNROWS(children) > 0] <- alphaNum(sapply(unlist(children), xmlValue)) col } columnNames <- sapply(getNodeSet(tableNode, "tr[1]/th//text()"), xmlValue) columns <- lapply(seq_along(columnNames), getColumn) names(columns) <- columnNames columns <- columns[elementNROWS(columns) > 0] DataFrame(columns) } doc <- ucscTableGet(object, hgta_doSchema = "describe table schema") genome <- getBoldLabeledField("Database") tableName <- getBoldLabeledField("Primary Table") rowCount <- as.integer(gsub(",", "", getBoldLabeledField("Row Count"))) format <- getBoldLabeledField("Format description") schemaNode <- getNodeSet(doc, "//table[tr[1]/th[3]/text() = 'SQL type']")[[1]] schema <- getDataFrame(schemaNode) schema$RType <- sapply(schema$example, function(x) class(type.convert(x))) schema$RType[!nzchar(schema$example)] <- "factor" linkNode <- getNodeSet(doc, "//div[@class = 'subheadingBar' and contains(text(), 'Connected Tables and Joining Fields')]/following::table[1]/tr[2]/td[2]") if (length(linkNode)) { ## this is apparently optional linkNode <- linkNode[[1]] linkTable <- sapply(getNodeSet(linkNode, "a/text()"), xmlValue) linkText <- sapply(getNodeSet(linkNode, "text()"), xmlValue) linkMat <- matrix(linkText, nrow=2) linkGenome <- alphaNum(linkMat[1,]) linkGenome <- substring(linkGenome, 1, nchar(linkGenome)-1L) linkSplit <- matrix(unlist(strsplit(linkMat[2,], " ", fixed=TRUE)), 3) linkField <- substring(linkSplit[1,], 2) linkVia <- sub(".*?\\.(.*?)\\)", "\\1", linkSplit[3,]) links <- new("UCSCLinks", genome = linkGenome, tableName = linkTable, fieldName = linkField, viaName = linkVia) } else links <- new("UCSCLinks") sampNode <- getNodeSet(doc, "//div[contains(@class, 'subheadingBar') and contains(text(), 'Sample')]/following::table[1]//table//table")[[1]] sample <- getDataFrame(sampNode) schema <- new("UCSCSchema", schema, genome = genome, tableName = tableName, rowCount = rowCount, formatDescription = format) new("UCSCSchemaDescription", schema = schema, links = links, sample = sample) }) setGeneric("ucscSchema", function(object, ...) standardGeneric("ucscSchema")) setMethod("ucscSchema", "UCSCSchemaDescription", function(object) { object@schema }) setMethod("ucscSchema", "UCSCTableQuery", function(object) { ucscSchema(ucscSchemaDescription(object)) }) .uploadTableBrowserRanges <- function(query, hgsid) { lines <- export(query@range, format = "bed", ignore.strand = TRUE) text <- paste(paste(lines, collapse = "\n"), "\n", sep = "") upload <- fileUpload("ranges.bed", text, "text/plain") ucscTablePost(query, hgta_enteredUserRegionFile = upload, hgta_enteredUserRegions = "", hgta_doSubmitUserRegions = "submit", hgsid = hgsid) } ## export data from UCSC (internal utility) ucscExport <- function(object) { get_hgsid <- function(node) getNodeSet(node, "//input[@name = 'hgsid']/@value")[[1]] hgsid <- NULL if (!is.null(names(object))) { # filter by names text <- paste(names(object), collapse = "\n") output <- ucscTablePost(object, hgta_doPastedIdentiers = "submit", hgta_pastedIdentifiers = text) error <- getNodeSet(output, "//script[contains(text(), '{showWarnBox')]/text()") if (length(error)) warning(sub(".*'
  • (.*?)'.*", "\\1", xmlValue(error[[1]]))) hgsid <- get_hgsid(output) } if (!is.null(intersectTrack(object))) { itrack <- intersectTrack(object) iquery <- object iquery@track <- itrack itable <- tableNames(iquery, TRUE) if (!length(itable)) stop("No table for intersection track: ", itrack) if (length(itable) > 1) # for now anyway itable <- itable[1] output <- ucscTableGet(object, hgta_nextIntersectGroup = "allTracks", hgta_nextIntersectTrack = itrack, hgta_nextIntersectTable = itable, hgta_nextIntersectOp = "any", hgta_doIntersectSubmit = "submit", boolshad.hgta_nextInvertTable = "0", boolshad.hgta_nextInvertTable2 = "0", hgsid = hgsid) hgsid <- get_hgsid(output) } if (!spansGenome(object@range) && length(object@range) > 1L) { output <- .uploadTableBrowserRanges(object, hgsid) hgsid <- get_hgsid(output) } followup <- NULL if (outputType(object) == "bed") { ## some formats have extra pages followup <- list(hgta_doGetBed = "get BED", hgta_printCustomTrackHeaders = "on", boolshad.hgta_printCustomTrackHeaders = "1") } output <- ucscTableGet(object, !is.null(followup), hgta_doTopSubmit = "get output", hgsid = hgsid) if (!is.null(followup)) { hgsid <- get_hgsid(output) form <- c(followup, list(hgsid = hgsid)) output <- ucscGet(browserSession(object), "tables", form, .parse = FALSE) } output } setMethod("track", "UCSCSession", function(object, name, ...) { track(ucscTableQuery(object, track=name, ...)) }) inconsistentFieldCounts <- function(x) { con <- file() on.exit(close(con)) writeLines(x, con) length(unique(count.fields(con, skip=2L, sep="\t")) > 1L) } outputTruncated <- function(x) { has.msg <- grepl("^-", tail(x, 1)) has.msg #|| inconsistentFieldCounts(x) } ## download a trackSet by name setMethod("track", "UCSCTableQuery", function(object) { tables <- tableNames(object) table <- tableName(object) if (!is.null(table) && !(table %in% tables)) stop("Unknown table: '", table, "'. Valid table names: ", tables) formats <- c("wigData", "wigBed", "bed") ## attempt to automatically determine the table if (!is.null(table)) tables <- table for (table in tables) { object@table <- table outputs <- ucscTableOutputs(object) if (any(formats %in% outputs)) break } if (!any(formats %in% outputs)) stop("No supported output types") if ("wigData" %in% outputs) { # track stored as wig format <- "wig" output <- "wigData" } else { format <- output <- "bed" if ("wigBed" %in% outputs) output <- "wigBed" } outputType(object) <- output output <- ucscExport(object) if (outputTruncated(output)) stop("Output is incomplete: ", "track may have more than 100,000 elements. ", "Try downloading the data via the UCSC FTP site.") import(text = output, format = format, seqinfo = seqinfo(range(object))) }) ## grab sequences for features in 'track' at 'range' ## setMethod("getSeq", "UCSCSession", ## function(object, range, table = "gold") ## { ## followup <- list(hgta_doGenomicDna = "get sequence", ## hgSeq.casing = "upper", ## hgSeq.repMasking = "lower") ## output <- ucscExport(object, range, "gold", table, "sequence", ## followup) ## con <- file() ## writeLines(output, con) ## set <- read.DNAStringSet(con, "fasta") ## close(con) ## set ## }) ## get a data.frame from a UCSC table ## think about taking specific columns setGeneric("getTable", function(object, ...) standardGeneric("getTable")) setMethod("getTable", "UCSCTableQuery", function(object, check = TRUE) { outputType(object) <- "primaryTable" if (is.null(tableName(object))) { # must specify a table name tableName(object, check=FALSE) <- firstTableName(object) if (is.null(tableName(object))) stop("No valid table found") } else if (check && !outputType(object) %in% ucscTableOutputs(object)) stop("tabular output format not available") output <- ucscExport(object) ## since '#' is not treated as a comment, we discard the ## error message, leaving only the header if (grepl("\\n# No results", output)) output <- gsub("\\n.*", "", output) f <- file() writeLines(output, f) tab <- read.table(f, sep = "\t", header=TRUE, comment.char = "", quote = "") ## strip off the '#' => 'X.' header prefix colnames(tab)[1L] <- substring(colnames(tab)[1L], 3L) close(f) tab }) setMethod("getTable", "UCSCSession", function(object, name, range = base::range(object), table = NULL) { getTable(ucscTableQuery(object, name, range, table)) }) ## UCSC genome view setClass("UCSCView", representation(hgsid = "character", form = "list"), contains = "BrowserView") ## create a view for the given session, position and track visibility settings ## if 'tracks' is a character vector (but not a UCSCTrackModes instance) it is ## assumed to name the tracks that should be in the view. otherwise, an ## attempt is made to coerce it to a UCSCTrackModes instance. setMethod("browserView", "UCSCSession", function(object, range, track, imagewidth = 800, browse = TRUE, ...) { stopifnot(isTRUEorFALSE(browse)) form <- list() if (!missing(range)) { if (is(range, "IntegerRangesList")) range <- range[elementNROWS(range) > 0L] if (length(range) > 1) { ranges <- range views <- vector("list", length(ranges)) for (i in seq(length(ranges))) { range <- ranges[i] views[[i]] <- callGeneric() } return(BrowserViewList(views)) } range <- normGenomeRange(range, object) form <- c(form, ucscForm(range)) } view <- new("UCSCView", session = object) ## new hgsid for each browser launch doc <- ucscGet(object, "gateway") hgsid <- sub(".*=", "", grep("hgsid=", getNodeSet(doc, "//a/@href"), value=TRUE)[1L]) view@hgsid <- as.character(hgsid) ## figure out track modes origModes <- modes <- ucscTrackModes(view) if (!missing(track)) { if (class(track) == "character") trackNames(modes) <- track else { userModes <- as(track, "UCSCTrackModes") modes[names(userModes)] <- userModes } } argModes <- ucscTrackModes(...) modes[names(argModes)] <- argModes modes <- modes[modes != origModes] form <- c(form, ucscForm(modes), ucscForm(view)) if (!missing(imagewidth)) form <- c(form, pix = imagewidth) if (browse) { ## launch a web browser ucscShow(object, "tracks", form) } view@form <- form ## save this view object@views$instances <- c(object@views$instances, view) view }) viewURL <- function(x) { urlForm(ucscURL(browserSession(x), "tracks"), x@form) } # every view has a "mode" (hide, dense, pack, squish, full) for each track ### FIXME: probably should be merged with ucscTracks ### Or just leave it; ucscTracks might become more complex, while we ### need a simple way to manipulate track modes. setClass("UCSCTrackModes", representation(labels = "character"), contains = "character") # get/set track modes to/from e.g. a view setGeneric("ucscTrackModes", function(object, ...) standardGeneric("ucscTrackModes")) # convenience constructor for track mode object setMethod("ucscTrackModes", "character", function(object, labels, hide = character(), dense = character(), pack = character(), squish = character(), full = character()) { object[hide] <- "hide" object[dense] <- "dense" object[pack] <- "pack" object[squish] <- "squish" object[full] <- "full" if (missing(labels)) labels <- names(object) new("UCSCTrackModes", object, labels = as.character(labels)) }) setMethod("ucscTrackModes", "missing", function(object, ...) ucscTrackModes(character(), ...)) setMethod("ucscTrackModes", "UCSCView", function(object) { ucscTrackModes(ucscTracks(object)) }) setMethod("ucscTrackModes", "UCSCSession", function(object) { ucscTrackModes(ucscTracks(object)) }) setGeneric("ucscTrackModes<-", function(object, value) standardGeneric("ucscTrackModes<-")) setReplaceMethod("ucscTrackModes", c("UCSCView", "UCSCTrackModes"), function(object, value) { # FIXME: needs to be more extensible browserView(object@session, range(object), value) }) setReplaceMethod("ucscTrackModes", c("UCSCView", "character"), function(object, value) { ucscTrackModes(object) <- ucscTrackModes(value) object }) ## subsetting UCSCTrackModes ## if not in ids, try labels resolveTrackIndex <- function(object, i) { if (is.character(i)) { missing <- !(i %in% names(object)) matching <- match(i[missing], object@labels) if (any(is.na(matching))) { unmatched <- i[missing][is.na(matching)] stop("Unknown track(s): ", paste(unmatched, collapse = ", ")) } i[missing] <- names(object)[matching] } i } setMethod("[", "UCSCTrackModes", function(x, i, j, ..., drop=FALSE) { vec <- x@.Data names(vec) <- names(x) names(x@labels) <- names(x) ind <- resolveTrackIndex(x, i) initialize(x, vec[ind], labels = x@labels[ind]) }) setReplaceMethod("[", "UCSCTrackModes", function(x, i, j, ..., value) { vec <- x@.Data names(vec) <- names(x) vec[resolveTrackIndex(x, i)] <- value x@.Data <- as.vector(vec) x }) # handle simple track show/hide setMethod("trackNames", "UCSCTrackModes", function(object) { visible <- object != "hide" tracks <- names(object)[visible] names(tracks) <- object@labels[visible] tracks }) setReplaceMethod("trackNames", "UCSCTrackModes", function(object, value) { value <- resolveTrackIndex(object, value) spec <- names(object) %in% value object[!spec] <- "hide" object[spec & object == "hide"] <- "full" object }) setMethod("trackNames", "UCSCView", function(object) { tracks <- ucscTracks(object) modes <- ucscTrackModes(tracks) tracks@ids[tracks@ids %in% trackNames(modes)] }) setReplaceMethod("trackNames", "UCSCView", function(object, value) { trackNames(ucscTrackModes(object)) <- value object }) setMethod("visible", "UCSCView", function(object) { modes <- ucscTrackModes(object) vis <- modes != "hide" names(vis) <- modes@labels vis }) setReplaceMethod("visible", "UCSCView", function(object, value) { modes <- ucscTrackModes(object) modes[value & modes == "hide"] <- "full" modes[!value] <- "hide" ucscTrackModes(object) <- modes object }) setMethod("range", "UCSCView", function(x, ..., na.rm) range(ucscCart(x))) setReplaceMethod("range", "UCSCView", function(x, value) { browserView(x@session, value, ucscTrackModes(x)) }) # only one view per session; a view is always active setMethod("activeView", "UCSCView", function(object) TRUE) # ucscTrackSet # visual properties are specified by a "track line" for UCSC setClass("TrackLine", representation(name = "character", description = "character", visibility = "character", color = "integer", priority = "numeric"), prototype(name = "R Track")) setMethod("show", "TrackLine", function(object) { cat(as(object, "character"), "\n") }) setClass("BasicTrackLine", representation(itemRgb = "logical", useScore = "logical", group = "character", db = "character", offset = "numeric", url = "character", htmlUrl = "character", colorByStrand = "matrix"), contains = "TrackLine") ucscPair <- function(key, value) paste(key, value, sep = "=") # to a text line setAs("TrackLine", "character", function(from) { checkString <- function(str, len) { ## These are more annoying than useful ## if (nchar(gsub("[a-zA-Z0-9_ ]", "", str))) ## warning("The string '", str, ## "' contains non-standard characters.") ## if (nchar(str) > len) { ## str <- substring(str, 1, len) ## warning("The string '", str, "' must be less than ", len, ## " characters; it has been truncated.") ## } if (regexpr(" ", str)[1] != -1) str <- paste("\"", str, "\"", sep="") str } str <- "track" name <- from@name if (length(name)) str <- paste(str, " name=", checkString(name, 15), sep="") desc <- from@description if (length(desc)) str <- paste(str, " description=", checkString(desc, 60), sep="") vis <- from@visibility if (length(vis)) str <- paste(str, " visibility=", vis, sep="") color <- from@color if (length(color)) str <- paste0(str, " color=\"", paste0(color, collapse=","), "\"") priority <- from@priority if (length(priority)) str <- paste(str, " priority=", priority, sep="") str }) setAs("BasicTrackLine", "character", function(from) { str <- as(as(from, "TrackLine"), "character") itemRgb <- from@itemRgb if (length(itemRgb)) str <- paste(str, " itemRgb=", if (itemRgb) "on" else "off", sep = "") useScore <- from@useScore if (length(useScore)) str <- paste(str, " useScore=", if (useScore) "1" else "0", sep = "") group <- from@group if (length(group)) str <- paste(str, " group=", group, sep="") db <- from@db if (length(db)) str <- paste(str, " db=", db, sep="") offset <- from@offset if (length(offset)) str <- paste(str, " offset=", offset, sep="") url <- from@url if (length(url)) str <- paste(str, " url=", "\"", url, "\"", sep="") htmlUrl <- from@htmlUrl if (length(htmlUrl)) str <- paste(str, " htmlUrl=", "\"", htmlUrl, "\"", sep="") colorByStrand <- from@colorByStrand if (length(colorByStrand)) { colors <- paste(colorByStrand[1,], colorByStrand[2,], colorByStrand[3,], sep = ",", collapse = " ") str <- paste(str, " colorByStrand=\"", colors, "\"", sep = "") } str }) ucscParsePairs <- function(str) { str <- sub("^[[:alpha:]]*[[:blank:]]", "", str) split <- as.character(read.table(sep = "=", comment.char = "", as.is = TRUE, strip.white = TRUE, text = str)) vals <- character(0) if (length(split)) { mixed <- tail(head(split, -1), -1) tags <- head(split, 1) vals <- tail(split, 1) if (length(mixed)) { tags <- c(tags, sub(".*[[:space:]]([[:alnum:]]*)$", "\\1", mixed)) vals <- c(sub("(.*)[[:space:]][[:alnum:]]*$", "\\1", mixed), vals) } names(vals) <- tags } vals } # from a text line setAs("character", "TrackLine", function(from) { line <- new("TrackLine") vals <- ucscParsePairs(from) if (!is.na(vals["name"])) line@name <- vals[["name"]] if (!is.na(vals["description"])) line@description <- vals[["description"]] if (!is.na(vals["visibility"])) line@visibility <- vals[["visibility"]] if (!is.na(vals["color"])) line@color <- as.integer(strsplit(vals[["color"]], ",")[[1]]) if (!is.na(vals["priority"])) line@priority <- as.numeric(vals[["priority"]]) line }) setAs("character", "BasicTrackLine", function(from) { line <- new("BasicTrackLine", as(from, "TrackLine")) vals <- ucscParsePairs(from) if (!is.na(vals["itemRgb"])) line@itemRgb <- tolower(vals[["itemRgb"]]) == "on" if (!is.na(vals["useScore"])) line@useScore <- vals[["useScore"]] == "1" if (!is.na(vals["group"])) line@group <- vals[["group"]] if (!is.na(vals["db"])) line@db <- vals[["db"]] if (!is.na(vals["offset"])) line@offset <- as.integer(vals[["offset"]]) if (!is.na(vals["url"])) line@url <- vals[["url"]] if (!is.na(vals["htmlUrl"])) line@htmlUrl <- vals[["htmlUrl"]] if (!is.na(vals["colorByStrand"])) { colorToken <- strsplit(strsplit(vals[["colorByStrand"]], " ")[[1]], ",") line@colorByStrand <- matrix(as.integer(unlist(colorToken)), nrow = 3) } line }) setClass("GraphTrackLine", representation(altColor = "integer", autoScale = "logical", alwaysZero = "logical", gridDefault = "logical", maxHeightPixels = "integer", graphType = "character", viewLimits = "numeric", yLineMark = "numeric", yLineOnOff = "logical", windowingFunction = "character", smoothingWindow = "numeric", type = "character"), contains = "TrackLine") setAs("GraphTrackLine", "character", function(from) { str <- as(as(from, "TrackLine"), "character") type <- if (from@type == "wig") "wiggle_0" else "bedGraph" str <- paste(str, " type=", type, sep = "") color <- from@altColor if (length(color)) str <- paste(str, " altColor=", paste(color, collapse=","), sep="") autoScale <- from@autoScale onoff <- function(x) if (x) "on" else "off" if (length(autoScale)) str <- paste(str, " autoScale=", onoff(autoScale), sep = "") alwaysZero <- from@alwaysZero if (length(alwaysZero)) str <- paste(str, " alwaysZero=", onoff(alwaysZero), sep = "") gridDefault <- from@gridDefault if (length(gridDefault)) str <- paste(str, " gridDefault=", onoff(gridDefault), sep = "") maxHeightPixels <- from@maxHeightPixels if (length(maxHeightPixels)) str <- paste(str, " maxHeightPixels=", paste(maxHeightPixels, collapse=":"), sep = "") graphType <- from@graphType if (length(graphType)) str <- paste(str, " graphType=", graphType, sep = "") viewLimits <- from@viewLimits if (length(viewLimits)) str <- paste(str, " viewLimits=", paste(viewLimits, collapse = ":"), sep = "") yLineMark <- from@yLineMark if (length(yLineMark)) str <- paste(str, " yLineMark=", yLineMark, sep = "") yLineOnOff <- from@yLineOnOff if (length(yLineOnOff)) str <- paste(str, " yLineOnOff=", onoff(yLineOnOff), sep = "") windowingFunction <- from@windowingFunction if (length(windowingFunction)) str <- paste(str, " windowingFunction=", windowingFunction, sep = "") smoothingWindow <- from@smoothingWindow if (length(smoothingWindow)) str <- paste(str, " smoothingWindow=", smoothingWindow, sep = "") str }) setAs("character", "GraphTrackLine", function(from) { line <- new("GraphTrackLine", as(from, "TrackLine")) vals <- ucscParsePairs(from) type <- vals[["type"]] if (!(type %in% c("wiggle_0", "bedGraph"))) stop("Unknown graph track type: ", type) line@type <- if (type == "wiggle_0") "wig" else "bedGraph" if (!is.na(vals["altColor"])) line@altColor <- as.integer(strsplit(vals[["altColor"]], ",")[[1]]) if (!is.na(vals["autoScale"])) line@autoScale <- tolower(vals[["autoScale"]]) == "on" if (!is.na(vals["alwaysZero"])) line@alwaysZero <- tolower(vals[["alwaysZero"]]) == "on" if (!is.na(vals["gridDefault"])) line@gridDefault <- tolower(vals[["gridDefault"]]) == "on" if (!is.na(vals["maxHeightPixels"])) line@maxHeightPixels <- as.integer(strsplit(vals[["maxHeightPixels"]], ":")[[1]]) if (!is.na(vals["graphType"])) line@graphType <- vals[["graphType"]] if (!is.na(vals["viewLimits"])) line@viewLimits <- as.numeric(strsplit(vals[["viewLimits"]], ":")[[1]]) if (!is.na(vals["yLineMark"])) line@yLineMark <- as.numeric(vals[["yLineMark"]]) if (!is.na(vals["yLineOnOff"])) line@yLineOnOff <- tolower(vals[["yLineOnOff"]]) == "on" if (!is.na(vals["windowingFunction"])) line@windowingFunction <- vals[["windowingFunction"]] if (!is.na(vals["smoothingWindow"])) line@smoothingWindow <- as.numeric(vals[["smoothingWindow"]]) line }) setAs("BasicTrackLine", "GraphTrackLine", function(from) new("GraphTrackLine", from)) setAs("GraphTrackLine", "BasicTrackLine", function(from) new("BasicTrackLine", from)) setClass("UCSCData", representation(trackLine = "TrackLine"), prototype(trackLine = new("BasicTrackLine")), "GRanges") UCSCData <- function(ranges, trackLine = NULL) { ucsc <- as(ranges, "UCSCData") ucsc@trackLine <- trackLine ucsc } setMethod("show", "UCSCData", function(object) { if (!is.null(object@trackLine@name)) cat("UCSC track '", object@trackLine@name, "'\n", sep = "") callNextMethod() }) chooseGraphType <- function(from) { r <- ranges(from) type <- "bedGraph" ## decide whether compression is a good idea steps <- diff(sort(start(r))) if (length(unique(width(r))) == 1L && # all spans must be the same for WIG (length(unique(steps)) == 1L || # fixed-step makes sense ((3L * length(unique(width(r)))) < length(r) && # makes sense wrt size mean(steps) < 100))) # dense enough for UCSC efficiency type <- "wig" type } setAs("GRanges", "UCSCData", function(from) { line <- metadata(from)$trackLine if (is.null(line)) { if (is.numeric(score(from))) { # have numbers, let's plot them type <- chooseGraphType(from) line <- new("GraphTrackLine", type = type) } else { line <- new("BasicTrackLine") db <- unique(genome(from)) if (length(db) == 1 && !is.na(db)) line@db <- db } } else { metadata(from)$trackLine <- NULL } new("UCSCData", as(from, "GRanges"), trackLine = line) }) ## We want 'as(UCSCData, "GRanges", strict=FALSE)' to do the right thing (i.e. ## be a no-op) but as() won't do that if a coerce,UCSCData,GRanges method ## exists (this is a serious flaw in as() current design/implementation). ## The workaround is to support the 'strict=FALSE' case at the level of ## the coerce() method but setAs() doesn't let us do that so we use ## setMethod("coerce", ...) to define the method. setMethod("coerce", c("UCSCData", "GRanges"), function(from, to="GRanges", strict=TRUE) { if (strict) { gr <- new("GRanges") for (what in slotNames(gr)) slot(gr, what) <- slot(from, what) metadata(gr)$trackLine <- from@trackLine gr } else from }) splitUCSCData <- function(x, f, drop=FALSE, ...) { GRangesList( lapply(split(seq_along(x), f, drop=drop, ...), function(i) x[i]), compress=FALSE ) } setMethod("split", "UCSCData", splitUCSCData) setMethod("split", c("UCSCData", "Vector"), splitUCSCData) setClass("UCSCFile", contains = "RTLFile") UCSCFile <- function(resource) { new("UCSCFile", resource = resource) } ## the 'ucsc' format is a meta format with a track line followed by ## features formatted as 'wig', 'bed', 'bed15', 'bedGraph', 'gff', or ## really any text track format. setGeneric("export.ucsc", function(object, con, ...) standardGeneric("export.ucsc")) setMethod("export.ucsc", c("ANY", "RTLFile"), function(object, con, subformat = "auto", ...) { if (subformat == "auto" && !is(con, "UCSCFile")) subformat <- fileFormat(con) export(object, UCSCFile(resource(con)), subformat=subformat, ...) }) setMethod("export.ucsc", c("ANY", "ANY"), function(object, con, ...) { export(object, con, "ucsc", ...) }) .export_SimpleGRangesList_RTLFile <- function(object, con, format, ...) { export(object, UCSCFile(resource(con)), subformat = fileFormat(con), ...) } setMethod("export", c("GRangesList", "UCSCFile"), function(object, con, format, append = FALSE, index = FALSE, ...) { if (isTRUE(index) && length(object) > 1) stop("Cannot index multiple tracks in a single file") trackNames <- names(object) if (is.null(trackNames)) trackNames <- paste("R Track", seq_len(length(object))) ucsc <- unlist(lapply(object, is, "UCSCData")) lines <- unlist(lapply(object[ucsc], slot, "trackLine")) trackNames[ucsc] <- as.character(sapply(lines, slot, "name")) tracks <- vector("list", length(object)) for (i in seq_len(length(object))) { tracks[[i]] <- export(object[[i]], con, name = trackNames[i], append = append, index = index, ...) append <- TRUE } RTLFileList(tracks) }) trackLineClass <- function(subformat) { subformat <- tolower(subformat) if (subformat == "wig" || subformat == "bedgraph") "GraphTrackLine" else if (subformat == "bed15") "Bed15TrackLine" else "BasicTrackLine" } setMethod("fileFormat", "TrackLine", function(x) "bed") setMethod("fileFormat", "GraphTrackLine", function(x) x@type) setMethod("bestFileFormat", c("UCSCData", "ANY"), function(x, dest) { fileFormat(x@trackLine) }) setMethod("export", c("ANY", "UCSCFile"), function(object, con, format, ...) { cl <- class(object) track <- try(as(object, "GRanges"), silent = TRUE) if (class(track) == "try-error") { track <- try(as(object, "SimpleGRangesList"), silent = TRUE) if (is(track, "try-error")) stop("cannot export object of class '", cl, "': ", track) } object <- track callGeneric() }) setMethod("export", c("GenomicRanges", "UCSCFile"), function(object, con, format, ...) { object <- as(object, "UCSCData") callGeneric() }) setMethod("export", c("UCSCData", "UCSCFile"), function(object, con, format, subformat = "auto", append = FALSE, index = FALSE, ...) { auto <- FALSE if (subformat == "auto") { auto <- TRUE subformat <- bestFileFormat(object, con) } graphFormat <- tolower(subformat) %in% c("wig", "bedgraph") if (graphFormat) { strand <- as.character(strand(object)) strand[is.na(strand)] <- "NA" isStrandDisjoint <- function(track) { all(tapply(ranges(track), seqnames(track), function(r) { isDisjoint(r) && all(width(r) > 0) }), na.rm=TRUE) } if (!all(unlist(lapply(split(object, strand), isStrandDisjoint)))) { if (auto) { subformat <- "bed" graphFormat <- FALSE } else stop("Track not compatible with WIG/bedGraph: ", "Overlapping features must be on separate strands", " and every feature width must be positive") } } lineClass <- trackLineClass(subformat) if (!is(object@trackLine, lineClass)) object@trackLine <- as(object@trackLine, lineClass) if (is(object@trackLine, "GraphTrackLine")) object@trackLine@type <- subformat args <- list(...) lineArgs <- names(args) %in% slotNames(lineClass) for (argName in names(args)[lineArgs]) slot(object@trackLine, argName) <- args[[argName]] if (is(object@trackLine, "BasicTrackLine") && length(object@trackLine@offset)) ranges(object) <- shift(ranges(object), -object@trackLine@offset) trackLine <- NULL if (graphFormat) { strand <- as.character(strand(object)) strand[is.na(strand)] <- "NA" if (!all(strand[1] == strand)) { nameMap <- c("+" = "p", "-" = "m", "NA" = "NA") strand <- factor(strand) name <- paste(object@trackLine@name, nameMap[levels(strand)]) tracks <- split(object, strand) export(tracks, con, subformat, append, trackNames = name, ...) return() } } else if (subformat == "bed15") { if (is.null(object@trackLine@expNames)) object@trackLine@expNames <- colnames(object) trackLine <- object@trackLine } file <- con m <- manager() con <- connection(m, con, if (append) "a" else "w") cat(as(object@trackLine, "character"), "\n", file=con, sep = "") do.call(export, c(list(as(object, "GRanges"), con, subformat), args[!lineArgs], trackLine = trackLine)) release(m, con) if (index) indexTrack(FileForFormat(resource(file), subformat), skip = 1L) else invisible(file) }) setGeneric("import.ucsc", function(con, ...) standardGeneric("import.ucsc")) setMethod("import.ucsc", "ANY", function(con, ...) { import(con, "ucsc", ...) }) setMethod("import.ucsc", "RTLFile", function(con, subformat = "auto", ...) { if (!is(con, "UCSCFile")) { format <- fileFormat(con) if (subformat != "auto" && format != subformat) stop("Attempt to import '", class(con), "' as ", subformat) subformat <- format } import.ucsc(resource(con), subformat = subformat, ...) }) parseFormatFromTrackLine <- function(x) { if (!grepl("type=", x)) NULL else { type <- sub(".*type=\"(.*?)\".*", "\\1", x) if (type == "array") "bed15" else if (type == "wiggle_0") "wig" else type } } setMethod("import", "UCSCFile", function(con, format, text, subformat = "auto", drop = FALSE, genome = NA, ...) { lines <- readLines(resource(con), warn = FALSE) tracks <- grep("^track", lines) trackLines <- lines[tracks] starts <- tracks + 1L ends <- c(tail(tracks, -1) - 1L, length(lines)) makeTrackSet <- function(i) { if (subformat == "auto") { subformat <- parseFormatFromTrackLine(trackLines[i]) if (is.null(subformat)) { p <- resourceDescription(con) subformat <- file_ext(p) } } line <- as(trackLines[i], trackLineClass(subformat)) if (starts[i] <= ends[i]) { text <- window(lines, starts[i], ends[i]) } else { text <- character() } if (is.na(genome) && is(line, "BasicTrackLine") && length(line@db)) genome <- line@db if (subformat == "bed15") { # need to pass track line ucsc <- import(format = "bed15", text = text, trackLine = line, genome = genome, ...) } else { ucsc <- import(format = subformat, text = text, genome = genome, ...) } if (is(line, "BasicTrackLine") && length(line@offset)) ranges(ucsc) <- shift(ranges(ucsc), line@offset) ucsc <- as(ucsc, "UCSCData", FALSE) ucsc@trackLine <- line ucsc } tsets <- lapply(seq_along(trackLines), makeTrackSet) trackNames <- sapply(tsets, function(x) x@trackLine@name) if (!any(is.na(trackNames))) names(tsets) <- trackNames if (drop && length(tsets) == 1) return(tsets[[1]]) GRangesList(tsets, compress=FALSE) }) setMethod("login", "UCSCSession", function(x, username, password) { ucscPost(x, "hgLogin", list(hgLogin.do.displayLogin = "Login", hgLogin_userName = username, hgLogin_password = password)) }) setMethod("saveView", "UCSCView", function(x, name, username, password, share = TRUE) { if (!missing(username)) login(browserSession(x), username, password) ucscPost(x, "hgSession", list(hgS_newSessionName = name, hgS_newSessionShare = if (share) "on" else "off")) }) setMethod("restoreView", "UCSCSession", function(x, name, username, password) { if (!missing(username)) login(x, username, password) ucscPost(x, "hgSession", setNames(list("use"), paste0("hgS_load_", name))) }) ############ INTERNAL API ############ ## every cgi variable is stored in the 'cart' setClass("ucscCart", contains = "character") setGeneric("ucscCart", function(object, ...) standardGeneric("ucscCart")) setMethod("ucscCart", "UCSCSession", function(object, form = ucscForm(activeView(object))) { node <- ucscGet(object, "cart", form) raw <- xmlValue(getNodeSet(node, "//pre/text()")[[1]]) lines <- strsplit(raw, "\n")[[1]] fields <- strsplit(lines, " ") pairs <- fields[sapply(fields, length) == 2] mat <- matrix(unlist(pairs), nrow = 2) vals <- mat[2,] names(vals) <- mat[1,] new("ucscCart", vals) }) setMethod("ucscCart", "UCSCView", function(object) { ucscCart(object@session, ucscForm(object)) }) setMethod("genome", "ucscCart", function(x) x[["db"]]) setMethod("range", "ucscCart", function(x, ..., na.rm) { pos <- x["position"] posSplit <- strsplit(pos, ":")[[1]] range <- as.numeric(gsub(",", "", strsplit(posSplit[2], "-")[[1]])) GRangesForUCSCGenome(x[["db"]], posSplit[1], IRanges(range[1], range[2])) }) ### track information setClass("ucscTracks", representation(ids = "character", modes = "character")) setGeneric("ucscTracks", function(object, ...) standardGeneric("ucscTracks")) setMethod("ucscTracks", "UCSCSession", function(object, form = list()) { tracks <- ucscGet(object, "tracks", form) nodes <- getNodeSet(tracks, "//select/option[@selected]/text()") trackModes <- sapply(nodes, xmlValue) nodes <- getNodeSet(tracks, "//select/@name") trackIds <- unlist(nodes) ##trackIds <- sapply(nodes, xmlValue) nodes <- getNodeSet(tracks, "//select/../a[not(@class)]/text()") nms <- sapply(nodes, xmlValue) names(trackIds) <- sub("^ ", "", nms) new("ucscTracks", ids = trackIds, modes = trackModes) }) setMethod("ucscTracks", "UCSCView", function(object) { ucscTracks(object@session, ucscForm(object)) }) setMethod("ucscTrackModes", "ucscTracks", function(object) { modes <- object@modes labels <- names(object@ids) names(modes) <- object@ids ucscTrackModes(modes, labels) }) ## List available UCSC genomes .getOrganism <- function(db){ .ucsc <- "http://genome.ucsc.edu/cgi-bin" .tryQuery <- function(url, query) tryCatch({ htmlTreeParse(url, useInternalNodes=TRUE)[[query]] }, error=function(err) { warning(conditionMessage(err)) NA_character_ }) urls <- sprintf("%s/hgGateway?db=%s", .ucsc, db) sapply(urls, .tryQuery, "string(//div[@id='sectTtl']/i)") } ucscGenomes <- function(organism=FALSE) { url <- "http://genome.ucsc.edu/FAQ/FAQreleases" df <- readHTMLTable(url)[[1L]][c(2,1,3,4,5)] .cleanTableCells <- function(x) { x <- sub("^ *", "", x) ## Some empty cells in the table of UCSC genome releases seem to contain ## invisible junk. This junk seems to vary from one platform to the other ## (not clear why, maybe some sort of local issue?). ## There must be a simplest way to get rid of this junk... ## TODO: Test this on Windows! is_empty_cell <- x %in% c("", "\xc2\xa0", "\xc3\x82\xc2\xa0") x[is_empty_cell] <- "" x } COLS <- c("UCSC VERSION", "SPECIES", "RELEASE DATE", "RELEASE NAME", "STATUS") if (!identical(names(df), COLS)) stop("table of UCSC genome releases (found at ", url, "#release1) ", "doesn't have expected columns ", paste(COLS, collapse=", ")) ## readHTMLTable is returning one NA row for some reason names(df) <- c("db","species","date","name","status") df <- df[!apply(df, 1, function(x) all(is.na(x))),] df <- df[df$db != "" , ] not_empty <- df$species != "" df$species <- rep.int(df$species[not_empty], diff(which(c(not_empty, TRUE)))) df <- df[df$status == "Available", -5L] if (organism) { df$organism <- NA_character_ org <- lapply(as.character(df$db), function(xx) unique(suppressWarnings(mapGenomeBuilds(xx)$organism))) df$organism[!sapply(org, is.null)] <- unlist(org) } rownames(df) <- NULL df } # form creation setGeneric("ucscForm", function(object, ...) standardGeneric("ucscForm")) setMethod("ucscForm", "IntegerRangesList", function(object) { form <- list() genome <- singleGenome(genome(object)) if (!is.na(genome)) form <- c(form, db = genome) chrom <- space(object) if (!is.null(chrom)) { if (!length(chrom)) chrom <- levels(chrom)[1] scipen <- getOption("scipen") options(scipen = 100) # prevent use of scientific notation on.exit(options(scipen = scipen)) position <- chrom if (length(unlist(start(object)))) position <- paste(chrom, ":", unlist(start(object)), "-", unlist(end(object)), sep = "") form <- c(form, position = position) } form }) setMethod("ucscForm", "GRanges", function(object) { scipen <- getOption("scipen") options(scipen = 100) # prevent use of scientific notation on.exit(options(scipen = scipen)) form <- list() genome <- singleGenome(genome(object)) if (!is.na(genome)) form <- c(form, db = genome) if (length(object) > 0L) { object <- object[1] c(form, position = paste(seqnames(object), ":", unlist(start(object)), "-", unlist(end(object)), sep = "")) } else form }) setMethod("ucscForm", "UCSCTrackModes", function(object) { as.list(object) }) setMethod("ucscForm", "UCSCView", function(object) { if (length(object@hgsid)) list(hgsid = as.character(object@hgsid)) else list() }) setOldClass("FileUploadInfo") setMethod("ucscForm", "FileUploadInfo", function(object, genome = NA_character_, ...) { form <- list(Submit = "Submit", hgt.customFile = object) if (!is.na(genome)) form <- c(form, db = genome) form }) setMethod("ucscForm", "SimpleGRangesList", function(object, format, ...) { lines <- export(object, format = "ucsc", subformat = format, ...) text <- paste(paste(lines, collapse = "\n"), "\n", sep = "") filename <- paste("track", format, sep = ".") upload <- fileUpload(filename, text, "text/plain") genome <- singleGenome(genome(object)) ucscForm(upload, genome) }) setMethod("ucscForm", "RTLFile", function(object, genome, ...) { upload <- fileUpload(path(object), "text/plain") ucscForm(upload, genome) }) setMethod("ucscForm", "UCSCTableQuery", function(object, tracks = FALSE) { ## range (ie genome) is required range <- object@range table <- object@table form <- list() if (!spansGenome(range) && length(range) == 1) { form <- c(form, ucscForm(range)) } if (is.null(object@track) && !tracks) { form <- c(form, list(hgta_group = "allTables")) if (is.null(table)) table <- "chromInfo" } else form <- c(form, list(hgta_group = "allTracks", hgta_track = object@track)) if (spansGenome(range)) regionType <- "genome" else if (length(range) == 1) regionType <- "range" else regionType <- "userRegions" form <- c(form, hgta_regionType = regionType, hgta_table = table) if (!is.null(object@outputType)) { form <- c(form, hgta_outputType = object@outputType) } form$hgta_compressType <- "none" # TODO: support gzip form }) setMethod("ucscForm", "NULL", function(object) list()) # Transforming to a cookie string setGeneric("ucscCookie", function(object, ...) standardGeneric("ucscCookie")) setMethod("ucscCookie", "UCSCSession", function(object) { object@hguid }) # HTTP wrappers # URL constants for UCSC ucscURLTable <- c(gateway = "hgGateway", tracks = "hgTracks", custom = "hgCustom", tables = "hgTables", cart = "cartDump") ucscURL <- function(object, key, force=TRUE) { path <- ucscURLTable[key] if (is.na(path)) stop("Key '", key, "' does not match a known URL") if (force && key == "gateway") { path <- paste0(path, '?redirect="manual"') } paste(object@url, path, sep="") } # convenience wrappers for _initialized_ sessions ucscShow <- function(object, key, .form = list(), ...) httpShow(ucscURL(object, key), .form, ...) ucscPost <- function(object, key, .form = list(), ...) httpPost(ucscURL(object, key), .form, ..., cookie = ucscCookie(object)) ucscGet <- function(object, key, .form = list(), ...) httpGet(ucscURL(object, key), .form, ..., cookie = ucscCookie(object)) rtracklayer/R/utils.R0000644000175400017540000000075213556116552015624 0ustar00biocbuildbiocbuild### ========================================================================= ### Utilities ### ------------------------------------------------------------------------- pasteCollapse <- function(x, collapse = ",") { if (!is(x, "CharacterList")) stop("'x' must be a CharacterList") if (!isSingleString(collapse) || nchar(collapse) != 1L) stop("'collapse' must be a single string, with a single character") x <- as.list(x) .Call(CharacterList_pasteCollapse, x, collapse) } rtracklayer/R/web.R0000644000175400017540000000541613556116552015243 0ustar00biocbuildbiocbuildhtmlErrorHandler <- function(msg, code, domain, line, col, level, filename) { if (!length(level)) stop("Unknown HTML parse error") if (level > 2) stop("Failed to Parse HTML [", line, ":", col, "]: ", msg) } htmlParse <- function(str) suppressWarnings(htmlTreeParse(str, asText = TRUE, useInternalNodes = TRUE, error = htmlErrorHandler)) httpGet <- function(url, .form = list(), .parse = TRUE, ...) { if (length(.form) == 0) out <- getURL(url, useragent = "rtracklayer", verbose=getOption("rtracklayer.http.verbose", FALSE), ...) else out <- getForm(url, .params = .form, .opts=list(..., useragent = "rtracklayer", verbose=getOption("rtracklayer.http.verbose", FALSE))) if (.parse) htmlParse(out) else out } httpPost <- function(url, .form = list(), .parse = TRUE, ...) { form <- postForm(url, .params = .form, .opts=list(..., useragent = "rtracklayer", verbose=getOption("rtracklayer.http.verbose", FALSE))) if (.parse) htmlParse(form) else form } httpShow <- function(url, .form = list(), ...) browseURL(urlForm(url, .form, ...)) urlForm <- function(url, .form = list(), ...) { values <- urlEncode(as.character(c(.form, ...))) query <- paste(names(.form), values, sep = "=", collapse = "&") paste(url, query, sep = "?") } # differs from URLencode (vectorized, only encodes specified chars) urlEncode <- function(str, chars = "-a-zA-Z0-9$_.+!*'(),", keep = TRUE) { str <- as.character(str) bad <- chars if (keep) bad <- gsub(paste("[", chars, "]", sep=""), "", str) bad <- unique(unlist(strsplit(bad, ""))) code <- paste("%", charToRaw(paste(bad, collapse="")), sep="") for (i in seq_along(bad)) str <- gsub(bad[i], code[i], str, fixed = TRUE) str } # differs from URLdecode (vectorized) urlDecode <- function(str, na.strings="NA") { ans <- curlUnescape(str) if (!identical(na.strings, "NA")) ans[is.na(str)] <- na.strings ans } expandPath <- function(x) { if (startsWith(x, "http") || startsWith(x, "ftp")) expandURL(x) else path.expand(x) } expandURL <- function(uri) { if(!url.exists(uri)) return(uri) else { opts <- list( followlocation = TRUE, # resolve redirects ssl.verifyhost = FALSE, # suppress certain SSL errors ssl.verifypeer = FALSE, nobody = TRUE, # perform HEAD request verbose = FALSE ) curlhandle <- getCurlHandle(.opts = opts) getURL(uri, curl = curlhandle) info <- getCurlInfo(curlhandle) info$effective.url } } rtracklayer/R/wig.R0000644000175400017540000002215613556116552015254 0ustar00biocbuildbiocbuild### ========================================================================= ### WIG (Wiggle) support (fixedStep and variableStep, legacy bedGraph) ### ------------------------------------------------------------------------- ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Classes ### setClass("WIGFile", contains = "RTLFile") WIGFile <- function(resource) { new("WIGFile", resource = resource) } ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Export ### setGeneric("export.wig", function(object, con, ...) standardGeneric("export.wig")) setMethod("export.wig", "ANY", function(object, con, ...) { export(object, con, "wig", ...) }) setMethod("export", c("ANY", "WIGFile"), function(object, con, ...) { cl <- class(object) track <- try(as(object, "GRanges"), silent = TRUE) if (class(track) == "try-error") { track <- try(as(object, "SimpleGRangesList"), silent = TRUE) if (is(track, "try-error")) stop("cannot export object of class '", cl, "': ", track) } export(track, con, ...) }) .wigWriter <- function(chromData, con, dataFormat, append) { m <- manager() con <- connection(m, con, if (append) "a" else "w") on.exit(release(m, con)) cat(dataFormat, file = con) cat(" chrom=", as.character(seqnames(chromData)[1]), file = con, sep = "") data <- score(chromData) starts <- start(chromData) if (dataFormat == "variableStep") data <- cbind(starts, data) else { cat(" start=", starts[1], file = con, sep = "") step <- if (length(starts) == 1) 0 else starts[2] - starts[1] cat(" step=", step, file = con, sep = "") } cat(" span=", width(chromData)[1], file = con, sep = "") cat("\n", file = con, sep = "") write.table(data, con, sep = "\t", col.names = FALSE, row.names = FALSE, quote = FALSE) } isValidScore <- function(score) { !(is.numeric(score) || is(score, "Rle") && is.numeric(runValue(score))) || any(is.na(score)) } setMethod("export", c("GenomicRanges", "WIGFile"), function(object, con, format, dataFormat = c("auto", "variableStep", "fixedStep"), writer = .wigWriter, append = FALSE, ...) { if (!missing(format)) checkArgFormat(con, format) if (isValidScore(score(object))) stop("The score must be numeric, without any NA's") scipen <- getOption("scipen") options(scipen = 100) # prevent use of scientific notation on.exit(options(scipen = scipen)) dataFormat <- match.arg(dataFormat) doBlock <- function(chromData) { if (length(chromData) == 0L) return() if (is(chromData, "GPos")) { ans <- writer(chromData, con, "fixedStep", append) append <<- TRUE return(ans) } if (is.unsorted(start(chromData))) chromData <- chromData[order(start(chromData)),] starts <- start(chromData) ends <- end(chromData) if (!all(tail(starts, -1) - head(ends, -1) > 0)) stop("Features cannot overlap. ", "Note that WIG does not distinguish between strands - ", "try exporting two tracks, one for each strand.") spans <- ends - starts + 1 if (length(starts) == 1) steps <- 0 else steps <- diff(starts) fixedSpan <- all(spans[1] == spans) if (!fixedSpan) stop("The span must be uniform for Wiggle export. ", "Consider exporting to bedGraph/bigWig, ", "or coerce data to a GPos object first.") fixedStep <- all(steps[1] == steps) if (dataFormat == "auto") { dataFormat <- "variableStep" if (fixedStep) dataFormat <- "fixedStep" } if (dataFormat != "variableStep" && !fixedStep) stop("Step not uniform: consider variableStep") ans <- writer(chromData, con, dataFormat, append) append <<- TRUE ans } dataFormat <- match.arg(dataFormat) lapply(split(object, seqnames(object)), doBlock) invisible(con) }) setMethod("export", c("UCSCData", "WIGFile"), function(object, con, format, trackLine = TRUE, ...) { if (!missing(format)) checkArgFormat(con, format) if (trackLine) { export.ucsc(object, con, ...) } else { callNextMethod() } invisible(con) }) setMethod("export", c("SimpleGRangesList", "WIGFile"), .export_SimpleGRangesList_RTLFile) ### - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ### Import ### setGeneric("import.wig", function(con, ...) standardGeneric("import.wig")) setMethod("import.wig", "ANY", function(con, ...) { import(con, "wig", ...) }) setMethod("import", "WIGFile", function(con, format, text, genome = NA, trackLine = TRUE, which = NULL, seqinfo = NULL, ...) { if (!missing(format)) checkArgFormat(con, format) file <- con m <- manager() con <- connection(m, con, "r") on.exit(release(m, con)) ## check for a track line line <- scanTrackLine(con) if (!is.null(line) && trackLine) { pushBack(line, con) return(import.ucsc(initialize(file, resource = con), drop = TRUE, trackLine = FALSE, genome = genome, which = which, seqinfo = seqinfo, ...)) } lines <- readLines(con, warn = FALSE) formatInds <- grep("chrom=", lines, fixed=TRUE) formatLines <- lines[formatInds] starts <- formatInds + 1L ends <- c(tail(formatInds, -1) - 1L, length(lines)) format <- gsub("^([^ ]*) .*", "\\1", formatLines) parsedFormat <- lapply(formatLines, ucscParsePairs) chrom <- sapply(parsedFormat, `[[`, "chrom") if (is.null(seqinfo) && !is.null(genome) && !is.na(genome)) seqinfo <- seqinfoForGenome(genome) if (!is.null(seqinfo)) seqlevels <- seqlevels(seqinfo) else seqlevels <- unique(chrom) if (length(formatLines)) { parseData <- function(i) { ## parse format line formatVals <- parsedFormat[[i]] # parse the data values block_lines <- window(lines, starts[i], ends[i]) if (!length(block_lines)) { gr <- GRanges(score = numeric()) seqlevels(gr) <- seqlevels return(gr) } block_lines <- grep("^#", block_lines, invert = TRUE, value = TRUE) if (format[i] == "variableStep") { ## assume the same white space for every row sep <- sub(".*?([[:space:]]+).*", "\\1", block_lines[1]) split_lines <- strsplit(block_lines, sep, fixed=TRUE) mat <- matrix(as.numeric(unlist(split_lines)), nrow = 2) start <- mat[1,] score <- mat[2,] } else { start <- seq(as.integer(formatVals["start"]), by = as.integer(formatVals["step"]), length.out = length(block_lines)) score <- as.numeric(block_lines) } span <- formatVals["span"] if (is.na(span)) span <- 1 end <- start + as.integer(span) - 1 gd <- GenomicData(IRanges(start, end), score = score, chrom = formatVals[["chrom"]], which = which) seqlevels(gd) <- seqlevels gd } parseInds <- seq_along(formatInds) if (!is.null(which)) { message("For efficiency, consider converting this WIG file", " to a BigWig file;\nsee ?wigToBigWig") parseInds <- parseInds[chrom %in% seqlevels(which)] } resultList <- lapply(parseInds, parseData) gd <- do.call(c, resultList) if (!is.null(seqinfo)) seqinfo(gd) <- seqinfo else if (!is.null(genome)) genome(gd) <- genome gd } else { import(text = lines, format = "bedGraph", genome = genome, which = which, seqinfo = seqinfo) } }) rtracklayer/R/zzz.R0000644000175400017540000000041713556116552015317 0ustar00biocbuildbiocbuild.onUnload <- function(libpath) { library.dynam.unload("rtracklayer", libpath) } setUserUdcDir <- function() { dir <- paste0("/tmp/udcCache_", Sys.info()[["user"]]) .Call(R_setUserUdcDir, dir) } .onLoad <- function(libname, pkgname) { setUserUdcDir() } rtracklayer/TODO0000644000175400017540000000045313556116552014626 0ustar00biocbuildbiocbuild- List subtracks for a supertrack in the UCSC browser - Up-front column selection - Chunked importing (pass a chunk size and callback to import) - Attach to existing saved sessions - Represent formats with formal class in I/O framework, rather than ".format" - Port to track reading and writing to Crtracklayer/build/0000755000175400017540000000000013556147727015243 5ustar00biocbuildbiocbuildrtracklayer/build/vignette.rds0000644000175400017540000000030413556147727017577 0ustar00biocbuildbiocbuild‹‹àb```b`fcd`b2™… 1# 'æ/*)JLÎÎI¬L-Ò Ê+G“æF’Ƨ³ % MšÅ` C„Á’E@À„¤˜5/17µÍv—Ô‚Ô¼ð?ìúÿ£iáðN­,Ï/‚éAQÃUÃâ–™“ ³7$³Îapqƒ2ƒÐÝ€a>Šû9‹òËõ`~à{øèMÎI,F÷(WJbI¢^ZP?ÈÝS‡”$¸rtracklayer/configure0000755000175400017540000025717413556147727016073 0ustar00biocbuildbiocbuild#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME= PACKAGE_TARNAME= PACKAGE_VERSION= PACKAGE_STRING= PACKAGE_BUGREPORT= PACKAGE_URL= ac_subst_vars='LTLIBOBJS LIBOBJS SSL_CPPFLAGS OPENSSL_LIBS OPENSSL_CFLAGS PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking ' ac_precious_vars='build_alias host_alias target_alias PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR OPENSSL_CFLAGS OPENSSL_LIBS' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures this package to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then cat <<\_ACEOF Some influential environment variables: PKG_CONFIG path to pkg-config utility PKG_CONFIG_PATH directories to add to pkg-config's search path PKG_CONFIG_LIBDIR path overriding pkg-config's built-in search path OPENSSL_CFLAGS C compiler flags for OPENSSL, overriding pkg-config OPENSSL_LIBS linker flags for OPENSSL, overriding pkg-config Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF configure generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by $as_me, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu case "$OSTYPE" in "darwin"*) BREWDIR=`brew --prefix` export PKG_CONFIG_PATH=$BREWDIR/opt/openssl/lib/pkgconfig ;; esac if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for OPENSSL" >&5 $as_echo_n "checking for OPENSSL... " >&6; } if test -n "$OPENSSL_CFLAGS"; then pkg_cv_OPENSSL_CFLAGS="$OPENSSL_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"openssl >= 1.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "openssl >= 1.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_OPENSSL_CFLAGS=`$PKG_CONFIG --cflags "openssl >= 1.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$OPENSSL_LIBS"; then pkg_cv_OPENSSL_LIBS="$OPENSSL_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"openssl >= 1.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "openssl >= 1.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_OPENSSL_LIBS=`$PKG_CONFIG --libs "openssl >= 1.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then OPENSSL_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "openssl >= 1.0" 2>&1` else OPENSSL_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "openssl >= 1.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$OPENSSL_PKG_ERRORS" >&5 OPENSSL="no" elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } OPENSSL="no" else OPENSSL_CFLAGS=$pkg_cv_OPENSSL_CFLAGS OPENSSL_LIBS=$pkg_cv_OPENSSL_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } OPENSSL="yes" fi if test "${OPENSSL}" != "no"; then SSL_CPPFLAGS="-DUSE_SSL" fi ac_config_files="$ac_config_files src/Makevars" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by $as_me, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ config.status configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "src/Makevars") CONFIG_FILES="$CONFIG_FILES src/Makevars" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi rtracklayer/configure.ac0000644000175400017540000000053313556116552016423 0ustar00biocbuildbiocbuildAC_PREREQ([2.65]) AC_INIT case "$OSTYPE" in "darwin"*) BREWDIR=`brew --prefix` export PKG_CONFIG_PATH=$BREWDIR/opt/openssl/lib/pkgconfig ;; esac PKG_CHECK_MODULES(OPENSSL, [openssl >= 1.0], [OPENSSL="yes"], [OPENSSL="no"]) if test "${OPENSSL}" != "no"; then SSL_CPPFLAGS="-DUSE_SSL" fi AC_SUBST(SSL_CPPFLAGS) AC_OUTPUT(src/Makevars) rtracklayer/data/0000755000175400017540000000000013556116552015045 5ustar00biocbuildbiocbuildrtracklayer/data/cpneTrack.rda0000644000175400017540000222472013556116552017460 0ustar00biocbuildbiocbuildý7zXZi"Þ6!ÏXÌâDôïþ])TW"änRÊŸ’Øáí)-t¦^JiíÈ–o'ùm’"A脱FÖòQõ ¶µ}RõÖÆœ?Ï.ûjsÅ)Ôùôõÿâ’›¨?* 2á]J…ª'0k(aN‚†‡Ã—û­qù‡:ð­YÈx@¦óFWL¢km ¡Z…ÔùÂà´ ,KÕ½}VÝÕ\’¾‡¹+†F­Ñà÷^ãrc–®½ºÑ›*÷…¨Ìtj@dñÙ«Ðù{'ˆ=—ªT÷Ì>Óxa;ÃÖò‹7ëÙ¾BñXï3¨m GáH&Eò¢èøÂ\ƒ ¢"Δ¡„cÉfCq {‘94j@¿ÊWí¿mx`¹°#—ˆÑzLn{i+7´¥\WóÁ‰vC×p­_ÁãVÛO%Zå,ØMÔžGÞC9V¶«bþªSA]VØf®þÝQ?áîo‹Lb³à7÷»7U…µ`”»kæ "^×ðã‰9–24‚;ÈSz‘WCàÿÁo¢ßwŠZæ8ŒvKà2ƒp—q¬Ë,i YÕK»0™YOÇþCYø ]vÂS:ëRÀ³›.™ OcoΡ…Äõ‚H RBý¿5©gU @oT¯¡ÐþŸ·±ÑÈÛwp4K.Õ*»Â,|† ÎE™ €Jz„6²'¦EÌ•î‹)£)Gå­Ý¹+i{"t,[t A9çNcj³ˆ· cÒÆ;ú»QdìHxݲ4]ƉÁÞ°J1Q†F±F¹ ¡ßdœ+<õw|¥ºd‡v¼Ñªé²ÀÝÌ1Š ³Ì=ŒlDƲjÆiÓÍfJ,ƒæfÓ)M~Všæ#æø.?ÛÝCCïñ¾uvþa¢»æüã!ºUö«O@Gt w»ûäÕ è‚à“ƒfh½KXüýÉ=R²œ Ì)¹|jt¯¯)žs öƒ5öž²–tb)Ãq™©6w jÀùuß|ùü6BÔ”=ްÔÃ¹Š—¸°•P'0jWçée>0u­Æ¥Ôë"D¾Ô-w 3à…´šAc`ÞÓxÄïón/—à*úð9þ϶bÝDy:mK™-ɤ0ãö :J|#WÚG`ÿS©rÉò0lç\£ÜºÇ1|VF:º(r5üC%æš&Ùø`(p# qõ‚‹ÎcÚ;µðú‹ènNn5ß'nÿ|¢K½9ü¿ÂõÃ4¤²Ä4<’¦7ÇÒ˾mûª”ª—V‚É]y=*®žÓ,ýE( v¡ ÅÕjå~ñMû bu¾ÍðòæR&’º4ì—Wd«mj‹`ík­})#[/67¼[ÿÖ`©/+£”¾ÂIh8UB±ï4ËJÎ5âb¡Ôß$ß>$õÆ:"P6ZK…¿´÷ŒqV­ó \&kk >m*O ò¨?­8dÌA¥ÁYã¤ÖŸÏSŠ1u%âh£Éʼ³Aè2Í5ÜägšÂ|­YÈ"SK‘ºˆS0pAÅFúЉŠL§à9Ÿ·ÊO‘ŠBO˜°T²1-=‡WÀL!EÄœ‡ö./F(¥‹Y;[Ï Pb+ÕA"Ñë ÚÒ¶ä•⡼· W(ް®Z9}¢2@q— Ùî±—d×äøÃ28üe;ÔCUa(si2§/(h쉗œ3iú(P+/},’ª p…Ón¨bxm¨Ý# ±[³ç¹oŸq‘ U­…F°mðŒ}&Fc§÷>CUbªò’¿Ïç=#€Ìö‘‚5âÛ¦ü•eÁßiË\­*Ù½ôHâòÉFI.¸t úÌåTP£âéäèeW5ȵãvšƒwϘÎ'¨aR^à 8úÞx1µ•=­›<…,›6ô’¹pKz¸È:¾#!uo; ÷+DƆï窩)ÌìZ¼g°Äðhä­0íoé™Ý£PG#¬Õµ62»Úà±}š€¯Ô/€ýó3xÊ'ýáº!êÝS‹)0ÁÙú¬OÝMò8ôí`i8‹nê›I¡ f@?$fP/œ?븽I}a(!ø“}t1ä)¡ÚýJÙe7š„@§âæ ˜aÖ+ ÒGBÂäÊ ~ûR¢²¸yå ¤E)æëÛÓ_2ùAFаFyu|Rß4´6F¸oX!Z~ÜË¿Ù(Ô~[7”Ú{ o².¼ÞËÞ?'rµm37n…dÀ p)•¿¢FgÍŸªÕRœ .e´Hݬ»ä«, K´–EàÆZª[ ùmUŒ}KÄz Oô3µ¨ò<$£R\qÔ¹¯¬|·ÂQ¢ž•kEãFô;§H"iêöÝ¡Å+µ²hâ«@Æ]¤w(f|ÉãyÚäîË·£g…¦X@þ©úÇ)GÝ­Í0Ó*R“÷¬EgÈó¨<ÍÇg#öd¦TÃÝÒÕ•/å`ÇÃý-–h¨\:8‰Î…"0ÍáÜ‚tB²V“”†}èÄ"ªýøð5M“tü'”_¼w7?mÉ:’WÿƒËF¢Ã4ê³±á•$@s´*dqŠ{÷kK3ˆY2ÿyÂph’˜1 Ù퇌½ð²‡§5 bïGkÓOã] ßµ“ø¤ªÈ$´ŸÄÂ’yhæR”Í#|»`Ï œÀ½ÈFéÒU>ÔÜ^ïOj±¯W´þ˱Ek8#„zHà¸èw›®‘€Ã»#Ù=`æ÷í ©1ô|²ðY¾Pè ƒaê/¤Ëòð`èÕtzíAd¾”õìK´º²¼`àž©áy,Ž †“å•’=è éx¡ÇzA¬x®ÛÒî ±æS™ssJôëM ‡¤8ãq)W.(GVœb.Îx†ÏÒ7D(/K4¤6Ù¼W³Èͨjžè6ƒŒï†Ä·«*BWù@q$¼ìÿët¸„E"ç…4jÐòžV&°ŸK<–!†š1< %“Å\cωÕÊÄJ‹8»9öŒš,¯•§š0~éW ó)5s ‡2qD~¸m ä0Õ>ð—º’—ÞG9Øîš[v\¶Ôž…ãàzD±”C^“7@óèwß½ Jv€H½šÿ°ŽŠKHùÁbd³:#¾h*ýéB\jN…¹šòª>L1F}È$\QÆË×ÚdcÙݯ`ëG+*ÔL €;¾V¦³°µfD¾x¡ Ô´¬ EÜ` ~RWLÚˆ¥£(kÃÁM uZбµþöƒU–E䓈Œq<0ák›4ç½ëª‹¥ ã›¶/—©Œ&N*pÞÝYÝÓRñòLÝüß°õà`ÄU»=lScìrÍs& |GJ°tŠù©W“%º Q±¹‹åÔ?BnŒ™nAþäFH!(²qbÏÛÅñ›ô÷èx‰oÛ©¥7PÖ¹Õã©‚>7®áÄ:ÃTuŸ$˜V™+‘ÂÇÒš¢HÕØ˜Íã¶¾ÚSÔoÙ¥3£ì‹ÐG3°R%”Ý*Z‡·¹¹ÃÃáÜ6 Ü;LJ!ûe®g+Ôåã·X+:H4[(uÞz8éYQâjCôƒ²Õ„öXÇc¡ ~™BW%ü†áàAKb=pBqZÂ?S1—+u]}îÓŽ|b¸ˆåÑô¤ð÷$Y§Š¢ƒ †à¥ +Î ´íƒ‰¥^Bˆ[µUå>²™!¯”$xŸwÙŽp»Ö  0õ³Ã Ð< û=[U5 4ãYTÊ[Ø3pz¸÷}1­‚¬Ð7@ŠÆ Ü/ƒÚ™_]懣UðL«¸¼ÃøèA2ˆ„忘ÍÓ2,8j€'Ì2ïH.ZÕ™Xm–®¸6‰ÚçÒ9ÙÁ€ÄB•=‰+Í;í:O§°{ù T2 Igcà@«bep×û"fâm6pæŒM#â𠑪÷ÇÅ¡LÁÕ»ø(³ÅOnJƒfžü$X‡AÁ‰/(OCnJa{¥»5ÊM­¤ùô³FÏG}EóK#¨â_6_О ².-m&wÖÉÈ~‡ý†åúÏ3’ÖL+o=…Áº›þ[£C­éÇÉô%•RŽRÜéÄJ”Ì«¿êŒÛWÙŽ@¥Ë‡¯%•é·QLö°'oÑ< ÚÆ'ô¥þ7mµY#ø½˜}Cè*<­ MÏaqÐdðp?}KŽO°Œ®õ@æÄó>þq ¢z«…L?;†È× V{`òÄÃ-ºóŸê]VeXi³5…ÛÅèRëŠeïÇÉþ/»jê÷ â‘€>ÖA§×å€9ä` #˽TVhë[ž{dÆõðĉï] 8¤yR3š¹´W°ž” s~ºûD<¨ïa´'ŽÝ¿r8N,Á9ò·¡ÊßägÌ ²a¡)¸5àW”#bµà^;Ç:K†ûÔR¡êŠ]Ÿ£²)½˜n+”K3åMÿI =?ÄbÛŸtÀ¼?í²Ø\5Ì~0%ÿ‰R²Z–?UC²!¥bº6ÝzM£<álo´JŽÛœe¡ÊŠù,+ßu1É™3Ñшúw²SÁ-ÚõeêÀ¸ EnI› `]éN„"§«}ø19¬èl¼Ýë{Ù¾û+é«tYG¥?¡°E¢¤ÓØ…!kÎî*üòáƒÀÝVæ½hÑP'šmtÙLœÏ'ÅGV, ¶Ô;¤f¨ÊN—r&lTÌ @<¡B> œÖ"1Ê„‡´~;wp¬~Â/HäÚÎ|QN,?p J‘¬ #ãÊÚEØ‘Y\Ï\f #wFrÛQTiݦ€ø–æÔºÔ7 šÑ®Á=ŠdUÚ?›¼ñÞf«nU~Ft¡Rg*é½"^¤{.ìA¯ðà}C{µf‰W0¡[áùþdÙ…wNqFÉË0‚¦èÇ• Â`D¹N¢A¹G24ך5ËÕ÷Št|ñèüÅ{ŽnÉn éÉ"6¯[C­%ñ3—Gx"‡Œ‚Ún=&ï¯KJ7Ò_£7!÷éÈV'éáÌü8*tŽf¤ªbÌAò=F©ØÓE°|¸¥xž±ZלSöÜÙ·\^;ÞòO¡Q‘ÄyW,['µeq+ô9Ýš¶÷/7™Û‰(w¸Jë8àZ“z¬<í‡b–Úºo…Nvµ¥zAˆò·+ÿB?ä”cƒõºÿÑ[CèÚ¨^«›ê0°q8ÇÂâ€ûCeÍÖ,ÏÎâ’âÆcÉþÇ/ a{Q‘`"„@1{»ûf8€]\eÝq @0Üi=uVדۥÿüÝxÃ;ía¬’VIk\4z4„ËdÉ€$´Ÿ6—ƒò‘ŸCï´â¨âyŽŸ¼hL)êø{Oû[?4&Z€ŒºŸ ö°D篊ÓË 7šù ”l{ZûüPRZ¹ˆ “Ì>ÿ›ß -ÙeÚ%Ç×[m´ü+CùÎÖíÓ[3Aíb¹Ðƒ”W¸ÈQb~v¤“HÑl4"U°çÊYPçròŒ¦œ™‘§^G¼Ñ(ÛÿŸ\ÛšËþ‰SÜZês{8kÿðºúžö›Ã©™s7ÂøÊ̶V`*×R\ÕLâË)¡«X”LYC¸(‰æeœñ¾æÀ'\P2°£UsÊØ?æò¾æD1úö†Ÿ>+ žqf4Ö'`ÕŸ — ¾ÂèFº•§åˆ9© 0Ïtï`;œà)˜èn^ŒM·}ð¯3±Éоzñ‹R,.ÿ‹”úæ/lÎcMQÅvž©ÎÝbs•½Ì’i@%2Íò4•~å»QÄÃyò܇oPŸ”¦Iè‡ í%®É56°wrîxï7BëÁ‰'dmÁ•SïƒÌeýSkü‰WÎB[¢G3™ç"ÐWFPFÏFRH¢De¥ÂÒ[ÐI³ú36E­9@³Cf€Ìc‹‹ ±SÅÁ¶}ÿà€pWôêê7DæÕçàéa( V@Ëé"j ßÐLù—ŠºÆF Á_æ~Ü/+¥Úræ¿4à%˜Ä-T¹dÑïÔQpÉÈbî <›ÉÁsUÚ]ªôc&5BˆÅŠèƒp«bm;hÝêä»O:„óÄŽo¨êÝå¹/˜¡ ‰O½z±Ðâå¦5Ñ Çþ'T€; ¹x=§~\Ya6¯Ví Ò1E35!À(Ј>|€!4$㊠w?ô;\DÙGü æ)óµ ćcìê*Êæƒ¹ÝÍõ=åL:‘YtPaAhXt‹M‘FÎÌGôñcúô¾ ðíT ]JðÊ´­Ì-S¬}ÿ[ÊRTxÅ^¨‘U:!ð{à Ž½-hfJ¦‘0©íë4¸‰61”#¹‡Ë>\ ÿÃ2=ŒDL/u£¦¹~ò[‹üeI‘ Žüõ8„`5´Òsçq¼îp±òúQ…_’,\’eWË{Ãhd@íøyæW j¸|û&½ùôˆ8À)/÷e*‡’Y·—˜Þj;@»$v¢µº© edÂŒGæÝ\ò Ín²•“Þ[µhv¾ áh.€,£§ÃÃêë¢ Ñ?˜QHO§d¬Ÿ;£ç;GƒÅ!*©ÐÒÞú³áŸR€ÍÇØ¼1\–&!„FÚÍÛÈÂJœ¢]žö+˜†’¼ª–·hYl2~Û†hRгBÏËÉcÍ$Ëõ²ôµLd"ÙØ‘#´ß„-¥h ¥ñ´â©iî)»W]yƒrj|”ò²€­<* )Ç*ÎpFP䈄ÈI~$Ì<B¸]NÉ»iúª§ËK“4£€ÒF‡½6Þ½¬°*[¬¿¼†ØZ4½ìÿ~¾Áë~® ¸u‰Z.´SEÆ]PxäIÁIL%½Ê2/‚l².©)Ô5Ž\„‰G~Ö$©3|sTNge›HudpÖ eI¡ŸèV§­‹˜îrÄi.#VéIitlOÑ&MÌõŸ¨£øaP^7È M¯Ž”NÃPtdù{%˜Mz7n3E©4(ŽŠ ,:U—ÿÐ@ÒÊ1#Ób¼r}ÚlíŸ;vw׊?È¥ÄwñºðÔkÊÃëþ%—£ïqú ú³i: [¢A3¯pîg2]³m’i]³—™šòùÜ^^Ô¹¸6TËm_A?Œ~¾Þƒþùk$9³&{¼Á„©!hSúhÛ‰$Ú›—)×ã.ÄGO©+}p³„ -Œ¤W Qa,lÙqå0)ÄÆXMWidkt±R"›·¾ˆÖˆ¥‘w3‡,6\6¬ Gúi­œ©b>Ç ½jP¢Œn«]Š¥µÎLa&þda<mžn@o#Èò8úô+óWçaž^¢Ÿ(ôD ï.g¾¡®óÿ¹A<\¢ÿ?ÝDîÄ7ôT”“áErÎ``1 ÕÞLõL²a©HÊr7a†‚åÙ}Ñåaùüi°ÿ­ˆ«mK4—»žo«¤á_W<…]ÙÅ^$ê ³H@+D^nÉÇž=T¸F ´Û €RÕ­µ3ðúhP=tm̨R3ŸH™s7ÈìiŒa÷ÿÎi £d‹ü!ý?Œ¢£ÈU¹˜“R2ÑsŒñ‡ýgcjÿý<«en <ÈWRGØùwl“‚ET —Ó‚ü“¨^˜'’Œ8–—bü?— ?t Œ¨¾Ìõ7«¾ŸyjÏP…Z“¾ÆÿsÏ><„6§]° ΜјԎfi]òž ¨=šÁ½8®aÿ4ƒB¾‡z yN'†coäO—L>à‰ ¬¹h)ìGÇ£ÞÕ¢›6¬³BFÙUç ‰)U鵕sX¬B礆·Ž*7Ãm›±Ô³®‚«4çÇì3Îh‰Q8àk†ÐÝYÌX=âÇ}à««^e>znþ[ÙÔcÐk#UCšH0)H…¢`YEº_,˜·MíÀÊv²v³#¬ÕØ(Ý㬜[üˆôñ•J™ÎµH d;cLÙ)R¶ErU.´b°ð< _eÀcÌa¬9}Läã`Ž }.Db…¤ÜPuµÿ¿d ^ìk-o¯‡L¤j¿Fb¢î[f‰ƒ\´í¿’M'ùsœ¦\6¿ ³Ð‚ßýšQvÅáeÍ)»)À3“a'!¬êplÒ1ônË߃-üטm(,' Àr„|ÂÁçý…˜çeÿ+‡™ ù®hÃSz°`­Ë‹î´‰ÉPv,1•6²‰ÿ{\r˜_ñmîešàn‡7j- Â. ö; äºÉ!÷“.,éAl€WÁÄU'`lÎ?!i³A8îDs7 ¬<ÀO¥ù…œ©šP×ëmá®[vU`¸7¹º,ÿªÜi3Ö½°&úa“|q"Ô+: }hye.|º¡äYœº-…óèç2 =åK.&¿íŒ{ÆÔB·U1‰Š~‚–"'‚sItæ–`Щù¦À‹3X‡ ›%±`t$-ž‡Ò¯\mzËXä¼RÙÀ%pùéeƒ˜oºÒ]ô$‡ŒÖçŽ|a†\B]„’£´·bŒí„1ˆ ÆDÄË^ÒÜÞ›x¶æ­ouð¤V'F#ç(ZK”Ûã¬xPhÒwˆÉ€‹?hÈ%^‰ÇÞ°Kæ9F˜<†×®CJ-2ozÄûà«À±7ßÛ %’\3%ö>Ò54šÞY6®äûâöÍ—§CÐ4/¾ãVMÊ7b»ÙG§—t{¶õ$Ü® úHîòÍ–^ÛCÑG­!íáàwLø{ïGP 2•…)µFŒÿÐ^ÂmßttŦö«ÉÊ5)½ Iƒ®‰÷!lD£­v:Á¡©wcZIÇ¥¸¥{ÙMõJÓ35ï›ÝsIÍú=áàÀnz*íªú8Nr5¶`ë‚åZ!z<45ío*ÂÁ-Áž¨ó^ÿ½Åùô½m×”ª”q6õÄ:zÇ~ÐIh„˜8‘WQ‰Ÿá´Vxƒ³ë?>v!÷©[:×ćrõÖ{ƒ#:±CM‰î9ëÊ2u;,¡bñ»ýÆu0}üSkϩۦ³q£:™%¡mšÙæÇf6æùM³¦:R÷öœvâ÷šc J;ò;‘oémŒÊX~‘ù³Œ õùØ•Q¶v±ãDÊU!&¸í\£Ðµ­jYTÂlª¦{o¬kÿë4#ŠânhÙq±ÿBÆÄ†ñÞ” xìÉ€"©J¨>‰5*Q¤„¢ÚÚlµHQ¬ÀèX8´ÆŸ³P—“¾c‹Ž ™Kûì U¦á|2ç à f‘ØþÂùö}_<ÌÒ‚í±WÒ§EÐd CU¾t”]<çx{1¥ÅGü–N¬nÙ€¤3C–Ë.ÙMSl5 =öZ؇¯¥†âlc9dOí¿CE%"ë½ì[Ñ£©-¨¥+·Üé´eÀö|Ÿþ]ýmµKwoc©Q\ªJ¼ÀÍõí8ºë¤+qk¤Hw ±´×¿t³0fÍèüèÔ›ÒÉ‚R†WjÙ‡S“ åÖ+§7E„5“¢ùŸ°  4wºâ{%ãj:Må ;SHõ6o,ûh9–|-)¦F(ùêTP”Ì3`“2? }_54MFtì*ûø**ëŒVç;ˆuiÈ#ñd¨&õ\I¼¬ª5üt57œeìä瘸 ÿ6¤>q`°pôÎÞC_ua°Àd·qÏ÷‚Äjц½Eº`b¤5 ¶Ví}3`¸pE˜@œüá½×è ÀÝrÂË­û‡Î©’+€¢'¾ŒÌ)Ú¡ç`ÑÕ=µTÆ2&æž™«qÏI1lbÃI6wô¶ô¹±ÀÇks¨€Š<8ï„™Ø\L6îÚã·SNì–µÆ×ž_‘_”¡þ‚M®¡  Ç–.¶çŽÝ x1)¢ƒÿÏ}8üˆÈ#æYALqâÆÀ¾à/Ø"º˜yÛl.‡L}}Oª®;ÃDu…@-§Èý¾áØ÷öMÝúðO5’Qc‡~÷gUâðØù°O'ŒùhOéx£ÇVYIÆRÓViÒ—Õ$¹{ÀóPæÚû~Cä °=Üú Ë[Ûª²ÌÆar8U2ñ~þó;:‚š0jO•´˜Š‡¡•Ì/§Á HdÈÙÎ=?¬eŽ[®…’ž‰H׺wË…ïá e‡–EÑó €Za‰ôN‰±3í&ÁpÏ~U°5`V£œ.: nŽrrcaed¿ØjûM&Ôë…½smzÐ €#"‚Wû¿‡ã´›™¿§"žsŽ%pô Qè \È[/ë6FKͯ\oãĨ·m‡ekI@LpßPE'õüÔÄ K³’ŽåäawemºêìÊy.yCLA>µÐ vŠôÔîé-¾—Ë6¨-‚5À1ŽS³ùƒÕju©¹~ç ,Õu0´çˆW˜+æèîGÕìÍí0I±P 1®¾Š0¨Jÿ¡˜;êæÁ/ú;Äy&@´¦Hb’¡¤4‚/i¿42ÀtNÇF¢h(…ª€ÖÖMëù¾Ô5tQ$@ t-rN{ŒT„FU!*cÃǧåskUVðί= Fzw1C#ÇJð"[½Û¤ñš$w›Lp?¥)Ä€ýc;s#8í™Ýݧ‘R>÷™8óùðMg„<«`Ö)d[“¬•Õ5Ùø÷)››úæ,gè/À‡ ˜ÀÆVžS„ü5w>k5ýsá?°YVL.ý41B’©>.Ê`ñw3yy€|ÕœiS(kYbSÌ„^l”Ò•‹qö·ˆkRký‘‚^p|[•– ,”ìY¬ÿNæ˜wáæYM†Ï²“æ×ÑS4t0w¾uï}ªÁrW;.¼¹EîJJüÚçý“¬í<‚ΟæóµM³³,~iϲ¾`ÈÚ ÷cåV”Ò)YäçsnÉyVt/^~U*áÎŒ•±š7bû8vÕÑÑ?5ucØÉŽ4??±YÓ¼®û›çž7È„9Ð'Í]3{™ýß«æ©ÂÖ¤ï.ïþÄÀVЮ´É ^OZÕFÒ0+@FÓF FÏÁBЪÁÆ щÔ>M“sû()~ ¢‚ø>Tíˬi?’wƒ²-i;vRh˜Î ÂÝ2`ºIMÚê¼À÷ŠÒËX·’Ð-3ó)›:éç‘ù̳ o¥VäÚ÷h6ü¾¨h§@À8Ñf Bê/n\`ø |aAìÿ‚à屬ä5=+ñó°t»¶?â§õôRï:`­j‹¡‹WmòñÉáü‰ú|Ð%(Ï¥¼Ào¢¿ZÆ(r*vÎ (¬ ›ô–å(ÓúòR)4rI~…ú¡_¸†·¥áÄ vbt:TOâÓ¼óÒbKê W湘ŒüŽ»&±£‚Zýv·!цwç“0™“Ƈc‚ÉŒ fŠ#ó•ÞT¹2± ›lUÙ1‹”˜ún¿ì~0ß’°#„Éù§QÁˆŽ÷ ±Gò¼Ÿxå1s°ŽsñÏÌÙ‡ÚMÈeÈxÌÀ¬\Z[‡ûÈš„áúñN4£ pRÏ5ÏBH ô]Z’I'Íxrÿ@{o=Ñ¥µð¹=^¥›®“(¼!¿l>E[߬ÕvÌ ¤nÞv›7g¦*§F§ êî‰FÔÒèåæÐ߇ñ‚ºhäÌî]<[iC"ýööàÎ?öœÑÖVxyÌÊtÑëåsaÓò½ë‘bí Z ë‰:2§76ݸ–åÂÊjÒ&ÙqZŸl•wc¾Z]Cû¡f~§XY›æ÷¥®¥0jc³{¯J¿ïE‘¿¹wˆÒ,•K_‚t’5©„ò ¥© äõv5føå(<+ D.×ÜJÆ@•ŠX¯ÃŽ0]ØÌ·âB«Cä…¾(¼eÓ'Û °ÎHlÊ®×0,©Ò³`¾SÊ. ²tçïã¿C{bœ×²d9<ï Ž¦ttÚ(Ò)ä õZAD#4i@¬½×ZO‰,Þ4á¦? ‹Æ³›Œy`U‡ÔÖ7ë‰ÖM.ÐXöçþ4âkëšDŠ;gÃýôØ<½ÓLØëz®cøPI džO´ýñ ß[²w˜!Žgó¦V ” $á{†–s$rÔ£¾ Œ#hÍ Å×9i¼â$¾ìlÚ[›g½!•¾ßn> È…Áÿb¶È%N8Vÿy0u|!Åó(Ôùy(â9cár Ð\dƒzÊ7xã_ÔÑ1«3²R7˜q3#‰$ ñŸGìW@¦ n¨Ñ¹C ùöù±} q(|b½™ÐP„@ æµí(c$Á€†Ä…Î(†ã†È{=¼m Ž8 ,ĺ 1å2ìí ›:ùÁé:õ·âhXæ.=.ª!|9¬¢©°Ü{ý£Àë­Á+ƒÁ{¯Ê†â§¦ú‚ +í•"±ë˜³S±×ÿbìÓšBn'ü9Ý»Z½‰äÊvZ§L¡¾è|ÈmŸ¤$‡5¯‰5ªICÙëÍvHÖ×|Â6¡ôOœTõ”êù‚¥ë5êj_—õÁ ˜jÀÝióp€ÿË×¶KÉb¶‡c™‹ ›a¹hí1 * wXʩà xö÷1Pt>œåWW£ók8h\süÂ7¡&^þ7tÉšúWëØ£ØÿÞ• Z5~:‹bì¶aÛ0þøttó^/ºˆQeªÞRþÙõ£Ì1²àbºyC0È9ó!ñ­´Æ/t]F„µ>3Œ,ûºJJËsÀGàÅdûæA=ê]ò«m(Í–™‚·íúÉEö¢<€ªA¿ ‹l)š~ÒÞÇV&s]Ö—,%.%ˆ A%~r;‡Ho˜÷ÖÉ$“ ix(®ee!ÍhñªeMÄuz|Ö/IUZÆr’ﯯz÷âØŽ”­xÂÅ5#á¢ÔÐ>}¼¬w[¶EšX‘ñNŠß°H L’X¸l_/¬G‰.”{yež…ƒ¥8Ž#‡™ˆÿ]˜ê#ƒ.½}#ìrS#ACfÀR‚k p"„wcÄ\;ã¾J¦*]ƒD.”@˜:¶"êûÊkÄWn’.Ä+ýÕ‹µ¹5¼¥3à ¨ªÎŽäŽI] úœ©6}üñé:õQW"Î¥?̾G¿uq‚“(žÑsd,ÈhO‹…ºÃ›­™²ÑùN£éÍ`vó—ÑãGŒ²…ÏCHbp _é†8•ý·¸~Òa%ew@Ÿþî/ õbg¡¥6âƒàþMò¯¿É̋ʬ¶J¤7 üÁƒ%»]øcŠifËܘç]´§.ˆ…³p.»¸f]âil31³Mñd»ù‡‚A¾‘"CYñiQMÏlŠdYP\zÔ~/ ¹ˆTnã¡©DŽŒâ9W„^kdF³)Ns¨80…¡no;<þê5Û|Òµ/Wñ÷&Óîƒ$OÈÎ'¼ìø¥h[„ÍV-÷±«bùw mƃ¢ ¸ààŠI±õ-«NFŸÝÙ’çT‡`M)ä ùs’F¨ÞCe³½,º³¼ÓùÁv†7öNì'Eñ;$uˆU~•jã=a÷ì¦c/F ­•äæÙ*Ís]@%ªþè@Ú*áCñ$W~ùë C+À ã±ãÿ(9Û/½ëËŽ¶³m§Þ2´%EùZSí9,yhÉé0q‡ãFJåvyÊ9V²4“fŠ=‰Sg“%¯Ã‚šN>™™ø¢ P™J5è˜WÄ";Ã/ñ”Ù5ÝcH¦º<>^第Xç „>i[i—GLL2ðÈtíÛª:F&Ÿúà Fþ™ÀGƒ¶§Íd"«HÌHbJRÍf&dH³ÚP¬9ù_¾#öK­ç±xúH‰˜46õ$T+v(uåÂÙKôøqì`¬X‡hO„+ÃØY6©ŒÒŠ_ÛÇÑ  Þÿ½S;“Ó.·hc? ”LÁr£oi®—Å1¸,!KÎá‘'€Ù½ì ßÀ©§0ü”½¡AÈÎR9§Ü¤³eUÜ´ÖÂ,ÃÃ2ÅNøù£üAiþnÞ;¦½ç7ߢ5èu·µÍ½·ŠMH×)…À„rC= A¿Ð‡-×Jß¶,!î§.dPœ®X£â”DT•SäÆÖZtåÿø×°˜µ„¥‚Äz|]£Â~VhuÌÁaÖ ±÷±üìúæPæKÛqògµß¯ˆ?8›‡ÝBë`÷f(á +MBìÀp‹«JæÛ»×»vYU֢Ëgx¶À6·†È{â5Q¨`[<Örغ?¾Ü_,Þ·QŽ»ÿ:1{oÌALùS*¢Óü!Zï¨l9¥!ÀÒO;óh@cŽ™ñ¦´°:gê[xø†*Ží*.ûF‡±šÉÎ5} ñ¾ ¶æN¿ äVP:6è]ôëA|1¶$Þ×Â2½­±àzErC†äIËÞ²è€W'ˆq¶­Ë™pZé>À4»oÜ´Y~Š4×ܶ±±@¸Ð­Û—ù=j5<ˆ}6{µá úÓÂ`äN Ú•?j kúYk)+ž±zýÏÌ,ôL£nk ´¯h^”@±—t8+Ï3HÅØð.<³OÉÐ >{ÀÃ_é¹È`Ê.ÌBÜ5¼ßWÆV6oKpÞé@Øi\ŠÏ)¢«Ïé\ïVŒ0\ÖW~Éàa³G.YÈAÊúIiCY•¼ìƒBª£:æŸ1Ëz‘€2wD+¨”öù™„/˺«Ðv¯•/¥è: ¹` zBx$îÞÒe> è õûgGŠyü Ï¦á‡ß\;Øü7ÄP{Á¢/¬`)}sV#O22Z â™˜¨kGáÝIï™h)BŒ= ´Ø·3F€›2‹ QøýÄw!@*ýTÿa°ïe¸›oåA ë–¥d½óR6êNB’µ/‡¾ÓFð¥c³T/ õ&¡ÑÇ)ЦNL¯ :ã²{Åb®ë7­Ž7Öˆ€‹M°¡üÑÅ`fÖ®—MsøÖD޽9~Dµ.š™ëwÀã4wÔ÷‘6v¨ZäJÉr<8£|fs; lD¢JuNžL1æJ¾¹òÞúb Ìî+ÞÈïwr Ðæ¡ž¢¦ÀyÀpb]Q§Ø”5sJO^:‹ô¾Š­RYÙ϶Ê5Ðû?Œô÷hÛ}V¥Åѯ]ú(=öâÖ¢dSR"¤t{»É-°Qù×)»¶ eìÄÈq¸1à“;ýYïž‘¾h)uÅ×Z[ô“‘sŸhÕÏå—¼ÍÀ'z£Ìn»f\*ÉÙ‰¬/"/()å<ŠãøÔçw´è]Ê­!ófÄN}‹¶ÚZ¸aƒ°u› ¶.ížB—²ªªgªï^b©"W¾ÃØ*sq Æ!Àd|½ØÔ:FÐûMìì‰F·8›éÝ¥†ûõÖTd=@³ÁWV¿G4' AqÒÃêvú˜P=d´¡Öì+Þ|8ÿàé†N ^$e pÈ•ƒE%ÕŸZvÒl~úE‡²1 Ãþ†àÞõÅè'Á|Rÿ g ‹ñÌûä®ÝÑ€} `êWŸ.ŽjolItçß[š®°Ÿ4WüŠÉØÔh€÷ÄXã|÷¤Lò@”™(³(ô¸W€ÔTQ±Ú)íæf Žß“‚hPº¼¾šÚ—ÂmÚæ¢¬7ë$ð˜aƒwG·:ÊEE\裱x¡ÇãÄÊ嶃•ÿM ä]r`Cž×;J›ñ-é^„È;Ï’ÌQíl“> `•)EÌðüÝ„â1ÅêÞf0)¤iÊ4X‹DµDð¿nV,ÞœâÊQ}g”­“ÞÔ8› èO¸öA¹Šd<A2Ê hób(Ç©^6dÖ¿–'˜úèq_¯4vt‡¼ˆz]§üå2ô Ä Qñý_vc‰vî ®*¾"&ízíý=}3‚&ÍïÿC¾ÁÝKÎŽ}¡+ëÙéE£1ß…xäp ç5± ‹Ù†ªY¯Þ¼x.óc*ãѧ%=‚ǦM>³É×Wô9Á‚cNÌ7d’ ‘¡žÝ„¡iŠöƒÞý¿åP’‹hÁ“ìûnaÏÓÏ,±§v›Ñ/-æÇzU ¿:×ÞÛ ’-[£zÔ̵«Þôݵ™ 5év0¯ )·7C¨µ™åƒ³ÚSòƒÇ4}ÛUÚüB¼ŠSéŽ ˦ül¥É ©äúàhÜæn+tlƒ÷ >Y¦µè³-/†ÃP+$éÔH´?S ´ê¥4â+:~]`ÅãÍcßíÆ;S^X¨ñ)„©ÌñªMÝŠ«.xоùr| Üg_eÇŠ¢ñýìâ° jObˆÇšp fQ½ià‹±Ýí5’²ãf߸—xWpœ†0ÌPéF~ßE œ¼Ý†¹–Uá²:žë¦yR¹þf[ݧÞ¦b+m2ä_ül'¡Àº †D•c…‰RI÷ SŠ/5DÆ?­w‚¨´Ìÿ0OHìнñ4:ˆ-D.ârî€>„i§dÏbÉ% uÆÊ&å`ÈÍæœ:ÂË3¯,ßñ™jäa~µÂ+›ïŠ- [`E—ZÃÔgnZP¤ƒç\°¥-ÊZ’‘¾*÷óù±3P´%к!1“&\Ðó"@a²bt:Œl!K_¡Ï·ƒK¹äÎ —Y¡n^©ê¸ºé³‡›ᮚ|µ„›ÖyzˆøM>+q7A<&aX™Õ „›GÔÄÈÅÆ²Áioì*¨eÚ°-'@;W¿Ñâqª«3ûTçœ^+˜ä%,æ›´â[ ‰²¤ÖTÄŸl‡n=vf=‡ËÏÉ}v¾ƒ0ùûѨÆö66¬Zµ —Ë.Üáïxù'3ï©*G wñO÷QžùK;QÑôh%ð¹}k$3Cd[/‚ÓÓ&^×Âk¶°í«RBè°Y¿Ø•…qE>d0%)’þýÚ‹ŠÿLK¹Ùw¥‡± õ° ³äQóädo¿l5ÿdº˜C{ý SÊÒø³ÎЃ°äú¾ê™ày ÃÓ ö“M`nø— —Êa]i+-3ë„$ºç’®5$,6iˆMÌͺ’U&£Ñj¥>×+"p’í€/Æ“Ȭ#þŒ?@à^"fÊ¥y–Òé¶½^…byäcÏîÜÖ >òÝÁéå”\-‘…)°™0äöCØ@é®ò;gŸbûM­ÓUZN§,Ÿ¨—H[‹¶Š'°uZœ'Þ»iU¡Ñ-æúíHd€ËO-úôª!íÚùh`2i§Ÿ Õ$î-Ø0Vjl‚޼„`Εæ_ÀLæC AßÇ¢!DTž­ i'Ë‚‚(5¯6´uÀ–oÍrWñx†À;æRØcndvJ—}ÓiÉUTS™ë®¼‘¢ËÜv†&ŒGÕNŸHö CëÑiЪƒÜ :£„™©Οúg­hKù˜E1”¦8í¤Á7è‹iõ¸X‘Œ™jqŒ,v[€§N„]Üi,DG®¬p_&%Kd £bK¿Dš“9öã¶ áš‡Ž¼aú•±Yãk Šñ¯²Û÷ÐÑ*/ŠÆæßÌtn!| -,Δ¤åö±wÞjòïá vd{Ìä¯'¡ë¹16¯1Фí2¹." ¹ç­TÅ;‡;Î"x(í‘MŒÄ¹>®kS$†uôs–ÐŒûOR&žjpìUÚ2=¨¨n¦²Ë@Ó^u£sO‰]Z0r–÷íÞ™r‹‰U^Û‰JxÚ ü»Hü@Ô§‡1üŽÒñÁ<™"ý/Óês›¸Ä™ã~ƒTO±Íí”*FšžlzÞV-ÿ¤ºÅªÔåžBíw×–+–zÛýPœƒec¥ývÖ]:õŠ~ôHâpN\d­ÙOÍÑd pûÆLF›ò/Wa`bÌô´|æ÷üv±8p›lä1s¥n—¨õ9 »V9t[Ù¢ëï¾kgñ±vüT“R…tÆÿ&„T¶­¦é ŸP#5 Jw¨*›Àêƒ&ð¿‰ì!‹Gñ·s±L\¿ CRªFü=×%&£­³l€FÏÝý‹YfÞílÉ,iSRÎëƒºÓ 'ÜEsŽÇîLÛ¨[Ÿ¤Iõ$z“ÉDï7Zõ!T6É‘iKõŽŽ«ç«U6Hþb·¦'°9+n;W¬>m wü÷à© òûUdòĪö„¯¾Ù¿ñI ±‚¨0/ÿqc´Vâ«Iï‰"´+H¡ëLÑ›O,œÆ` “  ãoè¡i¾vǨ D“ÕëNBÞ‰Z†K‡A—Ù3KúRŽ—ãñ¡áŒikn­ü·¹²"m§*¨òŽVbqM‚Ò‹ÁÑ µ²0¢„ÿ`»/†¼×oe‹¸úzd$ƺ,Öû<§õ8qñêÖ =Ø|ÕE• ° ¤3ë¢ë?Œñ…Z¸+ px§¸ -ˆvCÇél‡ ¼þH˜É†¨ùÌÙá¼’*¡<#d ;Êè_°3K‘#à6˜oÝ`‚×_å¥þܶºñ+&üÁVÓÆÕÚ€mjiã¨uÀ3›,‚U]Mµ¦‰?FêÌy 9ãvVm[ûÇÈ‹•b‰ñ¨íYȼy…kOÖx¤¦ ÔRPe  õš¥~õ…(³“ÿƒb¡u(Ý0åŸ ]3·úÖ“Ûèzfh&L}ß;ßSK½“ø0ìÑQO¬¢¯xp«žöžÓuŠ@ÅŠ»l‹ìƒ:^1ÊÉ Öèñ¨!òÝa¦Ò½ÌvY¬Jjÿï:^òlÎò^ °Æ"ø1±lK[v+å´âÌîK2i,”¯ ßÒv_Ü4jq›šF-衽=c têýuø}4Sà®×­m[š­‡þ!Xkè/½*Ù¼r©Èô dzÛYƒ€QðL>”N»6â ‹-c{Ÿ.Uàw`ÿÞÕ Ù^g…t.<ñÝ›-¨™Ç2ÖP°75)uƨÍXÛg)E‹_(©g¿m²žäûìveK@z>ŽY•ÇHͨ£Ûì)ÜŒÓ9±ˆa3óœÂñwK¼£š6@Wξ+5SoÛ¶ ýF‡5P PÿŒ«T ËHjhíÉß„D8ØÔÇÏlàOÇDcz0ÀªïMw9zÓy¥ñlR¦l‰ŠöŽèú(–œ6€q‹ºˆWÏå¿x@àV8ˆYîîH­¹ò¼øÕ~‘¯þñÀåsñOU»5ŽnŒ€(´óZÓrŸé›eÅYç~ÁJÁzá¯`®¥uUBš ÝÈM²âñG2=V@Þœb\ýXƒÙJø„ÚìåQ'’Yë:”¥4(ï¯Äy¡jU{1eF;& Îßu"ÛT Ñ/ŽíïvîÁV|8‘^¨i]sÕu‡#•_M°fÞ|϶KomìŠÝ¥=!YVWyÊx³‡Åa“ëý:gë^Gm"Ö*<$‘ä7‡.Q–WÃû ^dü0*YY+2שtÆ0/ÔÜÿgˆìÜѤçùûv=øé~—$ä1–‚‘`º€­#Ãðþ-`®÷€(îiê[ÓYcŒî¥A-\HÊœ:k„3±*f(Àív¢²»¯ûAÐi`„’áÞé4¤}3'-–nH¦„øÌz3/üªÜõß ÉzýGåuN£z>˜GÁ:A5)^d¨ BÜYQ[Aͽ»èe4éX «à¾r¾Z­R©¼ŽD!RŠßÚ˜ô¥?ú9¢_š}I=¥^6%È2èöÕÝöÕ‘ŒñO…‰T\Ù3ý,>yíÁÔIfVT•½q9áýäqÛÛ\+Â6jm²oá±)¨ó;ìó*ÔåW·ì2~¦ÏÇoÚwXÞ_|Î73x0L­Ï°_ð,NÉ8Q†É"cõ§”ÒÑá63ÉN3°h‘7«´Ï¡ÿ&+u‡¬b¨=?·Ý—*ÂÛj¤ëšž‚jéíÄHrŒ(µE¥`Ív®Ç‹¡’åö€"ÓL›ì‹<þ\¤ËÛ.y( :‹=s½.ÌÀAñû\G·§ËŽGß›ÒT]­†‘¨Ê¢y'yÀþ÷DƒXÑSWñT‰BÕ‰_ ?C>.þÚŒ±"²~­aφªÞæt‚_;ö‡jÖ÷Œ{¸…vç}˜1.9!´ÿ üÌ“€Ç•¥Å³™É½' ‡o n*sõs%ÁzyËvÎéÑÛy¥î…Û„‚=ðž_¶ŸÔD —S*%Øöâ¦qXâälÃm].Â;˜zÅ{ÐÍ*–>Ù~–þT,ŒZÉg[,•Ã÷t)®ª½(Ø.UE™®`ˆÿªöŸJBêhJ¢ÏmÞ–õýfáùËb(º¨&f.øU„敎¸qxÊÐÖË^”DÅ'¿dטçc– ¢iy…'—bðÿ?9D~ŽÉ /2$¿®$ùÿ—5Rß㱑u[êß"žroó$<Šº‘¥íí\_ÐAsᇰl—VTËAo[àÊ=òaµ“¦v8CëP ÎP®ÇÝØýÖ„‡‰ÙCÕÈUbáCP¬­6k ,Î “>ån}ç²û٨جÔç ªlÎ.¯®æ68&³j®·ú¯°}›î;ÅÎ~Tˆk᩺&Åý$ÉÕ¹6ÀMìÉyY"džóãAØÍ}WcìŒ3P„{qì½ J]´M ugŒÞÑ/€±ûîŒ#Ñ‚åÝý0H{þ™TÃ;LœùúE\dã„#'†:ºéáϱµŽš{§¬ szËê/Zˆ £Î÷¦å{Ö»Çv8ikø…7hËï´Ü—‚ײ†p0€˜¬)¬¯¨Z·~jpnóúþ,¹¨·g‰gaJÀÌ£k…dY¬ÑPF¦Üb`×ìtš­jÐ;Æ#S&'|㛥›Ç-<#Ãwñù#®Í6¼¤X9”Ì'vAi|¸û¢E¤°WÂéÝÂ?‡Z¨OùÌØùX/ÛÔÂO³ny0•ˆ:»F^ÛÅ›D¬ôR»îðoÆ"õSÅ™ù±/@†E¶ª^ý?ÂÌpBŸêK]s9¦ÜõJ ’xüÏá³0<6†\³Î8ê7ùZ? –VÀÊ ÄÖY• Äd.é ¦´Œ·¡0 $è샥‡,VΓXr]¤ã qC[V’?eêOÐÆ¦áã\٘ɱ-E^s­Ÿ6IKîñ›)¤ZmçÙžìà­’ùðàg•tÞdYÜ^Ì{sý£†˜cË÷]5’THüæqœeû®§xÔjqmo’ï`Ö Ç:k3”/ìQg‡;—”?(O}c㎀ýWX7;ät}76¸i¤ƒ¨Ñåi¨øºV5ÆSxÇ›xŽÒûøbjýø nɸ5Ö¼>øÎ7q±Y?;a°ßªŠÉê’ SÊÅ}~´ú?’¾_©ë.ý“—ÏßaiCÁP aÌ[½(’á Z“ FZYm]’Z‹Uç+‰¦m±ø0è!ŒAS [´EPO°­ÏÈ?dp Ú—Ù‘àÇ,ÍËà~HvqFF®ƒFr’‰jX –b|›Øp†ÃlºÜlO9*Ð7ò»Ç"^ÿà+è5òžƒYÓÑ ÄÝçó5WA–GÁQ¯%t 0â-ßs_2ÞúðÏ­Ô n ‰•b¢‰Y_bz†w²¯ÀZV@#˜˜Â³Šà3°E—W“{ÜñB);^7ªãSÝG{0ÞÎX¦IOrJNj€[ÂãüÍåÔ¯3ï³vNÿg*;MÛ`¨HƾãÇ/n ¶¹¨œ$Q+M™ªNtRœk19):޲IuÈeþå&H!¦\Ô*øÉtQ?^#[V1þF‰¸éxÉF kÜÁyo:ç¦Çqz„¿Å¨rÞ?ßr´r5È]fEŒØ·ÍX•t[ Têª{V’cî”~¹oôÀ8Âjÿ%ï8Ų•%x·UÔVÿök9óC?ùl_+l]<&f‹ÀT(!–¡h Åòò/aí·|ËâÅiðüÉÊW ì¢c\zå?ÔŽ„»¡#ÎÔ.Z jÒ]™±`çødÇñS…c|GDÈqÓÈÁ´Qe䯒"JgƒÞÅ?–%[è¥.eјbæUrõIÞÙ _ry¸%üÇËÜH*ž¢¢2ŸH)—‘´R¼Â£¿Åp¥À9É&m_=n}7Œ÷ÛÎYæÁ’Ëh›n’Q  çñÁzl/™†¯Fü–Tw¯¨Õ £Lþ©súp/ð”M>gþÇ™aô}‹V‚wZÏ5Š÷x“ÏÕoÄ/ÀvDCr¿’­€Â…áJçRå£qéf1Yõ¶+Å?fY¯Ã7«ò.X¼³Üôwq7úx­§õîÙg0àØ0fð‡7¯ìÆ›® ts_²–@¾Š-¤Xšú!=ÓáE]k†@²ifáhçovŒ~uÎíîs9Á×£•Tu ùàØ‘)Ê&XÐ-DŸ=›W¸$6eÒ‘Õ˜m°•X§óß¡ÓQO>Ï÷üôí$Ô–È“&=c¾ñ©ëMªØ>c2ÛxAd•äÛÍ÷H~)zÛZ×]Ìü>574Jtÿ+8‡¸=šë3ÞGzF¹¿.LWœÊ[†«v !}]X›&Îð7µÜŠ?ñCí§¢±PM«ï3Í1ú#ÇÃë%‹°râºõQ’ǪþëyÄ-'€P€Êí¦hŽýSe°!àÜxp¯kù:š®ïô¡e}œ!/D'¯ºÏ=3ãÚ…ÃöjlYSû‚>6&šõT —š,æý` Œ`ùù­ ÛQ¤FT=o ×[4˜™vm&™C‚¡2â/ûyfU@¬’%d„µb`Òó;<º£`‰aƒî9—H@Zì B‚ úh‰ãQTèÊ—ÓB1Àøõa{Ÿöýb^ØôžcXdïêñªýÑ·#<•û}ºØšZ& †e}»Ä!)žçØJ›–´£ƒ_…)yqhåd1Ž‚í:ŒŽì£)HiâúàKM6¯yßQÁ”ÇO/Ô~†\¶òÿ!¤Pf,súÆV¢(øWC\*žLJBRîk<녡ʃpÈÐ<‘Ô*?TaLjùù«(N7Éaô>–7ˆ)!1(±‡¤­ÊQÕsZw{uLÀ×Ò…qÕ#—x¯³JårÄíôXjÔd©ˆãIWJ¼²\ûš¡lC™;E¹iIŒŸü“KÇ~JFf ~á’BWóäé…SÁ›Uç¡)"ÐÅnáË3!‰ëí0?b"vÊÆ6ž³Trq]HIÊ>©)e£×î=¾EÌË 7¢L´/ÖÀÂr~u°¿$ÑÂ>½Ó±~×˵xðä¯ìí’”ð.Œnr.±ÌUÃá*©ÀÝ6Œn¼¬¬¶Ùjfã<¸ù0‚Ï–…Kø­_/.¶²*¢ UEœ9§\›úpí®ÌÄ?Þ¹µO=g¿€ŽØi#'c­ËUÑÆÖúr½E€P!÷Ôï9É÷÷!H9·-ƒz^T’YÅ|z¢Ú "úét 1šôxa$ t'iññ?°ú¡Ç-Ö]ýûN;®Bà®Ã@öm…6@LJÃïD‡ÄX¶0ì p×kü¬X¥bI4ë×þäŽ7iC“Óåñ”ŒiWÚßOÏ~V~7L4ßèNædcÕO™Á/©×B*–‘: ÄiÙ“o¶’"Øk edC ‚q/üé£iø%w@SªDUP¬»yv¶å¸§ÁØSÉÊ Éúfþ7”‡ð™Î¤©I@øA™£‰BRI=ÈÛsÌåz|Ã?Ðt–µk)U"yñOØòóÈ€ €.çOtŒŒó|óìçSX$~·h)ÆÅx8$€48Ðs ( '½ ÷öc ÛÅýÎ,Ý&f ª¨ä46WîlŽÍ½è­o¡1Ù·¨bôHmµrëÎàÑø£yh¯5oú¬[~¶Å„’ß”môPÏÅÝ÷=ÖÅxYL2¬u_òÃ\l· —Ù¥½«n`”a¾M·÷…Ð&_U$=$OÄ0ø6ƒxû$GÞ å5¾¢¶t­¶éîî½ô‹ËZ‰X3¥+œJ¡Ùk"$&vDOM&‚‹TQÑ’(¾—ƒ]Ø „ƒæEͯ€?ßf¦ï\¬´¦ÐËl“hã¨@€„¼,†'^*ðˈŠ7ïÝ´í £%¯°£K\ÚãFÃÖÕãA"|˜½òû÷jßC^·¦ô=xB€ÇÏaÙâhãž ´fV%âÛ‘²ü@sGï¹å¡¥î1$ðXµÄGõBLjÑ@1ЇLÖ½ÿ¥âÉ—&\dB¢››¸·ò· i÷Íe¸„¶$¦€°ø»fìŠÌÎí2]ÁTÃ+æ™!({6àˆ?¢mŽ6<‹ÔÖ£L • }&± ~°8‹ÖðNžeÖ†¶ÛÖ›bpc³„&{[4û 9†PÀ‡4a|á<#$4©¿m2~ïC à·¦à‰•D~ÌE„àBv9Ÿþ nSaÍNy÷jˆ0±H¨³Ï‹¡È(°Žø’_#Á}!‰ú,´;„b}»]P–Âm˜©\7§ÿž×÷ÄLeUe“³l~Ä ìü¦æÙÊ;QþëŒùBï¡)â\»uÓ“âB錒§Å(ÊKï€ë±þõd/Âf:ë~*Rñ@¿KþªGmYÂ]XO.Eƒ³o·÷È͸Ú]â ÝnA‹åæ½ö!lÎÊ^]¶D,‡˜üýGþ´ð˜†Q'³~3€©½’‘v|•º'Á ü¢ûÚˆñ£IìÈ 4,ˆhàL5Et}Ûm¥bµê²RNlËî÷ªÄ®HæU  x8¢Í öõ™7o_ÇË÷Z«"Ô,{2  C”'XBZž‡ÚóÁÝQñؘµ<Çuhoúõih^eð¿•dŒÏË»T0:o€¿48YBà‘^Ø¥=ÿ§PøGîM¶\œ€âU7ÿEÉ«„øWL®o"Êq¨k²* Z/½0$Ç=ˆxáKí8årœ­$HÖ$n†$¤ 8sê‚´ó9e¨f°û«.tˆ€3Z…w#3V3Ý=Iƒš0‘}Ì|]èhÊ=ß¿wô…73«[äþ“q*híD[4‚q£ \·i:B²Ì9U¼JðnJVmŽù„lˆ­rcbž§jNȹùý̘ÂtO| ÜoË‘•ßjòð5W4á#BÇêЉV©´ÆØeð2€xHqÍ¢CË •ãí0jçvŽÈö hßhe®ø’ǯ<9sàl’Š$A) èÌö.ø&æŽçÈXgŸ ņŽ.ÐbnÍÐDû¦/uÃ.>Å|C¿9xRÐvÊÒl‹frLò܃YÏB=Ëxê…·×—?·t‘ÁU^æ7´¾´ÅxE`ÀR»•&\<®Ÿ„%Ê9´¬l%+œÅ‚Xª¯Jçý>,V€Ç[pÙÙ /OýÂÍË_ã|y1¡º†ÞtMS£]ŠçÂw¢'ÿÎ ’¢»eˆø1 Z«WOªtèõ¹Í^ÒäÉëÎP€Lñ’n¹rt§H–aÌ@ùψú{~ÉO6zN‰PUµ¼ZqïÅ[LÑÆ†:‡åôˆC^õ¿Žú¥$ž·¦`f,:]+NAêŠ{’Úhš§¥bŶ^&àn ÷RÐ æm{@F{*åõÏ*…[<Ý–å–à%áxY‚"{ï–ô3ï~¡7šþ_,ðg¦ù¥‚ª§œ3<ÙˆÿhYW!J[ÖðH”|‚Mxd¤×$(•Æõ“I?‹iÂç[r?ág²3ÕQÌR–±˜ ®ïA ÚÔH€^ lòÌ/XE:Qsz®* ‹»] /Ør5å/Ê\´MZ‹Zâñµ¥këg¿™§+P;]/Ä…2_¶º-5Ï~ Œ'x?ÎÆ•Ï‘ ë[ƒø üÃNE]Šxîø©qPQÃ*}#“ø&Šˆ¼üŸ3bIìèCGONd ¦(£>½‹agÕèy¢ãß2ÅZÄ¡ÖÏ“‰Bô žv«ó-)Ñ“È÷J+õz„6ÂÃÄc‘«æÕ±¦ik–w-'pꯆ-þ¢ˆãåôgÆãsW"=²Vz·…ð©Ú¿:Ùͼ]E¬Æ‹m]öä.õ¥˜­d¦R—†˜ˆ[ò‘˜>1%¨£ Ö\$Ì4½ô°yS ø’]wYä“5ê`R ×n„\äê5ôÎNÜ/õšú|0õ)è®eÎ Õ‘0 4Gt;oÒ5Ý•5kàº; 6çç§kFlH;Rª»m@X/6ÎZQwM¿æ ð7¬„Å4­á3 ¿|޵–wÛÇu¹ªÌ¦õ˜ÿ‰-D÷fÓÖÌBë²Öò±ê†œƒƒø;,“òàå³ð“q¤èY'Õv:BÍâRÁïT)–­‡@ÈÜÅZÿ÷¿›ñèóf(½šöÕxçZQ»•n¤…>žQˆ¯ØŽ¨¹Iœpê¬xC©òèäPÎr÷ßò¶;éb#¤§—â0¥ä5šµ¾ÛD‘Hû¿ÐâÊTj¼¨ßw[1†Õš~.‡{íÑŽ“vqõ5=J±Ã‚ápÛ‰ Cm…gÜ€eeV<Ôû´d2´*Må‡éÏzÙ’“„¦žìû|X_k´j“S~ÚìJ\%Q:„ÅœÓL®¶Â6Ö0°âI†߬f1|äÖx¿ÉH¡©°“¾¿Ú`o­Ÿ)œ°éF¿äôÓŠU6gÆ-%€äQZT<’ £LÞÎW}µ-ûPäÆ˜W®EýYÓ%<¶8O ’˜vwˆNÆ~H¹„аz½cʇ°ãº½ü?sj Ë ôéÙè+MAïbŽ °ár³´¡÷ð¡{ úŠå©ÄZІË8yˆîâ0ÜÕWÎý¯ã-Äš¶pL%HÖÏܲoÉZˤLîꎟÙ<^¶d»9˜¹ûÆvºç#Fù»xÅzçÒ¦Cò=„­waÚœfI4ù=½%Ø¥³¹JõÐÄj]‡K>,;ߌeà¶] Ä”ìë8}põ練ùpmËL '¯:_')¨\ðíÂ3äû~:ÆïW­¬!×:k“ÝêÞâj¨vÊ4©wzõ†>Î\¨—á´îöÍTàuA®ß#;Üp6L}:f¢öLŠÇ¨¥s©/ÖþyT–wêd¥ÖÑèÁbä9IÅ+u«úhÌbÛ1…FŠÍ+2à§°ã—±ñ@1­‡J[8±ì×{Á+°ë¢ïªÀŸÁ/¬Í‹G¶@Ã08½O¸f«’êŠëÈN?µoBJXø$K,•­öÝ<0 4Ý8Áݨ"é´€6`‹£_ËÕ íêú!S«þ‹ÁFø–Ú!^ÓÏ«ò/tIÌI¶­§NŸnQZ å¾–ÆÌr¤‡‘¹Ç )–ªO£u-½^÷¡Î*äú UŸ m-‚}bاT µño†SÜñ‹ÄÖ ¸s@}Ÿçq¬s ȯ¢+fYVŽ"P¼2¶ÂF)u¸Ú-”Uë@ Èe½¾»£hÌœ¾å7- ·Àþ4ù^ó»™ ¾}á§YŽ*?‡“€ûY)Õ¾X[tzUÅÖŠA[9¸ój¨Khe››&oÆ„4V›%!‰‡,¢ôAD¤û)BLy‡ÕÊVô÷ÑcÔA¾ftÙRäÎÞ³>ú߯%=_C{À¬*|ÌÔˆhø<;Cs,+œÃ^|•Û«7FVžk¬ÜA¾ÅïÙr) .K¦zAËk,Y}? äï‹îðbbm+"¡LØûšpïq/¢9‰Æòˆ:½ ŠTÌB2Mgtì™ ÓKm?žbR½¡Üc[c%D–gœwIBŸÃ¼³¤‰ØsIMÜB:m†äÈ¢x÷’¯÷¼r%ÅØGZí]rjK€*º6¬ãeÚj-Ÿg ŸÐ¥½›úX÷ǪØØæù"噦(ét~æÛ£0ºœsÓ“Wƒ¶®}ŽÐbUkì¯W+¶éÉŸv«-2oga•Ý~}±§P }Øv;ª…A„8é+šL¾kbíeòÖG´ùÞ;õïX :mJÙk´†ªx* VÉ„1N߯ ˜¸½kt9H9FøTMœŒ›Wæ&Í+X]}·CyŠÊ!dß?4ó(îž»Râ ÅΙVәʑ4Іäodæò6j'ZصR¹x¬ld×F}™= ȇ,óxEôŒL'ÿÉ…eÂì¥E²ÒÌN–2–%èýÍUrA§\`TïVü7& ÞüçÔ3Ìç­<؃º5øàÓ»~BËŸEíqhÏ«}>˜«¼[ ×¼ GÊu›±/»à{TÓc„Vœm¾Á: kº©^ÓÚÊÜ®©u”éE(°j ÂëV ·ä ñq×vmKn:ÿ‘¼6—ȃ®¥fXðQè¿p™ëÁ‡u5ü%°rµpzÅl§)²¨#b‘Yþp\õ÷Bë^~ ”ëþ?›¯Èï_bŒÇüG(¡Dùs7"ÿ¤\e“~~8B9 ÞÄ¢êIÜ—zÌ[œ²:6aR?4(C۞ߟ›9|„¯Rµ©PíÅèW{}/øÛƒ–­~4£†a§T’$ˆüž”ˆ·_\Àh {_w…[î°À9]±nk$÷˜­ÅœIô߸Ÿ«ã˦’`#à"ˆÎŒ È~ÒÍÅéû–Hîø¸ÿÚX“–Y¹çíîDœaÏþ® 0>¥KLãõ´®ÃÛ³TUg"^ÿÑþ5.Iœp­=1LP kE{wXT[Œéå2ñ,‹Í¸Èý%2©Ôg/ˆ7ßù('‚YyÞù†Ýr¥»J|µÒ,Qcµ)±ËÅ „#œ°|òà8ÒœÛ2«Ã•O«¯nrûœÍ”ýuÓ¯ñiŠ#+¤:´Š%IRú¥Mž«ÄG‚X?ÙtÅÞ¥§£Æµý¯Ñ¦Œ6<²<µœ´#ý²‚¯9­ë!¹º BbŒUæF;]”îÒÊ™T]\˜ðW±n$ªþ)¿p ÓLˆÏ±†RVÚRB¯,åu¼Á}òiÄJº"醑ٵH€µÈZQ~%±¿<%3PbÔS›À$æÿEëÎÞÚ@Õ– ;éQFtJB‘ø¼°\Šªœ_óˆ3­™V™(A:?<kfÀÝfÆäUÆŽ “Ùùð}l¶ÊdE)ñAck¯ëƒÿ¥]” ÞýœŠ>–9pý¶2…3§Cií誽‹Ñ<6±„ÈŒ ³ æ šÉ¥Ž~AÚzƒHn-V!¿…·¥¼RÚse†¼OÔD§iÓŒï³@þ½O{ºÆ^AI#á&›õGþ´Ú;eÃÎpùNa‚R-*ÖoWËÑUdõñ2"@±>ç£ä«^ô‡ 7(éÌ:E#”<žU8¤ ¿ØÑq]žqÃ?>*‡5‹äˆÍε%µÄâ6š¦ jîÿêZ7Á.Yȉ•¢Ù˜Jh~Ü —GE^Ÿô|HúûǤ'U*Yežcé¿*,žÖ Á@EØÈÖw›½å »ôÇ‘.i³ëG5|ðnPæ?/Ö*pØ B÷eÍép¸Š@–µ».½aéBJ<ù–†RÝ,º/(ßQ¤“‚;têzÈêRMÜžó\÷?í$™· 6ZÂg8í­Vd;3Ý:ˆËeÀRɦ{"´Už·Íþ¬wcO‰–yªýŽÙÅÌÑÃ2á÷R¸{þ¹,Dª‰°á-כɞ.`ñ©ç;°CPûç#Õ¾fÒG(bê5gŽ+ -+õ˜’X|¬ug!±¦'ÃÁ‡ŒôbÌÙ(>xuLRñ#•N\8ô|xäAj“˜u_O™òsDÛ\ÛhÈJÔ¿ )z;Å¥6ƶӟÇÛÉGÃEÎ}V¼± |o(¢²žö±£÷õð×wìÄäC £ÑÖlÅK—ÝpÖN@éï‚ýoý‹®.A ˆýCéðL2­¯WøÄÞ÷IY¿*=±Ž:,ôëò)[ÿWY§’æ.j•>ö@ôøeÿH@£ kKƒpn4ë3ûpTBlÿŒµ{»¾ò$qXÖaÅFLÑ•¦—§:3rV!›¿Ø:Ì(–ö€iDsÁ Ï á,1L˜½‹Ó^ɂ؀äKÖ­¤‰·–NÌ;…x…ˆª…lGÌÊ@S÷0|ßœ¹†¹õ¢HÕZß­ãfÞù8ƒëƒƒ(8ë)dÁw¯<«ìƒÓù´Ž¬Î­—@ÃÝNÇjÖ1R¾çÄC˜íRåoÔÓ½GA~/1ûåE´Ô%¼·„Ëš(óx|—‘FÇãh&ír£}:*žyýAÀÞ°¥ßS6>gv.%PÉ[„½.ˆ·š*hŸÍe„ÌMš ߃ ‰¯÷SGg,Þ­u£žÅ·2黫¼´¶®+í÷#gëbÙ2#`ˆ—y ôøŠ ]ïýµejŠÐµV¢ÑÆ{êowRªÖŽ·Z‰6r¢·#Ê»ÄÔhÂGît×…{£9tŸ¸2¼ VÜÉûŠ|õEe¤J@"èî‚ÀþÜ>°*€dOï`'†Šnò+ÌemoYß-G“®Å"HúÞ[~þ lVDdöC€^ÍO·›ëñ"ÃOÆüÁâ bsþ ÿjÿ(‘B˜ou*â¹Æl’ó¹'a¤c_Œo»Û„%6ñ,'–+Ó+2+*ºßS{|“v¨<ò°Dƒç *Ì<u]ðEªU ]„ÓX¾‡Åf\ÎBfùÃT’-ød)I‰ò0›§ìJH䲓åx½‹¸½µEùQzÅç ósò´\ñ<ÀR)i4o“&Œ©YîbýÃDÄhÀ~lScS«Ó(zìÜ©7”oĆ’¸®©k”Až¤çÂVØ—’I.‰¯L&|'Ù0ó©Ë[\´ÐÝ,Ë"É"~›ý™éÛ‰úkµh)kgÏ&çRx@^ˆô7–½4q0ÑÔ”•£Á~º¶ ÷†„ç+ç—f9n‹*•Ùà¸ç"Ž^"`ñˆ/n h…²Ôé×Ï#Ÿ1½éÔ yñbбôp!I^žjÄâÆp`9$è+Y³-Ý9Ï rLM,û´°ïØemL`¤Z\ºJHy7öVcêÓ¬™ÞîSæK¶kûgY²ðÎÙ®ýŠwÓ˜ékÞÃAhÆCÐÔ}Í Ü¶uà Ç­$~tÎI¡[µ±è„?Ð ]ÔœÉ2©½Es-¶\CØy9ÿ º|¢í\ly÷lK…/&¤¾£/2ê¶ŽJ±,MkhÙq†²£þ6’noùBxD›pËáʨ_tˇÑçXP“æíä¸6y±ÓªçËwóš“”Àj¹É½O{«ˆ‹»:'ɨŽÚ‚¬åˆí¹»ôÔºMÛ…ÎÚ„v…Ù£1vÍ7}riøŽÃÎB øݧûHw' íó~/A÷BRË6~yQ_;®»lú»[¿ŽEÌýìv”û'|*T•l?«: ¨áT)Ê-ù¦Çy¨Šr¢à÷etJ¶è”ĆB•i½OçÜÑÚ-YÎn»Ø-º„‚$²Ýø¹Ò™oy²ErÂÎɄљån(ÄÀPSH®¶1ƒ*Ž¥N ÏAõ_ ¾‘Þý.ÐDe©È7à52—ûçm#ñÂ2÷+Ëðj4àz³ûˆMŸòÛAM­±‹äkµÊ§Ï-òF&wýÊŠþü‚ÊèÉzAÇ%®w +8, o/t—¨x8ö¬'YV€Íà ©v»ø›èlѲ2„zK§+ψL ù•@Dx'ihaßUüöÊ_!ëݵ©¼jS©‚™Ç2¸½õDÞbí«"©‡Æ’eM Mð5Éè¹›àT›¡#ŒmtϘkhÿÐÎyüå÷l„ŽË«x¶Ï¿AGî&k” ¸/®óc2q)šòî¢R‚²nž€`0‚9í¤5…êËrš’[ðöZXn‰4lT†ˆ•èÓÏÇYü[ìHâéSrIv4l ü<¬ú¸€ayF2$Å®ð–ÐM@±Œظ© ™wZÇc?ÆG ßÅÉ9s5oæÊìhç²{‹iÞ‘Ä©’@+Á´ã#?÷ 2-¦GôD y6qÝñ™ìOJ¢­âèÇx¾ïÑ@¯ H©Ë;¯ö‹CÍc–!ä±8pW¥|•p£&œn B:1€)5Ë i-à‰!ü ½·5ªˆÏ`Zˆ#^ ê~Ññ§>Wˆ„N9ü€N¥Üž“@È>xMFã;òk’árÞ^BÇÉS¬¬¦r, Ë-à{?¸…bú´`šš*5çKhÅ„âô,´K²èD»wÐá­aÔïRmÒãg¨«òRçÍÕp¿°XPOšq—;=þ¾i`?}Îqð †äÆW¬È‘tY‘ðå¸rìÚ“£i×FSÇݯI¡LO¹ÐÊÿ‚%±Æ6É©Áׯ³œ‘)'Êw¿H_$å™­øb@7—¨TÈòi‹ÃÞG€ú¼¾_M­U{ó1±ü=` t“»£"s¬°>¼0‡ ΃ýIWÉ|}éýŒG—)øð^Ü«$½)qâ¹´ØÆ´óĸé‚Ôc›Rc#ÁÏx$BôYø‚\h¼൭VÌ:,±§NAþ‰†}Âý\fþ¬wò"ƪgè¾²7\OÙ‚¯]XÛdtÁžp^˜¤vV³æP³U]mÎo½ûptº5×%T)q1ã ªâ \rWMÖ-0ÇŒöïPÙ]TW!¡ÜnBžÏpñ©±ïXvô¢Óf¿{~ùé-²A²§‹=¥Näd ߉},¸nÝ#ŸÚºÔ½Í2¡¥\øKÈÜý‘·ºÃ7ÎWc¡†ÄÔ"ƒ%§í®^`—W€ŠB4XuœpƒsQ½Iâ" åv’Zb£pËN”î!¯Á=P(ž¼Ü! ëÂuìÎçs€í¹…Þ@ÇQSi‡œX÷ƒ–üm‡°U‰à•S0œ!²^wg<mÊØ<­‰ŽZ>Ÿjǰ]J“2Pa+JíƒÞ·IŒnÌè}C,^xX(£Ý®1ÜXÐ!ÌÞwü9ĉE¾úš¢ç|¡FëÄLƒ5‘쎻'ü.YÚíŠòzÐ,"÷²Ì"FÓLc=U¢cŠˆ„J‚÷(ýTD¯˜0€ÔÊ]rx‹¥ã•ZëÓ'd‚”ýšêœC›„°Àáölè@=Zïóí•jæ¥qñ»w÷æŠñi6:\’¾Š³:4&YÊõàÌZn5ÔÅ€‚Ú5;ÿ” "#Z\(ü³\\ʃÖxÛáëZ8„K؃vJnÉcmˆ¨9ä~—mdFbûcp, 5[tjw%6›{YÝDI‚ÅøfGâßV7OF‰Æ¦tÍ–R÷…O§Õï·¥"iÊF±¶SM[/ ?ýA!‰ÇZ¢&oÒƒNy½OÆiþã§Ä".Wt5 é¿nJÞ×2'CYí9¶¢—z6€jÆû¼ÖN<ŠÁÒ#¤EÛ£ž,6’~‹Þ§Ž²až„v[œÑH&ÝÍVý|G—Ì^OÁXky•™ÂZ@½Oz•†‚ÌÇ4 a"i—¤ÐþÓЦ¯;Z$C¼ß  €(_²ÿ5O¨ÿAž‘Ç´Eàõð!ð^F(ºHZÙtÇyU\éÒO÷xŸ ô¸qLýa{¥Uq0s5€‹Ü @L¾’Œü&HªßùÃøê!‘]Î~c7vìîg(³Oï•Oѳ’‰ceªóvšèþ±${ à_¯X©þÕùšP½y’6ñk·‡E@µÊbßN „½zU¾‘ «õëIió¢cDàëu#'qrm4b ¿4|4{õ«W¾døÇuPÁ%[\ñ¸°yæÈi4ÓΠhX«_$˜W1ûÕ„7Ý¡æë ­è88Üv=Ö'nn-{œx (†¶i¡5X“(2>zá¼5ÛI9˜ÔçßklegÚ#Ý/Õºà Ác „¯*½_¾ò¹ú·'í@-Ùÿ!à»j¦TÏŒµÚV©Æp€ç„7.§üŸ|[OYH¶Ã)ËZ¼fûËsšfY,~n†,ì»™'VŒ ­ù$ ’tAÏvî`±`Tã¼h,öý9K¶‹:ódNÇ !®¿›÷¯ÍüÏjKÇ®?ÉÄpÍ+I…}§n/Yý'm©ç–O5ôŠt_\Ÿñ4?§¿J3€s¬E9 $ybÕ4‹ëNæ5ƒ­Ï «îâ¯]†l=¬bJëH~€ÁºÈ_|aŠ®6ž9äÆywî|…RU`«= b–]¶Á齆~ƒ­ÈY=×Ëxþ»·»]ü‚/1Õ{oÑé•z¼Ø„o°ÒJÎ.c"eC'×¢”8ß"KC’y¨Š£¿¾!Hº½¯PO»Êα0Ë3F©"Uþñ™c”¡ë‘ôŸ+y»…PÀq³«u|>kÌ[§Ì„'ÿüoö-ÕŠ…£Þ 'Ï å6KÖ`ˆ<ÎWVvmV€†ï¿Vµ×ÙqºÜy!%X¶}%NcÒÎúã9–>JÀt­ïœW|ÑX3ýCÿ‚M"½S áœ _HØË'Î8"ì ý%ŒøßØà'¹åCCï!ìB¬çR°/„ê ¡¢kU LkÒʼnÐÕÜ)Úž<æ¿°‚ÊâƒÔo±W7¯Wž+¥Gâ‚(n =¬Œ:ýD˜;oµ¯ º— ‰Ô)ê(3¡cÔsU/Íé3K…~¬J¶FÙ(ä è’°"±|’fâ=rd.ÛÑ¥%ª£AXÁüÍ­L ÌuCÍò„BŒýÆF^„ò<×HE´Üî˜Q§}C+„¶,žžî•veù! wŽbâÅ\¤GÓ*Ù04<ÛÉ_ëñ«ß‘pOjô³ r‚Ðé²0W~ü÷v­Uïè¦,)8ø+7õe{㌄ÄÌûí¶VæB7¥J*5%Œ*¡„0 £°ðÛŽñÜE?MÄÉuÝè2ÌêSN«tï¨qx5ãþŸ®yÄÎ!fÙ—­sg ÌÁò;ºzš·ž€êvô„‘|°æøä†afŠÄ~¡o‚ÚÈCŸ Gý£™ÐˆFYBéð u,p‡uŒåTE>ŽîÝoy£Á\޲%Yêú¦º±ŽÓNÏZò4"zƒO}^Ý÷ùf«B7Ä»‰R“rö[ÞŒó=ž¬ô¥!õš%^¶ÇYÀä•;âyç/!ã‹‹ž×Á€*¤«§Ç6Á"÷vËKÓ`_ko2ùGW(ÅŸ_¹Ìܳq^€ÂT<ÖSËófQWì•Ø‹Á]e\3‘ø)1Ó¥º>²F„½Vê‡Ã]Èþ3Ù³],üô\:T‚{YÖZ¹ºJª¦L÷èâùå:&ÖÝD¶¡­ ±+\²fkdc nWgjT×yøù²ÁÊU»"—Jo{„ \1*–è|p«}O\5õ̼]'·uV¹3D#¨ÞCBqæU¨bãÔ bïðVüóúâWöø2îOνìQ¯áóˆ’¦Gèœr‡`ÆéÏÙOÉãZçSïc)˜-8Ü6 CH8Mrâ4ÚÙ4jEjŸ6¤Bj•\òųìžZt2÷[¶FuaML„ª®J£ÁµÈT÷Ko ¦V¯âËryaˆLíÎI8iœbur˜Øî”Ž®å=/Ë ¼?­p)A6 „zÉßà0uò÷ØmŒ2K®Žþëm†‰Ž}S€¬E¡êÏ4µÎðØÍÌNµäZ‚Y88½2gùVD½ˆl»âù½ÓCôAï8ï*TÁ8ÙnÚž¿·J߻𞠖{\+6 8:@c¤-‚ŠKgûx)ÞÛ3H”¨·©¬¦·l¤ˆLÏÆï!¦¾ÚKJëžŘpù#d_;Mþ¤,Ä,>ÁXæ‰K÷q ø #GYdEðÄ@ ^¼J±¼Û7ÒÃxvjÒXaŒáM¤Ž[mýü$_­ X…MjȪyÅóÊ ½ä“Vß×¾Æz‘0’%×ëhH¿L¢(“¤K…»|{öÛý‚;D}Q ׌£Çÿ€âEÏÖÝw &~VsËL0¤2ñ‰c„Yð7b+Ïäó e՜܄0±]6Ó$5!/PáÔÕvIýçñ»ƒYb|Ͷa¨2¤ññ0ñ=3¢Â2™`•¾ßŒ|¿op†(À6ù2j*7³p¹Ö©ÏþؼNÛŒ¸Ò[`zRmYz~è#$ˆA‡öç{ˆw­C’X U>B Œ4Ͱ*=e¹‰%Î"I]Ì‚J¥1œ—¯”~é:6¶âc[ô¤¨€ü¶¸Mž8¿Œh°¢-+ô•Öø¡hpÄÒp–¶œIö(p¾=×0aq…ŠåMÅ[µ†äÆlš|óÃJ*J¯;Öc³ïIë‚ëcÕ›j€A蕟(£’•§ŠÓúbdš¼C¸Ü÷„c ß…Ÿl:nwñ,}ˆ“9"s‰†ßeJP|45~Eñ8¶‡žvñ²ÕR.3ŠCí°)ðãæÏÔz%Ô®úä±HOf¸Š*ÿÃÕwýr‹D&¨¦Ø§õ“)ðµû¥¦¬~¿5^Af˜mÀ‡ó0Ž»âALw6äÜÅœ±CÏP†1†!oóŠïÖ,I0n;kÚcl‰QëT<¨a-áZÙUÕ­IO¡›ÿÍF©]Oá5å]rëÖ V-Hæ•”e›Ý2íœU[0Þ«¹6GrP¬ñ鮫T=R½XÅÓ@„ÁÎYdNòŠ soL ¡1È—ìÄ”³;ƒ¸“ ’ÜxóÐ×Ë´^u+ìÝM® >2¦lÕËå@©o¸n|þìq…‰`ß±ûÀ´À¯D=HÂNÔû¦ŽÜ¯hè ¸¹ž™†´*É‚)ß¹þ’%Å]«ßÔ%gûž‰<5““—e ¢¼¦¸­:`èy¾Áû:iC5ñ«ž‘I»yMÃÚ*Ñíuç¹Üêlñ1ŒDK‡ÐCcÖƒ¨ÓœþñÆê„˜4Þ©gO½ò#=õVþÌqñ´Ô… §4B‘õ.½#äúZyÞ4ãBûÆÓæ2ª hî|½éòþwÃp½§78üO;Ëáþoüz  NÓµ¶qzà4ý*"‘B•ó>fŒh( _OÄ·G›Zx9BîÀ2<ÛLƒ¶Ü˜Úª§õm¼Âéý蛨öhÅ£‹¨(V|DP'2AäiDMZJ‰|‚2 Úvj ´Ñ}Äsx`&% äÝ×,t”M’¼ð‹.N~ðÊâÄYÝäkùB'ÚŸi³E5>QaÆr-»Æˆ>xü&Ð0·Î©|»Þ%.^ì7ø4@=Éx¥ÿùSÓ8qz¢…%“¬·‚˾dùöVö³ê:Ïp[”ºMùÝŒ±€ñq2Ék[Á×çõØÈHÿéò&¸?UÎÛî‡w¿½‰_.(V›$¥.0A†ü€ÆA›„°èLƒ7öàíÅvRã;ÌîµNù‡O‚F›жò±\jSo¯á»ãzN7 »ÂƒÛÊT’©¤ÏSÕ/Éez®Œ±/âAÀ ¦î~Åô + rX€Hž~ÈájzR Aªã,Äç˜-ƒW’`“¿ Ø”3”JÉcÉYƒ>sÑTC`n &™Û_é³òª`J´˜t>À%àn-¤5úã±–ß0ù ™:gƒƒh‡Ûü0L%ÚkB”¼7ÉÒ8CQEý…Äf’vLj÷@QàÂFtd¡¦ÅÃ%e‚úþ“¥¾îw½À=‰¡Æk`&øÍþð¨ @9ýj@0^!¾ä%ùg#jWw|Isp÷õ‡××Âï„ÖrüÚ£sR“’ég­‡èQv ïšBTRÞÏY#•Ãè>}|» 5ß¹W @#cxiUmЛCWñ EW7ô2¿+Ú5à*1¨KÓmÃÛZýß,¤d~‡ü1¨ –ÛM’oò`¡ýÃuƒµŒù”Á¹œIÞ7 ¸˜4.Eþš!¤ßÙŒèn½ŠÌ/Á9 ç½ôž•Å$fN âC³T:7å¾´)Þ©™bÅ Ê–ÙkhÒGO ÉX€ˆDaÔnRH·@á Ãþß Æ[¢ãbO‹ÚòYjœ±D<‚<˜lI0ÿz1Žè¾«À"ïÜÕeeßãuà¬éÅž%ŪÄÐÄù•ÃåY‰Ô~‚aÛ÷DfnÔ…9°?ÐeüqHúQ ¹Ú4hjY4ЮŠû±£¾·ëo/Ç"Žþ÷3TÇ9гäÝã]ÎïN^„1󉈲~C‘'ëýždU@Ü‚0x#žO`zÌ©9½âÏi—Ü7ÞØbddÒ¡? ‘ÝÚw“؇=–¨(Y 7ådœØ銮鈃Œùç+RiŽæûIŸSe£Ô~=š«öPjR^á*ì\ÆÕPYýÞOdÐÚV¥Ê«…V kš@ÎoZ°zƒ½ÖçºÑwtVw°Ì¨¤è¥xXs0ɵ_ ûíÁ£ phÐ,Þïh«kœž@o2H iˆy·A×­´å8ùËG_”Ú(ÞÆŠ%}²ð–'. jôkž8­÷öÑñü›±4·@­… 6âýöje¹QåéL³Ûœ© àÑEmAàVYä½D”ÛPñô8ö!ê#‘Ò0ƒ%|ÚÓ 8[OºQ…â^^ÜQ³ÐÛ‘dâ†øO Z¬OשǬ¥^ó¾i‘ü&/DW-XVRÊ^í’ghØÁ®²‹Ô“¦÷o¤[xeÞ§^jŒX¾PË©ØÑö·‹÷¶Y笅DÊüðqªÓ|Ëòû’~Çiõ?¸£ÁÛy”šAŸc¬¦JìI:Øm]Ø cz˜é $ù=iµ%ç«RÇS7Iƈzµ=Ê·'e0‡Ö-•»ÏÊ{HY$Ñ5¯Xz=ñ,?¶b'àBìì6ÉC¨$ië“âÕ­f–Y â8ã¹aüâ ¥òÜdÃM”ßèšåÓGZuy­ÖMAù¬ìJ§Eµªó [»ÔÉnm5>H_”¿NÈ·Vuu©_%u‚h<’hY úšþ_ü« ¯*]Å dä%9ŽÐÎÀ'ý^Nî½sDö@î’'kFÎAîÒžó(èÞcãsƒ ]Hïƒ2æNÈvàaÖbÇæåÏ+ {yù·P b3EüÍÂ$©þæ§4…áöà•±kéi¢úq0ñ«\Í¥‡¬H›V™ÿÍt¥¤*0Li¨¯š3˜oOM÷ˆÆ^¦:B¬ ï Øåþü0½øF˜ƒ¨Šþh4¶Fû{qAöÝTj~ú0嵆ŠÏtW¼ ýÅ%Q‡Ÿ…†]ÂØý(CÙ—ŸÂ4ÐYk_î (£ \M ¿UÌÉfÏñÕá7øô”¿ë‰Q–N»Ý²]äT¨ZÝÍÎ)•)79ø2Bôí2œªÀ‡´­,„£ÊÒõ3‹” –ºQú€¾~Å_Ôú¢2]ãÅëÝxP5â ä»·Çò'§L‹Cæ³e"±Šø5ÁZ..`Êc/²'$rë,<¤Ó§pÓQ­cšÐ컃Ɖպ(D±ÈtÔeƒÅ¤n“Ôóºögz‰O †ãû¤¾¹Üéfa¨ØéWœ³‰†Zú5Pæ@û}=6¸:ð˜~Õ¹¤&sæ-?\¥ç×W5–²ÚÛ‘Ô£øöó‰UÎU€ˆ<ÍObØL`ì"­‡Ï+¥ wÄ —>p¸h˜­EvAž‘X'ÇSõ™ö2éàöË«ñËæŒ³ðjÔxq{qâÉÂ>dV~Ñ2¾C|ñ‚|V’Ž×Á²´Ùʸ’s;ZKéªM……~!3ÈZœ£QßÜ‹‡}]›³ÀBS%”ÃJȇµy—ê;a J‰ÅÃ×ãt,›¬/½¹‚¦Ë2 îdú p_‡t陥åßQ yââŒZ¸uùhm̽7L"¯Pÿz8;¦èÍ3;…ÓVÂbb¯+ƒŸÕ"ñqCµ[åèd‹¹ÀÿÓ¡2!a]4K¡xš6Ÿ¼ÊHÒÏP ¤rmÁ™Å¨KzÒ@‡è"Ù TÛ%;îYNð½æI{Rd™ÏfŠqs’ûZ"ÔĪþ‘¸EDº7å`–ñèE¶K‘&šý` ÈÇÂØ!×!zaê¦'[úuølGQu$²d¨’•ÜÂÌ#¥(Œ/"a»zlËPN\{$Š9»ƒÇ÷D¸5ì\r®²RÑAžOÐMÉ:ã°Ç`j Ø=‹4èy r?[!÷´MïàÕ˜G0ÎÀBŽœÏÂ*RŸªÿÒ%(¢2û¹'Ø ;z؇²œJ Ùû7zifãh÷ÐÕ¢é=#Ê=®ï( $³PQNžcmLâZÒÚ‹ÖjcˆÎЬ?ÒŽ›-¡-ÈE¨;¦š\Ér¦ÇÇg,^"i!ŽÜbOÑYÍåO»P'h_!Řœ­I5!§øþ{€"{6–I òº •¦Ý›"õÿ3A_i¨|™KO_¸a”9:3 ˜C‚òEZKQË©˜R¼ˆ_0rù¼.Ï€㥟q ƒ’æÅd%ö7Év‡–/b ¡]e÷'=<±Î”g‹çû$~Ý7YÞêµX²¡TÖÏ‘o­Äû©<N"H-7$¶‚MŒïÖÿ¢¸ª¡˜¢Ì«ƒ³2^àÒn»'stIZ@¢JÅúa³Ú›tñÅ1™bô:ë7á.îeŸ5˸Œ[PR©YSŽù‘l¿%ß“üñ.¶ìúäõÛé7 ¶ìž°*ŒÜ®n{ 0ù)çoDFümUð´Ø ÀBñA¸Ï¸üá 2ú–“'ã#ÆVKÊv6¨i™c£†O÷u[€ÉVþòF‚ifåH­\êdaš¯òd÷õEàïÊßËŽŠ5MÙõhJu“©ö4”©”rï :å”îK¦7줰k 3áàX2,_}Ýø)ý2Ô┞‚öòï°]]¬¢HWiêã热´¨Ì2û©Aè×Ù‚£íª—67…™@$ˆÔžß»ÅÍýúç»·jåw6òÿ@AÀÛë&Ä\rÙ&ÔÃ0‡²»ÜÄJ»²‚Ï üĈº &k2ø©Â$ìÉbçÆ x&¹H­Üß8ñ0ǹ*Qsß}¥ò¿¨,µÌ™õ¦þéÎ›èØæö¾ÇET’ƒÚA0±e ÙBcØÙƒŒ9˜öïz¶‰ 2î>¿ÓÜŠæ•ÄB2Mpc¢Ì|úÙ³ßÉÈÍmÄÜAªÒu&Ë$:^rÎ+§$rÍV¤ÿOÂ'a7Ækö—A–©·zj &F]J 1pñ‹Ñ²ó ¶¿ uGÜÉhqù¦6ÍãÆ²xX[€‹ˆXb8…Æ A­/€ö[ù4Ø‹"¹Mˆ4þÚõ‘aþ«®Lp'T Á~äMT¼‚Yhdˆ©¼P‚83ÛCÃZt<óÓdÂ窡ô¨œ*+àCÄ7* ü#5Áá`~õ‹äNRýb·ùNÔÜìMŠÇå†O÷“UšÞ;þúöÂD×{ºÐˆ•j1õ®fÍ¡N?ΚÛk®±ä‰íHôø·èÁ·>¾É:€Fs0Äz¾‰A£_~ƒ̱’8#2ë“I%“±¼Ù¸©¬ KBÿ¿Îob'ü%Un)ÑÖ¬ âi„Âz/!V"âÇþÅP¥x`%Ò6ªÏh‹}W1ñÇ¿‰Å¼[†·DÖáï6w>Õn$ËKDaÈùÉŒ}Ÿ?Û¦/Ñ\ûJq‚‘†>D¸je‚)FJ¼e2YHÀi¦Ÿ‘;*|¨±]…‡5¥x¼ê—¯© ®YÅËëCæ´±RCèŒz}" åèR…†Òª‘Ü1½1ïà(w]=Ÿ…„TÝhà¡ú7ít ìr–¾‰Ê8½ˆÏå%ó¦ágú´{’éäßbýV'9RLŒƒbÛ@ €¾e9° ‹(Û·èUåÎ5};þ786°ý†M&jŸtË/B+¼ö¡Ân!ä…Õq­}È]<Ï>¨€'Áãi¶ÆšÜ°â’ƒ_6„xáó8:cÕpk‰°¸DTO¢7ª4®aK™´ªB·úðO '„’Wd†ìÍÅáÿvD*W_Ðx'S[ö÷T3&1mu×È\2&âW™c-Måg›}Í"ʧ¼ b&Uz“Ó_¯žÕxA" åªGÕHÊ•‘Ò«=Xß?ÃLQæŽQ¹ög' pbÀÓ—v¸”­j®F×&Ì=ø3­ÒÔºÃãÓú4ZÛ™EütØfUÕ®ÔÁõ¢BÜm½2ü²ÐHJ 6e§Ow21†âvöŠ•ÐÂ?rft¶ƒI<+uHmù³þÁC_·r¬5н4vß\ÿ“ Σ¨M1ûŠpÇ}ä<º@лCk»gÙ$X jéÙ¢,‹0î¯ie]ZÛä+‹&Ä%EàÎâ!^HI¨i°ÅWÐ2wê1¼—yUö˜ðGýë9Š{{$ì\1ó>|~huTóqH)ðꬱpõ¤=NÝ(~ÔQ\ó }‘t=+ø›Ÿ¶ÕĈÞJûtÔpÑ¡'Ú/C;â7ü›IkÐ÷ºæ"¹Ÿ@sÐ¥ÛîÁût Sµ¬øÊhŽV½Šù}iSX„4,a]Fµ•W…ÁËØv£Ÿp|°ã-ßP¯¹K¡QN§`Bõª Âpn Æ«“NÎܱà%”dôžÇȬGL˜¼-\Ws—ü¯@ê&m^ìÀì<‡H…ÀHäRœí0?¦i-—猨ë4‡|ö#¥ë!ºöÂXrÒ /[æAÕ/µ\®›~Ó9ÊüA›ôl.2%ÕÄß}‰m{»ßPöYiԈ湕¶›…ÓÉb§˜ ;2nS1ˆ©z'†dÁo_ewé‹òàºÃë ‹€”¶vŒK§¼¢»Cdà¸Þ\€ŠjÀÄ[=#¯ ¸QÎÄǬ˜7)™¦Î•Ä…È›[Ê:½+>ÕYvMNÅI'©+n{˜jd1Ú¾¢]̶Èè2ìFÝf&s¨5¥·ÕˆÂ{_ÔUÍÅY®ØÁ”džVéÞt5¢ ëqÓ^ß$z áÒ´¦?¥íèI†`¶m(ë-)¾µÐ/‹‹)àÁ £Ïg•'Ù²ý‹˜pOv5èBkˆ2•ÝvMc¸ñg¥0gÀÐÒ>¹…Éo&nsíîWY«6^D¾*:w(á*¦S[{SÉ­¼Q‘À¤ÿ֫л§€¾ŒÛºGÕ÷øÌxW`O»a2ÂÔxÆÖ"î ›€"x'O„1»sûîñRì°’üÂ@Nkw^=ÝÓ¤á¹Jq S9¦ï'䣜ÆÁáô½{âXšiI¾²WÒpˆŒh'¿_e3”¾»B’¢U°°ç+…Z¦3…-Öµ•CÌ“ï<ü'Ä•<âvQ¹r!Z­D~¬ˆ”ˆ'}»M¿VítôÐ/ÝþxÚæ/Ñ3—Èu Ù‡¬|‡›Eü$º÷Öô£hçÃ-¨u¶q ÚÜ üïíŠÓÓY¡\Fi½`êÔK^ ’_F1¹½Ñp4¶P?(ãxPD8ո߉bqüè@be…àå2«éº mðVG©§¡…x¤ŸÐ£rÀ@³ ¨»ðzðÃd€ÜCÅ=q üpÜñ²úSRÂ%¾Ø“ÂqwC¨?Z‰±f3OS~$O€áO…ÙsÈçüXWµeñ@¤n?›‚ì÷YÇ•uý?QØ(|é§¼ì”b®¨›M·Îu‘èEçšÉîØ7‰Z%€½;iŽüm hRªÄ=&ÐËÑ™œŠ¶Ù–›á7¡¢ú$pË"2)µüÜ9qÙ-­%­ø]§Ĵİ+o”?/Éq7àp(Þ½; ˲–úˆ ®!Ìe©“zÄ~o|sz¨¯*R#·:>ß•(m£Û³º¦Ù)C µâRÉÓl‰jo¿áfQÞ8æ "Ùé\·+¢¥9l§G78¦±Ú•@)øï¹ R:ñ¥¡pÅ`¼Æ¯õ’Pƒ˜,WÆR{r¯è,1U²¸y}"}HþhÞR@Ç.âI¾x$YõVá*¯T–]k/Ë-L£…YùÁN‚¾qcèãÉ~¹9&)v€yŠ5´RÂ9|«éEš3Ö£´„™ERÝDä£# <2ù<©Žú0 Ä.­Ukç1¦I¿¿LÊœ0º9tð…ïjÐOÕ‰¤mQ«­UöwÌþ£'eå©?ï.j£{’O3+Š)ëE·I~#áE"(8ß’BZ'Z] ¦Mê§M2ˆëÞYw:ºíÔñǃ]wíYçóÙûl¸J°±Ñÿ˜=ò=ý}¥|O:WáîÊk÷bË“\Ðh—{oÑdt©p¢dwÒcd,GH³$”w–¶pfÚöãauçèç~­w‰¾ý =o=¢‰=Ûqë:¥$WÝtßV¨8{Y^ ÛfF^¼Ûö”ï)µÐŽÎÄAù?÷·Ð}%oÄ;?4‹¸ÒÚr\ëh1Û†*W$¬~ 3}gín k3wèÞ@¼¤ð5Ü ÞÄÍV;Ó¯±ñlõW>¨ø}bdÍ4»1Í_œê*4åT oË%ÞÉ6†˜·Á ‹jä]^ðàL#Ï8ˆÀ|·W/Á”¤?\3  ÁË1öØ`‰š@”Ú”´»*pêøK"£'›ü& ªr‰êA Èl+#3z¢ùºÖ« ×_~ ~ß-)âU”sŽÕ™ (8œxgQ¹©BÐàï*$†3$]‡{n8ß :-l¿7pkZ`wS,%‚8 vTô~u•$Idª˜®´í•=9ÿ@º¢E'ú–ÛBm°ÉÔ³‘Ðj¼ì›ÐØnM¶OeP\y©©¼‚ñ}*ÑLȇÖÄîý(¯QØœe— ÊÅpt¸: v:¶•èTfáöÞ²yhäú©íQ®\ÑÜ«jŒrᓹ~¥åš}•2×GÁç¿õ­‹ˆøáñ§7~[5äüÁ÷Êû²@ÐíŒê À½¨èÜ×’)µuýŸŒ»óIwöŠ—‘1Îq;÷r®¨t»a«ií¯ˆóϘ%ìBý+.»Õ7Pcxˆ\Ð¥HÔˆ‡d‚Ò6‹Ã6>FÑ ½£•à@%X#͹³Æ¬ ‡OQÌ‹`¬®Z6ñ#>) Ë;†6¶‡²aÀS»~`ÑKšÅ#ñvÅ63'gïùû—KY­„¹P¥ì*L|0׃PıEÆóàŒ.ˆ„MõHÏòý£~ÏÊ‚èz®rü·í@ý7­ ¦¯ÌGà}º—ß“vdiuOÕ'«±ç¤þ³xöŒÍǾçK)Àã†A9&$¨ÙÒ _õ—C;¢I&(€ù¾ÚÍŽÃ?èc^¤Ìü¶9kñ›QèÄ¡h»9¥fƒß• …M_ÛáS{meÍ. _’€©Ôbñša{]ïþŸô>›8çƒmAHøm†ž‡I©mȪÈÒ½µÏö Ñ* ÷r4ø¦_5ûD—ó†AšÐÝ0¶±7ʳù8™'ã2uf$É¢r± v™¬Ž¼Å°ߟï寧ŠAwš†3ÚŽ±ñF¥”ðä‘ ^•ÈaÓ÷'‘iAâŒku<:„Èé‘k5Úê4¬8=寣Šý€2·ž”J:õÙŒzÊ‘ù–w®"ÿäæ»¥z„ Í_–Jü‰=Ñin\õ_Þ»_Zò‘ã,3‰šws:’4/õ£VÁšCo.º`šAÕk®€xJ`1X( »ºåÜ_Oé~›<†ŠÈ —§r€²¡ØâXìô¯kÌ#Ãßv 1À~p¬ Z±lç´¸‹sÎÂ*fšÌõ€~9Êy„mï,Í;Ñ©ç(kÆA#‡fëU€gQ”<¥³lÖô,5×,îˆ,#‘ÿ¾÷^ÝÝl¡I„Kâg¢ã_+·ä0—¡B’p­x$LYy4Y­á †ðÉ옮õ¤mƒ,ÛÀ-ÝèâßÕû3 BÓß}2œdã¡3=3(LCvt¬äÙ)MˬÌ×…{¤ÞÎ|£À‘ü£]TLŒlCÑ`}žæW#kÅ¢Ñ ?5yª¾€T¾óþhÜèFjb»•;±\Cš•LAIJN0¢$t‘Í Þ &wù Ê}ZesÚ’–Æðk¡À ?ç}g‘Æ¿± R®xŽ=ÍI–ö<‹gH‰ïBðÝ6Yé’Zl–»V¤ó°|EsP­É†UщðòÁêÿîr̸é*Ä ²Ü/Hz"¯/g˜ [6œŸòå»™ƒäƒJ-• Ë+O^h;Áx$†Nµ¥]S‘)ÓnÎâòj f™Ü屇ß–€hH YiàY~V$3Ì”-ÖÖ²!¤œ_ð¯ûZ~jžŽZã6!¾Ð·”ëUÇÄ•p7t$ó·ûÿ|¯í»H¬ÍŠW©]n£Ì šØØàO…Iuâ úÏ g'SvCŸÝ^]ê?€¼QOUï …7SñS¤CÐÚJh“K§.aèäXÝ™›xqÝ‘ó¤]íº†©…S·—½êGŽ~H¹„÷ò[Ü»íÙg²S›—™?ÊÍ_C$Xý«Kï=`d…?ý Yž*É:±JxÒ3í¿ÕNH}×gvÜ4åfóÂñQìšìÎF¬ë P Ù¯#n8ÍùŸM¨ÒeµJ¯Ö°œÞÄ^Ñ5¾)_ÇQ¼ÅÚ‡ }IRÚf‹ÿ­ç·!¥ ±|P˹€ôo=Ä“Š\ùx•ö‰ÕŽàfö e ¦ÙW¨*5㉒FŽÂY¡Æ$o‚œþI÷ǰ¾ª¨§FÕ’Šü¶êø§·vJÆoât¨8ØÄÇãyeÓ×a9,EtÉo»3Õf]Õ?Æòe àóg@SÖ&Ï1 Ʊ÷U%%)iŒÝ8EÄã+:êÛ¢ƒPA³ÐǾþ~Õyl"aj%óOYÚCQ˜hÎHYó? A¶KÚçéÀ¡ih-N“œ u=´¿ýFLa ܎Ǭ@jrƒÿAÄÏ‹Hæ"M\ú Kïðw{¾5{Vß¿èÓˆ‚{ùû•˜ýÏÒü-.¡ ÂU¥À gǸ["33 n%Ôùªîô\†þŠDÈÐÇL u{ÌÔYúží§ Áçl(VyGÿå'œyÜo“I|)†h¦£&àÑ~r)túËh2oþ¶ì’ø ¼ÑB^m÷íîɾ3° ®µ><¶ S³Äfb!¶_ (,ìÆ{É=ÉKÁ”d¡R°[¼H0æ$ît˜½ò;Yž5'ÖÄPÞjÄv™ïû• Vx¹+Ðjrˆ/;†§[Âa`3O)î°½tó 4ºÂX÷°:Àö1|Z2V‡fp¯;`j¡î6‰dêÏšÁ²rM›Þ@õ®Ux|$Bi4Ò¯gP¾Ð÷NcWXümíyæ–ä21‹!yJEñZø#ùá¡ITFœ¦/Àrabx_×å|Ha UlŽsD—• üo1Eù€ðýÉ2•­Ø·œÐ‘ PLÙ@Rºh:Ç«G!ë/á4!ên¥ßu½ªiaÔ/×MãZqëä:[ꃞ~ƒ¯(|ƒËVÐeåõ×€N"ö6SÝϯ‰?“úÌT_E~TFÓ|‰‡¶f?Šªº€÷mœ*s>@%g:”sôú§uZ¦Nçpÿ¨È3 €«J5Fú‹Áž?%‰©»¼%/Öœ÷'ÅK;Ö/üÜ=ç]­*öfzªß!P³*,Y°¢ÅAmC+ˆ£} ÅüÁ¼Ñgd6pŸ(;b;wˆ5¦'võzû²°°¤Ý0«¥¼mæQø¥Ù«øD£9½ˆv'b´††l6å]eÏg!páhÑôWÆâÁ^|úŒƒSR®F™-A ûöí§hå;4T(1faÒ!¬œÚê‡ëÐ4ÔîX¡ 6Ïmdþš…Å1´¶¸sª.ŠËŸëU0¢î84jnuz‹c¨ D0éY|°?« Ü2(Úããæñ|ÿ‡À° ×ï*¾‘noJPTEøS·áÊÕÄ_öð JþeŽ9*È.>VÙzù†À¬%´‰<ú:¶GŽ É%à *€IJÉkû öm"!Í0÷Ògþéó¾V,º°\½·2DˆUÐWùûnŠÓ²í eèVŧ{Tá¶¥ gÊÏG GšWzg¨—í 0äÓ˜S2J ÷¿fì&»#L» -Ö¾À4ôêýòÈ#÷èZQB ‹ÏmÙH‰{‘þx[­´> |žÐõŽ‚rðBÔl#:$ÁoÝ?Ý.Æè{¢¬¦ C)¶Ò!?Igvý½'‚2”dFgˆ³6ÕáN2|Åj6S5ÊâÀ`%?ä{@ñ¡Ø9Uª¨Ú‚J.Ø}ŒÙ„ÿšùg5Uš³M¬zI¶ñvmsó–½ýÉvž­¨ð*)}Œ–’OéôíQ‘ý‡lõ(S>õÙœä*ˆð6YÙ!Á íaüÆ‚¯½Kç&j´WP†Ä$@…& kۨℴeÍi}ð¦¥ûyà #ÄV|ËœÏ"eâÍ[ËÈ;-i*64݈"ÂO®éw±KÁdI Þ¥7¹ª%)®ªþý   ”Ãÿá/*WáåCEÙó×\´"U¿E¼²]ö¶)3ØÖe$µÝ *ªõè Àæm\ÍŠÄQ Vyu`µûû õÙ ÛM·È9ÃF,›­=eã@—m ÓÎ0R~çÜYãÒù8tÔ.ðe …ÊϺ£ÙT¹âzcM¯.§Ñ—_1ù°ñD,YÁ³þÀòüŒ3aàz²·…Wé@ìëó…T6‚'§«†¹Ô!Ö=÷2–nsú´F¡m ú·ç‚Ëú¥“V¯®„2eâ] 5wp±í™^-¸ð³¹?C;oc]èòŠ“¯¨(‘iÏ©·È`M©År›¼04añåÆCÔ¨‡ªrÞ,)‡^!x]$GÒÆë1m[Z%T*\”ÝRͱ ã Ç“é`¢W(”ásŽ“VÝ·oÃ\]K8© gËKÃ3ÉÏ 2 ŒÇ8‰&P$B:ø`åá†ñ IÌð“ì$…¤ ¯æFú5[¨ÜZNî¨þÁVMÃшN„ƒÜLŒ›«wynfß.R 8¼8ß…Þœl=#xóz¤Õ#l€cIÝÊþ“]²¯y©þN(`ÑÊÖËî+Q”¿$ä}Ø€cé.‹,ï¾íš5fÿ"c¼Xš†õÛɬ@ý I&ÅNk‘S½+%%g4•’“a ¶BoážM¨DW½³”m9` ,Q7VFJ;Ly—D;õ£Á/iÍAÅ€!EŽÚ"=Â@ë(®M®r—'à­âóJ_°Óx,‡íÝøvl–Çmɲäl8q}"9×bÞ°hžJT*AÖÆtý"u¬È†- ‡í/aY6­-³{§.scKmÃLiÓÚGÎØ0âÊ)ñsȺ(ÎfgM4ºp­Vû³Þ¼ú œf_>ÜÉüuå'W¯-¨üƒ¹Þ¨6Úû’ÖΜªŽ™_¶uµbrÒÿhy6îŸ+Þ ¨ÁÌ=ŽUÜdÈn•\ L<‹q‰³ú3‡«¥óúÂQ¸|nkí¨uŒgÚP‡£#ÅDEÐbŒKãW…a·Ž÷VVwæmÀ²…iQ9ß`©wé ¾ áÙã{Rí`|œ<,{nõ·¿–þ¦cŸK.sé#ßxROë¤ÏàÂÒb`ÿk ‹eUn»™UàGvÓè›$iR6MþT7X’*tâ3I¿Nñ>>Rg=Cäãš)fzðÇy(ð´äœaJG}3©±¦Žç¤¯ƒ¶F=C.öaxG„-pò´ÿu¾|h°†2ÁG!4Ce~×H ²^»ÓÝ ÉÛnÒŠÖªšÀÇëÈã¥u-Rb"5¡C$ܼ%!þ·9‹ÚGÖŽt>‹ Ë]7 ·­È:†C¤oèó-¥… v̸~£ÑÄ0…¥i Yíê³+D2 ~%µ`)YÁðaÔîÊê· ЫºmØßÀ2޽s'žŽ^‹ÊNg0p˜|‹/IíòóX®W6£SØz’G)S °·Ê³ª37iƒU'úsŒå3€NuÈßÀìBù!MaÊq\÷=?îP7ÇÕ¹nÄT˜N CއCÜÀ¦ ™D,ž%5ôÒ·éŸ%äcl¯¼¶2Y¸nUk$·ÿÑÞÁcŽó(M1²ÞÕà Èñ ´\acš~¢ˆ›B?Õ×lN$/Åv ¬.‡rUùÕ aËùP@ú¿záíGðk> ÖS Èý)|‘ËÙ•‚X¯H‰kK`AñÁu…{’ãS·µKöúo¤Tç;†^²ÉÀÈ5¥™t!$eÌm-¹ë„b+u÷=ƒå²}Ó ÂÙR’M'€^ÆÞ1¬…åTxêV pê}Q­‘²ÖÊ0[\j‘2!ãÒ/ü%’¢A=ôh™Nƒe‰>¨Á+*ûšuLFŠâªœì»8tñqpÒ;v—}vCÓ²((OÚ71NÅgÌÕaˆá¶*Q”,á-¯+U¤Hæ¤ÒPž-,Yõ–®Ãs‰Où³5SÂÇj$‹yÎá Ké!y‡QpÂÎÞõa¨ ×Oa¥;䛜¨æŠ–ûÖæÆ˜øð’[œèìÿ7ƒµCe `ÝÙc’®Ù<íú£6wjÀk¹èS¡‰h2hÆ"ùyv±)$ "´©9ý´·ìüŽâ܋ΟM3êôjÕ#g­`‘p…Ž•Î|WODF¦eÁE¾:˜åB+Ô½Fÿæ£5`¢nÆñCý2Ÿ¸æôÑ 3©úO³C]€ãŒoù.^!²»JIN­À;¸’˜°ƒ|pÌçq¢Ã”Ü´ ž°2ËZÂ0öÚg;÷îãÒ9“z €‚gês¸kËMOT(RÖ¥dYÊ’ßÅT-[)Ù#x…¯Ù®ÿ*6» Ml^üÊN^Ưû]}j:ÎS M¶šOÍÐäßæŽÇHã«f¼VÎM„œ#“—³ª‡nÖ|vWM‰Œ[Æ](yHhK€=Ó gk±Ú-ƒà ùФž )ÅXkˆS4äí-È‚.@ƒÇï u‡ðä‰Qv‰ {Q€)ø6¦À;r V!¹M¿×=JŽWy¬RA üãÀ5Ê’ïÁ Z*µPx`<ôiuõ‚…:œÝT^¨Ú]Ð7OçlÆa¸ fpŒ^’œBId|÷°Ý~pBü5t9²AI] ±'l÷еðð”&vqXxñ0<ô ¼æ5Îg;¦v'¯ZËÃf™BÐA-+õ–i¶·e)’Ñ¥ UUÖ)!k5Jö¦Tæ¡"N4l±»@µÇ®q¨ˆWk®3I°üà[µÚbQz8d@ÔN2 Ä&xÂã¦p"URRŒ=Õ4&YJረ!ÂdöÃd3+lµ®œAÈ7ð¶±0 ÈhXFµK>(]ý) 7%´åù²ß)zS~=èöb‚†ØÞzªŒŠ¿&‡Ô[-.hwu^@Bþ#W™¬ Z\c˜‹ˆO‡F·qâRðZGÉ­pcºqùDEyV¢½øŒ™ø·£ñj+ÕZEÉÃywC®yG™È´4¥v|¾ÛƦtÓÖÜÕzX@­¸A/x±æ:4–Skµ‚8½Ô)Ål ;«+ªQ2ÇýØ‚H®êK§N‡44àESZiÐê¾UàõáæB¨V qí³H¤^öÁÒ‘ê þõ,nùÏä§.ÝæÛ"ilÙDƒ,Ë­êŸmu—–Ï‚¶vËEz¢½T>>0ùÂâ¥î~BÌêØ-Ê\3“†pzHäþ—¯¹­dbä¥eÍo‡Ë$¦‡yX›¿ëk!+qêÐ4 ç3pJ5dÓ˜Þ½hï Ö<[EÏfþlR¿ÛXuLDä–E®á3/À –¡°1³åÿ¦žèµÀ(ˆ™nÀ:Ù¿º˜¢§Ã Añ‘ý(›¡{ß•´X1ÑÅr(î$§jØ“*8‚‹Å… ½cbUt‘™Qìz©›ºÄóª1…IiÖÉÂf3×óé}^UoLæ½Ë$ ˜êeQ/#ºƒ_ìÓ÷p \2碠[³$µÙ„ ?‚ åš¾Ú)öê…þÙ¯Ñ:PÅê45cÈ>¸ê5DÝ]ˆöÛþ‚nŽ¡y[Z©*úÍ‘k\G«b^Èà)(‘¡'`å…ÒŠœ€‹ýUà[kÉ™nXªÿ Ç€7÷O“(4W2=¦îïPÿÞi³ñçíÔOJËüB°r5Á,Óð½áôÈvÈ•`:3äó”–¼W÷$vz– .4Þnt&o×™ne›‹í– ûL˜wâ]—å—¬%¥f¥ç»)´óÄÞ$ªpjÑSÓ½ƒ1:µ¤aáð»ÐbW³n±È?¬VÒŸ"OäÌuFŠâ­m™'fëTûSn®âBø=WT¾%ÇãÜü>ùÀ§Ð%’p©¸ô»’n4n™ú¸<#ëq}O‚é¦ZeA|ø nf£ÊׄääJÐç´Hv 9 =½Ä›óIÂS 6àðë‡ÛGõóÕ@ýª²œ:ÌÀåÚ¡»´ŠÙi†ËïŠKÈ».øsw@6Ћ¼mù×QçÆ«‡±¬èÀ±œŒ%v2ô†÷Æ“ÝÈÿk[Ï4vÝ¥µ„ÈЦ#…"êÃÜŽnŽ„ f¯ö’8AÿœçÇc-°Ÿì×"”Që †jû»ýÌ%Ž™ÉÏé1ùu² ô0Ãâ”i›÷}rD³üTu6¡Ž’ ½ÓŒ4è–æ&ˆKIó;- ÷œÙOò¦l¾ç‘ZjŸÍÿõ¦±†þd¹!öZ‚}攋ý¤I4Ç=Öþ^Ûú6ýîSÿMÔpzn3ºÜfP©m»AÃ…ûöõ×Ì-›”JWðœØ4¨#S‘ðа!² ô¡²«ígÒpÎM%$N¨ ×ìõÃ}´Ñ t¦y ÓWW¨è*×"w”**=Ò5ýýâA$>Ío¤¿ÂÓåG3Lˆª…î´á0æ­  :ÆN•N%WöÙ|Tö¦¼éɵªÿiY-‹³Ôì7$·0,ýߨ2ê÷G£h„8^x'ܧØõæ×¼ö®¢.qJ bŸRéÕm†#Íõþiä8ôˆšù(hçë3@õ‘—¦AŒ}2/AØðz9w”ûQ{Û†gêÈα@ Œï-G[ž3KÒ ì#‚˜È§Ê®¶š™ö»öwÂÑ”Àºt¯b¹ÓAtqËmwa2#DD%ã~¸£9Sm¬dÕMéìùæYÅ«¦•ïm¸Ám+ø‹¿†7 ¸47HšÓúPñÇX¯v;L„*LùkÔúöxÓ«üÏ8ñ#M<†8ÓáÿáªÂÖú‰üp4ƒ¯þ7ÕƒÈp0 ”i“(„ RÍØ>õo¸HÔÚgžxÖF}ƒ ’o¼Él1q­r×âìŒ]þóDÁ©Â燵ÊÜ˜íª‰Ð!nƒÌZÿNG4ùñaíuB±Ï«$]©Æ´‡ÒÀÖ²“9¿Š¢01M“®šûæØOGê¯q¡‘}¤y©îÁ(Ë[®ƒhÖ>´³<Cªÿ£Ò×T#1pø!s¬é[CIR”° “6” »ÿßô¯®îÓ†ÝQÆÕsÂ/»F ˺ÛâVöƒÊ§Dã%á%Þ[?j­Eo°¡¶ ½í¢õ8£ù¯ÿ+ƒpSÉß«h!¥È8øìÃÀÀJï) TwÂÒ:ôæA¡{_s×7Ó?ð~¡‘©Õñ™q±7=Õk»¶¬!7AP4{èd•8:™g¿ß¼–ÃÅBÏUx09Œ[c™é©Ö¾ ¬Ÿó>Åkq•\sX:4VÁ¯~(g‘ˆüôÆN ZœiQº¨"9 Þu«PõtZTUƒçÎÚl²rÊÀHêtÿ܇Í[÷9'W>HÐGX½­Ìír÷6I¸á–‘yh±.T¢7݃nÈ Ð×_>äžtbÓÍVÜI=lXÂÿÍ%£Ulœ{c¤¨Ã&hð?—EY7N<™e6 †:ôÏ¢] „£‚1lÙ[—ß22½À¿F¸IÔòòŒoH0@õˆ¿ÅùI)Ð_|¼œ6o®~D'ÃÙ bü“ >ćj)) ý ´SbŠø÷Å<)}ÁYÕ›X2o®-ëëøÔDWùš×éïd1¤*·…~›ƒe¥:ÆÈÍN‚ý3Mï×3J–³AÆéƒÇâ tÕ²³»giÜq÷ª^SšØÍ|¨l³~÷ʽË…§§Gm§ñ:ÚÞk_乇ñ_HŒ8+­êawoÃØ 'zKdÐdÆÖÂE]Tf’HD.ÛT4t½&‡K(çú^‰ÌB±D5\Äÿd»Îá”! C?ÒÔRì׫}ÛXK¥AInOŒuÌð)k€‰1_ 334Í„´hìþ'âüÓw2‡y¾Ë“(rœŽ3Ü<Ñ CPÜBôÐiûXø'ƒ·§p¢’fjJþ­òE§Q¯ê‚ß{|“ÓO9ìGûŸ5$7,”Â]ÁÚ VÉ@¹ƒ¤® –ñ;K¦ÿýÒ‘û"Ù•ìÏd’ÞIæ‘òLG_s1–]ȦÌuˆ=ÞÑèãÕù"òhCÂI‹l‹®£dÌŒ_hää«‚¡âA(œû;*õNù\WuNÌÂÆ óØÜéÐàiȘkPáH´;†Ý Á0‰Ý+©ÅÚî-eöXçÒàløé{“¤Œ…Ǥ›èÛ¤øD‹xyV ‚ÎÄi–ëì§í7Á½Åõ»GçôozŠù¨Iõ0ÿ™ü4hÿAsHŒŸ&¿ÚA“¨•Q²þl^W¾Q\ÔŽ¿yª:÷‰ïk~q# q.Σˀ-îmØþX—ïè PÙým“†Ë^<Ãjœ¡Î›Ä£JW‘ÕÝ(vÝ ÁdeHàéc?ƒY5kj[ á—®dxˆÁeDä9Î}—pä•K©.êä6íÍ‚¹_]ÿ•¨hH8œ'ÖBߌP—Þ·ÅHaàÁ{ßزE+b‚‹–Ç¥åÓÌ]¡ÕÐýõ±°åŠßÉlGßò”.5Ùñ`û‹wž´Š¢È£_Õ#ÆRøLL!ϭㆵ#ñòåH2‚gë+iG…©e`Ë­ãKÝû˜Ù>¬Y NîýBãM8 ÖJ&ÀE›PCÙæ¯’³Ò·Úpņìmì­Í½}è—ÝC>ÝË™ÂøFûôÞ²l(¸ÇÂç×ÒcP¹ñ¥’ݬx ²ú %í±{ š;ü/xYdv6l¢ʋܘJ—®ûƒ>½OG]®Ôdûtî+ïƒà™®òqUÃs  ä¢ãtun„»ÚƒýË8ž)¼WYñhgIquîýÇúÛÝg*¡"7`DŒxÒ›ÕНÓx:ûÍe/ØN£4÷›]²ñ‹¹¤·ÄtVBQwÁ!>uŒ î ‡®2³öÁ|…åCæœj·pâø~²1dJOFmz=­a РQØ\}µ{£¼Ø8’k“[ÁfrØô£H¢M~²ÛÀ]»™>s¾›/±HèpqM2t$Û‹ü è‡ŽíqÊùlñ V:S¬*ã¶È>ÄW¬MâÄ”`jp…¦ñ"XÅ¥(W8#»ª˜á;2½Ë‹ayhÚ§yj3¢ çÆÜÄš.ÞFÛÖBvíË—qÞÿ,ü¦Qy¤¸½Ã›˜²dèäöê…`|,Ï> ã±>¦Úv´õ”ž]~哹‹!s —u1¹œ&‚2T>"É uOKª œÇU_C#Vç‘h2Âù»©þÎYºS8žyUÊœã'(ÌjôwÃt{_ »ë;&;‹žÚà‡R\ýIfg¶euÍW+ÄžI„Žÿu~CgÕÊ}]{Y- y— æèb(§·wé `ÏãŠ_Êt¶Y×íC $Ü'óÎ*RïFé;b´té ¸ñaÁçT®“šA÷øjÕ,iRƳReô¿ŒZ®ë˜Õµ©åÏÖIz@ß6½ÄJÌi è¿Èýíšü\Ô>!Þ›Çã¯âÉÅE8AYÑ¿¿ÂåqU¸ÊLÊ PZ·/»SËÕâV-w.¶‚U¤º íE‰¸I]ëq^FÞ=âÍűøQ#ΡÀ½@RK&£Lõ³ñAK[€ˆÑðÕ*(~i©ø5Œ­É¾.rÂW›è4œ¤(»šd¹Ý+kÁÝ€Š¯§«Î¾¹‚x[žÈ€[oI–¦2¶€¡þT–Ñ# ?Ç€é†`üÓ6üeI£ÐEÐJ(¼d)–«sj_€¸ðýE“¾Ü·ñÊ ‚ÓlžV‘4M¹IæËCÂ.4(@¼Ã$Æe«g^ `‘+«ð3ÇK®ö]åFwÊ^:xÄ"©¦!—ÿëYP®Çâû$TWGÇV¡}ˆîu»æ z¶»vP³d’ah‹+.öa4—Et[W…\ ícûćQ©(¯óúió86S6CR±wÀïô=ÂðžØ;@Ý'$m4{É—’ÍG=ØôÊÚ«Ø7ÀÕ¸˜¹>=Ÿ)ò±KäDõúè»?o‰ßí“õ5n2{® ¹4h|v²oª8òji•˜OÄ?ÅÛÅFTÕeç~ !Äü,Ú1ÔB”Ì;2g™Ë]Ãe~É"h‰Œµ!•²Šy£¯ð6&Ë $©èZdà’´°'ކ­ãÛ ËŒ¦NƧRizÇÜÁÛs„l噸ÂÕ|@‘ÈæÂ”µóßä.$õ¦¯ ôg¡ ºçx±¾¦R¤R/0ZÉAh£h.42ßY:&:Ñ8KìØöÃÔ[tˆ~ Íùµ–îÐåjõj£­ñô^B£ïŸ<‘ ‡OQ6nؘ]`zKÇù`%Â|u5EGeäíFAEcYÀÜÂD>×þÑu÷Àã¹JŒ[Ý*ƒDŒr¢Ûa™Œp¥“aÇw»ú”šÎ4Èò£,Ø!áŠF]ŒJÖ)õ~=ƒîFm½‘¬‰“ÿôRTSÎ9{Y•ÌKÖUã§Ÿ\€±ŠFûUÍv%eêFöÍr=½è´cr3»çºÍHüTF‘#«»Z~S~!ÔçÇ·äo»½CàáEŒÝ<(§^†ÛÓœLÇÑ@Ê¥Þü!æîΣM~ƒá‘i¤O.Ìgå÷#Öý¡“Ì(¯9n…´‰º“ð°àŒ0bhƒ7ÏP¼LO²Â°­ëÄßœ`à›ü_1žŠ¨=°îo°éŽJAxür›±È»¿&µn•" SáãП¥ú…Å*Ë€»9(‚áX/1$s ªäDã0ñìO²ø%-®ô‹ÀÊß´ËN™[È`ý¼nq”ÁòÔ›Àƒ›’žmG>õûOü’µgœ¯fÛú]‚¨ ûÐùH-º½Ü¦šn¸zÚ2o€)žøIŽHŒ¥¼GÀ|†žŒ†Ñ¯¤üç ÂÓo£!iâé±XеšÛÝB¬ú¶¶ÿ8ãïž)ºŒpñÆ{Jqp]ËsÛÊZ»€¿vuÌsàvÉô–SÔgf¯ž ý°ŽÁŽô~üÅ[gs&Ãv«/R¿»õµ…]VÑ41“¨'¥³„Tõì;G¬ôŽ&Ò@pJ‘Œ0ž+¬ µ³ßH]à¼ešéàNE‹®ˆõ¸PÄŒ0„°¦íÃz<±‘¬ú߉5Ÿ[â¯"´ê™’#è, {Èp”ÝžuN‰ÂNÙ¯ÓpfBväÅr5hÞœÍÙîH]¤×¨ñ“ôª\;;’tÈÀFÊñßô½+óƒ:> ÎYžÈÿÍöÂ! ™+4¿-hÐQâ`œª-Ÿ?”†ÁÑ+ûrâ9çéVv¡Êúºc:Ô”hõalðƒ°~Ü¥õµSÀhç’†¸ð–Jù¿*HЃÑ=ÎÙŒ–jZâ„¶Ó/q·Ì1tE9Ãä4«µÝŠË” ¦‚Á'sü÷bGÀk¤†qYCÈç#‹2Â:\4e<è !ðÔýIÁEÊ£e\fãrcA¿ú¸«h/Î;§«‰ÔfŸ\H§6À+×uÀ¹òYzâ>#¡~³Â½æÞÞ¬ê3­þMSB—`Î#¤y¬ã‡xö‡à™OÁ'œe=0»Rú#«¨H)÷h¨C91§ßy4xÆŸZ9$._˜ñÖóTH†„­æ½ÿ?…³€d‰$Ù›äŠ+W²,ÁÓ©Ç<–™+á׿4-.ØÙƒÑ´ Ÿ8<9’¹}Ö3ÄP9¢ªy„Z2p8f¦å Ã>PyÎZqþâ×ÇgR1QóâÝÚË´{?r¢’Ÿú9ê´ÍË}¤G¬äB&^´¥@’Èÿ9‡º‡™«°ýõøßí4-, •ZMl®Š0‘X1Ͱ“ÄM}aÊ#qjf·äò˜E*¨÷ez´Ü#mñ„“9r¯øAX²J¸Ìs!Ö™ùؘÌ×(ilŠ‹%ê‘Òpi_2p¾#þne:Ó ú~½pé ¾]íów”Mý-€':Ce6X‘ëç9qþ\YJ^R«—èCá:…¼ñ•–&ë!¬¡‹œÉ»,|æQ·ñÿíF¼šùhê„:cˆ÷Çh3Ťi8“oàož"L‘¥ÖËòý½ ¼¤½„ luü'0+v“TÈe;èƒÿÅÍeƒÅÂi‡©:8ò¹ð$¢9%–‘´Pç®>|6uUF/²÷A&³ÎW¿—_'iõ&%X1D„U´q=NÓíJ÷Ñ2šYø½™)ç¥Ú¡_¼1¨Xïù{§jT@nATú¹Ÿ¼_î~bñ^$‰.+Ž" ±GãÅ.’ù¶Žëƒe t¸z÷|K““+T"Ó»¤}pBhüe£œ»A gøÎ^$l§ö)7¤1ðhù|Ò1>p+-Rûß&­·mf–Îaã KsvßÇ«O@†IzÄêÊúËàª;íÖv””aB‡CÂ@/éæLh/Œ³C–3›‹Ö¥SOá÷_‡ó˜ :7%ÿ:q&\ÑÚÐ"Ôà]ªÛpΨûÀ—~¢×&vÊy²+ù9‡n£‚Ñjpm>ÌurÈÇI’`Ó÷‰ü%´R8ß|[CEÛl;Š95ÃÀë ¯ÙvKä‘Íë½ôN)ç A,_™Ð°vyÎ4ƒ)öÓO.€) 5½Âˆ³rب‚Â1ÄÖ"ãÜS„LbÄ„É_Ô;¨— ‚ë[E±‹*Y–ÅXÚœbøÅŸÐ`ö uJK§ýs7gõ|Ë5¿û½¾7'¸2`Öøß͈ÜÖG ¨S«ú¢O ˜Råo&u6÷¯GÆû8‘”ø†Œ¤¸Û_”XO7 DªoÖlM½ybSFtu¹—˜û’§ÍºÆåJ¯úeÂ]4"Oâç([ä&÷àZä–Á"{ÙVZT̲ÿ^KSJ’øõjÉ DfçñÙ4Ç׈”sÑÆQ1;î+,ÑIü‰j™èµÙ ­aL<Üt?%Æ9ÙXÐ Æ…ôì€_È… Ý«Êæ?‘-ädC;ƒ=T^ljaH[³²(x§Ú’ý0• …9èðl åIËdµCÄv ¦=ªª¤Ç×Ü<“žPV½•áÄ UE&kTø ì“ œCqL/;n´ß8L[̹ !ã‡[7/éÄà.•g~§=™Ú¦ñð/Ø©CN›B uá‡4oðmÂ70è+²fýsռзꘟÅÎ ¦Aë"â?züÿÅô7Ñb¥ßHÄžãÎÍ’¡„““rã½®ý®#Pµƒ™ÒÊ „;ê§ýø"ÔòÎí¼óÝÇnk?ºûÿ~ ‡ ¢:(²Ó·2ê+R¦û/jÏwøÈ˜'¥×«À¨±Qeë¤c èyKÜ¢>S“ìÿ5ëÙNÉ2³ RŠÃl$ú“¦w–%yAä{\BôHPý¾´uÒ'8ƒf j:½ô>Á„¢8'‹¸?´‡S#Í·1óZµz/î¼e»óТ‹}ñ™x|*—ÍûU^«øO£«ÀãýÖ–ÏK7hmU‡¢ú5bã±`²0¶UËøˆ!ʧG"ƒÓû7»¯Ï7ßg ŽÖû+Ðb­îOp6B„,ßeðÖʶN†:±{ÔªD•)±ÔjÏ­òŒ[¼Ò­’göªÀFá„,ý¢ÄùnßϯBU@Œ(0{Å«'˜÷ch#ÄOÜœG‡ÿ•©‘Ä´WÀÏݪpç47¨FQ|ºt¿97×€[oÛ.¬|ПgZݼIRÙÜj*lmwÈSÄËOðaq©»Îþz{1l—}äIc¯‡»¼ó"õËñ6~¥g=1çÃqõIú^±8&ì*ëê…ÿ ¨Å‡—´IÞ¾ÁÖ1§´ãŠn5ïñlrõ’èp'Dá^&’÷ÿÙÝ$>Ú•†å´Í!]G‡cý÷äûf±ûÄd˜nçXåÔzR@ÿ4Ím*¸~¢ëÖT4ï§¡Ñë±Ò^äiýaÜN­]×h¿Õóï_iâ,ç4(>CBj†q‹HšÜa+§è-ׇ°+…ɪ„YÜoC±Çüó,Xÿ¶á"XÃîmÖPuøø‚ýcŒ´®ƒæ%¬‚ÅPU÷Ì”¢™2y¿è6WnžÆÙµç½LŽVo/ W-Oö•´@ À¨&_f(õÈØÔ#hðKóç»Nl3ÙrÅÄGµv_!•mHJ&pã ¶´û–ÉÕ2´âÅ)eûŒzáXU¬£Ö”½È:X†H™… ad¯!Å‚HNB­”U÷¥&ÎEJ5(c¦­g:ò&0±é„ˆ/ !*ǚ軨ίs- &(ä)+ö|rk=bšuyM¼`ZªZrå×þm´î…6"˜\Y+ž´O첇ˆB*|’Ù /Û)ç´>j@Y¬°4Ì(I ñ ÙOcKvê ÉÌœ])¨Î%?ŽJÍìëF“þyºÞ)¼ê “¡™7EÿÆ—TMêêiäæ)´´aüÔ™Ϋ—L½ñ‰+®'>$%sµ ˜£7Ý»ñA´˜«ÖÄg^ cÜ8âœî6ž6s!´,8Ör¼‘~ LKß6K¡Á¯~-WácÀ6ÀïA¸Í·Ä Ÿ#ÓnKÍæÃ<]ŒV›Æøú!Kº»Nöeæ%ZµâÒ§%$¡!L>l0ö«ÿ}ü4`ü½(sr1ŽBb:W²7´, t}¼ÓѪõ«“¹c 9:øcUTŠòÍ{åMø"©õHÅ>G\ÜTÁ4¥©@bª[ Ž1÷4_ò|–ä6¤þ³vY±|«Iiî1à "â÷C=ŸWÔHÇÓUìºâô÷X½¦¹)Uj9ÛPÃ÷ùüoÓĤ&­ƒnN¤ çbØøÚÝùh)ôƒ)Ðü ;Fü z6¾ Üáýn³^ýÞNÐï*€Ì§³Ä>==즘¸rØ©WuÄå¾bÛ¾à|†x;fKfX\î™åão´]/ÃWÛ@pdæ\1 `>øy­Å¾â!ùü03sh;² ú¹†z¸=gïá xˆÖƒy\ê“<5xÁƒµ!8ºÞF†Úøb†›~ ØÇúñ˜‹.If‚'£*Êc©m]~Ñk]Ú+ÏQ9­÷ ‹\—YüÓ¥GŒ¿Øþsûc;û'Eà;PWa/Á÷ÄýòõE¡¹áÑ︎y.Mƒg$.ýgæiáÃÛ{ks‡ŸGj:wž Yb;jÛä“™+\8Ú9Ã/Q@*–¢=*…™Œâ6øðQBw§¤2SÑoUâˆ* óFNšf×â¦óSD×›^3-.¬à8Þ`¾!œ{ié{KXM|.$qEå7:„¶Ý™Æg™Ý59V’T8…` Wµp¡‘üsQøqÌž›Ud—aÞÕ-Ê¢#EÓ€(Ï,;t?]f 1´¡oQ%Ntåí鹸ê}Äyì•À¡7¿T×÷DX²—Ÿ jÍÀô+³¹ê°!'-“÷(V(t˜Ë½qp*}0ƒ<š?“â}†%ã§ÁÅ)§ZnÄìø¢mò üfÁô\®1¦ç×{€ZJø°x«¤HòjºŒKýÍø\íš’$°y6Tµ<§2zâíi¾ß²ÉÉ·«¢³Ä®ù.•^†bÆ„ ÁóôßÑûù²Ú‹ê¨óóp@è×é>}œ‚ ÉFi_@_×ÞÅ ÞO`LMjË1Óýó N×ý¶áÆÿÉ|ãÛ`9Ü'ø YßßZ¦•š óFøÙ_‹ê<Ôµ{̼±52?_Ê(­’€áãµY£ MOä¤I-Õ3yE4·fDÃHTÜÞey§ÜÜîA‰½‘ñp=¥Î¾œÝÜÍÏ©½LÉÞŸ&*'“[ìï§×Ð<…nè ò5ËJ¾2–Á¤oƒ}ÍËM5é_eŒjÅêÖ™ó5ùæÀ%oüÝ"ܰá¦'zb²ÑÓó”Â=7'Õ3›Æ±ÜËÕç9ÏçöÕ<Ô×Ï|xö"èÅ2«ÿ®o[ã+T—]¨íÚÌ6(—§OÀåF¡(<>'|æ_€»Èu4 {\¡œ·Ué1°™£îÔ4P$¾|¼úú“º½‰Åoã«jÇtòÏà”œË-Ïgª±FÍE¬ßÍÏTå;Œ6hÌÙŠÑÌ*5²LÇŽè^Ô©hg,ù@n„»ÏÁZÿñCø0ÉQ»A‘ åYO¬º¡|5„³û8嬞©lw!U6þ¯çâ†üPº@N@«\bÍÝyË×´ŠÖ²”_àOñ©)8õo¥§ÅU72çËΉøÓM!eùÀrè qŸØC@ËŸm¡a¬«cÞv£ÑOf­b.o©î¨Jæ¦è¶þÀ‚;wÚÿ}ÄÒ­×tƒ®½!i/¸oop˜Â+rÌküˆé -*½roeãÙRØÛâÉ<´ËɾIDdZ)RÙ‡ÍQ‹% M½Ée Ã6÷²Ñè¬<ùtwè:8ܱIT£¹|¸‘iö> ß1“3w÷â {n_ óöÄõˆ®ò‹×ek˜ D$ÛõÈË%^…&y4^º_v_Îi®Ê:Çœ’‚;­eû Œk<éu\3KÈSÁ®ðþ9 ôO×U/S]-µVU cÖˆ|ÔÀì)eºá/=æ$_£8_ºáÔŹØ¶Ÿà¸õC…ùÖi[©Â„²Ò~c¬46½‚yÈqCqþEš°lAËÄ•9÷˜XL×öݰõ{ga3¾gxP«ÊNJI@ê5Qì&Sý¶“´ml mjäÂ"\ì²>5^Žpj"h"F’®k̦¨sä£Ç‚môŸÝUÜÚÇÍ¿A!4Zïp<ä£zëÜŽŽÌûâ‰ÒjPÊŠe·¡©éÌÂ\†âMÞ˜þœ}Eîžý ¯~ßWÖƒ1„ø{pjÊ;ÇØÈ³|·Gi@o)1ükäQ¸³sXvæ d‘þTÍܾ›\zÕ© ò2®‚†éyµÍ~Á%™Öìø‚‚9JÑq¦«á‡!mÖ<åkp@YmÜJ<ýˆUìEPÉÑy~€àж‰ëý6¨î(øë>4ÅÇçbþU-ññO0¼¹›>C2Ñ ˆÆÌ¡ü äÞ5¸‰¨È>b`ÙãXaþ_›"x Ë(Kdú%U³ç#°9ñt–•Ïä }2×µq€#ë õ¦Èüt šQ˜öd5ù1ñ8+ük¨…žV®ÈZ¤ÿWç‚6LÔ±›ï—CO×>oJtŽóê ŸWïþFã~'>/†ýW•ÀÚã¯|±YaçÅÇ$ùR ß?K-ßΩ% îgS: -¡º"÷òï»îd®®ØWüqiÔ«¹àÛeñïâ1©aÌ*é*XÏr›kéR¯¤xµÞhÖòC›È;,âø‘`Œ!\†–±ˆŸ‰: Á×|޳ßgr¯òÕPZ›©§¥Ð²µÕýŒ9†ó€ ¢=9Ѫ¾«I¢êî Œ § ¢f>#¢µuj +/Îý̾9ƒi«hŽÒÎ÷>Ápë„)•Œƒ®ºÌÝÒÉ8ýYìe. Ë@M„kÛå?AT@¾›ûl,£ÍrpJgkR‡úU·NgúlÅŠþVAùJí¬ÅÆIœŽÖ?O˜“ÿØ*Lßó2 ÿåP\ˆ¡ôÂâ¯=äÒ)]ΧÂ~Ãh_P ÆØ.µkN]î•\*É?søìí7ÁwîžÊ§C™$Õ×óZš®^)ɹf¶ÌéÅçÔ—h–ZëhÏp©â¼þ× .$èMfÄ}2Þ‚ÖŠ w÷y²j%¤¬‡ždûôùà_JÕ vŽûK¿Kj¨Qb´Ïá´%ž·‡€$±fcnô⪋0¤A=àÖFßñ{^Îcü½ŸIƸ”§…ô­ùM~ò»ozZ (òª‚HÚ·í3œÉPÎ@â{„ “¨ý8^—ƒ\lT§ìü'¨eó€+™¨êúµ1¶V'ý ñ»,²´Fý‡P÷ëîEžL aUëìDXÃ"u®ÐrÕôô#”(‰ÕÌÞSŒÜI²ï°¿ÝeI›%+;«I-otý‚ä•KŠ÷2Ik°Ï91 Ã$kÎÐÛOÁ~B‹´VY«Rµ Z•Ï Æq%ßÄkŠHzþ¡1×2Í7ulAd +Òa†²*»¬Q¤¡Á8wƒò|†ÕÙæ'3ãnùRB˫ӓW­0À~¨r0ý ~¤ïš×TR.Ùsn"Žñô&mý–Ã¥åó>a÷)ŸèÉÜyÎíGá¶Á÷â"ÁÞüBª8æ¾\oLÆ—øk×>Í×Ïäi½9‰Ê›XÝôZK'‚€Ô›Uv3ÍÚGÙTDË,f`³LMY DpHQdFUÕÚмCÃÍÆð¾,ÄNG›Ç±)Þ%)̶ئZK’ùoò¡ý="¨™v€LmÁ‰ã‰°Sc±ÒBihh;]‰ý.äÎ`àW{£ï¶íS *2€}¿ä ¤Câ$ê„dЃ±5u†ˆ Ì1<Pºj°¼9j0äûùŒ‰êT€§ã"gúoí9ƒÑÞΘЦ0iúÑ‘CÌŠ»•.àØßâÄ‹+5Af ä´qY¼+ßËl¥ÿ¡Z•Ù»¹¯Öì’“¥O·åÀeXKY€hƒ¸)èMuµ:úµÎ½6úsØ¢_øHVZ@SUfÍVª˜Òì3ûD‰f²Þëcð«T³í6lc¬–-–¨sä\‹`ßH~—K(¶’œ\·ýøF*µ¿”p©¡ÐfwØvŸ(X¨K^‡WFˆDa\Ž?‡[݃ù·SÂKtËxÀE¼Ý”ãœ=ÃCž™éÁ†Ñ˜ [•1‹ÑK«”S™Ÿ6™M^i_µfff»¥ÞŽ(GÅÞ™ÍHöbŸdÿ>ÇÛõ ¥ §—A êäÐì8뀿Õt‹ÜÆAÎäù×HÈ1œùÕdÞ†9šˆE;{RZJúçȆ{<žZ†ÐT ìëß–%’")/¥GŽ­<¾ºh\ëãXJ¯ŽnÕFªõ]Ëïˆtc»OaZÙ>ë}•e68¿Q^­&\æ°/>zÛuåìøX¿™V9¡i»-ßéì<êÏ-º[ˆnÒ†‡fÌHcgÏßüÎ Ò›™Žî¼ï¾©²%w’¿ýº¾JJ>Y‘5â870úªèVÌû¯“`Ê«áiò«¹_S›7!Iô´cö¿`™Aò­\ø®‡:Ï)žÙØDÔ­3‚3¸ÈªVtð¶t;‡Ôý\ÿ®3؆n™\FÿSPµ¦Ôxö¼áó‰RÊ|-BêˆR¿í˜mýï ÆdÖuµ¾¤‰8©;Ò’óû Gs—÷^zÍÀ¸d‚Ò³»,Ý ÕK1 »AAoã;,µwH¥^jÝ(¯³B¡2X?fä¦Ñ´öm—ôŠ>n%µÖýÀÞ "ª’`^h«RƒÄoFngAzGfó’¬õÈ:'Ûº6Ò½$)qymU‰s*¬Nù=Xå#çÇ„÷¯þ{K¡þ¸!ÖKbjï"®†¼ôTKºTús¬ûÊî?»¹€#Z«œ8Z-YçÂtzNà!2¢áÐΪäBfóy¿ž}žá†7©±Ö#h€‡Šþ1ûéÆö‡Obøˆ¡E¬“= Ž?ÂÑðHuFr±MèÒÙ‡X'ˆÞ憀Ø6‰<ŒõÃP¼(ÜÛ`N0E ½©ü™1išÃ¿2C—ß“'Ê1ApØÄƒ¡ÇÒ%AG·­-ëIYá1@¹ átwNÐ"öTÙ‹ æs4– _žC E¨ÝYb”ÄILåö×¼_Qt¬uf³%Îà„¥ëXÚ0~Ma.Ò¼ÝÉ3 3‚ 1uA·ªÌ•ÿȱŒÆÅ›ÑûñLUåæ4#íÖBN·±-n· ?ü\ „œÈñ9eñrHôÆiÃì+Eœ£P>ÃVHí¬6ü»f×*îøÐ­è âü¼Ra"Œ7G\žtÙöËÒ†‰o£«bøXAª’Ôò†ºÂi-¿`q±ØuýPP ¦’rff »re’àQ%-X×*··I@dDšò}£ÌÐÎdO÷³i¬­Š›U<–^ðõ~K<ÚÔVhh EfV?ìÎ2f©˜ý"dlŸB¨"4UëRÇŠbÿ¼OÉTo̯~ èt?¡—lNßœ’AK/§ EñÀvx„’p<×! ä¦Ò®~Xaû>aÒ ^<’f€Fù°˜~ÖPm"«ä#×&¶Áx^éãå]\Ñt–ËÖ”R0}ê“Z¿&d”rªz]$v|žãˆˆ^  <ÁËû‚,¼J2q5à~1nÍ’ÞMh3a72̹œ-¼N)|=T¾öyֿŪžÍê2ÝEïëõR¾À‡kè(ðœ¢*p Æ$‰-U<‹ÿ=pg¡^Åü̲äÔÙ3sŽ¥øQÑï¡M½›h+.ðƒh§›|N ‰S캃 Ù­E1Èi0´„R}=Ú†%žßþ®þJƆ@—ÀëˆK]Ô–|aCöZtô×V­‡h„¦_ Lpß"ô´:úòÖüyïÝ© Šï9¸îßÿéY"„÷7Õ“òĬ£®ƒ"Ê’šh·ô,ºš‹5Á'Ѿ’B^³sÒ›ya>²†¸Â°ð>(Sx²³]þËJÎo›3ëÄ|S+ô˜[%òäHjÚá|°²Fóa÷±ç<íà–$Îe3^i€@¼W1ñ-„‚,œT‘ìÑþµ^»œ&‰ö!#¹Ý]Ž©žðä“xhœ ôàxrÿÈZTMÎ^j-‚w¿º£’.²uƒ•ÄuE‚J»½ /MÕ0‰­î &ze¾uk)“¬CР ÁT°2tÍpOa]µ³Ñ™®5rßÓÓuØÈXênɸüüqñü‰"³.tnÇÅ7™ÔјÙ>@ѱk>¦„›ÿ¥½ÈRßH¬ ½B—ì]Gççñ£ÝöÖ‡¾Ø°W^—Íø¤9’t™aI«fÖ!¨qˆ©[¼äåɨ»8\jh§ÔÕ%A»ëmýæ¿ÿÁx5e$4t÷ËoÓ½AújáàÒÞ$Ʀö7 ¯uµµED@dùmž§c麾;¶‚å1ƒŽÜ’4Gà ÎyñE ç†ö”ûŸ²Ò_ËÓúšï~t‚SÞÝ,Ž9 ÛÇ UË›ûÑž·Ìý¤\´Ð33Få¨åŸÖŠï£blURÖ’”6R¼SqØ3ÝÅÈ"òZ¢ÎFñX—–kclýª4ëkY;Ñó Ð †ná³û&%¯îF…žXd€ß–sûS˱w¾Ö|Ö™,:!€7µvµÕ, ß=ÁeÞÈ0³îžWšwdØt÷\ì äXŽPiÄ %MØ„6ÜÏ~‘äÐEVíÅ·8{ÚŠ·8—ï ÚˆæFZ°±Sd¨uÄ ,WÑ'>Ÿ ÎqìÄË×tºCúà™æedÛ¢Žc ÎÚ€t5‹+'‘ŒõÃ!rÏø ˜3Þ~/Â-5xöÌæc4b¦v·~VÉÔÑ?Ý®™e(Æ1ÉÁKíÞp‘ñòü»"ŽÈx0ži 쀽©wìŒ[‹mULüÆÇ&ÑU·‡W- áþ–¾óú°™VPÒ$a‹¯ó´­Þõ0µ®~ôI7I”°ªsãD ÖI$®²ù-úéèôâýi7yd½?‚æ/Ì%mó»gôÀàw+?tŸ‹íÈKv–oÿ{·ßËÙæ£ñW‹Ù¨æš­&ŒžÔªöd¬âØméï¸÷Kaá<ýùˆ·\qÏåÿVþ.TsPa5‘P0gŠ þ’•iYÓ\É]•á_£wh"“bC E6OB£Î_Ë=w°™=>”ÿ#„ ØD{ ŸT*,‹dYì ÿq9„ÛiÄã¿ë±µBJБڣ > ¯Ö‘ýz5Õjt3µ°Z"fò%&}³€è› °÷=<ߣPƒ«Š7ýäj½R µÎuˆóék j¤Aÿø~ÚÉáØûS@Œw鸊ޒ/ ä ^\«Cž}±ºGýÿx‹¬„åhéM9øðÍàE`ÿÖÞ˜ªSA9hº-L÷™àùó€3ÿŠ@w×'âžúZ„û¨@¹!ÊXкI$U #5 ó‚Ùµü;õh‚©>)Ÿß‡:?o}ßÜsHŒ€x©d·Ök™Œ k,¤¯Í6½Í(‡v…ô›(04*8ÓE>Û—±c¯äã?eiþÌ)µ,dMl²'­7Bäô•è ó ígÔö?(gî/øœ«ešGDX‹z¯[‘C„ÔpþÕqà¼j»P… ¾?0‰ãÁ<7å–”tæÀº6ñ¹oZM¹;¥!g6ø®@,ÌOëê«#¬aÏ™ž%¿bì~Ks) ¯ gSëÖ ›ÍOb^bûÕÑ'¢öe$ƒAŽÒƒ/ˆ©ù!ØCrÝqiUW£›OEösisFܤG‘}è¨Í³ä"8–£ü”Í|Ð\ž{«âb˜”÷¨üj66!èz„Qù S<.&nù¤7:¢jÑæGN)Ò£hˆý§Å­%2 Ê;ç½ÐµådöÓSÙs±žQ¸ÙU9 œnþ­.¦F-„¨+U`t¢Ð¢—/&öÜ&w[v Cs¿&L{Ÿ?±;`¯Nƒ]ž,ïX‹îÍ:Â@¯¼4ÖWÝÚÓsIš"p$Ò±-‰öFrÎNûR-ÁHnmñ~AjÒOR”z§ z˜>’rPfÖZÐû#£?Løû ·JëÎ’ÒzÞꆞÌÃ-4@ nCyÈ]L›Þ‘׊P…yË Î9?§‹á1›3´ âÅEo…ÝÏ>ŒiÛùÒ2Æõ™ß¶{Ö©1NK‹ìA ý:ò¶SÎl“þ‹O%²ŽeøÓÁK¨áWsL‹æ ¨ÇHZ¯ûý;{õ¨õ£Ô2g,–Âíš<4¢F”ýâï× fdó%fÄÇâö%x¹D&c`U'TZs’‰•‡×QcݲWüZ|:Þ¦Ün!ûÄ=&7æÄûì;å-e.xgå–2À¼JùÈ:)ƒ aš™ÏËä­EwD·ì¤±Éþ%tÕÁ™{{ç¡©†Öù2ZAL|úËúm¹ÑzSÅHòA ·9E• ò Ôÿ^oQÊúC=Ÿ‘‰¤Ðʲӵdè*”B—N ³r$’eÖAŽ[ƒ:Ì«]†Ì„`Ôã…Ÿñ÷ZHjƒ²?TÊföd8y::)‡LïCÞ#S¯;ô&I11€Îy*n6u¯¤¡³êp˜z¯°½Ì!ÉÎÔÃÔõïÒ)8ÖAô{ŸÂ~py©p0¿ŽL—|„ÒåëÔ|ìMlÚÓäéMR©ý)ÖêVßÜ¿ƒ Â…æ˜@9Ê‹3ÐÝ‹-A_ôH ¡ =Ól!Õú³HoÊÄg±‚Ÿ%Ãø˜9Yk㵜W¿à](ƒ]ªˆË:QúèšÞäehQhÓF¢GxWÅD”uQk¿…¾ZT3#.Û…OrxgVpß@lþϽO™bÊÏØž²Z6w€eÕ1ê#~~Ýw–< ÄYeDçеlÒÆqηªKQz'ö02%Õ ôKYZÇd­ÑpUõE2„"¡äî[ÄñçƒÈ©äP~nS;}Èô’ÔòÉ)Õ”™ø–÷ÿï¡6z%u(Ò†ÐZ Îè>µæœ›ÀÔ‚(Ó+~íQÑSB* FpÅkç™ûz°jß—ƒ’¼)’ÜzÜù9HJb…ò¸(…bE?ÊzåÆy¾=®kÐÊKèÝB¶³c¡®¾ØóøoŠŸ—ÙaRÌ“Àω3î £FÛím×±Ê$^¹Â°zÅ>ƒè!‘ÍÙå[õuº¨ù:'°Š2N7Jwü/cïË¡CšVãu¸ál£rï"±ÌŸ³/í ¥qFjTFOmD ²)Ÿ|d6IñM¼¡ÇÖšL „;5Æn®Q®+­„ÊN"}Ü<¯5#¾4û÷EÊSâè fÇŸs ;ú›î”[¶ß–öT‹™ DîOØXÕLMaõÚÃÒyµû2®)=•µµ<|>@z×gc‚©8‘} R°ÜGˆ\ÅÇŽ½¯ÞxëÇáÓZᣔ®Ng÷ººÝwŽñCg6Ò&ŒâÒÁó=)fÁ-ÃìŠtˆÓ"—Üj(J¦6°´Éᡜ¢ŽDzç ÖöR%­lïùêDÅn,‰Ív@* K…êí×ôÂHqï†YǬW;HÐþx˜Î}³·75úã}Éú.GkÒ?—À ÖˆkÝ,EÌF-u$í)eUïïó¨]ú2¥‡IÌ˹sŒb·°öQF}ƒ—.NWÃWˆÊ‚ç—Žþ¢hd°¿Sº#=‹r¢Ò×nãËË-¡ÜJáäÈ…˜!P>ž0\ð!B'±3Î%ogE0 m5"ã2¥gåœΩÊY`¿™ß™ƒP ã´F·µš4;Ö²Ωk0>!$üûðÇ¥{5E˜£Ð¥>?G,/¯£d¤ws™Ò«'Ì3»óÚRÑëäàÿ9µ°;s±`>ä¾­ÊIs†½&h=.þ¢K ŒïဟE¼¶LíŸàgï£?Rµ³ÿÒh}{i@v%xþLØ=|ÎM-‹ß…ݧ÷JM&koŽõ+×””È=‘™¥Ȩ̀ыfM{Öh±Û¯@üSg“wm˜N{KB³ÆqUQlfëcPîÁZÔAFµ¥‚Ðw ³3ox£%ŽèE« á?ÙÌ!<ÿ'f/¹cÖ kKë&”ˆÆpÝ¢ãHy©àg$êýœ/OÎóÙè©~Ò±Y¶ðÙ7†öuKÛÚͧs*3 œ è% „P™ÂÎË!­©" Æ8†.’£x¬É‡;§Ê¬á†Æ2 4É_ïÃ>êØŒÐMr¸ì]i'qp¯¤ì¾üùŸìo É)éAWW X¥•Sá²_â#`Ñ4 lw3×a¸Ö/ƒBû%ö †MÙ»ÜíÑa  ê’¬½Þc¬yáÇE\’Æ2ôôPßàAÛÝu›I?×+iëÜ#èÝÂGµ Óñž·b:{]Œµ#›‹e¬þäÎsík0®Í\­A$pk¦1QDüë_E{oªPzGœ>Rðq°päf«þ Ïå´ÐÜ0É|ŽXôt3éìEí0ÝúC‰;ót†VØÍL0«·ˆä¹lþe6D§JXÁ¯i°òÖ× û zûÔ°¯›ü J®Ñ†| ±·¬ÄüÜQî¦O6'â:Ô˜0!ˆ î°÷è…SÈ1g,\’ƒd/PÀœZô™…䑲IŒöõd£÷éç4¥d}!,àÓúȉÂÓô$Y•ðŽÃ#yŽ4ø;ý!£“>)OŽöQBl‹‹&g#^ Xèþ‡[Zè¶´„4ˆ"»Û']K/„àûÞ¸m`í^BhÆ+•·•1ZË W’ð%ò¥TFæLj°¹Þ8@s ž%ÇõõŒ â8¨Ýp&ø>Øãûÿ]ŽZ<Û±…õ…›ÖÛOÊcîT¥p€‘팻±LBÂ)lüw ûq"¹Û—çâæám‚ÁРÐhÏspꟷUÈ—+oÐþŒ²4Ã&b.«’Ÿ„ÚQ MM*.KÐX°fžðª´ïíô\Á)\O~ç›ùb‡GÑ}÷¼)ð"ôEÈŸ´A“³áfê\í~öùgº„€†²Ësv!»\~Ψ5`/dÖvÌ‘)RmåQ‚Ì\´„ª=¢Ò$ûAÏ ˆ±q xã¬-”Ò–è#‰cNÕ8râüó‡Ìõ[Ù0iÜ>±`£âK|%~9»öØ×9¨9JÎy¢O2ÔO =ȉÆ?[”üËp Ãál4+Ó3È1Úó7/´ÅÞ«®r?Ë^ ߇_¤_³V×ÌY,ÛÀ½2¦âÇËÁ˜Ø®)FQ¶Ü©i}àSBŒ(¾eq8ÍqÉcÿ¾ÅÓP!¶ß‚î÷¹äb ËÕ<3ʧ­³G¾ # |w@Çï5S5¡î×µ&îOS®dm2o‡‚à*•B‘h§u-¾šZ+œU¶ÇJjlnA!èC¤ÈvÉšµÿŠ-ò¤êJS²Gu{8<ⲌwÑØös­å«`ÂUh"…òue“mG|,4¯Š Î$3„µøKçf0áÈʃëO;Cª)ÉÆU_ý=EX|~Lî!Ò¼¬â/Võ6Qä”ÄX´˜FlºSÔ¾±VÚ©#o`Ž®6Õh5Ú€OW¾z™1¯¿ŒÁnÝ0ùøsµT´q…ÀU¸îŒÎXŸsc™ÈÄw”—nõœ Ùð4eè>ÙQiƺߕ€"¶7À ‘ÞçòõÙ%(k½Ç÷'+¡¶ÿÚšqþ.¾íqãwÚßUN%IYÙä ê¤0>:\ >ÝTŸé¤_t{#cÂŽpcLÎl«³.çËh*ŽZŠÑvì_HÊ}"ü÷AÁ.ÿÎüÄu¶~h»û2n¾^çöDèOüÏbDËû™#w°1ÐOÑWÅÕ9·¶ü:'×é¦LùuÍøF÷Å߃·6ûù=*Ú§àå ¾®`H†|(ùFŽHýœÙ ̵ªÎÒk¨6@Ù”¿\^e¶ßåKè„ïW…ójˆÐ<{µR}´Äˆ^Ù,cÕ¾ Ô+ãÍ4¯Nnó\“Þ(S%7_p>Kf|.uÕø EÀ~Ó…¡Ãª0±ÑerÛË­‹tkb>’ #ùF¤¯„QË%÷˜U»!~•3»ò`ü÷êU#1bŸ½\à÷eÔÂÅÿ¬·.¾ûÎGO…R7™ ‘ „Eô®J‡¯îñ«z®²à̲Žìšñö(N¢—xœ¥d{çeKÒt—]*4ø5‰²Š¥ÒOé2ðguR´_|‡ååóýP­`…:’ %\ÖÃâ¾"m£Ý %ÁV(ô)î#0´°^grÚ)°v,0m‰ÔsÑç$’p—øÑßÚ©ô Â-!=ö‘rÉ·'¢ën”ô—âA+ֹ؃‘ÉOKêx Ú¿IaÇí$ùÚvÃVÌý,Ì}MØÅ ¡+ãí}]!G1‘NUQ5­Hb˜< ¥Jr¥èµ[Ö¹ÜowÖhQý½"€Å¶JÃ]mÅXÀíû…¦4·è14ÆïU{ú’íe¿bÔDÄéj†ˆ=ëHŠÌËcãmJâÕA `d™,“„?³€ \Qʃ¥¤<Õ&Ͼ9)3BQ‡œ@Ϫ–ë¤Þ}j öö@£§{ý¶ýÁé ­:ûPÖf²C’H£^bãì“ôàxGY¯$æó%6¤{Ñhhßö‚íVÏ€æÌ?„âÄïv¥XÞîÐù§RuƒÜÖåUÄtoòëg7à±×‘GÔ„²þÃí¯¥#ð6< U8@”3™š%è2ä|GtéÕSžb&uåqÑYZø‡1£AŸ%W˜.<¡Fª‹_:=•îZn_ºPeãÍ=gB¹K¬Í³E÷`‹Bv«n]ÜYELši[²ÄûbÙÑ-^4ˆ’ ý´ÔS LÈ €óÖÎ;ÃQ… °0éä85¹¸ƒb죃âj¸†“Ù¡î R÷`¨ˆ$_E®È3Z(®…jʾ c,8îyõìªÛ¶'8=}˜A{(·ß˜>u‘gXW¸Ë¥wìšg¨Šv1_¢ö¡óß·¥êÊhßóãôÚé†'´x>ŒƒŒ Á¯Äuÿf­™©…#*ŸÂ© ̺':Wé⸫­õቚåŽQ_\â E¼Ù+ËÖUBüðȱo=ÁEßt†Á"M ] 5¨XÞ:v·ïΦDsåÞ©~ÇDGgB®‰l$«Px-µOv¿'ˆù¯P.ÔÁ¶ýPRÅU)kVk)œPíÀ¢|ßù~7á9ÌþW´5µLÛiEðÅz¡ím1éH+{YÀ´“?×c/Ó¾J§­ AfL#¸E¦Ä¥ó±@–؛Ꙃ)ð~$]Ü¥øŒ‹:7^(}¿ìY\•ªå(LûXËJ¶8K=RRSªÑán¿±Ÿ8üXP›Ï“r `bîY‰_Ô@š–¡)ÞKöÙ÷ÃÑ ç¼L¶Óò2ÑËaÎ>Ú²x ”§wÑ—¯æ:EbžCïLçHña_›ÚÙJ¨e«RN‰í  W³K/ºkzŽr2²³`*Cã,…Øs4µYsƒÀºlmãk1β11oA¤Ôì@‡6¿±CËaœE?jfŽAFÚü›sFuȘÞTÇ¿j1pìŸÌû€¶T¯n·…Øp ¾%þïö _îns9Žg„ããk,ždàQ—‚a?E}ãI4k$< «ü2ºéK{°:è9 Ú>êEÙir,=¼Û'}¶õ$-~¹¢WL…Ùê^)w7)IjääòL¨BUHY±æ“Ôÿ¥À*èƒÐúçÝ©£$biësGè'Òå¹ZžžÁž;­“ý„ûb†-à†O~íìy— !EbËlK•¯ö ©1”[ܦØŠUß»ƒÆ|°Ä‚ß85n•‚‡õå£þƒ“­=àZÛíôs.¿|×<$wVê.ªz}ìl= «À¤kFH í‹8ÚŽ0Qã(Ë›~ƃÔ"ÎMwŸÚsNØÿî…è® X¡¥G-ƒÈ’rш.qýxkÖléGÁÓl/-ríáV1çs¦þÞ8½Ñ•óñ3³ñÑV®¾Hþ«!Ôýð@Z¿ï?3¥WË·P¤X¦lJú@…—ˆ§Œ@p㫯ÿàŽ6 `ÛÖ!axxÉ&h)\yë„9Ó¾xs '|ôêV>t\ùØïQžGºb—÷²A%ëµùŒ3º^Åœ^ëžÇ¹ƒ>l~ßн³M%»‡%hóÏüWúJ¢uh·hyfŽì9¢é¸£sÙØa1u±õÒ l I{Uœæ¹#Õ^wYž¯ëùSZ G¿X(ò¯~¢Dµ·ÈZÈœ}Iž6ׄýËÄFôªâ<ëê8n·~z›è£vóQDrJ lì48{‘*S°·«DÒåvgÏyz ºÆ&¢ø÷ ¨»>;8Í…}ó°-ѳþOÔÑýBn§ÿ¾‰ÒKÍŠ [|“¥žFT»¥Ûbáàá— Œü¿‰dzß VÕɧ’v­IGñ°ƒxÿ/ÍCd®ÀŽëO·{HG¦S9$ôîÔ1R`‰^ Ý3‘oÙ•;zФ®æKRyaÇÒ×åÖ’¹êÍ·gWŸRô…Ø6Ú ˜ž@uPgUu‚’ÐÃÀYÜ-r–å6ÓÖ5t&òÌXº uº9{½“gésŸõ'’ýÍ$mbéVXŸR‰•æBŠ´¯7pBðE6ñæÜŸ†\Xi×Aõ‡‘ Ý£19š,?Ž$|`mÏZøF”᯻Ą$¼ä`uÎ5kg-öjTú“ÄB}Þ^‘Ã¥ñþæºÝQÌ 3ë %΀vMmt¨P‹VÒ Ô‹_ÊõÜþƒ5µ`Úš ¾Ën”!æàK£ÚÆŽ£{Áòía†#CTjÄþ”À'„u³7sü%¹î‡¾‚²4E·m„œHÝå3§-âßOJ5™ŸÃl³Y)¿û£Çéw²š<„Í/;÷g=«‚^¿Ï‚äá®|™&vÈ6| (L°í=æ‚(·?ùYË]€¡gÇ„1o¿Qa_äŸZwþ„å)ŠÉ– ɶ¦kˆÚý1Å·ƒâ­ #ƒú@S6_浞z)Êjï(%ò7®F,REímýlaôˆ 'y°»WÎÁRsŽ…~9’ùÇ~}‡•Çî¤sËïTÙµÛ¡Qgqçdz†Nßý_ãØ*5è rX­PÉx³ i:´$²g]Є™J€þj.³ÄÜÕ–Sëû)–ÐäX;]G'Ä Ëž‘ËÉmg³&ôÉó㢛é|u¥ø’³â ~†´ q‚œz1?Ã4By0båA…&¼$Ô–úlÝ×ê‚_Ò£¬B6(›ñÚZ,år¥RÑžJäÔz÷)«`—$di- ÐîµD!Õ‹ð.X¼—£,Òª³dٳǹž~›§¾ñXr»¬üïÂŒÚ*Èžk‘ ³¹À>”R+ks âh!p¾êXåñN×¼`Rô ‹‡·ëˆ|¸P…¾¾µêHw/<Òç︾Ñò·¾ô¯[f õ£ÓÏçjéH°ƒ¹C7»QEÔTŽnCZ!䘋åg¦ðO£ D/‰Óó,ƒéz ,åóEÒí¼•82ì“‹uåb Kz÷‡?Jò(9Ǻç ÍpV901éç6Çnó¬‰.I«Ö×*ü‹OÒ¹ÕýE( ëréó¢½ËJ“W[aVdËQë² §¬o3c€J€ö]³c³¾dÀ2È!¡K¿íɘ9€°TÓcu¦5èqU¡½®}ÚMç¨ÇŸŒÐýZ Ym€ë_€3[¾X¼Z6ÐÛL¼e®v¯ÆýŽK‘l”ü·¥šÅ “2éf±ñ¡ñ”:»B}Úû¦:¡¨"B¾=13Ì+„MÛÒ>¨·Ñ ÎþÉUµËÚe‹G÷½Í.¹Ôø…Íâ 2±»„d'äy,Ïr–!÷BƒÀ¹S’ñpºãl†5>_¸à¶0a±~d-Õá;Æ€-5üœ×‰Ït.Ê“hWßeòAˆîs \IŠWZþWÉЙ eb÷Òf]Þ¸’vyK:œÅg„XB|¨ÖZGÒ6ÀÍ(£¦|ÿGnvëV[Œ ¤¢†ô©%ôÿ¤¿Ýªâ¥”ì:ïñ*C(n¦D™ÃA.,€ÈRMP+ÞaDÜíVå“*N‹hB`Ý`–jß6ŠÏßí÷pN?ÈelûÃ'œÛQžy­" @wƒÈ+¤uÏÓµ ä瞇æÎÕ hñü© 8WAd5¼Ü8 iâA`€þ/6=¼ûÓ ¡ñÅSù€Ñ åL´õ¸;hA³ñ5eH:/ç½ÙzéÓv…%óÓÅ[±IÛ5–ÏÐsÄbÄ$Éúqƒˆâ'Yð¤]D»þàU6µ Öãâ{œžÕì_õ²(‹š„Ó;50h‚è¼K‘ò¨nýãÔ\ôì> ß³lL4×%jqéÁ öñº¢ ƒÃ_ Á[ìn ùÚY¶ïõc„÷ùÈ— uê©ÊÝ º#¶(¢Ò_à¬ìP?²ñxJ~êWè š‚ІÁ$ÏZá¬K0‘>ê¦.À¦c±lÏ9–¤ÁjnšŸ‹»C§åC ·Süh§ZÙ‘¶)æ 25˜›WŠUb~N¨T• òUhônâKÊ®‚.ɂܛÌ=£áÂ~Fª s ü ß;Ã"ŠDÓ(Œ{þ8'êŽÌ©TÆ’¢ïè±`[ùSwï៹µÒKúžRš§x«Í7ŠxÛÛÏÞÛîV/NÖÉtB>âͼ¹îãïþŸý}¦ÕU›³C?¹±Ãú[ ÚÝ*pZºÈ1êÓ5¦ÍY/1Ræo’“×û¿¿žÝ@Ùq~›æ&L<‘ß*™‘µvZø¨‰¢Ø5EÁN ¶Ý"­Ö÷ëß¼…Hˆû˜]“ mûY6Q¯Bì =m h:_ó´ØTÄ•ùŽÉš,öÖ6e*¿¤ž½Ä¥åÊì ¹¨SÂñ¼Åè¸A¡Uç¡7`m\UG剄á##Räz’¶Ayëx¼½¶Ìóá2ÔRC°“#]ÊUÁUÕdNˆé0=:½F[Àè”Ä@¡s5«˜K(eL´bóµ„w"Ä2ù´Æ¸Ê"W<ݯNñ¿õGáö؆pd™œdCóí¢ëÍcÝs–xžŠn‰Úy9½±ì¸ñÜ V.ð†#eKâýÌïœdP‰6q|®£·3켈q{‡äç²BL˜œm€?ÒQFü_5à;ºÕ¨G0‘3I»•êæAm±ÓŽÝóãú{’P‚á"÷³µO«ÏÝXl¸¼Fe ÃPÅé$ ‘Ê‹sCLô1N]!j %(þ½R(^;¼×-9ãÀwìéŒ öÛ,ƒÊDÐÙ£pÎÙ$ë¨eý{¹x½V¯¸¸+T$~*ò‹XŒ5w}àEV‡0bñ N°5cwtÛà}ŸŸökËL{\¤Ê{¥¹M@ƒhênðÀ {-œ{öl¶Tb&a˜“Þ-¨òí+N)p¥·“¡_þ^Š‚ 4Ì'ì¯ÿOç–ÊáP½ùu¦×Cö<NËÖ›kôMyD<…Zì`§Æ¤±^ñ”„M,úÿøÉ&dÛÇÊ#”|i©|™ñgFÌJï&nòÔP1<.fOܧÿ»÷“ ½ù0ÅË/¡4èuŠ•öÐ%kù–ç#ÕÔ‹Ë«¸•Ťí/©Èd®yKY’ƹ_fM õX“¼üժǸVg¥’ŽIJ!ñ“ÄJjaòõ´Dö<5ŒMµEx 'ƒÞxÌ•ã«Ð­ÙU$oãc3¥»£ýîÙö|R¾t#¬X÷(X‘ÃçáGpë ’R ‘ÅÎ,?%×ÙBÒ>5ìÏŠ:ÈüsÞåIË·`v+_Ê'3ÆéF'c2Eî9`QéeüúŽWO›BøµvHsrí•V#(?û²£Ÿ%©¯¯¿sÀX_Fûtub›VÝW:Rþü!,Ðàbì='1ä™&­ ;à´YZ;Eˆ}cu•È– 8ªXÏu[*^­Ý‚s=ßõ"Ýåü¥Bë¼1óê^:Ÿ_>f”+oÖþälçÈäö½‹þ9Á7OY†gžÄ u€‘Ã…fú'|ÛÔb ‡ CÑ•ˆ?Î?/CíÐû 8»íP;¨n%í•c‘CÒ¦ŽpÇ™ha]ŠOC­î¯¦°=:ZÆaÃnâ”HÕcÏ,ë½ Ÿ+ŒÖÒ×™ â„+ìVþØÚ„/]Cü>í±ð×±Üç Ñœ ™B3oÚP¼R»¯y¢>áB„7´´U>ºXHfúК Ö bê“ÌG;"ívY&úÐæÞß,nf¨ñˆ°Ùw™}Cé²'_§÷ò¨Â”c`sD:}¯e6\ºÏÞ*Y}”ŽŠ¯Ó==ö»˜šD×¶£²V?Üÿ «RQtþ¯Z$ ÖçÕJ4ã$2ïÁñÍ&VP^Üø¸'œ½•Øbþ_C™´ÇFX¢P5§7qˆü÷бw­TŽ´Tµà¤è#FŠì®¯Ôåõ¾h]•F¬Ä>)ç¼”°‡¦wùsɼìE¾ó'âÄCÌÉû9%©„å£ÇiŠahЬŒÐ0Àû{_I™¢>…qð‘!±ÅÝØ¯A`²*Véc_G/ ùÔlЛÝ*Ùï‡ç±ûsT§éÃj–äѹ}síbºP 8Uš²²{Èk.§\£Ôƒìk¢ž[È­¾}ûȦªóçLú Îÿ—bÇÂÜ»Ä!…]ð Ái Æ{…I K·åÞ5ëú!Í£uO’ <;ùÄÀ€ÌS³šGR¨¾õÕ»!&#—B™×®jœ2’ËéªiÙ9«[“Î]…’tÇ —T#a-Ê.í9v†"PàoY¦8u‹×+gg¯ì ˜.ÒØVÄ/»põS=OS¬îW¨~?6'þbàÕã*kÁ°ËöŽÑŠ{L}'µÔ™¨‰Œ©Jñw.0Ùx¦^ö¥³¼¸Íâ¸Æ¨Õ“S`4¹$ýÇ®µµI2áÇ)Ö¶´ê*´yRxB%@¤ãw–Lq4¥<çcÝfHÿ8}‘P¡Äôfä8ö?¸È2ÊîC>í‘ë·AR= SU^ ûB#àŒŒçÜl8®xl(S‹›Sd—šÇzÁÉ’GÍ|`S>Ø\`ذý|ñ ¸ W%Š/½ñ7}èºã(–vŸ°êx*ƒž0•ñë¿|k6 Ødßóï‡gÕÉÅð­Û-7¡¨[ÛžœÅ°Vê,¥Û–Ùä;oh}AfÒÀCê1¸äï\pÙõÍk³XÛcŠ †Á/—!IK~ÏÂ÷+ÐÿÁ½—¼'\c;ˆªëû¦ˆêËÞô³´¦}ÔþX"n~ òøwÑ ð$ÿœlÝþõh ý?Kàßc†N_tqòð:-º¾&‚19MRXÌèQ¼ª b1žáåÃÝq`éÀ%~^„lñÍwUŒ ¶È°Œ±`ÝèaÖè)·1 Çë ¯œÊëÆŽ©íÙgÕ7Üý¨ È \±Ê¹Èv÷§9]ÿ6MŠ{nN–U-ÆJܾ4d-JW‚ÀÞß3L9¶:ž{P˜ð½p! ͼw„ÊËLÌC‹T_MÞ€:p•k^¡£nþМö»KñísycüÈNo¤"¶«°ü:ÙSdÅÓkìˆ<^–È].:`ÇŽ>_ß Ì0îzý륞‡Ù|ëójb™Þè˜l*÷è~Ç–ü. þÄ뉹5°Ó×ߪTzi–fò¨}~ÂPµ@.RÝ 28)i%1°Ø||Ü;¾Iœ™×Kþ­vü5°ViÏ®,ÒWNã&õü1®Ì0³þâ´VüüHÇ {ÀŒÏ«JGjÊ(ÿÕÝMÝàÛ͇Cã’²m#ò\ç¦ içã\1õJ™¿ó¥ƒ{×8µÐ; ²@%éšØƒ²)ièÍ/¢Š,­µk*Pœ1ÏByÞÓ®êq<<èW()SÄû‹rʃü´Ä°ú˜µV±a>7åã:\O Ûqïuñ™«|ÐÐý«ÍXP·,{¢K&( V6~³ª¼áHÐâ!Lþîä:½ Öýlvǘ{~ jÍ¡´t;¨*NŽ:È_P-G³ ”éñÐŒñ3Ñ‹iOmÖdH"x ¼c_Ù­ä aá?z>'êˆl¦˜¿kIî›jʪ‡{*í;·ÎF~4w¸›Í:=êª!hÀK‰k…“kbóÂxQÖ²zpArv ×&çe¬Ý”Z¼vs}ÚᇻGnƒðç¢nµŸ³éAøËϼ|ØN7°?íd È>;š– ˜ÄŒ†°°áð9 ,mœÍuDeËãáÀæ%U˺ná7ΰѯƒq4Á¯=5;PaŒ|`ˆ;¸¨-¸¦ª~ØM=²É·›ˆmËñI^’Ϋ-7Á›2N¶ÕÓEéŒÃ¨Ø¨i£ç¦í¯wé_ê4s'X´nÃRÉšÅ> ÕœP¼¤S^D-¡âYæ!¥󧜱œ–²HÇXkØp´ƒøfŒÔØ('Õ¢ Uù¾)Y ¯cò~øòýúì&Y\ÈBüQQNÍ´kv¼EÛ¸š =óôL$ã_Ttš…5ÿñÖîwõA|Y›€+—tðú{:½•ƒ’àj=âˇÅX€•Â`ÕT‰¸‡¾€[³ ½5¸Ÿªpc1Þ—0‘Ø·noc×n'ïm8P±HµH ¦£·“µåƒ€ð£x`ÎyfÓ%ÝÍ+OBM„Ô>(ã@ VšÌ©‘ÀûÈFVº|*T—BMH‹ÐX”ã9ª¤YÍ,«Êj¼Nz.@›Ö×0ûi¬%Öò& Ky²}”ÔÊÕU÷`©8‰FÿÁ9ÑçE¿›t›‹'ŽŒú¢Aìd®ht²¬ T9jëœUŠæü3Ȧv6ú÷¸½j1HË?Ī¿Ù®ûfG?ÒZ•^"ºý3 }TÛ°Fn©¹ÜëmS&qV} õФõéžz£fX g„Ïp¦`'ãz›ÈÕöfÊ«èCn§2¦×7‰N&¥n’×”è^!R‡G5‡Ê\´ìOaLÇ’ø¤¼p@i nÈ1©]ÿzPÄ(>5ã Nç¥hü1¥x³½£¥†/fÒH_Ù"$¥>ÎÐkë´ô>;•܇~“ûb@Ú¥JžK¯ñ §®Ï-ŠuyÞ0-ý$ÿ ù|’óW™b´4« ¡U’,R§ØBÊðåT#žù;A“X –ö­{$~Ê?3öY{š!¢áÔ}°¼ŒVÜY35•tš×Y8÷„ùê "Kq‘ëª Zˆû 0º1¶ª¶£¯D>HfžN54ÉúÔµ[LrŠ,„Ó;ÈHXé¢!1\¹T%7×Ù6Tø{›ûŠ=ûH›aëèe«I§*¯øâAŽ]GÈ]P\&hDW\lŒÃo×Ù¦˜½gœe‹¸Q:\‚<€ îÌôi×ß5Nª­Žý£ZûV®6¥CªBbWŒEÖ†Dl·¨j2 zïr¿-f@ób>koæ1)ÚAr/á~þA±¦±ªåèWº½ ȆQY(‚Õy»_L!`äÊø h,ðÂ’cAwÀJ«„¹g·hÒ"ãË9‹ÙÒ„æ›w¥"šfà?’ lTNî cÀ]ÌÎà!6ÚŽájQf¥ÊT¾è=iÞz;^Ó×B^}uûÉl)+ï`4¬'CíñÝPÉÇÆ¾Ìg²Ëwý‹¼Í•3àq"DŠC»=ÇÚ¢º;Nÿl˰Ï’† W ¯w>Kz’U+²mV…Í»%’€Éœsq sé7ŒMb9Ù@Qh`󨽺'›Ý9ë²PÀ@û({êÓ0¾ :¬ÀI‰Œ›¬UÛ+Íx!pè:9}~1”8,Gqµ‰ÚYv=¢‹\¨WBë–Ô¡Dk‚bjº³]e 3¬à e$ù¦ý·Ô_#³ñwvËóÒ«fÜ’$¡ª(“u^M úÓ)&VÅ—÷ð·­í±9Á¬¦Ê²]Ï¿§ÊÃH^¬G»Åy÷óú0O´BSÛÔ6Ø+1l+~KâÓĆ…™ºÙÕÝúòþž®j#wÁ›^¬iû"¸|¹ÑSJÃ:j9üîs¦è鿍o#µxM?ÀÍç±´ée/.7•óŽý¥•¾ÄŒbˆ´#”4"ÚHNÖÔªâÕq^ξNm‘ °òG5õœr/.+g ü¡g7óq©ZuÁå›9ŒÉö.f;Ÿ/²²pÛçÇ| Ö°îþ,F鬙—¨~©XL°vKîGÜkÁbŒøÕáˆ%Å´´@ì…ÉÚt,þÀ¢$bˆãU` C<†[N¯›Þ5¨F|;…›äðÔcHÓ²®©g·õc›­U[%y<–é b«'ÉŠRNš)¹†EównÕ*Ç}†)O€,õºÙÚCá„ÝÞH‹ˆcSøÅS|ù ȲRœ""} õ0#=.§g#¤ƒƒ›[Ä’pçUÛMÓʦAÕâð2B~¼á-3:w~›±í;w=³]ÿ²XÎè1#iyëb†ªÿ@Y>¯/=hbà‚Š¦¤±®ã!jˆ ZÂì(yî=xæüli¹Û%]êÓ'Ž‹ý „ç“ÉQ#pê´äÝ„B _JŸÑ™×±÷_.a÷B?,—‰¡`ÅÐ ÿ_º“¾øð‹»[ÚI~à!éÝÝŸ4yŽÕx¡m.áðÌ5µîdÒC6÷¡rà -}J{î~72ÚÍDD­–¡"|SGlÿÒ0U1R]¨qÚ¡¥×[?í5â†VË®òÃæw,U%>Dñ¢#˜ý½8_oïì3”‡JÁ©~iéŸP«@œ+¹V=ÿ«^«…ŽÙªÀ.lŠFö¡“ͦÍ+6FXÇ}úsÊ9z¹»=1³ø¦ùr‚>ìùfÿP£æ%ÆÆÀ­ñ UxпwP=l’õqWÂX‚ ¸«Í/èìgÑbJ›Ø¥ üÀ¹Y¯Ç–ñA‹ã‰#¿¬à)? H~~´zÉ„Žû3’Ræ5ÓsðŸ9Fòɇ¬Ca3V¦E–F ì×·L{é)IH ë×£ X@+ôT5ãõØH©@p¥3ø˜¤;÷`Ûé¯ÁqOJ³Ïƒtd˜ •iö#{’Áú€äÊûú;«©ïöˆ;p¦y³Âîýõš›K’?pãJ ê{F:Kmê/¹kñ›Z4}›ÂX±H˜—w¦‡ î¡°;Ã;£{h=m­c/Ix/ÓhñÌ©°³…çíY43!ë}Mûç.zìn‹¶¤7'š‡º‚¾:Ÿÿ©Wj’]VñiA‹?êÖÀyüÞÝ‚t‘‰  Y*B×›Q~+Ý–ÆíŒdÉÞêYLÓ“wôÏm¬|rT°±Šëñ'r79Í“p¾M[ ¡âÇ–«d"Ko,â¨PZàEJ.2:Ñ>S‡l 2Â5k›EØ'ñ–6¿ãn.T‚É¡±Y$t„^Áææ¸q}‚Üs?^¹03¹þ f“ÇW‘v˜o’ö<­€ÿ;&Üþ:6…Ûg҈蟣š­Í²›gÎ¥¬ÞÝ3Y±X¯‡FÓ0b[ª{ ¶¯¡dçËhz‘­4†ËÁ[ýŒ‚UG¥45§ìe?ç*MBäÇ9ZÒ®(°¥í¦ŒÁipACü+Š=L5sç°hÛŸ ?`K¢ímG‡×¹5ir(iWA=T züa· £ïÒ/!ÃøžÚ>1[ê«lÍûÝAZBÛJ¦Êä.ǸϧúËn{ùç|C„/ú—öúP<;•¦ÒGÅä^ÎÖü–ö€j!Vß%¬áÿ‚Õi‹;Ÿ|¿PÀ<×øƒªa“›yC7gŸÂØЉ(u'­ãB:$Î9¢]mñ[Ú#6⎠G­&ær…'xÿaÌå˜@NJ¨—9«ÖÒ{Ä­åÛaèb`wÌ€ô•"›:!µVçiضƒ°ºåýOiu5á˜?öF\~ûúâZ(ªgׯÇåÔ¡9âåÇNZ³oÔ«¹®ceF¾›,I‰(Ø3§Fêâ=}Âбð¬?YèLý¼Ã6ëo%>n¯=V?¾ªÊtŠ Ôи€_ÍpÞ/¨/í#TÅ`ûoV„¢•÷Õj~ú0&+ ”oŸS©”V35#е°úæRŒZtèåDŽ‹… ²sJ}Ýs¸ªèFJºna¨Ç³(Û0­rîÈ!|ˆx+¥Ö+LênDTa2µð_¬§&Á¬Å{ ½8°®H¹’!º¬¦Á·•Q4i¡·ö6-½d‚Äií©‚¥GÌ4¿®D„Â7¿fök,³×0<ŽY%à…Úl…êÙÞUÅP§^BfwªGY×[ àz˰{æÜàÙ•,žy2õ¡¡*T¹šs¿´w˜F õеˆ•­m²W§ÁÏRHê¦úØ— ‰"a¼SŒý%€é¼º•´î9cd3NŸÆ„—FœÄv%Ü6 õŸ!³€õZólPRìÜŸ­HÚ[’o¬Žy¢áÜþmD lÑ¥móשË@ÕûtÇ"AT[Ýîwß¼Y¡§'8?Q\ÌdÓØq-Î4cNYWBƒÆp­Áªhs%fx ùaæZñÏœ ’ìX›œÿÙbr x’OSÝi‰[gŒu=ì8¢ûñ l-øÈø-øÈì—ô:-ª”+”Ú)Ñ£wH¢îB…çÏ„&¦“ƒ¦pÀóp¦°wø{õ%•³Ž9ÌunÜÖÏØÍZ28‰ v‰Šð±Uæç!SÍëIê·íeZWžS–ÁãÐ+˜Ò)ñßéJ È!ƒÂeDÂñœqrSÒ®jB1T¶[‡…T6Zy*[_‘¾VàEQ[×u¤µÀûÖquʶéagàÑkü˜Ôudloä{F¬¿ØÖšPŽ¢¡ïÉ£­B7î# ?SdýÐ|ëá)m—ÏZ¸‡×¸e{SÉX.ŽnÈ.œZxcHè¸MrUå{Ç-u…xhE¬í’‹Ê§Î)?r…uçïÖšƒ¸X‹î¾ÏÍ»x}„—A­4“¸ ¿eÕT9²,`¸›ŸSR¥æ±©cŠ_IÕw¦·˜>ê&`󭪹i3#-e¥6Õèàцü}å­r¿Ø I»;ü]®˜qßøbÞØL¥0÷pè}—iñ>h¬eˆ˜]¡×y2j93ã篤Ȝ³jNƒ¥€Œw•'ã`Á¶¾pƒe/˜ -(S¤8C…0×Âõ|¦æB–mŽ“!t®ôÝhHæX‹÷®pø£ˆ×!åY.Ô©ü~›•_ò7óúè'äðU׸kÌ}X«Ÿ¸QãNÙŒ;f´@«ã'Žçh7·VŠ´•¤];šÚ6’- ¶a¡!á sPì*Ë¿Œ+$p“¢Ä¥Ç»f¢J¦ÎV¿ÙJ©—2r4¸’l«âJÍ~Ì6]t|+1»b)ØR :©/Qp1þÞpær¶ËLàÖ pqŸ ³SyNúò=nÐiFòü€:Z):´Q|™<àíŽä¥úgŠK˜A[NK€Bóˆs3jaÛÚ¼+ƒ%!Ó*·àvŒr”‹‰@š…+àÂþ6ˆÞ#>ÑÀ®CN Œq0Ò­+¶S?w³ŸgÚÚEˆŸ§úê-^ ¿6Ô:d@S˜öƒŠúžÃPå0»LÈÿdÔÖÕõ1Óf€“wØ1XJ2U85I܇<´qƒë÷6‡¦y‰" ǵG@ë.ÞzªÁ?ÆüÆ 6±öï@0Xm¼Lçë¶Ö—sÑHÆaÇX×V‹Kµ¼†-qÄRèÕÈJ…Ç”rÝŸ¬„™'¸­L` NÑ;râFfÚÒÑs€¼·œÅÃjÁÅ/dÔå¸Û»¶4ùr4æxE‘“ß‹!Æ_THçÀ6ö%xÀžô6'Œ]ÿýBõ0 @}7èÃþ±º%ºÉõºÂ6TA—rµ| LÌ@Å@äâ‹Éu€ž‰ÝÌIêt‡Û K‚¸+rìjˆÅ„ÿcš{²Âˆ7°…ÆÍañ#ÓVÌ®dµ¸œã­b}^Þí2šn-ÿ ÁXsð>Ä~kmâ–’½•¥èJ–6´g‡±@˜·kÙ“cÖfãeÒnj¯ëNŒŒáŒZ%qâà/ò3³‚¨Dv²Pö_íl=^O''%ìkJ{¬!¨añ™˜}5Èþà qi£H"$äj/òFÕ‰"˜)Tt]1ZŒ¯zÅFYa-M:¼ å^î:ex2iV'1ãÓd²Äº/z/$³+9°ŽÍ*6˜U\ùM¯ÄûàvuלKÕÀ‰å§ÿFPøH¨‹;Já®)û^ã éó6ùÿÍç†-¦ÎGä‹à‚O^¦c›ï?&…nsc\ðˆÈZêW!_Ý\òW¾½“!¾«à{©ôÉ£Èó6R­0‚Ùsc# t\ó£‘ì«ÌìO¥Nz~Eš´=JÎr„W=Ë ÙÃ\Ó‡ô«ÌžR~)fLî78ÌkÙБ™ôP ¶a¡e~¸Å«3ð_a.HnV@7 ¥Æ@ï?îa” ç™<½q»Ûrvôé<9–1ûôìÕ?òÆ2Ñ8Ó™ýAΔƗ¯Ò„ÿ!†XŠè#rË3rÇž~]VRéš|¢ Óû ‡Æ ’d.Ú;ÓEô0/ 9àtàâ‡ÆJ—Çë*+ŒGâaI¦àÙo,†Óƒm'E@$„ŒÐÿ€Áÿ‘*Þ=tþÓS –“Xº+‹‹Ó³V9Ö@ôq/¡ö±l#¸J¤*oèïG0Üaf½f u†öùÆ_Élü-¸Ô˜_¹½([‡¢25{t‡>á yÜ=(ï;A‘í ÿ¥´‘¹|HUG‰à5Vóxá–ó¿LöøîK,vàA¡»—ÖMVü5GhŸp­LýoQ…<ç¥E5ó¬xCEP®Oò•£çÔÃv"¥¡í¢oK€· ©Ô†Ê ñw¡Lw{#¾~h¸&­’w&t*]záKJ 6ð™€$3æè£ÌìÊDÍM©°éõ ¦séeçwVÙù¢ ZæýìJû­ay¦‘‡‰PE‚ŰFöIxí¤ÀÏßBÂå “ô€`Ê/¢ûIq;—â4HBMÐ/-¬¯z¹RÄî^•.=aKþš\lÑ$õwev¶Ô'.×zNc¬ƒ•ÊcÁµb~ùû«žãµ‘+§eƒmpî ù…GÀ€x÷… ½Ë`íÌq5En1y[@ ¼à‰æ‹fß÷Q·ú·Ì‹õNK×>õW÷gù‡f ìk£~¨.úª“ñ‘J誒˜Â8U_Añ´T cû9olI·*N=_œÀž“€õ,Ì'©Ï`¢¨TÛ­l,ئ`Ùœõƒ'2˜uóý¬¼z£mæó«÷½ê§®Ýd °Çœ ‹¾¥®”j<Šúd¶4­‹ÝÅHßC¦jv7{í:pæ-ˆŠòàNÜã.jRçcZ\ÄÇM¢OM¬’ø][°4UŽÂqèäE*9ñ¬Ï¢~˜Ô¨±66Wl&[òÔá‡w•—C ËÍgï»áw[Kãêë^ˆ\µºÑÔý¶MB¢Ý~4_W_ž.²j°“D ÌäQ€'™‡[ET ³’ƒ?3ú˯™³òOe-Dš^·ç‰‹^¨Ë éëĪ\X¯ÔÏBû¥åà[FaAóS¡/Ì0ƒìÂøâw’ŸÉÉTÙßÖ&·9óEIÉçlJ.øgrqL Åé¥c‡Kì§(ƒ Íža×¾æô|,Î rž¢E4šß¶l³rY€ã –Iba#-M´ À~’“If,R?ÏF(ç¦hÕ2šøÝŽÌñµ+ýõBü‹‘3-Ò[Ó£_>A¤êD½®ˆg°¿­…á5Huf‘YešÌ/õÛžLx–?0€†ßÈe|Ð c )œµÖ¿TX3:¹±ƒ¨~†¼ã¦ œ  k”O+n„‹1#~_è«ÏKõ{£?T?ƒ?³µ1`àŸªnTÄçâW®³¡t–}>x÷ì®Î;OjÐÊØÙÕËyˆ8•U<2aY'Ãá1%±ß§Iï0IT‘cGt¶.ûs,ÿOF¢ÓGbž¡X·å•g?õ£™ˆÓ[ ¦û°þ¡.k¢­D$ÏSC'ˆÜIý8¯H«{«»Uþßà|Çû ÈçL ~E£Ÿ7ÖôÐxr?¹ñI“ßnX)³lÎXæGK¯D½ #fÉABZ©›# ›7ùø£ ½~~²HæãúMtò¶ñ³³[w·È4ÐT××ö¹úÕãÅ·¸i¯¸¯ wÔf—´º˜ÍU©x!–=dg"Nf-~‰²‡Ä%-Ýø7d›‡ö:Ö™ýæ#âàüUŒÜ`šy®ÔµÁlÓÇ$œîêÞÿ¶;J#Ýu ‹G}´#…˜üvÓì.$Ô¯.†´`‚ábÏ¿1œ|9]Ï8d-)6õž91‰!Ý4M/+lË­q}häè¶ìXº^øA”í–Õ #»òkJ‘l¿ª åráÕ’òŒ/ýw[ÓÍj•d1ðf‚u7¤3Géô–¼õiNºRÖ–õ.ú8 ]w°ê©ƒpÂñšÜâúäEŒñæû×½êDNJ–y‘èS&¤`ˆáOÖFƒç¶4›/ué†9#vŒËÆÄîöãï?ö¿K«ç§’š•ŠSëú½3ø&‰zn.©BJrnØN­å}­ dÁIŠìm¹º†,–ð"À_­3f¡ß "H2û /;‹žM²LU©D+òžk³ºCÿ—–)t:µ]IqƒË-HƒSÖn,È-ÆH×ßž&”÷?nÈ©E?K“eþU:ûS›©Án´»î×GᣕÇC½SNÔü'þ] r˜ ØkK´û¼nCÌv„âÙ,[6©Ž.Ç»ËX]ã„}dû^)~‘V1s¦ÊzbÚçczêíûû GÈû;ÒFÕUMk¦W<“(ÃoT é»B§¢€æ{!Q(õY.2‚ó?½e>N>ø-ór[é´3DWÖ§©}säDP[Ìh{Ø£X¸ý#¢8É_ÿ¯`]d8¶"–c[ƒ 'ÓÊ}Œi·‚5%¦Z¿bT­>< ¹¬©»¤{idÎüŸSüÁàCš+gm9l(}ÐApÓj6e¶Ÿg2“ê?,(}$4˜Û˜P{áÖï­\Õü¹ýáwë§48-ðð^ *­”æµsµ‹Ê]qÇqEÉ8¡Àn6•)† Hý-ôŠN2u>HÐæÐF@†O¨?%ý adö•ˆsWõ‡t<}Q åªØ+BFˆµ :°•ŽFÎìôp2òƒÌ>8û´™–3¯ŠTãÒX`Šåd%á®â&~‡ÿ;äø‰¼€Ï¦Šk5òËdY3…µ,'$£ú3Cf›‘6n˜ÂâÄ&á²Vð«qò”½+J)¬ ŽT„Kùl%Ý'S€³«õSOÞŸ=©Ñ=¿€êd óv˜ÜwñÔsõ-fSãÜኯèÒb,òEÔÍåΈ“tæHT¹BY]rà+À¿ ‚?¦YÖFg½?ÃNˆ%ö+°‰5ðFÃÇw÷*šJÍb>Ç‚±»FÝh€™tÊTvë¦d5 ÂÅÛYˆUH,Çö€G+Œ¯²&Œ)Å¡£Ò:§Ç|¿ºŠÊPåréüVä¯9ƒi®v˜š‹e¢Dö Ñ痃碊jév]=%ì[@Åí¥Ri!GàFYvϳˆ\n‡ ÛÆd$õgÌ\­epÚNì‘Qø.ßH(;ë™çö5æ¶£@"BÖ‡õÐõûSàyýkw:š†p-ŒHHëèMYyeŽ=|Ï^2¹â#'wÿºÿC¡hÁŽ{—]åßó”Èä‚•R9H,ErIð^{RBü¡¸ ÷ƒÞ}ØvØ«žÛÈÎYÉÉŸí6!ûÓ„>Ï[ñ¹^µIÇ!"¼–/9nº$¬_M¡[8ÀÞãQG˜lÈê™,ñƒ#Ôk›?ï˜ÆB`-îÝ`߀š†Þ9}:7wÕ²[kn³7s^ý ×CðŒÔÊ×í”öÆ{Ô/˜CoXp÷çœ7‘)m¢­„ÒKˆSRVZ\à‘cÊà˜¤Nx¢µ¦© DÒ$HÄP W2ëcÝ–éGÑæ¯A%ùlrN‚}Ç(O=õ¥ôY"¯Úþ"¼jÓÛâDá¬ðÛž€\'µŸÑcÉ6ÿÑÁ˜¾z]}59™ÖžÄ%˜éUôNR‰ÔÛg°ËÕ éh«’ ŽJ"ò–¢yiíb^Í­õÿäÕA›™k{ <*¤UMÕp¿ŽÖžƒ¡1%zŽø„zî§§g7釆’ºpRÇ·ÁoÚß;U¶yŽû_ãüe´þ…s¼ÔjÒ¾€zRW3wÊÊÐN­´>4¼­=³ö2íÌÇ¢wÂ9<®¡Ô@ŒæólÆ/n?Õz"œiîx¸eÙ<åz–W—ü»kãÝ´ ;q$ìô¤´e2*ÄKñüa:%”åÕU¼‹  >Ñ1̹ ^¥H-µIo:8¶#:+:vØ-€F 7»ÄøB(Ãþ¹È\…XMüߘ²t$x {GW勯p•Ì1ë¹LŠT Ç~{Mº]³plW[)kH],ÁO•r¶'¿ËYŒX…µÑD¶&5¤Ð¢ \iAbbè¶T©»*µ¿+DÀGÀ²úµ[œWvø­“F ¢JÅá»km95=%úO ?>2ø‹Ûµ‡^Cæ‘;l¸-¥ÓbL-áR–] jÐ}ï0 æÊðƒyÄø~ ”+€ÊááRžÑÎw­v€wÚ‰± ó',5ݬ(Ú$N½ºáž”3ýÇ«Mƒ¬{cB‘‘’žŸF¦9×4áe q2æ¦ÜQˆÎ?̪vÚ`¶Mƽ®ÙÌÉ0\#¹K’Ää ÃÛ*ªß²±† ÚU¤´ºùd3%d/$³ìƒ~?b¥?#€ÓV¦a¤¸FòH㎚bâpe s]¨Ë"†YPvι»×¥vkØ~Mä4te`#¹q9ÍH»Ù˜-7z±oÅð<aºVÕxQ/G×Zq£þ œùQ÷æn°BõÞ¡ŽyѶDØ*ÐJÌ%<ÖKèiÆèz\¥ýìÙ2ÕQ8ªT&em­Šº€yþM+jk¯ŒÐ””7OÆÞ,]:>¨¼²``@`)4 ä7ÏhJ±0µ‚]óø"S±q!^ãŠFï_ ">DÏÆ›‰~P"RÞ’Ì€ .¶ŽroÕY ’V–¡äNæ*ž}©­KÁ#r_²Zb7AÓÐÿRÁè)º+nPޏmU—;˸²D=iOm]28!T,òzo¸tvðŽgïS˜U¿<ü#ÆAp¡r)2â[¼L]¾‰=ǯ£›D}¶0o*1M9–:F'±]‰êèËGx¡§Ö\rø-x"¡™jbñ½—ѻژ’èy° N!VØ—EÓ|MïN[êa–ÛRj£CÅi;"^.>©ÅúߺÅM×¼Í] Õ%àÄM ,çk!¤鲚 s›¬Û^tÅ|µMân„‘rÕò*p»ƒ#ÜàÏYÓÐÉ¥$ÍÏB„€š¬@’ÍIÓÓèÜTZwô°@ξ&ËQ´áÁ¾E³l/¡¦¶Vt4U¸g¯@ˆµž€. 9ÇoY͟𽩫 /¡Â…Ú|GN`oAADrkl~·ÜÖ¤È Q.„\12NrmJ`ƒ€ëO¤Æu"[—¬B˜7×íÜ[óÆº¾ñ5û„k@H°yº_:¾Õ†µÐjp2—¼¿Ž¤žåYRMF/ ÝXÜ(Ξõ¢ÃÐý„¬Å ïw5¥ìuϰ«ƒa²R<ÛYAAóãë¾èèìbŠ^¾°¶É[ýÖˆ lŸwL„yòÅHmžO(‹”Úf¯Ç3“»î};7ÀlµjÄw«!ZƒNâÊYA*Õ‚×G۔ŅÈzS—aTG*¢qùe}MÔ±dÈ2¢IAvS)¿§àKÑÙ|v€\eùÚ7á R@Lµf+àòTRO”»%PÎztÖ€Þ§%gèšrž"M¸s"݇ 훨–=®Ù‚Œ­sÍ[@²ÊKUO½žÆ(|À×á#äÛ}—)?Ó¿+ƒ÷XrJØ!Â\è§ÿ<¯>«-ì‚ÐvœíWu´t“‹Ïo«1Àzĉ{ìâèÙÄM¶Þ²üx`q/)‚® Ž¸ý‹áÊ/1ªÃ)”ž'ÌøðQꊃ&Šy†q»ˆpÍ}Þ‘ƒYU£][ý CÖQ•ÅÐ"ZÍž‰Ë~ðÓn´;Æf6ÝÞ;Ïiéá$ð,Ÿ(µ~Œ>£$ùzio¹ôtÄ陼"~©¾X€¤ýø‹úqzÕ´ Ë_ð½3Ö µ B¢ëš>¿è:KÕ0mÿ{ÛÀóô<Ë.¿žíý!MØ1¸>ñå‡e&þLnú†ýÛĨÕ÷àî!ú <;ÕˆŠpCòu>Ón Äi’ån0¼Ñ‚ì©ÖïÊäÇ­ÄåœYrÇú‘0VáÝ=+MêŽ9r»Ó- W5$:{Oãø’±+‚è§ÌüC£lùñ‘ vä/.,!m•Ä(CzQæD²¬æk®sÆä?hÎ;,| >8Rùï—tQÚ†(Øù99îÜ4Â\ù]ÉNߎæfº9$ÞâÉWÄ‚9slœÎ´j¡—lØ)²Hf¹,Ñʹ…EYÇÁú2µýãÁ¡wß„u,l"&©Líú3Eˆ¸ ¢uós{Aó·w²¹‡3Ë$ªp„Ÿ.j¥ÖB7dû0™Š+þ„ƨ¥0˜ÙT”Ùé†#y er<ˆØ¯Àp«lA üîCü”át-–ªSw8ÓÙe¬±U¸ÌΦÌÌÐ!ø¯ã@ó»}üO¸Mƒb³<<;%ší+Nw‹~¬5Ÿm§„Rlœô²¶l7r™6†XœG(jͧ–$ìzb:}_Ž­.,‘WEþ]ŒcGÆð>i´Ì²ú ’Ú©†´¬ŽHÕtÛ1&8ÙeºÌ»u(*Òö;-56ųĄ¢5öÉ»§Õ4ÓÖ‹ˆåT+A§“O>œH6»虜2ËBNs̆Œ‡Ÿƒz=ZÜ ˜ˆNBÆ\äÞCTdÕc9€`©‘~B\UÁ ±a¨.ÅÀkYLjzí_‰¶¨Ò K5ðs*.D¹I¯ÙÆ/nJÓF$à®3=Ѻ§so”âRõêãö66±õ«2~BC“®M=¨£~tê›Üq ¹é"%“ØÀE =ìEnÍÏq®Þpdbf!]Li«×Œ¯©®ýãÏðƒK¿±#7ap ÒY`q/·ÏÒüÕA3WáÑ[8Ì*ÂK˜v5]ž¿üÇÔm{øŒ%3g< ã=êÐùA#}°G͹¶’¾QbX#A¿KpFæ×,Í®ÿ|’+à­RZàˆþ+ù³ë-?Mý¤ã(oÔgøó˜Ñ*Ó „ÍE3iÙÃuápâUyyEÆ–ÃÅý«Û¢ÅìB@Ip= É*~Qá¸ô­÷rö’Ñ€$»aß×Â7–Ø ^4©uúÈqÂΞI’6ºê܃ý=.–§/çϼ/É£¬Õûì%Ã[<~gÛm÷ÄĶu–û´ó2käíS½ØÙ“]d,ѦòcJà„ddÂ/¬·PzrïŠ)z”çõ¬¢Ø&kŽTDè$àg¹f)༵/—­´¿yl‚¯%s á¹ß®Ñm\(¡ã^ÛÇÞ&ùàDŸ†WÒoëÙ’(ªzÞÆGcбj*2ÂáÚCâ; Ãû1ì¿ø¥~][)Ó{0Þ Tþ2nXvÛJ—”›¶Ôºi¼˜Æ•"ÕoÚƒyööõ¢0fFÎÁç8g┄ùó†Ê¥™“!k`2Ñ Øøz&7F×|2!Òè¯XÚÉ¡4Òž¯˜Ê„MHl”Ê Æ/×5‰€æ|¶Ê‘bÌj€"m!ø›ùîšÔÁFÜÏsš>£ÁËûÜB‰Õ‘3mú(0¡U{ ‰’@¸Šç_Θf7sšãäp(:ÁhC iµk²7N=–0.ÕïYÍ·Ô¯j_âHöBÅ©l¶cЯ »êíá@ ŒÑ’[ºðâéâ™?ÈÝ%¬‰"ÊÌ û&A­ð’ñÑÁº¸&(68)ào£M­ôw8jŒËη£Îá™—"_³ƒFM¨%YN…²ÒŒÌÌ7…©äþõ˜l$þ·ök5u¿ùi…Kå3»/K§;HQ‡¾4í>€û™ÎaNwK‚LH̦¶tªa7¶¡sSÍ!,B LF2xÇÜÓTÃ&´H2¤¡‰W.¢éÉÓy³¼ÅÂ/ß>²¡¾tˆ÷|òÒ"¤ n7rÙwƒÇÈμ±§âsÆï^>þýq—â³ò_ÚÖÇÔN”s“p_œµ·êJ.>`QuNm[KÎSv¤îFU¸hw×Sh޹gû#1ýô“øNKM¨þ4¨và°®ãF\jÀÀr=‡âÔ&癟 Nª2À—%ÖçNà-1ˆÇ¡­ËÚЀŸôƒâs 5dNÝ —àÕHü²’pˆ@ˆžr[žûRß™†|%Í(B¸‡é©“5R~õÒ §“wN±:Þ'¤îÙCI–òŒ@­Vd5@­™«¡áTëB2.Â]j×ÃÓàþ¬T/HùëÞ‹×]ß¿J4yŸM5/DÜW†Æžw "¨¨Q“ÁÁÕÍô -ÄoØPL¨‡•Sºg '(sŽÔp )ËüDžž s è ÚÙ¾d:ôÑ£ùfLÚä6 ²,ùXÐu÷œ²´Ÿg=T]á‚„ß0­À@X7¥ö“Ëê Š„-ñK sI²U-ÿëÈÝ«&T ¢µ,"µ ‰•uN׉ËU³„‘E€lüðz-ï éQ%k¬øÚà"´ý“!RzàpW{?&¢çf>‘5´f-_]Ûup×gÏœºÔ <Ù¶r’?V +n#kʼ«FËéÒWø” c4G¿ÖS€&Ì©ØÂvôøëí$f×Ò[ª@8CÜÖ¶ä˜*ߨC£±ç1 s϶7K™ô…“Q½×æ=7tÁªlîØS–)4c„ÛQ]Lk†ÿúWm|êÅ[mÂe,ñÂËÃÊakt¨UÄ%5pÍ`¢Á×nð×f•6ÙO\N¾®¬cyͼmšk½~žß º)­\I­áZˆ M1§ <âWmê-pîÇ#wÆh­~#;Å5±f¨é ™Êûÿ÷˜‚âC°áèI½//.ÈIO<ÁÇGæ0qK/ ˜]±Ã[½jPM‹N£q-ºXõã=u¸Ç›±Ÿ•ÑZ`R†°¢ˆ‰„—<‹­w’òUò`4Z¡L6Ò,Û0Iå’O ºpx7‹|Òyà¹!÷"´„hÿµ[ų‰ÆjêÄv™¨ÑFÉÀàð®L¾jwˆ[<ÂtV¦#ݤØ"OÈ–À`Ùÿç$ÍÇÝ}0¿¿:B¸ÊÕDÒ«ÂJ½èæ™ê§Îß³ðˆÉ2±{†+â*ŠæÃ×=`çëv¤N¦·”=œ;sùR˜wz4z¸AÏþfÚ„†•Ûê^DÃþ…-ÑøoüzN;I‘µ9¾öÓáEfmƱEC´-® öx‡rÄÍ{$Ž éÖN8G¿í…§bó”-“AgZèY%t±Ý5’‡_N֬Πg€ G“ at£–´ËÇröUðÔÿ(…È=,9•¨6—ÿÀ4cMÄDQ¥ö …dÁ˜¼÷Ÿ¾Û¿ÖX]hâyR 4ñu hô)¡µ¥y4‚º-ÈÚÙxؼHпŒÎÄj¡âðuçJ£ï¦â®~¥ß©.Üôò¥Zû½yÈ"óñ®>˜Á¹‰Hu®(Uµ¼›ižcÀÑ Ãí¸ ±CvW@7®œÂ¢Êm¥åÖ_F?ór'u¦3ì\éÿª'Þ+_kTciÕ`oàó&èÁèŸøœJa^ô”þÃëO(V$Ÿn„3Ǫè)àѾŸúwŽöóޏÕDigꈺìÇiªHQ&èc€Ýh*Ÿ2ˆ÷¾"•Ÿp d¬àœjÕƒ'À/ÙôÝoÓ“t.þ¼ÙÒ_?³wGÝU~ñwY3ê»k ׇ»°5óâ:f]ïBh„;¸îƒ!‰0÷+ªÚ6}Æ•c¸›!MÅ8°œæÒ}6.c$¹øŒ££ÏÃÝ[Ÿˆ®¢+ìóvdp³@§¼0?ïÒl)aÕ¥ÝðÞLâ ¨V+?·Y/ÁÜb#!W†Þ%©¨@fçÛû]5«tj ®bB=ž%Ú¿ómNÏzUÀØùF 4d¾½òÈÂáN径5Û}ÙK@h~”®BQj¼Ò%Î9•Ñê=ɸèhÂ@î4?„úGð¯Ì9.záIè°OZ¶ÆîcŠM²ˆ{ýAÚ.gŒÓýõØzvQ³QpñÄ´»ô"¼Þ,†þj æ2ÒtQMÖã!© ý’Xm 4^ê?–¹Á.IZKušKðéÓ†mâç10bs`ˆ&w›9j%Òÿ{¼7!î.»ùd¡ÇºÑí¹ê97zÌfËûww7 %fñжEÖ`$(ýµšÏ:šø›½ǯëp.St 0‡Ã®YrÝd&YΕSÿž„Üpp-fälõ ÇË_Ê…Ôru‘8b*!Iwr=ˆé¼«Ã¨0oV¯ÿ P-)“f—zgéÜ yÚLh‹-À9²€y©Ò-3>]İ3cÄÃA³²¡Ši1>ž?^6ìBXG&™m’ç÷×Ã¥Pø©§¨îíÅÔXÅ>êy:ÝnÔ*+ARõAˆÖú5u Ä‘9)ŽJ¢jø+ Ú,aGÑà¦X—°iõïïFe²ä»(MÓ(ùZk5PÏÿsZ4·¯°ƒæw۬ȫ…ñýŸ¥WÒx%Ú¥8Š x7Ô–¶Æ‘=’©´Ì,få§ú*Y›Fn%Xf{zôÎ|Ï¥o鋜òo¶ÏE–NçÔwTÖùq‹_€SQa¸+µ¹$mXI–dÚMµç´º£§1n¿áœ¾„wÚY¦Ý]GŸ & ùÊ*À0Âàæí^~J¨¯«oåë²#Ðæÿ¡M=K8³Î9²!:8¢†¢¸&É9› ¾±Aa¹X8z)ëÑùÿ`=»ð¢,~ÛÌt·¡šÖ¢e…üXXž”r)œ^¡›<°Ç+ÿsyzŒÆ–óc¼ûMÔ?~19‰4­å·qTøƒo50jJÚ4¦º¾QNq;]Üö}â˜;¬‘p¥q푱ÑÂæ):dAHÆI†À=3.¼¼­ük ?ÉRÕ㈠9ø´ÐÒ®”»õ8Â…Ÿ+Ú9]OánKb€)Bü5B¨æªœIûÀ^†òS` ‰”¤ÔÓûî{£"›Ì]R ªÀÞÆ®D׆ð0Â.bUke Í œ_ü3ÀˆÞ2[ÝÛ—¸a9 ’òþ1¹ÈìAþ7†P‹TÃHÝB„[Õv;“%t^]hÊÇPø›¾ L£#LÛÙ¶[Š*7s •ŽßÒŒ-tæG/¤þ·`•°Ä­•!8/Ú%à9¬'Ç·_#7Nš„O öÍW¬™¼§ÛQãÕÌwCÊÞ7ΦøgX4]ç¨k@¾70­3‡¤³­/ýrŠx ›½ziÁñ+Ègò/ìxO!ÖÐ%j ÿ¢à¨¸<ÝÆCj=>ŽØ×éë ”ä:GÈÍFHÂÑç+ñÊHÞ¶Gü3 NèƒÁ)âŽá#³ÃÜt—Z‹°ƒ’äa(ÎmâROºp!Ê:–ôÞHšx• º({ƒ‹Å 3Õ-0#Ša©¸]&Tا ­²b"—Ú6áSžxù©6 ¥\W>ÑÆ´~r²†Q”a°.˜äUÅU ~ʯ\Dž¤Ì>›f^õóÝkø¢›Æ /…=dn€Æ[”¿,Àõ»~²¾õþõÓ"„7®S„ñÂG·¹µÆÒ.e[꟔ÂM³`À´°–†ý½áÇ^æ”í/Ä'âlN멨ðò6ÙIî÷ˆâwt Ôjºù9%‡æR…'ŽZòQ£lø+ A`êˆÊÕ¼»µäÖ”G›Ð&^ç©u{—@‘ŸDx€$uÜì[¸Rësÿ…ëî…Ûw-ªM„Dð¯]˜þdDs›½ÝŸ®~R;ž×E®BDwö¦×á–g\ñÉóWÊËôÒÐp47;þ ¸xǨ Ê¡ˆ®ÏƯ*øž–i¶Y";}˜¿ÔfoÈÏꎹ´ ÉQë)iª³oÓÏZW¼QWÆ!2ã±Èêký?Ä»¨&Gᜎ&¹ªÞo¥å\®‹&úr®†’,Ú¼çÇ×ç' `îìGÑ€§^Cñëé Äà+ÂÊAɤ£üvVö¡71ûm懕J°ë¨)ås-ÉP0m3¨ù¯û7³N€ 4V÷FsnÃApk$K‚ ïšöÈ,ªcí„€7¼#ü®ihVQmÑýв©ñrɸêìd¤þÁi~IAÏ›?ÂÖ:ŸmÞU;HD7Jì˜7ˆ1¸%±Ç<=Â7†NœaùïÌK7ÇÙIÆ¿ô<¨ž¿XQYë6úi7ËhNˆlEøÑªèãÂËýš§ÝO6Ã?ÍcQIÆ‘¨;;HÝ1#ê^¥F_5mÓlW‰VD¾ö`ì»ãÎ$;ôväÄ .œ×2ÞÎdÂÙüÈ~óžËÎ’Ûü2ÔÄÞPì ƒ¼>OÔî%¨WS¤¤À1Nô¸®þ¶š Ý—…r¢ãŸlMæá_ÈЋlÍM;°d¢ ‹­gÀ½„é‹ÔóäTåkÁ—%þö˜,¾£!Ù…aMÍgÑ·8Mª;m‘DÝø8 wðïjM¢öu2ú¸àœ"bÛ­(d$¿¤°¤ÞpëÙv8¿²Ø÷Û&kFMø²rάr¼MûØo¹  ìªI&Ñž5*w¡>ZAÕÿ¥pŸ´NuPc Öxî° ˆUÊ$ù* W‰´' a­ý$„ÉôÈ”ÝÑNÆ;ÝY%—¯‰9ÑÛ»ù¼öÁÆoöž+byºÒÁëåe½dt¸F’‹_ à :ˆÖIAE¥‘@ÔŸ гÿò=)×8Ì0›·³pm_¸ÍˆÂ†hñD@ œ=C×JM­TµèÕ ?Ì_r,j—Ý#ˆ·áb­Lñ}î÷©Á_îâÏYõÓfë;ö¸Ëa¾jX‰ùûÉG<,—ê)iyOú‹uâ}XçÁÿvY/}Ði¢ì¿û޶È(1â¿nøÆqèT©„!㜶ÅÇ[vyìõ°« y2yÂßz¢x!¿LEUtöN»ªìIº:¼»*À Ø— r¨á Ç y«{ýïT¹¤ŠÐWú_mƒ…2Ɉù” H·Ûìu0Ñ鋸§ù1»ãBdsLàÍàwë˜çvÕ4ƒ¤UF]Tº£”¡³óï9© Y®†z»\2²²m’­é0 ÅöðÏæÝœi+Ù ¢„`ü)¥AÝl…aºWøÃº°Q PÞa›Jú6•ÁÕ;Ïìyú½üí WÄéî8&ß*–ÆóšÆJŽ !d¸æmLÙ¨z¥Ü¢u!3¾—ƒû¾éÌênÙXk´lß½½f뚌\ù´Ê®øV0jtÏÊ;ƒ•ªL?©Æ7®´0L™Ë…©ïÓ×îÍ™­¼ØÇð¤NÔ©õQq»ˆMD•³†4Töõ©Ž'û˜qÊp/"áˆ^«¬¼GÞzAy!õh§çU/FG/OýÖ˜_—¢B§»J]"2Ž5¿”®J'!9Ì”è6 ÃH[Q W”@K>š~âç*Wó_$…/|ÖžzvÎèlÈ­rGRWøÓŒ{x#·IlZ‰­×_è*”®lSÈ@3NîåêV_j*È"Æ2‰IõïlAÂ)° ô«pÿ9Éz]"a¢Z/os1õ€ðù#.a”AAG“ÄÄ`tÒ/Ñž:ˆ‰6 z#GˆïtIã4âÝc"åJœ6ü &/XÆL¥,кÌ{¨E!ŠS±~úÁè‹RØJX,?£Ö n0ˆ”FùÝŽWžE©]Zé7¿b3rçÇØ‰~ÿ’Ž3²¾ÿã?{‡ÖT¶Ñ¸Î>醼çϸ Ãy 1=˜@O„ÌÂMq²:¡¦Ö3-[ ¯(ùxŸfÔÔ\"6$šbÀŽ@þèbýÀÿÃ#F§Ø0ä¸OÝ;Œ:c«†çk",I,Q6˜´w¶cN•fMó­ÑÜ&‡}_x»˜ózÁèÉ›ÄvÁ°Õ¸ÆÕ¥}–x¬c[ZˆŽ(‹¯Í@›¶ãQr.…ÚbަäàÕãÃIPS~_=Ú°É"qæO Ý$Ù•Äˉ¤ûo•µw9zâQ¯±ÍƨåZ!.šÅ˜ Q¯‘“~UGä %¿Ä µ¼lèµH²€™ Þ’¬¬Ïßÿ¨â #³¡ípvz/³~¿?¦¥B’%6²f"G“#â ‡bòžwÐ6ßp•«ãÑFÔlÀÒ1CHýÝå)´|0ï©–Jå!Ô;ßan÷žŸ]ŸO$×Hm+–[‰¦cC2ÙƒÞÚ)Zû™…pjÜtÖÈ¢ÀEbµœ…Ïߘ/Úɤ,ÀE|šà¾Êõ–Ü@„ùëçײOBõÞÕ Å?*1f4ôréé ¯5µXîäв";2‚N|bøÏ}ט'4Üœª« ÙƒÅÈ|Fo·ì=õÝb¶Wy´³ ê^·»[½L˜î0:×òùƒ8â<è¦]BÕDKÑL ³ôtKwI¬±FÜ©29jœíyT\ä¯óžÌáÀ<©ÃKŒ ¹q “‰§×ðý€™:0]ÍÁ«6k(èWtÌä ÆBt(ŽO-\Š™05¬¢¯ßæ`.¯hƒî &Õ‰»ÜÈjMКw(N‹îQcú_ÕqY·$eë­Ð²-ìzzjIdK¶cÌÃ׿ÁŒ]–dĘ4l¼B2¶£]kPÏ=çÞMïi`¨d›mÙ;ŒÎT£ Pó·Þį׵2e C/&<[•7•á'+)0øUDsM¶e¾ªþ$h`”Ó‚›]áªPñ i3÷ºRã@ÁctÀ¨ÔŇL½ŠtG_ݽ˜5â ··Ò¹±âŸž*Nnƒ'Õñç‚a*—k;ÖQ‰ÿ>{CÑX"9ý5¬YÍD‹T™Lõ+ɽh橜PÍ©õ¤!²±åÅU+ó)Y•-À숛¢éHý #1nØ?‡ëä¼²kT0K·¤²Ý³‡©™DX%ܳÇð•.Ô¼£ñݵ¾Óêvveª¼´Qa6Ú Ú‡üÞŒ àù[2j7RÏA.r”¹NÆälÇí5íÿ\,éȵUÊ„Hë±rF¨cQñ¥ÀðŸœk Ñ¾5¯öÞ?|D©Â-ÆX²,cQ_tj†‹&GΦ¯v5LQÁè˜ÜbÂ[øÆÐüºŸ4Ââ¨âæïA0þ=ù«°Ð°¶Å0;–(ãëùm”r™)ƒxz˜B%Iýp~©Uj-Ú^1£/ŒG%Í }ˆWØ,K»P¨*"0=)aâø²a!þxb…rv_âé‚8q›²õjÂt’>×勪õd€$n7È«tòhpªRÞ\: !Àø™éM‰r””óÔ&XÒ**‡;‰™É?¯ð ž!7 °¤ˆè!G†YT§Ñ™ï™Msp‡QÎ’©<'¨Í™††¿³M´*˜Dßÿ6*:ý×òRÉ¢q]íÍÌ®ã¿VïÉV¯?GxXáCzxâÅ™O¼[ *^ =a$‰>ÕM¢1+½»@ßÛTýÇZ\±Cš«Ë×ÇbܪØòà»yÚ ìãÐþH í1›;¤EF#¹È„ñÅ“ÉÒÂòþÊÂ7ôK›ƒ~ëPÖÏ9Éæ›¸™JLqFGY ¿[Ñí¥!ä¬E–p>lìµ¶†òª‰Ãµ èïÖ{B5φâdFÏnó  <„õ“Ø Ëå# v¼ó»ª¤_ (k,B)ô袊ˆ½bbxîô1 x˜Þ:|Æ{9g«-òx¬´rÚ VzÒ[yWÖp¯iñ„î·÷i÷,¯Îz†KòüEþj¤91Ú.îâÁ\÷ˆîвÙÿÈÚ:Æ©›Ã¥GÎÕùt`ý¥êN½c¤ú¸o¿*ÏI¤RFWg¨µ¹½••ÉVB¤ÃW.çŠi¢)å2ñVǶ„ù\: Î ÄgÅÁƒ)®"Òaq¶ˆ"›‡ŠâacE¥àÒ)m um9'~îoL·®ÑaYÊ×h±ì: ¥2܃‰îo‰÷1ÅïÐ펷­E·ô¤F{çÏ pÖÈ6Øb¸Ùkë“`ºõ‚†q!:&Éÿ¶Ÿ¿Ó 8ìžèA ¶Î‡E¼ƒY—w¯û£Õe£°'7©ôdJâ-^øú:O`q"]wÄ´´ «&õ\>C\ØCÀ’»'†÷º”Ìm"d’ÎG%M¦Y Ñ#E„%ø(–¸AIÆ:*,ÔFËó,4·ß´]æý}|¡*…Žf÷te™?rŠ©)­#ËÎÏD‚ZñÛZ§¢Ëì­ÿ…¼U†ç§ð¾p ÓNÖb_¾Ç:ˆˆ…ë¬ÏŠŸ8À§¤Û£)M+Ÿé+zç„t“´ßáÄU¥©4{õ韙0W& Á3 GÍzÙµð MÉ07Ãþ*ýÔÈ= D¶jNË2ì}<ðnÝÇqãq­qœÂõÝË/‘& Wç°9I92@ÍfBKtÅáT‰“_ÉtoAÈkÎJFb|·¥ücö(…;®ÌgÇŠ~]+ƾH.O0c#ÿÀaPÄ¿•v!²Q!çÝ–J1îB‰Ý …”û÷YÌ®Ù7¡¨±÷ÍYh"ãÉ%=°Ê-éA¿ì7™ \wÚûy?« ³"ˆÛ xCYl®I£ RÊO+Æ!Ù1è°‘9`–?…›š™vž-Î ·´áAܦÓj{a&F52ñYÐÓËÓ½ÑÑpŠÂhea™ge ¿ÎÓèn«L =³h·Ô‹ÝžVóÈ?%~a'a˜úûM*÷ššØ…yí%S²ÌÚ:ðSÅÒ/óßo_÷Þp£v7‘º ,hÜ3DGÊÂúŠÆäæo/ùÖIËùÆ©kJÜ僃6•!RQÅ@jµ43ÎuÞI“Â|-¯c˜X¿ žÒÍ%‚.I«ªs¬…ûJžõÜO É3²/´(¶¤Àå>ê7VÑ iFuÇ›,ÐVú®¸´Å*¿q‡ò–7’φuÚ½Î5Æ|¡¥Ôš²!/»âù'h¾ÐàÀ…;ÀÏI9[ºn9„ýJ6ÆlxưšŒEƒ¾*d4M¤=´iŠþ“ìy7ukóKÌVðÚlÓ…¶•µX·}„υ퓆ÊÊ?O¥@1wÖ~#ëjøŠ ¡g–·#šÄ3…FËn§Ý£Çµ“5Ôn”„(Ú{ø’ÚUpÃ"Qo%ZgÆd5ÅÙûŒ*î?ÏŽCé˜È¸ØP0‘3Ý»f4òQiì\¯”ìzà¿Ä¼Veü7Û]oDàáîzùõ®O—IÊœ¼ý{ÒËÙ8©ä»ÁëÌR£šÒ{±û±"I¾í¨jm¾3cÖmVÏ•yHÅÅk²ñòç¾-üÇ¿çqm€÷–¯³g€]ý¥×]pÂO=°ûѳ}Wè =#ŽŒc™S$ pUÀák•_–/Ä Q:ùºù½Ïùò½ëÕt0Ëïô“*±ƒ’Îò‡¶,W°kvùæTÄ"E×3•¤ˆ´ÿ—¨æUY# â$Žæíœ9[®á`ži±†>ȯ'E¢’A&ö@p"pËø~w¤Î3f °«÷¾,û–W&iŽ…*)ƒþÛ9i;¡ÇÕs#¥zM/þØóî±@+žÌ\Ì_¨Ÿ í4ªÇ6`_L]Æ)…‡ÂàbXkŠã¸hÄÛœNúšøêNü!³@÷Ί7{1Ö;Þ÷ȸÈÏKÔðˆ&»rña'¹Fó]Éе÷a47a¤„€'ýA —G7ˆ*¦>DÇVô÷¨¬ýèˆ\2„HDçy2Á **‡ ­%K/­A ÝñݶQm类èˆ+Â÷Jœ¡¿’vüý/ä>Gù× 9¥ DúbŸ:vl9´¡Ãª¨øNPd=Ç™Åoq}=Ïâ:5+ß>,ycz4÷ýsÿs;åÝt,S[ W2¤êJn€mMeÕÛØZ`B B"çßžÈæc?øŸ¥Oºv¶Oß’Pøp …“æ"œ°õÒÂJæ2”éY8“¯=TP \ÂäCá»Tç¶rª«ðKÄÈZ%¿XMõÝtsÙíǶñ•¢ÔÑNï#{¼B|¾ZÄ7ƒ¸R$.*:×=ñ¾pI8ޏ}ÌW%Ÿ©ûÈÔåSriþ¿Ú }bE 蘋Ç)¨Tìv©Œ$Á|0<âÞÝÚéuìƒF3˜' Q9ŸZØ_=Û…=¿<‰T1½ê-Œî½ ެ8ñŸÙ2ò‰í îׇ‰ÊŽ ú»”#Eu[Îì‚Û¬(R´o½ñqðL—*ѱû3´£OòÞ‚‘Ü…§·”(Lžcy^Nüڮݿ›“_?2²Ñy°ÏèrŠ95“Nq½c2àÙŒM"4´¯!c…c—Ðíб"Z…ñíï¤Dݳ(¯LÈ&FMLn¾ûL £c–ÑF§ËG<~®:.ëÐWm«7£—E÷í0Ä::®Æöƒ0àIÈ“Z‡†¯Á¬¸6é¾C@E5UD©Jaäe9h}’ñè-"²@ëXcFÁùƒf{H~PŒEòd×.-yºQ<#–¤ì~$ŠsÁuK›©;} –§èµ@f-^Eþ˜ºÐwê¹È)T Á£ Æf¾¢l\MilprŠ%‰-70sqÇÓQÓ;Ëœþƒ×ô9êÁq‰q‚˜¦„ú¾7™Ü„ŠÃ¦R(Jo c˜'4²§Ë~˜I¬Œ MB è´5yß“êGF´Mo›ÔO¶Z­oÍ?ðÉhr¬d!XYÑ—Ÿ‚jº€¬RAì;Ogº†„â¯VŸtj·Vƒ‘ó×;¬að]M ´îQ@ ×›ÖÆ€‚9ø™_Þ<ÄŠhôÓuªÊ4\»¦ñÎÔ˜B74¬ °2¶¶XGµ®q–¹} v‰@üEXGÄñJÛz{6í•0ÉHùcŠ'‰ºÎ&Q‹íÝqìßÓ]蜥½é" C÷¨›]ùÖSVuŠ‘ £ ÜlÚ„Ì‘WÃE¡¬Û eg¡m/Hg¼Ñ1#ßz®g‡û).‚\™²X4W ›´šê”lÇ­Ñõþň‚ª^ýfè—ÄÆWý¤>(àl4¯Û·=,é¶„ÏŸÛ‰<óùÁóôHAÚ‰ ½“gza–·mïqlnY PºÖÌ÷¥R$(9§ÿ,Ë!ÛÁ" w½ÝÂZüæ~ö |° —ÚË­”žîN_ZC ]‹}’„] Á¬¬RzJž«åyøöçA©á¿'ˆKõ惺}Oïä>ãØYš¡L˜tÁ ©?}O›"Z±|Hù y5z“(ØõÎ'>@òe ™n·¨@Ùa‡(Fâ'cj”­$Šýªmk%ä?m.=¶|ÀÔïN‰Òµ/Ãþ]é=¸V.÷³ߢô`ÓAj,Ð)씿޹²m©¨š9ä—0ÀºÂ¬ó¿Í29mâ0œÃÝHv¿]?Û¢¿fñö"{šuÍÙ‚Ln´äM«´:v‡¹S“Ýk,j"SÒO5i™f¯Ädu|)°5ù_™ wmKˆÝ,R“¼§Y²Æ¯b€é¦PìÅN3÷pÀ»J§J¨~Ftþ g™WJò)ìì¤o^âÜÙux@e‹·šlÙñÕ)žÕ)莙çÞ³¥y8«Q)JºŸˆÂ [•àj/ie˪G¨ƒýáV´sîs·'¢Z wçÁâçß £¯2 .¯†Å´—äN¦†BÛ4Í jÌ¡ãîQô…¡§}X!aŸ1Õ·çæYÜhÂÛ wmhBB!šÙ¿Ék½Í¬s߯Áu{ïµ7¯U“Ö)’úÂäRiÔ0²øÕÐF"r¼ØöPC´ð"TÖòØßš>¨]¹8Ô±Œ¾¸ /×0<ÞM(Á@ þHƒ_unmö¹Tu ÊÚšú¢ã9w*âÈP±MöWªõhF¼þ0ÚêZìŽ(mòØ©°K›ÃK*nsô §f¤O‡õQWdQ¨½=ÛQij1ßUWÈOÆ!óˆ:Ýǃº:° ”_túe€K¡ÎERŸT©ö,ñÊpÛ)7Ì eÌzÙov‹Ç['ÛeIÂüL¸5Ùµ ¦-PF.J>þ…€òï(‰TÊþ˜"ý³íò§u^¾¥Á¸½Il³D®ØÆ}¬úX`ª_,„Z`²‘v)èÅûØ™ÍõIM²&ð(ÝZ±8¬µlî4¢M2!¿à§ì:þÌÔ_o¯¶a * þ)jÓÛÈl¶ÑŽÌn‹óæCW£P¡Å¤>½ óÞЀΠÜŠA~¯ž_[fóûçP]§Ÿœô¦ñvë®Â ¼4wUâ"’¨¢ÒX K ±vê+ÿZH,ùqÉmDZô›üàTóÖÕ?P§eA-Ó.Û{®÷=÷.sñ0¡90bˆÖ§ÖäûëÔ†î,ëlïpž wRÅj‹~Á¢·7¿ê“"}L,¦ OÀÖÙýözeHú¢p¢ýÄP ÒaîìûgSy½øô¨Âiµ½ù ›–ý0:}ÑbcR Éõ4tŸLrG25§±{}q~†i¥ä+!(á$¹Y®Ìh+­Å5­†báø÷‰ÎÓCä)l+ÃqzÓØðGÒ¦NèüÓ[²\†EØ+Š~ðŸ&õ(¡9ïB\Ÿ ¨óÄ`L^>€ƒ…Ž,")ª˜ü²iþEÛoh¿÷0v|C‰"$‰%cg£ÿá‰3?j¥´êØ–¢¯ûMöi&S§O±z¢,óõgÚ›§Û˜âˆpw&]Xc5TAöTŰe픎d$¿ï¢w˜¹¨^ŵ oTN蔑6Z°ð'&8eÇ_˜°r’¿§I`@'Y¤Y¾¢(îÏÿŸà\ÛŒ„` ­Eh^ÈõcYöÜugÕœ§~•˜-kïApýÔV§Ö ¸®Atêý›¯ %œê®JOWc’׌íÃõÛ"¿˜¹ƒ¶hµª¯/…»úRéôúüî² q—E±yyTùæó/-é`ônO‘¼×Ú$ö`Õák` gÇÃ’¥}±žó|)¢©Ö÷æe ÊsSM}}†Efß½ÎWÂmÞçÆ§È©Ôp#¢3ZáÐ…¥OQ³‰Ïúu/'JXh£èñ“Ûcv'…9‚G±}­ªª®%tR‚`h\´>ͼx—½k#§ýóAsÍ8JM'?šyÃUµãâÃ趉^fÃÄöµ<¸wKR€Ua[d*˜â6açp¹­ˆ‹(GÖù ¯¶GÆë{^C&ÔXåŸ} Y$‚C«ò  ~¨›HZÜ` è€aïµ!•ÅaEƒ3=lþ,Nªl™§ÈnýÜadª OUƒÐôX75/bÌû•ÁìeOŸ-öS ŠËlrƒBK›5[7 ]ô,&ù3·°-ƒÍE¾[x|,´ûír B³®%jv–Ñ óûóQ%@ïáî’äE᱿Ã9RÝ–Ó©5ÃÜf±™½êV¥†,UµÒÍ+ 5О”ßE^®þç B¬í f¹~@ùh³:Z󈄡Œ¼ £ü&K3A ȰK8÷·{fj¦?´D 8y‹Þì $ðu~„³·ÙeæÞ 5q©^Õ¥Vî*±pöG{Dzûqï S¯]r ¸&QÎqŠL|Óࡇ$Œ5µ¹{TóÃà‡=”§å6ç¼²‰Í_ö¬ÜáFtH•—Í Fëßï“ì(gL(¦…ÿ`VRÑ=Èø¡ÝBø(QÞŠá­¿ëȉRä4Fΰ&}6Q8¶Î¶Ñ|ö Q y*8ÖDæÅ3ꇋ'Àã΀°Â6Úz_Ã߆|áÆWÅôñ€íÀ-l&—9|H¤®åD>žŽ7ŠM…Ö™½§b:kå¼é‚µW$äè7C7G9 Ų5>`Þ—âw»MPš·.¢c@–è~ï%Š1ßÌvRµæïMvû–‚U°¤ bãIô³Þ»Øü£‰_™ÖxìE³¢@#̾–Ï"ØË÷ªw"¨Ïújie1œa>uýIWí“fÓkÒÁ’6B%Öú°èH0™ [Ϻ&·–~C’½t5©&ü‘åÆôL¾ú!ÇVª+ðimª —Û%Gåê¿8¢±Ÿký¬S¡:)9š–K”qÈ\Õ[ùµz°¥CІƒ  ¾ Þæ‘«Ÿz8.'fŽÚ‘Ê5©ú$ ãßM~J^~s6{ŸŠÍ^QièU_‰º¶C4²ÙÊÿ÷‹eNz.¦¤å:ÚÜÛ–:N KÙ÷hí=›LÖ ÈYíë—:åâΨö9C,–˜sq§»úàå>,$ “[DU6ñÅ6O"¡àFÌœÖJze~!Ö4/`K }”N2C8¸ºs’K’P-}ãÐ^¹±\FøÁõ+Þ#UyîתS¸MõpÓåþŒéº }·çâø/ìS$/àË$’ †ÍFá›ÔûUSo¥<ûyòJêßû~&ޝbX†’Â5O‰®O¼ $ŒÅ„€7´Ùå&Þ3È!üeQ.ÂÌHŒóâòKf%Ôì$¿Mý¦Xœ 5£Ð¯ T)Ëâoˆgzѽ–­W„æY¹.”;PÈ5l%¯Ã+l ç0i“(yòX »Sj9p®v¹—µ¥Ä Š2º;§¨xì±»Õj IGV'çøM¿ÎœÕK±aÙM2¬_kÅNíþ ö&!›'Ú'ƒÒƒáÐÞ·}iÝàX!ëk.@æbî+icÁW±Tcè̀ͨ/‡Òî:IœÀ¨ å€ëK£ø)ÊÎ0›Ïó¤øÎßù«åÃA™íX‚:m哱úüûNâ“N—|;ÄËŠÆõ ¾‡™ˆ•«x»Èz`€`îB¸ÇhZþCõÑršP[±,¸¬‚Ó4M¡Œq={R0P'þˆq0¸¨+qZX3Nïó–›·»ÒíÞôv÷=¾\½EbÀ±×ºÄÌÂÛkÜoFM ¦Z˜­“˶uì¿ ýûìîrr8êûÌPꃔ¥‘æk$mÃp0-â à¨( h^åµ+îqk"›Ÿç†K#Ëל圹ŒJY¾hv`¹î†›’)ÆÖAÌR—Xdä!Õ_· ^©eOC§ÓŠžv’ص 2Ä—·C%ab5 ‡ ñ‘w9óárÐÁ6…?4¡O­) yvþw^"b¾XuÙsdxW'·‘>ÔŽ¼¶ëLÇï'F¤Ûõ‹1þ$,éµG“ Z¦;¦>IÂÅÄÇž·¸¥! d¯•Z¶:½ëø;ÁOäô*1Ž3ìNÖQÃKêª0î7ôûvL\ÝDªé]ㆌ5Hoëý¹ÑPÇ B„®8¯>îåŸcÂÞð¸ËsvăÊïcàl)Ü}ÃÈô! {¶§\¥—Üœ5ßž¢ñ½ {üM×ã³P&õ 3 ã§X€4tþYö|ˆ÷í"¿…Ÿ"ùw“šëq×lI½Ï ÝA⮲Y Ƹ J6„*¸¥gƒ Õ·åt„ÃõêBf¡€5"[5f.œ¢Éˆ—4™jì=ƒ¼Û.™Çõó=최ڴ»t™+Â/ÍŠ,>²`y¢ªèQ }u—¢ ¹[«gŒ“­·Õ·‹b)Pæ/Ž= ³"oO·|é-ÉÕAè7œCS@â’!g¨X·]Ž Ö´÷SÃ}u{"ëÎ#å?ýMš{Àž®lŸ\:Ëž›âx˜£ºÅ™ ùAZ^Ή°g±ÈJˆ×½î Þ5méb(”3A‚èÑiTòˆUíBŒßÔ&T´Wl;¹ ôt²]V¨RmÖoöêá³SRàéü‰5‚ˆnÖ‹’»ÌêåqLj?-âƒLyת¢šà5öaÊw·_XÇ­O÷8¥¹\WìÊxÎöÝ VÌs$˜eÙ)ÎBÝ$áøòÎʲQ°x¾µ "1C-™<9CÂ.\Ú`ÙI”Rõ ŠDºãž;Ž}ÄHÓ°Ø t–Aßí:“Þaqòº§ÚØÔö)¹méVÃyøYùÜrQKÁV³+ÈRzïÅß›t¤Øênž^²"«pŽÁ§½.îépªïH2dù¡É#ÿ¨÷8›=Â}-ñ˜eÛ…B·Á…âóǰîúkrF/ÀQßQiþ^æÿçÈ«ÆVû´4å+Eϲäöò-if,Ë2!µº/»Îº§Ný˜ßX}Ó÷òm*®ì“|†GÐ}Ó&4å>€ zaµGGÈÍ}&€!<¾vå,c„ø  ÁU [¯šÏ­!¥nXò[!È:ÔÿnÀ²6­„Ÿa7]êñV¼°úÃ:d­8ánm2 9Çþ`n„[œ«%#Á&¾Åì¦ul››[-ïÁ·ŠÂlfÌ9Õ6ÌTI±_Õ³"zß6}%Ëfs™Fë ­¨C¢í?eÂñÈ8gÀ¤YÏ}Z¤ýlÕ¤7ýnWZ+òaX`ì9{R6“›iXÝÀ.Åö‰2FšÝ«&‚øu2È>]XÅÈR`…>ƒì µW»HüH Í'HÏ)`â$Íӑè٥ÿ×djmne‚Ѝ,ú×ûŽr=IÜ4vvÕ;uj í%ú¤I)vŒÏðøz"ÈÞWž´ŠJe^ß”öz†¯º•Œø'¶Ò³%õ—×êõ `e,öR&¤æ¬Â‘®~©J`ØsM&Ù£-¶$ëj–B£>üQœíM>^ÇÊ+êÃÕ粜Gô’¼"jÉ"Á°ÖWKaÄ¢§\Nìñ`"½¼û#÷Í~ûéq9±föB÷qÏ‹“º´ÀfÕ4Ï>”Ê&憻¿Jz.Ö/Οäì1òØp%] &:Í;0OËuµ¤2ƒTñ)æ,¾û&ïêͺÂ,)«ˆ ÔSéÎÒ#"0Ý­ÃkFøô'·ñwŸr¹¯´MЉx-’%÷1Ÿ¬¢ˆ®¨,#€P%0±öº=/¢8kÝi6‰ êŸ3†”_ŽR—.ôS`b34HvN€ ­Ç6kÊÅ–*(±|2Æ'p¾ÞH~j¸-{íM-âo¨b¨çlÐ?Vžá{AK‚Ü-‘’xcí2%›Ýç;í ;žðc¡äBöܤb=ÌRd?_1ûÈOè=·ã€¹Ü5@¬05£Æ‹ ñ°3\½Þ¦Q9FâϵÕ Æ@Äqo>mï$ übÒËš€ƒ2h¥†l@=iìNLœº ¨åÔ•²K"ŽG¶ÜOcFmÈ1ѵk¢‘¹èbǨz KP…ÈWWwYX­_¹g”C¢Îÿ}‰ÖeŽg×"9—™·­—-ÿ.뚺α'\Y†éfRX¾év¬Yäå[ùÇÚ­üûR+tÍ[ BùÝS=ø)d ;€Ë*lßµ;ðĽ._ª>KfBÿ“øqxYø Íÿ•(F©ü|Þûš0.VÀ…óƒÀeÄ%Søõ‘61¥°îh¶»²ƒO•¥`A?A±~'LGÿþ­aÍ?X0 æË\MÔWsm¦áÈþy!µ¨3b„}ZQb’tI\Äm²’ç ÈÎîŸÞ¥Bˈ?\ÐN¯&(”q=$ápž§#_ì(Ë…Ñ•˜Š~*‘ò'u÷¼lW=Üúd–Dßœ»êÔú+o !u>"5{°Rô¡ÌqtÚy%†ü[/Îyø,;Òm¶¸0'YŒ)HM+éÊ©™6à-é½ß«P‡NvwC‡¿)qû‰ºÓÔa zñ4ÐýFksµZûMIXp¡ )=Ì”Š"×D­š^ËkDÚÔ Ù]ß4ýÕGp°‘M‚Ë-ìÆ‘Ê›cÅÏ·² d³ß¢àÔ[š,ë8ØË²þ9þ[R*©.BòÍëó³cœº=㿎¹ô5ºÿÙœ“Ä{NÒjrHí1ÙT—gÈB|ÍÚŸãw)2ºïà£.€9Ú4KH0îœT-BÏ}ä*ƒñ#$nØ\e›%¹žÊÊÇ~ÉðÙÄr»"Ú)„_ ÃËF6¼bÆuRO4vòóSúÀ~Üù‘¤†ÅIËø¢ÔÓòTº¸縎¶'ø†0.é D®r.Õ­.ã#ÇØ8 n_rñât4ñô?9hƒŽÊ'NuO· Êñ³û "@೯ð×,å1õ°6~a!›šBwº`MrÀrÔfu)§ïŒe{42{÷1&JýqIÙ.¹S~ sÏsfI$†187(ÓjJ&Rnï>ší/L`”NpªÝCMe FC¾Ý:v¦³ÿíŸàK|ÿ±Jÿ#žd‚Ô 0¾±·Ïh‰» yØCNÈ!u¾^cÎ0êzkæªÿ±É‘BYÉm’–êõè†c”¿‘]e‰®*xî^#JÀY¢Ô³cXœTp"}ÂádtëÄ‘§hÙ_h=’\£ YR[Å"‚ûWæ3á6HhÜÕ\ÁÒ¹g˼HñCƒ 4dm]x&ª²Žˆ¯Ç¦úEùœ^Í—~§Ò“3`zš¢mµA7ÎM>ŒX–²Â £#Å%¼.{,\„6l‹¼M+*Ê Ô>±=ÊæÿŠ(Ùü]gש´Éj+ݶý ù_¬à5€ùRíæN.^®Žœ¹í Úã0µº|Õšžq?@XÕÅV¢[¦¼>¡¾¯õ˵/³{ù8½ãµq» %y¯~c]F¡Fhñ}áL\×¶-Sx‚m£E¾¹;󤱄ýH¸é¯?k‚-íW 'õ>u­–üÂ=vD7<ÔÍ8 ¬×öSÚñ|,x›ÚÞMe1ª´ÁÁt†N¼“à‘F'AM8ü}¼ ܧÏýÁŸú¥Û:d³ñˆ‡ꯅߙWÄ»P èîUÝ-.˶ãšå7(VßIdÛ{Mûº ÿ1éŠ|qjíw%îÿ½#:H~‰îOšçHÞ@õ¾lµ¸Ï2|áEuu‘>ÎqăùçþMà^,nxú¯šß]l¦hÙ_h—E z?mlŒüÎîÇknmç“1ƒŠßVÇÒœÙA…>Њ·/G+m¶vÁbL”—T«!Fg!ÓGÁ;G‹¤¾a½xèû ­N¿E3%©Teú“àŽ#Ã0Ú´!äT½O@Øz4æ!AÊí˰Z‘s6r\.e'싲yÂW·gÁ·´GÚh Eý ·Ï†û‰ÁýqÞS¿{ãm¨}îšùb=9–jN±Žÿ¯È;Êç«/Z9ƒ”jV±Ÿ¡ãhÈ)gä° Ý‚¢Âc1¢@`V†²Zµ¦árXvÛAçÂŽÖ3VÔZëT­äwHëdccM–7çxTdÓ0ùêhöILìI(mnÆÇÀæçÇ_lõd;¹Iûõî ¿E/ã <ƒäµÐó ÁX:R­Ê×9”ÈæîÄ„ŸôЛãíd®Œ†¢)2¹¹=ÙIü1k“QCÔVPDá€,¯ê ¼€ÿnMv‘Æš•œ¹‹(A€½š¡Ô_Q#Ûp–oÍ]ö8åJ‰!+­ˆ‡äºÞo2ÅÃG—³p`ðÁ:øÀïçÃus>ýA»FòÐý·-Þæ› ³‡f ˜Ú¹·zıƒïÁ iÇnpŠÇŽ¢”˜×\—†õº3˳ȻU<ÔŠºµ+Òú¶Y°Ïí?ÄY‰yFÉ)é[ «´ËÒèç4ÔÑ(“”Ȥ"¾WJc½H‚šAD$¢h6#e<ÚÉçÕó·xNà¬#@Í…Ÿos°ÐÊ”Oí:EsJºìI¥y ²aIø™}ª„X“´^Úa8É=IÚT=²ÞçÏ}è6œH'¿E6ÖêËGg¸U(‘4ÖýaŒÙ9Ž-¡Ë6µ% ™]M¿‡a"DÂú‡ÓÎNfA }>Sÿê?û¦CÒh¸©á.©—g’2(öéÕì(—'É6å  ­X’«WPüºÉÀx qnÍC¦goõ¤8‡Ï Ú=x/ú÷5¥l>8cç; f»C/©Y"NÞc©’ã¸`-¾œ#;ùø™:O4âwzÌø_¹‹ÜÀg+°±µ;ŠReÛûM+X[ØÃ²S€¯U¼ ®‘’ ¥ÏFÈ”ÒøyatË ‹QÑk„#-vúRQ¦µE=÷äz4ö˜ ¾*Ã"æÝsœ9£ #BZ«’š•x^ÇÜ÷þíÛOø…8äBøWýt$¥ÂP2´™,ÍÅ_»Áˆ/W#Oº§dìŽ k¿aœIu&òñE¶t&òýFæa±’îæ¬`Óp;[µú\¶Qd_ƒáhëQ—Ó‘ÜÕ/ýš¢ÔQ”Øù›òœ&´½tO Ÿ.ª‚QÉþè¿Òj8iïbS ¾Ø U-‘úÅ•[9!/±­`0ú#Ï Žcþ‚/Çp’‚‰ST©,q§¥NfGñ©™ ´°–ùü'WÕM[¬ÇØ_Ù¸­4óå!ú6›I¼uÔ]íK\3’hya=v0‰º{•l¹±ÿhpÃ|^ê¿ÿXXã*k¦??Ý?OeùÒܩ犘ӵ¥X^Yæõ‡@UŸÈÂmßE#ïah>ó†×sÀ‡ŠYaÒkÜéˆýXL¾'à(ó²ø*5@ ÞÛ‹ÿË¿³ÆÖ“SÑî>×'kCsçÔ …(¨‡fižÛ£ !»†¥j¤]¶xiÒÆÌàG*îÅøÎ"´QnŠ;Jfûl ×ß^ÎRá´®÷Î4KIƒ€Ý€]VY®ú+¸ëˆRè­#I×À……~³ÇÑ®–Îl…u‘añ‘ƒK¼¾†jòエõÝ7[çS•Š7õä>G NË9æÑ@§¼«ðî+šÅ= ª³Ý7ƒ2>Û,Ò-–u{Íâø5]#g°‚`ª öõ‹Ì) çyh¬×1ó;cvfŠØLòàœÚÙQ¥s¨ÌoÅÏëW;t‘«U+.ˆ¾ý+¢#邯Ì4N Ñx'Œ*Zdtí)Ùê‡JÀª¤|Äl Û œ…7¡tzá³0Ý…¶Ø ǪחÉî~Lô‰Uëk©íK’«H’È¥@7ÁƒDÎß`£l™ûùYÒØ þ£ðƒå-.Ú®™@§ÿ‹Ô‘ô!*¥7t¸h­]³×_–…øüz‡Î4»c†ß­!£Œ<æ…Åñ°–u©D9‹ZRDÁ_o©‘àQÜ>‘ðef-H`-RƱ¬ÒY”y2˜>êj‹ŠŸÀkÕ"t²W²å^_Âøör^è_å 3ãjП¬ß‚H8h‚´Ëÿ’yž@˜÷¿i˜#lz¯ÃävyÒV·5†‘w†c›6¿¾·-½ß¡8˜•#¸— ÂØ¥•,ÿÿ䛎†ýÓ½ëcŽ\„›]"<($H3–¾“Žyæ0ŸrU ˦發<`qÌã¶#<6ÏS“JlcŒø„Ä´”+6 Û¨±8§qzÇ¢™ô¸þ”]ÊO[1peá?›£Ò'GómûãÛŸtYv>Ø—òsõ§Yý©^Ía ‚»yp+µPøœ»³Ç¬€9¼¸Cw¸ì-È;X+ÙÿK‘f×ß§äe¹ˆM¹:ذ‘uË2Ù£À7Åw²2P±f”âpÙá¥6"Iv.Àp1À¢6…ÑE—JŸŽÈëÑr ìSÆaŠ‚é¸Ú‚HŽÀõõs4´~OEés‘§q1mл©@ë×õìN?õ}šÄü­(°[}ò\i3tŒ˜¶_8¦®uŸTYe^“íÔ¼²ÕÁ/k"r×ý%.ìoe{%jœˆ0® Ôômõ­Øvä.fqVOþ½sŽžjG CqX(ˆ´õBcËMŽ÷’K¨›Ô áí¨|•6ÈN[º\"ÒŠ´h‰¦3‹Ç”°8?¤Ÿ^Òâh›S?R¥ÃIÏ›úˆŒqR¯°ýÑtK—™Lj p.öl qo¬*#÷“’<íBkæ‘î*ꀣ´íâô8ùB¯#§ÄŽ nŸ<”‰ æÆ‰Ÿ=69l.æØžs ³.*5’µ+Ëý¹Æ(ñD#ä#Ü1±@Í•h|«dÔ ãÝNޝ¡Yg¬ëÈ+¤÷06xÏÿ”Z<Þ.*ÿ`o`ÇÈè ÝwSG3M iŒl’ÞIêRÃ|øÛC9E½ómQ‰¾ÜÛ@ï` f†¯‡s;j|!µLoàܲ«Hè'F•t‰ò;ÿðd2Èœ<>îu? •œ E?}U©C«ÏV-9 †¹må6©Úþåq •P  å˜¥ûX,œ–-©FK«#DÛIø~Ào¹ JñæaˆY¶Ü]{ü]ãA‚p0½lÕTÍc%rçAÏh£ –‚?0Ù-ݰ{›w;c´¿àª¬` l¦3+$ËÐH­²‹dõ°dÔØéÜ~xåNõß$ä)(2 ©Ñ¤Ûžü›vÌÛÃ.n}4±t²up ‹Q²1ÔaŽæ²X6‚:gJvgf‡YwI\yH·å¡Êa—Çèx'Ð¥0ŸÃ Ï0Q?ù Îó®l5ÛØt¨Û,‡TÍæ ÐýS:"Þäa±_+zU`ôý8ÏÍÎöþÄ;_—ƒ\~•ØX\O¸D¼º š“i_÷c*“ƒœkW\]sœÞãíPùsoψËW -Ì«Åj²SHŠJ—Â亩TÔGo¸`g:‰Â€¦j¾W¢ùÐ’  ¼vuiúÔξa ™ñ:ôC«î„íòt«9¦µœºQÑÿbPœá@*¢Ü “ÌÉÏeà›ÃåÙUõ7)ï'þ™°sÃ2»'Ž=k_þ–Ç2ü1¥RŸ+×ÓqÕ’°žÒÙ^¸©ôiq@ÂÈ·ã̲GôІ¥Uô`lVë(¬¢2BçD©c[j\ÆŒ;~P&ä„8p'; >‰‹®XgÝe·‡Ø‹Š®©|.p¦£ÿÌ*Á# ¦ëiønøx”|°j—^Ôw¦‹6Î9'jPUùÐq™z»S¾Z±È:9­=™øÖuáÑר”Š·î¿iZXAÇQ#¹—l­´ÖEL—HÉÑ£ñöa:´>Y¯ ?ß‚9R4´Þ]uê‚ÝHÕ0&3ú‰'"㼞à§Íihá²CePéŒNb/·ÛH‘NfBã4>DaŸdVÞ–IŸwWùY¤Ç”¸XEâ±)úZ`)ñ:!×uk-9s‡`jŒG¬ºõvor1)!ƒëÛ^‰ˆ¯ª‰~< ¼˜ ñJ?o“$äq\´p̨Q«¶*‡õî­a»NòžØe@FtˆöÂÔq£þ`éÍ>/OÆO‚U´é¤›€‹©–¦ïÁh"Gø=E-Hh…Pà‘Š«V½w¦öìñ~.Šjï¥+t#„ üÏÕ^†cjß'Ы™|Ö3Óë F˜÷r § •¥ieqŠúNW%*aÿkÑ¢¯5ÑøWt¥MTòÄÆR5zVŸªQð~ZØUˆ/ùXíˆI—iKcÅ0Ük¿ÿ–q/3ËfU §4;”é»UÈHÿ5tž´ù²¡‰xý[oj±ÀGì9kö óî$‚æŽ{7aA¿ª+”¿·>ÝZ=o)Í#¤ÍFÇX:ßýðavatÁ†½§ÆJ‹;ð¡%+|5^Îזδ§š‡‹ÎÉœÿ\ìüý±v?÷HY¾T+åQÞï+÷Y# ¥Ë‡zO^J½ g¨°‰g·IEï ¼ãûi¼¹z×Ýœz^©„÷¯Ò%ZîîVËyoΊ3yP[÷¿â§ cÈ9۩ЬNIáäɸ‹JÞ‹Á¨ÉS.íÔåñ†lfÔ“9´HÊ|¨«U´<Ñ‘œ‘„àç´î8gì7~‡A¤hÌ߈<ð +çe,º¡l ˜ Œ4Q¨Tì}¬#B‹­ F•Ï>àv›ªÂôÀ¯{òŽ»|%U¹Ü.©”Ñ’¯qÑyª°…dz½J5™æWU¨»nÒò÷p×q»ßúò”ú g’q*­ Ç Óë0Îòž ÂÊÓ›©ŸOÂ4S¨±ðwÔü½RcååhYOøz£êe’ˆ¿Ð)Œj>¼ŽJÛ:¥mÜMJÊš5aÚ·]ÇìM´Ðÿ`Dù6÷T\0˜MÈ£ä|çìOÖÁ¹&}:l€HG¾Þê%È 0˜ÊéC *Å‘ÆOo×|éj×]øƒP@n4 üÁªÂo$, dØÇ×ý¶— ˆ2ùÛÖ”ÞìÐUê´ÆG=ÞmèØŽG:g0Ž®µ.§»ŽalÃ3„™:„Mmei[Z§´½ååx»\Ë Þs¯š–A¯B_­§ Ô ^ÁÐO<õáQß((¸6Üà…ÕÜô9::yŽu€ü÷ >2Ûш‰íâ:2¹*y¦ÖYü?2Žj…C‡øgK*ôgVP­RëQ28‹áîøÝ3à‹Ýij„Mƒ}ÀäÕJ© ”L3p·)ì,1$di9xRG»ÁY*[:ŽéŒ Çª·ü±µƒ{Ćd‹75‘$jæVI+ÓÖ¤%ÿmµ Ù´è‚¶<`â3- ”köquV›ô™e÷fà)دòséÅ]É.—,ØÔg¥¿›i{z¾k„£…CÅ2ær¨¼šs*Úç7ü.Eñ¬Tpœý„rõ<,àrBóñ02,6k“u¦ÎZVµ^ˆVß½®f½HÂóžÜ‘· âž?ÝzÝF4‡ð%,KI‘ËwGÁX¯å6a~;¯%ßµÓûÜÁ*Ú¢D½e@¢w»:똉PyòëßÍٿˆ¶ó8l2˜k¤Âé)Œv_°41ÿß#K…¿Ó÷LJQÒ„ë›Óç±Aeõ'ð”¯Ú¯#%±`K©Çù"ŠÖ»ó¦õR&(tIÔßW«éŠJ¯åÅGuNX©ÿÍoÿcë¡›=fzfqÔO% w¦˜¸1çÌq×ðšAIF.K=‹i‡ˆ­2@Æ»úéÄz1µ ÜkÂüÝ‚Ž-ÈÕp¨®ç8Z®Hz}®Q‡¬îÒVªåú¸º}3‚Â/7qO£€áÝ[qHÚÁò/m« õ=·Pñ7j_lùR>¾ÈÊ¡Á-7žî‡ïчΔƒ‰òñ?&3Á€Paê’n+}TÙÕ::ôf¸e»Ô°ÆÖüW,¹åìŹ {o M¸L¬Œ…è×Éû‹‡§­æ|ÿ‹Ñ7i$§uZÉÌ -n$c¤§€eÉQ…ŽýzåA6wÛΓɂðÓâ×–T †ë¹?ji €]`™-î8 çfCPb 3$ûS8µ˜D®-Ï4{HúV¸¤ÔQ}Èš(U¡±É¯žöoéséq†ûΛÈÅ*½¦öMQCfÛ¡ºU «owÞd4í­ÃZòk ʹ9Szvyj†D•d;ž/·|ƒY*—GXK(×O¤W“>…멲pÎ5¬—óp$6¿Ê&,u åÅï€ÂÑ ‡Ñ¼Áÿxsæ UÞâëÄ„íÚ®åEª¸@DGLi6ýå Eø6½>»vfî[}¶[û'L×%à”´šuú¾ Èõ¬/Ük‘ca3¯K/^§*¹•ŽbNqGèL¾ x7ñµÃD¿FƆ„ÒR&Þøÿْݯ©÷$Ufnpýu^¤‘š¬¹_ï–e?ãÝ‘Õáøk/T3b¯ílëâP7ãiÝ.-û/ÈÿØtîÐ8#jl™(É¡½°™0¿‚†>ôjIØÛoWؾ4SSkOwÊ…,òY…À‹wåU9/dÜh‹…¡ÚRGïÓäîÚÏ$«P›Û€kY Q›Ý‰RÌÓ˜z§xhÀbë®ø÷F +4iø^¸„Zò£B‹áÌ„–ÂÚˆvw@ÝñmëËw‡m‹€7Q—Žr¿Aþýc•źßR/|8¿%âËŸšÀ½kÿ+ÍßçgXó«æ¿`Œç4Úé Œ™9ñ‹;yÄôzý%Ù…Ø =+•}Qlð4L•<=æeöÏ•X‡ãÂu¼­qÎׯŸ2Ê5ÃÕ¬$ F»2_ÿ/lÓüçdãÁ*4Ñ l>õYk!–§¨P˜V‹hm˜ì—µbùô>/çI—lj:Òê gn‡{Z[$•àaKRÃÂY :‰·;0iD¯Œª¼´VÇxǯqtœˆAy®Å&ÐØ[ˆ¬âþè?cM̬¦e*Mt­>|<|ï°Æ'Ï ž Ag2ÆNi#ÿiø†ëýEÍ4ñÃ}ĈŒq±lÇÓY:‰|SXfŒ4ã½ÈÄ•½·¨Ûþ¬\É0 ?Mùƒ}Çd_’›xÿšD¼tÒÔõ %³aví€2Q'ô*Ý EÂciPy’dmõ¸îGæZúWˆ®£ µ¨áwÅY`­XÑøÖubÖœ{\÷Sµ]¤•ükÂŒ™Þë—î°í#ØùÂûÚìå…øá2%ñó¼`7Š7µÍ”ZÿgÄVR:Ñ\ø3µy^òéimIyw×¢ˆÝ~†_÷ÞWhÂõöä¯UäNN´‹f¯“²„.‡ñHcûÀÃŽ€›móÃ|êdo"cºoýíÆZ=ZÕ©,5Œ'µCècëGPù´’&· ¥<70`[ÙÏÞ}Ö)­ÏPÿtkÕ„BSrX÷Ï7þÝáEĶðÏp úuåÐeL@»dn8§ûk!Y•Ïüëî[iɶ²Ç1Ff‡=BêÈØYöL”/CÎ¥±]Uäë„Üf’­áä¾*øôH­¸GŽ(Áy­è(·¹nŶ`½Ññdã¸'..GO 1NûœÑÕ¥!"ûK úarø BB2a ÔO¶B5£¼—ÙÎVÍèâ'{Я8„È`TÜúa°âFþ6q4!÷b:ÂLÏ #Âà¶K¯šÖ¨Çô=qlv€}ï—]q””tÌ:ƒ’™ ™Îs åù‰`zÄP•ðëO¸ìIØmùÃ7cøâJ9¬:;ú6 m C¦QÑ #ÑWƒ§ù“>oËy¡Í¸+Xzwœ ³.«ÑûCX¥}MÓú3}L™ûo¸ce ŽõÍ æ¯vtü³í7>™r¡§9ºƒbÓ®‹Þ!m¸9ž&…''bð‚šŠÁ{•7áCÓ½Šý7”€l–ý® ò<©Òó‘.«ub_f8# …ŒðZ‚ ¾hŽÏÒ=Ý!$Ë¶×øaX/ˆvÐâªû¯ÙPTºuÆ ´'8kÂâ•S%ÕRZÂ&t‰­ËÞ¥å9êÔ¿‰fÿräfRÀÕ¶ðèÖ¬cæï}Hʘ¤ÏKçá:RÁš{ꆰ¢pO–H6X1k¸ëñ½Óä“P_ÎuˆÙUï¹;̦…1–™l.\ÓLfÏ7R×apèaò݆Úÿ\ ºk`ÅüÑÌAž87¹ÂšX 0@tÒ hVþRˆ×g3Q+¦ªlZßn¬—ˆ´…½ QQq;úÈyƒ6mÍ0mpµ€›aʧîƒÇö¶î›…€ ¾¦ö—ýŒþWÏ,ç!û’#ã¡mÁË-bÏ:g‘’j‚üãÖD äÌ2= 8KºB)¤lÊ]œ_9/Ÿ28ç,ä8V¦²ÁAz>æ 1Ïit2î/䇫ļyHÛº0ù…H¾É ·lYe-ܶµ¬!ÃÙ„:”–ºÀZÒ»’\\èu£Þ‡<Ã&(~Khø¹ø“àÑ)Ú‰#}—‹=IRÄÔÓÿ¢º`C°ñ~yøFÚ8ЋËLI÷bÓsñŽð;…)µT˪_œÖg4ƒžYs*‡ Jbæ£áÀß7Îx‰¨ä;ÃlÎÈÄëßJÉ‚ÓLSÝü†)db?GU€Ø¬¦¤î-¡ã/Ë´HKjòÌm/2?¶šù—-VœË_ëåTDUIFn«ŒÛË4–Ù»„LÕ.,Ï»j˜GÕ;4±]ý[>3£SÜóK[>ƒ|#ÆTñx]lqÐ'æ\½8i߽Ѵ'õ•Ss¢º±¹–XZ@Ú³UzN¿æûͧ1ìÜ‚¡Ä–CgÏÙ£þžf Sýqp@H˜µ¶t Cƒ&lÀ–a¡Rº&.³!žÆÞÊøà™fJN‹ÀKÖL.+Ú&u“é÷…ÀŸEß.c~hKÕA]YÇ×ó€Îq¨c->—_j?ׇ–òóVH5þúŽJí_<¥›k¥€ŒpõíÞ7D 媧°‚lÇŠ «ÄC`J»Urˆ“Õ´;“ jj ‡º×'Å¥a„{õnÁ&ÞB?/ü¾ÖÉé|ÚÝ|&‘n°¢cJQæê•K L–¹Ìž]½L;ŽQÐ+ÚC»°™ñúiÒ¯Ìîlkí´»ôó×ùÙEVâûçd`/¹p…"lÂüM–å)ì¹4El¨ú¬÷ñžð¿¼¡ƒ}Ö“S•òóºÍ@‘´Àíx÷„ˆ ÒÖ@q¼˜D9 3˜Gáü¯ÊÄf¹jb,Öi–˜…ÔQe| ùÔ~‰)®ÿi‡~F.)H¯ºóÃÇÓMQÂ!„^ó~^äÞݵùÂÉ{ëü×0ÙÛïáû¤¿¢Ê•7i,òÚ%¥ð¥âE/‚ዞ˜sÿ-Øp$ºá˜àk¤½Z³ù´Î–S"çöÙîÓ­ˆX‡¡ÚÓ‹Dc"Þ¥l¤jÇ[Û4É[<© ¥ YÛ b Ob³MRÔ„웥gr¹|à8÷Éê;jÉÿs„'¤‚Gc†z‰èäÚ î$Ún³%ÚLIà٥ϸÿ:uÎnhmŒè”&SNûà¼ãGÔÀÿ¶H}ñjá ½cºt–”ÃC éî109˜ä2ânR¤>ÚÁèA£°v®t(ôßL┢¯d5qBôw‘ZR 7+ˆ{Úa1±ì’JN¹˜ ê¿!å"v”ŒY]^*€ha´?òқûŽu®ÕÛ VΪz“aìÀ‰OÖg´Úf“QÜ—Z³œñèÂRÍŠU\Zož°¸1)ÿg´¯4#¬Tð3&Bnk_Õìš„C{imµÖ7ÐÁHP3jmýó;NÜJÉãÛak˜´¹Æ|ÿduÉe¹ÑŽQ(VÍ?khúA5(Ê4ÆzÚK0!…S{A£×g€Àñk-©Âµ“B­}í»·9‘¥p¡K…­Åá.ݸl…«Í÷l/Mý¢Zð]*†‹åú/¹/à‘2\¨–jœë鸋u&9kÙaÒEÞ2&û”’˜‹ãÐfvǰŽ4ç1Ì:]¤ƒâÆ'n}½:Ï‹õ'’?æÞ0…Ú¯G/ÓƒehM¡}Îl,çΨÚäüðxÕÆ¾òDÏrÆ;*/d@jzx ºAmid)| áàÈæöT—Y‡Ãé*…úvJuÞQ³UVEó†òîûó÷¿W¿»s€Axz‚aBbx/ KŸïGfߨÂbf«Õ÷2·üjÔ1{'~óÜ•BŸ ´³C^i‘y‰ÑÒT:;B§ÍädÀ|=[RÅ cu’,|é÷’‘=C´ÍÐ…²XMLd†6äšéuH>úý…rFµ &¸p×p0aª¯÷¦%©V¨>;ò\üq‰$ˆìœ¬-ÁŸ€©–è7£¹ÒÙÛ€šªa|Wz©ñþŸŒÇª©ˆt~ÕGj¤…ˆJÚâß/Jj-tê|Ùœë}ÖÅXƒ(„$Áº«&[CÓPû é¶?±âkQºš v™ `jéŒkǯ¶òNH«F€× ÝþµŠXœå®Ôã6@R\‹è#ƒÊ…ùëÕnÿ•25„êmbЀè6•‘îÑèÛÖ´ùFÏвAeJãl5ø†]A.R ]–‚ £âlž?«Ò×h!i ÌŸð¥'†­à§LêaFÛ|$áw’g'õŽTj/´,EŸŒØ=„Y%ЪŸ"ÓÁøÇpyQ“ƒ° %¶¤TãøÕÍ8lIJÜrLSN´xN³IA)Ö¾u·¹Iá¿Ó(YyÒâX4&·"™±Ž¼µt4½Wcvµ¨°¾É>ÞÐÉö?jN•BÉÀ1)• i%Iik¹ì*¯\8s>ˆ©¯Ñs’WœT< xæQPž$‡¶ìŒF¹þ/BÔG-C’g.„„Ø DõjŠÿ¹2'.Iƒ“ÜZµßp¥2…—€ÇCì…j‰ËAΉ¾^PáäØPiŒ<ð†—”ML3³lô+ÍòžʲyÝ^qü¥î¯¢q+5ÿ¬{&ãw€¬Á˜bÞ·qokp馾^*ÎØ«-D%¢÷‘ýî#¶0ÉõÝé^šEäкn7ôj)‹¤ŸJ÷IMA²´ãÒFx_S¦¡‘ž˜ç9bœà•ÐgL›]Këü OàšÿŸÞVRn±™.Èh8“Èõš¸¤4]3°ƒn²\˾ëê&—µê^¨«<ƒ‚Ú wÞ×cŽa<Äþ-LÏ”J6‰Uï­½ÎÑub{™¸äQzôrN’sðcêÞÕ:¾?zæÃÑ*bÏz—•m8gñWÿqŸO†‘r핪åJâ­‰¯9\çϯ3ªÐP>‚ŠÖ9‘eáKR°P¡AJmèøØT¤µùŸ¢!’YwµQ¸Ý,|Mxê‡ú®œ'#[½MÄÀ7Á8Ì…—øjI«)ðu÷ö€¹ö³aª>ð”i{6 ¶AlÅM]]É*ÒöŽHyyÜ‚ïîe7˜Ø²±Î–+l@«¾šSÙÖZNJ¥PTc×`’¹cÎÚ_*xûv;Ê÷ 9S Ñhæ>š©‹*À¯äƒ.Ђ6}…(ÉW”úÑ[0çÞÃv7 ~e¿½tb¯M³òW†Ï&>cRCw¤¹QpþàΕotôBgzÏ©ûá¼%| ÿ É®¹‚ñ耉WÃFRÔ£"—wöÑÓAáeÀ;ölµëÖÄpЊñj¶l¨¥LÏðCi‚$ºˆ’¶³—ƒñ—¯Z¤êŒAY%¢Í•ØA‰¥x¿ãILdH÷U”—XËgSõåÂŒô·M$étÒŽùßìt`i Åy]wÖ.ªsѶ8€cmÉ¢I¶³¹âñµœC4&B½3ƒÓC³ HíËêóHŠäªgçÛ³Fèÿ?ZóXÀúy§!ŠOØEsæå®ØßšPbš¸ ¯}ŸOmo·ŠàXà˜°ê/åúŸ?†¥ˆ >Ô×pÈ­pi à[’  Íÿ÷Ê¿úþø4–æÁ„Q=©£pº ¾û-äï@<Дç½n$ìž&M:ZÔ«ˆ5Ç¡ ÁõQôj¸w:èµzš ÁãåÍ ‡à—^…å$F+Ù&٨絆w¼ª÷¿ ìXº–7ŠÜXâHª5Tå=BÈ®0q^¿Û_Yéã÷×· «pº ÛÙgX 7´•Õ î]ï4n„AwtÚ÷ÑèÇ~Q0Cš@ñRó´Ê·&ø¹Õ³‹L‹XóŽ]5½ÕK‘|ƒš4š8ˆWæ<¶Ð$\(1,y ŦG‘‡š¬±XmóÉGéªJn¬âMlvé¡w>A“-jHö¾l:¾­ƒ>̈ÂB.U´†W¿~”>õɹ­O¿Uú¤EÒ<–KƤ++[]lå£P_øäËzÉíÛVa¶ËË~Ô˜’ŠÒå^¹gþ ç–uÛÞ­* 7´5ÝæÄ]IÎ8¦ŠþuVæWóˆÀhã›@wœìdò {¥Ô_7ƒ¢0`¦3û|€W$Ô½lSþÅðâû2V Ç¥õ wã‡7ï¸×® C=O—ÍÔžM¦ë¶ú@b4[Ò¾.:øÉ|:-í—øÞq;Nj\‹…¯ïþ”¶,ü`œ$ ½FA“âäÄt¢îÞj¹pƺƒAì.wÓ} ê)I»y € Y«}GÞM@ˆTPd& Y*ÈKºŠû© 2PhÔYSW` 2µ“ôï´oG sI*]¸¸ ­JÀEåaάFµ}÷¬Ÿ\‹ï0RJîùÎ;ß‹]a=1ã"€yïA`]FŸd.8©â¨þV©xŠªá4vjÆh8Ž›A­¡Þ•ÁB'·-;žö¹cxU ü 6%Þm¿5‚•[½e‰%ÕÚŽÚ…Ë)ʈ°Å°;9¦Ø¯¹Ln8Éë –hY€üoýÇô°f’žGœrÐ nž>ô¡’V¨ÉSæ×:ÚnC™õâ™’€EÌ+wgÝŠÝ ±noõ¿å{Ü7¨ó(vvÊj‰ª5¯m*l¦Ã˜5uu&úM|óÙ®Í8X¥¡`g;2ÅaØÞU¯+I]Ø”FA2* Ñh^埲€dŸgDëPçŽrá6¼U#àà‚²Ìµ‡eËÖ¦W» ¬ˆ_Ì+ƪ` Kð<ÏCÙØïiÓñ“‘üî.î#ƒï/øãyþøTa ¯ƒ¨É')üIè±ò¼˜&–7òR AãâÑGò‰û©þ³B|V…»Z:³u%k© t FGw*¾$óŠƒo@óNpëÂw±¦Ÿ.š¢G¦îìÔE=%ûˆƒ[?²'G×ò6è›@a˜ÕÁ1³É—ø‚fú9)¹¼f•+L–ÄŠ£·‹d¥b™ç~Ró}ŒÞµð‹µ$X¶˜µk0è˪ÞjÉ~±ŠL»ÐZçwõ¶’î{&öÀÓ¥‚V:[¾qÏ6ë9ªHø‘5">çêµ®鈬ãXç Ç:bQQém¹p«¿½kä—T„0Ùn l%ÞÈZ´Ì;Åì€ä•Æ¤Ë .ÄJ¶'›m•'®Öô´½¼'i£É—ï»m0¨6wCY1…vKÇÃ>“¦=í<<”êi÷Í¥m8ø‡-ùOu0ùIÕðßdë|’â—Œ qÁ€IN·«^Áš’ã¥D»×1_GHAÏœ’I™é¯ ²{ žá­-3vsl—ßâ«÷ï|¶¿ºŽª-*½É™G Oä°Ôßtbötôô˜åÊÒ\fp—–39OÓ`†‚‡lšEf,”û|qô?äÔóeN8Þïš#Ín ÷CÉI–ùÝ|¦@C£«â8&†‚ß»¡_Œð ž®m45ÿ!MU53³SŠX`¬eÆ/åÞEôòõ1­ôø«~F˜Ñ‰¬¸SÞ!šÅ—õ-|2ùB¶ÛE‰yÁxðdÍÛ[ÿë/˜²B3šÊ t‹¾lÒ#fI´¨=d|œa„{=Ýí±L pÁ³/,¹¸DLì…ïT=”`윿fh¸€ýÑÈÝî·í¼æð7µˆCÔew }ËÜÉßã$ß÷+íJ!íºÖ]§*|0Ô?‹HÊÎ †;±#Ö×¥–1Ù/©FÞmFΟüŒ£‘OÞØŸOû¶T„žáž+Öò✥,m¸ë¯±”>TîÀ½¡¼á•©† Ç&B̲óR©e4ž+÷ÙÆ¸µÊ_9~ººþ*%3ýh†v™[}íL—e¦„ºl¯Á½6žòÒ‚àyvY†xiDXJcã}XAÏö­ï\Š¿,8Üc§ 9À§i3äÑíòþÞ>Þͳ’,‹Ø¥kèZˆ¥í橵Ñ@¶Š3"sß4TœÁxÓCóÍ÷鞸tËÝ©òfZï6Å.³'âuàŽµaÚ‘}ïŽÞDK\®uÅÿþ`)õØ+¶ÄUíü2Ç¡ñTN'7樠õÍE´ÔxGP;äÎ-¸˜NÈ ºÙŽVGl‘É©nåpf5ßÉ ýãÈ3A6ò)¸º]šaåˆ]~cü3'UÝnðlGâ„ëSœaŸ j;x„ÆKÕ³œ‹±4À^YÖœ™U¬èˆÿ„>ޝ¶ÎÒ!Ë |­QVÚZ8öú ÂèÄMr(ŸH̘:á]o{{ÿÇÕd\2<©l_U$¤{ƒ¡EõA])„¼ÁQ#}k`E¼ý– @DíµÒ†ßun°üéõeÕ …Áa<ó¼[…£Å¤_»‹kS?ž ¢Ö˜¦µÍAêÞ’ú†„2\ý›^‘¥„Ø÷ŠðŸóQ•¤ ÕųeíıQ]BIø7D,“´‹U·? ‘¹½Õq%ªàrú+4vmX‹?'¨uíÍ‘sÄVgê´7—æ€Ûì=8¿c£†|Ã>lÐŒ£+âZHÔ âj~»ŒûvÏ‚P*ÜŒuŒ–;²ê‡Ý¹’U´íQ†M.­u-Õ@Ð9zÌ t»Å< l|~‡*:øÈ—€ÅZÜûظó@R!ƒkÆ&uº“\—%LÞRU7å¼\Ô¯½³% Ïe E¤¹¢±…3p#Äû& ?ÅTe~äÞè‘4ÇŲÒ-S½©Wެ}ŽÒ[§Ä[ØYñ—O~Ë4»¡úÑK¾îKV†¢wÃC”P™FpåøŽÏÓ„{r¶“Þàí·lY …S€jnáVÍ»T¹¶ÔHÆ aEêûwubMw3zN¼5i/*7v@y¼Ï™€”Žå"YKæC@- —V(1]à¯AÇRþ-e‚²ÁðF%BÝ¢÷ñCÌߢe†@…:\˜¶Œg êîd^„‡Æm¤%´ÆÆêÙ¸â³EæÅ`5GQ¿+ç9:¼‰£'‡¨Ð8F¦OQ’Åõ¶&`6 zn#€†&&¬Y€CedóqŠDQ™.liE©½DU@Ú]r†ØÍê5ª%”쮡¢UQØa¬uàä$ ¡À”þ-ÍÔÚÛÏ ã"ñC¿É´Qâû¦¿ŠT9+(êu ö(Övcë¯þ©TãÔú»1ßÀ b}Ëׯv`¶Œ´ãù‡Öâ…{>ƒ¨q ^9Bz>wP¾¹è¹övþÛ2ày«¹† ŸÞ+Ú I ‘€ôJJg ¡—™Ë‚2F”« |ÎÈâã^ø™üþ|÷þ#³ñ•Pn0“dÙG½)bw#^•Æ/½Ž›«N²)k/Q4sXŸÑaØw]'ËÕ_Ïû¿žž­òþ4ùz8(ö}?Ò£P1øÿ~¥ cÂÿå¤Ó~M>è3Q>©ª©¿g­/lÂvÁØì>2öv½sP¹Ûp,Z¦‘•ß…«PÞ3àë>²d}ƒlwAôX:¦ÓỬD‘Ÿþn· üʇc;j*Wž§gÛij寇V†nùZCÚ <-z$gá⬠,‰?O¦á—KÊ^SÙä8U@$Ýa~íÔ%·ONg1ö&v2ìms»ÎäýlÿÂLÍ4BƒœŽ¬Êg£5¬ØE~q륨£š?!»-仡%=&ºöRp×ܾ;UžØ{Ó®d²³ÄúÜÀ×QÈtç.!G?.Ï)È ReLtcEÅ-HŽsœþx~°8Y§iUðí›ÈÍǶLlçLº’*Ь"ÄyJþ«²÷ÎÎ GmÝ`Ü^ƒ²ßŠ+¼£K÷?¶,4{ª£ßš×ÉöaVb戴•=õëú`€àîpû(:ãâ¢sjÇÄÁp4‚F3X|ÆõEâ«áÒZl²ÉÕóFn©j{°óÏ·/×쨰 ãFñá÷û£rƒ˜n`5§Öìi„CA¥ôýäY¬éþDŽX>øE’dH>¶Æu&Iå…€-ŸRlü²+òI´š“‹é®Ÿó¼)AßYQ¯‘Ùߺ8Ý'ÿ‡L£ŽUjK~ÓòÉ/0¹o¶èX Úžl(ÿÏÃVjƒÜÙ‡rÀ—ùÿ2à%Ì~ðVKœzøÇ²¬Ëâ[= =àÅžRk^UÁPÿ]+O÷¿Ê]¹KÇÝ6ímS²C€ :ç£.èûæarR׬ ;·°F &¬¿So ˜›-N#³gÁ†þMº Ì^/˜@òˆLj#fìN'RŽèkÊH\2O„íA3䎎 ã×™×gÎDSÿÓ(Ÿ“Íœð;™ƒ6vg¡VØþ#p¥0œO‡ b,eº2$¶Çöq11[eçFRôDaÓÉå‹€gË{ü¶iã6PlqVáÁºj»â{ùγG¹oWίfÅzÒQÈ:Ï’4 úöùÃ;6²6ÈŽÃsyÛgÜåJM|‡ð3Cró¢®›ÉÛ oHKØ„I¸ä óö1Õ™aüOgF$Ó]š”G#Ä%øMÈf]µ1¶§pѺu¦DÞÕ{â"Ût#˼á2 šÛÄYë7°šd¨R«v=q|CQV’ì|ÍÈÊ=ãWùñ9g÷ˆX*å÷óù"žÂ6€ –(èTA ‹_î¢PbÁ³ˆ^ƒ” Wæñ²ðÚþÅAü +V‡È Sq³§IAYÑd¼Ÿ8I+¼É} é©s‡ÕEtYmÆWîæ’8s«$Sç<þºÎ»Ä4K#PçAa–óT¬9½Æž&(O3`ë‹kò'^öX±pè1Ç+¬!ÀÆÍ2°00ÙF5$ëRAHÀÍÞs~4_HÅÀ’òñÈSfú¯¨˜Kx ÅL«q´i>¬¢…½3åŸÕ"³ÿë„Ku ¯ÏΛhÙÛ°Íñ•¤ú¬}”L±i™ºÚîúvðÖÄR?¯óåþÜÖ!CíeR:¨=“Õÿ¡ß†¸A%%Ÿúô{ê”ÈÖÄrw†”R#Ç9¹%Oœ<Ñ$üé4å bP“ˆŽ@/¢h1Ḧš«É¬Ñ3¹^ „œð‹¤Ì–Î +§^Aúì&&­ŸHÕ|µs/‘ú•.Bq̱b*r¾Å'ÚøïL¢uR,q€]0úò@N(×ãä÷CçÊyC á+”Jf„s¤(¥Ú«ÉÛšhã>UZºdÄÇõÿ àJï  Û¨œ³¥±×·?aqƒ+ª‹SÊÛÕbúaéJâ©Þúúµ¤Ìxgã%OËŠúº «Í½¨ºðjЮ¯[€cš1¡çYÕÍ3÷ÿõ4ˆÈ<Ö ºÞÄ#§4Ym8aò úô´û$ee)ûfÀ.ù½ø ͇R´Ðeð'µ¥õ†H¬²W“gÖ'•ð‘têzß!Í2uTåµ´ €â$ºŸÅÌG"ùo è…“E¾ëj&j93•é„v„¸˜”Ó¿;-ÓÚ¢‘1 õâ3f£À ®h²¬ýތ͜ŒmV¯êµ sù›`홈Cm§S7©mœšôLhÔ’fƒ€BºØ õ9óSYê™vª2—3é_×Å®¢.o3¸?9Í¿‘ë¾êTý¯ $­“~RðŸŠ'z‹/ï‚ ì ¨ä@6¡ß"DL9ÿ}_u]BÀÝxd]ûÉû~ì¢(š¾™XðñlÁ½nþˆ¼ <×ÄûVÎÍ ¼H ·!¯¬œ«e86œÅ›/Y·b­´¾–רÿ§ÏYΘ«>Oó‚à«}”µö(¾$W­·R¡](†%…Í¢ðô©óHVp¿È#iÏŽ#­,žW=À ¾»n*Iß·ñ2À…ŽbKÿÑ+oä!_ʲ'OÃ4x©ÿd€znsºÖáhP‡é~ưÚ×G·Eª3M¢eʰt ˆYþLn™È•ÞÀå(#DªýŠ?^à æç⢠”bK­ÁÊZϳ9¯º¦ÎIx-QpŠ=–î¢sR‰&{‹'[K}áÌ<¯TxÙ>t F’Aeö^ÔÜÓr÷Pý¿íÎŒÆró#gƒçàãßòÏåß—Ç~›“#¶ œ í=“ÝeJå·ÓMê§æ&2¾r¿æÙQ"ç{\ª5]¶¤i¸ Æê¥²ºms&Õu#jf )DPÄrT××µömãøœ{¯Gî(<\Z×ݪcÕ˜¿zŽÆË,1àt2ËBôQ å£p÷…ÏÔhC¦H)uYuJY"Át̉°NÄÖ­­Á½MÚ–,‘;Z(-è/Ý»Dìôí‚“\ÒïŸ6ù`‹ ])"|´pÆã¢÷Û&a1/†lÓÚX~82̨\tÕ¥['·Ž/‹¥ ø<Ë—öšGaã´ßÁQèI»Ì«Á`Š(í´žƒYëõˆÍ}ý¡T›8ôÄú¸;\CòÕÕçdÜm¿)‚¨jI‚ů"¼2Ž­‡”5²ø4zGÅ=®7Qªž¿;ò+©6£àôž_B*>&¼â¿DÜÏìÉXÆö¡“XÍ'El' ƒ#nibÿîî/|åJº¾¬_O6vßÛò“ ­§¹¯öjk,9ÏÁ̽8)}£öJäRUê.T"jB/Ûh½LÒýö•ÿá ´§Ü'ÂN_(#‹ ¤%“Û¦æÂä8[¸b Hk8Ô©¬Ì4ÿËgGpÂ#µAl’ÇÙ¼RÚ¾ø¤>p‹šYG¦G§/¤6‰®Émä–†ÙjNe´h4êChp‚`¸'¾ò‰@áÂ5ÿå‚D¿DþES†´ ÜHNùD} ]G‹éñJ¢N‰IF·Î¼S³IyæÌäßê6 Ÿ6½gõ04žXS¦ß´QÈF‹ŒyŸãcWë8>û©Qñö‰Šëì~P$M RÌ#§àyyˆk„¨æßtËl;9¸Ã&ÎauÁálq»åp§A¯ÎHîñv MŠ×h”ÏPk+B¡þ¼ ÓšMáÊ®L8Ô-¸£µN1Å”âdÿíŒ -éŠCɯÏÏ$T´Ì$¯¯2·¨06hšÎµ0”g¸zʃrq¿ÍÁ&~7½|I"}HóÉ02ë1ׂ¯z˜skEm+Ó£¯]óTB5(…&ÜQ’KfN«ð¹±Á9 c‡]Ýá:*òÇÙ0Übýx|ú­ÃŽL¯Ž —ðjÆ‚ {@%fã¸Xáñ`zÌ4NAÅêj'ð%ôBöŒo_‹â©Þú#tÜd¶L¥Ð?¹f~~‹M:]Ì^¦Glt(7¼A"ްÒçÚIØTÕ2•ëDuí€/§‡½0Èu„ÿÍ&"¿:µíêÞõ@€_•Ñgã$ê’Ô}Ây¾^®²ÏæEM¿qUï´Û€Œ‡å’^Û‚g:T0lø‚|Ó¯—cIÛ x¼¢îþÜbjEÆZõÝuZ± š¤"H±h’ÑövÍ3’XÅaƒ “ÿ ÕO W‘JS¼ž’òƒcûL¢Û%†ˆËS!5WÜŸVš;ÃG(µ:¿h[¾inVõþ]mê(ÊÙï¼"÷®îËK›¾gFN_Û?ÀÉi%Ô RaøâRN@((~K¨WMÅÂU|í?ϱ/à-h+ŠÈioêÿq*ô¾ VçÀòÐ>çÈÁ•vr;¶Å|KÌù  y§"˜?^å´“AiLïÑAœH„B¦ÖH…̯{›á¤( '6æñþÆ=g~OZˆˆÖôu÷éî€ÈÔ¢%²$kg¢JEEQJ²‡&§\šÊ©ŠYà»c9\Œa‰&Œ©{6²¦@E¯:ž«Ð p å_‹)C'»'B툯áÊ Ö„Ï!î™ †»fêtVÜ•ìn„)LÞØ#UîÛ²ãÄJü±y`´¸ñÛˆåW.Eé»éEZÞ² Ø½Û¥ù¡)´,б®øú£¬xÈæuJ.°¸Õ--ìàEšºEzçp}‘ü†{š½ÄZÌ._ZöP;|¾AwŒš‹ÙÝ]%ŸYœŠ‘xµÖP©Q°ì^ñÆOcæ¿`0X) KG,à¨ÂèÔ¸pZWñW"å›ë‚ñvó5g°8é3Í7òêÑËØ°ô¡×gÝ&Ô÷ªÒÞlÇ@D‡¡±/ŠA„ÆÇIP‹1WÃ%F&ì„)„qÛ“Ì5}½…Ó³\)'çãšË^NYóV˜xÝ/•XÍà$t”/xÏÝ"ITSÚ¿"w¬Öz é÷é®Üíj@üÀ%O§Á 7f„’eŸ¸Þ½©Þâƒäpí®òVŸ“627ô¾Ʀ©"ŒO 2d'.•Å'-té²ìà÷Bf«aóL±1“Ï(Né:œÉj§|0Œ¸L¯¾ ÏIÂ[­ÚúbiBBó·7©žyE/½¹'4M-]caš€Î·l™"t:XËÚ½ŠÎvê]Ù—K®[ðm’ú˸Îq¬+ܱ/:&jw„k –rˆXHhÇåæj3&ÏÎ;ãÁ$…cqž›É¤GçÛ ãüÔxTQA¹5Ë¢NÎý.N-mq‹õ¯Á¿Fmß=w8žî"&D— 97LtˆÈh*?P²»ëÊk 7ëÞ—¨™~âë(?{µ£ßCëÖ GÙÌUs¿k»ÊÛ²ñ4u«~V5u= “s²ƒ'Øb¢#X÷[³‚=ñw£vÿG²j̀ݳ­9ToªºGáµi"ðéŸ/¬þnÅwb—>7÷ Êã¤R8DÖpB*}‹zaÕ]?BrYfÉotj‡ô1•Ù½íu'ÐÕŠ1Æß£xsCnÀi»He·‰9S䟩˜¨ß÷Bk1uLHxd”æ–9EÒÝ—rì¹»³¥¿m¤gFá%m–ÞXäÄA#B†p÷pÛØ€*–¹½ÉòÊ,3Š m(”g«il0p•׃' îÁÔ>'-—Þî®4ƒbö&•E>ƒµ\«R„fz$šã¯‚Ý”eû¯ÅÍ7±ÙÃÁàLP¥Á°Ä…õxß÷²ZDÆë«*c êâ9ä‹ÐáŠ!œ`_ ­1¿øTÄýZïþØÒY ¥ê†å‹µ¬þÿÝhè×Aƒ·ÄÃp*d iРDÐ%%o$.ÜTi -Ò[m~.Òà£%":?v’Š‚žê‡áœ‡È¼2¡³ݬY›I²'k"ní‡óPiÓw°%†ÏH¹©L+LÌAéõ0w„x'L&ÔG§ƒõ£Ã­‘õ{ Õn)  ¦é¿†´°PmW%?yC¡úïí ú§FNã–ÝÕ/6ž¤ŠàÅ£©O‹x,]^¾ãù°f9&) ƒm(:(«y»µeÔ"0`.n_©»Ne딑I‘ã|Õ€ò•?`cöâlmfÿÝð::ˆ—ÈóSd‰·ŠCJ"Ó•Q¼!3U•.új|¸ÂÐ=§„lN¯¥<ÝÇåñMè—È]”¡!P‡âÐÓòaˆÞÆ–g¡*e7€&A ÷²q?l´jöp¬hŸš/HZ‚öÛ} †B4céžJÃÔêÝf×&J­•]Ñ?}¾#`nïCt–ïŽ6B÷˜Ð‰ŽvJmòâà@Lš›àQ¨K^²qÓ=“ÙÓÉQuáï*qŒ—TËÿ#eL´i§|Y"kÐ~¯IƒbàÓŽ;‹SBnÑB¾Ÿ³%^ªÁܬ§àAaÛBàD‰<¡\F“&î­^Û1nÖW(¿0‡<Á¸±n,p0Nª'@G¼Z8Nþž±ÏJ5¾ä Õwÿm1Z±ômCsÚåš'–t\pÀ˜.ã“Y£ )EpåGþ÷ÙW¬ 3TGAýä&RÅ©Éüô}-†Ù¸É¨Oúå”™ú×ÍpÞçû·ã»¿û“½úoTD‡WÁOËÍr™ôv»ÊÒÅË@ãX=½ƒ_¯!Ò:uBæ{ö’~!c¬–ùžtêØ–{°\H-Á;0Pžº‡ÑêM¤¦pÏŸ¡¨5EŽòÓþ÷Yœôi+žßìóèoÈœ4‘a´¢·D{øûpÏŽ{%u=Ña×3ø%~ñ2“!÷0ôj™_bZ”dÔOÞdæÝÉ °øeF±þå[ÃPÔIÜzáët'{¸ÔÓ‹ìäÅKNt@mÐò‚ÅS"Ï B̓ƒð˜Žð(…_õµÄ`ϘÇ2Ь³%G]|å#ÅjÆ=Ì/± IÍ4Íp2†]¡c›j ëÖG€çÄâù)'{ŠÏ'Mì< XÁä“c‹y½“I‡[K'9ç€,“)U‘3pš€ë¤LA42^Þê¾tWû™ÄÎÀDþhŽáŽ÷[NÏAMò,ªnØù³ÖòC‹@.i-ü§²y«gl›SìN* @«4½GÝ0¿#Z6@Òë{_J°ñ8rö]â«MÞR(¹5ߎÐv â¼?ê4<Í‹}R™7g¶w7…j/¤U‘4+ØÛQ¥€Ìy~¢' °¬!Î+•ý㎩|E8ß§9E炵“=cžã$BÜû?¾^Þ õ‚ç ^Ò J|BFÛ^ôÒv×-W‚Ãk1¯rºR~]pÊ1è¯12w…ßâº>Go€>sN&j=çÙ:÷󩇦Ñßäõ'œî; Ŧ3ó3`’ÆNÓú¥÷š,§ç³T.½é«>zž¤ÿ?`gbÄ©mÕOÕ s£4ˆ'0|ç~è1sü"‹øø 2–¦•Ô’Õt–M"Q€dà BÇñ¬„–»~‚pn¾÷ B•÷H•~ú˜-N¬ì?j= -ˆ³5L%a/oÜ» âBÇ®çÏ ÉÊEÇìÒÛþõ¯' ÍpE>œ}è–Rž”¾^Áx³iZgËÏȪ7GÊÌ:›#žÌYNæŸ<,Ð7”Ê{Toõ\ ࡎÓSL)f,¹—í% /£@|Cd'zÑÙ7Dõ°´ˆL™Y_XR*Âo"_;Gr‰Ï*—<ÐûÜšÕÇI}<¹:Þ‡'²Tç%û”7™B#ìÚú80€~ 5áë3.òÕGg^hTlA¨úª° ðòM*Ê?ó-?214¬P 8#šÆñ…„µ’„ ›M6È퉅ø9HpÑeà}IÙ)6¬k«§x–Ø@öCœv•Ÿã‹l,ØáäLJ†)Å5g<ôSPšAµî¬Dn.Àu#l‘˜gÉÛmãrÄ 9pAî1¥¿ic†O åqf  ŸL-¿Œ_‡ŸnJzS&Ãüåsq’© ¡\”eÞ{â8fœ#]ª´sËÐÿW[3ç;4Ùt]èî>idiš.H\Ø´ǘa³lÁ™È× v﾿d1Œào“h=L<å{FhDŽËZrN-‹Qˆu1!ïm¨òáÓih’NzØQ33ëÊ“åAY´lôû!دûÆb/åùm±KVœ[}‹× &„7Þ耶œnÓ‘Fß 0Ž1J(¶É]‰»à1^tàn§Ù.{1ƒW[E‚wýÈñ¡š‚ó,*ŽCQœès-¦‘•Ü–]¦X^JG°èô ‰`7å+Mß@Cžzñíx㢤OŽß¸9l`!8€bZ¬É)IìÁÿqŠö=°0ÛÀî Û.)+ÑXH[|ÌÆÔÚFa¼œ†yj1´Ê"dîuÞ+AíÕe‰-Ú¬ùuQr)Ed2±dÅù ñEI,h¸Ôlëys$FùÚu*•tªS…üj¾+v>4ÂÚZâwñÄÓÊŽ£ž¿¬´/¿Ø„Äð²øó›Á‹¥J>̶zh‡Û½Ââjô?Š4á‘pf†ŠßýõFïéùÂämÚrM¼Š£¡­2hcßÊà¡c¬4n¿1‹¥¸é§•W»½¯+p9ʉìv'-‹†zb„šÍ79S¸Ã0›’·± ®7x+¤’[…³Yºï&{j›kp²"½–úÃä[dÛQ!•$Í©¼ Õy|%”MѬ q€Z§!~cî¨Âs$=¡´ÇkA†Uì²ãoßä@!«xSâTî`'¸Bt£ÍM/-§r¤&aM±.gŒ™­•Ó%„9©ù•G/sÐÓËN¾ÛxGp*·üƒŠS<’¨<Â䛿Ï=‡¶Óodt£%Ä­vKžK¦¼¶Š)¥Á|“5ªƒ¦'?t±¯Â©î#-äÙâ!?ØH+6H—7\(± 7 exOÄó‡|l‹2Þêä./lh@Ó2œË¬FÉN•ýƹsUÖ(“Ϭ5$Nõ¼¨» ÕW¤~‹K²çæ%ÂÂî ùÕTvÃë*•³Þo)iüc®¶†ÖÐ7ëÚÁÐt–¶‡Ì‘Õ,†Šë-졧蓽†ÜmC(ǽDsAbêÈ£µ‰t$ÄᯗՄ&µþ‹šaï8«ª<41>Õ)P驈ÜÈ]ÐèÞôOmN…ê R¶í~§8â÷l—æú0Ómú#%WïâéLŽ&Æúˆ'áh`Ø®Ö;*CºhJÚ*L•²mëˆ#‰1.W¤qS,8‘4Œ‹[‚íÏË¡¤bXΰ¨õ¾šEáÍRRÿC[^Dp¢¢tH¤´5|ˆ•vGUh›18kÕDµ#Þ~q<ðR*¯‰ŸñçÙ´3]Ù÷TÍ„ÖZü7¬Âh~ÿÜa9 IXN#zpJ^§¯mÌý5‰•á÷úÆ€QœóÂ&#%‚HqRæÑmzœGý·Ç‚P¹¸—G”ÕFPæ­ ÷ B¡¦Ù&Û°2z÷ŒU™ ¡gZ˜”í]$‡Ô«d|»Kc´N2¡lV aÒXKPݵyhŸ4VäRO—O‹W¹„׫"¬þ_©JH‹£GÉ©ªŽvî9ɬÀÙ­ö 1?^ï¥K@Õ·+N)ÄÙÙòV$+±e_ñŠå C™–ÂT¿?ÙhÎç›±é*Éè3©{Ë[©*À®µæòUÿçÞª)Ý=° “ÀìÙ)T÷]çœp2°v0¤k ™L‹eH¤³©ÑÆX¤1Tö’jÚFÅ.ÜI,ýHéì´’<7½L=Öêz˜ß:e?O$ñI›/ÊT†`Aäí|²»Ý¦P7(Àõ[ÇÎꌬZ£cÓVü^'ÂJ‚„œŸ»ÚYO‰|Ð*ìÀWé„+z=uÕŽ]%Êaâ8i㺿J ¦ ÆÓü¥Zò¯›Ì¶çZœ÷,$út²®_«qåá9ŠJj°¸¤Œ¶ÞçtÚ“I·î¦’*b„ezÀ ‰ú•†QÅ´‘¼ƒº¾éñë·¶$eÐV¸%zŒ5‰QOîeR©3–]7à…½ï-xÞ*~G+Š¥(zh3ˆS§ÖMvøwªÓãR2ÇÎs€we3j¦F´£¬Ž Ý)ö8ã«9x.ÇBa“¨ûYt~k6ÎðQÖ1€í”Pæ¬X‡ƒµ;ÓÝ^E…–¬Ž™@ °¼îØÝboñù­;#â}¹÷º²²š§¦›<1 £M‡LÒTá6c!ŸCtÂLÊÄçr¡ÄþoFÌ[ñTí ±7ÐÌãÚÊý }xaä@:ê¬ñ‰]‡¾äÅiwºRÕÕm£^Ül–ÉØA=³$UÓß÷¥P•ãͧŸð„ÉY)µß [5¾$Ê0¬HdjJQÁ¤8þ~  bð‡îXRæUº–½@mhx”€_Ä4N^\E°|xùîÐ íhY/®¬Ì6CFClÍǯa äó¥AþÉý wß*ܜׄ‰pU\ãl¿y¢°¼¬‚Å|ÒòÓ’Ëßµ‡g>v)ðfs( í\Ö(ü¶NŒ1"4 &M’fü±\_.1r£‹íªÛQµå¡‡[MCß2žCñÕ¥Pk [uUS:rmÈa{H‡ím]?£m‘(ØÄ:›ß¡t©Bf‡ýœÕ LB0úDÿ¹lÏÞ»ïñ"LUsÝB雃Dw!‘¨•ƒ¥gw¡D]LnÆÀËíËTþãD ßo[èz@©sM‰ß§H6Û%hP¤ˆoåïZ«þuâÔ"Êžg)ëÀT\øtUцÛíKósP'Báfë%CŸ -"e®Õi¨ßËÈÒÊÁBV±{E¢õ€g €PÙWª?_ºÔ Ë‘ E…C+²Î™¥ÒËútÎê»2¿‚Åàt$á{|'Ø‹c+•Vb`ù¾,ÑÞòF²E¾Ó`£¯½­¶Ù¨+ɾ¶÷kÑ’ªw뎲3O)ÜJBÇnóç¯Ð¶€ Mä«^¡¨Ül$¦¦`)ŸU^]~μ{°£Ö*Á)Ñéžào4,õ ¤U*0H¯‹,Tß‹\Î÷ÈÔÑñøn× †Þ†ôà@þÉ^œqeЧÕ8‡¿w¯ nîÒd>QºðÕPV]éi/jäÛ¨òÒ$™&Òô>ÒóYä³<fÈú÷NO•pŽ«rÅtzʯx°(>»ðIíë¤ ÷ºrƒNˆÜoRôܬ·á—0…µÂÚÝ«š’­"œ-wQê×8QÐRˆ „ hò Føä›“øfŸÀZð"lØTBñ”% æ@ÈyôoÂS1Ô»K…eºí‚x!ÀÕk·ßA­¾kqÅA:жÐU[g>» È@~&]Ñ&ŸIù­e÷ø ‰Àš,—³[ÛÁíJ»xs]„™¶YEѵÿX¼Ò óWÒ‘&”.…z‹Eä§7‡¨0ø²GIEèD~W™Ö«ÁŸ\ˆÓ þÛ¸ì^¼ЭÒãøŒtGdój1ÒuÐðé$QÙR¥Ý¼;Í5ªÞ€<~8”paM˜‡*Š®ê-FIžÈYŸÎ>)éÙCàóJˆSögsÇûµK+XêhõÙÚ9QYüTŒ¼¢—ɶÕ‰{ q|({ÃQÑ&°L_dX’ìQ¯°í;=NWŸt5-ÔÏrÉÈËd£Àm\¿½4ý½’ Þ¢oL‡+QŽ ê¥ÄkÚŸÕ­Ñ À’ú×–«9.4N9ñ:……ºeøgi€«,yèÍP¡ý;O›Ëû—Ф}€åÝqÉzbüÒ‚Bc>vÜhckH1o¤ÅKn?å­[ŽO‘`Iæ„_o4´Ž¶’h~Ç1!Ó–šöÊáttM´ß‚³éÓÕL–Jgõ¡óüœr™þ<Ì_°±µŠf¹tÝbÏzÕÝeŠ Ó„ð''è=Pu}à܇Žt@q¦}l',1YŒnßÄw”Ñ`ðò¥<Øg?ó³Ú>tåˆXmâXs»ZáîJÚÆ¥„b=ßÏéô69â<4¼ê†P¶÷ÕÄõ$ªJ€¶6UÌ]CÉÖ2¾xÝaž!gM0ù~?^Nöb 9r[ÉŠk~˜'SÄ@´žU çE© ØîÚ]+å'¸ýÀ÷"“dN&Ô°’ÛÉÔìʶ®æ9MjH;áõ/ðwy€L¤œsøAÁÐf1,¾±&®ü%R±­QÜID¤¤Þøiþ(ø[yÀsGm.Ϫ}?\z”!u<ʼ0½éî*ûmç Ù¾ÃÒ0 HïhxÑͯ¼ 6€ jùô§(פ±‡œå½¹‘äíÈꬦ¢œ¼•Ô=7=Œ¼_Í£acƒÕvðÒYqˆ3íM»GÍE¹™ è0¤pžÚM§í½j/Ä=3ñïs>:#õˆa©­²ª{56ÃBî›ôFƒåa”nñòÔQ‡HN¢γÃhð˜Y°b“Ë[(˜i@¶Ô´tÐàCø,¡‰HIÖ€ð‡eC)½³IH¤0¯Ðt³{¶«¥ŒðA™êÉ!gÐhôèÈd—¦cyÈ5$¸0±Ó™kwÜì0_Ì'cR$æa5»ðsæÁ Ç–Ep yÔ‘|™Xq/?¦ýQçzÐO·—\€-×úÑ™á8 (~ĵU­IûAïìˆÎ$GAâÛ=+£õMß7L ÌÓ˜w±?$rà!˜Â‘¨aÇÔ.nß"3O ]U*Ý肈 ·&š è.¯æê?žv¨‰>Ž ñc,™Kª7‚Wo˜]š ¹áýãöNŽ­É ö—’±¡M5ÓìjK¯—_l<Õ¶‰ ¾˜âO^]Ôð4ÿÜv˜Y$`eH;Õ¸ 3ˆe Îå7¾Ãé ¾†ï®•ðF}¬ÒétGó£æÔ4jàI¿DèË uåÏ"=²–ˆ6vúœu :WåËy½§–£{ÉXOJ#cî÷5@”Í€ÃÝœò‡2ŶjDáÄl?É aG.[Ý%(mM‹Ë{\S+J3¤à­E>ϰ¾Šµ/œœù©;#ݬéøIÿ•𛻟a~*aæ;È*v<ƒ}C¤#T¬Øå9Vÿþ°/7¥ 盺è,tÚx\Sû}Üî§ü)Œ- ¬ýè@:há|+HádM90ÆÌ‚(iî÷¼³Ú ¡Ñà¾K(›µz*¶ÀêËR-Àzô®Küãä¾{>5´ßÛuG2¥ðÚ„ÂÂÔͰԚHUmdX?<;íIKZYD¾ã“3ï5“ÑFM¡ HâmZT¹5 ¼º¾ Œ—°Èå7eLŽnÐˬþ¶cØQRµ¢‚’÷žËHä8"MõD—N !ŠÎ$ã¡öD<¶æ“£Zp„ÖóáÐO<—¦g†jòÿÝ ½Rá-FóöNJÇŽfÆøýt+ÑÌI®Ôa¼N6‡8ìOÄ–P©R÷‚Þ1C2Ãa¢F+x³UM¬SMµÝ¦cQêÜÐxÅçó«Hí*É>Eám;GB¼0â²¶Àì·F,ký®"æ íìÞ^oLi> )žòq‰ÏQê£cøOd0yBóIêÓ7Qà{H»ej¥déSÕL>Óeïnä‹m§¬D)²›OÛì`³2¼o$lújÿó_yt4ìjA ;+ö…í߾­¨MùÆ›|«Ö>U®ž¦¿\‘˜Þ 5%ǵEî“ÈÇ£ýoâÆÃ©Ž[÷…»¯ÁnX(•‚té·+ß’ý°Ø&³¥ßµ‡òfâ–âØÖßÿz-^fýÇÿ}]·‘ ݈Ŗ`Œ®¥³k¯ž R=EäOwÍÜFè×/w:o0 b-ßp“å¹Ýºý¡‰ƒI•Ñ´Õqá·(9DZP-ç³=/ÙÎ  ÐÇ ñ® ðbõî¸ý²•²(æ*ž¿dx6?éÛƒu‘ƒ+SÑ“ÑkÛ}© '9Py§±åÔî f×°³ Ì+™ì ªe^ѹ4P#ÜpA¾öߨ`,X/úŸ’/G§F¿ã=¹Ï©Ê#ñˆHNÌ~\-Êù×RïM¬Ô£Œ†±Þ9ÒÕs3"Ïz:Ø’ ˜íH¹Uv–²Þ_Ïï+ ñ;`Èâ¡Ö(«òX^ÇëWô£ˆ¦•gÿw5Ò§+><ëi?ž ÆÒz"=Ιe™¹èa•´3Ëÿ…ô5#ÅØŽJ#ç^¦ŽWÊ.8„þ<ýáºä¬=Ã}i¬Ðäbžï½J‚“à]²Mþö¯DɼNDõ?»ŒŒÓ2¸†ããω&làßÓD–´Ä”©GáÞoÏõ:å ëÖ!ÍX§c•¹Š=S#iMÅ ¡Oº2‹Ã=GYgue³ô~*ô÷©I¾‡û-¬FªI6ª3ã2ßê白Ž.Ó¨ÛjC&£›ù €þºèSIbYÏ!ŸSG~5u~öàΈgU{\H’Äã=â7^{7W!ä¼S·<² f—„gKB0› w+KêÜ?~nmÀ„tACéçÙ!r՞ŋíMý7P-’ê³þÊÑCetدCx\âgzvV摬5ÌÚ¸–˜ºý}»•¨fíºBMÙ Fô¸ðD25úF""P’áŸo"=*…&cýÖ+›†ñ½6ciAE†ãé=ŸÜ/^Äï( #Ü«L­ô¬¡ž(a4þ¶«,ÞÐ|SAnß²K$ª ïy‡Úó&fõØõD÷~»©«çêç­|l–-S?LñÙj§¸±=9 àkdhöWt¬¸œÀo0_Òj‚~RD4$Þ˘‹Q¬å03¢(öàÔ=(øoœ„÷?B4{¶t<õí'&(;&#½ª 'ûý¿+99QÖIF…ZUw¹ šf<Ñу—Ì.{ òç˜,'ÑžYô¸Þ–™úW 1”4-*ºÔL_ ¦#±”ª²Wž9§}QÕóóÐ/Éɦ°z=¬ »ñùm\…Y1ã·­ö³n£,ÎáøŽüÁgô˜µ³Â|ݲ´xú±7M[~ ¡,”¶Ÿ»‹ÐG`Ý4Þäý(þI–²z†•©ìëtÓ0@¡y÷ÁO߇*$è–§G Î`MÝ‹³8µ¦;Ô(ð E?ÿlÅî›vߪú¯:I“ØÒ)7/§I…µ×¢(Hü41ìÎMè@Á÷…|ó`™YB‚J %̶GJ5?‰‚ƒš¾·)û- »Â-#*|ßFW¤±º‘›º¨Ó¾ûx7ØH]ç XVÉNΨ„¦¥kœ8`­¬¨A¨ó,_ÃWRµqL‰çê~ç´ñœ9TZÌÝo%IqlŸ«óÙq…ÙÚs8‹Ï¾bȥṥéžõ$¨ょЄÿ˜N~2°/„pó‹x~ yhÂëAç"š”qh‡‡ ì_hk±•ãbG°.% ¹ðÖÞ$Šcý-Y´CµÌÔ«Y•ç´æʈñ4Ô°ÊM¸†Ã¦¬yÙ.ï~L"Ö*y ?”Ã=U@ÖRÈ7€Ê!Ÿ—ßÃ1œºòiV M¢4w¨ØrÚÃC"r½Ð €ƒ9À`È®B®‘^ícÚ¿Êݽ@¨:éæÈ Ï™üž# {Þœ]Wè`€~3O¼T±V0ø§FÜñXÀŸs a€ºhÓý´m³_Ü龇Ö575¿‰D^6¤ÒÀÝXN¡ËÅÔÚª’Ã*Ó§Í- T¶úºW£ ´›¢ÅtpÔ RÏÜÒŽ`“µ9, v€^ª¤ç_M)®^s1æ9«N7_FïÖHáG’‰(K5ÁH¿Üð¼Ò¿Ž²°Ž:ªt ѧ÷ 4ÊL. à§Õ?¹j99½ß³M%Vc"y!äDŽà)Ö°VHéZR½ÏjCÒfˆÆä¥$’ ½æÂ¾a¤“’âë;µbÓ­ ,~A¬!Šÿ»Œy|*ÕìX¯›â®j‹ÓÛö­+ýã[c6kIˆ^Är)JûXvyä‹Yàjк‹)á3+|Å^R ŽÔË­Ûw[iËlWWÅùœÔZOf°©KÁ ŽßŒÕý"O¨Ü‹ì1¼ ªÄÿxŽf²7sû=¡ÐG7àÎ ‰‹áX8Nß=ôA/??Ûwj;”qþ*ÑÜŠ‡=Ø qeçò£×Idž DzF™?Š í’Iš4&üU©‡Ž¸;ÓÒ¦¯ú¨&™:â.ÿLg“êl¾Mµì€ ””k5¢!Z!ª”‹q‚Ý?&Áí‘ô}Ф$TF‘~ºëVø–¾9j‹ŽÛÆ·A¢[ïÛ:FjÙÍ ¼ x D©%Ì»6`,ŠB]™Tvô[ÎŒ ãA@·,;¼ÛØŒ_š,ŸTÝñÙh¤øp\qÖ£­ZpIrù0I‡ì;[u—Ì¢å¢ulWu\·û¯A%0e“ÀÅgù}ššºü|z·†w.„Wn3ºzÐÔÕóÈÈ®‡JÃÀ ¡ ±°ýr ‰bG„×$³wÜÐë*ÄT»໺DçàË ¿Ùƨ•4û’UJ+Ö©©¶7®~8Yüð”ÌÁÍô—’½bÜóÛ¬7«øÄä~Ÿ d'[¶®ãÿGâøû×4¼GiÝÎfgz4¿¢^£ä»˜ÍÇ„—(ìÛHÆ ßøîŠé·ú¾¶÷_¡)Ï,½Âb½ÇÎl<ʃ]=6 Ëd>¾Q¶:¤\è $AXûÈ@ЖÔÀºá5ÚÚË1Û~±õ»%ŒæPÇÐ>`:ÐįÇϊ¿…vEBk+ 5:Å ç܇Ŏvìx/Öµ¨ÃÏÚ£zUEwNÿ‡’È2¸ª£%äÀjãêú1zÐRnÕnω #±¨ÏÖSÈ«çÃnĆê“ôºÔ!U©1ûA‡¼§¼½‹3¾Ò¶¾<Óù—Öy+É»RûŠ9nWŽnpìL¬ Z´éãQL)†½Ö0K Üeˆp :s¿©ÓK„=MÆ6áq&|ìFa·¾á?<¦¥æç5]¾ã¶S–êrý‡iWñzK€Gr‚ŽðÜ‹.JÅͬT-M!üSùÊZÚ,eÂôÕ‚ç¤ ¶Bn(d ¡ñ…Æ0Ûî'Ú.ÚÖVÏ 6vü<¬-§t_u`,ÑüóéRä‘ÂÁz˜®ë…w†·µ~÷<œÐâ¯å²ÛÆÚ퓳ª¨w&a­7pØÎ("ÓŒ­(æ4Ô(òèõ™?©Óɨ+ç‘ K3ðP–î×Ï„àü'P ƒaåÛï’Nձ鉹A´Ùße×Áù«ø®} Wœx*ë’ˆFH\åJÜ¿.ŽòKí¨bÄE>²9HåUýyg;­¢Û2ó Ͱ/g÷MTÙ9â0®^å:€ÛÞÂ-_. ä¬*s|j~té2š¼šv§ °÷U”Zäm<ùéfuŽí²”É/ñÖW‡bù {“ÑÕòëÉaÑ ìH S‰·l%Az‚ê¯;Ã=r…žéQ‰dÓ´Y€i˪ƒb†)§$ñQHŽqy0´HH÷†'˜ ìF‹ÝíM^u~ŠÿʆüÁ{ak¢þ¡¹qÐäëÔš'$‹|L€§cïÌÜKTýc* ,«©/Ohgt]ì^üÕzͺ[p4ìÌ”:ý³z&ðo@fœ³hV½œo¸÷4 tÂÌô´,Xز¡·3ZçjÙZêyí:ÙÙ;ŽF¬ˆ™Á|ÀçÀå{K‘äöá7;™ºu¹<2žwr ¯3Xý>U.fïhl¯ZÁ$š?14+Æ£õÙDGáHUKûïÑÊl,ûuK _SSD™|F‹_g;@퉇†ó½}cç[ÃñØì#v¡òë—D¢Y†ÊˆÁ0BJŠ];ütTÊ }q»>†×pxÆì䣿† ¿3A/.¡qÝNªÍQdqâLµƒZÈn‚y#‡ÄQÙsh”©œWŸ¡$–”f´ nxGó½ ÿVUý°óm*0×I©é”fO]AùêZxáèwa:#*HH˜üð´ò»Êù“eý¬ç,Åcá]¶f]Q1ŸZü±;C1QTµ‹Ô‡~ ¾~òÈaDw³×TØFå_9,íô‹!ýcbÊ6,7•×=Û§¾¿“ËŠ¬–Ts¯‚iâ€DÕ•×>©öÌI%2z.7½ÒkjªS™ªM÷NÂ?w1{©¶8ôDX‡úŠŽÕ ½uLÇàla¦"Ñ"@†¤–¶`f;{dTó¾Þý)‡b_›€SÖS%ô;hùÊT¨ƒ,“·ÚK¼g&8'Æ.Xk)÷{N~³0.» -JK¥¼«S™Ìó wûßä E§NIYû̘։ÃÊ£§@ù¸}1¬ûÃÚA7ÿø}AâpuàÀ>OÕl'WSôŽÿˆø±.wÄÑÄ»¥~B¡m|{*…˜c?rt:x‹>ƒ Ô:ÚçH/#h4Üe™—¶½ƒEÓ«Ú}„â•Èw_ÈèÌ‰Ž®6d=kb@[MvàÄBk M¸$ÝH‰ Ñ½ã¤d¹5]DòÑ_þ{‡ãK66!èü"d:—Ônðð%Ût_qû×"ákvH`~uQÈÜLïÓQ²×Îß “0Ö«Äjüø ëýT4ãÚ$Ûb³ÐƒÒGJé•— /88éÀ  è äH\*j­ŠÄZ~ÛÈìôÊ©güÏÒÔÙQ¾p%Véàùz©õyz°HCPaµžÆL£p‰ÑX°Nó$Ï9gÔßÈo+ìs…qüB| ‰ÔëЦ)ÕîëÆk¿Åv“õÜÞà>ïØJZ|—gŒ®ÿâr—~×3ÎÜŒ–¾þVýÛ9ÖR¸ˆË1± Wu"òÉÄüÇK½à^Ù·–7Á‚átÄ4Њ„t¢$³é;q (;™¡ &ÉGÚÐq’ P4Ô`¦Ê —À{ 2Z)žÍÒ“‘?r ëÈØo!g<'<«13ã²òè?m{ÿ8ŠiÊñ²A5‹üûÎ~¥aÔ¯¢ÁÀç¯KxL>ÁÊ+}–P¯f±„ä|Luo¦k¯·‰ vA§ˆýª%S“Z­d¸êíüÜ,vƒºÏôƒ´çü«™¹Þ*ÚmÕë#ÙÇ¿@¹ÐFú~œœ0º;SxUFv•-²Í\L‘€ê@YÂè¹VæUZÿBe…ÆŒVKøþ’¾¥œ ±;¸ªSX<‰óƒ+†þÊå{yÅÔÉÐQU:=Æ¥ ÏI¦µh»rt“ÿê ,)Ír)U¦tXÅFÜxI&üu6ßɧÝ Ý)ùEVÈ(?©ÔÖsÃÂáÿQ‚ãWUERó nY7A#a@¶™®­2— ŒçÈÜt:»ìŽS½úÞv¡:}~«“ßV»®¥ré+€ŒL*=_uf e›6¯ Ê«3,PuýKMW6ebk55ÏkŒx ¢Þôî'&ó <Ó4LP1 d¯ªwmaA¾m {.뜚'V¯»üÃ&Š|±ycR±£ ‘ÐòÐíµÕ|d‰_‘x$¡Ä¹Èö]}Êhû8gõÉ&S¾q.r#sBëQì1bzÊfXý‚­ºø°)Ù¤~ÑeGÈïnxV ºÒ-VzóãÒãù8„*ö“JŠ¡ÂÉQ4 P£œà{aêQë<•ßão2R™w–5 bzçßjì2C”Í. !hw¹ “ 8ÝÉíŽG?h+~$Nâf*¾¬„ª«¿”!#)2ÛªgªUï_t`ž¿e2óKæ8rZ# Ã~І~šÌLÖŽŸÛ£õ4íßSü·¯½cœ^›nÑú÷ÙÓP¡œéJj©Y,§…ç]‘M2,;† ?ùz!æ±äA0—öæÁÂì£d¾£&Æn1/Á\ØÈj!§”px¡Œ ·ß(ÑpYªª¹\ð´$Íljƒð÷oî¿—2qä ø0_541ëü„%Už»9DãÌì†$î`É»Ù`Ø-ð0°B²ˆ²ªQG]òœUBï­—Ûžc…œ ˜¬_Ü3† b€k¡AÛ®Ëöe®]­è‡nT#FÐJ}«ç•¼8ÖÒÉbߨɖ$§Çí\²Â{†¥e~A¯ýTc§6ñRu;ûˆWº°W …ûò×Êë'¬ ËëSש+± ÝÎutégI7sÌN7qŽ2«(õT]‰Ôð¡úÎCuíw”·Zÿ« k‹w_ª¯¹›†Í§ŒÑ{§PNÎ>äƒëúo®¦éCÓè½×÷~Á}rÜn¶uEØiÁ8r<¿+ïÕ•Ô~וå&‚Ì?³,æE;j³YñÆ\ŠÜÚMp/Á@鯿Eá¼xP‚¶Ô ÝÑa"ÿÝ, Vã7‚ù"y¥7Ž7˜ðœ{|kÓ$¬(#”r"âO«—=Íœhbg¦~`‚¨òÁº9.ÒBüö˜§–«¡³¢ãX=RDk¥®g¹±âwB×%at›—VòÁû9¡Q»$ï ¤&×}0 ÿìŽò° íXö£_Õ2…ÈÙéX8*ï‰{oî’;â´šÂhtöIFe2qrÙÔ¬¾§)ìÝ­çÿ‡ö-€×å&Aé U¬¥Kƒ¶'Î@xÆþµ ¿M£qÞˆvn4åéÊJ¨M¢^‹þhÑ ¸dï‰6 >ÛՂéÍÞʇ“Ã^q2GMn:Äs«åv"bŽ¥¢nœ£LˆÃUdF24µ}É¥H£kæu5ææ°K‘ƒ±Ÿr¬ÿcØRüÁ,eÏú‡œüø²iÚu䙦€RçfOïŠE‘©MÐ]•ÏPÄNÝc«§~…v—ÐÙæc µÀ1g»ìŸ;¯ù¤«M>âŒP¶YWcRIS”[“ °Ø6ß{Ñ„F‚&¶°ˆÈDÉ£ô5ÿgF“©ÖŸ¦i%(Ú_2u ,ùO)|ñ Ó?7V-êÌË"|„Ÿf\ s1ÃÉÀ @þw—iîÎÓ@ O@ö'‘ó‚›ñ@=;P6OæëÝP‰úÀU-ø¸$¾eKÙeMUŠsÊ¡S©ÍC§½Ô…6¤§YGëîžKRs!AÉ´öFp"\J˜v;ìô—ôú½‰ [Vk‘(&,ÿxáýÉ¥]vgØo‘™e[©k]KpT¬m*GSÝzä«mïË^›BÒ¤Àà)]Å´…Jƒ*,ÚÐgu<Í+BÅúJqŒ|.§Íx:ý3RöÕ ~äËË «æ,gÎÕ€öf,)—8ìõ[å7hr¡/IÓ7: ÒÛöaôó­#"]·ne·Ø9ë½Ã´…úWx–ª ²o‹ §RÛýæFo‡'^†Ðµo™–À÷μ¯(©5v6;=cetþ· '=<-Û>ÇíŽÂV 0dE“ð+#oûÕ£»&ô’SŒ¾„Rû°Ñ÷^\Ií [Ø¿:.ñ` BÄÐ6»aœ¿QÎB’íqã»ÛKzð·R:²ÕÁiáX¯¿¤=þôœ¿ñip¨Òá?ÌéDû„±Ë 6Ù6Tl_[³¯œK oPªÔsìŸNÏ×”Ùì ¹ä æ#Ò¾˜5 ·F ~á.á]YlF—­;E׿¢^ š{XìR›M@i×Ë[avjºüiRïÈpÖÎÚnÃ>xz2ÿÍØh–!lsÂ&U­ý˜G»é/‚¸Ÿ÷È…IfW)nJ …?üœ§ôGËì!Æ!é^}¯êP¥nUrþ"bÛoFwÒÝú0 ¾äÒE c®Ž˜gdÿð‚ŠŒãµ¨ÚƒÄïÓ¡ò^¾¨re;°,u&…ýÒf!9=q—Í#÷’èØÏzÚ»G}D¸GFªÜ&ì?úÂb\ÁEú‚ÙL•r²ÀM¼*yaßXÃûúÐM5·–ŸJ»¥VáƒpⓀ㎕‹¿ï3ëPЉHÍ–H5Oc¤g_§IÜ㷫ߢð2žÌmW¦Ý ÕSA¤›³• l MM/e &¶¨äPUÈ;‡’«;¬PƒN”ÖsN…Äã'ÙAá¶[Hº!¬än$Ÿî²?rBL¤……À Í7CÐé%Ìáà-¯—\Yð¨ð´{OßK®:§Íb¼Ü°¦+çp‰]í n‚¾ã¯L0²Ðÿì& °ÛúX0üÏ©Øt O:>˜ ¨›%qTÊÖJŽWúæÏ7õúf»”¢‘C¤!ïÙ–Ò¬?ÙXAw"3Ñ‚.Ǻ˜ï¿!5¼ ò[w Zõ@úë€ ,Íg;æÿ°‡6_úu”ò©¯µû0”’çlëÔ‰c«)/\°V?û¯ ™-eŸš¹4´ø%$Áˆ!µàø_êä6ö”‰ÇŠi€c’ê R..¬_Pк¤]Û×.”³´ÀÜ©šZ@XRˆGŠÛÍxÃÛã’V.ùÆ ™ãnÍd¬YRƒ‘9¼Õ !½SP(ñâG·ÞZ[‚¯““ïm†‡î¬•C»vóèøãÊçyÆsÐûu¯¥°ôçÓëŠ%|GÊ(è4­eEW#“›ï­žOé6òÒ2ºImš|ï1ò-ïÑi8p+Ši$$g¨W[¼rãí2å­O9K^ièX*Ü`Óò©^‡úY!Å‘á gI¤A bi{ìËT+`/e 2,îÌã÷Ö]œ:Æ:Xž‹¹û„†ýÑCÎÖÁïYŠcäò»„¶i£ä(Ns^ìM7­Wòè=lNÓ¥ì„÷i¦%¡#¤&y9à8[1£âÇ×ÜAõ2ÑHç$[šzÕZp¬ú§6Ê'Öl+`sÚï‡eÐf_²P.âÊʉ”w²oJ™0qÕƒ ²6Èz{«)¥Gø˜o*Ó®\Ñà³8ÒÐÖÞÙ±pð¨MöbꞀœÝ*×úÏZ§ÀUg+ì[è”f€›‰y^Ä»ÀÙpÜÃÛf¿J¦(U¶l1çŽ:]êÒØh QV38þÒ&¸Ìÿ=;¨ ªÊ‚Ø, º¶£–Ä`ò¨oÿÑw„!U XàúøÎ/õ¦Œ\eA€ä¬’j1U²®NãŠ#Àòl®x;Û0‹)ý4wÌsaÜk#¡¥m›gæ[zW§ª@ñ„VÇo?K>:[êqä+4d35 ›BºE×-¸¬òÈŠ£Ÿ6¯E³ŸMå7[–äŬk]¹y±Oøy±Ýh¡¼xóüyÕ$‰7Úrè˜î4 n^µ)ÔF Ç–€,¨l¼¼,-MtÝ &O2–¢¬˜ßñÕ»‰^>DjƒèÍÁVÙR€í,KŒ2݈ØT”€&AEÝPþÐ\V4|8NªÔ ÿ*¥ê^ ªszP·W¯ØŽC-w~÷ ¼UiLv§;±ðñÊ×Q¨–œ$!¹Sª¬¯2`ÖÊ(–¿è''t® Ü:‹é)5qQJГ׀ÿ,}Ô:HöŒÛ×ÕÄqªÆ»ÌLmeÕðÇsWã P:¥0÷B³*åŒ0sh«æàŒØ‘¶Ÿ9n¤°ÿ‘ßÑP° D»¦07þVÆX¢Úfa,²cfLÅ@ÈÓ%Ñ^¤ŠŸHnßÓ d8® rÝ Âæ/œy ‡qºÜ”<7×%1÷©X ±ž.Ê #§¬÷-–~Ž·µX"èˆ~LÁšéÿä)ûéWkÿSO™MÒV™ˆããfߢ³ÄTª²¼·UÐú™ KvGàïÏ*:”¬Q;Ë¿ú[]Õi÷ÀÖßÉà«òè Ô ™Ÿ®×^t¢I„qø|^OØÏ ?Ï”S¸¸,$kMEéç­”VÇÜ Ù7Æ} »­–µQ¹šÒ› ¢'ðð1£œ— zU>³–\,´ìÙ¾‘[U¦eÄ_½À‹ä,² à0c#µ€*NÛÝæbè}N?š‰æµÞX@¸b¬S¡Öx¤ßK£ØCî4rk…Ílëð8º-x4½2ZÿXqWÎÏ/·%nòæßÇ@)¼@NãY¨Xé–‘H未ZNSxø$@¡fÇð·/nÜÜÛÑD¥‡1½$WãCTqŽƒCMƒvug?»hòëζ©³=âul;ââ/ר¾#S>ôŸÄÜ ÇoÊ/£¥pÇC‚>ˆªßç[^9¢˜ÚǾ+õv§Ì¼ ë,˜A¨õHèdäIÑ?¯õ{JÆdcîì’þ;üxª¾_—IJ`Ûf_†èø”?e;! ƒljêLÁŒAÁAlb,6ÚŠAªÛðÉÁ¬ ïGÃkW×é~+F‰¶´§é‡!·{‰ú­(¦º+½Ôb.9¡5‰Â`w ûÎÿ%³Y b¨xÐô„JGÙäž›Ñï ò•ûºÚ Ògø#'ó_a<Ûy5d?ª(p="Ïö5ºÉ™)&c·’d#BFfn“=ëÊ£âk‰³IЃC:+ðâÚnø™ <íËùV) cä% Q_ ȃ„ië–΄-&ƒ¤#Ë¡âÔÐ÷o•ÿãR¡1ËP…Eç!&h3®G¾yää Ϩ%0]n)ƒñån<ñ©JM‹†%ŸO›_ L‡èýC-2!þ¬.©í×’7??ÇËhN˜7"óªGQ§™þ ;ifsÊ¡(ÚD€ø$Ï¡<„qÌÝ‚j cNÁ…6¨ò @I“$dá<×?ºs=tD¬—Tr~ÿT—Ie+%äíc™¢kIxDTR™·Öq)ü®r²™6–žD‡¦‰¸§P¢­Z/™YcHÇ‘bYO0еQ`ÉÓV¯Ìd/EÖ`=u¦È(%‡BF˜Jܙж>:¼à ØÇôY‡é'!×RUi·¦Øc¡ñ¿þMºò€â²v*e—T«]ðg÷/†›}DF:cmã™XÍÜÊÓ{Y|ר¿…þàãöÃa>XZ÷Þzíù„ Èí„’â¯@¨¬ºØðOÿžÂ˾²jY\¯‰g<…JC‰5ÐÿˆÂŒí·ñÒ`Á@üñðF+Ì>¯²V†‹­©Ëc( DfÕUð¯íWƒ®¸ã¾––¤T‰K0P3Ú%Æ‚÷£´^þš¬içÙçì¶)ËãøökF /g*¬NÄÚÏ4A{H€™‡úÐ9G¯NL,\ë æÔ‰´¦ñÒ®GÑÛ‡oÃ5öûÕ>G­P׫›à¹v@á1Ä»ÕÊ guØþGœ VyåräâÙ/züÚ#'WqL"©úe#2ý÷å,añúï­[ ;BV¾õjIÆǺDÖõhczDšAõЪ2ÑÙÛ°VT[IW+oCËâ¦Z^õ¢ßØSÊÍ~—¬H”Z#Sç¦+öAÓŒ5ö–ÅŽõÿù\&ïI5­â>øAÙ•¶F#¯ô~Ð÷²T£X°®7òVkáñ²yÚÂÊâ$pIŠOgE Ìnb'ôC ? F¶ºé":µ%Ög·“¡úžÈLåkÓ4ˆ<¬†oU'1i‰^Ãdi—?(æ­¶À: “©€&NZfÂÎjÌŸtù+ê ÀŸ ‚‹ù^y×Ã'v‚ÎêÏrSèkÊWÔ*Ó1ƒùˆC*_0mHöäøÃ…Mdé ±Ÿq Õø·†¼SŒG_t¼’Ú¨ùG1h‘ û±nJ#|Û9jn„ÜûÞUð³þ§&‹ò2¥X™G†m»ùÓ±»Ÿü%ád* ÒgB!þ>yºWCù:´´+¿ÊUñã;¥h¨OžXkám†@RAY«+L˜ðu2%šj„Çðѧå3ŒuéOU{eÈ1T00W¶œ©º›š´²û­D÷MÈ}è†èJd„XDª°ðB7ʃ³ ½VñxËZ§oøù„›ž“PƒL~hšân©c¥ÅÏ›™½Œæågîme”¢z…k¸€ÄÙµH®RƒôA™ÒàñrÕ¿[J‘4·Z¬V~¯ á @ÿXe‰ kù+fþ²Þøß¹&ÕdÔŽ¨ ò>`:°˜=³õ#‚1´jñ»#}™Dö¡·^Š &,r ¸n ‰8QiïbéͦaÒ=Žé¸K'³eܪ~i*üǸúK³ÚÏ8°ä%g_tv½Ë54j¡îævýPu’™YŠr¿¬¬©`Ô*ï¤?FÝÄÒñ-¸WÊ2Ë.]ÐéD¡“é%Èaàdqë¥}¿b›ˆä3•NY ”™ Éá6PJlÕúùœH<°=ëvM/´Îf~Èd‚<»UüÏB—À;ñœše½‹ùæ•3þHkÈ  `(ËÕŠÄ8ÜŽ ¼’ö0ñÊîì’—Ì‚bGðÛÆ~6œ#==k¶m°ÕŒX™rJk>ÿ.(ϯ'$êÂù#€Ýd_Ȳ¿31ع Ùó‡¼EG;³±˜¦‡3MÏÖì"zn’Z†¶}Ð:I(q&ê¾Ôø@'R`™—_±Ð„Ïdrí’‡/\‡¡eixÝ ËãåïŽî[PÃ'[ÿµ*ñBš,°8ΪŒ–ÃøS-¾2ñ>ÓÂ+ÈTÈ Ø«òÓÕºäѹë@ƒà?uø€£FíâRÚLrpÿ-¨1º,ûÈô5ð9\Û:Ù¹39>±ƒ2.æRþql¹ ë’º_ T¬ûe­õ¾F ÙÝ«—̹¡à2gÙ+úÒpšwÂÄGs¥J’8î…aÈA¡Pꤚû 1 ÈÏè>½¼ëÌf Sô¨ÑHÆRtìi0v1x"šy– ¬VÒý=ÛÛp w‹A"ª‡ÔÄsµ©07þVÁ„·U‰d7VIÚÓw s7K[jÚM‚j¥»'4ÞF¡×z\Ýša¦Q6‡3a[ì£ ண Ìr qÀ?Æê8&5=Ïla:E­}©¸šUÊ[£ËöÙˆ>˜µE¼qöWݽÇ_.Šˆ±ƒ”QÅškN¡¬3n†)|*иùÿ±‘÷#lXÃø Þþ<’‰‚h{‘ƒßÍz™if7ÊèV‘̾χÏBZÁ^¥™øñoHV…䱸qÈÃÁF=¡åœú„%מ‰UºÌ7oÆ¡ÚR ht=vjŽ²Ñ‰0Ò´"epžáÛïp°Õ_ö†¡3Ú«vïeŠê@†ƒ¿zÖ‚„õVKZUØs~™—ór`VnŽ ¸0,ç+˜ZnÄfU²^••/˜‘Lã Ý,¨¾(0‚‚‹1ÑÂ@?ÒfÆüÏŒçâs`ñ—Ú¯S‘é±5Sú³‰žÆ=V”6fàÞ$ð£¢Ë.ÑÀ÷|´‹–óJöÏ[y ‚ŒåØÔf¥Ñ~Q¾z¦ÞK,ùôJ߬R: á™ñ™ñÕ4ŒÏ‹T †° IrÉØÛbšn©÷S]œúVE£ø»ªÐØÞ|ÁŒ#A™“´$¡‹ä4#=ýÅ@-4&ië|Оb‘Ô!ÚmžBª¿B´Fð}ÝQÀè*‡?Lã’ƒ²…‰AQt¨ÿ9‰³µì9<ß3nœ,CtÂFÍ$ï2ÌØ°5Ï«ã)ÂÇZG³sq:#WUóL2g,JµÆ§÷»G“ÿ‹Ë M%° "·î+Jǰ¯ÉƒwSø£ÃÏÒ#”°¼axnF4€Ìôï®Jù \rv̶ô±¿O¾D†cå\wO¦ËÛ0#dØ>jnÎRÿkcȼØiöI&rpŠZñ< 3èB}ê"=‚bÌçÞ÷âmQÿuSÞ§ó, ë]7b‰š06þKu`FŽøµŽäª¿hÚŒ{õ`xZÌnf2ÌÐÔ!êâa#·Ò·:S=зîm¦¦â‚ÊO˜ê³œ š’ò;<Ä¡deQÒIã'œø.ýqú¸¥Êƒ Å‹’jãÚåsçûý;–ÿä-ì™ÂÂád%ú¸WU±‡‰‹´@FµÎVeÆÈ§UT2ñrtÌ´u1ïv kùœ¦ÝìS>ðª×ì ý‚F óD~‹O·š¸¹»ÔÝá~~½²ÉVç×2jÚå˜8Áûå~Ù©¹Ë¹g¡.˜Ë{k5ÿ̘ºó@Q4Îê¥yΗÛãcÃ'ÿv 2J5]6ŒlYæ91Aø:½-Ùéçë-FöP:·EÉ~Z´jÖ×%÷ÛQn®à»‡Ñ¹†º|ˆv>q$òÐz0™Óä+\_ÿýj,H×Ãh9û7q+#©r=!t @Øœ¦t3H¦ qF/GD¡OÅ4çðçÍ¥FÎ;Î ùm"ÖñÿIX–9üõ RÁM(4ý5 °e¯³AÆ[ºÍëž{O<ÑŠ 5Xç•4çøÿýÖe0?è@¯â¬¥¦JŽö.Ú;ÎÂ.rtï1œªÌ%#“ÈåŸtT}[RÖNÉ ->×)Ž™œ]æÝ¼­hųs^/>Ù$+îŠthÎ…o‚V#4lÐâJî|nP8>˜?•²+íG“(!Lç'ÿeM€QÜ÷ÞÉB$g¨,ƒ0@Ípºí;áÍxQ¸Æ×HDŠÂúèOA2ì¢rØšFCMÇt¢JÊw‹À°Íú[ú¿_(À$ã'G"j ›ž}âRm(ûqÙÔ7±‰äÊ™…èhâ¯Zñ„ŠLÔKmÈL-=iDš[ÙŽù»úÔN‚¡Sж¾EDËê‚AÞ°JÌšo;:8×&{ØÉ‘*ÌXp€YX+6ä ÐÇþÿ±À£ÑØhÌ”oÖj;•cðXaHÔ(ÍO"äCEÆ™¶R&￉˜ô‚é7 #x„iPý©+èÈ?ã¡K‡$Z!ohô÷îo9áÂ'ú¼ JðQÇïýîКq¢ùb†ËÚ ^’œwuõ¬ûÀ/ø(Ž›è¹l®öM4sº¦û&O3ñ¾Ñ^]šê¡Xbgé†Y˜ÆÌ ÄL•Òâø½Cd‹a‚õ•`Ydà‡ïBdŒZ¾JÄ·õôÌ8ê?î`©æh,˧ÿp´‹#ƽO5‚SR 1ÑXnÏ{Rr9²kn•-à}ô_É8oSËd>9”Û‡?lÒôHN¥ÍØÊ‰ ®!ã£ö§¤r”YÞB}EÛæ¸:Áù˲Gâ@âõ{æ âÍ;‰ÒéX§x|È“àçíJ™åô©ºÚ(„þ¾éﺞ ÖGbþu@6©¤›fÖ‹ôeëß­ƒ¼pØ¡š.ŒS’9 µõn •ûî½GþlkÜ÷K‘ÓNÇÞ° ƒÖq©îØ´#aH™\©¬Þ7…­œÄ+\ª¸ÖįØ|A6üü±ÄûÙÝ(W¯·iV £ü‘aé(øÆí(›U˜€É¢ÿ=:§™@ˆ®I ÀÁGïúë³uaI|E ˆ‡*ùϲúê.%šW^)…:rú= ¿á_D“¾$Dl`ÿ÷…Š[)‰£ICÄKÕ¯¨a¨ìÔ+$\ñå¥uÖé˜0ì}å¢ÿ?æßC%ùCÂö‰êlnyŠÛÕÕjƒ¨Ê…&Owӛ͵@S>]XšÅ±»ë-¨¾®Öº¤ûT·VjÏi¤øç-µœ4'†iV¾¿8X#»¾$K@3%¥øQ½×ÈäÎwFo!3’«OÃ4¦ÉhZj/B]©ØÃ„Uñ^âÆëuzÙ¬Q«9zÇ;oCeNÔ#c-Xî+dÖz,Á‰â¹°<±¹ÑI|z<`u†\v›–…_C—è¸ÄÈã/Øó¾ö‘þ˜ W(¾üÇÒ_)%Ë®dQ­vÊ üÜë<¡«ÁÈÝÂ,8ÇÀã¿ä*¥²æù;‹7(… (Ü2ÓúìýúyÁ'ç:`"GÌ£FWÝ/˜ë‹æÏB/ÑÖ¡`Fùš…zÞÃWÀ¼m¥ŽLúê kþC°p6Ö ŒJóKfm/9DV1ùl¤¿CQpJi£…H/ÖUD‹±öm±7?Û·Ë0m©~PmÞ )-vŠP44¼2càcò«3G_7ùoú€¬£y—3ÞŸ©i?q"98!L¿ªµÝ@ ÿ¸Ì=‰~ƒAù7ÁŸ«¡ÙóZ’?®MFà1ÈV‡ðì~륢ô—1ÓߺºædWAÌOÕrf·áæÐ.PmsG¹VIí`ã²Ö[3”-?ÿ×Lúòܶ^sïåÖAÁ¦1}'¹éRucša½ŽÊ¾ëH¿>êU ë³ÑfN°»“‚Õ>I‚ã/þ{½¡XÜ÷í¦°ý$¹Ÿ¯S—É’^ˆJán¿Ø?O3l3Ë#„ 5ÙÐS†v8ê©s*áJ 4qøó Ñ{¢­Q®ä‹î@q µIôq^APÐ ܹÒr´ iáBoâNIÅré@U`”î÷ú¾y÷šÐ•ßµI·¯‹|ÙÁÔècqö¤×õfeÂyêΛ HìkMQQ™Cþ˜´.áƒDpŒ¼)½ÐÇ|K/†âÇgŒ8޳æÔ¡ËÝð î`Gr¶™‡\3*¯ 3´m«o ߇2‡÷pšóÂøÒ ŒP}L$)³ÈPôG}…¨k-t~Á¯ „VÉALë±\h+«x ¼+uÔB½7ä;¯î–è´éÉz¼‰yFèÚ(žMYú´p¹eŽdJ'=ÃÉah¡õdºâIm`ñûþ³¤/Àáf(¹ äD›D$Âý}é*€Œ‡hê.éM*Ùú2iOv1œÈ+aÅÁ2™Á#[‘ ?I›j8îtnûÒ:€¸ˆhF7¤:T%0f25®Ó²Ãž.„‚QK5f¤ EQ‘Wsa™ U¨I#ëÅÅMÚ™6_Õêp€™òðÝ'î(J” x m¯ÀI4ÖTÉç%£ÚÁÊ9“l2=ÐÖ bèÔÒtµSÕ.tš—rLoâf­v­{áa.À®¥: V½ñ³¦§?eHrL¡",–@¥gl³Miüü…ÌblŠrú’Íþe .6 V ÷•+Aë¡­zOMd蚎¡ëlE#ïý" DC9»\n×W°m M)_ÈdúLAhnÓßöŽ;ÿ}rÌ]IJë.£‡Š±ÒªÅŠDd,g‘0.YE¶Ùªº¬sgDDÔù(®¾³9iä= ø&[ULº†»ÛõÈx®ªª…€ ³ … n”Ç©ýBG–iÌÁÞ•8l‘Ò»ÅèàŸk䟒 _{›9u'¤Âƒ—š4˜—\ØÇ¿ËÍJ{å[mæVå˜+ó“Ÿc”ä³9ú ùf“4«…`} ðÄNÈÝl=1•X’Ž¡[Âʺ/Зë{)žq—Ã~w]vÊu󴹚Ø! ŸÁ!5=qØ ùÉAü cÜQîx.?'7Ä ¯'bVFœµÌ¾îÄá®ü&L“ï§ç‰_Ëñ—Í]xZ‰oËÇÍ ÖßZ—H1uÕT{¨#;Iw#z9ÍK#}¯êà"áÈkax # coŸü‚)) žhÙgö:°v­]Š­î‡s¸¬†Ø·X¶ÆÍïÉ´£ëÔy{Ÿš=øÀW¬JÏ Ÿ‘ìºÏ,®X-“•«¬ô$õÎåùdWÌ4³À‘l±n{±Õß_-•Í7kËRª©e4·êÒÇ·æ6½\mRÒdR3ƒÍ ‘»]·+ð¡? ’‡™ߺ¬8ˆd»Q7ÌBù‡Ú(+Ï)|´`õ:³'¶ñWósh®2…aR.ìJ&›daÛîܱ݃‹y‹µØOô¨ é^ŨÝ5Þ.j.Ï´¥ß™ð'müË=L—;€ø[ªŸœ- â·uPÿ©ÿ»ÞÖ(‡ïOÇ,eïW ƒ7 dËï;ËpÀRõK$„âáW”z”GÕO—Û±É(¬0s—à—°míIçò'ñ¡±ÝŠ=_ctxÉ­›l©ýH)¹ê†™Èà½#~¾GŒHdIJÑW}³…Æ6-¨TíÍÞoeáÅ _È÷ºUƒ•Pú&¢Ì_Èr}aÈ2f¾–jÎoEcò½~]q¡ã”±Nó%&_н S„¸Þ£Ð3#-Øî æPq1j«ÏÕ†á)'Æ*ÉTx8Ô“WUÒ+·ÝÍk“¯3‚6ÂÝÒkœ˜w×Ò)ž‘æÍt\ÚÓàD—,J¯’RΆ Ðü[ä 5¤ÖÈÜ;À†ÒΦ²­ ü–<êt©*×GÍF»#ª?³Ç³´“ÐÎQh^çп=ñ9…]±ý°ô¡!q‡ ¤üÖ:zBþÒ7É.¹0H4±-²ØŸ™°}êȪnL$à Kñ'›“h7±b”xå|í×vËnC ._ví^°uÛ«5ó¦ìcUFm¡ÕûJé¤þž¾œ½÷žpý÷à‚D îóáê»ò-ÏËÐÿì;G-*é»è°½sºß0)›}ã¦Pƒo íÐý-¤ÿæÙêNE~/OµªXd›µì][Sz¼%bñ¢~ UÄ^º2N‡Þ W½• õpGµöm¡¬Ð…_n[Ü¥†Å¿ø²M±:§ÖPñ–”™ž1 º Š¢U­å‰§h S/½óCFÐ)qצ‹¦á˜8Ò9(¶í¬¤b–vèø2$2’¯ï1X¬ï!‡â8óK ç œ³¾rCïúÄ÷!¡@ŽZ†Íõ6}[Í„ ¼6újµ_\*·ˆiŒ;…±-ãŽÂsu:‰>ÿ°ÿ/Dœ·}<ª2bB#JÄ q@/žõ1õgÕt¦“›ÒYUX0›ž aÇ7OþXáÊâG¶jx£Q°xÜr¥Y;s±`{€H ©à×!Ïk÷©“Dn/QHú›òYò–Y¡"£AݳBÐã9ÃêÒÍšŠë ÎR= e(í¹ÿ‹áÜmíÈhö8f©¹b’¶ Ô7yXw˜Ò?‹hÄJ2¾KÿƒÊ×M6ÒµLuËMÄŸi û“Èbë5kâÑbס¥¤`TŠbh„¬Ú?fA j]ÁM£ ÓQ°r2pŽ|Èum^&¨×ƒX/ ǃC/ÊvD*!©ñ˜G·0´ó‹¼<²–°¤V,RºÄáO³TÙ6m7¬¸BUc-(ù,HcåàýÔeÖÄD…Lq~Èã±Ù ÿ¿R2Á³•~«—°)yͿ̀ñt­Š îPn—‡¨©Ê'³¦H‹Iþ@37ÌË;=NG¾%®ØÌsB û¦4 $jàî‡O*Z^£G9±yLÍ„»¾ÉCU›Î 'XDšKq±Šxº®Ô.ÖÞeì\CÉüÍ ÔõÒWùÙ1˜Ê•rYîLjÎ~îíÙuiqòþØ~³¿Cÿ‹Ï-ã@eÙ:ú…߉—OÉ›D7ÑB·çaöÖxÉ ß]Pš~RéÀL@€ßœcƒƒKçÈ'Mñýå!d'^?y¸ s66½·ú4Îo~„½¦ Ð Ü‹¡pÙ„Q•4|FJ£M7æ—qF±Ùº½lÐîâÏyá¢&ÎØ8©—çT¤zê:_n¶ÍE†ô¶³d¾’9Ô³\ÎÒ†gÖá¥8/¬ã±žy¯èçL~¼‹¤í¥ÁáDûéD­ŒÑ¦šfi5¸±VÊ?€‹>dŠ}{îV,)MeÑS©:é|€¯ãóíÊÉ[žê’’žDPgñ …¤Ô0Ι öŸä¥ÉEKÞ·×,ürœ:Ì3K8Ÿ¥[Úòõ±ã©Bc”—·}7„g3〩ÈÐޯюÒNÁÁ_0lsÌÑY~X=%×Ë›ô0õI3}uÙÚAÊ–€æOdxLÅöµÿ-(MÒ‹oc7 ;ݯ+§9ïkì.Æ5C©!ò¾íÓ,ï å«Ò‚}Þ쩹M/äº ½žÜö‘†w;¿îÑ–x.ð=ié¦üÇ/`ð¯SšÀÔê½€|L—k÷Úç‘Ê’¦7‹&6Ó8à9ã}ˆe×aó ÎÑS铜ã}¶gþ$h¨tkܵå1‘ 8>ÂÿMéößhXp°È²¨.øW`¢r­>Ic4%ÒLÚBÖhšr‹“³¶™få ²Ðò¹9Ñxbjïµiœ¸)ÊŒJb°à/Ä=‡•(»˜q2ƒ‹®“h²ä·ƒ‘ê+Bp9š«ûKµdœJj¨ÕÖºMý(ücS¡°Ê*VuÕgþé:´1»âó7ôNøSL)•nÐU t®Å»Æô»ÓðîÎýXß õâ€+RÓ¶—ªÛ”æn¹æÉÂjÍ3Ôt<±]‰³I‹×z°Å2ל:$_¨TÿˆÔ’Û£8RKšU¡Ÿ¼¢›’´ˆøž¨ÒÍT†ðê–˜²±ÊÔrYÊgÎõê°Ø™ Öòºã½”ï„´$AûæxÈ…ÂµÙÆ†.« ,n1CìåT0S ðáp¥EŠ(ý µR˜æ©·²÷´ªãe¹o{¢Ã’¦ÑX¯ofpÏd|X€üG´›â³©*~ªä‘mЖñY=¸ársú~é_²»“=èÿY»ó›µ2©_ªÞ±î@ìýä*“LÚzžYxL›wNÜG°‘“hX È ÞR°àTJ² Bದ/$îÚgØ-úöžÎ~:$–a{ª#ÞY”ÞûM2üü§‚^K!•áÕЬðZ äàÚº²•éâõSç•™¨mêU’ÖKe WçïÑât q•Û$¦›³Z–¦¸¹ê{S¶/Ÿ‘§ÂùÆ—åyŽ­"ªGvÓ ¶ŽâÞ›Þ?n‚/Óú(ÌÔáÄË<6·2Õ~¸ßÇèÌÔéËØÉåi\ñ”þ·ŽÒ9f·ÀÆLµuýèç‰L"ЩàûÝO™ƒñ×ãšUH’žo 5Á{è[¼N¿?†Í|ßËÅ œÐàÈ%ú’º)±q ú·Ï¥²uyí’åÓ?q½ÛÃ@}8‹ŠG7ÉÁ*4"’ßý ÿ/·d¥eˆŽgªe56m†q ‰ãQˆªÄÊ‹è ^•dx§¹/B«ïCĶÐç±*à[DÏ- IŽÏ4¸®™H?%¢”+3ÿú-k ¼6¤+VÓŠ¬ ½g¢>>¿j å( `€gD”öŠ™Ó JWH)TœUÝ^IÒbXÝa”kçhä jb f˜ÍË:ãÛº6Ò)f”Õû·‡ñˆK—Ó ¸šÂÁIŸ-È꣜aÁ@¯Á'†QäzDõop¶Ø0ŠS†ÝÖzƒ¦h±¢=×\)ܱP£uŽT{$²rM/ý?ný«t,ßç=NòÔP¹ãÙÇ´Ýÿ©"~°àÇçöëJB]ZŒñ¯šRŸ?sM ­Í؈iBèjq¢~‡7üFÔ¼¹khz iÆ]Yé”.Bø8"U¶R’Œ Gñ‘©ÅÞnvúÖ¢NõØØz|ŠÙEMÙr¨ˆÑLÒv0¡t€yQ]ìçüÿuqöátÐßrìèw‚«îx‰¼‘¡ƒõ›¸…nE¢Àlê¤Ðö?¤K2j¢Ûð=šƒæz,õ‚+6­c/2¥C#¬×)6®¢ñZ…òfK>Ÿ2°€Ü¥ùß”i1í¨Áü Äð†P}Q]®Å ÃE½ÿŸ sùÓ¾UAÇBQ.Í…CXnC¿]¥ø;¦þoömT‘÷(¬ÎN4_‘m÷ÖP²×”¦©L• 8 è³æ…¯× ’¥vÇJ²æj"±#x¾ÚdåÀâJ_+kß[~­xʫߙ”kj\Ü,*ªÈ¾,{èm™Ö€`ðzáå3êê³c‘ûV—á!ƒr›¯Iõ~Cð¶|>L&÷Im¨6°B¢g+ H0Á ol,6aYöº$ª(£±Ò¹.îÏrË-~6MU­{*…ÿ`š½¨a4h)n°û×õÙôVÈçë¤h‘Ûɵ¢ºts’•Ô!W¹8;-2F²b#q<áE9º äy±ýÄù È'»½ÜÁK·G–7½öiÕ¦0,@Ñx-Ú„»@ü¸-K^ÉÂETŽLJßÓà:&R Ûtcÿ!ˆÈTÅ|Àðņ1¥É$œŸ¾;ž;1¨bkãZö¡›þò¡lÍà€:abý "‘Æ‘¶2œ ^5<—ÙÖë/¯ŒžÜkxëΚó1‹VŠ!úÑe ¤¨_‰>#Ý—v7âwX3I”Ý­^Ì$â…Nö±©z2¶$­Q"G(s/PÂ|¬åQ ÏÎPS‡+RŠ!h5²÷j ÇHÌ…p¥U ²ç- +Vî ÔÞúÙ® ;úE8ž wEŒÇ'm iê‚h~:Ó&S“uÀU½aÝTábÆÿ(ÍÉ\ª ©¯CÍL ‰^pjh…=b²Þ5Ûg·)L«òô óqâÅ€’ICä.€ß>š¨ýOÊKô3¯Çh>à„ŽiRåòpDžŸ2ù~<ƒ,ËW¡ùèè~Èİ.r(xLh·ô•bx<þ¡˜?.ŠÉTI줺C6²p5º¡Î¤L >ôGä°-êo£8cÚñŒ&Jœ¢[œj憿kèöN4EÁ·¸•œosTëî`b‰KÑ”½ãÕ-$ci޾Eô+¼’èäISŽ_DR`X¡çšYeSâï­:÷-ÊŽ‹ª60G%¦zKŠï)Ô ¿[ª5‡@-…1W«}VkZ{.˜Àd° ëí&3-õ´éÜZ“®±N;:3VÄèj9k¿HÒAPÇÝH‚‘}wÇ¥…rÊåûã\µ+ ƒ¥§T#WÊEõ„s£'EÈP°Im:+€OU-Ÿ4 8L¿å42 O^÷ Ƥ~EÎQz™plS­HH)΀ø…^éÌÉæ*Û7(/=Å;ܪóÝßX~ù&’eÿw%ºˆ´ÇÓ·ç¾ãöê„ô7ìTGÞxñºúæS2öš¯¡Ú+”A…,gÔW’å2eºø|Nʱ§÷ ñ¿ƒ¾åïÔ*êÔ’¢”çF³±4íïûýµS±©Ù »h ×V/HÕhï¦Sè./ÐûL­4Øþ+ø©{÷t -–²m"%C‚Ž`8ú,6o)ÖíÞÚ>[´Ç¼i¦žÜ«§}ÄÚÎ! ` l®‘»KöÏ-Ë—)Ô*Öê{wÄG"tró?UZ†{Þï–æ5éº]©‡4fÔGD3KÑõxü—á„Oôí]öØ…˜0z¿óÍû ¥?`00aƒÈ%fß±¼Â&}Ä3rE\Y­Ý¸²¾:eË.ûþÞVÉ~†ÌE)ËðKhVNs„]6Œyõ1›÷füÐA”wÓúŸò³ñ`³iÌ~Ì(e¯'-m$‰:|V2Z¡‹‘ëPjã‡4;ÞsËŒ¢%¥‘¿çt‡'m)šm’K×Xµ|w^ÀykI\7“ä1=Ĥ;ø”>ßׂí¤þ@r¸áÀZ2~¸Ë`@ É•[\Ÿbd©äÏ#ƒw‘ÙÄø÷‹ý»Š“N£±7¡1MÄ?€5¡Þòx‘`ƒÏ·-1ŽòíM LxüÞ-µ÷·ìä%*>óX’¤8UôéÁo<`a“‹vKXÅSÍTb€rÊÛž<¢R% Ê¡oØÈ$šnD¥–‡¾a»ô{È¡3ÖÙõ“t¸eºÓP8Ö¢ÃÛt´/Ù  #X}ú_KGš+•ùfIâ¶DwVæ,ù^ 14?17»8³i,XDôTdáܤt ZZpÑNhl&ÎL+yáÖ"<£'²âmaMÛ‰+;§‰ 4bkäùÒË|PFÏ?1äßIï,)]dÞM¨Ýu¾œxSÁøJ¡à'4†‹ uß»|Ä$öG÷r(x»9Ý`?Ïßã:%âÊͧy7õ7mþ×DŒFÊýã³O³Ä–*yÛž úL)aÖü±@•©öß¹€"8×k-`—Œ‚q¤Îñ€ñqÕ4eááûÏ CE=7kê6û,ñ“v(›ÆˆT_Ôiö‹o êîH×/æ?jàVBÛ”â#jtËšöñu‘©ÖL{kÊU€Ëñl s ‹jõfÒ Œ1›êhJƒSÌmûA\ÅÑ,;O¶Å'Hß4"ySÚ§ÅÒ0âÕ/°ì)¥sAp­4—‰(Vž7¿—¥w|Ä‘¬xø®TW2ÕÓPyB½mùçþ†ó{‰_c¹ô‹î Öj!•¯Š7ÄMuûWV>Q Ãvžpkjd÷I±ÁÙ˜©£`ûg^õ¢Æsy1¸2 ™©FÓtüïyœÙ†ˆ¯»£󼆠›m6ΚÙE_÷íø}¾ ³ŽøvôKAvÀN°èwµ#Ê·A­4ŠO ê˜ÔcZwÎo¨×{nô3+#çì©6{þ:¤äÆçA‘j¹A x/AªqÓ.e‚´5xqMwßQM߉‘ôi““ SÿÁûú LϼY鑺=µÕ+.P (t €QNü'_UNÚóXZžN„îyÛr™Ú YŸEêjƯª‰T‚LA!óI ôat„/ ¤œgˆ‹†õé,zž_ žì¹E/'襽ec$áT'+|ªl˜ÇÈ6ë"štŒ8”)¨(ìÖÎè.î ­Û¸yC9j—°/áhf ¥¶NÚîwægßsÛz 7³õ]\}HÕ˜¨€Ïhêt)‹IA’zr‡3õ¼]€ì×@ÛUº~«09{ß*¯MU‹CÌ%ĈBéJò)çB¾ålE}^¦â×oCÁ¥º±÷'â$ÁÖ(S1Z©'eL>¢(ï˜Ï¡€Õô:MÊ–˜3ÿlî§ÒSEF’ ÚÐd¢DݘGÍ–› káq Y›ÁÜ÷®Sœ8øÃŒ$ q—§Ææ–ÄiD]‰ê¸¯4¿¦O­ú¾óXg6ù)R_eÞuWÆêQ 3·æàœA-KLÓò>¸¿o,Fý’tpOÓ0á܇&’Фm3š€œ-²•‡?7B°lî…ƒQËUú/wÁÜ«³Ä8f›8AP³oNe„·( ¾mžä„aGÈ&´ý!èbó§"Eç˜ìSv dE´A¾¸ÊÇ’¤ý‡öcÄÞ5D‚€ÍÕ]ÁDÃ8¸ñ#´Š‘N‘ñâÔà}û´S9çToöˆ#G¾mN3OE’Aؾ-¨{RGÊúv6à,Ÿ7Å6«Q'B©Ö¤œâhå~Ê"¬k…;ñw´kæ wW{HÉ–7e*‹jröý°O/%ŠñL»µŠEŸb$ïªèÇ­ø»{3yø]Šr­ ¥,cëáݯf¤±:—%¥¯ãƒªîúÚåYʼn½+ja§ðñFÅP*À¢±6-ÁRÙØ-p¬ßòùmu¡Í¿ ½Oñ}­QmÇK–}¤o™[‰ÁBp¢²Æx†ØÄ‡Ñ=´´Óæg­ŠÓšX§šA¿8Z-}ãF ÿ¤b_RÝlhk[pKÔxîg‹Q2E¡C+\$Uœß³â3I®teǜݾfKÿ/1|eo»öÛ­™£³³4ŠÃö+Ôõ25$Ž&±‡[øFÏSÆ«yõ v_À³””ƒI2 )ÒMq<ƒ±ÞörÅv¥2vÓÇÄSø¼Ì«—­ò±á»0¦#4¦k ²èîŽ;wÚá~  ªpdz"íý¨ƒÅ«åÑUfHUÅñw‚7fÂjK¼ï\xZG£}šxeq”ð5:Œ ›^„ï"wTçÿFà B¯.pÀÖ48¨‹ÁVow#ŠZÙî½z:y¦£WÈïXÐÙ^“„””wWp ”Àe§¨ðÅ „/—tH·rœýç£sÏÆ2 KÑ>̃Êm£¿ÓØ6Uªbaû “6"ª9U oû#‰PË >@Š¢á»IÇÎŒ£J «æK3‚gj†ÆK!¤’M®­ýj7ÿO2uW_ÖX2(™kë[É $Òàj€Æ¬$dׂ8+9‡âÖ&ØõacÙµ k„31NéÍÜÓÀÚ¡”=f²Ï:fâ’´ '¶¾ÊÛÚ=ånnRG9hmã%žòŸnMêrPà±|Ö Á:!W¡o(ÔÁ2úFÙ–Pþ1³º² ÌNþÓeÙ ÷ëÝ Î&KeNzŠƒQó—²¬ÝøYw[xÜ0/«ÕW3*Wb¾[dèf½&— ”÷eÖœÆÑ“6 ØEé`Awàu§äP­yÇÉÐÓ‡è<5p>,vnε‰ãû…aò_è¡0mBÊ\{l!Ï6bû'ª~,õqƒ`,s¿àÌB1gÊQÛlL‹ânNÓ˜‡Ð+®Å¨iWn U|¼Ù—<Ú /°^™¤U*è5S0{Ä­HË"º$.㊆N©ùƨTÄüœ¼»|)íKË<óÐÂÇãY ¾Ùïn›3ñô;.óDF_Kaª¢ÔþRü6ƒì)FO:€¬§Cý€o¶’«5÷?F hÙÖ2b™¦×ÉHR}’¿ «ßâ@]©*â÷V±š#Ï'ö¸ÆØ°ÿÎ'Ã=ŠfKe’òá€ÇQÄ!?dç1oöÅ¢Ic?Ý­0‡-)ÏúÐ㮬#F«„ð‰Z–`«Ñé§@Α¢ ü²NDs_»õ%µê}­ü­!xFÄ Ø Ú_¯:0F¬iðÔþi±vB¡è³[­ëö Û&SGŸ€ÌÁ¼N¬T¤mèoŠbo_Ø!Zð¦†Ï¼êçƒÜ„ÆERÐÁ"Dk:3®ñª\Ù•ü™¬üšpÜá0zmø˜±Î[ˆá±ÓøsÍN'¥ö~ Ï2¨¦yhÝséxªØLN²\ãq‘2àƒ­Ä"»}¾Ê° Koª¦SÁ< {ˆb`Kþÿx‘¿Þ¼é3öÎõéÒÜ ÌÐ3ëMJü]Šù=L/°0ò Šö7"€tB.y¸hÓU1ÁkqFà«Ñy‡!Npö«Ž®wߘ52š˜î£*šÚè`œG×pûµÝ­ TuI)jÌØÑ%%*‘ýå­9«::UÓvhãiÊ«4IÌÌuP>VÕoð"ñš’®kö_#¢ ŠÇf/Pë¡ah‹Àyyëpk2Çv¶ï÷À[x««\@Ú|(Va ÃùÉ´hl±7ý4žh¹õúÞ›•ÕK{™?”v³ c¢3±Ž%jÙqÎ#75ÞqŸªì†ÞLrJâßn.û=ä ü¾ É˜¹^ÑúxÓ«2éSã®àÂf”²‘ÍÝ–¬gFŒfˆÀ«5^Pe61çÔU6’©F% Ñ7?4EFh´0i¼iø°ùæ|ÐßOØôÿ@}±2Âf!¼„yz(ÃÞšçzQ¿ít3©œ¦ ŸŸ¬ÊÓ€/†m/ãÎ/·.–§(ÔœŸzs¶³0ß§]Jqc–ÜýTÏܕޅ¬amﱿÃ?šüQ1ÅÙ^ŽFk­zý(KýŸSÊÄÝ­g¬TétîZÃØÅûVƒMiOXźx¨yo„ýš: ·¨o)Ù.w{nªÓ­'Âì–ÐQ­aëp…jYrÒ:ÞDÛ§\AYVÞå\¨ÇvN>â<¥Ð;Ä~BÛçó%Šï'w±°g…‡.ޤïÔ¨KE Rd¾Õ’3eú÷Ÿá@’Èr4²}§ºdj¤ó¢ýî@³3#Ó‘ƒÀù¼~tî×ÐZˆ¿D8ÿÔZ5óh œ+ÙÍæËðKF1ƒœÝVÉ©(6:AÕµå6óàæ*LÒˆãIxò€ð ¦@èÀê’t>I]s]Ï–a3¹a£_¿±ûn†]k[ºòÿWþ¸ÖŠ+Ü¿É}Iö\>=@Hr¸®OP8âlˇ½g®ÇøÓÊžŽ®—0•Õªo3­/•b¿@"³¨Öo±¹¾Ghg>h×P I¸8êJa §”ìc²Js^1”9Ê”G–}3ÅIpì47cnqi+X+:Õ_€ÚÑ?)-ÔXÜÎìŸÈ ­—ßÚ)O*¹ÁϪSoZçþ‹HüÞyäõ©xõácV¤Ñ9B2yjó§ Fxàöе‰ §¤ ícÈ6\ó9_ÈC…Gɾ§~W{ÓŒ?'t$Þ šP–sýŃÅõ) ’œÛÍc*ð –³¼ÇÀ€³JëÝÙˆ¤ë~0Ûš$%J³ f›qëp‚‚”!±NPN‰®ã5LCzG†ØÉo9þ`—{»*UÓ¤¡ÃÓRä*R9G¨/M™Àá[´›(?·xoøèm·ã_œ-„ã›´2¢!©Âö Úx‰!Ö‚WÞºtâÅ%¨u¿@‚IaAÛR„„ jÀPÁ;n¼k³¹‡ÏU8Àöð})E˜¸éÙw"òa¸´Bg>Tû’“œUA|×6Ü¥#åNšTXÎ?ZNU{ñwîrƒp4 ƒå ᇠ±£K^/òAS©#,Lä+ñÚuË»±‚ïJ†&ªó!ý›.™û„ ¼î„e {>³#áš“!bF)U‘êP¢—&BtvªŠ2fKwÁešjéaô“0Šï Å„Êg\uvGE‡ãVÇsÖrß]5š±…¦‡u€"L"ÛkwÈíT.¹9 Õ=OÛ%p74Íì³ó&¸¼ñ°vjÝ"»û6ÕÂŒ„$Àuð/âWtÈ·3¹·ª¡jy× YcŸvÙŠ¥Oyd›L‡ï†ò…¥ì¤{Uµø aÁCÙ–0§/Тý‚`’\ æÚÅôÀó‡-/“Ëï`WyŃUðñtŽ3äA¸e.ªg‹9£õð-jÓ _{ŽA^»ùžhÇ82Ø5YŠ=ÄržMµ?ÞߥšÿuòÛ/ÎJZZ¶„š€IrÙ9!à'ýrz?!³GgÇ ‘ã²âQNY¼Q7 Ò–Äc Q€‰aKD(çA½HÛ¬;ŸÁ¨YÒ¢KÐj²Aä ¹é#DþòÁÍ- ã½²‰Ú5‰ô÷–B³Ö’µ%‰XÐ“ë ¸“|‘ô*¤šRTˆ0…'o£®M·Fý£T(ÿÅ~_#–ãsx%àÿ'‚-Þ˜µå¹"´™e¥¥b9pÁ jC7ª·ì³+|(ùÇD@òWå·f¼™-æ¡Îà u¹¥œ™x³ >‘'ƒ¬aiúâ(Ž!Ö2+ÏÖ¸ ó5ÉÎo,w¹HiÒ(î÷¥ô>Ì¿‡ÏÊ‘9S¸ü%–§²{˜n´!?¤f ¯m§öMA°"bàLÞvÚ¬Ë÷vôf]…EÞ½­n¯ÑÇõI?5JpŒ¬¬GG)ºDXN–[^EÝžb›ºÂû>€X<öh_å˜ÿ7ä‘]\×l©£~yD¦ÇóÂÊ9¥o„ k×k0½<Ýû!ÐÓÄñ\t§Àé’ŸuÚs?ý™X^'L¯Œ"GŸag ÚGÍK;¡wM&êË8ü_TÙ¯eÓDW…¢(L*:0÷ÕƒB<2±•²Ü³«Už†¬„m4¼EŒ¨0tÙТ;çü$E²œUÅ„ÜHÏcõÚŸÓ>Tþ)U ŒûâðA¿ËôÜ’-ÃEA^ågöá6uù£ Eèwr{®«Žs¯Û0YÕ–5J6»|*ƒ­%ð†áÄBzCüNèÌ *}àpðmª23É0¹¼ëœ8$>íôD’€Kše‹&¢ÁýN‘´}£I2Ü9ñ°²Œr«¸Ñüx‚ŸÍ×ÁÃ@g¢Þ¼Š áFï§w6ŠËãÀøàòG ©Ÿ×Mk9ÕÊWªIl9Ê£NÐ[JOnÒ3  Ìd)h1}rÒ>ne2ª¼Y§¼÷áÛœ”2ƒ)¥Æð>³í•UY†üÒÍ1Íñ3¯¹PÓô| F"}cœL5˜(­¹. çεŽ.þd˜E憾FS)Ì;m®K1%Öç?ºŠ­Òg2†übé~ !DF §BÓߟI-ø•UHê±ßÛ“Tä³£`1G&%É“.7Ùy@'ÏË™+MiÎ[Vßù™ÕEwF¼Á.™lL–hev7@x·„¶ïZ&k˜…õ!‰ÉUõ™†$'aä@Ös†ÕÖm§™VŒ§„Q´édHÊüp5ÉÓÝøQ¢£Ç½¾K¿V$ŸhDi©»\uüø„±Ð¹Êÿö„òIõ ‡q‰°þõó#Ûôñ™‰Wci麥'Ïxy7¬Ⱦ›Ö¨ àä™jÙØÌx$Œ:›ƒp1‚š|ÿ^S±3į̂uÛ±©<éý-¦ùwikDìFîMé…Q‰O/À;ÃpA»hô¯±éeÌ++Åô†Ü6«÷ vŠÀ€`¹K™%VïjL±W!bÿ KUðÍf7­eàRÜ™`ëc÷²_ƒ­bdÈOj¾á‡G^ºóbÛýÝ"V¸^”JTŒSI ”%­ŸgQ…zÂ(¿g𲡬ƒ:ÕÊ é)q[£ââ^ˆÛ¹ÃkeˆõeqݵÓ,ð“’÷€Ër„T$`ëä}ȧÁÇ1¹ 7øXJ› ¶öw?ÚtÈ í…ÿäüÅoú7P`1 [‘'Y<Û´ÁXu†xhšeÀ,SðG½œtÿþtæßU´DJñZ¿ï*UgË œ.õsfŽ´Ø´<»6¼ÍƒY¨ò´¾û·¨Ë1)±à»¨ ÎNçäÁ9ð)ÛX&˜E\}W LÌá²>|ý²6AúÇ3“”w;CêV#©ºz†êh9.™ƒuZìò<ø{»ýx†|ðnÆpÊü@íøöÄ>ÞÖRþh¡>–›:«åG¾iÐp+ë ¤9ìdŒžˆùF[O:¢Ç09 ûÝÉlÚlß©bQ?kOI–>—ˆÉAWãÒ­“SDíØËvÑt…ÆÀ®*˜3Oš.ñ Â>¶¡ÅL [i4|Ú¥d¬ö çÙX¦<¬¥º\î`Òƒöñ²2_h$ ½Ñ€rŽHzµJùìû<£ÛÆ{(tN³ÑòH4±•×Ns=Ä´®s˜5¦:û’‘þ[u=‚ý˜×½X[ÅÒ(¸S-Ÿ—ãS`Ñ/mLßâGÊab¯ë9AjAÌôJÐÁÓòe™á†ƒ_ÕOg~ö·Y¿íÑ4飈Ô`|zohr­¸ó4™²@·ö¨ÖX\i!ýL<Ìäq·brœ€0|&Re®¯žmÍœ­¶_xÐ U"=r>~Ðóû/Þ‰¼Š2ˆâø”9ùim¿Ð¨ØÊ‚ëÇ®ûÒ0Úû#÷#¢SÚyï¯h ø+ûô Ü`I‚ÁqtÀ¤YÈþ\;–µK1ÉóU«zmˆ¼ªÏÐ u”sÌBRö#šÿ˜‰;JD@½<›ª™Ó‹aËÚCþ™Çëª äâ§óˆ*äÖ:Lq´‘ämQ"ÏQï$‡3ˆîšÂ™œåQ$$ 8ë[²íÌÝ[CìmÍ­ŒX‚Æ ¬4úsdYc\AÀ)QÙ'ÐzêØ²â,Ç ›á5Œ% ¢+Í@ù$Hçˆ5È3ÚZ]PˆæÏ5L´“l³SëÁÌ<íÿmöábÏ‘«ÈsžµÈñýK›xš$¸NTc^l¯?eÇX¨kvE¬ØcR(}'ø8Ä8’ s†bÂ˜ŽžA¥—ëØÎ‹ÉŒí£FÎL’(þsíÀH&r «ogÎqêj`^ÈUL‚¶‚±ìD¡øÍ×÷]lI,Ù$ Z!¾žqû«a'l|P¸4g`øyTsuÑü5Õû Šþ¨ø þñþgnCÛ…Nð|á”Ù¶¤úßöà-Ý¿¼°Ur‚Á¬tG$ü |fœ{dˆ‚Ùö$ãÅ»xJÇ•@£É§Ÿù+ƒ>˜ÍWßí&½,;XÄ‚)w‚$‘cƒa_M°7°_a¬(ËØOŸºeÀŠ÷}‹;g Ò®¡Þq7L8}ÅRrÂéèA —XÈ>ÒÐÄóÌ•d ¶†KDäM0:§g>Šº–ØÙ¡ïJË+0’.Ëô±Ygùž79ïÆã¹WˆÅäZY[~ßwǃ’Ýáà \áwú¸C¨®ÉxiH¶®®Œ¹]•Í“Wñ%Â\™õüÙû»δ‹„r&öêï©ì'Y²GÄó)MB¢w™Rû÷ØŽ&â·×Dú "o4ÐǪbÕû ›ûVNë:Ú†Ö›œÿŽ`yžiiIà: äS²f–ûXK "Ö°:¨(f$V$ªž5‹×^±³â’Ú ûé‰1ì¼çxŽ96Ãr#L5Í‘¥ÌÈ& ­ÿD¡‰c°_þï~:·½_Ì·Q 6£gçvë^"K€Î˜ìÛ¸ZÂ_ívëŸgÇÐÒyšÿ4QǶà˜]à6ÐÒ®ÆègÉÄHýzʯºlÍCïV&vPø×zo«Äbt"£¬÷~l7Øi7ž¦,œ,Þ(Ùç×dzþ͇W [ ´•~çFK$Iªá´T«!q$) @RH3FŸEÁâµè½¯âžC”éµ.{-#%Î:WSÉ®óÒv:<¿[¢f\àa®í+Ȉ¶!¥ˆÚó Òh ÷g6Éf§Íͼ(£{ånh½íà³ÊƒðKçñ¡ØF«ÞÕÐýŠÅõWS:Ovú¿ÇH}ºúeÕ)½œ%¡æ™y½lš›U2>1 ‰1-µ¹¼å™w$mŸýΧGµÂNÇ¥ ‚>œ½öJEÛæF iŸœé„~æiÎ’úÎækº¶ð:É«a®Ø+Æ#ŒW{j2½êŒ—‹NŒ“ÒÅ\ĤZ ø{LÞ Á@ãÊ%‰€=Rg—„cŠ4¤Š WëÑCôíY÷8t7¨ µ‹÷>yzƒ8²¹"ú®–fú¼r_‡ßOúŸ ’íxP‘çªbó¿s€[Uß·Í"è£H yÞÿ™Ärd–fÄB/„'éÙÂñ’±¤úé¹.¦æ=µ{9êã|gLŒëro„ª¸\øÉï =½› ŒÕmë/¥‡=ÛÈË5‰Å¸®ƒ§Â.Ói¢ŸP3p«üigA~m€Ñ um¡$M¬¬¶(‹|Šë‡~þs½!PÉ(Ë=Â:&{fÏ]œƒlQÖ0 *E˜ì¶É=#U}UêEutm±_Tý•‹)RàÙ¯ÛJÛ+ñüM¼œ£i%ýþ`ÊÒƵ½¥Çw—Öò ¿nåòâúr?p…Vco˜ÚMG;zG”€k64[šÃx ìÔ”;EM7Ûd¥Pœ_~½ÂÎ=]n¯¦|–ü sE<Èë™8Q6­³¹+»Mçþg­åÏ7õˆGVAm €›‹Â†'Sj/t{tPµ\H‚[OLaÉB%–LñnR~#¤÷§Ý!L'à09‰^°0 9x&FJE=À×ÍÌŠ²â^ðœÞú¼¡é€‹\Œ¾(áÜý˜&Ͳr…¢s± âLþIpM ÏqDO|‘ÈÀhâfKò -)pDw"6×§ÓÅ{ÔF¯f´/7Væ‰dAý DðÏ—{·IZÀ:'Ûk8µQžÌ&Q·’µ‚®×PÕ /Od³‹å72¸3å$î ³P`Ap@)¬±)j1›2R¤óžÊ Á`Îfbð¬‚\_ñ÷»Ø™jÄ ØV)=ŠíitˆO –_¾}…¿†H‡¦i/Zni­ÀZŒÿíÓfþ&ÚU‘õãN܇*†ò-Ô,ŸeHêòJ WY“œköxcòçÏV võyÖÙvo!‘ŒËûjo'-{Ù›<®2vß…ÿ¯§Š° –3§{Ùö ÓæDØhä±mµt™˜Ñ¯r’R¦+dÌoeG¨‰0mLËÊCÙOÛ¾ñ]eûtŠùêD_RñˆWšVäN„(Þ\`S€”={ã˜<²\‹{›ùº%:n©8— {QÑQQW=°X%¬'2M›|¤j9÷_åö(ÍH_ðh‘È×vÃ#ØË¨á¨x±aã å*Ýãý O-iA˜;ö⤮ýRºûþœÎeôŽÁ4jxšb ;½Än¶ìàøé¯gâ~/(ˆM:8÷Ãi‘Â’uFw¹ýQ¯Aˆb&5ñkËIA˜;˜'Òšÿ*V-º …UO9–ï%K’¥Ì^)ÿP—nɤâsßndލQór¦¯A¢šPÖ(¸ŒÜI]Þ]ŒÒ¼E?“æÕt†R›åå¡_\V¥…ªÊ4£3ËËQow PØvÕVôi+á1| 8´uÝsý*“ÙÛKâñ·¾ §o¥˜×5ú0M<+{( N•i‘ê†3¹_ÏèªÇ[o•g¹E O™½=¶þP-ò!Oõ¯[-å!J‹85èû‚îš1¤"ò»äùvu‘=Ô††Ô¯ú GýÏRg#¸ˆ‹“‰XJ”F«Á9•jÉ2+¢ˆ|œTÆ“[m‘üÉÄcµ¥/^^j^Å\E$¬SúùU ëâ ?ã¸OkéëED`6eGçoÜÀˆ Ò©ú(O{&H)ýK]ù»ÖKc‘ù‹”‘Çõ€YtòÔ¸ç³) ÌL`#õ¸ÛÛMqÖœºj0¨^Ûtˆë~–Xéû~ŠÄ• õ‚Ǧí23ñ‚ýK½R/ƒ3;‘ Ð@î'¥ýzrmn9x)›ò›R¹`U¼= ÔhSüò‡È•±®È§Vµ'‚Í-9ÊÕ©Ë´¤_NG“ |7<5Öê-¢à›•‹3b/:õ ØN®¸Vï~Й³Bä®û).¤ëžT_® 2ƒBn^H¢ˆÓÁe„¨Ïë—ï/>k¤u¹‰ZjötŸþ²ËìWäôQ*•bzøÑ0B²BŃÞÌ!š×…gTÃ@Xù†¼ça–!:\,ÓÉ'¿j¢/qþ÷½,@£ýÂ+¾ )¼–UhMXf7“0è"4AUb:£r8ÂÙåHë9aÛûuë' çžQl Úüµl:nîû Vj”‹W¸³µ”ôY MÜzŘ'ÒÉõ]ªci‹Ä®ØÅXmu'µ ’ ™¶†±ƒš%î<“Qd”ã>,‰ôP³(ñ=z¡ÿN…ò¶QOtÞ~6°œˆyxXp®N㓲’x˨Hš Q+‰`ÓêG™¤ùE‚Ó©?hæöBÇÚ°©G2›ôR—z–ÅöÉWS¾-~Æ_šNl;eΠ€b•yµþµŒø#SΨù!åÝôÁ¢€¡YÞðMÏÀÊqƒï]š’ÁISiöèâë'Ê,÷ê¤'î» …˜Dð@¼P¸T:̰/M.SKúð…µÜéÏó¢LÿwYfÉ‘`x4ôª@ý!.ÜoFàÖ~¥ãl¡´§È~(|rõÃCçOÑRâ’räb@%^7¶«ZªÆ×Xü.£éT;ÿFÌ{»úâ“©à+5•ṎŸ¶p¬Õ›æãõÄk»ûÈh ă“赟>`Z&¯ §f´fež8Uöýé1&CªïOHc·Åž¦Ýúi¼0ÚÊúK,…h‹ÿÑweX$¶„¿9RD‰Ú"@m3ºíÎ¡P}sò_P“s%¤[«iC¥Iü¿+»Y<2_Þþ!SÏ&œpï‘è5Àyc®·ã ^:«´ØMŸ$q~­ d«¤Ì.‡txy*÷[©‚}þ |Û\'ú‰ª¨q»ŒÜ zÜ`ž®~¹"Ð[]O\¶›ÀmxÏ…ÛÏ¿zÔÌ„¸¡š%⊵´¶;o5ÙÁÓŸc€û÷Ñ}éäM͇‚ëñúëçö¶W(=$gL=(>¶Ÿ0­P¿ÐˆÙµºŸîöÝV„ °71AâðR³»{ŽÚ¾f?e²sHŠ WºƒEÜ06ïÁ.Ai bW# $½ÝÂ13 4zô°`UcøëW4¶‘ºôJyðEFø ¡º1ÑX·ŒÖmPÉ{Ëããý¦BœEW=´rm‘]yq¬€¸+¼U.!Ò—“Yr+…Å«|ÝÁ[—Y8~NÐCÒVòçš3€Þ"ÒÚÇZÓ¡²œ2?Q¦(8úïÕ,óËmä€T>>iK“…PŒN™­…©‘õ¢ºª=Á˜²ldtõ“Ä;Ø±Ž…v[tEZ8È*_s$‰Ö‰ÒZcšëEAW ³dÙÚU†æ ãlQøZw»†tº Wÿ»±Æ2·™g4\ö:×^è"dõ5y|ç,ûH›J'{ãáOB%ø‘›Ã_ôg YòÙ›Á 8ÐP© •TÊÿ}GX?7B9r¹ØFêž²›»…Qgs¼{§Fû,bîŽLŸ 5žDQ$ |8Û.¬‘rµ C4EÊýWïbØçB¢þãÖ6ÑûÏè.<ß)G‘GÄý{-ô?±¸Çö°ÖG#òº†3s¹úSB¢0Y‰°&‚GmÄxFÒøoBóïlO'l®çiÊÍxÀLHv©Ü²÷á83;Ùóz½þ/©¡Ï$õrGhb´˜]¡2yìŠøøeφ„Î{´hèÅÂ(Ú×îÅÜ¥_Î)÷ yï,+Ò¶­±P»d¸Ô—v•Ï¡$;Ž@‚ 07[WXùmÕ&mræé*Ÿ—[+h×¢j¾HY´Øihƒ,ø©í-í*uÛmqRò L™Ð`ÆØ“5v¨9ÙÎIÕ”ïãýêÕ~°,\…+| ÇbhÖ¿7R×QscH}@j eˆKÔ—M´vTÎëËγp§Q: -oj—š& VUÉV…ÉéÀîL?š‰–(½ø¥ŠÒÆÿÇ=–ðÏ~ðJ—·bFË6qJ Ö’ùå€d+ßüéø¸‡›´ ]2§×$ß*Nûƒöd@Â9ïä‘¶w{êø'I*M¶›1ícðX\HªÈIù"œáv6åÌœ×z3܃}ó+æÁ µ|̺¹É­÷A®æÅéý–mˆUÁ«Â…#/û;“qíó<ÙëÙëU+É?œ`¼ !šJ‡¤e¤qè&´Õð¬0.KÝÒÚÅSóÏχºNE­F ¹ËÇ:Ÿ(á[Ò?n¼9T!8Μ:¶/—ß\gÆ>5È4ÕÍÿX‡?‰0µkÒOŸ"vÁ¸5è°® ÓÆ VÃ\_šþ2~ý½»øÇÓa<‹ßlb¥èØ\¥¡WÆtÈ%šœ¼:o›“ÃK"tCzÎÏJ%I͸´vjzÃ(i!0“õP·â]è‰ô Œq:t“¿2­ûA¥ ¼5–ëÙ6ø.µªw|ì»ÙNµÚ˜:/ Š$i ÿ‚µrÙæ»ÀœìXÓ"èkÕE‚ðJ02b×uP}?=Eγ1õð­IÊ¡æQtÖ ‘\CÐЋžÄw*,ÍÑ aeÍͳ O 3‡Ü3Ø›Vq4jc©nÊ€vÙ†–5Ìrÿ¥ÑN¸çÄyXWÄ7I,Fef Œâu‹~Iÿ?gXÌ¢uyçeAìNpH¾Aeš"j;clÑÿ " …#¦´•KùZ5ºB…ñ¯¿¢._27_Â, ù#æ)™ñ¸<¦ÇAñïAÈN:‰¾ÚrÑç }xMi™ç‹è+” \ʶv ‡ $½îgî’ÏJja/ÒˆÞsÛÔ¾Tµïx£(Ø2)€?²„„mM„锊QMoûˆË@ª~‹<)ÿ+Õú 4bÆì ø¦¥è‡‰Й­†à4а,n w^ìEQâ~9Jþ¾3³ŠÐ%uF׿”|FomͤrÊæ˜;åz±F§¢,»²éîH.OzØÕÊ£×Èå ¸¹Ï1Ïw„Ĩú½¤îÃÈ6Âc0[°&÷Äõj×®¹Ùê>´8þÖ'ÐÃ7ß·‡é²‡*ý%õqM¹ ³çýB†-•åØñι&FoP¼&iˆ»4‡Ê·D3•Ȳ#=~ç¾!왲³O/œK`L@ßb€+_±ì|=Ë6 (FŒ+5ñ±ß<ÚÙ òàu%£©reVÈt­“ WÖqýJgøêµ&59²‰íŒSš3æÒÝqxœÏ&þ}N޳h˜ß»O¬àªàMŽÏ¸ ÏìHÀ µ•!²?ΫÆ1¿ k;˜\¸Þ·3É+eÙÜÈ*ºÝ‘³ÓWŒ(dŠm`o|¬4qGÔõÜ5}£A•F›ÿ?â¥<‹=R•¸ß0nãž ìÜz¼ü›¤Ø>ý5 -F"ì× |êñ™âþumƒy;%(æÁàËÌÚp1ßÑ.þP™×Ëɵ’îˆ!\ ù &Í.°6Ρ,תêö‘š{ ÍÅEDžñ«9ÍX¤ÃÂn²Þölú•@÷îCIŽ£Ýî †I~B¹)srôÏÁôâÕ¦‰—¸*3ûˆŸbù b‰¶RKî_Jú1è›k꺑õXF,Ó#gïRÂIä:nahv™WûÜööÒ„N,MÝ”â¡îŒ”u– Ý÷|ϱ,n<öçÈ+<M']ðs%ÒˆdÞ=ð”xTýúaƘûê<á µaØþÝG4¡Žû—WBQÈ¡!ÌÖ´Õ»gÏRæs{½q‘ðƘ+„‡à,õæ¢ËJký<ÄüüFA„ ùÒ¥Ôˆ¡Žp0p¯^4pv­ÊµŠ { †r…_¤7˜6’ ßS¬¢|$ür„ë/§läZ4Æ5Í+Hf´éÞ .7h…CDâcçx9Ϩ šÝ¤3Vö'ŽÁW Ya¦ àdɪJgxŸÔ‘,ÍgyÏ~KÚÊTêÊ~ý..<§2ØYþÐj`—Ãÿ©¤¼H%8ÀIta|Û«£šÇíNÎQëØ¾Ú]·…Ï­å±7™$¹²4+Dá `Å5áÀjf¨2¡ mkk ë¸|—Ä‹hW£”7CràfLSsmw\½Öï¿v¢Úë„Z,ï4žW:º K+V\P_ 6~ª™ñyÖäüI¾˜„F¥.ÍF­ó×—iL‡âœ‰tú®¢,‚ÍßùDî~ôË{Ê Â-/ QS/¡à·-5H÷k{¸ôó'$T”]lÅø Z—Á&郙‚Ž:ß‘!~U‹š¨9Êùs^*—†—®yþ.*,§Ÿz1ŠÐ—–,á‰Ñó&¤5Ç—ÿ¥ÐÁÊÌÕ‘˜ê”m-6f=ÜfX 83PÐ~U.µ ,$Ö¦ ²_[ð::E¹&ñVTçDñ@|ZbgîOçcgNÖ‹z©3Iª4n9ðݺî›T;úŒ²õº*ñ×>¡#É;f˜3ºLµÌA܈¸˜Gã ˆ~5¬5>•)=µàI¹ý¾æ‘pu8MÅïýƒñA_· ! Õ3ïÇwãI§­÷}³åÊ…þúÜ*³·S§w ~ÙLÑoy¨Õ=ñ¤œcnV°~D6î?Ë#­»P)û -‰¥;D³á½EÎÿì¡×0=ùîÑîYb/rif(é¾9»”ö§¦ÖîQÅ–­:ù!N§ë¾ý`Byìp4nà Îé“SÄ qÛ±þêÞ·šEÅEÀÍ—_Ø{Ð4@nˆ…&íÔ«Ú}zRÙfSè“Æ ¯Y@eph=¸kåŽú’¶¤o1ðMfÌ"½ý`²Q2Iw¡{kÃpÆ~­¶K/Të˜ËVNÔaÅÞc½òÇ’z‹°îXÞ2>¬è$Ùo±ÁóLF8HG(ºãÅ}ÃÓF~ÇŽå媞h"±‹Õ>Ê›ž­¾t¾?‡ˆ-ÜgšÌòC…}4Öt zxªšI‘Ô´5ŒãÑ̓©ŒñE5'פÊÝóå@ƒ8n£áu..@ "~aK#Ô¿YËT $ÆBÑǨ C=‰o¬¥ë€»Žý »@ò·C1B°¿.eJ/-Êû9ÔOet‚–¢Õƽ%]Sªñ£Y Ù3÷ïÓ9TªàØá^cú7/Ìo€Ã3)èß=X&ùáoè¦Ù¥XÆõ ÊÀ“«1 @ƒ¸™¥"\ÎÄÅíÈàèAI¨až7÷½=áp*£Æž{q{ÂjSaÄR‡Þ‚ožê<޻ӿêûWùY\)PA<~²¾'Ÿ wà$åo wÞ cz¸ZÍY!¼€l¼î«´¤T9‘*‘6š÷~Ùäò”›×®‡¨µ !Rqº?:¢]°@"ŠÐvÛmÚePêß{r¼’?EÀ%R¬Óð±’^æA‚@yx?¨¬sÕ5h‘»;ð”S'ÅK°éoGã*³ íùOöìg§,¦|¹FúôÜ™KÛû¡J”X¬ÜÚp¶œ »Þ¦` ÆØj òÅ J4+DY‚sé‡dÇ»¾¤™íA—ÝDë+%€¥.›(}¨dD.,zâ\²´à¯ZïÞ4T˜Ç©$œêe’𿳠Àøê›qïO…Î-Ž+•‹xóŒfTFfÅ«Æ8v¦©otö«©..&‘®ØG'îkÙ˜U_‹ª¿…[Ëo5M æÒ¦®ª\µÐ%tMUC_§-xÝö¼e)Où2D·~¾/Q°­s%!Mõ°•—Œ ’(ärÇ0›ƒöÞ0ÿ›4µÞCgëÂZt§ÄfšJ¶zœÉb!}ÑÁx6ö˃ØmtI{¾È%>Sꄪô³ïõ¯Ù‘Ô!ÜL¶61=6`‰vž»ø#Ô"Ý7™%³ŒÒ­¼ß’$_$8ªÿ**sAÚâsŸ~#ÜÁ OòbÎVh5‹a@8sº?ÎðoƒLA}[.2<â'òœl;Ýœ'ií¶VŸp"e¥yžä§×½6¸ß0µÞþ£LÄr±Ìòº§ê_Sí¼†—„ ¸…R{€cX Xaý?sßVè8'”À55І-šÂÏ%bì¹Aô´¡:AÙ+ìw©±=Ì«3upQ…*²ÞP¿7S{ÜtéèmZtüÓ,&`¶*+õ«›~Ö„ã‹õ1¶ŠKîÝy Ü”}1ÂÌùÊp‡¥«i ;…:²§UVª'œýªÑ\ó•yü¼*BÙõ¡žJ¯ÚAÒ(oãò^Ô…LcÂÖl‚¦°! ˆ{pXÈ> žë}¤5ú°:¦MG?ê®Sõ²q‘5‰áÁ«lݺ® äMHHÜDkÖ¹$Ê¢óžÝRÍ M(¿@Cît+OnñKuŠ_€s Že§Ýy¿Dãc#; ,B÷RÒÇJ@ˆBÆž6¦˜cksƒ}]ϾXi•©âòÂÐÿ#¤õþ«…Gúÿw@7´(~[W±H AÏÇ{c§$²møo<ñáo^U¾éG°yIoåÊ9DVð·ç·Ã«:pgË ´žåÿ#ÙÊÇx´/§L¥>&lNðµÊÚ†,[hÄò>ï|?Ù.«`Öç–´ê2áÛ&•ü‹#rŠé7D ¦ËvkVHÙȡ̱‹|M®ÅàõËu7¬C"]í'u«^:®u±Ï·Á·ÒSZ÷J•sIéíÒ„R÷€‚Í$˜Þ?Êú™Æ!„âäéãcA»“•A½—ÔqÔ¼)]¤‚îÊAµúxrÒ¼ÀÞæ ——W>¶´ot ¹\mÁ4FÈsÍ ˜[dŽS¬µá|ÀzÛ×mJĽÛëM©€tEù ÏU¿ÍÙ!ñ1eÁ[PV¸ÕŸôL©ÝQ)‡°Å•™µ°—¦˜ ŒáA ä5ɉvR<•ÆH_±Fd×zc´À€hTS̳ûtPþ Î–|6‚òh£6É `½Kƒ²63ðH1(ï ˆ,`&ÝËÁ`vP€L¯ƒ°g1üÌ”ê=(²,¸wÄZ°„§«>Ѓ˜|f#èôÒàAÖ¡iq8ʦÚe·È_ˆ¡Ë‹]1ÔèÜ pegþ}zîÝ%­­>2pÚ™#…•‚J´†Sº@݆ÇâA»É+Y<Ëš t‘ ôdEa[eTõ•ÂÓÄÏÞš.S‹% çC/Øž8òcÜoEBâ^…‘õ ËbQάO9ü…ÑÐrõÿöLï¶ÛÔáÈ%à}Ã’ƒ¾DÔhz…#(75üÓr$¨b.§0Ifï~^˜fÍ}hZçVÚ‡_Y0 ‰•h=ÿû)QlÿÛj˜ÅÙ*êç[ÐI»óx `¢P>f3õmÍD`Ieîd2Ô«ƒpøúÕÒ!óæ“w>}Ø<ÿ—Þ ˜Ž -³ñ/ÌB·ÆSB úT´OvlºZùÒ”Qn¸§ Ö²{­Ö:61Üì]…–3Ïóý„£)Ã6ìFžw5Ò+öM\/¾lÏ›ûU{1“wú¡g“$l)•‹ [ôg¶îTÀªL×g% ãÛC‹¶±ŠUì‘w!88h¬wlÝ—¤#„¸¥nL[¶Z–­w.éþ7<»¾î•»›(PÔRis£Ü=ª*šFWÕŒN*“Huô²­•¸8—6zÂ}غ“ýï+>w°â¨Ý„†e.hÌÀ±ÔÒ2dçaÕ[ˆN¡ºäZ䯮‡}Ÿø Ê3Ê0Øu°fíeñËÔ¡-–uï”®{óÔpòÁÌšã_éCÛl´"4ÎÃCcD×Z؈gº3‘ŽB‰x‹ŠaVzZ˜ð§âé]á÷ü;O-iIæ_›Œíå Š?è#Ëýú…æÇCæÔ¥E«ÂˉÐéNÒký>m¡„·ÉfMÜvt¦tTcë#ú5‰º'ÑfXy$“ñ娭&‹Ž¶vm³ºwÁžàC$ùåq`ÑÛŸ L¹àq¡ uÂÏâÿ’ð}øÄc_°æñ~¢8ÖoR‚þ¸aDiZ¤Ù1d÷Ö0#ì3Å<‘½G0l~:Shä¶»Þ›¬uT¨ï‹®¬‰ÜO=s³^(B¡«G ÔXáfl`À¨ÍÒ‚uD$›0¸v- 7skf”ŽY†ÙaíÖ]°†Ü3Ì7RjôÈ®‰ûçÀ™âæf™%BWéNæ¾ýj…Éc¼îÄÛŒ¿½=N]" ³þÀÕ°MÛVO uuºÑW³ë¼P»aíºyêkQMš¤¯Ÿ:5\V@…øÔ"İÞWvVW‚bœùêWÈbó5öÓT†¾ôeäßóÀƒó_!Û—Ñ–Èñrù>žÞÿØGèxׯwßÜdi‹†”áÿé [µVU’Ö”+¥cWµœ<,°O…ת —¥^/0.”¿æ=6úifÜq6¸DwÐF׉×û4¶¨ ®.$jÌ™·†¥ðPå;uܪ*ã·,»Ã>ÉutÏv =õÚ) ÿ´ÅnuwOñ Z³zõª¢sÝ/„îÞtè÷ßûë.så³W4¬MT£Ä:ï·H&ŒìuÞÿ©söµYÕ¥@}¹ÇÜ£¶Ë ±Ê–`¯p¼F$ m8Y<²W¸[ ÙVï]s E{·²WŒü8ØÜÝÂ6ét ¸ŠªôO&¹z¶ï múÛpž« Æß—ãPL ázø62n4„Øç w›Î¬iwÞUo•½¨ž€ÉûÿÂ%€”`Ùqew¶ hËF\ÂŒ¤,Ey>RuÏ¢¦‘f”pZ™’òÆõ9cÄ2öänš]­ƒOæ}:ªõF_î'Þb öÄëÇÝY—Æ7LeøÆ—IátM/Zy Šç8àö¾Û8,xyÿœ#’Ãfß;OR_8ßðX—ž¿=”&·$é*9å®ZîOï(¢Pu;‘U ×aiJõÝÿ'Mg7WìXßY£",ðdtí6á#öM\m1%Ìây\éhlت¦"tÝxÝÉ#q2YA•r°é¨þ\(|Ÿ€ëïrÏ® f¹Q0 ° ÝõO b”]›{*cybÐ;î½SÍF€9ýÄ ŠŒ†dƒ`®Ks ÞÂàÔÜoižð9O·¶ŽÄÝÈm­)-¦pŸ¯“ª]|0~Y;.:Eþ€•žú¶9Óio´ˆIõåÚbƒY\¶‚@~]./×rŒEÈ:j;óiÛ£6åSJÅÙ€ôfÁlø·‚JûÕxšäÑØl «B&< ÛbÙøwD,|šüuž»¾¡²d§Å•¤½Eô:‹6J:ΣðV"›6ûœh:ºö"œÄ¡ø/üœÔ±A!K»@€˜¢*‹ˉ‡Û¦øU°s¦ÂîSà²BAe—*}Ô4ûÛË¿dLÑÑôx; ’wÆÎpgŸ5v¥Ìþpó¤Ùr/_?e/×y>ýÛbQlbH™s­´;ýŸijú8%ÛNņ0òànÑs'K¡·µ4Ï~=ä2YJæ¼<î™Ì®:¬z‹ú,{¹èzRÐïÍDW9ÇÄ.:(ëŠþ·þy§¤yÎ{3»¾\F¨f5"ìï¤%z'F›)©.Z¯ìà—)5ɳ½¾Ú>G²á`Ô¡Œ$ç8H*9µiÿœ(S¾~Ï4\ư;°ˆàŸ{]ôM ›™ "ù„ïHö…žœ­):VvEÀC)²0ûK9½¹$`iÊð*Tõè°Å!í ‡êÓA =ñ¥ÃBÉÌæñ&ª«ç%X}ÑŽ<Ï 8~Œ£ Â׊Z%{.£QÖèGã^þ$ÓâÜ‘×lPg:^ãk¦Ó`dI+¿}ߊ$kp†æ§`|+Ï| t’Òš|zl\×ãš"¼¯YgݼSA`˜„ÜÓš•Af>‘ ùŠ’ãC—H]QR7„²ðË@ a!dÚ<ó­vÌwJÉô1Á-5;‡ûªÜ⯊[5™‚3üìrº1 X-"„­3JÏtN!Þ4€\¹¿‘“² 'Ÿ‡ ÌÃWpTRËÑýÍwÒ“¶¿ßä©ñ#¿õ¢7Û=4;^¯mÊŸÄÃ@PH¢Zë–û§j®šì%nuâ+çmýA|ÜÒpxB%û“GûÓ Ð·å½) +4ì劯ôš_±ú—7hN߆²†í1@`6x˜(ÍfIÀV–aªßÐ)…?cÀÊ»X([l•@nt:ýèÀ‘ˆyÇÓ¥6JRÅ€s…~òþå©‘W#1Ê<öÛ®´ÍË€KµåT«ÚH±~aÝQA/~!¼±Xd°± ®Úë̇N yÝׯ¡u^.ÅϹ¼eŽ(¶ïG{G%ÃTµc÷«Äpy2ðÂ9\¾Bœ±)=#ZÈRKü|ŠŸmF¤ EAo±T.ä,mÜüLAÐäŸhͩǡҜ¸†­§¥Ñ4oP,Þ¥)¼¥_±+§Ë´!7{%žì ·© -Gˆµ—¬Ìóåá@VKŽè{pr“h~ÿûÍÂT ·Ì׺q¯‹?q>iÖ$¤Ï˜$Íž¨`ö—Ì#$ò>º€áËŠ§¯ ¹šãz„ìÉП>Á.¦Ld§Èdù¼õ÷«g³ ž†£\”EKâ˜yôGÿ|ÿ¿õ®†6ý“UuraOÕBÙ’*ÇÌÌ©K¥6Gn ˜C± Çÿ‡ý\Qï°®ZüƒËÙ|áò!õô˜m?ê• ´V)*õbõŠY¢ç;5½ñΠ՟⹃UæüVüöœ@¢N¦Úc~hllBTvüÈv8}X„{À=™¿8ø%ÖšÙ×à6æ à»éN"‰8ÂmP Ò[퀺'Š"(‰yÝÖ{ò¸é4ËñCÔ€ú9õ½ Ì0‘ZŠ›Šl([Áo\C):ýªÄŽM-j #!o³‚©/ŽDÈ]p=D帬½Á•ǃµ-´‹flЦ'tk0,'O^§MËŸ£5ÃÔòNÎWs£rQ™‘»Þ&C‰ÚiÈ’‡ƒ]f€x_üGô¾`,Ïõµ3ˆ-œ8ñ½ê®)ÐÁÒêNápgÀj¥]òmD)»0Å&În‹D0KÎ]µËî ùõj1+h“ên°ubãö¬]Dï…rƯìì,16«*2¤~ÌþœµÁ÷l†ïÀbk-|ê–T6ˬËÀ¥t>/`E‹­ ÒÏ‚KB£‰y /™u=K$Ç”Õ`E†mzÇÁziûËzµ™q8z-ÚÛU —üÑÿ£Û¯Rö ¼W¾¿ýy v6-‡CÿK¦Óh–uáud]ü-DiËøÒÝ𢶴ärDØ(H¼ê¦ìžWÓÝ™JàÏ´6HyÜJàöG)ô̯Í×øÍâ¶ÁfÇ-˜¨¨¾{„…ãƒÒáW þÀŸRx„ª %Ž;h;AöwZR£3 i9>ñ: `(x†Òn48/’ÿ}G—´V«¡6[µR§¡ý$ª%¨œV;pÄ|)³Ç-¼lù¾²ïŠ$š‚€©ˆMm­T0ò|ɇÐ){¦Ô×¥>ZvÀ2þ‡Êpã½¾Ëì—k()ò‹LIùîb Ï€}¬yKµD7[‰·iºC‚Eàñ0’¢¼Ý®n:M[I¾EPå@ìüz^¤ÑcigJð1p"×b¾# `jV„½€ÔY1‡»“$éãíø¿!Ü6D¦”4À–Li$¶zÚT?5 n^OÓdÝÁÉŒ©'**͉ºB3‹%gAœÁaâ‘o§­pÒ ]û†X=Pà1F.d< qµt@î9¦1üã;‚> O¾ÇÄ$ Ô€[}o›núFÎõŸôhVo,é.„™Ö4ümOhðÇ‚¨¾ÚÚÙ/x¿“óye$f^Bþ›VñÄ\Ûƒ±gm#ÍQ0Ân+1Â¥±‡âG 41¾El©B3€Zí½ ¬…‘£øG¦–ɱ¯Ë¸ËÛî‰icce؈Ïã¬óóéûGš~{‚‚r§ès íÙÆÚçú¥±P‚/wÔŽ½Cኰ%¹vÜ/œÎΛ 9÷¼.6@0ñô{Î`4ÒÏ‘AçQÐt:±÷“E`ÄGä¢+Mn¶ŒÏ¶¼] ×ÚÃõ•gµ?Œ‹<Ý›åˆ>Éßmñ‚¢_^ׯHCÏÆ s¼Mvíh¸¯70§GÖ %Ã`à‡¥üY™½ ºl(·L„ërÛXòWÈ!¬*dáo’¤Îô4¼³oº#ßlGfbÜ>3›R)¾;Æmé@˜¢¡Ëë7r&´ò¨e?[QœÒ“g¢%§ÐÕé‘ÚêÍqüÛpwÈÛÅ:á80V¹Â­†þ)囸‰¥ÛG߂֯Ð*³¿[V<̾pÛ‰çÖc‡›={_Njژå^º/ ï)ï’!;F! !µdVÁ RÊÄíD@Á¡RS†žpô_9–ЈøÑ7ì%¢PCJÝŸéË¢qØð,„ζ˜Â®cù\nŒ/ûÉt’.™!¦_2Á5eìÖ_*¸‰˜$»ÆT/2Çf£#F ó^pé'Ö‹CDë¥:nÁ ](0 Ý1`»ÊåõT´ã6ïþ苊u|}<ž÷Â=¥ ]«Já4óˆËþŠ ¥¤uË:>žU'xíûOnëõµ&©‘kÖù÷¼1ñÄÍc£ùØÂ.¯,åé‹[?0÷¢4èË#°%¤>·maÁOpâf·ÀF˜à|>š»7÷×÷Ò+³Ç9Ü›ñAÜñº ×ÇÐcèò¨˜ÒT ݺI ÈIÑíÙ_ä&Ý rADê|3ë β/³ÛCòГ$OkÞ³"£®4g\¯>6i…zlæõÌ·žeÓ êS4ßÒEpë3Â@n3ñèÌ#ÌNÜÉ¥:Ä®à CŠ7Á[…éûg3©œS§FG-Í…LÝkžhŒÈìfgL²ß~¹‚m+Ä,Ë45†­ÁCô¯ VÎO ?äˆ^l¤Õ©LCáÂæIM¨Å}%~z–¯µ§8ž‰Éè,B›ùY<‚ûmÜ JTÌwº&±‰I±$0ØWÛÇD©í冑Jx¶—Ib·¸¿¸š’¡÷°oz¹Í…fÎK¶RI5S  ÛæâÆü¦9²3¡É;iÚԨͼ/Z›Žo¤˜ÐLÑÄÜF·Õ én³E°³m+‚J ~}O"2káÎÄ-%QŒ½ä7ØjÿÇÞq3Õ¿‰1ª ¦ïV‹i­åO·µEŽˆySB÷ÐßîèASÐIÖ’OÚ0ÀY±——}é#ï×¶ˆ·LšùчÌnI£Ñгvœ{$ H$#¸<ä¡VØÚ–îvþ00ýUüK6éû $8í –üØ U†ºËœÄ45Œ§§ØÕ(³èMn˜¸~TÃ\Ýzœ )½TWühÉ;ÇÚÈ1GÈNåÑ$&]ÖúdužúC"ŒÅ[î0xrµ3ôM5ÅfˆMÑý^ª"õý÷$“ŠÞE=ß ï eúu”ô?COaG!^•¤Uëo?Ö"Žø‰jª*ÄŠØ,±z® Ó‚Í=ÈÕÄ„½uÿ³¬ £Ñá`vÞƒWþ…ã6ƒé¶ÂÇeDJ7…eHø_•Ún‰Â-¿ ÈEIJóLTæ5Ç‚¿Žæ1¼šÄ Ü s‡’–óØÅ²ÐÐ_J¾ØÒ”U¡wÄS–Ý@²_’{'…y¹“)[@߀²ã²&z¸Bw§³çƒxu}T²¯G vÿ?T+†0È·¥½Ò®sQ=ž§÷ÖU|ÂõëÖÄ­ôE5`÷=h1w#Àð¦÷kQXOiaŸ@;(ÅÕ„>’4‹µ˜ë§d•Ï\CáMïWŠås›m?užd¯œ=A§(öÝb§ý>4aÉjb™„0S«ÁKsÈÚ#*<0d5ë<ÓñÎ0>!"á.•žJT'!g\çQ¾ë‘Ä ©HäE­WÎ×à §‰‘OB6¢d{ÙÇë †Ÿ‰b¸A¯ß!ݳÔPçú ÞŸ1Ã÷`øú.ôÀÕv GÝIÖévƒ2yU Œ4ÜövVá»5æ*¼k«ioÞîr @šðÜ“¸+P–£Ñ¾íw”hô˜Wð 6Ó¦ìV lnl¶ñÈcLe³DÌäJ7œ³ˆ“ƒC|<•7‘|@ߢ´ïÎ! ³ƒ`DÍŒSuã}C‹v±ÿÿ³dMkÂ[«¤è ÄP‹A‰‚ͬ`?Ïw˜,€ô¾÷ýCûÖM§;)d¥Ì„H.uð¶ªG×Ç‹£xöí©~¡¶ª°i¡IHe`˜§ÞI%H«V? ýá'ˆšW7R9{Ýl̘}æd¼ÊTæÑ|JÐ|0ž<Øk?¢ŸÛÞ|4{Ð]ò[îE²ôKõTšâ6ñCY{o—vÃSMÆ´8øªq£jcmê3ËÀ$ƒô±¤¨B!Ò+…ˆ2<ªEÙ€jàn 2mk³©,ÍP:¯‚ƒXž¡Zµ4,T<Ȳá4é*2Êñ˜ S} ×wfƒP3´fºÆö†¦ßªã>< Ñüò9~Ÿ¿Ö¶.*7O,ËÙâöí +–¿úð7ЛÃ…THü@¥’¸çá@š¼ ZÁfÐøÈv,â@ìáEʸ^þç%0Ô³ŽbØ|õIÕ´>»m§à.¼ìÊÙÞ)ódÉý9v.ºhÉ-Îë›°?4D´ ˆ(šX*9J´´…ëÒÈ ÒnôýÇ{qJä±/…‰‘·.VÇjý'ð®3Ý:ælìáŒ@à©c€·r7÷´¶jöÛ¾.µëE Y ÇÝê ÔOLo€1…åñÔÚæÞ©õåP­$Ñ:Q0øCЯ†ØC¸ré(åø= U‹¢ŸäKÌ—CN“º§'ÔP‚½Ôy˜Á1Ïni¨9“–ŒMûž±½™¼"À¥×”ÂíÄ{ó ®KÍI \º¦Ä=Er x)Î;ä¹Ð£Uð$_+—]zyÎâÏ«+kàëÖgä3¢óבt¹­Öš˜Ìù✳¢e÷Ç÷1m„®Š…MÝÃÞEøøÞ°Ë¹k¯¥*QâØŸgÊBœ‘ñO[§ÜÙ@µVø'`"N† ý¢Å“‚ì"þ¶ë $°•Ýc¶‚‹º¤Xìµ¾du*¿‡e€÷°– …(f›rXqbT‚þéðYót "9:ˆ ÜÞ½Í]€ã•œ×%ú+ð8ˆÕvi´òÏ}LíU0 âÑv¸§2Nys2žŸ•OCï-Û4ð]Ê-æ6)y0ìöoî¡8{œëåÂWÇøF^qì@öýТÞûTÍÁgäò˜ò¨¶xSy<(v>§Bwu˜LÏj†ÖpñiŸ—êXàÎLeدáMŠH›ôaÛ/¸ï⵪’''9ù’µ4\“^J+ü¸óNR³I86á'6r…JéãÝxýPS=(›ÚÔÝ!ú%:8ºQE˺Û…cá “ïÈMž|ÍMd›ˆ3û`šÎàPý JÂÊ"°Ã7_í·rÏ£ß#-ùgWX»9ë·N’%©A½ Õ£ÍÂlîV&v¢0L&P©’& &•gTň;d£J–Lö5|ùÍ%>;¨Çªëd¸Ì>*º` 6:~¬F–Ù]@âž·z¢¹E¥t#¢lß_>±ÒêŸ^{6 ·fÎIªwÖo©xÀ(äÔÕ‰Ö‚n†Ô²½¯CËP ÷ %GvªFDf§»Îj¿fUíÔ‘©Ì(÷çkC5,kƒäø¨²u€.ã¬'tGU×w#¸Í› .2B|óý¢cÐN¥ÎøwvLÒ:‚*Å/Lþñ>zQË6²˜i¦ŸÖ±âßPSÁT ÌU›tHVä{žÉ‡ ”\Åø€ñOo3Nv·×¯J˜©<Ñ’.n$ªñ&ñ¨Ý¹Uñ«r·/´Ò-ç/ȾÓ+ya=¨ë¯ÕnH·­p·?¸™£`˜êQÒ¿ÖS‚ñýP·Ÿè4Á»}äø•<÷%ÃÚ²÷\²e³~ßÉUêöÌîå(ñ”&M•>/”mš®µ0dSv~b|ïÌÅóD`«S‡c_êG}`Þ“Žpµ5ŸÇ»ƒÀžÀ Â4ã»1õ Ük\Î#¢f¼Gd½‰Wå_Œ=ɃøåýYðÇó7¾Æß'YÝ×y¸Ì¨÷0¬™‡tÑkê2–ì8Yî2ÇØؘ@žÓ²U/–ªwbpt9văŸj²ÀUÎb¬þ—+ö€u[Ó®·Ã n„=•'¸iµuÑ5[ãóKdîŽÇñ›W=#ð½^ßÍ$eBÖ¼Ûðm;6Ü×s“y,ú¹x¶(ìu‚x^MGá=e•5ÝÑ,07u<,)öhe©Ã—žw‹¿F×U¯€Óî·9y­ìµh[ÓKÆ­ŒT/¢0/üŠôwe¿™»®$Úû¾®Š‹ƒ0/›I}7ÓÓ¹ Åç¼½L¾p°#_dRìÂŽYü–¨ÐM$ìØ¸¡ÿ3àÄ6Άj“éí’Îq“ÚðAO’x†¸Å>O±¬SÚÝ… ‘uOXäeZq*ö-8$gzާ#žÈ¼0”‰swÙrɉŽ&­ùM’Õ뻜r¹mË1XiRÑ;ƒua'ÖtÝØZé{-B²ù:ÔmkT”©…‘†èÚÓ®_W²°mž ¿8"É <ÿEÊ ïE%ôÔBß¶=1o§€5á6úÑÉŸMûeYA€Yø¬ 1ÄEA×yh·±ýÿpTD¿ÛÿBX_™È%Œ'õ¼ŠŠ³HsÇÛÁ<ÞSC‘`… øÿÁQNíý×Jâ;±ts ݉ľša’ñ„8ÝðH¬jQä5©*Ë&gï'á{¾V4»$K#™~@ÇBžOìäâYKpû§©<{ÛPnãAisžËÍ­÷¢i›"ÃÂU~Äš‡€Í_ô5˜ RiꆧLÌR,sª=Á©bª©il•û‹ê÷„TŒ”~s:.VMËoÕ‹`fTÏq˜e"¡Ùe»+ÅñÌÙUíüÜš’–§ABrß´ndLët’›Ëço>…¦L¦I[ƒ*ûâAs:&Và¡‹³ÃÕÓýÆ/[ ëñ¥ìÍßÍ ! úÆ6;KƒÈwy›=àøÓ• ¯ÄKIõϨèî17Í)1óã¡ ¦¦—œìÏ EÖ`•¯f‡Cô24^©?ž6å8þ»V|ÕmV~ØF‹?s²ÐuÖ%.lZüŽ íq$å+Á$Ç\æÈ(ëŽÑ1[›˜»^Â߉Í;ú×/t¨æŽ•,¤„wymFùKŒléË%ä{»ÁŠº ƒöNgOr^bÖ0›EçðÞ‘¿s ÄÛ»5»I»¬Š5{,‚<Å× \«‰l¶«÷¬Ï §ÿJlØzéú”J­Î—”“‡ ýIÃà~+;PUDVXŨ¯D¹baüƒ é$5XÕÁ1+ÝÎSD{0ð+c)»aMƒ~ø´âqR("U.Sùˆ¥Ô× ?ÛWl¹÷|àJåNqžL¼î<$•\ << ·7@MzØiåi¡ÇµX*æ©Û ~Ø>cÒ'va*ÿÇF¤Œ9òT‰˜5aC…ß‹çT„¨ ÚÀõsi»-¦·š†68ìüHå-*ÞB¾Çt/[î%ÒäG“>j—0BÅ$¯ñ¸½]ü>‘fmå'Í#þÄÒµÞü×(´íüúåãs ‚Ee>ª×á~¨€—|0쟾jÆ©/l|j‘ŸÕ‡¹³û06uk.@Pù@Y ≌óäëéýE€µ…+ÄcÒò[…ý¯=5*ô82Uˆ ÏS³ !“&…Ú´¨)tÆ g¶tDû{3sÚ”œmRé‹Z6N¿*[yÌXÃxææ†žÒÓŧ,õYµñê`a„öS6Èà’1G1ÇôÍœŠ$ãøEf.øÕ¹¢ÆË¬=ÖÀk¤\Lp…žÚ°``¶Ù‹PŽÊrÍŠ?P£ÄB2†@˜àbÅÈp­¼þŸ/€—$+Pr®È1:¶µâgÿ4"7]²ÀXl»š ý/tâ­Æ³,Ìç•%]%¶Gáí|0(aüxÝG¶#¤®KsÇ÷£Wép+PªÔdoÌXñMèÞm@Ñ<³>$©—±°VíF1ÿ•8Œ P‰&JˆÉ²  kÜuó¤Àᇲ¼íÀ0¿¡ºk ¤îÚ‘›=0)‘£Jáîý®FÒÖÞ1·÷ËÐ;ôã/¯žÍ©µ>{ÂÕÑ ßY„¨nd0÷PÙ´òÇir6 Ý—Ô&@Ùý+óì°èÍ“2ý}@ól´»ëàæi> º O^÷_7£„˜®:ïÈVè05dYp™éÞÖ÷\æÑ£<£H4Ir²YÊB±L—?6XÓn» ^7¿WÖbÌA]:âzçxüý>i2Ÿ^qLT‰…Ó¹÷ !fZöÜÁ¨‹Z¡Â9Ó£úÊÙ8:ag¡¬ùÖ\ý¦\=f¿J4ùî8ò“^h»PµòûÑu9ñçª%¨ã“3ã}‘?G߯ “¾AñK¦¿È`ušÖ‹~vâo5ÍVgýFŽç³ür£_¸ƒ¹ÃèR‡ó?!¹&w5N%Ī Oè$?‰9ÔýX’nž%§°ˆÑµu^µ‡º˜ð¥ùAp¼ üøm<ˆáŽBá.Ì;Ô\¦m;!2¸õlý>!é¾°»µ­xF\­[j.3ç/5N²×ϵ®ÊXT¾Ã&¥7©‡'¡àœð‚¯ç$E›F…CFú#­Ñ¹Ü†°*EÔߤŸIÏbš³?Ë>¶²ÛNÃ:FÕ¹Ü]´ïdxľòºOàsNyØí¶$ðW#|YïιT1Ñð0{f9€X}mD1ÅŠ÷=uÔDM$˜Š;½\å+Ÿ筎—ò- ZÔ>QŸ‡Z9š=ÏcêøÃC˜ñÀŸå˜ 0®¨x†œ18ï;‚]OAI+B:2…iL{6jZš”ÏþVƤöb>$…°ÒQ¯²‹z#M£Qin*¼Tªu—X¬µK›aÒÆ¸‚Û3ôP½JvÛ©H@Ùø$´¨ö¹Í¨Kó¯½ÜDÑ Ÿòèæ=Ækqu½·;©c;²]¼‡Ð04Í~Á¢®&ã2 lK}ÈB¡j´ßt»Ô\¿Z8vhÔÕOñ¡èFâ^T8D}ŠÜ&{@¬g6©-r«È8B–\âž4‘‘=z‹è€¶€A Ö•D'~ç`¥©õ} =¿K-ŽQÄ"\e«Ð¹-ìé!N¥áÚlÀ¹.SÏëKZUr€u¯ tÍIÆA?Ó˜¶íV[nh"ðèÿuý 𦬨c5Æ«ªL%äŽ ^ë–î;õX˜#øxŠ_MÌC‹VW½ñƒO5X$–N ÞD8ÿn:ËÆjæëµ„Údtü¼*Ž+…A۱ݾða‡oÅ«Sùq^ݱ߀ý` Ez/g^x*¡>¯1-=Ì0ˆ4éßFüyfáþôy5…š¢2™ ÄЧûê¹2êÙ(]{b޲6¨"fõc¤—‘0æÃkôTÞTÀÛFÜY…7/3CG«MêÑ5%òÜÖ~P*»ƒ ?®6¸ÛÒLBL݇?žÅ“«&Ò1×eщ»Í+¦1‹Ñx;gÏ&E’’âÌáû!ùʼaãÁro£Trï¦+ïMøÿ‰Ê[z ¶4éc‡3*ßÏxúÚæ4|7Œ9¬’O\Íç#k Iá! N9àIÖ¦–’Z·`þøÇ>…øþ$Èä:ƒ¹7#•xÁ3k ÕDMÕ“ S#Z­gTUÞív½™°€)pî[?@Ob¾2úñ`Ì®’{mמŽGA²ºØrr‚"“ï{‡;B†1Âøüö”+½ ñý`0åíP“Ÿ!…’ &…àI«Æ;9üJÀšÏ`ô r«`Ç˶›õ¬u3 Ý{¡¸öúÞ1t 0“Nzsv,PÜŒ|øÁŽÏÙ°ó•¹=5k3IÒ§ží–¹nÓxõ™ 9ajr\Ï¢g ƒ´qTþ¾œXŒ|`rùZ÷ró6oîÖ¢R¹Êtô>æÊ1ѵ\Q×ÝY"TSÏ{C®ß. ñüBZ—ÂS§çzaKJô¼H“&ÏDYhj–Gä”Û{$æ?ßóúpû¿Óá— G¢§ª§ÜmÉ@ìúÌü³^¾×¼ÖÇ]‚7´Þª9®š\¦0Û3åTˆµ4ëYDÓȇ/Â:Œy’ÞÈßóÞVrz›(¬9¶¾TQ¯µÌ$y“Úoìz´êÆ‚ì±^ñÓéqaƒ*±ôÀ‹Õ“jÈ‚(_ý¾€« °/¬<•¿é@G9!LÁ³d×ë}AX YãYø³3wïŠ~£%Åq8ä“pœF3½×Ž”¡”Œa&š«òÇG;Lݪ$:û+4Wýb`Vô…µ¼ç~a§6Æ­àÙ®ÃÓDpy߃A5aGØñð‘ã,&—%baL¢û ÚnèbjR’¨¥„![u°O;üž£6±Ê\*<,KGÒ•¹Nétùoå·éœÇ 6mér¡÷¿ïWO=a^œÒ˜Êåоš„‡9GK=þätˆÁÑíΊ©çÆ"”Ä`@!k„“"®ž²pØ©_x W¸½¤Ç©9:.æŸðÖÁ…8.hp\ ¬I"è'ÀU8W€üJ¨¯¯+þ‰ä _Ç8¤UJx uIâÉÛŒB( h%!•l.ìOùI°ÿ­wà•³Ž¡&.Võïa¾‚¸°&qÀ7Ö£6ⶇ, M—.¹úCâqq#l+…ëPh°}9 N¯÷€àxØ(ƒ ÀPÛèÞ “mâQŒb™»ïý@[Šp°2bîEĺüÿΧtèE|¿„ñQ[&çßhÑu²ºSGÃ, nŽN\ sâÛ˜çóaÓÄó${¡¶F|ðö-¡Ä=ˆ {çÏ(³‚RáßÀ°_·Á4ÝâØä#—ÒÝ€q£Ä4·E °(Φªñ ±ô?œ©ß%°+A|Ù‡U.M^Ú$ñ#ð–j,×+2Œ›™!:8ƒ¡ö®)ùN:Umv>2ìHøªi¬ eå>ºbùN—ոɭãiãó :6‚¢J„%†Ìãß:>5…¹,\TqÄûßêîU¨mÊj^¬›¨2š½E€ ¡c.ƒ$Á¢P»ÓÊZ$OòMôm^Y6"Ín[e \Ÿçvè§p)"³èùÚë»—‚ ’¯žŠ˜B#„«c¶Ð)e¡°;Ánϯôv›lUÚ¼C¿í6à'€úI¡7Ë·²Ík½­òÝh¦tÒè>㓪Ñüb–2¡†Ã½à½,îŸ%n,íúyõ­Íë®Õš¼­î¬=-v„¤–ƒ.ª$Þ•”††Å–£êMð™•fÕ©R¹§AH+EjFz˜þí;’!"4ú¢œ`Û•”6Áë¦ñò##­£¸Ë{àóÑ}µW X}G/Ú3i?4Þ·}‰îíQT:QÖ©+} ÍòY,2ª”Cû÷OêÍ3MŸºvší=ü™kcÚÄ-e‡+~Úäôæ‰†Ñ ? É©I?Q²Ú¬ã¾]!Æ;Ò DþÑÏÕp Ã ÞE}-”‹:lÈ4Èq¼P°ï4ºçô8@wÓØ6[GÞÉ^óé[’Íο–`úLíà?]ð蹘Ÿóù™–‘w•îþâÕ¤ðße=A‡ç“õÖ3 ±xèÄ>m¤„ÇO ¯‰}þÿ:Ä#ª—ÞZ^n 2<Ó»Æ(°Ã>¥pÈn¾vbDܧÀë×%p cqé!pfŠ÷Õ¡9‚èÂIéóÔR{®—ºrŒêæk¬XUŠŠ¨+¢çº!‘54®C1òÚK=Iné·p-žƒ¿­˜Ž*ªn´¢_–ÿÏ€Ÿ ì3ÅÆ¤“ì® ŽŠ[“LwÀ©©?%Ò l¾¯¢ o—=AlM)9ímbÒNEÒËš~«z¯­vKíþÆßž¯àmöš¨%‹jÝiØrô‡©?6ÑSöâðr¼ÃQýEÑÈh¸(‹—¾ÇàB†È"#0õâ×OŒþ¦fQVâ[N»Ö áø ·¦˜öðeéÌ3ï§1Èñ=ɹ‘º«ßžGù‡ úÔÏ™µv*¿íÖ\d˜c 'µŠöÞéñ4`˜íÚNþ½¿˜[Ü´&Çlï_-¿ÜÀ֛훴pgÜl\²RâùI•µá},qîûhjâ/þ±ÑŠñÉSW"[¶ZÀ¼Q9{:úÈ9Åè(¯,Ûoß‹§³0.íGÞŽ…ÿÚéCj÷¯Ä1×Ñ1² î4) œ…þ±ø‹H•VK>°—‰ŒGgFP¬$;Ù:Ê& ›„†|zL=á)‰>zªcÛ§á½cn|çÊ=@·&'æÛf‚hžé ¬‚P_9PÔvì¨Äž³©Íì~¶+Æ=ª!+g ÷m •?^‡6Ìж8÷çå› !fd|¹iI3ý.ÓaàŠɦ˜0mŽ]wõn¨~ó%€æþ` í ËCóyà•ÛoœGæý ñêi[a>z 'øAá,Äê¸bž,½Øè®h>ïþžœ 4¶Ôq®|ÙÈ„$Y«kVÛtTÞ´}ïa!¯Á=y£~º„*‡~5²%fl5ÿeónùÖ‡„lÔôÌv2CÓ£¢¯ï2g_cA#ék¨ºH«½ÉÄõQŒ]E’›Oð{Õè$XGòi*‰©ƒû®Ž8•jœU?‹…¼¨¼%™ÙÀt©¦þª‚ãЖ¸ù:Tk*+Ø‘w6WVãËþ‰9ýPó%Ï cÀqÀþo¥”ÀÊþ{ar‘%ÙHPTTоu“)ìÆMÝ í«w°þ½-bx¤œJ©Ä¶çÃæô£%æÎô«æ ‰ù‰œEµw |äˆñ‡+PˆÜMm"›à8ü“¨5àÌG VPýI5ûÕ`Ú.Xè'ºõc«®e;óhUP÷™³$¹V=nâ\hÖèÉ’íuÉÄ8äûdŸÍ]ãðaCj\sJלè¹\ ¸Ä€•á’ûîhšÕoHŽ÷Új˜°L×­Ó伕:ÿ¡x áôoǘL©œ“ Zƒ4¨kœÂ8 ¥» —ÿb/V3Òà5vfëÜ9©ð³ ¨š"cù£……›è™ó™›¦Ÿò>sÆ–óÃ5»†8=­2‹Úhiü[Q`Y7•…okÉ 2)TzcܪÛu×€S6Ž+ßa!€ =¤Ä9­øéá²è ÷°˜ŸãQô™ùAätÏ‚8èŽôãñ=ÖtŸšõÖ n.„Ý7XÏÏ¡, =N`˜‹³Ôœ AšÆ¯Ó©b+·übΙ kÕæbŸÔÆ,?1éoœh²ŸÄH͘y‡YëÌ'òÈ€M EÍC{3DåI*þ6!¬¯\\]´…­ó×4Õ©µ ±Õ¿Rê§–$½Ó>#pBh}zØÛ¸j–dJ}¥æt©?i¯îµíS¢_F—sª(ƒ1 àÕY:Ü–W’ÞÆm©â‰Z7S²ë #ñ gLƒé–ªªA5¹r/yZõì»Ü©L„Dâ9ºÝsÔÛ[-ljå™ß=^¶P…­Ù ²îùYϯû.…£|ޱ« 6†Ì2ë×- ’øí߃l¬&ȉ6·j±¿³dç~àÈ2™ @|Ø“y#Uw#9ŠìïÜ xvÌd·Òsîíôð”u7O[@2ŠõŒ´ê›:ñêÐíWÕ.øº‡q¼\¹ð½ÐÑ{ÚÂ}*4k}¸V•ÒƒzŸßˆMÆùQnw»´y³Aµä„ÐZÑæ8j*¸€®ˆÂe,À¥sÓªñ!3c³¹Eþ8%”ÞúSâ@BÃâÄÑ•H(é Q‚Áä¹+¨¶<’46*òÉŒb?;-§l·xJAÑY2ü²žŽ¤m›æðÛÂø°ã*nxN©²Ù¯o'S0á»8¥º‰4­Âuq‚vÔê#¸üŸVkùq3x‡Œmè¶mßÇT´b†ÿh¾Ââc;ªÙ;Kڡʯ`èPsli0Å E‚VeÕ­ABKtŒF{RY‰ Ÿ¨é0•Õ©r¸ÖvÄ{çQœro¸|ìÛ4Q+=>)!Ø)•%}Öë1­cÓáo%+OÐf÷ÿ|â ÑR÷¯²s¡a?bïÂ`”ã:a¾2x¹uvæuÂ%vÝRêÖö"šb³ªg3«YÚß(N¥L=L~÷ð¸ß(èg+A³:õïJi®»(G6h“Ÿœ™×̹â¸Ó:OÖU€Šš Ž.ò¹œ ,ºÞ(PÞ'&w žÛGèÁżGÕìêi…˜EaÆOwLüŽösÃ3"1/è.7ñ—…‡®CEjYVYÒÆ^ŒaE?p3_¡ÀäþOåãÍ(>ذ]eÑ€âs÷ Õ}2Æi{8pvHž3m©ßðíÞ(gƒÁw°÷ìÚzx´TyVu‘ðÏ6y³‘éo…> UŒ³-×GÝkÿà§Oß’ê'¹œ[\ž€ºN'u}íξ]‰‘'ÅÖWM¯Žš%³~WôlŽç òï„A.ÝÅç×)XÐTZ´‚@І‚ä“(¸qùE{â—sÈæ‡ÚØšÜоr ¦¦»º5É"Ú€z+mw'šUÛ6¯Xg:£á~'M%RO~öÍ™ •uùSµþ|ŧË<çA/îÕÌSàpGæböÇ)G3&›—1šs ·,ËÃ.?Ûì›/‚ ×xú-ˆ]¤…±…ýùþ NöòЩBø>¯Q†=ñº•Œ3tp#“òyñõ‡t•ž|ö÷ŠÝÔ,±ûx'È[¡‹á¤X“ñýfùZ|ã„pgÈõ–•ýÖˆrÿ"ê¦ß®¨á¬¿Éá.„J)1Ù‹Ò‘Ô.môégnÃë!Üg°|C©GÚuGì©ÏHÒ¡@:È%½¹{‘ñk¦Õ­Ó-«h,GqSëŰ3µÁM–]Ìæ œÛË o‘Éd©ÙUj ÊÇb§-ìóþãnUÃ5sÄ¿-£öø£±ý[”52ž’yôH®Á”“ óãË"x* O…úÙòýpýŠê\Ÿ8àŸ¢ª6¿ŸJyÞ‘( D½ ´ú»¨’¡¦D³j;êƒ ï.9„2&?1y ÂåéryjÑÐã5>vBbÈ[t=²)`–ö)_ÕäÙŠ·¬áhú§â%^(ÞÝÝäwiI@–г+:³òž44—Wš¿c¸ãR\,Оïutk*U´õ‹5ÇâÛÜ9§r€5{-)€ÊæJT¡Á¢v¡±˜h×gbÐ^6Ÿ [@œÌ×%a¯«Wo±¢ÔÓ¹¶¨Så#N²G/Ü!‘;&ÑDU,8J0 ±À´1ª8SÛ ª*Õƒ-¸¼¦0Þ”Sh½ŠŸ›&û¿­³Œ¨~…~™K™ˆ¢"lúw«ÿ]7`& __QsóÏÙœc`³«à샽Tl’NPOÝœy-Û¸  €ëÆ´ ÐÊRizÓ*v [!ª{@q6÷÷ÝQ§:šGžÊz©;”ÆA]NÍÍ$eèé×Nâ­ì 6®&@ÿ)5/Jš¼}¤s‰º›yÅPªüƒä¿ºjFï×ÇÞ¯_Å{˜X4âÈÜT}¸ïc“v žUâ6:¾Ã°MÄï1RŠ¥Ã¡âÆb;‚äHÑ3>nIxx¬bÙôZ˜+³ ìhz$¹BÊ\–ðÖb4 0š±™Ý:ÃÀ}J- í‘qó"XŒ¸¬KJ|£·¿ Géd•8r¨)[Ø”§6©{qé°Xò¸Í³÷! šÄyÃÉϼvPfªJEÇœ¦÷֞ǘ`mò‘lØŸ<;LÊà80Ð7°Hd¾è0”$è0ˆ1† ¤„jCMƶwûǤ·ÒNGf8skïà²××ëZ~:¢¼ªWÿ¡ìÅti›œIŠ ,«1ƒ2"ÉÛtñÙYò¥[õ‰Ö×m–¥pòil†_¯ÈéJKæüˆ£aTΫ+˜MŽ|87.6ÌõwˆjBØI¾ªù>ŸÉ¾¯h¶ã)^¬fýj›í¼šú Öžºÿ«FÀº‘]3÷·þÛå$}ËM8ÆæÇi¡¡V`ˆˆ ò“\Úô“©3ŒÐ`t!"ÇUɬiBÖ“Gô©OK­ï¸g*l­cExÕÅšl¾"ñ½ÝCkžæq>K‹óţư°kbÏŽ³rpcL°½ƒš”6¤ß¾P5ri‘ÑYøö©Üî™P†üèÆr©ïÈ7z²»Ô+‘νÍyMýŽ3“ë§É¢2ÿS?{yÊó¡ðù[3ÚÑ ¶9©»/ZÕ…ãYÄq•¤kAöèÄ\ueZJW!Ú“"ð·Ñ¤Ú=C4+ ·³b*È6Ÿ&dIo•¢_ù–‘F¢q2œt˜|ÐuŽÏÒÊŸB²Î©øÉâ°ýkIJÁ:¬úlH‘y̵¶!…rƒŽ§UeÚD_}GVÚ.§+8ºTך_)陜Ëè,‹-°øû°pç¶ø". kã÷["gÍcÏÖìsX—QïV<ªÆÀÀ¨kÀWƒ0aSRò¯ÛQ„)–„!Z!9låq@œP¼—FøI};@fPf6õ¸psç ªô”nÝeË_Ù1,í/y¢3Úñ rIh]n]Ã`è:Q{q, -A×"•°™Û‹ D*±#ÊÉ/‡Ï¸þJ¯¸ŽŸ½¥³GtË„ ÍŽ_”øQJí)W‹êÈw%cQJ¼Ï9ª 6†œúU³Æv )Iç,¥”(ÓH ,ߺLL——[w<›ÃQ¾X¬F¹bЇ¥ã±hAZ?_þû`ôØ×¯ ÔH~¾ÈP¸SvHøôˆybö\4«Œ²º’õGód~åéNjßÊéŠ×6╦ÎKÁLÍóô½IèÖiåÐ*ÄšO"]õ)MÃä/Nï¦>^W›Vпo¡dK‰Ð‚Ê_9•ôT¨ß×l8Ü>>Š¡Jo:¹Ì&{éÖûË=¶­Ìñgò€QÙJC0ö8pS‘ÂãYE¶F­¨)÷ùrVbtR5à CÆ_M†”+žÆh[D$ƒ‡Ð@Vv?P»ç—ç4 —l»Æ‰yM1® J<÷âè(¯h¾ÄŸÑÕdí6 p‡ Æ&°‚¶1 þ·üy±YNv›^oÉ¢Žˆ½†=ki…J i ùÔû™a%Î˨‡T*@ Œ¦M\žš¦;†•ãÉ Þ'±,šèÃQÍ tД OQDÎ{.–rÞþy9zW”qèÓwë$Õ-àý ¥;çP®j{Or§Žm,N΢¤»©éS}ô WA—¨°À–¨’æ2þ„’ WŒ¦a½À èÝðGà¶–÷$.¹qÞ"OLaÀBX.u„Âe=Îh“!÷…èÛaùAe¢çzØÚEÌÙå.²”-¢9Ñq1ð+i·dIónÚ™sð çSí(µ.«|B®æ/iÆ×,Û~›ìj“ ‹ÓˆDs¿XÞÖ%S:‚—¦¦DÜ«Ÿ¥«QÍÃE¿ R3,\¿½&Û„0;,²FJ‰¸ÆÃéñRY?ˆAmýïú+oÂüñKïeŸŸ22¼(šQ.)ž…÷–xqýã±?ŒŒxN“•ù/5 2Óë³úkEêå+¥2ÞŸ¦‰Ö7ð<°{‘³KràòKâi$]Žð·O§ó”c7oA©:"LÚʯEUzd!Æ"•I ÖÜCß4âšã’*±ðä»Kª®ëaÜZ¡µ#€²î ¨ æÖpK%«GsâÜsì*XÈ9ŠO¶Åpð(1Û"ž%•-Oz‹±V¯ tÒžõ¢çE»•+©èCE—¨¨„+¸€Ž¦póÿó}U=±SÉ¡)Š„|Ïüw‹@)ÐÖCÀõO>œ”Žà’TëH4r÷ôÚ_T{maéŽáïÚ…LÌðaÊœP“!{ükÈCÒpñ €CcÅÓÒb i‘æfÌꑌùVKj]´izȶ)©ã<È*KO4ñ›²?úûÀâ/øYîå¥Fg~6˜Ð§W ÞƒñIÁ…O “j£§v¹OŸ JÀzIïO‡ÍiŽÇØ^q´«ö¼‡Q#ÐgPh39UÈ«µ¼z°‚%‰W®à°Ø+ Ã5«æ»t)¹$Ð[dkrBÏÄšô©ù›z[Ï»Ìô*Ï™u¦¾¯ÂõÙHÍoן1š’­Ðx“MÎÝèNîíHZF43hÍ™–{À„7g£ýkZÝfZF ‚ØÌÿúïl9Ë·[l«×ȾëxójÉ o÷¹z± Rà*¶@Ù:s¾7Ù/wÔg £§èÈU5T}Å‚ä*ñ‰2ä=´®Éë퓹I¦€Ì¶ën/4•‹½7BG錙슣:‘p·D.+õJ<±–_A{š»}‹xG }éâÈžH<)côÝßè€y8²…º¯-ùæâk•\¯©´IÆ\ ¦!è‹é¥É¯†+YÝÚØöËë°-ûÝ(¦*){mî àµs +ÀƒÎ¤ñ]+¤ XE–ôÊJÈ+Ïtm)‚v5ÕÉ·kg‹´ò·ìáYCK;]QjZ½`|ãçÁáˆ!Gótõ5Ø^ºMkHPZŒž ë=4Âç™ÑíõÆ‚tæ«°¿ e“A æšC :ºä+þ:J’’„Êä9R€AH½~¸Ê­¡ ct)[ø“:A ün`›¦þ^vCýøªÿ­Ð¦,§}Gjþ’úÖ0)zyHÚU?·¢/›P€ŸâöÁfE¼)ÆÖR ,ò‰¹ ^P ØÎÌÚòß&Ÿ¸FPøòQ&‹v>3*]æo{»¹IŒª5“lƒêܼ.àóDñºÌºaOB›‰)ÀP¦97™™í‘§ñk«E´‡ÁÚW`Z¦„z+Ôt®=ìóTI¾¬ã½åG"‰Jn9õS¬c*Úïøj{7_‡°ÊY‹KÙ_¯^nȵùÏ¥‹ÄYDÌéŒÃby¬pàW Ø›gHÐóû'>*@‰Ÿ›Ê÷'f¶¹¹•¢IÍœTÖßy©¬/óÆæŽìÑ”sý)`Û´$ÝçßS¨Zþ Òt=ÝJA¼â›€V+ úc,TW“›£‹(UäLŒU¥¡8`b@£¤+Ô~I“¾¤ò ÉXy#Z“¤¡ ’©úÌÔþ ²A[ d OÈ2JB: w<Ÿa³N- ´ ²ÆWÀýëì†éí«Lk+I_©‰úäü×ЂádÌ¢Àpdª†Ž=å"oŸC¾:ÈÎ-Uùäpýÿ“h”oM‘‘¦2ÍP”õÊ —‹®Ì4¯ñ¸"ùÃ(É4͙ؿãùQ†'ñ®xÜ#Ц› ]û‡£r¼”K=ˆÐp÷))ÍqÛÝÅŸƒ±´ŒÄúÁØÔo£?K••P"HkÆ+îNTF¹OAT:» …<‚¨—£Œ×|x(ËB3Ž]¡”XÿË£ë¢G©Q%‡úžÆI¬V°2ÏoÜB™VL’ºMäyŠ*[ÓæÖjYqînpúç赡ܞÁß¹Ò)Ì hÌ /÷ñå Û_¦þW05D4Ùqž‘ÍwæTo}Ȫ€QüO¬Z¡Ww³æ/¶&ÐÕ&#À‚øS•d‘ZY}e즓öêlVÒ¶ù#ãA%Æ3§FMœA€Úï1Mµ«EýR _¯½5QQ’‚rUÙë†ÉÅ*­"òuý Êí>Ä!_áo¥Ð—~ñ5)ÞmÚ’85åù—œ+z?g?/ZLv]H,÷_ jG¯ùòßÐûÙH]QÆQìô£›®QQùçÉ èâULés}Zò}{L½8X¦U³ö§ ‚TO'„MmÄ#¦ÝÆ;±Êi)"먉<}ùh%ƒ‡Ÿ¡‹ý†‘SŠMH!AÄä$æØO4õ§ œôß“.hFú0Û“oµ¨5xïsD¥M Ó‡ÞãPˆN±9ó~ÇRF"Þ¿õ–>€„B·¾2挥*¶<ê¾–p¤õÅ%ÓíLÚkßr¤ÊgD}SªA ÿŽ68€÷ó»žIKŰÌxŠMÍ)ì ­+ÒJÀþ¼<ªkC•ÿÈÙxUOtŽÅÔÓ@á´Õw¿A½Æ#Wr~ÈWµHXX[1ØT “¤c<ÞãöÓ%éjv3ƒ¼¿ÑÉ-9ûôÚÄÆ6éçÜc—ÉRˆV®ý|z´¶Aÿ÷{uJÕ3Çè]yO‘n¿küLu_ò– õ»>ÞÌŸ3æ–­A,a›åZ%údW5ØÃç†Õ±xJ!Pözbak)î@gMJ€m<«¢°Ñ ÈÛ —ݰg·ÌFØ’}ßMâÂëñ&µÿÚÐÑ7fÆÍµW«£SÌZé_Yh§Ý6`¬hPßëpÄšâg !b• È Q¶×TæÏiLP3bŒ¢¸7QÇ…jÇà„ ,e(ñ¦uÒŽ·.BðÀ6ë†T¯dµH5>ʈ´¬ø×í%¯\n’Çdt•ŽÀƒÀzXKk¤|3¨{~11I;u«ÂJz.CdS”ã¼Eù G¹®…œ“«ê~`À“M­ýv"BÇ`ø$Eºbð ®ãϨ Ó&§ãDhè?*æ#qÔÌLNGSwPK= 칓ºÎeuX–†nd|¼úHqŽùd“¡x‡ )œ…VFcôyÔ€ø> M@X…OµE¸dÉa>çøBÍ(¡wIuÕ!œTŠr™ œ9ì¬Pï=Ôæ1eœ–`n¡ ÖÑ8T¯±Çð#º8Ë tJîoM «=^ ÃT©«²XÕ2<äó€tÁ¯x'ŠÏGt•ò|ÍÝ}Ô‹l»¨v–Ö@Ø/Äع£³÷\‚P—²¾ÔÏÕ6vä@My–X|YÆ Ö«{Y¬µ&Õ @ÛiSŸé”Û©eµp,ñc ât6GÐf«d¥ t‰ÉcÔR9ÐàƒË“’T®!ýJÖòO2?Èà”Q5¢ýnRØ4ÀJÝÍ9ÐΛ`IÞó]wŠûÏÒ[·àaV¾MTË)Ëžo<šhŸ©bSŒñɪ]üÚˆÚ^ät³ {ö©—æcVø­¬wY?c$X0q`w@þV•?óÊv„+`Þt‹¿ aZ6´¾BnèuÜ3‰çµ9YúøHì³ ÃZ8zR{’ÝŸ®ãÜK“rŒð¥«¤6Aß¶|íg~½âÐgíu©Î¿®`bBÓ§ŸQ£vI…]>àt! ÷®±Š˜zƒ9 b²(9i©KD”ü‡*¢1–޼D{÷J“Cï¿Z“ ü_‡þº©®’ž R»N¦‚Li?Û5’÷–v7«'Ü£÷1×4jOê«S?ãcÛžz€9.RÔ»G‡= ,T^i%®‘wC7Sÿ H…S]Ÿj¯6q½cÓfWÂk±—.‚—üþz¡ÅìáÂWÃbê×ãS“ݶ»bñ{. µRèúàŒŠ\ƒë,$ ˜ñb)œE¢ìà!3—QqŽ?^F¿»cÍ'Ÿ0Æ{tá <]Ã~zY¹Y •߇ê§óa•ê&Š Ö² Õô>@n\…½Ì+ÜÔÿÏÙ²‡²mŒG2 ¬©Ý%p—ÀG!+Ì©^âsœ9=«™D]A‚ ÅEJûˆuŠj6v¢+a±´ Â9‘ðwhèÆƒFz’ MÁQž4& ÷µþÈ`ÚýÊkRÖbÁ7¹âÒm½î¸D]À¤{Ä(‹‡ÝËÁ sÒ&ÉâŠÊC÷5ÕvËÌ:YVë4ú:¾"—@h°TŽ¿„ÂE€§à›ë†» ô2˜’˜œÃÃ’3røØ ägdUÿeæ •ëúøƒ½¬Hc+x9­kùìtæoi¶„3GÓ“×-Rû]Nçª1KXqábæUz_.hýˆ}¥Œ-xñ'†ŠŸ™%ؘÔu9²/»|e‡ZkOu­ˆ ’7B<îšNutÌûÝBϱ"‰Èצ©¥¬ \Ú×H}Ô+ªjgì> ˜RÉ1xBÉ_Åñ¸%-Ú¬æÐ WâC*¿öm¹ùx_=š4ÕÜs™ÑP¥­¼ ªýÆXžOp]W-Ña ã ÞxÁ½SQónåSе rñâ<àÜ=Ÿ›ÐÛí$Õu€à@úåÁ;¼“%†ÛÔ4è×s£2ã„IÔÜ(™Ø}Fë­Øðô ‹[k0ççŒ"OÔqÀO´ÖI×ý‘Yü8m-rfÝš!{OéòÎÓõÄZØg.;rÇ pe‘“?]úÏb²F¼¿Rš³ÍS 6çÛ©Dšæqžµg‡ë1$ˆx YÈ¡”á[£ÝôjëÅ«Úø$Ôꃘ_kê«–lovቷ&Cw:šXÛhÜšX?¸T€ß4MÉNëa|7é4Ç6áÇgwóq¤œ`ÊRýĺ?àa›§MßK|y¢Ú\]¹»Òwµë7†ÇjïdéÝ8®Y2ãxò^±P0 ÆÔc‡_þR!úXCØ”nPÇ9úâÏ" Â/m/Û<åµ¾3œà"™æ‘†Ž¸f´lí®7‘P ±17+OñØã¹A¦ãûeSª¨CâÀí~» ÍyLxüf9Ow«HjrºÔëŸJREØBrþaç7ÛI|ˆ¹žx’óÀy‚®âö{ÃF‹+7Îp|PËuJqIGٞǒ£gm(HAÄÞB S*É(YƆÖÓ#ØùXiÛ¹„øœN5¼Á?-$VHÑ&ÂS9J‘7”ï [Tëÿ5Œá-UY—>FÚÞZåüiýþ,sÏ~¡l%/üpcûÌ*7ÙúëñTžˆ"P½ÕT—ÆV.„*æ&Åh ·ßñ8H\})'¼«ÛAb.¢ÓY>EYéºÑÜD½¿ÃŠ|kÿYžqxqY±/q³8e1åS–”8ú°‘ åÝÏ™•P•ߪe8[’ûø‘¥â#2º>8‚m/õob¢’øþ™—;^^Éû>¨÷#òxWÉ'XÅæ¢skrkMx"APĹï’<ßg¦ÖB¢];^‹C™ ×»¡=-¢Å>ݽÎ>Põßâ tFë~±-ºŒÈÔà•×OêµdUòz-M Œe(ñnÖ¤9QO£Šüu&€—5Æ›â¦zÎ`à)ðE}ÓHòð†À&àPTeøoð‚¨6£¼†R-8¡OKWÚú žuTª« {m>…%K$lHJã<¤bY@?Óø×á²8>mý ^ëxåÂÑüY¶"áŠÚ³!öWž7Xø A×¥8´zF¬à³ß™«ú²ä ©üp›=›®8+nùÕûÈVz8òDí>o-àH¹ïÓWÝ»e$£Ä“¤/ UüA7 ôÃ&òf¬†³k¹Rï vçqŠ—¿Øx ž…·é—ýŠÝ€9›$·6RÚ.ÎûÃáW›2Š Bá卵­j¦¬’uDÞÆgaEY îÕOcúO·ç‰‹öb1€´Z!'r’-QQsåKË…è2Þ M¨'¨˜’‚Øp07GÿÒ6kÁþ‹kÀzýŸÓnÒŽ(äz×<Ô‘'Yõ ùj€°?ºìœèÿ›Ù…3jùÚ˜ÉWi•æH!áʶљÜV-Éuæ?:Œ‹¤QµgÖ=£®×»M¦ÞÄÝù‰±ÔÄÉJKÏg©Ö–ùð‚9N2jȧZûH‡-Ï`jò!bi¥·äTjvV†`I‹!µc¡Œ¤S.øÚ™fŸ˜bošYñ+Ã-•ÎÉÓ•jáå­•ö¯]æ7Ú ?…ú”A.ÊÔz¬Dσè^zöõZÁ‘+.,6Ù™5xÇÐE1½àƒ¼0qk„vºªŠ$¶½Õq@Éœoçá[†“óÃ3½ä@†Î›IăøÈ»Ü¹ÄW½­å‰U´&Ó ©ÏðWã¿dF>àŒåÎà»Pvg"G©bõŒï§ºÿpT4Ë^˜ðºdF8Ö¬ìuýá-È;Ó¯ÅhÉ_w e˜,«ƒj/sw“¯=méØ_ f™)γ!aÄ>x»â5EŒ“•¸Ð—ðøJéÿêq°y¾¿Ôy dY p;cÖ]A7dýÌf~—昄‚Ö^o·6-tÔï¡'ª0¡¶ Cú÷« [)´¶U}7onFfiÖ³ŽŸç…ǶG¢%3Ùy¸é x®Í#p½ÙKg¦º: Áú‡>G³–p<Û—Fg.¥ UÖWSú¸ [¸g [ð¨o5tÅ7‡nLa·IoÀçR@´Ò¥lï¡ÞÖ|Ž÷Õï°ç‘U Š*„iq³ŠPê$êkÄ$‚¸°ø%°ÈHæx¡«—êw;ÜoâtnÕ Ù‚ßRÝ©µ8x³[ýßÇN1äPÙ"=”Æ3Jh’PÚV#˜¶ÊQñÃRÒòª˜Ò„aËæ¢¨î6Õ°Ä„b 4B Õ¯¨k™:7*Q!‘Ø|‡Û€ØÇ"…•DxB€ë®û;È»cá«ÃC´×aRfRîùvïh^¿ TCaÓ)¡5;ÛB8ñÖ„õ[ØÆ‰ì/·¶qâÏQ–ún»Ûå¡á¸û«œiža{=µÆ7m³ãpLßµCÓÌôí^B¬Æ'§È_L7»ñQVxÞIðÚÁï—=¬Y”Í)Ç ÷¦Á%ø*}4í ·Npk)øÑ_ýÛbâ3|âÑD¬OáQº5ì4¼#RÌItëÂxIfЏèyfóGëûê)¡H6Ά!@tò)ç[žm|E‰¥ÿõ‡ ãÖšÕöØS¥ÕŽ´Ma®¯›H$\BÒ¼ð¢|4 í&%ü®'#ÏIeø'Ê}Ih^{Æ!"ÑÎíÜ'Kµ‰c ¾ý’Þ6Í,ûFR¼»qîŸÛØ!xK¼½=+s³Œá°ÉùºŽ'>~¡EqZ%DÑÍ꺘®èÚÁΟŽÔb<Å—[ò”RŘšŠOÂP™âkížP¬8{—ƒF¹<ßëˆëÌ:kY"û»Óʼÿ;ÝaX.3cŠúÉhcŽŽó•uÑ ªé¤át/æÐØ•:Êï?þv õzöiî€XÙò—| ¾ßÌ»ÃGf86k}³Ú7ÌÆÒOW‹!aK0>Ñ"0+Z.YÑWNïÛ(QÀÇ·8ºbñŠ zE6“oeæË3zC Ì.º¤LVýÖ<ð’`Úóhn  ù· çì˜6(QôœxdcÑÆ”W²B[U¢îl*J÷}J¬Z08î+à$¡ÀS¸…dÚs£w™2‹ð¬¨]E¨ÿ µvÝ%Þ¯¤x’cï–+»|Zzœâæ‘+«^%^—½Ý–”¦'*ꥰ Í÷@–î Å…hÊ»q,ï¬ðê$µX´ä«G›eÇ6= CÒ±Õ‚ˆ|ù%–hÆ'4d·[²[»± Çï†ëŸê×ê3–•“W%õ W9%h¥€Þ „ ps‘é¯÷3œ²gH©B¾ÂÖÄÙ;b´ùòçܦòÐ6s®ÍªLÉý™÷t<¦;š›šc–ÂÁÖ2AÙNÿðœkùØÁxmÕ^@g °­v¸6@Så4öts²æŽ~¸o®Ð¥q­aÇ8›„»à™6ÀìPèµÓˆœr6Ђ•h5Üøœ±{Ý®]>™?mGÌ÷ƒùÌvL+ú€ï•]Ñ-§)ªx+¾ÂY×]?Ð(Ç—Q}6!`ØîD üBP¥=$5;6£M¡ê_qN‹ ¾!bþ}E$üsQÒŽ¤p¤Bú±´Ñ‹æð‚´c2á/гua/Øã6Ôè1@c™—#¼[ìøˆ@)â·ñšÂn·8¼þŸíÑP8%Í¥$ÏszGÆö¯b{!âe U-IF&¶º÷IìEÝIÏ®ÖÙ¡¤,kj !6З¯|¿wB¶ JÒx0YÙšl1Ý©ûk(0¯‚´À¹â­]D_AÈ36ëHkÉ`Ë=mŸ‡ô ðAíê.ù¸êž6 ÿ¶£7–Î*%p<[ÓNü‘懴ióÒªôŠnC ¾öfYןɔåg«à“u>˜éyi0Ó·áRœHöæ ®-f„…I`…ÂrXÍNVWra‹1Õ„}³ú…ÜE„RX÷iްrxè&#==-Áßy=³ª¶Ê t¨ð¯÷ÀL“dì_$¼Ÿ ö§]²ÑVA€÷A>‘âpÉz†G•®zÐT^cÓ}Äq^I£¶X É÷tCu"Sè‹Á·ÉecÁ°*£J'Ä+´ÁºÙ€‰LŠt©°è¤Lñì~ù#ôEæ®qcƒE~ïå ÝŠ™;ß Òp'Š Š<Ï!çÎ Ûa„ÝÙvŠ7tTãÙ$”¤´ã÷ܨ0T`»ÂÈ»äþoeXÔVš¾È>JÏ,Z`¯'ìÍe2ê×÷a:foŽ$§«Äì¾>‹öV¬qKÁÝ–Y‘"ÓņÒ!G;á7ð@ú}ʵ‰þ;%ñvv‡pG½ “¨O&¹ólÉì^~Ý›ßvá‹Åb"PXYoýâïö+ñzNü„ßÏp%´„M%D Jî+ŒÒaMØx¡ê“H÷A(%ª½#FÚðÞšð›-õno‘î#ïECû@m$âÓ3o¬ÜÎ/ô2Ml·qù +íÑA÷ëùšÅ)ÚSý1%Žnv±´©fl;‚Ð,ØÉ#¶ùë ÐÈ] Ëî;©¦[Øœ2ú\Áß8ž’Â&®ú`‰¶öy ®±‘o¹O.×[ªÙt_Zž\¢P^—߀öïíþ¢„áUI„”?1>ê¼ÿ øÀt»åÜðóJ,jvÈa÷6uœzúZ¯ô¶ôDlζbÛw’voÙ ½§œ—´ñ®öŒüPr'\ðøÆ`Ðf…æÁ:¸n|ùš—뙊‰í}ИË~Æã6¡2ÝçŠÅìK¾Å­µÄ`ùý©ÃRcîŸâ“×C™~»ŸËé%¾È=P$eÜåúûU¦Ãh@:G¤è¤M7[¬;çyTd8µOàs±‘ŽìcëT~ ÆÅ¬¸–‡’šÞ¸2¹Æ™aŽÏPf6Ä1KS?/§­Ï¼:ã‚ãïK‰u÷¯Ø§ÛWqšÔ3W,Ž,ádþW¯Í„ìz¢þ¿bìYŠæÓT(¢®K™€°DááåñÙ²jç+”r _t gn­üˆU[5nOÊÁs.äL²±Õ^Xͺ8ÈbæDÀV¨bª.t¥ïÈn+Þ­å£Æ)€³¸•gŽk€7bõ¬©áb1×?%\H6É\¯»dÿ:¢fµ l‘)Hã{`=xTÕ±#=Ëèœû¬Ò|­%~æx¢J³­,·®é“¤DÄ;tak}<Âé¦eŠHÛú^ˆDnjÇ·›4DÃ,.3'Õí/"ywó‡ÑíÎ’‘‹#mÎ/‰ßŠ6à]B„5ÂöøYyë‡c½Oc8P~–,=›ð V)|Û ”8»`àž¤×£d½qUÏ/@Ùa|QëÀ͸ÕèÈ¡0±°Þ•İ$J0áåoJ/u»ÑYϨ8‘ÙpŠü>!®+‘À»Îq£Ãµ2ž³õLPMm\ BŸŸ¦!‚aC¼>€qX«3Õ3Úœ-=óåM¿C$vc…F•¶Ædéƒ7oÍvf™1ÜZfG¸Ó’Œ«rw”TÐ'ߣ[Œó/Iœã{ƒ[¸ßœ-ë§FÍi@¿ù¡2ꎹv~q¹X ¿Öõ¼ƒ¾!|ñИåâý(1爵3"Ænr… n–øGŸïáèÍà­7IJ,¸ÏDkÄãAçÕˉ3ã¿9ë †R8ÞÙzüµÃöö {‰R_ZἩRM‰wHÁV¿9‰0¡(}§ðæ؇§B"²Ôƒô˜si1æëÇâjSó<±Ë_ðÅÕÉù›içP¾Ñ5rD—/%cžF¾?­qh+ˆ£oòTŒÒߢ—[9Gˆ™Pm„ ‘4‰OÜ ,EŒÌ+Ø“”–ÁËÐ “ÆÝz‘±‚,'Ân .¼º’pTo6ƒn§n´ î ÿan0 AQi4E,{S¬YÒâ2Î'5ëišÅì(F°gë<º”i—ÕÔ=¶ 5ðˆ{«þÛèX¯ÒH‡åM]‹„e^ˆE!+‰˜ƒIÿ[[Ü+?Dÿ‘Õ!u¨¨„I乊=þŒÄ¹ÁÖ~ ûº"@ŒuXt6¿ÐêvØ Ûj«U%»4¤ênÛòŽÒ+ÅoíRS°yÒ.ÈË( -q¼ÓйØršXwùRÅžû\ŒÖœJ-7Ÿ#@O Ó'$Ás'}Fø ìÖ³xÆ;ý›è ^i€@;¤üŒ\óhϙӭ¹Xr´ÿ1LîÍ0k»ANåQ7"9pƒXbÄTû6Z¹O²×•QÆÇsÿ´£~ Ä¿Xx™Ÿ‡+ˆÊÅ(äiÒrG°Äy`&Kf¶‰ÊFkï™÷‹[†¡ÍÐXàã¢y¹‘ì²ÇÒEwcÅ‹ZËmµw;EÅÝ´šþšt&fyxwÀ•HH6ÏÊÈ$6(ìH'Õ.p@ç_Ò·E•D7ÍŒ'Ùº¶½ÆNxý€èçŸe£^PqöDFŒÈ3§–¤Nfª0ß-HópN¾M4JÇåë’A?R³%ø8}v©d½ËìD ÄA¬:öÐaBE[œ˜c´,ê‹™²˜%7+Òø—ÿÇAžKCHzPþßÓóë&  Ón\É€²"ʰ¡v-üŸàÌŽ û5_w|}8µÅØÑ öB40ÿ¢Ç\_¤†g¬ò`¿8«™åÚ šK­NÙúTñž‚Ç(acK}ø–Ðj®qÉo¦$DN+Tlí×M3T„˜g fmñÏшV¡ëÈ…©olÛK²ÜÒA)i€DÝÌ\¿‹…ã%Êrù1̰Ë{`ºjïs¤ðÓkh{Ö ûþ¸ÁN’ŒÔ ºôWB²¢¹í&_´Ï%º{ÎåPS»1àÇ~E]  r×!|¶Ã!X\õ€E¨·ëã]À©ç¸ÇrúKßr­ðÀ ©`/@±wæŸÖvNZhfþ¦82›nlÇ— UŒ!pS®¯;ØÊ)&xi‚˜ZØŠçÚe¼…ºêÎXÓ‚ß\‹®ˆöl¢³qXi'Ëü! ˜Ë3ÛŒÀñۇǥk×î½TßÓÕôˆn}˰,4Š òCÇUÖïÊþù+ ;%½CÒø*†¤D5o6ý˜â¨FßrW“Š—qÜž†ÉÌ’‡á¯Ÿ~`z8K%ƒw&YÝ*S0óÌÅÍ;ŸLp-=^Ú0ÜPI·u±jå 傃õÊøÇiÊ6M®³£þã,TÂÇç H}¼ð'#=ì©CO§dO“‰ZËúòµ[ª%°_ž’\qzÍ ë&ݹÔ"›áRÝà”*倎­ úƒ{¢6Íc6Ýnd©ÞÌö$Òé5‹Z„t^jº³ò”íB ØÜrjàzhë·NOü"­õÃÓÔ©,§‚e¡&¥»%Ï7òÓo¯“fÆ—–ó99‚Aa›W»Çóω"ÀO4ƒDQï2-M¢yÛÇJûÒLt›„É…:Cgµ>Cé境㯾à:û…up|Ó~ä¼t†€GÎAä]{€qT¬KgMܼß~ÝĈ÷ú«£Õ Ó´XºÜ!;92 ¨!*Kn4Õ]•Ù¯v »;]™ÑfæűS,l¥™®%±ôîc˜Å`3ˆŽYŽÆÐÁ¨!lÈrKÞc<ü*ì©øÉîgÖµA»=JÒ{ +£DÃ4·Ã»ž<6áýaæÐ1Š´3Cóæ-•¼b¿sqE‡T&Ö7¨“£Fê0GŽ]þ6 !Ecƒ-öùýIbD¼ˆA´™ë¬šµë¤RÜŒÕFÚµãò°Ðä†L¿(‚0â±g‡ÖÕ&yY´‹®™lü:FÒš%æëŠb0¥:°r7‘Ì~#ؤD1ä½<#×}eý:£ ‰ÊóHÖÀ9ó:ë6¬T@xÊN‹°+_‚®ʈLwZ”ßàjƒ‚4"v…:m<ì>„ ñ÷;Lí•*O`ór@òÑ`fÈ<ÑISš%`qQ óŽØ>ÚWôW~Ü£MîQ‰Ç£:Ló~*6}­p±E}¸VWC†zx˜Žõ<æ¬ròÕ÷†(­Á¿¢a©Ã«£á7+ÏLbq2 U†$vî´ÎtÅg£²÷Ÿž5 h ]2±Ñ¸zþ)¾€†Ok‹û'Ìr÷#¡!Ú˜ªNÍŠãêSz†#Çm®[–²”-;‘#/…<»!ÔLŠ[rŒtÖæOߢTü.»Y[¼¨Ô#^”Ž"çfÏ‘ÔÖga…E*vIsüÑjò«ƒdJ/mH©¬þÀêå@HR+ÂÄš…ba'ÐJ›2YÁüü ŽDUðW9¬N*š6dð«9"¾OñÖ4Rš§¢ºt ­«'½+&b™ÎÌ8B®jÆoŒ×ݤ+Â34N~>© OnÙ¬f¨ÒæM·r3 RB­P¶Ðgì’? *v¶ïÛ6ô£3Q £)ýPì=~ÐRU°"-tqM0§èÏÎ:±^Ÿäþs áÎJtHà\óƒQ¦kÐhÇÓ&‘ÏPÒª¹¹ ™@nܶ±2hQFMæ.½™>Vä™fù^¸ÂVo]r¤F µ¤ð›”´à.j€iÒ„tX¨ëkè·Ÿngžñ¨¾øJrp;¬—É­†òc+åxN:ïJoAd6×ÏâlÜ<^ý~þh •öž ŽQرdøWS”°âæFŒ•zš¶`vŽA$½õÓ´×Üñ—m:¸œ´¹?%9¬€gªS¯²8"„û[$üÌ¢kÎ7Wï_ÇôB ©3Š<é·oKrà¿IgáÏîŽ~bgïtå>Ø €„ÝîhûüŒ¨u~C½Ú»±ÀS RzwH ï{/Zïä6I!,ÁÖ­Î4iÎWt§=?z’éÿMö.cº5×>vú 7N™Ý›â¾«r5Z\gF““‹³áM”îOp]ötïñâvÌ”4,b}ù+$õ¹Uª50V:Í«,g×9¿ÕgYÔc¯&wó>o‚{šðg9¨Á¥±–ø.Vn&ç…Ò_'Ë‹Hž³Uýæ™/˾OûEwêò¾ú‚6KSÂõž5lRΡ*ÁöˆD·¾þ’µ²yh\æù¯Ò8FêMÅ#À 23ó,Ð3ìä;h ÙiËNÞm÷I@Ñ¢r€Üç#Œ¶Æ¶]z*è¥PÄn£°ƒ…þCê}7}—«€¶Ò-,£<^>ù¸MRï J¬Ê’5`{q3qͳþóµvø ºªDÉŽSp«<6Zsõ (ˆŠ’©='u¬üC\†Ë5Ë‘<øô%f/5?È–:/áÛxèp¯L‹hŽux‰ÙªL½‹”'jø¯ÿËûž%ŽÁ¶Ú!®x¥ÞÐ9W6"ÄådYßzw¿³Ñ’Û¼ù×0oôöz fÛ³‡TÆ‘K^¼ÆX²ð‰xƒ½h×C±9 N.Aà^ÕhQ¹ª¥‰_h]üeÂîÊâak‡E ò™MPiÄ11Å¢-YÀhù8Å””Á›[ åK' Fòqñ»Éåã‡Ãuked2a+w?\¡™q¤ˆ¿~¬iÞ$*:n—’²)ô–ü¬hDðÎ& â¶Æ­~u]UÏ$×Þ'ÖiÉA­* ÿ`²(1Ê• PPÅÎ`ô#%|ºÏ=],ɼ3©]Ù¬<ˆV!_4Û#äì@MòÓ*ê xÍ›¢–å×5Æ$Ó½{faÙ ùìÊ T}¡G‚øô¾`ë›ddÖ6‡jšCoÆvɰüün}™FýB¦"´l=Ö¼ƒ"»¡òÑ¡H±ˆik=‚T-AåEëA°®TÖBõ@ǼÖX®LLÈÈç[ër)¿œð‘WAKgY…5kp™Ƀßš&EÔ¬©—¾*më°ÔÏô_ìãé7,K…´Ëô§ÍHx$nt‡2¦?ÛлÜ”züHð<×s5"R+J+ J•¼Ò‹Ÿ0ž x ﬢþªå= Á² (ðL‚²û‹…øf¢0µ›Ïù2qê2[ÊÉž9ò¿£þÁs 1±±[¯5Œ‰Òª_™§‰TC%Ú”‡äÝJæ ÄÚo‹Ì¤þƒ¨Î¥:Á *´@îU5«ÿ@ìîC¦ÚCCÒ7¹äC~Ü%¬Ñ–§‰¿i…à¯ûŸ ]‚8ï€^ù> þ1Y›ÀÐ}ú Ô]œ1:?ÅÛ%C;:œaÛH®  ‘e10…©ß§ª\x©»G»ÍMG)ƒ4^ËpñÛw6VÚˆ.Ò¬iO,®ÚÃë5};à’¯†îl@55®îÁË_F}òõBè#Õ³]AçkÕÏk ß½÷Lü¶k±SÍ™þ*¥©}¸91dfïxýþØÙ©Ab)«VWŽJÄùfU ‘1+ô*8TýHg+±mBÏÌYÃàϤ`>s%Û..„§áBlÅtÆT#YáéK¤UDÔB¶üî1²}U1žc0ígÅ#i–K Ð> …HlÏ„9Ë/,Ÿ¾ËÚÚŒÉof0§¤PÌÄâø*íëÍÛñ¡’OpÜ¢>m/ãHG/÷»¢¡^ÚTÞæ4¼¾.ä×ø_fWÏÓŠ‰g8þþj"¨è÷xÞšÅzš;)ÚºŒNsçvÁ&¾N»ÈQäã‚üP@˲ËoœÒÔ½Ü-Ûo ™~9C„ œ.b1ÿš$\Ó:—bôŒ>ŸŸôdèêù÷0®7§>—ÔÇ‘ Iwuj k…çûÕm2ê ÇûažÉÜó‘†ÊЭV èé3m}(G°¬w/UÞo $sM óá×ÄšÉrÎØcyôQ‚F3£ÜsR-ÅÜÊd\êâTKü&·M›°Ñ…g®5 ŽW™2_š¥f¬‹Ñ@ê ©×)KýZ!ùådWÝañídn%ÐÙíΆÿ‰ôT÷œ)é; #ÅØ›£½*ºT?þex5wYpQl*íøOבBƒ»”áaŸì¬;XÆ xG‡Sõ]öøgì.!Øïì é*éTêä}•3;•èÆñèªÅA+¬¾HŸi˜Á„èA\FÁåŸbüy+ÎŒžs†8âkƒÌÂð*š»Ö‡òT/“`g£<‚f£Îy–ârùZÝp_ÇÝYÃ= •?2¾-éŒvmÞêÆàý±øœšê¥G=iü—&ÊØ46–ÉØwÚìFÄîº3"ï5c±¢¾(ë‰öö¾•7ªšX>楖b?ωùª]»g@ÙŸÄH{*˜ÉÁQ5ã‹Ú.rø‡ÃæiuÍy£Y{ëÞXס/te†W2¿<Í"ƒe£ëw¸#…"öѶ‚asìÔ~£ÂU/'9åÃôç–ÎÏ¢¯hßû̸ÝÅjLÄ)â“Ö¤Ÿã U!Y9Ìð¦ö鳄$*Óþ+]ÛÝèkƒTßx¯Ï" ÒJRú›ªKhùù°DjÒ±äܾ 2–ÂâwÊK¾TÞ—ðÚ,U /@ub¡<7„¶ÜŒ¶h¬Õ–{%ŽçPºeíð^W¶*p éFwÛSâÆu“жÞ¾P¨hŽÒ¸ƒ(úrôÜ~æÖû¦ ½ØNlp e°—ù÷¯ú¿Örß««pƈ%à‚{ý-&· Ý­}bÉùhß±Ò¤%Ÿº•ÕToåHDèõ$._þ¥¨"G’”%É@…6°üFù\¥D·®œè'âÕ…?²3±@jÖð­,Šy‹ÆÝ^ÂÈ´,‹?²—uæ+1ÅÞââ”Ùîl„ï>?Å1Zxå rýÁiñÙŸ9|FiM ¢;æÆ+¶-· RÃóŒ‹I1T&é} ß1Éúú‰À$.cxiÚÏ¡ÜON+swÏdïdëu êŠi˧ûFï`‰eVÐL=Ú; VzÒÉzoþs¥;ÛB¥a Ášô3æŸÎ»F„ßј4q½së¾b„oÇûàòËò›iY9c‰\µ«(Ö͇ܰ.ÀÚ|*Ÿßo@î „Ø×pÁdc{•Aj4µ=Ò¶ ³Wšâ<ç]{u–¢Jz< ö ‚€oZ/zoQÐaŸRI2ÔUjÑ«yù¶æ¯u&2èM6ѤWttНn~<ÖìGjâ$¤ „¸VÙέ+$ú“/ì#ýÅèM¸}À½çÖ‡!GêÄ{Û†0&¶HÚè«$tÜ"M+¿Ÿ"Îø†aøÅ ¥€%ìÔläWG¨ƒ¦õ0§Ñ[hTøÀ†\òŸ'»-ýC¹´¹oÀëÐàÞ<ÅEK©è8\­O-AG F¸í‚ü±¯n&9x x°"gÑ_´´S\€1Uôc™ºˆHáç"Ë…rGd¾$±Äbs'Û 1kRZ¥%ÞF‡ÕË}â¨4K†9{Àm–]`ÉßW¶vås„|˜¤®úüGô3ƒ³Â\þ+Û-.0|,æoÉ8æü!MÜ4³j üüÊ uH„w¯ŸŸ«4Ÿ,59µá”ŽÜ?‡‰ý£ï2OŸ†=ãÀ&zÊË\% l<Kqtf©¿æ7MȹyçýkïRœA>®î¶µ}ðÈÙÎ3ú‘Á®Ò™ Š‚_úÓWÎM”7‹G{äëà¡ù•|ö„§^œyÉêmÿþ-ÍIîÓ5àâš’¦{[<˜laG¬JXŒl}oÝOç~q†.±½NA“ï‡ßD$Ñ[v7ÕKg¤&L`¢ë+DQ¢ÀÛh£çNÓ™¥˜¥ QµŒðH0“ï*D*TÞïór™p¬êLéû­M™Áö‹¯ ¤èaÁ|€÷`´Xo\l¸’—ºÚ×õ•ʯOÏËŽa´…L…9ŽÒÜ|©ñµJ;×ZYåd,ôu:ž}Ç´µ`Ÿüå]N<}§ð‹žÏÃ\DúÜà;ñàUóâ ïíé"ƒî“JÑêÍËvVó:-Û¸[+î‘ C5uÚ`ÍÖú×Ìt_ g\mÀ3ò>!ÝNùjU§K²W‘;Ù$á—'`¦U˜ö.òM%q7)Én¿MøöMLOLb„‰w‡·v¾g¥ 5wÊ:Ò]8w ÿ+'í[1³`þ×V8±ÖÂàèúš÷áL`&P[fŽ2 ,?%´µµiåùþ©Íò ´û$Y®"3mX|Ef¨¼ ãOÁÒoí³0hÃçkUêE£„úWOcs^b=‚TM?ÅHZ`)OäÖË´ý^ø]äÞ>Šwzš¸Œ®YL+n w#·h½ª=aË2Ŷ¨¦ ËŸÿR[qâs¹ÿP‡E`:‹YÚÁË[o2FŒ.¬‰,òí‘K€ää4á#ô_*®Uþr·x®ÈÀDµçN_˜ã/+¦7 uÂÔŽó¨¸5¸¬àKŸ_~Ð\ã ©øMy¾ðä8Og“ÏÜïB›‘e4iMfo±±ï4ÏÎîàÖÖ”°yqÌŸšjÓ¿ + —µÍ+À ž%k|…oQLOèª å}rñšÓ2àÞŒlà?•bsØíÿ6 óŠQAƒ,·ª4þÃÝËß÷ÂÒà7'4{•–(ON‘&Š‘Øl…˜ËM±»†ýß@_µ+ XÑWs'°*¹Y΀ËÂÝ3©x'øGÓia²xmm-’JSÿÇæJ®–Y&ŽÓÞg¿ì«â-®I”˜ðÛÞÄóhE§je öf»v7½ƒK/êó>¶côÿ¼/ãá w.˜9D¤b†ÉÓ8Ò“+ìýû™œyÅjÎÎ’ÇJÒ`Ã6dÙl``nàr¾ÿÚ Ž9 U§>áU4hF¬[¬h1{ÆÑÙ ]¯‹S‡ʃÀ΀Ó$'4¨Ó%«p6¼U‘_ õr ¤©NOA&®=öÇEê(LìtŒ'›¡‘càzw~¾˜}YñA >@«¿Û”lŽ0=Í:tüýÆqÌKå[_—J¿œ"Øã€åö<)©#;@iö˜féuêÅ¢)~÷? X"Ín¿9,œAá·÷ëUÛLœŠžDUjâëfuõ›n¿åÓ¸ûD+ŽÒràÛ¦MŽìë×nyÐ4_3r#Ú_Á.š©mÑãA såJF1tË{êÎ{ŠÖG:dôZ-žžà“ò­B :º*iV§0ÎY½l̨?D_oá¥ÝDi1Œ-Yèò8ÒÄu WT9=sV'3™¿Õ‰‰à3Xq… —V~RUÔcˆR=5Ø›8÷ŽÑw$hx,À~Â*œÍûœ¯€Xü9ñwóžþÇ¢,±¬gÀ¿à&x-á­iÍßÃôˆÂ-Kó­Üøð s'á¡Â™DŽ®À‘D0(‰QÎ%Úæõ#Hñ0jnS¾3çjó‡YW9b¹ø'F€ü(›è³éõW¾êâ[°qÜMŽ6}rM ÝøJG˜¼t2×Ru¯ÖÛ.$]÷ë¸@_e{ÈÇi5+§TÈi ާš7¡Òøï+ئ 7?n<ïÝT™%t(* ÄÔSé´ÈìðŽÈ:ëžaû‡/qN`ì=\[n܃ÂC'yYxóÚÄÉKÆ«•Å "#-žš6ÖæqåÖ!ñÞ¹FÐ)E•H#9_3²Jç3Î.!HHHË6¡.JthIÁó(Õê–Ù(½; ›Òáãf¡‹ÊÀJùœ€Ê-û{M+=ă´â¢˜)?†xmQ#¦€o$å­ï5Y[çZYé„V!ÏV.ÑÈJD&ºçËëç–4” Þ‚Líi±ëÕA Îá_Ó¼J‘UÎÛ¼Ð'°§<í¥_¾=O<Þ €äi²æ»5tzŒæ—`ž!WÈ€—*D|–U¥Š ‹SƇ®Z®  và6¿F×,Ÿ$U/^zä¹\9„ŸàÚX*uÑ߸¿Mý2mžWù#`›´°8c­t3»\Å/‰q9K3=Ó.7>´ hdzl©uâ»ÿy’øÊПu¾ŒK6:ZÊŠ4q°ß-¡wcVf ›¾¡’R^*¾pw9o«Rë5g 3ãvZ{a|9ã¤-+cñJ‘¸å cŸÒ ÂòåÀ–F j³ÐïÃ_*™â¤òEÏwÄpÝa¤D„p‚Gù]ã—÷nkOô¦ª½ÃÇ÷¼³«V3ƒú‘! u=%ë±q´úE™«’\àÜþÙAÑøÿƒR¤]…Ðq«äs˜’d@\â_<Ô_U|ÇhÖ3-ê!CDûë¼îLœx§—E¯!„ûÉ“i÷f×-h “ç‡þR›7æIÜç<žz+ž‘§dK(³Öç:8`Áušmù´> M½µ×¸Ss xbµÁ …lXrscÖ‰Óáç¶êãÞ]¹‰æ/ ¬_L LäµÌ&àTרÃgŽq>ëŸ`Þc`”òƒŠúä1õÉo“ë4fÈw¤²,7òÖÓ—øS M'±cBQþÒ$ÚÐÚýùÇuª–ñÙ"¯Ô6V×ÿ¸èïtÖÛUHM qØ©‡'¹¾ú±ƒç–ñIkm5±q¬` æëàœÕ<ÃôÊ‹üI$^Ä.P>ë`€4Gܬù5àÑd¶íÙw ›»Ü+[5X_Á`«yªÁlÚ¸;ù2²!9âËàÕMöôù©hÊó!¦ñjA•°ÇqšP‡sÅFKÅˬÃíY3ú–YÙ·xI+‰ùñY3öCýO:° c¦£ž#JVê M …2ŒÍ‘+gUoàUùùù``9”h@Öï:•±ˆ¯mmÙ5~ÿò[pêe¢¤xt{B³f‡†$Å¡.-G gó(à§*Ò.DfP§_˜K$ÈŽƒy±ãa>¯¨xLHqZSÒð»~&â™×…ü©ìšp¿^ÉJÕǼçkw“§÷t\@öÒ6rœƒ Ðët´fâÕpµ¼JˆuùsvàY¯ .‰Vaè—:?È¡?*ú ©‚×ÝdzY=]þÎÄëIeÕä©FÞ ~{Ù¼å]7ÿØ0OÛÀÉ‹ÊûÝØÊÛBxºˆ&vE=1¯ÝÒ¡…ä²=Raû[Õˆ Ljé×YÛKñ‹¥½’ñË@T†cŠN#msFWa7y_5ÏöàûÆ2x·ttãñ8s"H¬ L €ÿ\<²h/CE·4Õ «%TFÔ$ª]© ˜ÄëÒ·Aç¹úÅÇZ'ØÎu>Psà¨iG¨ö· çèÕ>-X—[°û²¨4îPÎÜR3mÇÙ4(ˆa m!È›Î~9Nù‡â/Ô~wêÇ'ߣ 2T"}='F¯Æ}%R-(ë;Ýs…Òôe;’£û21Ó¤òçy§€h¡NÁ{Sûx‹±&–Ãåma*ÎW†É,õ«¥œ¼ö]ˆ÷Pé ¾¥¾5õô[¾uÐLªÖTÛ—hJmƒå–(ä@jÓT¡vw¨£•6Á€èJ‰JÔ †²¸8w¿” EK‰x Ъö Tô `xÄyöì4bE³?C»©‘iŒ„`÷Irᦠ|@WòÇ[øžFÜÅ ÔUÚy¥þ͘|üæ•éŸ4é"®]¤³NvðîsÔ…5Š÷º™ƒÈ‡OüîÕ/§†}Þ\y]Df©8šƒöõÆNÍ ¿ï::Ùÿ=Î^Èl-—¯¿¯·D`ÑN„}@`é#ÕßM÷O}Û±îýÜÏãŸ%ÝÅÍù! ˆIÅ$À\Û/›eÈÒƒw]­_¾V!}FÜ8¦„ÿK©øÑ-³ÙV¡Ùög ÎÐìJ½›ùC›׆z‚mIaÉX1–i5ä Š"4Zº˜%϶£ª¸˜˜ãiKï&vÂô8 qV…í`k4]zÇ݉¼ë&õ@glÖLtQ£–òæóªK…z2I:¼¸²Øò’ÄŒÅvÁsܨ¢< Ì^V׬>Úá=DÛ4¦³¸­!¿î>SYAeµ’#xâ³ ë´fçÀg|Æ^?änJ»µ§r¡°Hõ*vÉ~f¾\2@Ú²H‚¨Ÿ;¯éµ%²oº{<œ§Ý>×sJ¶FREì½J=eöÍw {ÓÙ—à©Òר.ÛHZÁ_lYíÐì <”ThTŸìaÄHåºþ†Å¦²{÷Hì0 YTKÅ`­<1&ݧ@xBp àœÊö>Ú?‘|½ðܪqLX IvÿW¤Èu{°TK¾¿ ·ÔÍ¿ÑÁè \þŠ,‚ ØaIY¹,B˜¢»·‹­3¦Ó{У”ç¾]¶© Å/ʽ#ílØE%-¥K&K (Š»6,j|¤9’\÷ÅúêewU· ·ûV+â_ÉŽ%‚ê¸ñÚTwšpÃyߦe@áRÍ+ÿfeŽö<õÂ^€?BÇ,ÄeYgà¤Ä£—r¹†}Äõ2¯ØMPÚüMé±9},5ž‡/@“……”ñÙð¿dD´åÉJù\QQÒ¹Xî*…¯ha­ñ:QmqCÉ\†wí´Ъ†Unèyc8ý!TTÞ°eCojªõÈ,³¾qmÉ5_vå´u$Ö%|¼‚¸Y£ÃÆu7µe¡ ³—wRÉ»ÄZtÚàGRRpÇ3Br¤Ek÷ ¬køÃ Éô€3í¥3%¯V~çi#…SócKmExìW³õÁZ&† ö{’TPœ.å‚=ÉÐÁ¯ntI.‹‚¤„/Cå,ÍÎîÂ*ذ!A™¶9‹TÚ%Wî¶‚Õ +5>¿P= Ë©I µ} b© ÝB9$Ⳣ߳_’¢zšÉŽ™å|NÐPéš×ÂË1øfåÄŠ"É{'VÄJ¼4&:®*ðMå?<"»Ätåw˜Uõ„”¿ …CFRœNÇ¿ÿ¨¦xù5ôÛWGl@"~½· mání.Ö/Ž|‘(§tãYqý^0˜ü¢`=Ó¾âá图øz;Ñ)[Ùê‚"¬¶øvœACc¿ ÌV5DDüîÇÈ!(æâ&F-á.èJ6N.ZÉYAPƒ§Ï E­VÕýÅQŽ{öåMþ¦œlÖ#V4 ÍN}ÈÒè•à$þg9ã例¯´rø‰­6U Éüõ˜±­†8”Úó`>ª™k®×NjwöA—4ñÄØ­Ú¿š¨ ^Ú[EcžVR§_P¯×Ž.’µ~³€TôSæ‘ÒÛ6ÇEc«‡}óiut¸Å#¢›HN°ª Ä ¯!çpúðÁz‰ !.m»zþh«sÜÕG‰®B¤x+p”Лû7V¿Œ$®eñjQf|_{“‡¬g—!ù*–¿qƒøß/kâ&}8K|Hð‘ø"ü1A¼#¯›‹ï¯AVGªoežðœÿ®ô¦ª€lŽÙâüÉ}nÍ`†¼ësffúûÀ¸Ô6{œÎÁúSµW²U>6;HRŽl–@~ ’òö©”ßÆæ¢¾ZW%P×^¢(ùç÷“¦F4§ï"°ÄQ£ù÷cáLû:Ö[ˆß©8×ÅÕ c¦²`nµ´ƒ!SqtZ©þ@ v¾Ì—¹1’´!`¦äßR:7SìœP±4fñ¿©1Ååí7ªx«ò^vF]ë³nÃT%Žyþô¬–™Î=yI{ PæK4Æ_€dç*¼,Gg†!Þ¯ÒGØ:Ç?{ùjj5ÿ‰.T`œj3àà_jGϤһíbä@OéjùOø<¦'#héò÷Õ¾ö‚MvbP$:n\Õ—u•÷I(…Í ¢€†S¼Ðjý‚‘?Q™Ázëµ8½™’2ž­Þ^æ£iæ¨hkLVˆãR5ºk³÷“3•&“÷ÓŸg_ñg=á½jIái¯è$V7µXGuÄMX8!—xáo´¼bU­îÝ4u\æw>[ ÂçO¥ÿŽ™„$³\[}Ü?ô tߥ‹*Õ!@Ä)‹Æa:ϯ)ÌüŒÏþ¿¦b:=·âbÚCibs’¿¡Ò¦¶¼$<Òv™ãû…9Dµuòj\Ê+?„dy?ð'\·i¾çÑE·NÏ} “Í:}·@°”v9¿Ep˜•×§ŽfjqC—;)ŸëøóPˆB;Ñ\jSÍÎæEw|‚°@|‹Ï™ÿ‘1ž‰ëÝ… Xñíçjóþ ¦ï?@g½ùº>½§‹—`?¿[wø_ …ÓG‚€Ä·¬DÓñ3Z^ÀU ŒË yôŽ='ªM›BÒŽæšÁ‡ºŸÕ¥,+"ÄÎKЫ ùZм EPãÿ0ÄJeniCDøra„™3‡©G; üy»Òêî‡XtmS%ÝŸ2òhö¬%$`·=jnYUºbè‹ßˆ·QÈ~™(D¥uªu~ãψβmÏYXº^ öuO•3¡éXìž²Å\D,êøgåÛD.;¸Jh£{*VŠãÀ â'ž¬­ÊG-‹ÿ²o‘ÉkZÍDê…/d¿‰´„SF)ò·µh§ù©Ö8fQ1a›[Þ¥ gzôÄ)!V';WügW¬l¯cŒ…“fxÌÈvÐ}lM¥ ],NúÜ|fZkA¼å$89Èßé ÷Sñ &¾þvþÚqˆsQ3ƒ,$ J©…y·ûd—SþØâ/9·ù)èf>-ePJû† £S`:À#%lŠéЀIîRu¾š+Ý3ךáü ©‰¯ï¿‰¶Ç¢¤œQŸjÔì›xûðHqn¦ùE*Úv©¦JúQ©®†$Áá Ïz< “ˆíˆv l‰„ÖeÍ%÷Û]ر<¸À÷\vðþ…'õ m1ɦ.‹k›soeϤøFÜ1”C¾')°¬‡•:ÙR7‹‹‹‹x7“+ŽJíE?v †ýöõûúAÖë»ï„é­ÃžƒdÑH}{1BÉYt3dº22H/»wŒ>ÆO8Üή}ߦÕ-Ÿ¡{?Þ%™Î3:>PÁzp:åq†RÌÚ:‘ qŸÓΤM{ò1ŒÕh²ùŸ÷’;%Âñßÿ_ëij%Gu£ašEð5Ëlµ4"OéL’B,…R>7Ìéf+ÿ€ú.麵•WXÚ¹s¼¶‚ädEId+¾Jüö a-$ð 𵃠Õ>.f˜^¬ÁZ„»C+hž-ÿËæñš¿¥÷LǦ8¥hÔ³V“Sd÷‚xÇy÷Ñ…ÕèšßÒ²hÒè»ãfêŽÃt]‡ì„âuPîܸpê¨åþð«$mT[õ3ô.°ª7d!a+=œéÃ8 qßF-³aÒ£ÙÕ£E9<…·É$î±A8ÀúÒÌ)ç´1Ä†ÆøkQ#¼ËSªHp¦Où„ØÁ\Øç¬ßoƒš§j„°i&méÐ C¿’:ž¿GÊa±!n}OOixÞ)âý²þHA]po®èq«ñáïtæõ7ž†“‚æ5IKBÈE«Yð³h˜•²»h¯Ö¾Ou9¦Ñâƒ]ë^j¯Ü£c7pF<ìõã+2 £aäƒsi¡9"´âBë®r¸ª§¾Õä<Ž÷ç› øJwwÞ*É`ë‘ÉHF!é¼HKqö²pv(È4>¦r‘u¶Ð'6õxøBw¾A±1ËÃd˜‡óŽAá·´VQ{¡ M†kÓ$$§Ÿ´ßfO0{bݬ1Y‡LjÙÉ3Ê?Ì9,†Œ3[¥WõÚP9¸”kݸ‹MJD;H,Ât^½«7E-ºÓ`ñ¸ÃJÆò{P"¿‘ßnõ–Y}¬¢,"œ½–•ë´o¨„–+œ” Ê;"ø¾³æ-î°*ŽUÜ ñÝP}ÍuÊ„Ûk2÷ÎgR·‘³…„D@ T‘®™“M0ï©x#¾¿t'Câ-G}Ò_Ü$lî깬BúñV½AVÇ‚1„ÆfNÖ½ù¼Ä/Ù÷&8×+]IÉâÞ„Suû„O–†AJË@¥†ŒãBªÑ–ÝWaIë)F4ÕYF`>C Ð˱'­ø¶ ÃAQ âäY),âtŸ’b' SWÎT#_NÃ0ÉÄÜui€Öü‘~j­·ß}D€Q>—Qa–…ƒUÃh>Ü”ZtX×ðÒ¦+7‹Mñâzêfë@I lõ‡f‚ À Á(Ïí'mTOß)eáö=!‹cŠ#ÁÓÿâø)’ôîúȾû5Õ(?øÂ+Zþj¥žPÛ×®¨„ó;Óö7ù×ÝC—kŽ£ìË€$ŽÔCÂB¬?d¬Œ=´ŒïF $ -1Ì—˜×æL?¤¾Ÿj™%÷'Ë_+!΋Œ—2´œr—êê‹9'*u㈅5ek / º­<飥yÉPÚ‘œxW ïœh/Œ÷]Õ±9¬zªHùm¶O3†C´–Æ##`6ÞÄȼÓ÷)ÓÝ0U(éy¼Ü•œŽP:õŒ¡Ü ì¯Z‘¥äÙò5KªeƒÜ´oiÕ#tjVB Ù¼V R[p }‡þŸçŒ–¤ÄÍâä}<á× w›ä~–T¿ ¡úUC6ðI€Ð2ú>ZÅGxR;™2ì4]R)›ÈÑÿëù ~'Ô¯„Ž|…Z–éŠñõVõ(GÜr07BB‡ßÆËœt•ùD]rÎúµ¿\'RPëŒÏñBšw¶¨öŠéµåülµ.Â'¤„M`±¿vËßB²2V?#@ú«-óG˜zÉ‚’1EXt."jˆÖƒÓ¢§ —˘Jô``™!Iþ`ýv ˆLÆ¡v9ÓדýÛY92#xó‹c×Ä1ʈ¿ºÜœ-]%í×ßð¡Ò:¹}°ÍT1C+³äcñ.‰Jb¼ùge$:„%t8ýªHy$QœäR—N¥ûÿG¹µâÀeo!búÞó>Á4;Ý02äüɃä7ž\êH1½²o6sÁjJ>ϯ·„åTë"ÃfÖ)@iê{Ðæ’à†+•OIlhß”4^âî¡Ûíg}´áÖ;9åWõIˆ%WU—kaŒ¡CÃ*2éÌr) h yDÃû*/ê+¿cû¬4ü [Ê©![*AïÐØÿ±+°BâtûnJ7“ݬµW :cŒ-Í΢þç¯ PÇ@F—8}{z`z€&¥µ[<÷õâ6ªÂ<šé– ¼îËÞgŠõãk÷'½ã u¶ÔÆUIŸÚ 8¿†ûœº1U+‘·†([^µç–¬\žøtÛ$÷)ëÜÝ0".ýT*ÅûO< ]¶t¨2Ív±ŒËKdjë ²5ŒèM*5 Ë:4ºúÁòθՄ“5ëÑ‚nt|̸ñGkúcÈeÐ:µÏF FÕ‘_#eõ…§äÒ˜S }ÌÝ*äç:±|Z…@o»Åª¿SÊio?¸™4Ç1Uúƒ"¸ @î^úWì»5-NÍúD¡yïÈØ 7øa×ÞJ½™öZ™n~éhñCü è€/Çs@yTMæ÷ƒmÝ[Ž"2Hrh`n>Øq6É8ö`åõ´‘±t9.”¤ëûÙ"©n1µ Æ„A·H±ª‹ÚöÉ71æÈþoä¸l\ûíp´Ç¤ÓóèØÌëpÈõXDà®öæŽÏèHÞemu†ËÅYY åé§ŸbQ€ãÔ„`*ƒ»gÿ‰z\¦Pb¿d¡§PQ²æW¦M?ÀÕ[AœÚƒÒœ HGXh~uþ`}¿Å®K²º€ÀÈMp%AH Ú¬6¼ñ$×ë›/˜?YFϲ$íù2à%.O²î1bdpV‘Š·…ÙñL€2Àˆ—´a0€ÏAX9¦YÌêÁÆ,pv³¶õПÕòÞÁúÏé@j¼R†RlwÝ}LâXªàBOƒ`߯ °#ÛÃ@~u?3.f¡×ʦ Ð’ì+6ž3U•ØÎY¶ß÷ ööaˆƒaI¼ŽW©èÌŠàƒäƒz\¬è’ÅÂQ¯ÅºX„-Ëœ–ë6V3ªªJEË@§,Ï©îÑPÜmCm—²wë¡Òx1«ê]pƒ3YJ9»"NÓ›¾{ÑýT,_žÿšüÿ/âµÏ¹ƒ†rÉ•˜äRòµq¡ågŠ²Ì©å¡a«e¼¶ A‡tèå¾'Rñ,Oyý£ÒIU6´g7˜KMusC ΨDþ–={ŒÏç3\·¼6J³èÞÛ®“X³³Æ8íåGëô‹!ÛƒP…€t/A_ܤ‚j©³iÖÉÝ{ö¸Ñ{ÚÊ©–ŽMË^ØóXÒÕAOhŒvǫۂuÞuLÛ¯MïœxÍ4j?‹ñ,ïR;êOœ¶]§MfO%ÙO\Sb Étím‰pàÚjlÅúÕί7åÎYÍ—²›#«‰'`ÁS…yþ½{õ}nDÎÛ2¿™">H3c»“£àº› 4:0ؤ ™Œ[™èíqð#~iÞj/Ú^DÃJ/\×öké.E8^B!Í©Ðð!¦?.‚Ô­‘²Ãi…cõõ²¿.8j’êÁ³Bgv2-³7'ÃyŽæ!~ƒÖåßÇXæ;;4°JfA/c@^À=ãÈÿàò ÉᨌÀÌŠÏÌ_ŸvEÞ¼LþŒÅðF4#ya?Ê`Lêj°òÎ_¼áð†Zžƒ;Á +"|;¡ãmòAŠk]’YjCJ£Âìe‡kµ<ÑålÝ­Œtë*)\&ˆk€‡][y+ËDA¼-0.úH%1•‘:éÄ-ÝýÙR$ów Órcˆ‘gö!&6ÒVtnI±Î.Œa¥ÚÇ œ >SÆ#ej´[]X}µ{˜·à3£µú®—¦ÖiÆ~¨,B‹âõW<È5 ÌWÊ2Àú[äUV¦©Âi¹ø]8Dzó!ìzp›8ÃéñU°Ú}&k©ÎOGGF 7œj6²KNo¹v¹c·îLièÜ _¶Z³¼NÁùŸïâÿÅNÙæB9ó¼|¦XÓ2ó RöE¬ÇÚ'ÿ+Pó KBé9>jt’£‰‚wnIéðXù¬Cp0³,{ï®ïú˜¼ö¦zîúx%^n¿Oó²0Zîdl‘Fº&Äo3)¯Z¬iGÚKIÒö@c³ØµŒ=¸HdHç;ßy5Ú3 -QL­zéñLi½„ðX°;|!Š;[vu|TN–`¾¹¤Ó@ø½`9Dy5;­ÿPSIù-Z;ÚZ”3ÏÓÖGECÖMüc&¸òýH£A}‰àýÖ¿smú< liM™èºþï³°Þ±Ù±å•|»è¼›¸ö ·utßeâ…\/´W´ë´ÂmMéµßàVE*çœSÍ3²+ÚýxÑ"Û8pXk;µô™Á6Ö«~ªÓÌ h}l×ìL:)jÞ¡ÿ~þ s)ŸðÛ’³@;™=° Â˾_üugª%ç+ ˆM5õÐä ì,˜ÕMÞœõ §‹FÝ~µõ=dê@ù`³ÍÀ$Ì~";egTÞLÇ.¥òRDæ)ÖnŠÙä‰êïc؉ønÛª³álá‹Pý ³'+Q\uà4g<„ašp—݄Ǻ첥N%ÖÙYsŸ‡ÿæ÷:ìÚ2)Þ³L†ôk´ädÙÙÆ0tÝV¹©”vÔ–Êk’"d'myIô¤ÜÁ K>ɘxbVN Ï*U8T©cϘ¡¯Vä/wHZ‰ÐÎU½¨¦fGæãÏÕe¤#9KÃlFh¿ÿ DxÃKyuïÍ4u+¹€ê¨íäFB¢‘ØÔ÷·¾ïc]”ЋÏ7-'L”W`-o±qímhV?/5É Jð›ëíÅ­ÀM&Síáhׂòîé»jôá,”­õQ´¥}H–§1×XÅäSÌÀ Ž]§F’ˆø8Iã<¢‰¢H·»1@=Gá¡ßºGÍŽd†.tz^; Nøœà #Øÿ¶MÐÈð㆕=Å4×6hf޲ õîÔiÊ0|€½ñ¢öìh±î/Éù*?V]¦ß’b3TÁ7ä˜à\Š Äâ·$èå‰'e2ŒšÀÐ8¨Å—^l“°:Ê~Z' œ¦Ê¥U˜Ø>¥GœÃñ3M=Ë»ŸøOÍH¼éßÈ“}0šCQûkN»F«?Wî¥ÝÒýLhнÁ\ÙÖEò5ÝWâ[íMµZMRÅÕÕãü¥Jîâz¡€§k÷Û}æÔ®žfA×r½ÔZSø›AŽ/tÓ’L>à+û5î,.›u9m·k-ÀŒüÈ7:y¶M=I*„MÁÕô4¤ íܽo‚%à…RG[Äm˜ÞøZ°€ùÍCۤܽ‘[ .Øì,ÚÿñöÍá‡ý“¬òò«óŽ$]ßa›¸S8 àïÙÎÇÓäj`›â~8§úϪLÖ?v³­’×7ì™tŽÇÆTà˜ùñ ¼yÄôHâ ÔZžo䢋7É!Ð:®“b kÌ€®G­„©Êé ÒqÑi—A…šÝ¾™"Ì*IÁåd„Åë–{´FŒt „—KbªµJ}%«’$@·í€@‚ÚÅ•ËÚGïže¿ÖL®›_¼áußbÂýÄÄe&Ø ß{ ®ÂK)Wh%~0–Ê6ŽqŽd[e<3£Ø¯KüæŽÑGñ ÚµöV÷½«˜ôŽÄÆs\2ùd÷+èŸ9N>VòN¬ ¿ õ*eÁb–˜@¿d>Ù™CôpT„JuzE°ÛTð™ËΛ¨¦• ʰµš+¥óB¦ñìÐõöü#X‰côŽÒ€’Š0²¢°¨™M‚AÀ ½c&] ÜÆ®¢¬ÿà&œ*TÍ –†qo˜a¦À]qÕ«Ÿ'×m4wã´E¯æ«¶¨ˆ27:Q8è,³ÆÐ6Ç8¦Ÿ° uæ±è NÝ“;²¹ªË¡}¦Nxaøã±ßühžòY'²¹¹™hí¼õ*„¢]!Tˆ¦šgþnêºCn©šv„ôÈÌØ@/ü²ÒF·,XêB¾ºêНåñ~ ®9”7U䯩“HXÓ9;s>Mï€NÞ¯ºrxHlúPµ,ßÏd{à¢/÷¿ˆlÈçãŸuÎÕÈ˲x³xmÆ >ó)»¹ªÚrÜqk7u3~^®Ý+ˆK>ÒNÅìÚãöj ¬L‰šTÖª9)Ýi©p$ƒ‚ô¦îûJòâaÙ»—‡‚^GdžÑ%çÒ&Jt(£Ê‹áŸšœ.grÉRîsPÚJתcQRÙG<²wâëê©7¾Õ­(…û3¸œp¿e} —=ÉŠÇ b¤Æï6‚oêªÙÞ€ÊiKœ+¸¶~qàUÅß@ý‰}¬ ¸¹ÕèUv®â.h±rÞÚCkd¦Þ…={×Fæó•’%¤¥õ)¼Æ !Äv8?ª°A ³>×`¬y}E ¿\2؟͘ª '×­˜øÓ2r†ªÖ¶S^ïõ_â˜_\8Gæ`»Fxp_/$ξcÒ û{4­qi7ƒ?`†ï³--Ô»;ükeÊ=¼'¶UúÕšŸw:ðWzRN†R¯¾ñì!£+!Ù-3îü³D3’µÝPÅ<\&S˜öò„‹×JïÑ|LeùJsíù‡?†5‡< ·:3¯H¡Å£` ³õ¹Š^8?8(”ÑPo‡¼èJD- ?§–‘–™KÇ¿¢Zr¶‹Ù6çÐRµb°†‰ÕçÐ0ÜÁÝ6£… óyI~r(wož15ÄML݈õg„nÍuÕ]È JÿNx‘uÅ\tË)¹ÓêG &zê³ó@aŠ-N[>˜]#ëe­%EÌ".‡øWZdt§ÅLhUFAc¯Áê0ØFs—û(ÏiÒÔ8§+¾ÊGY¨^V¶Õ‰Ü˜ÕÄz'!xkepQH¾Úy•c"¿4åRB!%íÂP¥ä¶Š@·G¬À›;¤+ñGã’;Ëô¨Uu0§=Cnþ }kà5<vOûv#«R;ü:ùÁ!Š™ÕN½dÁÙ‘G2÷²Cú}ùõëê±´Áç5Š/@ûv©ì˜Vo$«L]Cú ྠ²Ufx´°jm/+èÔÛ$e’ã¡¥³¥Ä²ýŽyWò`[в†Mz+lxBøiò0ª ¯Ü›$(YжçÞø°Û!× WãïÊÙV­Î«DîÇ%º®^ĵ!¶¾T÷æoÆ>’¾"‰«Q®ö¬ÕjïZJ ·£þv³ØŒûÿ營NkOM~ûH»cK¼ÂZP_iEQ„>þ¢±v@,cÞh¨P²:ŠüÚG©è]Pû\¶úÊÈÈ~ÏT=yãõÁyîŠv1 ºª–:³ó¢³ª¢òþËü2üNÏ vÒ¹ÞDÞV†.=ß´ÕüÕÆYƒHTöŠZòãǵ4aÐŒXþö]@%PýôZÀwÒ5 #Ñ:(¨LWTìÞ¾š²YÜܽj G½¡ÀÌLëo|ðkó‡~p%³ŠÙàôBþ¬Gw_psôèP‰±–éªâ§Ïgº”ðq›TÖ„ÉI_ç{Ð(¨19Àï¾Î’¿oeøQZÿ„õ£-Å™©ý+ãòΗo:k¿ÔàBk œ¶R'ÐßFäÌ!ÜU+÷±à{7 JŒ—¬c™çÖøš!é[FyqÜ~s ÊX Ã$Ò“SÕã‰b Ÿ´½©RK:0=o¯–úY1H[vË^VÃݦÌñääE(É1Ã%¨Û÷€(t²a6¥‡mÊtÀ2éÞ·¬`âÀøæTéàš|/µ®Kýíä¨u¯Ž2I3ù$àã Ú4èpŶôܯT\§ Aa­–WNŸ…Ë Rõ©‘ÊÓ'qñïÛY¾„¸" ¦äæ\ Ì‹ÎÓÉ9lY•I[@N’æF&ÌOˆ?«Y¤+˜ð{„cjwÀÔT¤#)_)£@Î'ÂÛJ"FMAÍ삵t¶ FZÆ*Ù²J|´¢]дãµRˆ‹L¥SWõwÒhlD#h࢓³eª'‘/zñJÝe”gMqmÒÓ%v¼“¾îÞšAØÔ¸X}ܧBAMkþÐHõ_…gÔë‡oŠš€ 6ÖözÆ8 È$æu `¥Nò…w°lÇùijiQ9j`£ñõx­JÙõ“BƒPm“§,!n7jR…è£óµ5Þ¾ÎÉ£kpõZY_öd ®þ[Ú…’ÒÆ½óÀÝ‹vÏ ½w6ŽnO=X=דN­ö,• ×§žOB‰eÿO&„Ëy—ÃûR™ßŒ«1¼4³î/åÒ{%³®Sƒû‘%ÿÀÜØ‡è:‚ã¯AÞ¶LDí˜ ¹ík"ã&}f`ïO ÁÀí%J<´…ÙX_ÓU3ŸPxPÓË¥çèÚû8Ür²¾Ö0H.]´ÐXu8gkÏ„íþòµ½®é–ŒÜD&ömc@¾‚ý2a“UOû[åIÁˆ|î¨á¯ŸLZ6ô´“›5öƒ–¿ŒÓä4z‹ˆ?¥°1|0šjÀ¯«ý¦Ô¡fA’鬨åDîY^sTi §LaŒëlçeW‘ļB(Ç28 Y4ÌL©×&÷WIT…íY‚$ù ¨›í* /˜nahïŸKCôyoª_ÌuÕ%ëŠ8ÖoZM²•äz}‚‘ÆfxwK9ƪ÷jKä[t¤) 7Ÿ€`mõkòOà’¹!©’rñÑê˜Q£:xŸtýa9°P™ZŸ-ØtÔÆóµ°¥ê›OA4mhR|t¤yÁ{»PNˆ™Ê]Ž$Xñ&1:šÁ@Õ!dh¶þ.»Ùµ¹„þ D†°:ÒóBÁV1pÐÛ3%öÏ{'v™Â‰r[hö6¬}~‹§6êö-u((;Ò!êrÀeFáe¯ ¬~s};®ºò圓a5ÖG+— ²-:ï¤)‹u"WF¦‡BT]ÛIµ¦ònîµ:Á³ÿ@äbp,½lmåým>\ Q=`Ûc”òÄ©4^Ÿ ê„ åö'Â!¼®Ù¥‹i Èžûêö‚Pž†0Ø!îKÀDÄy‰ÁN¶˜×JÄåŸÜ=š·ÇÉšX¡}b¼E´p1è–ÚaHyRûBiÕXo¯š{*­]ïè¸R^ä–ÜxY‡—ž;h—ÆéÿöíÙû¶¥<Îóþܱ£`¼Q®æT!{fÆÿ SÈå0HLo±è£šø^ð“ì'¡È¶MAfD lFïO»Ìñ Ì Ê|ø‡.´Õ¹ŠAZ¨÷íÆ :9št åŒaî‡Þ c"‰àû!¯Ó0mŽ5ÎIüx«ÜòæA3fŠiùèP¢Uæ¶@nlC©W½FÙ‚ äAo`-F0=Uc;é]¸òy#Šåd2ž^›¯g¢«÷Ne:zs&åÌ;(ol¦³ ÷ii^¾eJUÀë³D¿7npø9þ9‘;,v·qu¢=ÿëØÔÛØ/ -ˆüü0G¢«bG[N1Uó\S!a„4½?lz¥XÓ`¯hÿ6²9^»¼»rë[ÌÝI`A0¡FsœÓ'·‚h0 Ô)qìªìæ¸àuˆ qé:kx¿_+öuÎ^§w¦šŸ÷D}Q4a§Sú$—fØ\Žq*bæC·/cf–æÅ³¿çˆFTäk̺ïá¢;k&:`ú]Œ*˜Ë)(èXçO¬"v–ò¡§µãp4L»û?íæ’Êïç‹«i±‘Ö/ÎiX'åâ@ôf1½‰ß‰üëëœÅFõeܵËê]ßnr  6ëT\.e1 ’ˆ÷!€¼îŠ3¿&÷߬[X}±Î­Ú*1ªÍïvHsb¢(Ä­Ît6étõ ƒpŸFYÆÆ#~2H:w¢nmÈã$zyUj66þ#z xr }MK ðÝlYÒšÌ.ÝÏpË?rOx^.3BB8–ƒ‚Ý„ m49g–îØî­Dy¯§‰Z·%\êyèQZté±ô¢ˆ®òn Œjäh›ça¯d]¦ÅZxĈ[pÒ¹(ìë6g“ïÝ2›UvJ’e4 æ×Éù;SS Ò!™–hÈéØÀfËÎA—³ìÛt½¸°2j†dczÆ"‚kÎ|ÎùpJÛÀ¬§Ù°ó†ž¢1°#A‹šB‚eó›+x¸u–.øšby¿ GÐQû¦Ìh·™i{ D—`G ç‰íJ†pÃsËý´Zê=5™¡±dôÎñè˜×yù\>ÎaP.µ Á.¨@Mk›B2ø`måaFÀåShå"&ÕJ+¶µ8LJU·„ƒi-µGù+U‡¸ ˜ŸÁ¢ïôè»S­\ÎF¤ÕNÛÌ&·„`ûjÈü¤5ð­JVfW¤¿.ÝUe-HHì±ßCù ™í›ŸP#ËÏ4¿ ²YÚf{ÞÝ— $ÄÙ~òÞV2m€Sÿ}³ƒdnUˆ9ÙîQ2¾H·3”úgÉ¢n:-ö¢‹iÑkK7@f 00 Æ bÐ,h9Š<Õ(^LpùÒ¯&˜\¸€fᆟóίnz$½¾¸ šõ[<©±{ +ägiÂç-·‘ ñ4Z”€ŽÄ9<÷@CãŽl.ÔA-³½YüÄgÁGuå8ü¤¹+³:p£ÕU zfUœº‚ì!\ð³1 Ð} éF|JÃG­šƒ6©Ú+ò´OÈéÈ8wÙ›¸œE¸h™»NÒ1n!Åxb;H½èzXM”§F-ngw Ü#4¯lo]FÐUìB.J6ð­šÅPga8Ä…ˆ,̈èRBÖøðÈä¥ö–š²ÔpVáÑS¿V ͳ8Á¡(êꇀšwÐJcvÙ6äàˆB>¦MDûIÂìÄêG°:^f®Á‰‡§»XOn"í,p’ñ¹C¥•G÷±Iþ aDBÁÆدäUªŠ¯¬¬ÍÝ_OÝ}Ôü}߇‰©I1×`J몗QýR.Q[|ÖæiÁÿn šh›M³&›Dhc8a´¸¢È|zœÒÊŠ¡“êÇ’^y¦ŸI%¸Zç+ž\e ÊêÔ?Œ‰ã?ãêr^ µ·Xòˆ=SÃPdlY¯=´À±ËäõܧçRöÛcõmaeSï{1ãÚ­¿h *qË"«¶¶…W!ô›æ×óâ5–s¨$dúëMài_Íá”Û¯ïÁ¼{šgTe–Ѓ²Ç=@¹;§ÎB$t”Ócq«°…×A "#ÅšrÌ–`U`ŽõJ]+¢÷~âµÚ$ØEa¡Mæy€7´lº"§ ‹Tó#ÞA“Ǹ‹ÚÿÙ2±>øç<¡»é€#-I—['ö¿¢õÃnK‘n¤žrÔÇšðóºßÞݘƒ—Ûäºâ $;)p´DðïüŒÍ†l·îåÛR'Ù䟱Øt Š’D‹Mlߣ‹ƒç* ®c3rÓ~v9æI×¶!T:ÌŠÙYRQ†RKôÁ²cC²‘ ïè7à;i9t —H|D®{"Ö$†î ÿ]W ­Á txpÙœð3)U忦Ö2ö±‘(z£oYÉ©):ŠÝ®×uÒÌîMˆ®—  Ÿ—5iÔqúJX,3^R°3ðsãC1ƒ ú‹9~Ô2v;–½IÇ—äZÌE'g47ÈÛ@z(Và°’uÂ%^‡»Ð©—XaÊ‚âЈZi'# “}L±2OÔ >1÷ʯ=«Î9 ¡,T]5<³¢ý1Ÿ¾0€Ñð^=.d¨}ÝÖ¶q—…zB«Ãaò H:Ðw}Î¥+Æ ª€r줶Nƒ×ÿ"íøz·]ñK”ŠË1=¥i|¼&?¿Ä„ÃÇL\á@O±Öª3À!Í‹5Îúæž@-Ÿíþ†Wã v¸ôñÞl38^BÏùû”E~Cå¹k@=ÉàpØ¥áÊ|LT÷¸ë¥/Jyñ•0O"––¸áq>'ÍÌ<¤Ñà»C#ȨÉz‘gº½A ¥Åö–XŠ ?Þ¸T (’꣛V•ŽK…‚ªuŠì¡¡»øžjúLÓRÈi¤Zu¡ƒoIÀ‡¼‘,jÀƒàÆX˜k‰îjýž81ñ¤r¿5ÛBh¦¯{\"³¾»–~$K/FØpû ˆû[ »-J™)ð •oÜ~ѣ—®#[´âþ1U‘Tx>l,QMþ…qÒŸü˜ýY¿Ìú³œï:etbmÈ£—”œ{0/tµ©ÕQü•UNõæ–ù|T<Õ”…­¥Äq°áYÃ.4“Âtª%3ÎN«á ?­Ø‡­!ú w…([>˜w_÷zì—ð7ƒÓ “G]?¯Âã®m},ï²'ü1”È ¬- œÛè«Çÿ„à1#êÒæ¨¬¥;mìyòýG -uÁX\1 èщå—Ôca¼Fa£Ñlà“H<½Q¼ ^'ä^“eZóò“ß힟AT<ªßi‰y½A}£ÐˆtÂ`ÕH_te­7ëyVíLÍk•n;äà\›A͸&†KóŽz“üÒE‡YrÐM±a*3×5¹ëÓ›!J8h”EÃà"ˆˆ%rºd Êú×pî9“~$kHæê,üÇ;.¿*Y|'ãÿÜEæ0êÄ5Ëï;ÉŽãǃôHÏS Q\Ò4Rì˜S1x×qÃa5£’ÄZOEñµšØ7Ò š¦Urvð­-!¸V·¬Pš”ÿÍÞôôa°ƒL*÷ Ë"[AçÕ¸Ì쇦dÎêÒWë¡„Ñ-]¦Ëè/Hp€…‡9²­µ¿ø­AE¹ã©È8D…<-5ùÖO^ô ¡&Z3†{g¾<œzzÆsQHN^dì¡ŠŽ—-’ Q?û:b×9Íߊˆw /¬Ø`}]¬Å¬xm0£  Æ(R5dI@-óbBÄ©˜?z)EÎû/´Ã}×Ì>õ¼ðN’c%àðJ¤60a£îëîý;ËÚŒ|%¿Ñ¯Tlm·?gK z­ l³×À—íiV×”-ËË w%´ËuÙ(*‹@=Ò²šÇʽTWÍ/ /ûÙ¡-à  g¬†KÈ,X{™fuZN§f}Á|†ã·§ýÛ¡êìtý¸|(: "´”›HAkæ°“¢%⦨ÀSÎ-ç­„) ÒS¼ò´yÉx÷·L ô°üÿògn(ÏdŠÙ£~X™-j”*WâYÎ¥´zÕÉ7’Vü9Ìh3«Ù—ΠPðþèqXÑûyT¥Ç;Ñ RàCK,ÒöÞY¬>¶•ØTÍ[Àào®›#|¥«B±pëã’·ñ™2M)í}:\³mZöi®†|«gÝ­ðw ¤Ó»yB™6V–­õãܾ匘€ØGZ*3Ü Ù¼#œÓ¡Z±o¨hÞ19|ÂÒ``ŠšN»!‡¤Ì«Ù"Œêè¥ç$êø]IY$Œ‰–^\ãé ¦K ´e†~ôâ»)Ì:±¾£p)ÏÓÐà+=/y%íÆŒÓ›„Ö ë› 64ž¹R£s·¦ÅîW9žu×(€9ãÔÛJ\%B‘.˜ vña´þ·cªÑìÃSºù³EíÌgÔɺúp›ŸÖþ4^îÂèÜGwu‚õ  Ò£8Ï•´—àdÝ•€‰ب…bgà3d—•é¾0V8–ŠÞ–P‚ƒ­þ¤ŸbùßUjû©0~oµšÝwͳ“‘¡Û ø·Ô¾Ô¨›ý#ò•ˆèöñ_¡9?þZz!Ó^žcBN‹}x¢å ¤ý=Ìç¼Êul=õ”t ( }Ôü‰ß:i½ÃIR€ºs–AA$r¤Àæ}pHókË+6Á ð t”x2¨G¤˜–ŽÃÛÍ—ÆßÑXÄŠ|Јl©àåO"1^íÂKñ+£MTÉë ‹2Σ²_>ö˳ ¨ì;´â®i‰Ó¯€¾¹ÔuÁJ ,´zld+M˜@?+–,<Å$Ñæ{"º&RtmAÆ ŽKTtMŸk鬉( ¬Õh‹n>9Ap”Æj8±$Ò>{%Ä® nª"3«‹Õ|…2ȯ4£±}zb¦º’Ïèý… x<¯|I+Àá½RnŠT9JhGVù†=WMµ|7 ˆæ9ŽÖÖÛDÛÜCf·õ{´{3©IÄw!§±ôƒ-)J%V‰VÙðaù&`=y¿ÝÔŽmÿÍR6ÜÔG‚ï'Õ¨7ãÜå¶¢ë7PåÄOR.•‰_ö™GªþÚsnÐJY¹tæ×_$Æ SRÞ9jS|J<ÍEçí@¡ °4«Lþè`^dK¯’!2™žy4.mΡ×öC»ÚF¤€Œ.hlŸ&g?)Ì|5{ !8ú/$tY–ßpŸÊ|GÎEü'“¿Ê Þy?&S=ªÓÙ¢-èFn ±/ßËi‰©¶ý­·\eêR!ÍíùZ=-3#–7ÛšR…txóD"ßL¢ËÞTpµµ2oÜ9aR? ôɵ\.»dŽnÉé´ë¢éílô 嘭>ŸÏàmSE«hìùp[‘ê-/;J –É”OuÇ¢›“§ жӕ`“Ö§ 7À÷ỲÄï&¢}wäã†È¡¦iM=[>O§|tYÛ~`¤±›ïÌLYéNsGœ]uK™¹ÉeVþQ¡èŸUÃÈPy¢IjõÖº§$t‚ÎÒÏ*6€¸™à€d#›Ô”B]  ,ß&&Mé=çO×c'hÎu5øq¨™§¹4ú•.µéµFùl{ôe—f*&Mìm¶§qÜÿ6r[ô)X»ªFûlt넊ÔkW-M¡\»ñzpoôIèïrºæ%Yb^”gý÷ùÏ$m¤"¤N?5Zk)ΈÖÀêSß…ëÇ™4í6CÑ[{{-ìôžÂŠþß9$¿«Ï#l(/ÉËáÉäNk€×Îíè #aÉ)-{!iÒ“©Ör0eÍmYsöz“ìÿØÀ‹¼Nûç–Íz¶›)lvˆ¶ ee~'@aX¤™L’æ-ÒRñôâe¨¹®b†G€4<“JêàÑÉïÎÚs­tšl|È ’-e¸bPÔÒçdv&IôhÚÁ\Œ°È =]ê ‡›ûLh/‰&Ž·Ÿ˜ f‰\ïtùuWSüXjë×Üï›Ú)~ìÜôå7ˆ'ÓûÁøùW€~I±7RšE¾8}Qe8ú “ØO›™ßHºYPÇrÓÃ;'•¶@+ü¦ Õßxa ½¿§l <Ì)¼Èè$“Š T˜t'_Ó¥h÷‘÷·ø­bÖõ8Úö½˜?C'»Ö·ú} —†'Sšîbý¸hSîâžc4jºu[’|-·ømAæ´Ü !ÙˆOñ¤ËW#ÎòfdŸ °ÇPÏÑRjú÷ª ùkÀÃÉ ÅXüÿDûn©Â¿¼›£ä¬Õjóß!¤­ŒÚ/½b© è‡ü‰–·s~,Hp©"P¤h#°×¤EK "Nˆs;ö³€™WŠá§kàë[œ·Í-O?ýäÓh3á.ÚU­æ¼ÜLƒ_@«–þN¬ò`£½Õ®Ñ©ÈÂßè×|Üû¤q^ÃŒêN§ýWsèŒâêÜ ´†‡=«ô¿€3Ì…!üÝÛ,׎ʔŸ²¨ÿ°úƒig7Ÿ¥mm2°iÛc(ê‡1˺feÞ~ãC*š±ÎŠÊˆ H@¥¸ì}rf/„Þÿ'Tiª®+9Ž •kƒo³}†+ß û¾ë7¤êÐÖw™˜#:ÆSnŽ0.¾ÀÑH¿ -bÇfêFµNn/e·é{—2È·rÓýþÀøçY? t¹çG+æ®ñKõ‚NÒ»5¿È”‘&Õ‹SJ ñ…°“c(ÓCŠ®ÜÙMöÔ%¶³œÒ0Á.ýÕ.vä%’x»†Oi*…±Èw¨²Âs˜OŒå§·0²œDUô‚½p `Fõêêô§šEúDC—¤å)}(œþ_e>Ú2Ä»qv~†'Š}¼BŸpûY74Àá,òSÚ2»²Çu@&;aýXZúAÈägW=ÆÜPz0ÚÔîŸýê"Ak;h¤1 M^‹áûõÔMŽn¼Rœ>#å"Ø3‹ÞN¡8î–Ùhimš”ÓšÏóP:½CвgFèñ;]ïdxÖv^³uð>dªú]ÙÑFvÔzGu †Ø‹Øáîãy}"›µ_ëâ=¶Y†S?ÑîwÞ™óÂK>ÿº¦‰"ÑmxÎ÷B'Œ´¦Ýï6|Šz j9O¬R¤%É(«Ñ¥¨âŸ%ÈÅ!´MYsb_3 ª™ná³(ñ6óE©…lí³ç^˜ü§d×àˆŸ·ÌÁV½8Ì­•­¸‚ˆAÙM S3> Þ& MSÇ.#bMi¿éyOæwLˆ}“‹Æ.·Æ\.•Á@–¨‘ØëÕˆWKLå]`ê-ùüF¦HuÔEh„²^ˆŒq…㢶DôªE Œš¬Iª!W鮓,©©/¿ûåQ„¤~ª| .ßSÕ‡ßG7‘néwŒØtd7îÄ|úqý†°?#/¹€±±µ“¼€@tÍÇÅÑ ±ªyVåU÷­'~ê¶,ôŽÃ»’Ã:ÿ4v"jun«<ƒÙè°¯§I.ˆ ‰e•¬|gRå¢8ž!ãJÁ½½Ç¤í—#¦Ò}]`ÍQñ Ï0slýð¯_.CÙÀ‚rPdãŽTÒ•zNžùÑÑû6ü(¢÷Ö¼!‚)ÍÈ_}uEu¯>SödÔ–ä…ÀD\âåÕNˆ`íS 7eŽQô´³dnà9Ï`_kHVb<8C·FÄ6uÜ8‘"nû€,|«Ï;ñ³wm"¡K¥¬b4Qz¤C3“Š@‹ó‚»5q¼¬îæ¬ns;ú½³‹6±Bh S¾§¯ÚÙþNd®7°Úå¨ñCÈjžëâ%Q½µè áÁ=¢Ê³ÍÐ&9+BúZ£¬KvÏg¶H££dÓÜU±Š‡ˆÃZ9VU7ÔC A–‰".)îÃglµpXs\œà,¶üÉöŒ´âzö¹0TïvÉ©]YÑÍ›s–%IìO²jÝQ„7 G…F÷o]ýyl^îŽ_&B–à´ç. É@ëT'Z®€ŒÂlÁð-+ÁÚÄw¡ágÑÞ‰®\¸¾SÆçñ„Ö< ;/!t-í`òéËD´Ââ‰eð™Æ1ê^«ónW;°ÿͺdð=7]}e÷T)wXŒÚ3W}Mœ¶S5tåˆ=®\óøºwbji|Æs6Á—ú½ÿÖ«ý‡\F†’ºÖà~z£`qoÍq`½%c~uh¾#CÓt£:;¿<#?V;”üh}Å‹PrÚÙc†ÅK”!Í·Ïpû{Éf Ÿ&5@dÇøo—lxÒ LT6ZCÁ¹¸èaJöAn8x·£np^¼ð±^-N%ßs$ƒó¾˜—òO¨¸Ö^™1>¸ëR[z·J”¼À-Ëêr=‹_›Ät}âx6~¸¡T¹s®?nñ©zì—øìh/Âi¥i6nd‰¼ºÿ‹Ü7„žírDV‚æo ÑÖÞ²àÓ õnÞf­ÉÛ!&‘m[áè)a.àð»šR Ì`AßÍ»Ãj¢dêÖ冽üÉöS+‹º˜\»š¸.„Ú%k§®@Àèpø Ý;þ8boUÛÓ£Só£ÈÀI‡‘Ê þÑðz80þé Y¬ÌΠ¯šŠÉá}šWÃbÓ"eÁï„ð:,H–À:yt¥nÞöù¡Ð{ÙÑÃJÔ¢ed-1úα}µŠ4.õ¼{L59T’ Ïíì<â %õ ¬x•ú(.F:øÅfw]ÃTGr>aÕšgI“™uw¥3ùZ¸n,¨ËL |æ . ­ˆ·ùª>*0ô~èkWLKf÷µÝ'i›çjóç–Ýà &ä1-Rs¿ÛÁ’îŠh\Qv¸g‹m|Ñ:xÊî»ÂPn¼£Ù~a}~¨ÕôÁÆ&ClJSa(‡·';ýÖ%co"bSOb>Âá¶ÏíA),€bMIuqY,‚öÛè¯^l«¤-˧ÑÁìþB'ZnÔe; }mpÔCÆŠÄ_œô5aŸòˆáV¦ˆÀWx˜ ¹mò-Ü80IVï¢ì¯¤÷CNV+ýQ´h.¤w”…whç]#Ê!|%OÈPÅÇÉÔ"bjî­Ä¬õ§…!uìo ÊvÚ²o^¥ºÐ;Š7œžsA4ÖEB±5ÚD6huvÙå|g‘”srnÒ42N¨8 ó¸êÈ7s$ëüì—°[•°ä°èÓ³îÆò_eG¹n8¶7÷îaJôL³B,êQî|1$5Ò~y¢ä;…R]önˆJ¢ ”èŒ0P˜á;âæå¨X|À‰z*Ä+´ñØqì{¤RÞn´¼F\î|'£.*Ž"r{sX^ô/–‰8WÙ¾—FCÈsÍXÊ +89Šë3W£b‚omé4\©sSTR ÿ Žû€øû°R1îPõÿ´£DÓ£8~žË>xkÎ2Ïæ'NâÛM³ ¤¡˜)°Sæí»ù;œ;âøe©ÿsŸƒSsÙdˆ’ ¤#7KÀ4¢©]1÷>äÄGïÔHH„#Œ½Áv*<4€ðRªŸïd€LZønxÜLr«ÄéóÐÿÿ~ŒÀz E$¾Ï½«€´@^¸˜çœ ÿ‘tõ&_cÀXßßñúA¹Y¨œjŸ€ÙY;‚´p¼£TêZÁú;N Jt®õÕœ®ÈßT¢TŒ8jÑÛ ¡ÖŠà™“V`oï½Á í“~OµŠx“¼©³ ú)\õÅaŒåex¹~Ê+j%Ú ‹§‚,@¼»fÐx+â†À^ˆ}G‹îw’ñofª–n«[J“«å»ôjÃҥ﯈•&'´›Ã8K¨®yŒd÷»Í§*›8pÐsönË KnDZ$'5^½“*5,pNµ"Î1§O©9ä3êÅ‚Ùö›ÞWöÌØÙ\¢¡ˆÀYDÀ¡üÈ›²6$2ÅôUî£&‚`«+Oã‚.œÍǘà4RTx}ª&x¶k­ò䀩£¬gã)0?Кðn²ØKT]…zÒèg¨ç<7˜à„ wÜ‘H"¤¨ê b^¯>naö0)?öGWø$‰¹vÎCtPX ?HGp¨s™òÐ úVž`²Æ ¹êîh©íÝt¬6uIæfUÇ¿¸«?[q¿$æÉ[$v³iu¤× Nø¾÷eˆ÷…òjÚÉZ®Ÿ×PT©ª.v@[ kb%RçxŸ¿¸îãÄ„&YÿW6g«o|î¬Í¤¦G>rjÀ¶ö@šÈ‰íìN¿#l[f7ÐÉÐÎ{'Hõgˆ§iÞ¥8*²jµºZò$šwÄŠ¿Âñà 5µ`µf0„Žú¸ï—ªWBoãÒTBá} >çZ ë^—MDì)´5ÂËMû®ŽÚïš.ŽŽ% ®ê*Ý'”sa®Óyw6Šª: Œî<Ó)O»®[Á›F˜\‚¢mP‘ÒíÄ¢5'X"%¶,—få.ØBÂ¥A! _)¦[§°·tØüöh¿÷FŒiß6Ív$Í%sô¦*#€Ýzëv´3ÌcùÜá÷ÁqV±~J6ü†Þr±„ÌkUòCΠòÇŸÆõI ª&ë¿3ÂFfO¦«ÍÅ"ý,?°{+ cÄß—ħäC!meC`{q¯ÁX“»E¶«¡1™iYÒT)çÊ0Èžû‡LÁ f˜‰1\ÈFcÙ ò¢WÜ€FgHýH"¶û_Ÿ*—Xiæ9B¸ö±•ý ‰ï¼Ñ[Lñ»Z†›2Åyî)‰ðÖLqÒ\^î ls'ódÞ¶1;y7uõË ­ZW|¤XèÆ¢¦è§VÄä'o6¬‘ ºïU+[-y`ËZHj™+ àæº Æi4!"‡Žò¢úKeÚ{ß7 £—Ls­1A¡úhÉð¦ÔîÆQèFy=àja9B ¸ç l¬?Ýë»K8kÿrIi›\G­Íâ|­Ù“Ñnå€ Ï©V´uÌ9Â÷ùgž~à“ÙˆCÐ.ˆÍ _ц’y›OQD„Î]%ÒðÑ7?NŒ ߆anNqÜð11oÌ  Š…t©÷xÅ¿P±Î uÕü°¥’TÃ)µ½«–*äiUPoéã¦xlÃ?[BP¾ ͶTñØ÷¾>³Óbeã9¤;ýªïˆ•BÀ7¾ ÞÖ´w>~ž½¡åh˜—wú^…Ѹ®…Ê„5ñ^æï”_Þ }þÉ0ö5÷¡g‘…È{ å^•ç¹SF“´"©³ˆIìg®lÓ¹…¹ó¬^F"QhóKýéä?;nyê²»T½_±H—OLl 匿18 *ºº“ß+'@6ˆç±ÈKhý"ÒðY‰TŽÿ P~bÑá“ ¾öø±º0hû‘‰Ý¥ÌecYë„úÖÅ^#Þ)’A‹pTÝ >’]BEpI] ªâ[IÑ0UÛœc”•ån5T1ÉFÉ1ó¬4ʶÂgÀ0X JÂid—uˆ°J¹ñzåYP±ÅÌü‡Íà뉛¬pÅLÑöDŽ] %´†¿‡!À|&šàÿ€3±¸ôÁ–nÏÆê<-e*¬ÇŸX™ :‹X «{{d›tÖ¯ñý•@’ÛaÔ¦I“Dl™Ô¦)¬ºÇÁÙ?“”ßãW#¿ÃóÑÒ]{XØV[ð3uƒb øÈ23ƒmœ3¤ÚJFcÙ–®ÉAÒðÞ CxÀy’L>¥§;\û5 ²Ÿ˜Nl–¯NM¶û¤—²eVÇØ’G&b½wª‚È!kºl&¢Z’‡Ge·ÓaññK2ߨ§Ó7ܹ rš™þÎñ˜?R>P64ôßž[=9_m³†äúAµn˧qÖÁ스´ ×p‹v·®w„i´=ËCá:V¸R=ԃߵåÎ E÷Pä­¶íŒåè­[¥º7θøÏ”`½ÒåôFàí‘\WVÖ* H÷oo!s,àïSýlqS1EI®O‚žÕŠ­ÜØª ÓÏûdÕ2‚Xù¹}+ê3@gú«8 E§M¯ŒœÝ7í”$©Ñ(\Ï}&Ë®Vã6/Õ"®“D¢Þùq>ÎvSSuÞ½à¼YÿzÀ'©5;9Æà7ý8ãu9ô›”ÙW ä„N¿¢rˆA¡Í/Ú¾Uñž¿× 3NVO)ÂÍY£¤Kó‹Cò !ŠAÆ1rÃfªP³S2Pëý›Ìkª+¯UÆ®¼‹ÅD[¼uÃý¾Mר‰.ž®;ß(ò3ªl8“õH›Ì½tr£Çç¢ç(ä"nqPgÚkîo·F·Ðâ¢Ãóh"%“¸¦_JþŒT[)ÿt»]õæ? ØíÈ™ø/Óå<Ïh-0HÅù¡'ÿuã[Ï˰®ÓЄӄ4Ê—–ý>)äUËïrNR\—X˜ÚtE¤6¾ÄÙT@æ>ÍÄh¸¶f¸I™[`Óׇ8׆zmÓþGÞÏgÍQx;qpöVÛ퇂´L>rçìZÔŠzÒJ$Ï“G4ÀsVpýs/÷M>J´K½M;Xe·­d‰ÉØn|=ùkæ~5É„3UøxB¤ûM¤‡ñ “»Oïu7J3”ËqÖŠ”ëf ¯ŒÀ:!Dz…Þ<>â"¾B’ŸÿIÈFefDª½6þê¿ä¹D¨ƒy³1“ç`‘…9õ8áÊ…øGU=rWi/kˆ<¤–Gø¦â¨ƒSNGÉHô‘áòT"ý}D„É?ä…+òKÕ*üæ`W¢4ÑL5eÒŠšýúWÞv6sÜÜ‹nƒtíC]TMŠÞ‹=±WNxøWîÕ¦öA䕳|Õ˜û)@Ï~^?À¸˜þCîЉQÌa‡ã‹1ÆQÂà ƒ›9 tðqHZM í»Ã'„Y¶u€Ý æz¸ƒ)ãÛðþáû8} ˆ¾7Eú™f_+÷é“h<“Èchë²R3&·Òެ{-†ý—`¥stàϘÃ$l´„±¬Ó--~ûG£qgø6mP»PÛ­Ò,“H#ÝB}nüÃóàlStŸ\/èÒcFvä`mÝN©‚oimðoqëö@Jú¢'Qš… „”2HÖpBNB]³äý{)/»äQzª0þnQDüU‹e·<…q]ñiL¤Ì(ú°Óîjá‹òè Z̃¾îáCáxÅø.ýkVtª¬2®—lØC"™”‡K¬€‚ø“!³^oó×bd¶EŒ_@(eºÂR©ßbùHO¾DƒTÂ"!€4oÓ¬j©Í[þKò^')€Ì´ Ó¾öñ¿m±–SéÀ¥Dâ:#KIg wÛéǹOýP0L¥~Àö_&ùXæÉPŒÈ.+›=Cr@¡Û8uí`ì‰{öÀ+Èm<‰V¶láT}Ç"cjݪ§T©ðš®5ÇznŒëQ"=—“1Ö¼êÂ2W ëjl”Jã‰á ð…®˜Éê·ÏÆÙ£™ÞÙòpËîN?°CmÒÚ ýàî¹fVQÎ}å×,tÏR"žîqŽ“¡¾­ÏÍ>f‘#” '}»?Õåmr¢¢°GÕ5Ž€êP˜n»ð¡õ•WúBµïS4Eâ"4kq¶Å[2?Ô¶P‰É@kŠ¢B*ŒóÅ85„1g±¯MFIÐ` í,Õ*¤Œæ•zëœï°6ü1e©Þ}]N•´¹4UÇ«Ž‡¼7Ï`F\¨a-n do^å½è£š8Féè©©ˆG+èý˹5.bÃŒ¹¬y ›ò6×ÌÅBÃÊŠO_Ϩ«õl²V=}! óŠIw2Ýo»5p bˆÉ‹åjÚÞܬº­\±‰Î‘¨6G'®?èÌ:e^,ñôü©Vdó_HÙ¾43‰‚øŠ,`ß}Ž²× ,9±Ñ‡J$Œ9Ðóòªó¯ˆîòRfÎ]m¬ìëVKQÕ© i¥} eäšø‘éæËˆ¡y<ȯ4·ÂQTóêµl4~'Á§}O©$gk‘¦Æe$&v ãD8ZÞž;à;qA]&§²X5ý„+w«ÄgYsòiR‰‡œŠ‘„ 6ò 9»“"“´—'¿6Ö‹Ñ·Tèiñ¼OE)–ÌrT²µy|íÜÈæxèø†ï2CvÉ5ƒ¹qšjGP‚ó +ÿ¯]ÃJ¬Ž?·ß ÑØÿ1¾\ÂHg)÷Ž»Åm&*-s¤ù>8QŽÃ=kÈ.DÅÝ j|X}v¼V÷Mg} X©Žu'R¨'wÇëð$±ÍæÅÒ¶Þ¶!ÉkcO>Îns·‰AS€©í¾=“Lä KLƒ>ÙÑÅyðcœ?îˆ`bÞ;GxÃèg ŒsfK™AXš®la¥ÚzÿǾ©ÏBàƒzí3—À ŠçIb^á¥2†fZ¾µ*ß©¹ OfP'©Æñû:>ù)¿b:^ÌП=q ½cå"+¤œëAû_³lõØŠ ² ¶ó¿¹™eu’ØÔôcÊÅ'šíŽo?Ã’ ÜQ¹iö÷^…§/e¹˜sZŠEU9+ŽyÕÓ4Ô"÷éL¦U%ÄñhT°ÛƒÕ|7ÜÇ•‘&Ëå ¨„9J¿‰¯ f± FæÜÖ^{=Å„ÀýYwðRUZöÙ¡K*k¯ø¥*‹Á¯ù›j › ël4ë˘Óþ¨»¹Ùú:ñÿÑ<˜i¸é-Aëæ²óAaÍ]N÷¢hË–¬]//Á)%sœP-Ö{\ôǸ-„ɧ ÛRîR2’Rª®kA)­vçŠã–4PrI£Ç©R€ÚóôÿQ¤ÁÇûŽgô'²ªë…»VlT%Y½£Ã¹ãÂ%׌ÇÍÖ½”¯^Ì£ÅÑ–„g³[ˆ#¹æô,P7*uþ×{òð²ˆ'*/¸=žW»ß lœ·ÔƒÃ¾*)}o(R2—£®Ù~¢baf€€—$B6×orCÓÁG9eã´“ ®]ÉË‹)¶âÌù·—:±§}Mý:¸s¼×ž•‡ùã/s¬¡¾7™«NŠ ¸Vé_®47«€Dúš«žOÇÂHMãï°˜ìwŠ )vKÏaõtg)[³¨Íóˆã__`ÙîyŽŸ#Ó¦…zøäè&7w¢–Eñ‡¾FéäR+kéêDÝ-@×=eB¼ŸƒlG[ˆû&Ì¥™:ŒÏ´öÔž­Ò<³QÃQ„tÈ«3Â÷ío‹P…Oƒ Mæ¿J¨ßâÝæ^.×o †)–€ðû8WÃñ•æ¢ ë`§Ž®4œËG(A”–ð2_#.vñŠÉµuî‘@`‡‚I\ü©£²NÑîÅì„·M! ’µ¿îì%t 2>D•ZÌ’O»úèìZ Áî 2qÂêë’¸ªCWfÑÁ#¦—5Ún2ÿõ}ñ«bÍN¦ANÌí]\:@˜·€Š–k½pASaòÎèM¢2µkUƒwéV'”}ÝY1òÜdµ|Èë”Åø#ÉÛŸ LæSÉ9áŒòÃr)iñUpx‘|K"KÎðÓ~4wjè]•Ö¢—pc«Y *õ–çXT;^žº¢ þ–ÊòŸ?LM2'«X@®MLæ–mÝzwD3&2c…jÿ¨4wî¼hä{Eª÷D”Ì–Ä"lg¦¤`/Ä’†‰RG4Ã^«PÔõëûO/ŸbõçèÛTÿ5(ÆM_Eú3nâÞß:gK7@êÉŠF·‡Òi¬òiÉ&áÛF[qeèÙÌÎ|$¦8™Éξ=t#ðU5Ú\\²×‘üD®¬©ÜÓËsŠNÎ Ñú$&*‡˜—;zAÅrb÷ÞóC™£ðXŽV>þ%íØþiSÕãc÷I#öï¢ÀeŸÐ«›á¥RÖæË;&¥ÁÆ.Y퉘6ñ,qxËž¡}÷íù:\_nºšuð)[·ÓÍ•´ÁèV2æ?ð˜q€]9\£ÿµô ‰ß:lˆ3=ÈeÏd¢þj¿“¡É>Œ‘ràçe´Kì®é4†Â†´Ë1`kŒGÐ&Îa¥6è°pøíà`4i«ßÐÂÿIPXÕŸeÏÙ7útÐ-iq›äÁ¿äç®)S9¿ZÆã[ •ëˆu;”„¥$3æÄ( ǽT‡TËó"„¡ï*³ÜIñ$à½YØRr ×1.ñ0÷çe}Ÿ’­B‘jDQEf–ËÃák§dƧ=ØJ¼æ?ðPÐanz·­ïþo)É;AJ›¤Èwƒ P"@t7¶‰äø¬t‰aÖ_,Â¥¥#ÕöŒ¿9Ñ•—$Ùdɘ>ÄcÄÐ-…„OÜ“Jñò€§5OºS#OÏŽà÷ˆ­PÞÃD‡{¬$ $ÈVóïÿUPn¡—ÌŠLn\9rR¶'$] `(Wœ}`DàJІԷ'p½ñjÁ™Ü‚--¢%$bsÊä=<ª“hFK‘dÉ#ŸE[ÍösMýøÐ;"T÷ÃÈN¼«ÌÆUžøÜùZ ’¡u m1xg¼“õÃ÷ÊnIRynœc.nw¡z³Di¯3KEõåvùÎ3DËeôõX}˜l<Ëîw‹äÛþ=›CB×åÇÜÖMÚű¥oM. àpÊš{xa„V]÷ßóHd¥œ%<.ÀÍ/ƒ«kãÂè*ü§Âð_· ‡ð_}>cu}SAé¿ø5 «;k~”aîÉÂ~qöªªŽem; å >ï÷,žï†'²¥Ø0¥RV$zÎj6¦]×m¿ÒȈ)nÙDŽñˆgAê¦Îþ¿ß†¡%jå¤Nâ/1²Üª"Ç< ŒŠ¶–ÒêƒO!q¬dÚ¤æÒO©ÅpüÃF~^Ž,ð‰;^´µf¹"õ†hü¶¥jÌXî¼ ÙâFõ±!¤v1.IÕa {nG‘xÛÖ°œÛ±ÊoÂ$H‹êôÊ®3옑ˆ¦(C73dôÀQã-dœ ¿ ­p-Ùô!êÑUJIU Õ  +Ô²<9þÆâV qqăÎÙQÛЯKDA¬×%BÀðçÆï¬ëCx¨Îâò³¹} (jLÝþW×ôjL”|ZhóÔ’òÛð^•ô@Ql~,ŠVÕ&ÕD» ’ ….“h½TÕ¸û¾°‚ïëó”è?àóî\Ù•>]ákŇG{Hãd{só\6w{<6³Y7ßh±ìnu ŽT®³ ÚOºÆøh»Ÿh¾]ÆBÕ¤gÝLIBŸg§E¬˜H¿ì$m¼cð·¥o -Ú’‘ó“Åœ`¾c¬ö Ø>EìÒ°+’ÞúwŸˆ‘ì“åUD`ÆüÎÄýZa«ò–›eCêÝ`ÐM[ƒÈ¯nj·‰'~éƒbjXŒ?½ >.²X¬o´5ž¾QØu­è²1j”a¤³UØ´liÍk®£]3e[k” ‘2¯xW„ƒ¦Ä­âÎzvFÆežj^ 2D¬õ \?¹E§9Ðô¯`(Á” Ç{Ek;ß!üÄ‚SÌpÓ#R' ⟧'¡ Ñ«¸²Ñ8CتU_‡C°¥5ƾ8-‘)˜øÚˆZBNÊþ¢ö?øtšIÆ´¼/ÎÏÅ«‡¸a§ã´ä¤iÓÛúé"ë¤"Ö~øByÚ‘|ÛÝ.À Ck~šDx%›¹íœìŠÓ¬Ícºq…À+U³ÀáÁãÖÓäJ–É¥«©àƒT}i- áx‹l-_2»:iI2ògjØÍéïw ?š´Ù Ó¬¦í§è”0 ðòŽOwš„•‡HãzN#ǀ˓p¦'MÄ_lÙhŽ0Žæ+qÄá+jr‡ekœ=娱P'÷ËEž´°rÁîeê^üÍá÷•`Jo¿ý–ž4®ùb«•°–a;“S|\úuÊp¬÷Ö~*.”m5q_7´M°³*!ßL˜!ÖIlÕHçLÌ÷jì& -×í¾BªêéîúŸacZ:Ï ¿¾šu«8îÄ~ÒHŠºψö)LÆÁ.Ý!¦K_·±a»9ݪqâÇÇà»óON2ª€¬\8 §í±@¦Èÿ'²Ž"y-+TÏÛP5YÈà¸iD•‰krô ~¨åÖ7õæ~ÇyÌH ZÖköƒHró¢+{_rp!_¨øZƒ¯P žíüÆ„æÚ>QRD»Î¢flðöñO>ÛQ0¤z´ŽB:“ùˆû¡RfÕ:¯'Z ñ!Å÷Ô¤GîÉ‚á}<éô§ìAýÅoEÃcÇh²D T·>Q+%0wEî¾Äo E¶qñ*óÆ>úoܦT?÷qÁ2<„,¸¾ñ w ?©wO´¾çm‡Kº´X]]Pe‚¤çàéã¼û\ªò;€Ø¬ñ\L$9WÌ6ÒLýS­CäÈñ²Ù÷g¿ žûÑ‹$¾™u«(þ¤pQ \,_VN·ãbÃ×ìu‹ª€FÅŸ?ÆËsú ÂP Q“½yÉÉ©¬§#·³©á!h:5!¶§ì›¤eŒµ5¬ä´x+£BTÙd‘{@^ìÖV;JlªW_: ïœåA9¸ÓÆH§DDZ r17?àѤI´áÇž÷~v±EA3+ÆÏ´V}›K¹v'ǼT‘ö“4±ªš‹ ™¶íâpŸøÒ½Ëk¦Š\'ñåB“{§s¹kñØ\K–Òž›vZ dV5H^X8ôŠRœ›ÿ_K]™ZXXà§sÆ5»#~Æéݵ’&n¾ÅëÕ÷†ñôÕonxq˜ñ§Ñ°’»ÛEëÒYyŸx¯4`F8 ºÈÿÚ1íÆW:¿¦ÅË@ÿûãíeÿ§DNO»ö ²†j–œppaÒ†eº¦ûÙCÍYxû­±*ígå­ž ªY›‚¡ãßíÆŸå¹ÏíF .” ~$ozŒ»ÖHíÎÍscÀ¡i9Fßm$Ã÷VÒa,áòžP¿?¬a äh©ì/…Áz¯dU5 4ó¯Û«Ñ/©tÞ&À^¼BȈj™e;ÆÓl$©wh »m,‡u-$‰¿úyÃ."#³›oóÕF¨) Æ·r•1G¥¨ZŽ0¯T7eN:ôzF=´XæŠãe’KÓuƒ¸VŒ_Çoü”|^ªb ĵ¤p “/š0Q7å¬À­Ýi¬Béæ™LªLRšÈ¢/Þ›ÞÑ\G›/--ü\#Ÿ4Wfž{Î Fg 'r3sæ ôÿü±®škí­!ßÔ›B”ׯú Þ‚¿8¥cÆ¿“¹UæTí}b/ßñµ¼‰Â*þ¹¦˜`îìtE–sp§7Û?fôDéûò)ú žŸÝ¯bò$ò|o¤º¦9é¹K<«Æ˜•¥îºÔ®RÄ‹´^AÓA±Ò73$|ào]îÞÛImìµç/ž3Ð…±|óùòå`×þ–pjÚ15Üte‚â³¾ä-ô釓Öop^kvF*²i5]°8Ï{|5ïKRÒŒíÚ‹Ë©y[ÌÊéóá ÷5C+R‚ ¨,“jÿ½ùÙWTl.’² © €Kùà@ÉgݧºÐâ–ørËØƒùmR^ÛŒ=¤·`vøè¸1S0ÈUaøÅU¶¦l¼™¸Y«…xµijġ̟¸û7ñ›Z]·JZ€Eð¹¶Ž…KáI–Ñ=D )Bz]“Péd¬}d›™uÛ§FޤºkÊ,·ë/gÚØGá°Òõm~F&;æ´&3ÃdéYuß2€»Ã–ÆxqÙPÏià„ZÉî¦"·:'d늪ÈLZ,üŸ¨oú.\‡[Úúj {¶C 2’…”:{ [ž±ãª<¼À†!Ž{oaBØRB®½á&¹’q ¥¨J߀š¯~–•‘ðm¤9€‚¶0úÐR-"ùyiLó¯›CÌÁ «‰°áyqˆj¯cY™8|cWÊu…♎ÿ=êô_¯–ö§úXwâ2 b^k\ñð˜ö—‘Æ|ï6•¸öwÅwX…`/SBβ*W‹;©œíÏÍŠ©Šaåúï"×w$ä >޵‘[åû5‰ôã?+ð/°?ieŸ7 øG4ߦi”ŽÙIÏ©t×aUé<1;üžZ´$;»ÈidJ@2ÊHuYküç›ñ)k/ªÂX¶Íý.ŸºrH:ñü‘:œêÙ{»–=ó2œw‚Bg é×þ­U å'´æ,`÷‰jÏt3W¬hÆT" yï­0B}¼›Ší˜°âq5zÕ)öÖZìSiýîi$ë­0ΡõYXNޏ­>¿hDþÛ=F[›»Œ¼§-kj¦HÜ{é÷5®žHüœ»Ø9±±¬<ÿA¢ðFÕ‰ø”Ê˦eå¯ÒÖ©;Â0ý‘Ûm â8Y3NvLâØKQdx¬{©EЧ5¬gç£(ìЧn,ùÜ¢O„Ó.ö¢Öc+”’·ž…{W º>¹äEøÆ)þ)ö¾ÝËOãÕnîM¢îE—˜¹Ò¶f–¸XVSý†r2¯7]|<¬ZuûEÖƒE}Ü ù 1wôw"¾ ƒ X¿¦ÆbæèðqCƒDµ—¨i;û¸çà'/‘ ÙéØþl¹c¥MÊ[ ˆ¯²ËIK9¸TøžÇËB]Éð”Ø*bïqË€z!øš£Ohf»ýˆ•_'3Ži óGPð\).tù$‚<ìw™"4 u²þ±Æ½“Bþˆ\¼…†q]E9fæwÌÖ Ë3üç'àíâi¹ï¿×{ŽNãm÷©ÄøºþáØ‚hõ£½½Mœҋåé-¾Y̘Î["E  T°ô~Ôdû§dGø÷]ëŠB`fy+MKÇÿcS4/WÓ?•L#Cñ®Y8/>À¤%†™ÍcúÜGÉ…Êm“;¥ÝM÷såTùç1¤1ÇÓ'³ÄéÙ‹Õ¯Aä|l±cp’rä p;…ÕAönœN"Õ¡Í;îWƒµ°*ÞpØI~­©^Á2Ϊþ^¸E-ë¿åئ|σ5"·ÿ°`.u<‘Ý~‚q’E"à*ªÊúùŒ”u Ò÷õ(*T¾ì¶x¸ºñÿ[u™%1(ïà㺺b½1^‹4â±~ fu¾|7É(꘾ÕhÞ1ñvιDs+»ÁÍâÈMoû/ή§QŽnÙ"‘É côó¯mmÙÄþ_B(5˨¤’”@vØhàû€G3 e"”$#r‡¿zŠ³Í¢‡È}·¿B²i]!a—8ÞhH`yü”5YÖÇ8z+™7ÚǧQRàac¥.?±'5$?º| ´9Å0‘”Çi,€ý¨ØÀ/Ÿ‹–½< ¬™”ߊ•¢d~\¦ÝNxh ÷E †˜¿˜³’Î1UοJ0>bit8Úñ±B»–‘ï‡QW4j¨zýàìKfv±}iþþº~t £ª†„ŸoAÒ¬qŸ‰±ñ®H' \oLß$jØŽ@ÅíÅžu‰ÕF§,¨ÍDñÂZÊw«³2,é?Î/Ç ¬$HwÄc²²§Ú;]¥B ´qŽe{rÉ«B“«ã”dšÈbþo!Ó÷ÊÖ9¾¨LW•Eî4³]cöŒÎØ«K,Ñ«1Íâè,k“•â¨3âg\§)PLȶƩ6<\ó€e™ÄÇ‚U‡G$:·ögŸPê&LmÀéÑ?àQmyIw\þ^fg6?°mû“ï»zÎC Š‚P»/³9‘u6RBìÒ5äBø¶Á„Õ<Úp~ø/0 u#¿g±Ësè¨Ø·¬ŠÁ1á¤aÏm+Z[Aú WœÛ ­âïvá'¸’Zth>%Rª¯iô6&ÃtQÏ“¼™GåÊ$Ö`» 7&€¼}Aûy·v EW~Y#)e©‰j‘·Ӆí¯R¤m¯Žcöe6uæêsb‡”ØÓ•\b°P¤¢œ_?´Üi¥ä_ 2›Ðž ¼ôÙBŠ  ÖZw½å|½×ževåPiŸ,….û:„ÔšxQph!ñEl%ô NCö@i,"<+!$‰Z\‡嫟ÅÀú£ƒ”/Á$ÕðÉTx7<t¤9>ûƒöwço/øÏŽNž~_R#Æf'•®;nÚ²œÀJ´,¦g‡à/˜†£”¬R¿ñ\ËñÈ1Äpnk¸{E_!jU`kæû.1( ’¿'zÖôÐÄ5TùâŒÈ˜Oê+™ÈÞWuQä„4+¦uHèÐ,(cADV‡Ã–úèEnî|Akl·It%jaoªÃ;M‡iöø²é´ì ²áðÝ@¤2$ ªg®Eh™—ÕÊB\´['—8³mÜü^‰!O[ ±éŽ N6ngüCÃétÖž÷‘º!Ú¡” «ô£zDüG}M¸ÎtCÛÂgÈUĵvÎpÌo™±Ú7­ MN÷­õ9ñ?sKן‹UóÃì/©·w’Ì€PoQjB¼ƒ)Ñ dŠBò›©¬îN#$¥/š¶[†+°6‡ÌÓÔ¬ž¯èA¶þFÔ]ý]?Ö¾&uFÙµœ±¶Õɳà£jØsXh˜“ˆcs^‡fÜ+8c⛣Èa§Vº'+›<E«úon!ÔÖ^µ²Jº’rðLÄWg g}“5ü/,ÅqLžÆî+PlóÞ‚®ÈµK’»ÛPë%N‡ÝñùyQŸæHn-üª ™¡ÔŠôW÷då £»îð¦[^:žQ܇ï2ú8ð‹Ab€dFDýµ'«¹vùGÿí+¥súèöB²jcCiS}›ø4C!÷sªÕÌð‰T¹Icµh“¥ 8"Κ¬-»õýç =àXÔ¹Á ±Ïi–ÖêÆ:!Ò&:jÔæÖê|îYTkl㨋™“yÒ ¼'ixãûIxh!«…®:›0ø§`lNï‰ÌÅ ×Iɰñï5ê×蜨2ÝY XT0<¸'NðÜ53'A€Æ+êtƃ¾É›1Vþ >áIyoð²¾hîXæ†.¬˜Çß ·ÍicÕ`|¨Â°) _¤ò¯©ø Ú(<¨ô§õ(ðs;u_Rg_˜+ÂC¥=ÍN´Îß8âìÔÓJ÷ï<ØÒ^¾Šû½ÖáâæÁ'Š&¥AM4ýA)°{?\ƒþvÜ¡pF»ýì“|^˜S·5íH¢ìáÆc*#9Š!DzËw·jM&í‰\•äO/°éyºp%«&è|†™)‚Æúø­&Q˜H†•Ɖ¿ÞÙ'oEš(Xë°±vâ^Î༨m¥Ö;Ò¨ÿ©™X*}èQo7ëgu×’¯ÅË3Ü ă0tçrHmu ‚øq­‘û´¨òèZŸ‘'FîòDÖK.¿[z .eH¯&eàáJ:·²ðjÁ˜.óf•Jñ~Ÿ¿6õ øá5Šè|?âr²ßwÜ«ü#ƒ°t _﬘´°7"4ç áÌÅx «;,'¹†âåîTýËø((ÿè”öè4Í‚æ:±týäÁGÎèº-.×}¡ÞåÓ,›ûRÌ«d²ëNj*þ îd 8ÎTÄm€¼MÓ†¢¼ØbC %„àCœ&c /~3¤©Êí‡ÖVþ<¤—~õQƒ©ÓŸO=bªÿb€'«©ÌZ©bâ©þU*gôF‰@0'Ρ"š6Ë šüªü¦Æ¦9¸ ¿ÕôYš+Ê)vúÆŒ¾ãD¶?z5¬Ãi+@ØÞØ+%MÛþ¶´ŒuéŠv ˜S‹ïãuH{e,‘‡«ÍI¨ÒWÆM\#déhØl˜ObñeÚu·Ð›Äºš—Ê@Ã7ÿøäލˆ÷õf”kгwyÆ»M€œ„kÞWÆ5§;«6 —‹Ð‘[q£``°jŒÚî'½_€é©K6MÖ9`Ô€áÐ;‘±Ž7‡ÑÇ”ZqTŸ¼ÅpfOëTëî,÷"·E(uðÃ&U~tŸÖ`-¬· °µmí12ÙœÛÖ•…~ í^÷frUµc‰zØÀK‹+Á,§üÒoÑEDß·Uij'£ÞÙ=2!€Û3ôàçóÍfÇv}GØŸíŽæ¶¢æ=_Ö9Gðr(lìd§§Ðv„j»Ñ½œ/Õ4MÓ8@–Ø“ú?§1ÐR nçjå ל;<ެˆ³‰§PÎn&®twëqiŠªÔBsàf‹—W5›®cWe£~…OaSºë@~ÿy“gëÙ{g'XØœFUüÇ”;4úæÀ-¦îÇ{ļåʂ骘d(? õ]¨ìho…Þo†`§ž~Ñ­ÊYsZZio˜ü¹¦‡FhÉx–S m*ÇvmLdU,ªL¡åìèm¯Ž„AõQŠ‹ÅêK —J·ÓÄõ×¥RÒÇR à ¹:^zÒÀ¹X¦Eÿ¿ {!]ÈzŽºˆYšÕÆ9ÂŽ5:æ6›»/.rÜâŒs÷{èdì.ŽR>½í¯²õt4Íx dôé—®ñØçV¹š>å åVè¼þø¯Ž dƒ’ð$µEIGfûj WÍn ‘ô•¿¦ÃDÝä.·*è, U@Éc8{DŰ5hi3$Ýb]9ŵ`µV§·ê°ìòX;|ì­Æöó‚¦ß}q°× ›ã  »íÄç>"p}ÙÈëpƒÍpnx¾7åzA„Ÿ98JM¢qBŠ š¼ÞêJ¶ ‡Üw‡ÓeÕ¶,E­vœ´-ObÃúk%¤d1…ojQ¾!ÖT^²€:+aV¸jã‹™¡)á’ÛÀÜ}_ÌI4§Ö ìÛÅ“±!Þ= “©²F@iÊi7 C:»Ö!n ©y鮨”…•¥x¸ñµ£Ô å"#w<17qó?cÐ dIºÒPB(|Œ´&T\&ìó*±Æx(êKþ¢p/˜eü$±û$¹c“¶úz´ ùBb:-ÝEîá.=è”CÁ…¹a¨ Me`î‘!Ĥ+‚v©”N¯!ÓnÓ‘pÝXe¨ê“&™:MïL}Ô•²G«6åΰQõȵY©ÖÊ—ÔÌpÆ“4m^ÀnOøˆÄ‚乔îÃäãŠeêGÀ<êÜNÛ>©n._¿ª’|f’+ÔùÄÇ‘ûבk˜¶¬æÃÄΫŒ³e[¬> ì¯Ó£ì$b¾+vìœ Œ0ÊâKæxãáöPL]Ä)lgK²eãÚ [}²gQ±Ÿ üçÓGæGÓ~5«¼úP"KÀغk¸”¾ÂH2ûç)Ÿ€OA¹ó0q|<á¡Eö¿¨à‹‹Ý®=ö°¤½îõPÆMÖÚ×ûGFɦ$¤2b›‡oÃø)'“ÿáqŸîž½ff÷‰ýoˆíB.I»]ž™æ”írß”ÁÊÂèÁxà(Q­v#}šÓ.Zõ¹-YPÅp÷k6-Zæ1Ï÷`ú‚Ü™þ¹™Y¨~oÁLý–­ïZŽ×CÔÂöˆÂ²üæ®{öV…ÖÁ=„¯·²U®÷8M µ ©g?wÈûChÔodÌ7£W¡Ï mý¬µmèê(Âaíźýžh鯵â$€4-DºÒìrÒÃø ¼Ñ}ŠE‡Uh«O÷O†O²¿“¤Èª-‡ŒéÜáŸÐ9‹ô3eò)»š˜Ÿggü1•®FÑJ—Û4Z L¢ï4…H‘Zq#†Ó YlŸ¨wNÔ:]Yê–ç Â@G­­†×öº–ÁXTÕ!¤È`É^”ç㕽t²¹±œ9Ã&7‘ÛªW}¾ '£%éõƒÈ¸‡–Ãsj{GèiwìpèUc,pkX£l™³R£¾û:d_fðÚ+Ç"»ìÎÍfxûï=Ï-±»áÜ^”fÇÄ“9N–†§7RH ¢°º28³‹¹µi“/1"_€†Òž…i,ƒ˜ÅÖŽ‰19µ3•&BYàÛOj‡ÐÎ0êxÇNk:½ZƒÍ¨:TçhjÖ;,óSXÐpÒ¹F–tµÐ¬–{g¾`Ý£¡ùï6 òêÆD=€®d¡ÏÁejÎø6O\àQVv >¨¶ô½h),«¹)Aè +Xïü¤½`äñ±,:UÑsÛ*ý‘U<-Bø¸Ãé°ÍšWÑ\m=T8²€g&eu¼øÉ[&vØ$àjæ%ýD3 ½çî)sóîI µH7:Œè4†— ›ÕŽs¸\£wü>& +EÍílÙÇ€ ¢£Âí1 Å*ÕBú}!N2ñ·b Ý?.mzpœ§©2SsÔ§ DI3Jä!&$P±nÃ(dÛí"Ÿ¾6z¥Ú~PB´†]c’Ð9Ú‚ßçú|à´´›Íó¨86ž‘#[D¡¼Of=ëÖ€«1Öh)aÓXã݇‘ïLî«ÜõsPÞi Vúnÿw|¾>wªà‹ÄÿúéùÒl7²€ø&&'«÷ÈTKÅÝŒ(œ$zž/Æ5°©n[ç¶H¿š'ùoa1ž÷Ýè<=Š6íç’Ø$qÈ I–¯¤­ZÍ6T…™1<¯Â`Í“[‘²ø’@Ü'ƒ¿èW—HH\“’sfR2oGhlÝ© \>iÁfdɺZ¥L­¼M‘œ·dSªHShVÚÍÞlVØ+x//éW3F.òÔ.dbE4 ÈLì‚é:WU)º|­szÄúàªÐ†ÿg ÓGóØ9Å´Q˜yu”- ‹ù÷©…LL“Z3¦ؽ6Ǫ¤å0ÉH ²/g:‡¡~‰ZS½!@®þOY÷œ ¿)LûÃc½ŒÊ%µ+ëãgvÍ·4¼ =ÊïÙ*S\Õ·þøö™5>1á(ÞêƒKàXpNñ?dÜtÙƒ »×Æ,U›NŶmSæl²¬0D?¥Y½4ŸCŒâ†ÀMBy¬Ýub­ðÅkD{fcÑ—"€‰æ² ËÀZõ yd^†æfèЙxÍТ§jËßZ ŠÉΈ´ÉO•¦=“ç–ò›øû r7}¢·cU¶Ò¼=Kum3 g©X…¢¤—úrç2NôÍvÇñp$ÀÒ°Ã¥¾•Jüõ6 Ï}MÜšTvùõ¼mµ¬§_áàŽ€|8ˆDf ñפƒÔ*haðUAîdOƒë0æ'™9]IN­ó7kxSé%þ‚0 *âo5›ÕÖ5®¼‚Û4ûöŽF€æ§ ç§Š‡aa‰¶t·Ò98‘,0äÑnŠˆîÆó©øý‡ RWŒøAT+{z5îo›ò×ïÅ fÆ·OÜ“¤çá NÎ|èL³Õ>`íé¸r¸Mê0vëJ†ÿ¨7Ê g\¿žãÚ*L{ëÑéå´M*Oèøž{¤^Þá‚xÖû¬Å7K5HTtüò³Q{uø¬‹v¤QpN É®ÙFå ;¨É£ Ü •»åñ †Ö ºO1XUÈ~ ìP3ÙY®¹Aî9ª+Ò$5Ïz|=abú ™³ª™ë€Hˆ%¦5ж§M¸,ÏD¬ ˜¬ŠåðãJ“«NeF š’@k%P«½ÖÊw2[Öî¹£wƒòºä7='Éõ¡ò÷¤Se“»,Ìu•‹>ljT½yF^3 àÚz“Ûƒ ¦¼¥ ë­kýTõÜ./š¥PLé[Èî u~Õ°Þ+g$¦‘ÛU®–½Ü È®3o[ö ÙVã²r.´_®¶ßï1ÕÃ?Ú\Ó=„b—¶<çåô Î×dH§,¬P;ÎΫšZÔ–×>bÄ5Ê‹’žï§56Vbݼ½ûÔäÈ2,Â9Ðcm0EWý©öw¸¨Úò±:F(¿ØtK»òûñà_Òáê/#VâÇ?(±›h»Í¶½éßk€Ì${?‹|麺ã«rH=°ˆpIðKñC'Ÿ¯Ž˜\#26;êˆçúZº§Û†ñC*A¿*ÿÒW8saÄA $yê­¹Î7ÀŸ…ž‹!±gIT¼'ñ¹øK›Š†ô®úsÂ^CL38q9²7g•’‘’d¦ë'86Y7/¶h©®Ñʱ¸®÷L“a)+>÷\‰ˆù}ÂÞ%|ÍŠ0Lô»î¥Ön,Ís ý]ÙAm`ûð»œ-&—³/îÈÀ8Ÿ%ï§ #`ÇhêÒȼtyrFÿ5¿+¤ ‚[K-/î¼¹Ìûlùl=”Y3IüC´µH´»šZE¥3ú—™¬o~´±E­3¡`—Zò2û(ôµYÎÙ=e·@G5Ày'»1úï¤Üµ á²Ä™Ð±U¥…å-pY…âÇ õ/™¤ n¿ñ©iH¦¾|m¿Ÿ†»É“©¶¨5™UÕô34¦?ù •˜\‚-µˆhžˆ§­îB †¨|Îð— &Hˆ­òú0‚Ûæ€b—¡EHÂ'É.^}…ß?ñ Ó-PØ58í†lTߌ³(•ÉWºôËñg²ƒjú§UºT8U –6ªÌù=äºpâ|ÿk©äblÚ«z?ÇÅåVc•@âÁëàñ}'|$芿Y…Ä©\ ‰.È Äàúâ¥WÓ×!—ƒ"³Û‘­¤Y:g“½®]–3±ÚtÄ”i=1[š V”Cä^„(æ&¦Æ7rR÷où…:¸Ë»H„ò€cÄŠ÷7ÆMû‹•ã¼Úœy‰¦êø€ÎÊQ÷a*}gO~›Å)RßqtñùØ×ÅÃŽß$ßo¿¡ý°û2ÖóÔõ͇jŸ]S(x‹Žk†F+ðS‘nL{ d¦«?7á9Já*¬µzÜ%è}ü:ûHü'ô$dÐæÂàQ“Á=½*,€÷äºæ† ßÑþ1Y¸ÛéÈ GV!"ÞæƒëÜg˜uÅŸÂqFîÜ%õDÅq$õ:½A’zú˜•\ ì¤Ò¯ó‰ëÊn¬ªäô¯gká#ã ÅY×nt–ÛÂ-ÜD4¬¾áæÉñ*oYëÛl٫Ʀë I#fÛ<ÓVÂw÷¶µb@bÄ#É3JûÌ “?A/UØ]f;L1*(.FüæD}ÕŒe?KrÝNÏ Ð¢™¢õOâ±tû¹™ÎÄ‘)Ót:‚ªôí±ã€D¢Lt-ô—7½àèo^F»Dtö¦êÅýœ—(fÕYkJé@xÕº¥(uz_Ãh%Êô}Ö¡EŲ—r¦QFvÍk&~k rk´ÍPT‘Q'‚ö0~¿ T`§a‡ü®W¯h—f‘Ê¥|…½W›>î™±úëÙä âRoWÒ£&ǽ`î¡N親ÂïˈöÕÈ€–y¤°Ç¦U‚ëfü3n5»ß×ä=_‘³zˆV¾Ï»Ó˜ñØ„ûØo«ÙH…°•Š2º‰0hdwlyaNî£@¥Inb_ÔïûTX‡ Ž:›ÒÌDY·l8Aá(õuú7_L Jÿõ~z_F}}Ué.@– sqæˆíÊéø4¨¹uUÂY' »t£IØ96_ï±®Q†Ýòò#Ì¥ìarŠ™ƒHš§+—»¬mq‚Kz¡›{Nx¢‰°n;¶4!Î5_ûÁ*'Õs2œH2¨*È{æ=p ÃÁt ?á{9ËM¸{ 5F8ˆ0°6—ŽÈnnÏä^š÷¡ª,6:|Hí¢TD\nG;_،ʿ™6‡Q¤’iàœ½‚·•©ˆóÔ½EfJCC¨ö+¿}ÿúRAæÜpB4Äqt Ò)Û ¬k"GSmîSá¥Ý•)T.¦4–(åÞ*¸[¬y`B s;ø>R%²¼•°ïlüH9æ‰÷ëÇîOí§Y<¸Ÿ—óg_Ãv¡þª ŽzÒÅ&ØÉ®- 9õ@ÞU= Šq€Õß;nUÔÞõ5Ä *¢IÛü)†H„—môáöŠÄ÷¨óNΊ-*ômzµ>$«Öà|°ìH7¦ÙÜ„ûÀŠjÛ,NÀTž¸è°(¤ò³Þ'ÝÐjB²kìľv¾ˆ•ªæ´ò(_ùþ´Íå4;è‡îlê&M8gôqÔ†â,‰–¦ø6¦L‡-àHÔ;ÁˆúL’£ôEèé¦js.èöÆ”¼¯¨òšJ*`­O„ “¶¿ÄzM\¸VPXêÈäþ€"äqNÃsÎx–g{¯¿*¼ZŠ!`ª¨"67ØYV½ñ~ïÏ`øúïqmPv*Òî²¾.43NçsRXSìÑë>dù á<çÞxmÔ',Ž[á:L¬ <ùp*O`»• (fÎã–/7ESsŽï¹u˜R!Vp·É¤íÿ¸N™ZŒÙIfééM“K ‰ØçŸ v{¼÷å>»VÒ¢,2¹ÚÁ¸ÿš‡V…úGà„Û+V¬]úeÖ1—m6k`VB(Hõ]“l;ª?·×+V6èÒ3¢Àps#bô‰hyÜ;‘8„™Y{:–Ò·íð æ g"g 6=°@>ÀX 0¾Ã}eT@ëÂÃÐ,¸­nßM{I™\ð¡^)Q±'/²FN¾b©5@ƒÆY ú€ÌÜ ¶‘—ÂŽc`Rcó”º éþvm¦Ž7¡ ~  L! eF2Lÿ«Ö¾9Æ ›-ÖL!îïÑÐè>üƒˆü¬SÔ|\\;²u8 KðZóðt¼[m_ÙÝÅ·…ÉodL§ÌGﮚk¦~7± 8WV0vtRK¾õ^æv¯?è š&)§[÷Pé“'N<¯(>ÿ'qh4xMÓ·µJæÝ–%¿&°C”ë}Ìg3HÒ»lÀ™‹ãñ~~Òµ—ÿóeÁ+Įҗs•xlÆî¢Íâö’Aê×I^¸!‹±´pVh4+ǹQÿÓäÛ ›¢›÷Q¹Æ“e]bæ #ÿïæ/™»]õ›–¿AÊhY—LjIξgͪLÖš>È;ù³ ÑsçZèUáVew³Ä‚óò) _=k7¢më÷ÀM7áí²|D Çd˜ï^H­`Bâ^ÁÇ­ÝÀDÞ¢´ »· Väi²L)‚„Ël¬ eXj3}³=2ÈLÇuásg‹ÈÍ~ªÞÑ7€îþË/Õp<×¥b:DÛæÎo0V”}§š4s9RkÉ"ÚDÈÙ¬¶ºH *ÒÔ€¿ð¥˜ò˜¥ëÛçðÝÍn˜¯¾‰«ŠõI€vÖ°б};¿éÌÆÒ/®_j¬åu+Q8XG¢Ä®fFpH•,"壯:¨JíZV;­ È.s1É›÷WkϾáz£ŽZøÑû#›*ûuá7@Ë=¦DÑ6iªß‘6FÖ’ró+þgš¿éÃŒ,U*¦«A÷ü†üxg_n†oP® p‹“Ðùóò%C&>êÂuAñ|+5ºQQˆHÕÌü—ÕÕ¾`“^tU_j§å<’ÜC÷¦[PJ-š)ƒ×]¤Éµ6“Mu~˜ÚÚú[õl¦õ :œŒ=.6.§©Wñ*…¸  @©°C=õó‘âþ[`Ò ÉáhÍõüçF;GPŽ–IÚ$w¦@n#>DlÚâMõ¸ºOU·0’T.ÆîeK´·µÆ-I†¬—L©Yj™â\ ó¶¤pÓ£N¯Ãd9ͺ,/Ç+|´zˆâÄS…K¶h®ÅÉŸ¤yű\ßRô,ûº- 6XÚ¥ûñØ€Èãå¯'Á[ö®)I©|oa1=[»eÁp‘Δ‰ÌÍ6ˆ‹øË‹¥öø¿£®!<Ž-³-¤qÆ%ÚÏé U$¬©âàœÞ{ÖX=áäúO±ä<^áËo•ÖfPß§ÞQM˜ú*Ô¹¬ºF†Q1bÛïîØ±Äæ•›E¬EºÇd*¨<ï%!²HµÙ…väÁ2«%‘Úë¯Á ŠR´lÒøä¢OhÃLw$Hù‡D¦ðr­óBSo:vÙâëT|îH½Y¼™sZ,mÕ’Ž^(óA×î~ÝÞý±mÂ÷NMów1þZÝV¤`²…q'°¾b_WR¾¥yKyD8,"¹!·Ñµ5Gå*Ý¢¹E ÒºRíªÙ§ ²o´p{}CI=Õê K î^VN’¿<þ;•¶™T©/i#ÖA ±E¸†ª0wwºååÑm\?¥âœ×"640™Z½g‰~WQʵý) Ô¶æM¯¤î³ÊÒIÄ™0­+~ •â™ÿÊÃðÃéæ°n­vÿÛ‘›[»òp°¯¯#c&‘ `†àm^E@ï“9nGæ2ï¸Ôššô±cj2Z/‘m²,ôšvs4Ž´#>¬IòÚØˆPµ[SÈ5*>¶$=‹2öÛ@¨U2[¾y¾VfÛÍ—6óÌX%ˆ6®Û© ýÀ§YúW¤ÃÀ ì¦¼Ãø/_h|´ä+<,L_~áCr8VAQS9ÅýÈ š0Ìt¶—h2oç:Q›cf³+cÚe<,^žu¦€dˆïRâ?ÙÙ‰ ôµÌ¹t,¸zºr~õÙßûXœXû  ã'/ŸóŽ!eT×õ!„è –-é‹Ù´ÕfÇB©ø‡ë9²áâBÁ(3 T­wð^íúÈ`ø÷”¡Í¡ñø9¥óQuÞrˆ{Óå¯b?¶ËZÓ‰ÀÞ¦ ¨½äéû­ÃÐÿ…rÀPË#J?BB×oªPGòb¿jŒª!íí3°w@ÂçnoY0!Ú^_Sâ+¥…•üÄÎ ’œñøCIvÞäâ'µð÷¨Î¨èÚI˜]Žì 9Bõd7í5£{‘c”šþ.³ÝƳƒü´ˆ³÷ç¬ø A‰ÑÛ3˜†{סWûûUÌSR‘t·Œi2r‘I'ÖµÚy œ;ܨ:xcLIWãa#£çîܯsqs¤û$ e=ŒôcLf¹ãxÔ5²ùw¾ûôJí»€ùà\&§—}.u|d5ŒÙ}ÏDÚæëU0¾åà Ç@¼l\ÉâÉÍÖ˜ö·ÎŠ®&RÀô&\hîñ%«mUU*éÛÉËi~¢$‹eéu)3Çj?—áW9:ãÓôJ>óÏ ©‚ÏjRx2ºÁ‘˶64 9Y¶2>–<µ«]½öñ&à&ô6ÞªkŒ¨ÿžÕ†@ÎÇèÆ o‘“"3#v*ÒÄ€žÌ]ñ“ö(°­“ôÛôÃV齩Ò?a[±‚üw÷7ž®¡WTmÖì¾úwìÆÉÎ ÿþíé«•<[÷yIùFã9!Ë?ˆ$ÿÖb‰*0:òÉdÌ$©è©äÌì#(Bx.cÉ›9,JÃ+'W·Uà5–ôœ8׌¬B­ŽÇ&4«ùóæÇàw­<ÄL ´¨÷ÕÄ$#u-•å†i,Q`„[à²qXÓÓëÉuªÛ––Õ/ «¢þ£©OŽ~›ÏûnP²õm9Á;7(Xšjé;ŽjZ6ÐuS÷ï$ùRK/ÖüUüv†Øe™?79.Ù*6Òý›šqnÚ궬S=Çm°¸IŒ:}±è ‚6‰N7 egîRE–.ÞÔ-K÷cK¬Ë¯Ë¦Ñ ×þ3n¯Hâ.ctieh.i"Äç× ¬=¯!E/¢àç7m–µ¯N‡ÉÑÒVÙ_3¶[àÕCíÄtb}ÎL‹ÛpBp ™Ih×QžbÊy×Jš·ˆ‡´`^&Ó 2ª(¨>×D~òÐ/šc$ÆKùàó±™e]ôn¦²ãr«Îgx.'röåËDh]±jäšE¡ÑÇïe¦â»í¹cf`û{jò Áš%‚a'[n±ãþ‚]R*•˜‘íºìž4@h^ÜÉ” Þh¯4ÀcO£EÃÈ«bóe  (² JZßÁ™kÞ ÿç¥u½nkL;Ðõo*ôI‹mî,\ÅÆ¯Ã ³zŽ‘®ð¡E¾l@gíñ³œ†šùuô.^HãÍ å~kžßÒ@¿¥…ºŒìædþy7‡K/S¶§ŽÖÿ¾zzÅäw÷ª˜N߇G¼ r‘gÏõ?:>àªð&¾ÄƒZn·’-“ƒÌ}û¥:êà‹ÿž+¾{i›Ø²fßЏ)TÎ2òÕ8S†í¨™ ¾Vžôƒ›z¼#òË­wN?+qä»´ò3lÕÃúïòàÉé.gˆ±É’ÍèÙš3.™8Mß#vèe!r¡fÿÚzý8.Œä¤±ur°éû¿£[•¦£Tdtår’©mo@–fÙ–œþ'g–¦ÚóNu£ŸÆ6ZI7õþ¤"ñHïä³@Ö¼Flâÿ±‚¶!{TÄ{‰»Œ` 9àbÅ4'¬®¨ýM“õüG¡³§¬»s»èlêËQÈŠÛ–¬†ì¬`jj1¨‹ôß#Ûã‡ñCéô¹6ÖiVNTÃ(” 6s[R e®ÿ±NC}5ÛØô³ŒlJO•Ÿ­?L=¹nõiO{îÞ"Ž“‹ WaWbýœg‰F|DdK¥ç2 R÷%!(öÞ.Íx.w£ç‘"t¥ÐãΖ- ¾aXýõ=²öôd7Xƒ×ñ½FÑí¢R(ò@_n7…cüKì•jEêA(ÒŒ~ªï9‡€éõïÓÞ¶Ÿö°ê>›wÓ@DÁo¶Uÿ™ø6;ñÊ72Ë›ƒ8)ò* *³ ‡Ì$ɱdÁU¸µã݇±áóèž ðïU®h7É·ö;Þè53(†ÏšæßªoÙäs¦kU­:è:0gë¿ýZ½ãÏA¬õt¹}<“"bå)ô̇«‚Þ*Àáz–ôÓ´ê’¢¨TÍk¯Níàm6fâ+Úª¯Ôc*­´Õ‚ý5ÚrÂüÌmL•éO[– áo¡'½Û¯EpÇDÆ>x~à{tüÓáZ:Ú[-9ÍLÒ¶Ë«^zâîàO¼­l;e1™¦Èt ‡žùedEþÊ oH@ˆH ×øo—=’F®ËçÂÔYê%Tš7ÈÇW€hö1YÊ6¼BÙàrhž=ûUzª©mÔÌr`æP~û¯uZ'ol·›>7~~b¥œ†¶Ô®?YŠÑ¾åÊùo±¾úLïÀÖ?|¾buɹnmO§âmWÆ÷/)š 祄kŸF î+B8/W¼&¾É|LM ÏoEYúý†÷_.êO/kÚ‡G–Ê]¶mL·@S3 þ¥*¥N«à¸Ãn•…}ºlu-@²#$ÔšÇÄLÜñ®·úõ­ÁùTŸ &êŠÙÕÃÛ…Ÿ‹ÌÎüC÷ƒÇ~M-[õÊgèD…“ˆ¡‘yî@F€Ñì£Ô,[ƒ‡ÆÔ` «R¾a°ÔRK­ê)”P]s‘£³šGñ°P`sã{K¸³Ý†4Èà†öyû$'¤†¡ï˜I{~X¤ J`&¨Œ15ª†‘“¼%`Mü\Ëò›Î:ŠêÔi¶[ìÖåóûW؇ÐÓO…Õã¹:ƒ Ÿ±ú¡¼1Eåù #oË)“SjZ­ Ô¿Myôú x3™Ù5q÷gÔ®dÇ$ªÛ!ôÛ(ñÒ*Wy£‡ÙÍo‹"’Jâ¶žYü.>€‚Tn5´“˜X hËÓðz ÇÀ¾·R-´¾²í×ßåfyÜ#âqˆf(HºÖ)›`´¹¦rѾú¦7%}åôàùƒ šªU|‚—ô)QávªøÂ¶jÔµ8}Ýe/uÛ„N§Ž›©ô`k¯¯²[ÊÅÙ*ÿZ; î\ÈÒÁ¨ &&¬5¹d!YJh\–®ÆúåŸé²Ó÷Ïô•åtE´)øÇÙºÛõ¤+1D®{»5š“¢<\ß|¨dö%B»‰7¼?ª~:MáÅ;g´t·Þ@G2ðÍ<ÛÛ‡øë-k|xÕRpžhÜ-ì°Ô‰Í·-Á¬Á tNäÌ¿éhf.×£6O4<.èô(@sçÛû½4’B?ÑÚ×Ú¨«2ŸOÃí«U)þt·GööÏ[SÑ•þî Ù-0æò‡™£0£ {ez¸ IªÿÃK®DYèçþ´:Ít4œLè–DH–:`lOð› N5tU0±Q·–é}õ8»L¹~ª­¤vH¥|ye…*ˆ×xˆw73èÑ.d6¼ieÕµâÆIÑé€[§ïåU‚C &—ÿ'(è¼­ª%àoÞ.WëÖ(qh÷XŽ\‘8©¶º6g.–,n]lÂÂáé;³ó‘Þ¹ÏßòoD¥12ÐúõI€rûK°#ÀˆPrdiL½Ô<µê©üìY­£éÅÉÊ™óYÊøØÐ·Çl± Q–lí%à™ÁkÉÊl‰:M¬=AÄO ÑR9ãÌJD]R%?šn„Õs¿bòØãJÇ ÁSün?åöSqÓ×Gõ¨Gì“4§byuÍb1O9¯‰þtO`ÁׯŒ¸…O°FÛH, ûL1eÌð™úu4ÔªUŸPâîø²üÚ«ä£fZ¯M¶pˆ\ëU|1¢2DDlHDÏèÂBÄÐ"û"Ô@v/òæÌÀŒZ²èauˆ#ôøÚc°}wòºÃü=óá88ízåΑý:Ñî(Š%;xkQúÑ‘•k†/äè gNpk¹˜ÿR\˜”ªHxäb§.ùž¥xB­Ôs½—Æ5Éëã A¨nÀQ½ªˆ¯nWAK\ÊBí¬vä³Â?ñ‘±]ŸÍ±–Þ°3°gz^”3œ½|¤d‡ŽUú;^¶©à£¿Ð=xºTÙ†|I ±`+òRÌfÓŸ\`Y·ßi!ŠÅÉhƒÒ‡*‹D—åÈî>À£¸vºE¢”Ëþ`Ë­j–Õ%º#Ú*˜_•Ŭ÷)Öví›ö_HÖ¨V°È‹£!w¬‡qoqA‡ %_«£à©£æ™oðÎRQ‘¬?ÛËO•â„:ù’™Õ½þmkFÿ¢úçnám1ŽûÝ”Š¹¥wÖ ú$¥ͧš¾![Ô×ÓÇfìýBåá½ØŽÏj8…Ëa/*Ü 3YƒšRÊYÓ$þOâݘ(予ÖëÖ¿è ‘`²ý»ûŽ' ¶aæ°ÈJ¹'YXîJñb xæ ð3íJØ]]Åê.ýÛßnë*½Q†¦  Ú*U%)Õ¡®Tÿ?F*á’Â.Í5CxZýnf'xîë¸%óÝ~'ö¡¿èÄŒýÀ8Gc;À_¨„ÒË'È…Ê ÞÍ(çMÿ¼ãsvN…ßÑ«¦Ú¾ûTèŽ4²rË?õ‰SÇi‰R=­ü¥Þ”²`Ÿ{õâC "ØèÅm¨ «sºO²¬S×Aósºüã²¼ä¥îùšo]ÒF_G+]ìDß¶9ÍQ:„¨"—KQo‰'OŒ.ÐziÈ”¿ ãžÎ.?…ÎØÈ(ü£¬õ‰`ƒ@‰6ábÉ~·;±´1ÔBˆË†ïÄ*U麗d¾…MÎâk?D98ôãu{©’†…ªžã 6mV…­Ý½jþÌc_M{uÔÞݦ~bW¹ÑºÒ½è»‡žÂÛGažÚI’1x(ýa¾d„Qô‰tdÄOgm8PEú3–ùfÕ¹hWu÷uFÖ0t°%±› f££éÛÕ|,B` $ì|¬¼wk˜·ž—e¥%¨’ÓÇ£æöÀ &å&5mYÒŠsÁ*3Ë~h‹rżVÖñ.ØV+0‡Cé}—ç^lz=|Zé]/ uóçÞµ¨ ±¿=Xæ:ô7=àÌ»Q„]üþö(cÈ_Ù•]Ò¥ÑBÞÈ»,N†#'1¦Ú¾¹Ž.[Ð0lj žçôHá%¢ébþi|JyÒ­hñ¨æÀf7ë¬5[t[7«U„NÜ<§MM±ô^¯¼ë H9?ÕŠx©ÖB þrƒÏ¼½í〪ùðåœÜ,|_½#³éÙWZ¸§á\È‘ÉfBdcîI>?¢Tе &iúŸ™º/ã+öNBè>õ‰ät-ãUH^söjúµiJé'»¬~£nö†ìiÀEŽÚf 7É5ê#Ýš Êêk pÝã>]¯òiûÖˆåJØ}RLŠz[Ár ìEwQ¬¢bºMM9¥ļI<ÈNÉœ8ÿqJÖjC?9'ÙMu\}SºÆs{‚ãFÚê/ÃÐh²>oÿy–{ZÈ]˜wI?šÉ¡5&bDÊÄÞ—&öAÚ¥3=ÃE¼Ê%Lñ|EöÖÝ®ŒÚîÍ8¾µô‡é8û6ƒéÛVÎ2ú_hôóþ¢®ËŠCÒ8«(FL•1:$R'´“—ó¸ƒ{ FKâ°¬–Þô}ÔYûÀxÊ6{Pù'¿}Üi'Ðø`·9YÍåAA5éùÁµú£º| ÚÊíg¢ì~-êj&>#£ wÈ|)Õ¦9©Íø_>Šüõ#V¶ìð(ô!YÌJåW‚ŽÓxUg#à!ýtmÊ^÷\UD‡¬\z–Ù{†quªzi¾ÚÂyˆûÍWîº(fîºïX~MÁ˜Ø4—kÝêXT"vµ¾-0×üAíeeyUS70Oæ¿B—ÝøxGT±IEŒö'0á#¿ºU¬(Pœû\ó_Fq%µ„‹‚ Q·CÅ&.ňΪ™âEE¡€~Q”Dœ–+ ‚Œ¹¹#t !䆅ûÀˆ¤ 2WT…Sßd¼ ¶L¢Â²?5Yk'*‰”¹>¯g–ÝE„ÏÖCÍÍ«4í¥î µ5(£ü}.°Cýh:™‰À ¯+\‚ÉbI|,¢Hü,#*+ãØˆÃ‚Öq$ ’ªÇ¦ãP aÖÿ¿õ¨7E˜š Ò©ÛÈÄM‰©'rï”[žh}V€ÛºZ¨G-Ò¹£ ˆð§.I¬åÞ Ã%’ðÒÁ‘-ô{x·F $‰J2ÉB¾òÐ4öN«°l:ÏÓ…àY0ÁºVÎÑä{Kzvë[y…À,¸ñþpë¢ïÒÎëÛdÀFÃaž®Pì ÃÆ Áªt^¡óÁccÔýΉÆsÒ•x+ø<Îu2†ò[d:Ýö{ÜÚ·ÒS¾.óðAÅJL¦'§˜ûçS…nͰS’¤&\ÓÞ~SQZil½…çuC¤f ¦¯e“g}c2eUXh”…DSDåÛ ƒÇ²‘ŽŽuã nNê^1­‚õ¥Ä~‰ª Á1z¿UÔ¨²ïmö[ ÀÛk kÞ…éÜÖfz;ØÒßÇ0¶k¼ýÿ0MW\ˆdNØ‚ó·ÏUw‡ÀWª "a&vÛ@ðíç>»ox…TÆå¶À6JñtI @9yJXÖo:P–Ój,fA;Õ)ŒÑý¯ìè•@’xס!®›L+I±ûڔԈקóô𔩸; yl‘•beçètEifZ‚4ÔÀ©ð|™i²’N·Ú"ÿÑ›®zƒ¢áµré/"û ƒý|笺É-fqykñz¯Ù ö~ùFŽ„ý´íÒ²í˜$¥³GéK&PÝDi¸Á_,=¨#î90§¥>KQϧ€1o×Ä!A¨}Ã"Ü饱”=|uòÍ Apú…„ðÙäB½'Å-˜ý^]ß)ðãÊiY•NŽqã`lq0Ú- «A÷«„–' yR#ÑkÈÓlÂ÷ L‘üŠüÁqàèC¡ÅM 2q1Q£Y%2WîÅšð)÷í÷Cü©½Ù× š7^½räÒoˆÝ‰?zKmTrmtñ늱1¤z @—‡+šÃò°mSPáÙ“ä{B­Sî¬o¢:Zµ"î-’KûE=D~LCõÔ™õø9ö@­‘ƒzC öOèK”ô¡<³.îñuqnm†r™^má¾h'2ŠsQù7IãŸS6j ÍY¼ak xtˆ§¢¶‚k ”à[Ê b";ð§ó ý¶][¾òé_@÷KtÚN…Ís‘¼qÞótðíAܰ^oèŠ:‰^ç/¼Å#¹J5Ñ“ý?ƒZ„ñöçðϬpŸ×Û§yäè÷™©ìJæõ-OmYŽJó±ÛýTMšgqºÏ|€g¼_»ëÊ, ­Ð^úÔùÒB|ê)ÏüV¢û;“Ñ“¥$¥àQBÊ5wŒ[®{EyÉCìÁì8Ú)Aº¢‹Lj†<ñ ©Ý-îpïO¼g…cÓd)Ò ‚X׿ún™t°£Ô_8-O|´z Û;¥ïûR¹##¢`DáƒÎñ +…öÂÿØwò™JmÚ䈆åþÑø&èš”’õT•ÜxµžJ[¼ë©þ©½„5‘@Ag#R‡mØÄ6@&ÿeÙ)ð:»ÂWµ8åùÝHB¨ò¿ÍW«ƒÊ°›Ÿñç¡>ÌÁ¤–ƦTÅ™a¨úo¶ãâ-QHoƒ4Õ"/*"=ÜŽÇDaé¸Í…PVš°>GUƒT¤o–ŸTâ'äÛßy4ö[Ú.Á|ªªÉok¿6±>¿|>É,[’xÎÇàf QšeÔ°§/dK1ûÅöT†o˜¤º´oN1Òì)îYUý…Ä/Z|RåŒø¿vžG?$'PVÏ‹ÿS[Ð}­ÜÞ3jkvÕ¸xpMOÎiTsî’¾±-+–œQèB Áíš~Ãk¶GÃs €(å1»>J?hiÃCqrõÔá}ÌnÁÇyFdãÒ]Ç—9&cÆÑš¢ÆÂHòezB3Cdåq¦°Î3Ž|Ai;y)Ü+…­£êg(ª¹KßlÛì"YŠó f€Žå m;f‚ ¤ŽÌ%` Ûƒ¿ lÚ.?äé´ºª{Ñ6Ì0ŸïÖÍ¿GÓíà¥okÀ UªVÄöoÿßlÛ™aþØ,úmDÊFýÿ¯˜v½¾ÉãÌè0c&6ÚO`e’œuO  : ëø(@üݼ•û?¤ú4çó0Ò#Fá KºÂäiâ{Mð4Ï>DÎãn¢>TÒëÑ_ÝXÜ›]|;¶ò­Ýäßt3«°©þöiXÜsÿ£[¹ñã•jC\Øùƒä;7°kžz³ÍPó®³ÌþŠø =i¥[à"Ù4whµJ… ¤ãi wìÄù&âÃhŽBFÒHh,ÆЊ1“ÙQú¢’‚áx» .â›í¸"÷Aj¶”ßâ‹ÎãåÑÞg»ì†•\:Ð%±Åk6ÏÌÙ¼’Å/Pá ~xÀWëÅAYæ–ßRU.qvæ³m<ìâ àùNÑ{£:1$ÎÅÅBÛL $ÜÖ>V?Ý’íù¯øÐëíl,ë;²€ÜÒZßý3õrî+è\bÅXQ€¯µgP9*ëí‘L²0iz¢­ è>Œ© Ö¯,ÍÓ¸5Txêáêß߸š •й%~Ý¢ ¼Etv‘ìÂÏ¡"%q^u«O»/Ôà®B@hÌlUá2ÉQõñ:e eŒ¨ÐØ p2­ËáMÇ3Vôèªg›Ëí…ÎH#8‚&!ÖhmxpO9ý¤z¾˜ýÞ§ªá¢Y&¨`^iר:%*¡Šè:1ÜÿÈ×N¬yÌî/ :>ææ”„Š{rýY¼t÷‘<å¹àÏ‚ï6'…§*y@ßo+­©ãþXž{ŒŒ#*/„XÐòKÖÍ® Òp)H䇕ҧÎFȈÿðõ«–IonÜ$MxNª]!Zwþ§IÐòg{R`x\ðÓ$—eÅùíl¶J6oØP®ÌûÏS·ã•)š.•feÈ×G sÁmí¨ø¨„ÓÖ¢QY] þ‘ Ù—–ÅJÌò!Í”6ÅøS$“ÂÑ£ e‡ªs£ÒCöÏO/UÁaW‡íO D,Dª»‡Zum¨dš§Çs¥`dA$La¿¹ÁtÚí‹8ÊË_†–rŒËuM‹h)Å6ÀŒr¨ aG!Å›éûß¼ô¬Ù]·?Å¡¥›™ñj^+ ‹Û¬ðp 6ÇÃHÁkàÒz(Ï‚÷q60d%ÿ ÔŽÒ:糤xìHP§…y•¦~6—¡ì%ÕûW@ÖAP”›>eÒīɺñúÑ­%Þ&1Œ7aé#ŽãÞZ•VêÛûÖ/«÷ Ô]öÛÈÞb/{T­N>œï–ÑŸÃ8'sAÃhvt*ÇÑ3Î׾@øbˆêýôÉ÷„ŹBf+ç’NÛº§šŒã¥õ*\’úþ¿Û*Ä ú¤1Õg.®LjK›@ÙÆsžja?ZR$~ÏÙŠZÓ&àQÈîE_ÈÏZ¹.àñNþ»Øî,I%ŽrÇwUt­aûÕ#ˆ€ùyj”âênd{S2t&ŠJ&ÉôMúPîP…½—Ï<oÖ¶Dù \‚é=m'láŠhè£óšXºàšguÓzŸÆç‰ú×—>‡.L4\´($&RÜ—).ÜÉA*ÔîæÏ¶Or 4¶Cùßÿgp8?•=¯l7 ¡еvH«É) “6ÜÎc÷ÖA);Bš(Yà2VÐÜ#fp7Ù-Ÿe‰0Q5E·ÄTh©gN·½frÃîöV|÷›µòfY­•o(åÔš¸@8i‘ ³Kƒ¤T¡¡ÉðñåaÖ›ÅRý¯`^{æêÃ(FÜ÷a嶯àð›0cüéAìE®Œ ý’ŒA<õ£uA«c¿:«ió·‹¹Ä(§'ß“dàw,Îô|cbìI–jdzš#¥Ô‡nÁ&]ùWýÁ‡ ”º¥è£e¯íÑ^)Kå×Bú:{tätk'‰p,uÍ öÎú)ÇÑf°W,ÊÁ?>5ÒýÞ*Ìì¸ÚЋO!ø‚®&˜Ÿ&N.}oÂë7eÔìŽ9£`O(Ï‘}g°…ÉBÛž÷G‡¨ qGÅ2=`?´ +Þ‚4,_xBu(c‡±¬KeQ%!:^Ñ#Ô;…ø>? üEJhŽr1ülZÉç¶‚È‚¤êá. ð¢Í bá8¬ø*Œqî)×Ðhhö%n‰FO7¶_¡Üž`Åfót8¥5jUü|Ï*ŒRYÏlÃÇå °¶™ÈxE»âaWé(ö±Ó¸r,<¹Ôި˱†OÈ¢õ‡R)÷1Üo° ý#¡å”"¨n;eÎOžPùÊåzó·d1¤üêèíyZªoä åœ!ƒÉº²Öc¥d>U (Ç „aËi¼0u"«F¶Í¢šºçÆcw\Ï-TâIýyt°…Ò‹Tð³Û@·èR­àÖ;ÖüêÜqüIG?Ý.³Õ@Q¨L5“ÙMUSf>AóZmÅp¿ô_§—¶é‹ç›Rqùý3, ÛÞÖž)ŒGqÙ›Õ:¥¥Ì¹ƒÌï¦R©”\@K9"ª5'"´ÞÒ›!0.’|~u[ÑðZn£Îbo÷íÍ‹PêjCáÏvki¿~lýiУ`LÛƒÌi[ü€ QI+"ÈõMaœ[šÉ\C¼~(²"€M¬YwCAŒïʪØ$,ëžýAFgT˜š*p³ÊHEaf„ÜaK^“­}thïëWR[ÔZ’i}" ÛîˆMHPùÈÓ*ÝØœTaÍ!F6ëJ`_9Lƒ– §“¹‹;@8’”YÔoÿµq[Þ%RR‡X(R¬G }ÐÎ ä;é»é‚jB"‡-ao(›­‚¬m`™|l]ÓÖìpmõø¼¯Z[r˜D9:>¸1jŸ¤m.à¯íç¥Iç‡|ÿ5[`ÒÚë_fö)7ÌÙº@Ù²“Û•fÝîPŽ£*þcQÅÖ+UOÛg5ÇáÈBóxÕ=± 5˜?º PüïQœG¦Ï˺é@IH´BÇk “QíÉó® Õ4™Û˜´‚Θ¶Š6Üþ˜%Ó|~(&¨ÆÊp&ÊuJøè[\rZÜUŠX”º+Jò1M€>­Ñ6^FQ’H¥-KMëVøHQÑÀ‡,,{îÓôEù”ɽ v›¶@ù›UŠ ©×5IètÃûýàD,¸Jh!Rs*ùÇ!LPEÌLçcL¡ÒÎû§d]ÞdÁKã7qgÈÛ§ñâ¶ó<<(˜:hhÖØ‘u¬O:À æŒD…É«S éî’Ø\d©PÚ —³$†8 ÞHƒWI‡A+'aI#x…F¶o1_ù@‚XîsWõ˜±‚±þk—µ4ýë[HVràu8æJI,RýénNÚ¡wå"yE>”ð›ú–yš™rÊì;1ñØöNà²]‹Ú¸ÐyCÀO½‹ä~4È&“›q5à õî²üp”b¥<ûÂ2%óQÚLÇï/‚£™=Ø›†°™|0Q€K~·Ê&cÁrCfÆoŸAïw댜v-Q©žz~HÀŒK:”I0Ö"=Àc gr®H¸”Ńu>Zžÿ«NP³;x²Žëm,MN)ÇÖéó ÊWkØý‘kYYl‡²±p6BzIÁЇÔ{ÜŒ2aû_X2TW™¶Ðûûö»`öí.Y¤•²À¨Èbº¡×2iX]Í5Ïþh±ã3Ñ Ïóœ^Û—f`\bw}uí Àþþ™•0Bvf‚ç8o-FZ¡_XmØ´ƒBâak3©nAYt½ uµßhq&ò€Ùù3^ˆ¨X<—G ž½=ŽÑ ûæqÑ×Û¶A‹ëÛI³ÑODã3ËS”›â€Ø"Uu’Â@—e· ™aèFÄ…ÂLߦ²ˆÕÑ^G±¿…Õì9X›¥¬}¼²E“†¾ögÈBê€cë _UlÁ!ªDt‚Ýž¦}6Š.Bž²š¥b 5òé×Y–\q øÐvéœhFãÍt#oÆÎ9ñ¤Ð•HÏš[<¨)ÃÄabõ]ÌD'qñ貚aM×êgòGîÞÌ÷.AGê& Ùeäm¶‡Lâ_Åx(–ËR ¬Ì¾ñslöòy«æ½¬YÖ * EÔçaZq¾Û2‹™º aÍzŸ ~ªÁ¶††d^¦ºIDˆ­‡î®¼©_Œ{¸õÿVJ©ÂÛgÄ‘¶ß±ÄN@Æ×M4 ÓÏ]ü fJ£™^ÍåaRúj8¬»0•1{LWE>Õî«ÓlŸ«´­æ|ꞈ3FŽ‹–WÏ: Æ#oÍÆ°±F_Qd¦—«|Fâ¶ÁÓ}0Â_ºßÁæZÉWO€™ª´oý3§dbqp ÚìØ™òÆW²ÖM¦-ÙZ cß\£.«ÍÕÊáÎ°Þp[?Uzíe;ó¦d“'¯Ü6©¥Ó0ÍYØìß·>œ´‹§ú6ùµbêÊ M±©:_Ì<¬ ˽PÓ{ˆüt~Û¾±’ÑË2q1GlÙê}Y îB^b)ü6 ´Rìw\%ëJE#>ƒŒ–3 BNÚs€ndÄ´I5Ð1É‹,@À-Kç[d½\7`ËÏS)~‡;'Y<Çeê··kKqÃ1þ˨ú™ÀksÐSÖJ³{ø~sˆvD%›l[è³÷QCêdwG¼†| ¤dþHÉšSRú³©½•rœ<á£M½j"â™ý—^_˜µµø g·”3Ô^ŸèÛ]³2,¦ðÝ£]d0zVƒæ¹žyÇ"ª–in¼F|Üu Êá: 2ë~4ê~…ÛÂ~“LÛN²vø¡)ÃB3*hê×2v¼ÍÌÿ…¥œ},ó\riŠÞÀn¶O(§Š)åa¸¹†=ÍçMšmŒnzå¡ÙŠsa¼<±ÄÉҌܧÉôJ8§ÙH$²L:Ðg9Y‰Ü«äÏ·©š»l Ï&ÐDcîÎ|‰²·¯HÂÇøBŲÚÿ󴆕&O¯;iO3Në iŸ±¦.D˜ „e”áÔ™ev!¿“¶«¨M2Ÿ ?“U^ÍDGˆU4IÍá^ _\Ú|ƒÿë-ìì Þ¬À*ß@N Dl öáDkɯ0_]Ùráp †{wÆB9·s§›Â!}­A´†ÀG%Ìê.\ì¥LAái„1_ÐÂÛ¬ÍôsèØNHOPo˜ÅŠ>²ÚÉÃnàptLÁÙ#7ž¢Ð}íÑÃŒ|qrŒ;h+/ÓYÂq`A]ï¯cj#â‚Ô¯ÖÖ²Z‰_*c½¬7oÆàsO~ay¬a¼¼X%¢pâ”íù*úyº…Õ&†ö$TÒè'ê{/q•OÝ7W¸ÏÔô  ­¹¹½Ý†Rw›Á¾ƒ^³Mp†kâÜ!+´ëüÎ 3ÿ{ƒ0pâob±üÀìJò¯›+™yk °‹éÞ°²xLm5¢ó#WÏ,±þ‰eëæ0‘8œ\Tv\ùöº•ÎÝ\©±°nÏ^s<™H JÌ„‚Fï´<üZi¡$(ÏIB-@ÁÍÿÕ‘v9_ éeì^0I bòVô(ˆÆ½`ÖÁÛ$ 8#΃€YGXÝZfˆp°¤ŸÃ¼(¡ÂÁLC“ì5ÎTìMÐÍGfX|5Yh2}I"OpI+ÏÍ[b9£Zñu©´#°áUšoqºœª7D=»‰'‡·‰Äs—%¥µŸÕvõ¼ÆG/Z©püU®™¹ƒF‚yW–ÄèN‡è ¾ÞO}Ë¥‡S©Ÿ†êç(b—åƒ I|Ó———öþvL9goqeSÿ†ÛmælÍTÌ›Fü=Þ H3×4)ŽˆÁSlRæ~r•“ÜÖ£.‘~ñýÆÆÃH@nSB/›¢nýÇ7CQŠZ¨.pG€èRq×^ ×?0kDr£Qa?GÐ"a墶Ûíþiån¤ôF`ß¼ Écäåé­F¢ÄèúöB*ˆ‰ä9ÇL¨gdXûdÊ*!®…þwy~ï‚*æ“sôzVIEP‚ÇŠRH¨vðeVÞpålˆ"jëƒw•qÄ,Å®Ww͆¿än"È1W޲S#ía(ÞÂ*™bVô/0aŒº=âZs²´Ð˜qæh¥Óýä SÁžÌŠªÖeTâ}¼1s”X6ÊÐUW Kú…Ï{·«î»#[RÂS5¸ÅÁúáûv@¿rilỎíê‘)F ^X¼ ]äƒ_—ú”…ëüÚÑ”±af“\D‹áNQáa¶E\º0[O²”PâýÌ„u0û»!nù–YºüM-J}¨­÷-ú¢ÒÿAäïÚÕ$ïÁ'ʬæ›lñ¾U)MÏîS¿áÈϘd¹(^¶V×gè¿6^_ß’NîöÇëí EÅ Ä3«å„«L㊕û¼%ßs+æ…Šõ³‰1 í~·Pœ×8/SÄô[`™݉p]ˆê¹M+úÞè´ýF Å;œtñ†3/@kàñH²’J“Y1ÛþY \ÖoKªd­v_æØm¨x/³J/ˆ 4Ô:'Ô¤ÖÜŽT¸ØÞ»i‡är© S9OÔC ºBA°¢MG¿ÝjÕš%Û;î²ì¬g”ý&X&9tÄ·>¦€B˜Î3X.b¼u½jÉÇòM¦æÅAÖØ †òkOãz­ydVaŸ5ST]*ç7z]`Z\Ãdé—ÒT$X’‡<•(µ½6£CM$­°”\n›³BŒçt¨˜fçŸ`Ç–¼¬¡ó -SÛB/¨}Õ®^ôõØò^á/ÏáP¡ôägØpv.h2€ “”óø£õs ^š©Ö§7êi3žò™©½µtÔi9û׫~Ÿº‡jÎ+j©!ÿ÷cȾ3òr†ÔŽ£t—YB?ßž®YÏLo@Y-“q"¿%³0uCJtöž‚߬oC†æõø>0ÈZcº ׿7¸VÅ]T™ÅQó¡`T-äƒùÀÙ·_ã7Õs`ü 7[†)òJ¸¹8¤ˆ{¸Zl‡6á„[$ô*1îÊ!Þ`lĨB‡Ôo°8Ÿ~ÀdÀ…Ên"@|ñ·G!Õª?™Â•*öêÿj$ÅÇ~gïOà{Š¥P»T 7•Á]ëh&,TmÿOûÂÕõ!ãJ£çf)’s¦ÛíÉûFE!–g·÷¦ñc>V°„‹V-(Â(´”޼i:bÖB‘@¹L||üñþXëò‚™Ž[5·ýr07"ÔèóG´¸%F÷£Dˆ†\Íà9\œ\\º¹ùYt­Ñ@ ßh}Âëó.–Že ö ™x4îfœ¶8¼íñi*K’º[›º"ö¸;;HLœÌ´ÆaüâóW“@µ»©ì­e!©êæå®‘I( àý³ÒªP—öOaÖP3d©Œ]-Rá2£õ‹·Ä`Cª£)”›Ö¤9+Øà¯’~8c@Ôžo@Ó}'B¶8m¡Y—Òþ‡“a†'{$æh5|)zN­’)„ì† äì$r6 ~lnÄøëü!_‘ÚÒõZíÍ(Þlò2ÁéYÊYY)ü·p°½Yeq¹j »>šÖóÜ£Õ]Qžƒ1K?ØP¢ƒI&ñ’Å{ ír¼õ:¨j¸—ÍHDÕråè=Owµ'‰ÙuްoZˆêô™d‘ß³ñé[m~^»°¨Á‰:§hå&w G·þ#·Í¹%ìÈ)JnìÝÞWQÝ ’Ì­«äÏAÒ Àájp§[ΫüíwTÎhÃګë¡-r| 6»çl"#Ͻ“1 ,A+l!Qû[6µ[³f"5¨üÍsähQa(þ ¯Že£tRä‚DÌ-M †b ó}‰×Þ‘ü‚Dœ¾`oïË2Åþ2êÖ…jÍ„,×–]DDðωƒv…Ƀmä€Îa?'ße¬ôá¦.&ÕõÝí˧ :ЮQMÔKÿ“fÏVÀ‰B[ÙVÿ!7 ‹k1å$ÀKò=C¤1±€ß=_Lš"Ö<èáîþ³’?ä±¼€CÇœîÚÿ•½Ä4wšæÔ–YÎYu–¨U®{ÓuúhÆôÖ1ý‡F•J®€â'7GÿírP¨ùíXð{©ÄÆsÁ…iâ@ˆ–væÅD t°®ÒðgÖF&{…_žnÍ%›èKÖlÎ{eW<®•©ÁkÕ5ŸRºDž~¡ž]"Ó»kׇŸBèp†›Q\„Ö÷Ì0ó*/èg^@„µ0@;63¬)¾_m1ëHùÔèϪfVª' ’À²Š o#[bIñåb,ìã6,J—©H÷ *’†-¢KÝBºÀH¨ØsÚìvU÷„`Hz¦ƒÿôäÏ6èQ·ÞMu\…Ö(4/©å«›¾-Ð;Ó‰`BcVMý?Wñ’ ó9œÿøA~6çÇû¾€†ÂïàUÌÅéÏ·«ŠÜgã§ ejõCžb… Ü´ôÛkùžƒHÙ;º¨ ·†¤_׳Òê#—ù/Þ¼ƒ5OEÖ§é˜&)±Ëܾ\‚±ª)¼âMŒòæýìð}SXZ‹«yøOîýžù²¸ñ*“¥Ô’ßá6;øDŠTòr÷Þ‡c—CñõM$©Òv»È5Ì8=yZþýDh=)P¸ Ô–„˜6¿Ÿ›öß!s)T–æ¨e×ÛNEÓ¨h»¯åªÕÀÌœ%Æ‘—Ù‡£”†Tü­|9ù Õ„‚øžýfÁ|Í)@T‹#êz##8Ò¶i¬b3wÐÀ”£ê¬Ò‡tªZˆáú™ßU¿Î)lÄæ¡ùbŽV¡7/×KšqvÛ}CÊdQÜ<±w­añM½Óâ~çþ1lbÿeÓÿ ÃXxóXâOñ[ã<ýoPeÁaÝåÃײ¯;l Õü«W× ˆÄ0€_³©ùWþ¬¸úd W")IŒe ´µúB7›fqûLÙðs¦°Ï•h¸j„×舮~É'¿@ZÚëè:ªeBâ´›±ºé¸âxb¬›^EÎŒfð¢&BS&£"û~ëC@EÂůwB]‰NL”b7F{:Y:Æsô¬SB‚õ@¹}¾Xõœ[„F n:;Ÿ$ ÉÁÄ<ŽÁxŒÚ3ZÛ–Ñ<ˆÀâãŽvÂrËÿ—´]4ggPõ8z„I7w@¶žw*]!Œ²°td9Qø“ Å¡ìGzs'˜v0¨V'~4º3úšÕDÁ’¯¿Ï(´v}Цk ˜ƒ‚ FŽÛcrNršgÑ-Ŭùs¡¥0zg½gÜ·n¢] §tQõ Kã>3zÐqžþÙ‰˜Mjq+û=äzxìÙ®§LÉ™Þ÷‰*é‘óÌ* c4ŒÀÀl½»Gä/,d‡¤f¥È¦ &ZsuY/x†5²¡‰^O ÿKUªñÐâŽEµF‡>pó×Êÿ›J;¨§–T;W]fhëAäÑ4yÍ \b_ù«± ìÊJ~þ==b0˜v„ æ6Ëû}ë×EöoOo}Ž\À{`ƒš%«Òªà">­KBð=64C}d8=0õ­¡y“숊¨í„å÷ !7¼BcöÉÿª\mî‚eDMRMRä‚„³"ÔêQ4ÔÖ´â9SÊ5Ö§ —¸…Pä 6—¥ íz¹ÛÇ9¦‡1óÎ~k~;H¨˜~ÿ%|܇§uÄA°©*;W½¶©¯ ’(AœîGìÆ8JRßìÞÜ¢ç‡È‡FCWÎ$¨Í߭ʰj¹=§Û|ùŒî¸QiNpI€CÁÅMF‡aY¼ò0æÌâNøÜ®R»ÈTÑ`<ðèÂ\!r•~‘MŸ“¾‰ÒLW‹¾H%x†¼Fù¥È>$o¥DÚH:)&ýúM´séîdoâÑáq‹™ ¢¿ÐNoÓ­þTdIyˆû+˜Ýãm߀ͧ\Ý:wr°øSJáô‘ê‚0Uâì_Ÿ@:]ÐxNtu"v ˆ=ÿYF|è8>8sK@häiØÛaùãÓîF7syœcK3m1ùm »îÄ“ò–pùUk*·=h_æ&ÑlžËUáÄå<äôæ&,ž“£lÞÐí”Éï QäEÏȆ&5\Ëpù‡Êñ‹=x%<¯Åè›|£SjÁÒ;ªèØa=¨Ö§ÏüÂ×>AÜj6QSÒ&ºÇjËÍÑv­V¤ßªµ˜[§¦èLsX÷òcjÁTÑó}äƒé7Œ{êkyçÀ±5 „yè §ÜmjÌzé$¿J{±ÿÛkû` nKwyÏÒNñ‰_,‹þ‰¯WL~R 8Æz|þ]ÅÍ7oH(#ƒ=DDt@äl3QöîþÚ·´Z'þÛÿásÜ|¹ç¸újZf%ÒÙïÔ‘êÌ/(aÓíÈ©Á?c›l6êïl»c†'=SåAw¶v¸ç<o«þÖŸâ^™(ÞßìÛKj–¼Íó¤DÇÇ…ú ¥ Àeö +\#{¨2–g¨¨d,\~ÊísŠöÑ…í­@ Mùm!¸d6<ˆwÿF)ó}Ä;Qo¾ªe‡éE*÷±!(¼…mPü©)M"»ç[ÙïÚßIXíPî¤C±ÙD^ '%€¸çT`Jki!æ+9!ùyól•öÓëžÐ+ý%HBZù¼ÏihìAÀ.¯"6n¡OaÖú*Ò.ÄBb“\œ_#Ð|?”JLþ/\íJ~’©úg¯ «¿·ÄSó:DÑìLX1·¤}©A?\…‰ŠaÿFUkEÈ*Þ¿,Èi~O xD0—H*rœ!‹ª !ñ㌪ë ^&y |¶r?«1ükZõ 0F/oUK¾\û¦ýœ Ç)®zùì‡ÊÂÑ¿yóýd1Ys<5 Ü`©üQÄ„" y•ò¦[¹®e´YèÃõñ¿~e‡ÆŸYÓTÒÌ:ÙrîÎq.\¥åȤ…Oƒ ‰vj}ØÎ²«#/…[dÇß(l’%'7Ô{ûn¼‰ÈŸd®Mà=¹r lÔØôqK0ç<€ÉERw/ŒÓùÌñ,#näãã=¹»›˜_ ¿ “¿»·6nŒ¢ÐYÙ_pÜ­l/â‰JBÀ1u‚×®vmá/Ezd]›ÝŸ¿È o…þBŽýÙmf,vÌ£:ðT¯¿Ë…-1’·y Goþ J‘ÔAl‘ÏòžE)•[Ù3¤ÄviÝÈI k¥`”Y!aÕìƒâåX‡Ï€† “ œ ‰½óP\Q~Õ©DSƒñÛ Hž-äѶ‘~µ37‘jÇ뛘ê Ñ}…9Dz;2©å°È 9°›Ñ|²Ì¸ê*ñÐR˜VG¤¦ë=Ãàÿ]Á«N'Ï»WkšÝå¾¼[öœšÇ˜q¹ÝfТoÁ7k\å„Ñ6½ãÛHå2JG¹KMG/#¦å1ôüú‚QÁvü:!=Wf÷9WœÜË .} g¿q}O†&Hf£o.åí‰+~ÇÆ²ã,‰¤ÀCg0þk¥ ” å3ôa³ g8ÐãN.†îŠðLgŸxØšJ“qEQOW±s·CDÉè¦ä»× v±&Ú„R­RbÛkÑe‚ŽI•;w~Q&4O;ðoÀk)“ñ Pò›¡ÁSO¼t$ƒXhÄAÐGÞv{{c_ªô6ÓÕïÓ níÆçû©íV6§¨'åön€´K¸œ±ãîÌåÍRr''¢Ø*däã qªù9¤ÿ.E˜Zþ´Ãçåéx¨MÈ›ÍÚ0áùÖ;³Q«¶O1ê`iWw¸„WcZÆGñý#Ð꘵C¥:3&Ò‰5ÒàòÜ™ëÐSÕwÝ%”õ>wÇjB½úMåš‘]†‹ÞÕ~‚Ð -²S¹'´`#Ó( |;µÈ¢^*ï×Ãeø#›BFn7úÈÁi[ޏ%Žõ¦=Hº%«w;O¸!¥uÇõ‰ãûSfiO…=Q³gÁðïj'9í,±Óg+ÚC‘ZkaC㘠n<K Òù²m‰›brÓŸÀ#“Tns'÷3®p¬§èï…‡cvº”:‡fô>óï¢ÓòõæxVkõ’Q‚H°Ao: ¶¿Ã±Ïæá ÿ{ì*Kµ,‘áaA «îØÝWWEE³PÛ!ÊX" àêpèGKŠ¥ùÓW\0'µ \ñt5@Ù&ÒUè]Ãí¤óÓ‡éz‘ßáÇ~´ ¾£– M˜—èÌ™²ÍdŠªSÑûêT1±¨]–.; w ßWÌõ†m”y'»EA0w¦6Ý€¥32Ûvžl–п<>6‚,ºâƒÅ(€òÅ¡Yj²ÆÑ~rÅÁ÷)ÞËŸ5¨âHõÙ M±kÛHÀàÙ–e¡¸¥Ó)fMR}¡Fì1=+ûñ2µµ_¸•>‚ÄÙofãÄP'§þµø  P«¡ŒÌJÉý+Ì×ešo]éÊ ZŠ8áh â©,QûX·*–ý0·§ÝRÕ°mŠuw÷Ð^¹)Øë]­ ©ãÍ ÿ:¯ÚmåG/¼S°„RlmJÉ6F”9 ⯞9±¾ìÊ*Ý|Âoå¤6hὬx&<ß=¾Èƒã=¥êjnŸk´R• D˜ž[¸:ãù9EÓ¶æÐ]‘¼¹žú5“Z¬“: ÂLè_®óɵ¯ÅäA©¥©sãfÄH£~ÕsD¾\P‡ùE†¢ö­ 9Œ]T±ÿ~_‘ö ð9<‡s£/cÙŠ¦a=è*s…W×ïÜô¢Ö4 &¸G°6òùEá „l\¦\Í4‚Ò}¼0A|/&ôŲ:5Ëõ‘FÚÚ„ª Ùñ špd-g\bNÁñÑlIjþÇx“ñØÌÌTŸ^‡ó7%*Ê?âÝÔÝu×}®qø%—h[pÄd+A;‹Ñ“¢{ÞÌÂÏ«ì€$ß#Œ±šJ«~zuV¨û”‰´xµ9²!×B`Ì®¨Pw+öP»Ùí©™^ãé+ÕßÓ÷òC³­Îçb4daÔC]K T®ª\2@æR“*U œ”õJ/±V«Ø ]V!fŠft0Äw¤;Ë7™P?':žá5â ‰+X¹±UðTÔíd*Ô€UôøLpÊ%…ÕÙù<І£u{V^L„z?Æú]—(½Â'ó‹é—VpÌý•óácRɆÐ’êœîGÿ©¬Ïã8¹¿ &Ëh¾½Ïãþº¾-ä•É ´J¾‡ÉòˆFˆ¯)U&O2XtŒF@2$ÞÍ€êÿ¤ɃŸîâÇ=jš&5}É|ú‰:YãFd Q±ïU¢'G"`Ýb)Þ›Ÿl¾‰Tuó“¶ç-_w¨ÑfAW(P?;Ö˜‰ÀOl:/Ûúñƒ^(JN–õYïP=,{I©£åÉ~]a¦Õ1¹8q]áuQb3ˆ.އ ;²jgá=³ëEkðé–öUê›ØxôL-:oèÜ0¹C G³GÜúwûSÀÜü†« R²+®Ç¶fuãò1ÒÝ.‰)%fö%È—YîXi¾µl/1âÜ9kãQèÝQoN|§=F³z­$Q)Ç0ˆ0®ôõV—š@Åkêô.õ³{öé(ƹRQ8¼¥OÜ f¡ýPÍ[ou~æCÓðŒ½â:îLÖqRt6Ô«KÒß—×&%#’¬¯“¹Œ8Õ×”sDÿ&ïvñ¾Œæ²Ÿ­¼çNpùéƒR¤`gràåî`…fY6uĹV“Ir’$Òˆ^ž8öYt̪ÞQÛsä³*õHÙ*ÒŸñö‡d ÎïW4¿+· ›ì€PSM‡`& %R.Ët:O' Çòý‡òÉS_I)Ú)ûÞg€$×÷}þ”ЙeR `ûŠEz´ï½ë2ÄË"-o*ЇšÙþékŠ`JtŠ„’ž)•nœÝT€’¿i,zÀØ“Þå ¶lWl¯!h#;Zd‡®Iì´Ü²ÈGØ%øg!ò¿Z¢H3a©}Q;o㸈ô2&ΆY™L<»þÕŠA¾=脌°lö:aöÉôèÅxU ü øJu§ì´ ?»„#D/½˜D± ½ð T(9|Lùa\á“Ë>ËÚŠÌ\žlPGmDb¤ý}’XpÚIâ…R#õ`ÊÞ‹åBN¯>"n ¾Š-Õ~Ñ6ónéÍ nª–,2–ª´D}Ûçö´Ø~ïªawÿ¯'¼þ‰ë©g³C`iõ~µ†XRvÖ®ØûY^øºÞÓMûÙ#Æ¢f2£xZîøÙÁ’|ñªЀޓ4UrU+×+HDMUÊH}Óy3}Bia&ð²WH+¹œH»"ÈyîÍ»(£5òZóNž¨™ >ÔqÔEt‹T¸wnxŽà/dó¡‘βHˆx‡S‹Ò­º~£r5V¾5q”¡½îãG„ŽDªþ¶Š0[d /D#Œ=Iõ>o'V)Ž<{T­Éó¡gªÈ$W7òW>î•- ·Jþ—ðM®ßWØ"G  .Èh EÜè¬É²ÁAÿöóÄõÞM=+¤¶‰,iOK,Œ·fÈ÷ÚxºÞä=¼ò /ûi"ÃyžDaÖ“ÆlÅÙ'ޝíO·8ìÓíl¸A­;;•t¥Xž^_÷è¯@ü]Ë¥³ëø &xbX^¶Ôª-¤&è%{WòwNqôªwÃâÏ&Õ]S ñ1ÍÉ·ÿÏ5¿mHJí/xÏU6Óò‚/º•PC2¶t¨XJódÇÙPÁZ¾â ١Í+ñ@#$W󮈪ɜ2i¹k½†ü*¶øä[$íˆïu×6›ú€++‡Ì@ë+›ƒ ùê)@'3 þøö­Sð÷ ë$ÛšÄòjæ¼æï|WèÏY÷¨Z,ÏLPïïÑ£iݧ'r޾êÌ ÒTÿ=V4-Ó©Ü  ç5· U5F5S¿¯Swms³*#î+Wܦf¥èž§¡p¥R™ªŠAŠJuÔ>9Ú“D¢ —Ç }ÿ®¯¹gM˜OÄ ErÙ‡BVúsqóD9L"$Ám€ÌÍÚa—3"`¯ÒØS`„‹•e;¥µ/ŠMfrbÆr:°\b6ÍÁ³¨‡ƒ$:+ø÷žl™\_Ü×€:9ÿÓ¬ RÊFÜKP [щ‘î){߯»n…xü,橵~ ¡¸£97»Ò#âwì?8תÆN”(Ћ1b„¤9K•kÖâ)2n< q`¶&|îÿA?{¦áâîÍx/…?R&ê°À{É~“‡\ã’Éie™÷f…ËWècôd{IµÃ€]ß—=2¾4åÝ€±±¦U£åô¤¤ß¦sïÀO±Bîúx!¸‰/£5TúLÿÊ™ŽˆëåKR~$¨Ë²¹ø¼L¨+>¬@pìÑo¢®bÕO#bÆJ—Ëe¬ßòÖ‰‰†ÍòåÅÅòÜ®=C5»í€Eõ@ñ[ áÍÀW8EÝ´õÌz‰_åÓÝbÇ´†ù•±k·’³¯"IÁ¦°fòÁgËJ5<•x$¶z$?9¥²R©ÜPzMÐŽÕD/ŒSï WN}Rï èZx0†ˆÇÁ‡† g¿ ^ ÿ‘xpßy¿{ô;ƒ'¥ÏSwÞÀ¿­ª­8?ÿêš*&•¹€@UìðXZ Šè|‡c½,BíÐoüøg¢À't’ a’=RN°HFDµŠÞfÓ۱Y7#±&uâøiÃ1 PVnÁ«BâÞ›Vv;ôÏG;¸´º¡Ü;µ>ãRαèé:ûþ˜jä‘ È)̤GˆòB¼C÷‘ *#¾ÊûN%ŠTÌèaàúPìÔ1æéA òÿ—WEü'ö†îU`Pˆ›öe(©8M<¸>ŸéšöˆœÊl<ŸU}YÇãKkx¿ÆN½¢¢5z3c²ã–µìF€’/ È-V^¦ŸöÍ#†i ?€ªi&N8ÿ£:z“³£¯Ë kñj©èY=j8$¾ÈM@¹àbK/ÏÓàdê=ÇÐšÆ vidy™µYi÷ãªÇªF¸\äPx¯A]P@ýßÊSž¹R—5)Î?‰ÎžÌMšo€a{‰çâÙ͆"†sÖˆÊ0RªáÏyz~pXC3JìuÈú­ìyÿrSÂçÊtcçØ9HKÚ9*Õçãùc˜Ô´8¡–è”Òn˜N¾©k÷ë8ÍíŸr n¬—¬ФOè¿UµrfÒÀ…ÈêÑHE›b®¦Û‘`3”Å$ÃÙäÿ¹ ãX“Wù]–1Oç\šÌ½t làÁèý\Çñò4¹øˆ(ªTˆT‚yM$ Rº“ ëJœ’ÈL"‰ 5׈ßäcZ€S6†鮯 ÄšO¤KîŠ;ƒ‹î5ÞõU\ðõóÑÏËIÒu¶ö‘½ì<€]ä2CÐÕJÚ^„wš&|eïxùëtç·åžü'Yé;Y¹wû±HŸ!ÎCñÖ@&EïðϤÆNŠ üT^=n“&Zå¶Ù€d~¾¶â›íþ+í/óÇþêt*È; bÿ7!§ù@#`ª>¦+¶«L nó„î^nó½b ”¯Ó^ÔT䈾v†&Â{G ug˜ãYtÑ/v¦ÀµûP~ âÝÿí¨WøêMÒâ’ýþšÖµu,Ãàž •ÿ —cNÁiMíÀX_‰o¯f=-yúŽ hì:³^G‡¯·=e6îT€T™#:RVlõ˜üÀ±q.šñ}}þ 1•ÈŽ}’Vl&Îÿ9°”Ô/CœX-|K´z,fŽn˜2D8ŒÇ©òEwipï—Všº¢m¡M$þ ð£Ûˆozý©ão¶^çÑr2X%©Ÿûgò¤ë<­UþfõHÛ¼·u˜üÛsQ- Öµ¯ÞyϺ*Å%„‘¥Þw¹r¶Ê ŸøºdddÍŽÁÖšÓÎÎwCˆ7…'SÔR§Lj¨Fw­uØ_Œ’ÒM¾ãï§%6„7ªÔ '½‚!ßjØ}c`.?ÖÕ>ñ5Öå_½ÛÂÊc¢üÚþ@øè–ßYaî°*ŸºóqÝ> ©b΢kfȧY¬åÚ¾ŒZ– ½CáÑ'nÈí·ÒòÇm c`È• ¦ŠJ¬K®=™ Ýi £"ÜN +ÍâÖꮿyšÑ,}íü¯M†«y¤4ƒ¯w ²Ú‹‘ÒïK–§µÚáe#¥ÝåŒ*Óâç¡;¢-uVÔéc37Þìúd]"Ê=9D«WÑáÕº–¹%L<sÛ÷tÝC”PËÈÚ½åô ˜±è…L£lþzk¤õÍÿ]5£òt{‘ÿx9º?„ÌŸ <1˜4Nùþ%‹öù¬jràNÐ4ŽööQ6'¼„,+/‹¸dÌObþgµ–s¹ÜAÑr…³aælÆôD0ÆÒ¦3”ËÁ7ðÔ¸š hAã¨=nèW¢šŠ{n¼ÚOðq³|HÍHÍOl Èé‡ÑÌÉvݬWÔµÞc‡ Ž .²w8£5‰ùÏ$‘€¡ú=áž²G%Øz¡d•ìº,?­Ê0°û;n´Ížg×hÛˆ*!#…yÂW¼+Ým?Ÿ Ë |òÔ/?\lº*×îÑpàG€Ï†]2-3¡÷õËé–u\ØãëÈÌ ==B¦éüÉÃ,'Æh’ñ#5@6—û?ûŒl,à³6ñC"* >/žb"övZªyegâ-б!JJe2Á™ëa=àiN‘˜ %G ñv”pX¥šr7<<^ÙrA¹1}ÞpÞ¶éòþ[ÞÀCk}Irw`ÏóõtJ‚ÝKÁÏ6ˆŠU™=6¨ÅbV5 ŸQ§g÷™dê½½bÀ>‡#R½ItY8ojÆ×6ÐklD‚BŒ?$2س›4”VÚä~ää_éJ å1VðÕ·?›t´1§‘Îß’C ëѰZÃè„Ë=í š £+ÍÓ@ê~d Íà :Ûy\¿™l¬RH… ÆoN®&g#QK-”ê^è{î Ç*¿ÏÎÏéö7)šßöÁ¸ç@A#¨¢„³?!Jœ2 üÚ…³ïcõu/kIoxi#'¥£¾Y @å“ȯHCð4ƒÎÌ¡‘XrÁ;'Ü2Ü™Ê%?[sœðÇX¢î«µ!˜ú[=µç3ÏýÕÉe‹Å²Z®p­^„UR=;Ÿ=•†¥O®NÍz{Ÿ•[C‡›ÁÞç¸]¼;=Ô`ê{“k-¦7=b¿˜G¾b–SºÑ|çãÍ\}lá? :žCb“îíº—M…³³®ì4jœ&À-Òº8‹Ûó)´¡=L¸[S}yÚD®ýÞÇSámr¶ÜxÃúÇä¹pƒ›ì…°ªÆÛŸÍˆ‹HWIv=§C˜:ޏ†2_w×Mˆ¸´t53D϶Ó` k¦ÕO>Ø¿³í8ËÅHòb- °ÿ .´¹‘ÁZQWDùc•¿áÿUƒ‚(CMãFü£l &‰ãI¹ß'*<â+ŸT³lÓµc=3ì9S&„@°Z“ÅÿÄvsœ{ÄÕ˜GCóWœÌH Ôu}x”º­„¬‘éø¤h,Üc}Êþ¶<ÝÝ¢½&ŽY9ÌÍÃ3—7Æ~;%Q0%)ƒ`á áçÒ׃ÜJ¼÷¦†©w¤Ñð\é7H2dm)Þ·îêJôt„ ¥¹:üÐŒ+làõ3™J“ôz»[w:³Ÿd‘Y$”ôC÷‘±Y¶WU‰óÔq.}>꤄~1('«{ÊVêóö½„ðÉÝH¢ï„àèÆ\0Ámè ´ ÓÝ­ ÃS…š†ålËÖ½†r5Ed^Í¤Ü «“¤à/烆%û°ÔTà±.¥…å&ÈïHmÖ5º8íòĈþBjÍÝQ)aXül¼ÀæTíØS‚Úè$4ÌWQgÄ÷vE×\ào¤v(¢ôÁL_ˆÿÙ"æfƒ†ÓQx˜WxÖÝŒM-mÚܰ˜ P%r£»ÖiwÛ…Ov<–Y6e±³VBD6¼‘Ú¸ ãü,½3eµ ©Ž'Hš».C1·ÂÿÄeÔ½ÝÓÀÝ#íú+þ+_G¥€˜I3{Ðú˜D£¿ÛÒ TéÄàÎÂuñÛ=uòC3Í…0U¤`÷2Ç"z¿r\n+H5Ò èq3¼©‡Žða›r#8ÿýhô_ªKà³ýˆFYjFŸ}á¼ÞSBQ¢7S!Â7dÿ\¦ÚªÖU‹R„äúŃ8TûO 4’OÍÛU˜aNR™¥³©Œª'ƒFœéÿé!I~ã_yÔïÏ"ËËn  Fh ^°Œ³D“Þ,ƒª–Ø ¥±Ž‹>l<5…ü#†âÍÒ£uy¥¶|ñ"z¾!þ ìÉ^1-5ÐîøsM*f$üë-~¥û0±œ„¾ÒЖÆ:œs¼FøH<Ëve†ˆ–?¬ÅaÙ‰!þœH ÅŠM™A”<›êF7°Õ«”/ã9ï!©+í#øñ³€’€‰‚ý.ŒKÚ5o€(Ñ)å%Ï2ä…21ñ?6îuXf„¥f$¢10ŒcøÒ”c¬ˆA3rï|ùEº¨Å;9JŽŠ(ªÜÁc9Ôªo¬!„×Vé2äÉûµê»7±Ê!3•F~çàñcÅÖ‚½[8[Œ$–Þ±;¢§Ü›Q”›"·¦-GI§øôå›HzRJ|é¨ê&êä_Í£ð¦çp\x¥ó»ªµÕùŠÁ ‘öBeûuMHŸœyoÍ*]­ƒR&cgÏ'6«S}­XÆP LÝÄS³Z@ùÛáàk D73u"Ez²3ËbB`€»Ëúm~ÏM‘—š1Röùƒåp\ýΖMñcpxjðk¦¡fœ8ùRˆ-¹ø¢VϽÁµLñufA”‹ÅAÝORP')5ñùB–•Y®Â$Pu'Eãµ±ø7pЛ$%e`éjJ=I6ƒç i=´µÛ˜Ðª¦²CKÈÍ ø%ÖÒ]:ÚEU¹%vEC¬l94¾½¯w9Öùý‚"¢Íû\~óñ­ÈÓöÁl…^*›ØxHt±Žf›þNªY!Ôzõ©»á ™Ô¨~òù¦\?l\|‰qEXÌÚ&å!a¦æy6¯“|T3h| ­¯Þs¨¯.€fì< µ¾Ï^Ê^ô)ï@¥7\ð@>ik<èŠô-¾øHøÁ«4æÏ.œº š@V»u6m‰>Q”¬íÿ´’ái…ÖÙÖPèõË™¯dD-Ç¥õqQ}ËëèTi¡¤v«õy!’èŽ:€òÖÁ5¶¶~=RKÀ´3ÕÕÀî¼:ƒÝš‰+ÑQߪ§PWÉ£˜þXÉ\ê\íÿ(i¼á¦õ^PDcdæ“íãå¤)œ¤$–·-¾ÂîÃÃê¬]HƒfxÜç·D¹QÁضÝÒºóç†æW(¦¥ÖåG¨^ûNE¢WžѬÐÝßÀØ ?ïÈܦ{RÃýï-h`¿p7D ~y¤îB×îù½-ŒºÙò>Zµm‰é’ÝÏ}»WwÀ‹”Ì™ÇãЭ9¢Œ–AÙ ·ò‡‹«zJC°.´”0+ßç̬ˆODK÷Æ-ÎÃÅk/úwšŠw+ÊØ­s!©·Û‚°o ëõ²çh™iÐ$Ö-d|­ ºÌnnOA†ÿ)M ›‰vP×+Î,°%§Ô•~ßþ£¤Ÿç~ð5ãÙ7AD¸ætŒ”½÷{ÂXûSÚ¥tpí-Šj? Çw^P;V—×iT`i Cžö{Íhä0è‡a+Ó¾ŠI“œàsîg3 ‹HÇr€~bz2òMÕ¢vÖûÑ}ëÇ‚€W±¸é¯†¬€£Œ=>°à˜™›gT³ŠËTóƒ¯7k>VpX‚½ÍªÚŸb3Íaâ)5ÝGąϪwµPaÜW¨qˆ¶3M­ñ—=ÆÎ6Jœó… +jæÝÆÊñ<+(ª¦B©ªð³?Û|^æ)ýÛb†:ž5:‘hîÌ1Y©¨1ÒjÝN°hŒ”y õHÕ#‰G½‰ð…q‰U°©ÊöxÆ'nt2}M2+Vr”ó9©ó¥]I_!´ñc|®†ú‰Zþ‡¶]ŸÚ ~²Ÿü¿ÞZŒ&$ 76'«ä2‡U…ãX|®2'!Ù3au§½Q¯¥$HÙ¾8ÄÞvµ/‰âß!p¯Ëz·ì«]1Î;ùHuõü&¾ 8ùŒäÜ…ÂììeºcÚˆŽû7Yè•4®œ¨rD”E<ß&ß{¤Y…Ñòµ+·=ÄâÑ~ð‚‹Pš ôŸ'K [¨À²Þ¯‡‡ÎIVh& \7wÅÑ¥«Qþ÷cÄ®¹o“ ïâÓˆ{Ïq7†"Y€Ûx108«^d¼’SÅmî/¥Ï5zd[±·ˆI)Fâq0Úõ›,à¥} K„| e¾H½F3ˆ~0O»J¸U)«±S»vÇÚV'OÕXU7±’u¿v×e};=æÍ·?RyL>ÂV…ópÆO‰Üº$"¡èõ¸µ¸Tœ:Šè¡ï4c“©ÂïelÇ/Åbþ™¨‰âpÓÀòÔÒíq¹é[w:ÖÒÃÝ^ø`O$ò"Õheľ‘E­§3\‰ è9¿0-½i†>÷§;¼nLº)a\o¶Â_”\ñ‰?Së8“nA`Á—t\ãqÝ3´Ÿ3bæ‚U=§èTW2+ÍÓ‰b/êé}¸™@´£|¶ì?ä’7°2™ÂPÑwZ&  ­F§Ví ˆ*…¤U,{ŒŸ•žíäIç!ÏñGµ±|Z.™k½0Añ-¼Žä⎠'ç,©Œ)δ®K LWM¥•¼P-]?qæÞ”ŽèÙ|MÔoþ|z5ƒ@ÞÈÖ¦óžôb2°¹¬8šèßËÛ|”}!'þ˜yyJ;ܾQ66$ðšWd_Z:Ä<L‰Qè$ÓàÀYÁqe'Wê1!¯“̤„Ü»K„£BóóÜ´D´: ™ƒä¨Bæà8vÓo¿ Ý|PY˜RþëÊ0ßó%}çQúÖã‚‘¤Ÿ4µzX†*f˜‘G9¿m±ôïV5æ5n‹ã…ÃEfÕ_pñÇ(‹sT^5.ˆÇÎ?h¸™-ò„N<²=‚>ä‚‚¥©#¿Â}0XIÁôp8_J›ŠëJÍ íŒAYj[åIHÌÜœßǺáSío€$ja{úgth«õ›ÏZ”›aˆ¤wG˜ßΜxÓ1”âT‚¨ôpÜmñ» ZúˆSvõ0¤Ü/9 n· ÎËi¢)†&Ž.H6¼ïª¾JyÁ ¨v›^.+–uDÙÁÂ` ¤ñ3Ýs°ºÝfKÐFåÿ*óà%f,Ș¦»R€ì¹ï¥ÂFø€ü†>¬1stôx5_W€sžªx‚ê–lÜ›•I‘)…‰¶‡:ÛZÔ‰æü\*—r*’ìhl´VÆÿU®³ß:±·ºb+¹œ*Výdý6š½ß©èd#¼Ï¦BêÿL®JÐZ3l³eEüdZÞô†ênê©ø\b-îØDbYû š]»>àÈ1ó}¤™¾é‹½$º Âþi±RdƒÎQy¦66ÚV¤y'à÷Û]…r­Y4ÀÊà"¢+£•Ç? ÔÖ…0|>„K¨½Ì˜`›²)>zŸò¸<~gÙù¼ÊËÑñ?þõ5TQ1K„ŸÍ»ø¿¬ð +0 Œå´Y!æmŠožwäÓ4ébbÔò¾l_Ùø¨ hÆñ*ûb~21q¿ Á¤ÄkÕO^Ù§qÃ0ɘ6M ŠI—±»>æöfwn–Ž¢›¡Ê/ y£®\ì4zå?7™\ʪ–O‹‡CÑ•× Ç.<¿/¿Ä›‹€ßcØÿîZŒÉ8I+>aF™ûCüë?É^cʾ¸\2Uk± µ#nÚ2ÿȾ3ÁËÓwrÐMçù!tÑß#AîëÇCáX¾㯠{…¶Å¼÷«q}bÜœ¦—‡’Õj')ÉYž^j#Îöfpq¡I˜’©í v¹§¬ZY‘ 䓿ÑÐÛlõ¾XOiJÁ±;”šÊ­™$o¡áLH`cÑ’÷š¾©Aöž²m0^¿Š2<4¿²-˜äãéwßÏi©näˆÐ;fô ³@¼ò]k±é34èmˆ ¢'|h4›[m€…è*VmÜCˆaXBÛ¬m^¼§Æ +£ä¼ÿ¬Ì­„ßÞA³TASÉ’8Z°^Þ‚œütÿI‹Ôq>cÛÓPІš‰%qýÕÝzb{ß/"•rFåÔ-¢éw¡Ÿž.âûè:ÅÌhRù³és Ú© ð8ÂYåxŒ§A˜‚÷’Î˯„: ̘NYF¡nNæG¼«­ aˆ§v™{¡ì§ú÷v«;ô&»™0´C:™ ò‰tIN¬mÁNÁ8 ¾\{ÙÌZµQQ¿fG>Π牘oÏF!2ÚªCÅ+òjÔ Üì]ã\kýj89œç\²~ÜŸpÏ»šßeÔ×@î5Éôø@ñ㠛¼ ºÁPëk“$Ø#Ât2%Û¨²#¥—$Ô{¬X‹¶þ¼)ï¼ò”žø4-!ª§Ž2¥j$éÄqz\B붒݈î×÷µs[» š––6]¤Ôµ°8öƨ–ºíIr¥²”X‹ÏÚó¦›â†”2çI!ªêaF³(œœÜr‰²U¼vJ=ÒüÔ«œ„ëhSWv2a;xoµ¬jÁR˺þ?¥ÈnîÛø0o©æó«zº¬nÆÎÑ$M¹vl~Ÿ›Ì#Œ‚– —)W%l©\½ tZ&†$¿4)ÂêDš°ÈÄTí¬î.žSåY-qdÀ¦°-˜2Í_!ÅGÈ-˜6Êâ%¬ƒ)°ŒµXTôì‘— »ébð)PR³Ã©à 6’]òS§†2ùvÄ*Ký“L¸á¨N¶ðç‚­n±vêu_Nq²KB™¼II5þkS_°Ð=ü–øº•¤ÕËäÒU¸b›{¾Å±.ÌEU\x&¾Ç¯–yFδ…ƒ8ƒÑrQºI`bµSÉò‹ÝÁŒW }hÔÞ} ÖûÇh`‘ŽÓöm`. Uìi•Et¢ÿYOYÿ TU dšØé‘`­ rÛ|sÐ3 +.¾éÝBðˆæät-Úf5Ö‡+ËÑyÊ¥–YÐãõÈ:â§5‹tÌ>‘»ÙÐî\v•(˜îøj{%ùuf>ÛÃy)ÞÌ¡¢‡hΈ†¸ªm¼ýŒÏˆeÅlÐönüHgé4CYwÁ°œsºtÞ¥ £1â4A[¬JšÙwN´lÛÒ4Z ƒtû³˜@8txÎu`%¯6,7 Ä÷ñf£PÒ³ÃÐý³™FÂYÆ9Mʧ‰·™Îlú(ëöúY4UTXÕö–×›û{µÔµˆ¦µ¿pӾޏ‡Gå€6«%! ï$­Ìw­a@j¢“ƒçT Û·çÁZ³™U¹)p¶× Xb¤v"Ü‹à“Ã)Ì9iÊôfÝÀö˘kaH€Èí Ö^I±gø©·‘â¯K“…\Âbÿ‹<§«\\RA)žä‘¢”§Çq.$Ú"d…:£6—pL›J^—9×õ^ýAÆl||Düµäî+"qñ´üùI7Ò$âÃùHåûúo’ˆjÈþú‡øÒ©¿õwþìÍ×Õ8cLv²C#Iu¥; ¹×Vbr­?@}yZ ·zõŒ¿ÔqÅ=n²Šµ¯êñ¢Ñ‚‚3¸v›PÚÍQý¤Öq{½xà`R’½îõ LÐmØ’}k;|Ø^NXv½™†:&6XZíQR)QŽª†‚.F8AåÔ²có6ÅÃÍÒ¦ÑS-½31U9†wGŽÕ¥½/¦WæO5¦ZV½ƒ”ŠëN7û8Pí^™Ì®ÑjÿæÐ£ï老ÿR:з Љgá¶&~° ¥küœ)%­¸CM‹›ð!(óÍíTÓoó›äã:‹¾PHh vF†šBZìÏÎòÒÂ^¦ À˜Ótg)(tŒ£³ËP)ýÍâÉ­.äL-0—ˆ‘â˜ýø¬8y­ÖòtÆÙä¾o}ÏPÜø-šå³Áeµª^®9¤×ÔÐÓsÕvuyéw©PŒ7Èû€òÌ,ßëq4ÈÒœ‘Uظ³h ß¾ƒ qÜ /äyQ‡‚xö4Ç3­æ]ç1Ì2N½‹ˆœ‰Ž3,(ûÖhîù¢Ï|WÝëæö*µMJ>ÁU”\ÕßTr¼Uô“ŸæwÍ›mÒQé—r£Ï݃únƒÓÉý¡Éá%ç"Û?ë‚ÎB,åq•DZuŸ‰?Õ™40³‚øºµÿ_ð{*>M€“ASiÔ!é*Ω´ÍÕ$ ,Ÿ!ÂF騢­–QÍ©+­DxCÇ*Ø :·ÏÛ ´&ÖN,YüßáFÌRcgìöÆÜã5ÏÃQn% z›rG•_U^—X_&¿úS’)Ðo-9ZÅ%eCÅR(D ±F0Ê?)t“š¬Ìü_ATìz5Š5ø” ¹'µÃ4tÝW£ãírž²©íô)1>>K‰&Ì3ù¯ ÈE`áõ¢¼m,qà-¸µìÜþ´àc,<ý¾ @RÆ^ /¦–È}wuÌiÑËe8o›ÈLw'bÌ–Qb„Oy”6UFŽ•hÂì‘ôµÅ|ëÍü”2®‘»"Žeÿ®,ˆø¡%4µ@I‚žâˆ9 ý$ (ߢ*¡¦ú‰´1ä/Xlð§ånäÈÎÇãq“£ŽÝ-™]¿R¦ƒÜª­“%ÖNÌr·E ‘»S—êf¡.»+"Vz]½ÖÐ…ñ‡BÖGš‡•×ahZÊr•û×í©Ôð ¾ Õ¨ÑÕÕi….cÑ|çyÀèĹ~ÌÀ¹YpZäE}š‘ùµÜ@ÅǺæÖцChæ½ )©™ßÚ¦ºRªui 3HRf#Ó]8£3©˜\,ú™= G®^af=•/ÄÓ_`¤uñýu÷cC^œéx,^láA(Á„ÉÞ·TœY)èû¡:þ.ôQãè±47à³Sbd;{6‡Š;/4F˜j 3Co&¥Ñ0¼¥«&ÏoS·3‹"Foеœê5‚O‡utŽ®b—¨¨ SéeIN'$Õ{›_µ3^X^èqÁDгŸ£.†SæöÈQ:Ú1ºÛ€°{‹?9m;SM]ñæ¨f•Zx;!WC9¿‰9Þßfj±ÇíÅÃÅÆµÂ·’]õÄÊš@Di¹W·aë,Zì ߦ)éãkP~o »Äæ))únF;ñ#µ;||èêe>Î$a™p…Ù05­>bôÿÑz<£„@h?¥@ëµÉ­o¯q3í'Ñ¢˜…ÍÎNi^ænþú*H¼Œ* 3R Ù Ãü¨Œ8SáÕ2Ëß–÷·h!¥'jÎiSbÜôñç?fb9PÛ MÃÈ€ºÔº‹ÅùkÅg§Ø÷AU3Д'yš“ÚFëcùxLT¶­ÀcTÐÌ«É;ÃMÁ@à^W°ÍyÚZFsKá©€QÌs¶Y#Þ·ÍÅ›:Û”ÛÒ,ùOÿoÝ7k§5á ÿŽAñç–ÊDŸÓ] M¥±LѦäØ`%:[Š}ú^ò‘SSæÛ›vU’otrjG½>œ!¬é‹yÙù9é%ƒõž!lHº˜ä'šÜy¡ý:¼ Véð>þ)w¶°T˜˜–WÍþà`èÛ°>1-LÅHøÃ‰8]&¨9Kýzf"rp¨ó` WËÕQd¶–Œ·ê¯aään_úée0ñ‚‘¹T4Ì¡ö®÷áy÷7pá"I%䥅‰ÿÊ€“™yÜ@)&޾ã¡öŸ/k]þªë¾îÜ ®—áìfíŽÂ×%ã±$6ç Y"θ¡ÐÝ[—²Ü~¯¿Æ;Á1k£`^·ô\my}\J„”«¿Õz­:Þ•f.å4ç« ýã¬tÊ,Ø3hDY¼:Èèà ò·„^‘>”hÖÏVkf3·6ï¿@úVß/9,o#“û˜åÅX±>•$Åyêˆó;ç¡R,³Ï#Ýmð|$#^‡pöXý¹E‰N”ÏP¦µžïœt!<¾“=Œw]êXÚȺœRÔÖ¯tgÅy–¼ H¯ÑÔ÷ï>W͈ösAšûAà>ºÞ„ø«ÝTPÀü,%!üÀ¶cÓZ†Yƒ£vF—t¬b.ÙâïHSæ%uˆ5ä5Ù磜ºN…àÔb@<9+E¼±3¥I€E8˜G:¥»ÒÊñ: l±3)·rÞkS60È}÷ñšJÁª³gZ¥5g-5mûz¦26îàÏNì1… ÷]¥Oiì°žŠ AˆIºÕ„<=í 4B ŒÉwzÀæ¾bÕš]€ð' „?É;ýˆXè¯Ra n”-§K_ìv¶ÿùB¦‡cûĨC¦'‘ñ-òì¥*ŒÃ/Õ<¶ä” »éºöó௠º%•ùÎ¥>}@ îäü ‰rè5£a&Â{ˎΡü8›¶âw Wóp¾T6[jýR¦ZèÏàÊ&øE„>crCû'ƒ…?è I ~Š&>HºÝ ö=‰Ð•B´/]àÆYÑf{çp¨AÕSÉV_b@’Œ¦L¡!Ò™s­¿ A<àëÏh/`ö–4b!ãO‚U!î‹·N(Ø0nçΕb ¿–=P .(æË“ {¼†yq:;l,•’å¶€ µ.ð(ù@|©¡ÈA€Jà„ˆÂÒX”iàƒ‰mkýŽÎ‹Këe,NðÈì“=¾ÈÁ÷S4d"p_ Á¸Q(Ç™ŽJA•‰WT¹(™™‚ {V:ç Ḃ+Y;ÿõ… ¥ú-éaü ïV àUßkŽÓd£Ž Ÿ+ä˜OFõ¼: ë7˸Ð×hÒ%I¥öÇÒ[ÆØÂU¨ ":ñÛl‹©Ùô.h©:…#SÒ_Lð'Ž®•"¼2ª„ùo»M b߈j}¨šHñNÁ\D3­<Ü.œ•I}?¸-îq[uþܾ.¼eÏŽ|“«QäZË?Ú$­“À^Áp²³A 1Y~Tû¿g˜@’HJßîÒ½ÎÅ”;ô§Ê–9js[ÜÒ¶‹ä>Å_"·]ïê;µÖã‘x¬°¬É3Å4†ãôV¦ë>aI3–¶Ú8”»O sÀ ¨oä«¡DB·Kgöí6Û@]­Ç—ïSÒ©ü—wVÔ+w oE³¯5ÎÍbÁ›­{X‹§è<‚‰EØxB‚y—WšÎoVr5+VïšòP!?óÐÁò\‹~“þ%^›;ùàs&8Ÿå_y€ßá‘´²Á#·îýœ0­>?ø,µ™¬>”m@ÇÒ5MÎä¶tÕôÎtd 4Åø‘‘Vlúr‰Ë‰‰½æÂå½î%Ž›·ïÏKèðãÇ‘‰‚…øP©§jÛÝw‘p;ûtHrs¦œyÌÌþŸµ¦l›]§ûJG¸þSHÄHt«Ã½éÎZžÃ· `%+•m™ŸÔû!œ )ñž »Êá H=w?y¨¦Ø&A· l²êë%Þ$¢ä#—AèÑ-£Ù~â šœ‚eC ;°£sZ—gCh©Öíjì/¬£À¼(X{JO[øtƒ6Eæ[—ÎdÔvkìE zwT2Û5¸9û&{'ÀšC|[tåÅFëôΖ†Æ£+W1Ð$M5qSΔí4„³¦d¤À·RàJ u t~À¤C‘0¸m™¢™ÜÒeJÕ38ÚÉ-§!~ŠO Áî|‘²¨Þ4åÌ¥•¸P‘˜î´Yúeyd€;Êä ™*hZ)¤Œu+‚ßf~€·“\ Õ­®†wˆ´z'ÓÌm¡õc—”ö§›nÌX@9ž&šÔ²ö*€}÷2J¯ ;&nÉVòà}ÍÛÅŽ”íûzž°çÓ¶/Dã1ìþɾÿ“¹²©­OCrýuÃò‹ùœa‘™éâÏËO7D5õLð]˜ Þ·ój*¦xKo ­çØ 5ô‡½:p)Uíe›âf‚Ö$¡»ó­w¥=‚{Ÿ&-Êd¶…zþ”zýNnÄ,ç)¾WÞõÌ^DYfµAÌKbìÃE&ÅÍð:"gæw”#£æ£#ͦ ë :ÿ”E¢½Å;ÌhcÞúðŽRÓBû¢ÅËQÚ… …€° œÜ_¨ÂÆC}ÞEÌÝÂ\ƒÆuù¶ÿ Xì•s3å³ý½ !^qÙRãm=5;]¼Ï40ºîT \iªcÛÛJeSó#_8©º á8_ÿ!«íZ(Ùù£#¸oœ± ‡óQÔ FœãÐ 2(Ê<-¬$g5ê:ÖôõWÜ4Qñɽ`NÀ’sjûXrkÀáß!o¼hÐØí%ë€$È»ˆé„˜afžR6Uè5”µßI½RØ ”–ï¹ÝYkí²±4s’Ûë{å(– ßñ[A¬\,¦L‡Lμn#@æ\ðˆÉü×C‘YÂÇJºB„™éŽDý¾-Ô†~™˜ ÄUÁ. š™1‚9k<”µYh*CÓA¤M쌣óm_Ÿ†œçC& ^ÕÉô˜ðªzJ6€‹i(²ûnÓ±þ]U’ÆÂ™dsú¤yÞe˜°<ÿÀ@æ¿ÄHå÷4¸Žýët¡`ɸucà­ }l/ˆˆ¤Î¹•äFœ$4Z4T2hÿ¯Œx?Â,ææòм’;úÕrª±MèüǛҰg@ùáµZ?}Iu¢ÖÖuY·Žíl‡¨#2 õ5bìÚ "£>wFc4?†…Œ‚is²§_+Œ,µòü@žÄ¢Üu±®@"^ÓŸ»Ã3ÅôS¿Ç½œâD²™Ú8^Ó‘’¡Iq ±:e&~5¨æéLèÂdÀ¥\ÂKS:—å?¨…™RŽ‘»/ET1 MÌÀéµ þöJ‡¦ÅÂ}rN3¤83Ø6}d呂ÝÖOMÔ®ûÎ˵F"’?ó¸­»ýCé{r²ß9[da´‚dc„m¥æŠQšW~«ùí·ŸÅ_½GæíŸÓ9Ýÿï;&/N#ñÉ.fÒ°X+¨¼¼{Ü&$Ö!É3‚U[”ŒÕ»ió$Á‘hjŠXº6%¡›‡÷mJÑIÎ'ÏË¡U>èÑUñ„»9†0IÀÈŸ#Üæyû.(q’ŠéuL,¦w‚b„ÉØ£„j+Î\ ü ¼v²Ìô\—-d~dž]nA­ÅžqXüE{mh1¿Jï¥_ Ý*“¹hlÒ*±¾>±Ø¤ùù]úIu4÷)¹ÉO§¢˜‰Ðšh’È5´¤Ç`’,úc?´Á÷ÐÍ¡dO¹x’Ù>µGÝרFbáïBéw šYc`ü§' h&¦UUúØÁÍ]¿ÓI~ö•Û¹±=IŤ€må*Zª¾k“ámGÁBm®ó%GKd|¦n…‡ËÛùIÒ>Œi:ÉÜ·Z!ÆTeø §‡ïÃgò½$îÿ4k²”JVÙY=L v&ÐâçÃH2 ÎçŽø/;Âõ}"9m¨ÁØ7™:òÄw…fþQF0·ö⽚™ÃRÜíïHH\ÌÅÆZŒªˆºMÕ è¾9TšçÜŽü•OÒ+¤RÖÇ`K_®neE”Yåne¹·46ÁR„y¼ð ¹fY<…?§0¤kmØ[:¾Ú°ù“^FZñºýòº]íbãއiè+twn\W¼E w–{m.RÒÌð›ŠÈe4S–¾Q\ˆc5u¶HidÖ%ÁåIá:!:ýâŠK«Yű1:ûð¿GÐJÑã’Ý#zHj«¶¯Õp@’ašéŸv+‘…9(æ5þ¶›µÞjù¢(Ù?¦\;å¥Ã=fv ¶ú­üÝr4…gêÅ„ M§t„ûª7°=‡¾ƒ+Êó/½¾I­KiÆouA¤Ã³$2†ø„ž~±x…%¡¢Wæó§ }Tb(gš®‚I†ÔÝvâ±í¸»®B)‰ÈÞêÃÌž+ôàÿ±$r_ß6 =ºK÷肇/mì ð}ㆺýäºòtê;ÓêÓè­½ª#Iˆ`+ܶ²„q(H‡Ëž¢–„’=óGRò­ô=\±»¬"üƚ탛…^í=®^ž–+ýüwóÙÚá·ƒ´˜H)¶õï´ÑjUôî%™nðøgνÔߢ‹¯´ã±:´"¬Ö*å¯Ä€³Ü_\]þo¨ði_EÉÞäÓpxùá¦Æ¹ —âEmÅ0ó:c ŽádÚ˜-—Û;»¼…³–ÅäŠìÎ.í:¤õßð¶ÌÏ¥§Û½Ô Ps©è‡Ð[™U—8·¹+] ¾Š¿ ªjÖÉ©†mp ªŽOs=É6 ÞÈkÙ‰h B²;›–ÕG¼;,UÁ--Æø¡‹Œ…\lµ@u¹÷¼îlwR‰eŽy~Ä@_%Їò=zÇ[剌EIòhX#I.\f0ó²m÷*¦Œ&­’•±cíp*€;l°Ù¹–ƒ ´xèÑŠ¨*aè:§[,ƒŒ…ñÉÓÜóŽÏ_Œbî³HJ¨÷ l5X‘´""r½ ­ŽŒQŒÒŠ*F0”,(Ü׫+ùW–š! Ú­-fNƒ´T`®íçA„Œßˆnk|¼Œç²ÎÚ "™nIÀ`["1]Ï>*þxaשQ»(bH&°ÆgsQ Ú%ª™j ¤ãN‡ê]D¤Js”ε­ ñ`Ú*,ÂÉ:ÅSFN8ȽâSiÿšˆïn8ˆjŠp{š,À°·°—lÊxj^7òÿö%´›<)øé7§\ÕÀ+JÑ̬-œ‘´ò³«AÈœkCž‹M¬-J$ïÞ¶RàKD¹W.2+ ä"¹Hóì uÅbÔ™ƒÿ±ÄÛolö‡oµ»t»M¡Èo²çâÈ}Ì`ù—Wí—Y¹ÍòžÉ  íøXE»õÝMã’_FYº§‚P9ÄRlã:þЧÆb'aðÐv°-¾czhefP%9¾ó‚*­js‰Pÿ’=˜é€É·51oB©8ª¿ާ,‡ZÔX?cj,Çõ‡ñL˜k(MhÔR•ɽt=NÐå·3w™#šü0 M)¯™Z¢zÍÚÞ¯ËR89ºbƒM'»˜íÈ’ôHµžÎ¾ 8µ^ò“`Öjä”çör!¦²ZBHðòw¹ä%ÉÛØº“I|â^—¦çD¡îž„,¦£÷¿mˆW<é¤k¤]•{Ç2ä"#¢{@í.¤šâ0a×Î:ö«¦™“§Z½t)¥vQH‡\P”åy$™NÙª¥›ñ„‹¹6–×S‚¢`Õy6•Á¦¤‹5Ióžô!°Ùµ¤Æ2–á®[ܼ±»Pë:Ú™TSrT;¤“§Ã×M·óÔIÃÅP³ÛBio.wÛ:&š²Jìw+Ìè÷ÊòZpÜh6ÍÃö›‰aC|£ áZö7]sY¨ ë«¡øg£Ñ7˹ß{ êÍZó{ÍzœG$DŠ7`j©gîý!;O)èBÒé­Àù·°ü•†öÐôzŸø„áÑ)s©}~´ãÅW»ø³+Ê4óI禎¥X;SštZ30¾Åg,-Uñ&14l±»îPi_ šGý±pPj4®Å@ý[áÆz› ÿ@Š3:Ýó*(K ðêq7O&>Œö;“æzõÜ¡»r™$0¼>kõäŒÛ|-ÍñÙ»¦) "ÅýžFN;^A§ÇVÆŽÂ# ;Lk\ÑVÄœ}|¡HJ Íë‹DC dÛØ«kç¯A·¢òC€E(+LGÈR|MXlaÉŠªÃ±e¿ Û‰Ávh¤¬ì”*ýk°Ÿ¥™!ÆNľcWb›áWGWg!`½[cõÞóU£i‘Y;»im¾dŠŒà57/nc¢­/3mž¢ÑÞßê½0Øp8KA;'Ò+Y§L÷ìGY'ÌoîÂ+ÊQ°’öúYÇb¹Lê‚ÊÖÐ>,ˆ¾6qdè·nF[8>ôy›¡JR¾ì\“ôŸu‡ê‘U–Mˆæ»r„£¶oþpfÿ7†Ú4ôÊß¾®òÈEf^W:þ$->+Ü `²hÔæôyÎ2mîF¤´X¢X™PG}ðSDWsk¡¹`3hB9hÅæuÅuj˜·„_ñSV ~aàš¬ë˜tÓ#™ql—uE¿U¨þ¤f‹B‰ö³Ð?Ô(SE á…_ä?žkp}èön]3”Tm‰°95Ê*†m7X#tâyÛ¦é…ù3 wïíý<²+}1£·W“U.d1´Å-Õ4·Ø¡žÚÑYµUºÓŸ_3㔨kÙOûÀ•Š•bMUÀbúQ©¤­Þ¿ Vv,Ëã”_œ8% hªeS:^ ôü´$ÖÓèÀÈuº„î.+ ÿ)Û›–ÛìôäÄã ñÌ ÙÖ/Ò5RùµîÖ5Q6%𸨃ÏûCޱºjø¥ùÒ ø˜Às&½äãÚ·=ʬOãÉ*§»hUÕÒ‘=+oúD*Šø„Xà0[(>8ê«Ðörtü5*ï ?ø.õTa£æˆ~,k‘(¨vY–žûÌN3 ”zÐ[©ÂcC}¢ÑÒçú‰²—­Áv~BCô´¾:¸‰]½™1ϽÙP ôŒº·i[M«Õ×͵ڢ \‹L,ûÌerÐéß2VŠKb0B^ÿ©*Í.Tƒ9‰€Mg䓊‡ÒrG‚£ôtH[p¼ø%ý™$¯ý2áèÚàâKõÙî¦1ŠÜ}’/B Â€Y\"öf'~Xáaýì®èƒÖÜØ·ö½R°fù“b8Z/3n×ùgÛ ç/bfÁÚù¯wž2¡¸+ìÚA>/ñCbÍ_ñ’ƒÓûƒI«ýQé…û?„uŸj3 v¿¹ò¶ÅBxa5®xw¢ÈKÿ /²zÕn×ñ°¡ëìdÁ™Øåhö^ÔÒëåwΊ)áëÖd-úãÜQX¹ˆ(‘IW5ki-yÝÑîCñê(ÕY`§Ó¸·ª_ ~Ê2±Î™ó‹“ÚF]®ºÐ˜ƒ‘f¹bïÈì;Psœ ’. m]ò­ö¢Š’XBE«õÖGiªnòÎ š"¢ lI»_m¼æoÀRãR@lá«ç^©u…gþ™»RÜÉuëûŠò(YNŸ²x³p¿ÁÌî pœ ¬>U>㸠f]rÀíœyKS!.ÆÖMP38«¢®YxnýÒ ©öàuÕ,Ímœ™{[eÙlÄù¡CÇ&¯Ã­ÈìOÆ63ö×Nï˜.²W³1O,Ù©º«ÆC6d%ˆ¹*ÔMlsKñÒa÷!‚7hRA7Ï´?V”¸?ŒGIÎ6QÞ­_3q:!÷uÜ ‹–áÛ¸]&°¢íòmP’ø$ª‡‚\3s­ §í8l;:Ƕ£Ž×ÚZÅ COIcŒsaÆ©ýƒX‘ê„{õ#wÇÄÇán¨(„ ;¬ï¢¼9$p¥û¥‹ªÖ2Rÿvðƒ7Øš}õÇïtMCC£”j:X§>}FÎwÆÖ~,_¾ÆïCp ¡Ê|˜ΘlLmíBÈC"uè#ÞÑ´žnš‚¥²¦ðùž˜t‹ßÃZQäùëYó»ÀqW ƒ[ÞW6’ËwÿÓ=¹wðŒì'åÝf:(„VÛ¯!ë9ߪÌýuÐ.ÈÏâ…}ŠÇǛ׫ÀFÿ—­AMµ½W^ %’èý{Oä¿Î¡*°Kô¶°öJ+²Ð4}žn“C€WÅÀñ¡3Òë'˜ÂäL,þy$rq—{?†xó f`¿ól(µi»™fé.3ÏP¾²T©}ú䋃a­GG‡YCÑ`³Cn! aò—?7ÑZI¨¤™]«š€a»h9 GYJÚã¼IVí"|:ø‘qŸ/ìŽÿY…Ázñ›}haן ŽwN¹íÕ;FpU™çŽÐêßÃyŒ\û\Èz<Žÿk%ªXØ$*2°ë äïã 6·É–CÌÑ~wZÁõ‡ÔÁ¼¿³ðáŽJÇô‰rW±Ѝ3d±—ؾî÷’ BáIXTÜS“úCLƒlD²W»!ãN“:€ïyÏ&- Þš¯tÚ‚o(í8öx5"hA<Ó…¦Ðt÷ãÏ?šž]¿BEbu©×§^¼‘  ñ`4„e¿µŸž: ó0é>ÿŽÐ¹$`ÜÔÒ$™K¢~׿^»`–$©â!Ž3Z¥ù/\¼¥¹KSX~Û¾þ!}š[PØevÇÇÿÕõ²Ø «CS¯$éÅí×€>âU3Åâˆìa&âÖ œ1ÏAÃBiQwiÝûð ­3ÃE³Ö¢°šË?(hÖÂQÆþ-T;TG_à× ß„ø4ì_ð–0#ÈÒIu/k_uŠæ$³ØNØ)MS´Gâ˜{`ÂtJôÊìB™“‘<‘êòj·P_nO§O]_Ç„¡»bjƒ´yÜÉÏÝyÎdöü[ôÓxv›ùU< q}Nð£dŸ>ž³·VŠ ñ]žéˆ¸z^Ùxì#¤ÇúD,M†\ÏBÓçCkÏ®ªû"ÜxÑ…i"Ü5WÄ)h¼À·t8aZF^¯HNÜNÙó£Ö­ÎûëI/Y\n@õîÉûäØŠå2Àpéå ý^Fm.Qt+ €03€ ½¦Ê§†ÜwqwšPôïNÅÍDÏŠB¨r;û€ÎªÑW‘ù߯Íù¼´ºFEY×’JàkJB4>íG»B{¿¨ðFÔ9Ag"¦a})ë­yaEÀÇ{t׉Í×ÊC@ƒ7RG]VŠéj'Õt‚¤"dhÿO`ŽÈaebúgu +ÿ¬En€Œ·~³:žðé¾ÍݨÔ4}â‹þš5•úx3ÐyXœmúfЇ¿Â‹[¹õ@ö| 9ݸ7 ºÃ°5SR-rg¢Ø_6\Á 0cn¨œä7±óóê­ÇO]p%Ôòt*ã§®6íP“« Ä™·YíyËUYØlÓvè×xx²$šá ÜÞ,öÆZ¡±§Ø?’e3ì&»€«™·”ERJz7Þ˜¼k€‚sDdvTý9±ëZ-†Cî<›‰P§yÈpef*ËÎÙà#‘Ub’õoÆaðГµÆNÏŽÔlµ¤÷ØŒŠ±Û‡…Ÿ¼‚¶@ œ×|’ÌGŽNQa~š*Œv6nÜ­ ªÆ˜~qˆ ~0úˆ=²”õG‡.liÊõ@KÙÓ¤æÓ=—K±§ ád* ¥†·SVÇQAbŸ]!¢[÷®xà$|çSgKÈAÌ‘YC•0Ëj~©U“jµšùŒäï¶¥Y¾B˜Ã˜7L“e?¯]ÿ6HEzÙîòäÉu¨Ï'+ #Ý@²K"½qÜ}™À‰aKëh& Ær·¿¹Ó‘Sh"ëäÍà×Ï€ð±_ûó’$TïG?](/ÁlöÊK|yÞÐŒñó Fgõ³ØU¼JL÷¾K (VÙ)ÿ8QA¸ýgéq/ÁØ=øp,濸— ;ÑÇ­µ1ïf6Éž¨êÊ xŽ6êŽÚ-ĵK$31€#Ðc@Ý&ûÃù°5Õ\*]O|¥±WX–YDQ8G¾!ƒ©»ŸŸþn,öÂø¿œÝ7sûDc•IÓ¨Ó)°†ó¦õ몦&õÞU}¥QÌ#q[äÈŸ†ñ‚þ0LŒÉ;*…šø‰"iª\H…9K-ÑšI´vТ 9yé«@sì53H(5ÛV€ç°eô®˜¥ÜB«L£>Ï›0ÌJ圊©ç+z`á[ñrO-ãJ]º>NÒÒûmÖ¢(%¾„ga§P—tÒ/½±—ÝdãVíR\[-ª¤wØ,ÑíPgXR#¡fðbýbg\¹¥_qÂùsD޵‰÷<’?BT#ȧ÷5’ÿ°Ž;8ºöKx¬Ö5«˜eGɯ.É(o{0XªºËpì4.åçïœT§Ã™·ô–²Bù5LDÖE±~üËm’ïÆüõº3«è⯽’‰¦}]KÊ³ŽƒºŽîÞtt@˜A£‰Ë 5€ šëíü™ó¯sÓy=©?eÍ.mæµ¹ ÿE˜×*/&MzEðìů&ÌáKñбî÷L_ƒÑ,ǧXÖÐøèIW ðm5')1ÇÚ×øÙšYâ–WJ…¿M0Ҍ³‰ÌFø¾Öý‹Žh.ôèÈ?©êc=â ýá¬8íw}ñÅËÌy:Ù¶gg3k1|<:Z6SÎ3¶a_è®'[2¬ÒÜ/oê> ¡6þ4K ˜ªÄ¹›ÓjFòYm±ÞÚ× ®Rk,}?TæBWŽ[Ì2Ùexž ëiï-&ÎtU}C«Æø9k®q;Nô+À Y›¥l¾&èÔ*³;¿ t–Í×i)Ȩºç*Û eºSì!,˜¸Ø"‰Vtj)Ó|6Â__(®Ð4‘£°wÖô…Óüü<«˜ÁËdŽ45«ÄR nSá oj_vƒ<7:ýpÿq …zRæHö nfúºNê”­–v­÷Q‘ÔR70é 0k÷ý«ÁO<¦²fI#ê+”P‚_’Ý((Éuùƒ,|8TnÀW—ÓŒœléâ:w@Þì$ƒ¥NkZmð™Â[î‰P·:A¼°Ùõ˜VÒ7ˆP30Ã/„hÓ8Pðƒ¥@‹/x °j&¬~ιIð]ÍXò¬ŠÉÃkºˆm“²žùó±v{û0œj¶%ãà-K•TQOŸ?£VKÚ‘Á}¿m­¼šþgâ>'—±Bnš¼Y/'ˆš 9– ßëßP%{gxY¹:ˆ·›?jCs]ÆÀ‡cjdaM…OÈ0}E¾“}Ly¶™°EÐ æ?F¨ý äÿœ0€"cWÑ5.HèÑ’“@»¿Ú8Õ-{¦¶›E£³™ìF£Ìò"…CŠÞü¿Ü2?÷Ø6Ef˜(1uL8>C3µ7I§Ëí¹þ`óÃ]dΊˆÜ±=®%áŒpO0Bn¼"YenÊ\ ÞÔãß …Þ‘–žc¯\ …Eî© …"Î?ó¹y õ!ϰ´W2ž§× 9×v”ܸM<{»Ô\Óa )#+U ò™2œš›½:¬}¹ˆ© ñ«¾mÿÃs¨A€Æmåaôý¸0|ÎãT®ÉŠcp”ÿÊ­–Z7Û(ü:b_¯SßýC­Êñ]žÔ³ pÓ'„ý˘þmˆõ¿CŽ÷;ú÷YÍg D P¨öhÆÙ›VÇÕ ¦fG@®x"…@àÞa| ?¼8wj¸#GCÕ‘ J’@4˜ˆ‰ôÈE¤ÖK0¦8ŸôO©d¹ò”ée‡„Ù?Nm?ÄõÄ–Özÿ×`Eô8›œ£7–E‹Ïb²º*¯¶ê:ëRÒ&²c‰LLr^M¼…××ñ( i¬2‹3ÌG„?™´AÖ²Ò\¾ÖÍ[|ö§{<ÆLÔ¥·k1Ùxfuk1d‚(6›Å5ƒ‰žå“Î9Ï’F·êi3fã Ž|ºå?A4,ÿ–Lëâõ‚TÑG±‘Qǹ¦•ô¾§ºCÈ×C[ìÒ=ä™”ÉÈ é‹ ¶DÈ›"Ñ_,Î&HãìßQ”m®ðÎj`-ã®´wBâÚÖ#, ޶ENfL2Å;‡N ¾ «DÁW4ù[Ùzï¯~}B‘¨QKœ;êD™.p-ÑQ.~\Â[AË\Õ`¤œé˜›½†DI¡k>új7»Q?pÿ€Eèó³`"€Ž0WBë!»óͽ£ÙÄu¼¬Æ®Žr¼q«v‚ú›°4ÿ`ûg{Ù6R­[e¨ÉtÙ§Š¼`§yëZÀ¿à"žúÉïJ‰fH믿‚¨|ç¿È¢e‰Ó*t› H Ò7&ár(R­ŸNÔuL "_Ò’¯µ€*ƒjGl™”OZáÏYÑ«äø]Jl#­D¿7œ)Ã+ý&cžQ-L'¹t¿›îÝ2T5XڈǵᔎëdîyÓ\ë¦J­¢áŠº3 ^J5'ó5”=Ú˜X¡vüê"Y„Ýv²Õ‘vù[ĺŽÓGçOõ‹ÓÒ%–™8ÌìqƒwÓýý}'zu@™4Šò\,Béù+üðží¬Ö÷ ”%¯â¥ÃZM7š"þ lÌnòVˆÄ¹3£aSuV›Is ‹ª.9{EȵØ#zÚåbèßqÑ(ûØÆ÷Â{MýnOµN51ñFÌlKU»Cq1ç>¡<aÖ4o˜:·«ÂHsZÿ¢¿Üá»E–"ײT¬0‡ÈKˆ1¸!àI}Ö¼ÎcýxÍæ ì\œ"¿›¼ °ê 8DB‡ç˜0fC>œ÷\þZðH6ÃÆ©Áe”¦9'@ø¯O ÁÝÏ“!c:¥çcáò8XÑ@H1/KÉ&p*œ/þ– ñehìÙ¨1reqõ(Pçóàvu`äôi–“kØc>°Xšè©¨‹ üçæwæô|·:G,Ͱ¡¦ßÕƒ¿ê‹\#[€¶›^QŽ6®ÝôЀïBKûkî°µF¡ž…&Sí{DðžOg<>ÝæM$™B†¢Á|^*kO—'¦Äh3 SE†ß¿TË1ªx{â[H!´ä»›RžÕ_kµo:;^$⯬b…Ûæðߌ¤Æþؘ'ÑÄúéì)>|¹(ø>z™ÄË>H[ÚÈ<ÄÆ_¡áàM?DclÙk¬ä»í­`AÛJæ¦[=pÖH²@hßVÅ‚F}!g‰7èvŠæIÇsÇ=ù—² 1žJŒ3Ÿ}`VtÏV0‘5°º^–ðçiƒ´l SŒ8¸K›)é;Ð\ Sµ*Ú‘¶­¦" ÿëú>¾[I;îlrb ªVL(+§PO«)pyR×¹¿Oÿ°SÝ<æÖ)¬˜ ä_'À¦x†-}OSÞõ:)‘ ;`² ŠÎÑyݤ0lÁ•›4PBúª÷«Ú°°¶f—:õ$dz0þSþÄLHÞ½Î;jïjnEÐH )l`þ4€%N訂ù 8Ð )ù™ŽÖÊEz»kÖc'd xbUePÉ/Py7>¾¦ãNyánW˜¦“ÄÌH‡Uïʽʽ?¯J@J~À8AwÅPtNòo0B=ÙƒI¾·Õ>CûÇi-X7z2èI^çC!Xf¬Ž †Œíá ƒ(¡B©=Í'`…ysDtb€xErƒ$–kÛ óÙwܸd÷U†ÀÓ‘Ž`õt¶y2*Õå6âT‚{ß Lþ2’¿§£_ŽïY™î'Šg\5ÄËÕ/çà@ìòïAËóÂ7Á*ˆÉZ@^U‘+hŽaù *WP/äÃÞÇŒ ϵÏÝ ¹U^ ¹¬Ÿ"wöt`a4¾*Óî¤ÏD7öÍÍA€%·p©†áݽަØTì®U•B5íÝ€¬~¸ÜH]¬^öÛþ¼…sG}ÁÍðÄÎëKfPF¬wÕMÐ{ÜP—þ¹'Ä\=K\óào0¦Ù¶=•³8Mæ‡Û%µ(IŽ á{’òùÌ=„›˜è„ú„AˆÊYÕë5JóÊÏåpŸTW&¾HŠ`ß>QZëÀD@¹“ -Hªå¹ª5o²“{[ƒæÉ# ÷/’c_™`¿ ü´•è]”}Œt‡P[ódÅ£½„±,4ŸOñ ªÿ©zå «DUŽÌ0 |—÷(„oÉŸ97¡â깚RÂ'%[Vç Ÿ°A¿œLè$a2¨šåÜíià‰Å>ʯ€â„µ“}#sËê§=S8AÌFõ@˜-úÂmË&2ÈÞ=ÝvHfƯ´¬¿©#ÀÒÍŠ+x~‘ÈûqÉB3Ɖ8iâ»×,."¢$%Å*/å‡#¤ e‘DB û¦¹ï|ñG~So;Ú ˾ØðÅ! $4[V§™$; ‘­3‘?…è£ë,5ȉãEsþEèA$•ÆÜ-CˆњB©™l‹'ë:×ôPZÉq=P.¾1y-rn´î¥€û÷AöùàÖ·‘û BÈ&o \ˆ·`¯nÐ:îù8ҋ͉:¥c6È?ú‘¹–¾ÚõÄ9®HÊãŒY}ºÎ÷@ј¤lÒ×véâÚdöãJ½ì#‹Ý ³´ß! K–ñ¤põ½Úö¾&Ó'Æ3€>´´Zƒ4sÕü}2«äÛÝ[«• ‰áÔ­_MÒ¼ú”¸ÿñ93ëo~ ¹ñ/í…,n3ŠÒ®•’úÉ}¬=ÖÈŸñ¾S-\…X ‹ôÁzïØ /Õûö. H ¬“®`õw¾…uË›>¼`Ö¹žÁlTÈaJ£º:T,ä8w4$ô(®Ѽ/‡ËB×[í’aZÎÑð5fkWЗL¬d¹äÏ“qÿú2Pw~6Æ J$ýO™ÛýÕV„\ ö–ªÑ€ìwvãÑü ž“â²+íTø ò 9W§Õ +‡„Ÿ,<‘ÜùyäS®‡õW’r±FÇÍXD§¥}¡%Ȇæs×ڿӇɒ §Å‰RΪÜú&­>‚Ï|ý1fÅ@´ïd,½a—KÙŒò„ê³¥g"øªî¡N’€8’À2ÍÎÔŠ=×ÅÐCö](7$ç¿î›Ö´Â½.*<j é>‘paÏ™‘Êð€VÝ.QMájÞ™3/!‘Ç©zb –*H9?\ð1AL:NŸe‘rS’ÿI-0¦J°kÛll^éÔŠ Oí ªå•ŒˆU5ƒŒ+ÑÙÅÉy$É¿¿ÿÈÿÂôاh±¦DDj2{2SÉ‘–† ²AÄ÷Ÿ@ćŒ/}¢¼º–m£ˆdäÁhÔÝÊ™UŸp}K©Pí9sh¬cñó™?öÄ{Wö“ÂÒr‘í>˜fá"o·Ab×ÁoF—3z£Ž WëI±¸ç£Lvoä©5\i®DU$…JÓk_$©¬•!ܤQÇ ÀE, Hµ÷YÂE@&!Ûê¾ehþ-G›Ã¸·€:µËl¼ •G|ª)¿ð¾Q¸dLŒ[0…õ^uÿ3{Õ[NRIK©¸°uÆá¢d±kÑ0ŒTÉ CL Ž„ «w8‰~HBÔ\Š©ÇQN7ûR­ÝJ=™œ‡áç‘OQx‘¯Û^%[%‚+Ò ÄºŒ6ÎÌ€Þ»¬•ùï½U“?÷&’Îé}íD¸ó#ŽNTCÎLú½IôùÉ~ç‹’Ö<¸a©«sr•Ī+çŸçC}îy`š°Ïß×`p`l Løú8\Ü$>òJçÿ´øI;,ø#/یݤ²FâøúN¦Þ¨ ]ЀÎ9âés‰”q¤@å'ÿsƒ­c¾mŸÍ,÷üµ½ò~”w¬ 1 ç"ß#üç6ì{] ±Dœ¹ÿÙ©ZšÊ· ýR­1E»3*iöV†9tûÊ[ÃÅf©kwtpó”&%95k‰Ø"Þzp— s~ÚÊÂzñ7‰EÆVD{}a}SØ–=ivCRzçLÔ5Ž)…Òna%³Kö´•‘jÚ´ãc×®cà¡â~Ìlp uÉ>”£ž—&_¤sììݹ†\„ɘxªïþfY=²ÂëYÌd¨ìf‰ M1(›J• w¿á‹\ ýÐ,m-‰Û@dûdƒÑ™]„°È±ìˆç­¹=À¢ÿÒŸ‘Ýø4óZá)/’Ì•8µé<„›vG$¯è…ê÷(úZì‚„Øy±T±s)ñ—9õbXÉ‘‰*Ãà4 ¾ ‰ëîC×(X÷À©}jPjP’GÔ<–‹KÐÎéЬ„èèCÝ©Ûeò”==6J` Ù2ê[‚»Ù*0¼Mtjù%áa#:,•žS±ËÒ(%hZAg/YœÃÏø#;M–åÓ;ôÉ Ñ«jÎ`û•ìV<úËišlE¯Àb¤]os`àm-Õ¨ÜÄŽ-ã¦ãy§{Ö/ÞúZ¶IÌ?ØPü+T¨rTZ:ùüDub©I(û&-§ÕPÌïèE¨öU*5,´ÙAHíר‚ï@”0­Õæeg—–h&|V7 “ãöô!‘!P‘àku¢t‡FO_Ô±a pYfØÚ# Ť”ã÷­Y°#z à$R‡í‚ñ‹PWÇ{ù!t n{“¬ý±<›õ'c©¸î´‘@ÕÔôEaz˜Úm Î|Ò¹öÄÑaù¶“B®¾lr`™þ6` %„¦ãLIN:å`˜”qH÷0öF÷®M¿ç›U© ùÒô‡$QÇeŸË›ÊÄòlʰpTÿ¥ð~ㆱUœŒˆ|/T ᮃÕÌ>)+ÁKk¤ w¤#^Dø]¾êg3tÂr[>ÛëCd›d³˜ôhÁæO ·uª®sÒ‚{#П¬ám?@QVMžz÷P Ó«é¢ùÏoª5õhc”‚ l­2š­<Ö­âážÝÜÊd-»ÕR­~Ãê™Õ¢ð{9'ö´ Co¦pIa-h˜íOŸ¢­ö{0Xãù9k¸à?^¹[U´œ÷öÎÚÐÑÖ¤[ÙÒÁ}Q\Ξ}àÕP¥ÐYÍñõO‡ß7Q]7 õºÚ¤-£0îCÃ…“ÅÃk*ãǽÒVtÓ6“È›Öh•g RÝúæpÿréj=šÐ:RÁz8»ù‰„×1×sÇ[`¦úLÜUÖ Œ³òOï‚Wµq†S`טŽ,4G•ΉIÕwÿÁf!³p×UQòµ3 ¤èÒañ4 ©Hè5´±ÄE¼ lÞø$NØü»ó˜òGôÖxM.R7›P”Å7tè®v”¢þAÜÆÌ;³%+Ú%ˆ¥<€dMÛNšz ‡˜‹@ÚNw†­µöËë–ÃáWä `ñø‹üÛ8ÿ£¡¤¶%Ð'\PÍšŠ¡¤CŠ|”‘?ÅŽóXÉÉ®SåohôÒÅŒ/ŽÁª¤qÕ{Ò…Ÿ_>|ã³íß@㛮ēî¿:¹Šî²Õ§â~YøÄ£¾¨\ÿyò¡ Vï‹RhA¦úÙnÞIg%ÃNغ3•ªQ,,•èÿwØnlÐ|~ <8-C±R"àÿŠ_‚÷©…æÿ €jÇ ©¡æ×µï6Ð"Dvôçy;¤2:½åyîÏT<’xµà‹KU® æ»ÕŒƒa2ÃnVìb]ë†[c›˜=¼ˆO³xöõÅ(Ci$áòþqLácÁ7 ©€$U¹£zëù}[N¹h®Z´mAœ Û~cŠÀÅÃþÃjÖ0õ%E'Ü”1ÒA×4áéÓ5 [7ùÂ%­ynpæÈõsb¤,êp h¸B°H3p6½æP9 ñÊæÎâRl,%'¿Èð¨f[&lZ¯ºxY!unŠ]ê¹hÚl~=[¦U:h²õãCÄq!NH8>¼ò&›ì Ý×îÍÆÞÃïs Ÿ^ JÀ'[R³ÙaVë^à_ö üà%Ð]æ}öéßëˆÅ‘ ü´ÖõEo ^8€¤¦åÉm³…OÄèo¢é¢I;¥_rxé`ÄxfH³0ÔÎ~sæ;¥å|‚ãdÈémøkùä:EJsÄ ¼Öha(F›K3Ã%ÇãQxÞêî‘ùʬˆôÆ&5^·Jd+ ÒÎò\¿sÒD+ép'úeã”ì“,±þaš¤IĦ\ÔFí·ª#Ü2Ы ƒÉgCaåžÓÝ_ƒ¿û€èó´=ó=îW¿$û»qV ù˜ÚmëÀœ·â|;ö°ñ5Ný䎋¥Iœ¬•_À•#>64²Ä§j𪽨ҙ *¬Àœ|¡PÝg)¬p™†ŠKµ-æ(Þck®]´Ÿî 7w åuÈÝ_Ü·˜*¦ÁCLËJ»"u0¼F#ïKüæ­*OŸ«,$|…“ ™êLû:y2£w q®†ñŒA” fÍÙ@67Z¡ K;É¡‡ÉE³Ò­[>]Äså©f‘ëT–†ð*ž.Óôj+ø?¼ô†lqÛ~9›2óÈàˆV»‘]ž¢BœnHÆ) :5ÔŸÓ‘©{þ-Ç­~‰Ò¹ןƒÿ{-h§¸NoÙÓj¾BîJÔVz`;V/BœFÓRµ\´p‹‘Ø–jßb³Ï¤ÉãÂc ¸éÿ ®i$0}ÓKf~*Ic)#ãærtü %ë%ñ&65W`xÂöƒss©-<ë9U]FTàe"Þj`)íûr¼ßÎ^róý¼ñmÏú˜8L/;mM¹ÂWŒ%eЉ4R,+’¹ó½úø²~:w,[Ö5cþ=`½^¬Žd·Âí"¡•Ñž{!qèÝòy4ik¬UÁbrR†u-ý2TeÔWLÔÀÁéeÅïî‹1œmÎÚø?ä›2r6´åKUé!–2ݨÂ6‚Ä;¥åªéÕô,Ii½|˜çãy~αõ}’žb ÕUvB–O%ÐÜM ör †«,¢ ­&É…e-k•ëc[Ь)Í äh‘ʿȠ¹nâ÷ª1gN¥˜?ln±5º_79Ë"«©8齋J`SÁ ònr§H·wìõJ‡q ÊÚH©µ¾ ÈËפUàÄ  FhP¡Á6 …¾§<¬õOW\foCô†’ÚÖ8Ni<æúÓø¦þcób–ËWˆÊÞ¸ ò³4¶VÓÃX`Aûu‹/AŠªV h'ÓjøÅìOöøÜ…`‹½Q%Õ|i¹ßˆ–õ {„Ʊéªg“!wÖÔþQÔÑTÄ´'{e¡mÁ+*ºbÌNœ2xÀ¢0 T=h1ZUyÅQ*Ir,»F“®ŽuÐ÷sZ0zdÀ o¸™‹z({zx»ö›Lq߉ÎêøÙúlT]7fkF3©æØ^ÅŠ#šÚ/ËkF~–ð»{;ƒ_û4 PJúöj_«òpÿÿ?Ô²Vãµ–@+¬Šì™íŽKòþ(W¼Êƒm|/ÈÀHiåGú¸FÌü±m¢Ô1öÿTLëK@Ùs?©‚˜³&½) TÇäB¼çV_—šŒÍÔz=˾¬ì€GîÄîâï7‘J ™v±]†cæU“×ÞN@Ü›IÎHö¸(Â'Æ»0ºß—­½F€þ!·wiòuçø8‹&ŠÈÙÎ×*†Ná>‹7•lÞÞ_úûŒÒ ²F*Fß|ÈJ£×_.çýG!N€€¨I z´RQUÐ({+pêÕì"¨­?íGñœVbTkÀ-qyu4òŸ›–‡†LO¬Ë*ñ ©Ro¡ÕÙæZS¦Ø¿[w“¼àhQÝFz`Ñ[&†ì8T±›,½w;â(5Ú©C¤’®t+dÿ.N™1Asdjr·XY—û9`cFÙ@[”»ð%¿{ÊrEï³ n–›Þ{‘8ŽåVó:­-ý;UJeý/ïrÓ´2ÈÑÅ?Èq zÏm/¯¿Z1¥Œ4½v<~޹ ùâÑÁÑY’Ùt'ghFn`kÅ9qåôÄ«ôì¸Ç¨ƒ:í|+ï褦ÆMØEi ÌEÖÙ(QlŠ’ŠÔÖ“Ù…Ú!ŠXªÇ?[}á3T«ÛRõ—AË Úv€sø¦ƒ<žîSŠœºt¦Ÿˆ s†ö€T£)65>WµýøxWä-7©;ŠyÑ]§§R²#nÈ– ṽ„üÿ[LD˜¢ßpÿ¥3OXBÛâ­ßÀ 93¹ÒhÍ,Xµ‚……cähÈPXö¿QƒM«Ã œô«Ç ƒ’ž^ÛÖ×Ó—¥YÚ'D%P¨èô¸IªéU~ø/nåT$kz!”‚@‚yBJx 8YŽJƃÌysÌùµº]¯åŸ¿1ícÌ’%šU™—…Ž¹Ì†$ͱdïÁcAXît vñÊŒ‚jhMzz—/.ßh¥«Èö ¸—6r1õÜŒ«ô£Çé#ÖêõUKs0y‡Eéx¤uÜ{gŸJÿëÈl=8ÕzyÂF#§*|d0?À‘Ž4Р-ÿLêHµxZ=ëD­Ó壺 ‹\?gšXþ^f X35”Mü²)|Šª†˜ {’üÿy°ý·H[ÏÒxš"=nä.S½Z­œ2â°#Ìþ²«Y=Õž¯öÝ©KL¡\~Úfº :ŒŸŽ’er( ÊþB\ÑÝ÷x¦':A‰ >³ál½Nrœž¡®aëMÁ5žíóŸïän fM:P°ºš×Ú¢ÛîIôk€Éi|NëAS/üÊq«SçõŽÅê¢Êã†ÄÇñGXU÷â&ÃçyÁjážÀʲ{\vA+ÆÓ5W šš¦"ü¼WµÃI¶¦#}±ó¿aÕÎ*¤œéÓ„Ë EmP¸Ð#3σ"ŽÇáj´‚]µ¾³ÜAøLÈ($£ê;RÐ{àkÁµ^ `’ù­{ñϦPÁ¿W³HL6‡µ·‰o'ÿºôø6‰ònh’[ Ü“ë“Þà ö¤—3ã[ˆÒÆäRÛFI£«Þ.ã/I¹.¤®Í£ $A¡\M9)Þçñ{Mz‰góy¶¾ÂÇhêXW;òDZû|ë9ÃF¡šüA8˜a›Ÿ…‰¦*£P\󦨫Au—Í÷ðAÌ<%™K´ßk(lÕ;>ýÿŒ\] ªxŠWÄñ_ÒevͳÄI‰Q~w.êä:*¼âáÕ a ïÞMhº”¯==Á©JV@æl+û$xV6¼äÙgM5Òš.åœ >¨u­^Ïg‹™ß3Ï×Ó¿Ž-a\ ÆVg/™·ãÈ2a¾·­„qKµÇÂߎ3L[Áÿ ýlÐÙc)y”Lpülæ-®”âðå˜tL›£Ä2kõÀ„¤ø/VMé–'ñ?Ž)4èdŸ:XáÛ¸½ëUŽí“Zèß/_‰i‚*0$Whê"{|ížØhY‹jg½+Ë”œjZ¨ý¯M<ãAn‚~—Äý9x”ŽT‰:Ó~§$ʹ™ òd#^Ä+’ÒjÃy¥h”àgk(>èËË:»‡æ4Þ*ÓÞ¿z²¶"à]eEWà' 6ûÆ^ë½´O1Å¿B$[[Çßÿ‹f#ÙÆþ–é üë­ˆn/š.µBŸ4hÒ&ÌÔøE3r*¡˜µx¶Jì!AØ ’nÑB’*nŸÜÅFÞ­_ùT ]z/ÂPn ä÷À¦€q(]ŸYŠË& ;%$ïêyÇpIúy>UÆÓ÷¤öšø.¡âR…½)€·í0 ]H@öiùª·ãÿzì*+rEÐŒ›1~’ëŽñ*”„:ÈØÖëj²t)®‚Žváç2åȾ¯aç¡< Z®[Z#þ¿°£ŠWoâJÔˆH·à•2O ûylœÜgJÞIm‚jæ}‡È«x˜ˆ‘¥óìxÑœ•f;î†k\nºx:#ÂL¨ÛÒûê¢Nþf Kú‚ժѭcÊ5ÊÕ”3¸IJšCkƶJ äÆIÓt-[eÿ,K F0©º;áVdƒª o¯a꾈žõ;-4R–ÊDÒ¨­o@5òù ¸g@Iëy4‘ú>ò”ÓØ)‘®€HH`rì»7#àœÜðñÄ7 Wòʱ•^ÒDf´Ô´é!¶µ]çšà©6<ÅLY§Žhz&Ëñ…Ðk ÷¿ö½«’öÌð¥>óÊ©`=|Ú¦ÆÓÕÄeHÆkVVûÀ¿–bA÷Uç0{ݶgnÕ2ˆ9i Ac–bíbNVSOZDä–!QS 7= •¨pª&7àÃëÔ#l¨Sp:ïÎ`¸œU½¾«UÆ~ÏÒ$‹ØÅ¸b0-å‚ôR(úe²ÚqB;¥yɨJOà$Ì'9±ÚˆÙ4âÞžú Žÿ4ér"’UöE ~µµèºÒ‡r…,'öJö- î†0:¦ö«J:3–Î4þLj÷Žˆ|rö†Y¿rtèéœÔifd£ýÞzEÞ§õÊÚ9eâ1ÍÓ¿Kè&>»õ¯ë¸Q÷vÄ|ÉG¹çåšx$±^Úr8hPH´nâ3¯û’gU’•ïBN&0 ¯ƒäòÚ'S;t(n'ˆ äT“žQBÎQ´ã£Õ"ÒsóføW§9É%h¹° ÈÅÿä«¿Íeðî39üV`v±ßóHˆ§ºÎ4;.|?‹hlªÝ‰XeÛ[½ºL5aVE5 õh¼#®Ì¾ºUr®rïë ¥æeÔõ@zØî7Xd 6ØŽKu¹9âQË‚¨Í¼T (zçãäšþ–Ïÿ¶³Ô/"̬c›pµ S6É}ÇÔ¢SùË'¤–ˆ±["ïc9tCu7Æö¢‘?ç.m»*˜æ ï4šF3˜zÝên !ãù»QÌorG¢¥t}ˆú*^ÆÉnÀEÕE-Ôm©O&N(i²l­¥ §†±gA° xzD­#/S[Ü#·®ËÝ&Á-.àÿeQ>¥ù …«g™¼A¼¾Š1>ãËôÒJ jNtË:§q¹Æ>ú”k3TµZ¿6ÝRH®€Y³ŒQÆðÎßQpp4=ÏXqZcÞ´hJݳ+K¹B÷ž’®ÿœxþ9¦mÐÚ]Åaë8VÝË'÷iƒ%dá‘›?-=”ðÀëW‚å³ða‰@Žs(,‹gIw!‡@•ÄâÇHŽ“’ò^ëçjÅJ…+œ/xó½Ý6Ž7žŠ2 y{Œ®y-[umß71—“¾ŒÓ¹+¹¹6Å1[[fH{F¹§¢pkÕªu²”© eg[&†dîLéî›õ±Øy؇òÂtdXŸ ÌèŸ)6ËrÔœbõ†(Á‡' {ç§ ç0tâCÿžÌÝŠ˜CK-WÍh"@˜Ðá„;ÁÞ’k2õÖ|¤^&Šð af9Ö(CÏ™™.m÷¶bZõå1à~´Ô–V"kYkþvQ®cS†ò§úŒ¹vwøURýv·3¯‚é騖㌉Q«ÿ×ð¥Ø#{²•1™/°ò]eæ|Ƨ¥ÕÉ"!ò£³àõ’àýzñ^ÍŸ]9n'G®þJSa¥[øÅ\âMÔÓËÔâE1˜¿»^"„JF±¢'õ åEã–þΖÅ'l¯œÉqýdR;Ï¡HT|Ÿeuâ •Rõ÷žÕ~m–€1îYc|æ°tr¯VÍ`Q,T)Ð;Þâ$27=5<·_~)Eí(êQQ²x ö[&0£:M»~é,Þ ²ô?)ÖôârÍÊ Ö<kuJWj X!oQÑÿFî+îïsÑ”èHZéãìJå"&ÖY5ðñ0˜@Ë?øë5Tñ@VaÊÞ¡±¸Š@UÇ ±<¿xnè6O^ÂÈuƒkZ·MyðãœRÇPøn™$µU3èÁï­òVaÈî½NG³Fžó]þ(°°ßu`hW}à-9AªÇî„Õãì7.ê+…Ãë¸ä–N Yæë\b TŸ„ò-êþǸ¬i!žÙ³øLÂÉö…˜§ï²¤‡ÙtªZ¤š¡+^á"Ï;‹†·DlÈã$U‹ÂØÚ¿?CχVK7šå.D£±@„±`ëàòGËßn …Í÷Uµe #‹.ˆáL˜Ê†DF°€DÓüáµA“]üÈ$Cþ£©0RàÑ5y»ñyç d#òd&f¸ÔßSÙ‡kênÁ½ÞXd5}nâ*œÚïE´QœÕµ§ÿ/v2VO¤;#ícrOˆ›±wÀ.HZt}žH’ê?L 7û¢É_Ìå3±iwäÛ1¿@à:U¤`8mVG}z€ ³M–°¥èV³äÔ82< œBªªtH.Œ·Š~hKh¼®WóýÐÀ¶=f9€'h_ÆÇ†Z°;‹A Ó57ª¸áÍÁç})¬ÔM:Ž!Xå âVNÊõG“—txæâ‰‚)2ó}&8wí†ß–þ­j¿A»tÈ€ÊæJK![çöljòýTIØÇ›«Ñ}vôŽ6ev¹•®åI T•„ ¶óì!AÀû<ÞÃ"ý›af@³ÑÎê5~í™C±î\zCY2Ÿ%÷%þx+SRίexw‰»2»ÓÇâ䮘y¬6Ž;w×ÝâNÑe(fJtÌÜ€®bi)“÷¢ëD^Sƒ “K»x¢Ò· j€ÖA䤅Ÿ<„EN0‡4èÞµÖÁOaäJ<$SÅ•ÇÏBÜA,º‘V h|¢É<éý¸ûR0 ‘ôº?Ã3'ñ»ìG8|^bÁBÚØ²CŠ pIë‘ó(GN¤c§í ¥¢ù,4ÕS«…¨S>Ù¥av¡4¢gú‘fÝÒÕ„ ø2GÏ£°Ÿ†ˆßã^þ¤Îȃâ4k§ãÝœ$a»HPèUæôQýŽU‰ÆªÃÂ:ã¡+p0u³Š¦3`ÉíÁàø²î…ŠùÒ”¬'¶àD"¬œ~ xIȪï(gmöÕä–ª˜_ôÉ®“îýùðtÖƒÙÂÿd¿™T±\ •ö8ƒ{>QbYðæsà—!HS!µ„ŒßAPÑŠô÷ËÙYr)]p7”¾îe¦©±­µ‰¥rÒ'ÑF.¥gÒø~ô­}×Aü‹CçbX‹Ô?@–­MùJ¤—Dp NŸ…Ó=‘¼ )_k• *jˆ9ZFÊöƒ!ÿ6x_†A!ãZŒÕ:nIÜ¡Â4ØJ!üd.X“&BÖ!¼|Þ("ÓîÖÍô•˜&£8M©âÞ„‰#lSaü&Odœ†¦ ·/ÞÄIá;ÖuÞ~ëuY·ž‡TvÓyÆù[.K_0¾s<üߟ§Mû€Cy#ë펃D¬eÎΙ¹Âàl‰LÔu\£F7n$æ:á!…;ÔZ‘Ûk/q±Âã‘jà ¡ã«¾xVî—×äž‚«ŠÑ÷L 6u´—©üÉ01ÿµ˜s÷— ДÝÔšnÓô¨ö]}ð‹oþê6Pi2—€ªÍJ›!G—Q «®™?› ´C¤7…Oê€'G £_OÓÔ·ô~UbI~!•ŽW>G˜Ñ:!T N9J–¤kÛ¼\jõzô%ôÊL:¦\"ô±””SC@Ó—jGíü!^Êu¼çûÙ›w^d3`;Ñ&ÛRá}|ÃZ¬ò—lzEm¬w³ÿlóç0r²HœÅM­ISí^×ç¤Ù4Þ^ oŸs0´Éòù™U”Á ߨ²©ü§&µç\H¯_Àœ-– ÅokÓýHgÅdæÞ“íR51ø…¼æÆáœÖâ±N6Q ‡J–´"+ÿ…üÙîwÀhZ(kF‹ýtUËŨS*³0º¢·hp+ôofm  Pzs¶úiɶdŽ3‘a£Ikxs¹áŠ#¢kÊ5ú2£r<Çá²£èVbŸ7”ÚÔ2Ö“_“ŸVI£nÞ±´iå 8QNå”2ŠÉ÷µü¸<É[?9ÓIÚ­¯ÁynBÓþŒÞK~:¢€¼Øä}¹V9hÀ$Ùfé&ÅÁvíÎGœ¥^äšðR@yE Ûàó<ó–¡ |R ¾('#¨ͧ©{æé.vášN}énûMÈ¥j.³£I]öˆMDªïÚ´‰p€£þsäԷͽZºÂÑsÿÔãKÍÐOmdîõ$ÉúÒ„^d™ö¦]¡«ü ŠîpBlñlZøf!‰³n}œROYªu¾wFc¶›& ÊY ç_Â$ÿÅBøÖYÔªDÔy6Æ:@ö¬š³hþMxJè‰TO=IJôášo_—}º‹ž# S{­Â}p›Ù«TÔËëcdXÌRî.5Ljobˆ§‹>D®p*OÄenò¼¢R&­k¶*±ÔãMBCôGyA!eºPãí··Ô ÚjtÌ/—+'ÅÏîÄóWÑj—"·e¶;Z Ö}WÝ€K›‹]ÕÂD­P.7aëòŒXõ?!ÄLQ1‘Õj—ÃáÂë[Ytñ-RnG…Üa~d»°‰‰´ðqôZOÐ+q;m×éáÇ`n7^hùÒ]jˆv ¬`×Jª:†R#ߺTry!§}õz®£Š$n¹¹à_âEâ:Ä[çŸ5|x·J¯A¢¸Î±Ëè®ôl^W|ìÎD¿CÁ|“0Ø4+J:ùêäìeå`þ•mŽa²â/ïde»N“ÚVО;™©ÖZ $_aU¬8ªcjØî©šVõǪ{ÀÒ4ëùD |Œ»ñ~ ¥¿“A„™¾é ð’ÃIGæ)‹!KC®ú›gÕœ¼¼°`©wñý·ÅÚJÃ\‰ÄpœçîrxÃÞ@ ¬ˆ(í=Äà˜FPK–˜àbÀühyYŠr«_ #´;n˜»f(šbOž÷˜$º:É*„º‰ê[ßyøsÒŒ Öµ0»c:@â…>Õ¨ÓCÆþàùgl%ËÌkŸŠÓü*X¦7}³^‹r4·Ö³mœ ˆ“B¦ˆ—/)%ˆ–¯/Þÿ³4"_6v84¥ ºc/Ú8¬OÜè–,A¨vQz $'r#³§9’a9{Ó¼ø—öáÂõl‡ÚP 2¡ù똋ÇÛØÔuØw¡“I".}¬ÝKµH÷ýÆ—TTSFfÊ[ ;Áô`öš»ŸÛí ž%ýK.Nä8·ã|l£¨v±mûä®5VReýëþ[„x8æ lšYR¨Ëa4çÄŒ8›¡:—´|àͤª«‹kbêgS‰#F÷oµZTå~á?Ó»–…7¢ûj÷‰Í‚ý““õ#î_ªËÎýá„èÐÍ-M`{“·(ÜwˆXØS2zµÅ<ïo¯ß:¦*Ñw¥?¼ ÿÐÍEé+ §¬>cGEõXê×g+]Šz“/Ò;¤íèµ$ë&Ø£‘¿“HLù}”E À¿&j"جdàâÞX‹oN¶# Óûµ;åäU“×ÀưÃà>ýRS:àོ&ùb¬|áeoôòÞþun¢ÊS©½ênÉ0TpÑÇløÃ]âÉ™ÒÈÿ;CBK=çõT½/Èj"_gVAâië¤W§|.GÓÉg Hái&XΖ CŠÑ`9·´xñºˆ[Îg˜\§RdÛßÍ~>¬íI#£Xþ« W]RFy³S4Ó@‘'Pד¹0;„5b®¹_ĵ µ=LÆåý5ybu#4¼N} °þ] dcc‰¬÷—SAƒúÖá7Àc‹= %X;,õOuiYŠz䨠®žbÍuþLñ¹ Çj¢«õòâÙaïáþJê°3Ÿ•ø€¦Û€Õ]^6’Ç™ôûÔ§~{Èä> Bº›$Œ÷»1Ú¢¹7¹ËÚ%ˆ¥‚ô´%ÀŒÒªÉE/ÂØu”Ì‚¢`Þ‰ci› ·#þHHB™0ÚôÑù\`øç&Ž0Cñö¸”hÔ0§*øíH‚ʼnšÞÓÁÞ~øi-F˜nµ!‡rª¿ãœˆ‰K£ó…´˜ªXveWi›ºZÆBƒ8‰0|pM¡XUÓ…­‹ï“Ê÷¾Ö‚USÇ¿Ñ6è|TÛº¬‚ð¬\Wnb2ÿá"´— ÿ$'òǰò.œÎ‘²kÉ DÜàRo@ºSmA l´‘öÞ.µÀ‡–À¿Â¤¢—ì”§ˆð‰wBQß R¯°t8Gê ¨7d[bée‘ lôÍŽ«NlZˆEq˜d _‰3ißü‡1‹1¹ËôL(oD‘ýÞ1ó-úÁP’ å>ýiÅ1…„ÎáÍ4ãÞÔÍa:Še/ò¾Ì,i˜ÊâmÞ™¦Øvx@ÆA]RÏ@\p(Bè>¼¿µÛþVÜ%=ixÁÛ¹˜ÿ@wd³Å ßéз6©´û1ª(c=Mþ]¶›GJÑèÅÝ0/×ü?jrF}‘®dÈ®·ˆºL³¥—“0sRÏé¿×EÙuk[ªd²wnò±ÍÑž4 ÀV± öèDÁê…úˆ¨ ‘ásÑJ»ß'QŒh¨Øm––…Ö¡Fï—µªòëáEÓTwH ÌuctCøÐyŒ ×T@Üëµèý߯©§‘ õÐ(‘ô»–‰HIÈkî‰%G†Uöÿc\´TX^¯!M*û ²}fÌ­\~·)B–zy»[_c{gÍÓnOb/èöë«j.qÑâ·ö:°“d‰`B¾—¾˜ÏC #ÿyÆë±à CÙH¼ó´ŸòÚjƲJ¦ënÄ(ˆ?ÌåûÑûV(ë§ŸIrh4óŠ2ïÖ2BÒ°£ìÁ¿—Ìžd)¾ ¡Om¹“qZeX"Dá¡&pz —¶Æ^z™¼“"¸¬ +Â%”æmÓ­5ÈßåUÁN• F´åm—T΀"l6®e쾇<ýY¨£cr±Á‘#G]å-?ùlÆÏFi…—œl¥*;PË@Oý¦|öRŒÎ{Ïi9þc´·´ tLP:»ù.ã赸@lÙ,­ª¡bB(‡ÿ,i®U•^d£ˆÊ&íÝþF(o•þb%¹Ÿ>Ä £bXƪO7Ÿû áyç_¤El_Ò¦‘sÌ$k¬¦sr#…ïØäù@†Dð99üîÄ«2mqÖ‰‡ÇšÊ”’*6¦ï¹R/îQoÌJZ¢}:í–‹^#3(¥±ˆ$ÿ.R„rt³6#. åŒÆVÚ•áÔVØ!í÷{«Êˆ@ú‡Ih^-²&€ÀUؼ„á9ÎâïbL¨ÓÅ趇¬ç“u¹SÀÍûö¿F×öµÉ·6àÔ—˜Ñö{›¸ÁåbË#ZKCß§×úÇé- áˆbèðÿ9Žœ‚p%‚ÔåÛUÍA÷*kh¼ µkØ5W‡È«êkS¼…ó&žÒ‡ Ó¼eâ&OÊѨ†¦ùôÂíL È_ÕSÚŽ§ýJ?ÀÇ£‚hȨ+ß4‘Úõ²®•NBú°ñV‚#ÝQY¤aáTÝÍ9†hjØT‡‰c-.!~"³þD¨y—ž€FXsýÛ‚idbèåÍ&å FJÏËàZ陓fÓ@•Ìùg;â̪W€žºÂìxb q¡J“½> Oèý~£|tfëSpXZÕÀ#¦eʬd­S?aTÕD±ú9úA/)u[‰†ïBdN|ѱõÕùá½ ¢©‘4æM(PÜ•Ì&C-Dà^–yÐG‡e9qáÎm‹Êz∯Wü{üIÇù‹g_mUzÅ×9 [Í7“ž|8#¶ZìïÅ‹%þ3¤ ñya2ùÃxnÉ¥õ~6 6ÏÇôJG?mß‚¯HÎCq»ëwË•¥b¹]Mø[LD[¦Ì^UÏÓç< ðMr.qKÁCÉzõºQDoÒ†²X‰rké~W€ù¿“`'¼Tó>VŠ·)#aBÍÂi D$(õâõØÕŽüï¸Â'u!~vìÑÛ*DP;e½û± <ØÿE¶7ˆ•ãºÖoæå-ÜTq´j¾˜?Râ­~,~âXWꂜÞAïr£iJcõ [>}²=£» —t¨žãg†– ƒ =Ävf33@Bùõ7! 6îQøfçàô1C›Þ£J5O`CƒIŽÎk¯»Xä³îƒö ×1ÒÓYXúf½iÍÜ]‰dδL»ÌKÕë•NFúå°JÙa>Ù§ò?+$åJšY\˜¦/:¸]®Äï'圀âV ~qü¸¸)C"éìû 3ûטOMø[Ž‚›E{Ù¤ý¿Ô‰¢Æãà­?ä VY¸G^Jç¥Ó¥gܵ!Ñg=?1h¹³!—e:Þ(¡êÄ‚—x9`[ƒÛêQß)„tàå†RA‹/,|ê0(eÈ1ge}°Öf§â÷Y¤%<§òyol`é/x'ôÑùÀÛLe@øÔ1ªoßoPho#G;|P߇^³Nrý m˜ðY$0Ä!Uw´ÅG,uºQõKnÑ5L0É9‹®0ö ÔÚ¬xBn_áÒß0;:´÷Þ‚¼?0ÇZm•ð[§/Êq‰‚ ΃!ÙQ‡N·+—KˆShûŒX”qy÷Ø ¸#ú]ƒ(¤Êæƒa¥(xf. Ü'ƒÎì6ð=0‹g™FÖZþßö3¬~Qû©ªNÒ³·µá¦!—†LÓ<€9Ó.âÛœ¿ænƒ]¦ ¯·Èˆ‘ j<ÃÙJFIkâ¤1à'™o*$r¨?¬J’¶ ŠæÁ³…0qŽèþ kzh¦?{º 7žV•A1Ü ø,ì1,Œ4¢ ¾¾ïÉŸF!û ä'Ã*µ~æêþ,ß¿‹²¼6:;Š»£#¼2£€´¯b‚ª·¬ ÜPA5gÅ|Al õ‡æv—+Bž¸ÃÐzzꄬxÒ\H½U© ;KÑ<½dK%3tÇÛõíá¬z†zhL ×ÔTÓ*€§Õ̸V/9r5—Àr¥ìóä]Ÿ"|}.-ÿ¼´s=HU+gÚ¦–»ªwéÄì分”ø$Ñ[3Od~Îæ_xRI ½iÄ¸ã¯ØEýGÓt}éÏd:k5VV½+‰X½™Ž™?³ŠÙ¸Ó1½ð¼ ÍïP‚öXmŸµZ7I”ÃÂs×Å@~¤U½E^çøfön-ÀÐy UcûbÉ!G`^ZYÜŒ]1LXÀ³<“Q¨DªôqRZá" õ%! Úv)„K,0ÌÍdÕï ¡Kˆ-ÿ¡6õ4§¸³‚qiô€ý@à=Ô´pÌf[·Áðb÷°–Åjât"†;T“Úª&ñÈÍ7âýª5¶G²ésÉÌ™\Û;´k<æàx#âºÔ¿ºãnR|Y›µüFþ€•zÀmB9ÝŸz%{ph¸q/ÒIwß_úúÖœgr䘔ÅÌèÑ›¦ßÚZq2S9 „{]¾™TO9ùˆO²îj±Ô‰åèÑìÞÁïO]]át¬¹RWøõn´~ËY·nêÞ‘ÿ÷©éå`â»+¯ç—©zfà1ûΦ~C4¢s 5°´¤ÄÐŽw²ô7aˆ3'2ŠWSnž!·ºm}Œœ›'¤ß»xv†ÑçHgtWÔ„;4Íq”²w$ŸEÏ¡k0æÖœý6ÛÔB Áå b!§Öç´<ÂéÑ¥¥^Là ÈŠI8¹zXÞÆ¬Òßð¦2dtê8,•ãw=ÀÃO­§ÜÆûJ¾˜/­«zåVùÞHLœ´y€»tÍ{µ•ß ½±Î:E&élœâª\(ÈŽä¶û¶ê#T)*}aês´3µ¤ o êêû‹¡jpÛ…Øv^,tG%ƒ¢‰aíP&óÍTZF™©Ô·ë—š'6‚Õ½eÆÖE£S€J‘Jô2ŠÝÒŒ¹',C{HÑqôƒå®UÓ%¨Ð[$Ô–â•4{? .ù ¡|϶à"Vt„Õ¿EÑÛŽ1zâìqñA* ~{œMá2šNW¤ÜUd× ªdR2bÖgÈÄqT•Aª²¶ÉóŠ>·60Щ»“ ë‰ /&nl1_;K† ôwºS#ÐF´wlu¯™`ªÌ°ôµ´bàhî¡ o¸´L¢¼ªŒ-ªŽðà¯]JDt¨gDŹͨ ñ« ¦yŽñÜ6l ö°ò¯yÞ@LpyÒ¼VHø@0‹ìÙ·J5Áù*žsŽ<2ë¶!ãïW›(ÝÑ + ¶!UÔÚá_Èl[Žéz°iºZx¿[»D]/Å¡÷šiõfãÛ~Ì˰­ÿ…á?‚v†Ô)¥GN/쨨_Î%Nì$¶íjÄS-ãË”7‰©£óR«ÓÜÓ¬C±òýH£«–ìlB>(ŸßFÚ6Îè'šIØ“™­³Çy†‚rœEø_@ÅÚøª4§ tYÅ›K\q(ºV‹4}Ø zlÞa¶—ÐÕH}<56ÍEç'ì/ øÝÜÂé¾Ð訲ÐT?¶ÊÝ…Rö¼ô£òÒñ{{Ù%= ÕãùÙQÍÙ€G)‰ª¯¬4i9Ý©ã§ÆHC1Ô ÖÅø ðFÿ#‡§¸búowO&¿öþ0¾ì»=‹[B#M-ã( i(zÿ<•Š•슺%† MÝcR§¼7PŠ7ö‚ê¬~àHS2êzxP6Ö‘lº_ñ1îÐÚ´,/ÞŸ¹åíw+‘Z½ùÙµ|¡ÝúQg‚4âá_žZ¤s?›³ D% ÙüÙX‰ /‘LÌK”ua¸^i󹛟7ñRÞxwîïCkB™W„ùŠsñ¾ˆOi’Þ£pàO³z°†JDýÝnR°uº¾‡ËrÒÀÓIâÅÉ ¤˜ËàpçÑ;ÐnmPÎÕ_ËÑšt‹º)_Ëm4ç‰q¦|ö°™óª›ÂÚ˜ä\ôJ‡å­|× NãÝ‚Q·epNDzʗ=9tîÉ.ÞñÄé{¤×ÔÇļdž+«”KŽ% ŒÉà{D_^{¥1-8Ûh#§5¬ýÙ¥2qHßÔ0üÈ0ýkxÏUèœÏ¡±¿Äl{M^\Œ2 Ô5ŸÛ=½>TýZ¥*2Žô_8¦KáîßD©—ç3*ôÇÎáiºCÑ Y¶\€‘µá¯cσۗ€Ò|ôÊ_“‘žù÷ïÅÚžÕÛCÚÉ£¬S»•ó0:#óO,ŽÁ¥£8w¬ê2¹¢¶jC þSwñ'×^põÈBƒ÷Rà/úï4ó‡°áq”?×ò> „<5K ·}@Ã8›ºÕ¶G,ËçTTK•ÑuÖ4+”î‰ ‡®TS=Žë/·F¹Èù¢9ªˆ É‘·Ïc•ñ-Aª>¨MIοǃ1J¾ ¶UJ¨nD”ÔŸý‘çWß¶ˆÈ*ªÄ¾:m†ßqr8×±~s?&+è@/…âBTbBÂ\¬ÃH2•“–v÷‚½à4Q¥æÝ³ŠëÄZ UØË6•ÜF¥U†ðºVåû0[nPüqܧ{ãnàyÍËч»)û‡Écz(w¶lÓæ§ð'ð×.LRé jˆP®¶f^ŽÁöVܪ×%¦Ÿ|îØ˜ÃåÀÑ·ÌR/¹¬P0Þ¢×!a-°!ßm½!ÿG´, þæŽÑÂ1ä7ãö–È(e•÷¶˜+¾U7Z['{fi—ædOM=ȶAïµ<¤CáÜYDeSˆö¶ç;Óó•GÌÐQÀ©>*ú¨“¡Uù«Me ÄjW|‚ŸW¾ë“ŽÉÉ,”ƶ" º¿ÛAÙ¬ó® 1;níÚ Opš^ý]Çawç_ž·Y#·VÜ}Ù«¢£åŠe>Ž'”™@ÚÑd#t5g\k–ûeÂDßAé¢úX±ò°™W”9CÁï;‡Á<¤ }p¤€&-*¤ú"ò œˆo–1ltŒΙÎñSt˜Ý}µv=&¦¹xVùU±ÒÑü-ˆ•Ñ#æ7½É¡yòc=Ž}÷}iúú5Œ}» VjÇ÷K!òKÔþYPLµ Jbâÿ&C͸ƒ 3à®MÆÖ h¬ˆål\‡‰’kö•æ³î‡Mú4à7UäÃÕ¹òû‘ #,7rlgás¨‚D£x$o*…ÞJF|†‚ÜnðŒdûÙÐÆ1ÛÚ܇þ‡‡]ÿ$ÇÓžË ÄO Î ½¯ÌÎÏÀgË$B‰ÌŠ/PÏTÇ‹ëwñ8‡ÀæºHˆª²-¤G—çxàÆGœ(~Hâ7|ÅK„#Iìnбz_|Vnª•;G%^'ˆš×•¥g½LrO»ò©/Iq„¸Y¸)ž5 ·€ÅÇ+íNd[Ý>imŠ…†X8&ƒ!JM³ï#Ó´h¶®êé®V{cððö_™ wâôÖ+ÆY1’"˜¾åKúälôÝ>§3é÷oV~FÐôû–Ã饈„äqà+ ‡W÷{h߸b`5&cþ]’x„Šè N>å·êV¼öHóãœêüóÒt¼cns±ªöœ>n«_EöQO‰§ ý^‰˜‰Ïv²b ÆáoÐQ¹­YéK¾v6´Ë˜j·“†½Í}Ô=*È=O»hq•£€dG#NÌÜÁRŸ®7rå`óWŽ^Øuk¹ÁC³y1ØZwPYò•Öov—{ÛŽèê5½žº²d•Õ\NÖÒßD¸¹’þ¬ãÏyO„Ö5´/ZÍ92U‡±pï"N[mšàÍ·jÖ¾=KB< õ€ÞIÕ,…ýÒòšlñ-)è»# Æ”•­[ѲeŸ­Üe  <Ƈ¤hWžrÛ7ÐÚÙFá©6ãI$§aHÝ0ÅU5­¢\üšïç·yQ,‘dþ‰¼èe³ƒkRCr%—ˆ]t4%3)±¬6Ða®5 LfN-5é’d±æÕsµ*fÚ ×â§Š\©Õ {ŒõqVt®øAæQFQΔPÎ论Q]\r˜û–n² O:’* Ã{„óÌÃ*õZ·µ!È]°uàÕb:X ±SA2Ÿ …°Ï^HšåÝ»àÁgo.'¥M ë³Zûû‘r­JÊÙÛÊÚ­Ç=rV”q¶þ}ƒ—ñYBÍ+VÀä˺êB^˜YËNÐÙoGÁ‡V¬iÅ…ÂôõƸ;£õÏÆ‰¬´²žL Í–’à}jƒZy>öÏ­¹¹óm·–+¾C–ùŸûˆ[é¥A¡®¸Í™Ÿ§bõôetÔMì_\ÃÑf!³H/+þŒšÇDó+6õ•ÆkÉðNÌÿ¡ž®¬"’| ìÍ‚å$/~  ˜Œ^²ÀèKô»»¨ pb:0øÍ0çiÝp€IzgôàÊßtè·týÒ‰õ†Yð„°:Í›Mí¢9ËÓ[Y‘±³áÜCñI •ŠbªmÕ³@é«¢mf´À¸{ë+„,i„µ%À÷‹”jpA‰G”ê à|ƒUÖ·êR³o®‘©*6øá6d-òÁ-¾ºUvÈIïqJdG0ÓôOoÆEpÇ’³j[úžBëçBH¯¦2Mw3QQ@ãϧH¾Ã>“ú¬SùÔS ·›¸’…ÞÒˆª¼2’#Gs: cç¾Ü½ ×þ\(Â,HŦΌӮœeÅuãlRûFSç!~ZQB,öëär#› Óï¸ÎñÊ€‹¿•ÚiíLìªZ—ê”|NËp½¤C Áàw½Þ—+åßÒ ÷b{à˜ø'BSj5ï£lʃÝZŒGOTPk…pϲ«>ÑèMa<µ{îN*ÖþìÂÔß*é’P•e Ìª°ºd+à bŽÁo SÁA2'C Š8aÐÏ3æD4ô¯éPˆi5zè–¶hòåZ@(GzìeíÁK•Á65f›XúûÞ\Ä/µÁ[˜m0z![qöubœ7³ñ?4‹¶XT¤4ï¼#3úaÆ ðˆrÉç‘Ý‹c°’ŠUâRG¶(‰Ûdz_)É‚4ÂâíåXk»Ý€àqø2Ï ÁÞbR>ñ½_ÓJh®«†{Z5§¥D`ªÕº­­ÂZSú8CÌäÄX²ÐR/V„£H0fÁèx “æ|Z¥‘ᲩØìø^R‡Ii 9ÀÆè÷<üþÕSugtf§~åX¾ž¹tÈãé•e?bˆ÷_…,tà$/Óþ†æS1¬@OâJ/­'p-¥Ò=­ºa°#+× guC^RN·AÝsàÏ3¹­Ä‚·ŠÚM™‡{k)ÔåP¹×ÃV5 ¾ß@^$ÊÛiۨò'†Z·ÿcÕ³D/¤‘BAC³ÂKzÁÖ+íjeÈc7ê5&ß²­¿?¼À/&•Ð¥¥È¢1„YÏZ8g^:(õ° ñ½&!ìÙÒ"æc¹:â|FÇ¥ ì63*Bœ› ߦŽæ»Ùårl™`­r;E*oã‘ÖŸ><°l2NõõûÌ mñ#ˆvº–6NSOQ¢Òp.1뱓¡-Þe9Á6ÁúlܵÜí·œÄ'äAGm¨ýº!ÜiYdC7*ðÝð§P\Î=WG*ñ2d"_íru2ø;• "ˆML›9¼¼‡Lvœp¥%;ähµ?x„²ö“ ßÑ=`ý´—k§åJJ~AÇ„€tЍÂɱd~¼ÀJr—ÁfanLÆf5 QèR¼qÇÊBtXM)­Ð…F÷Á¯+Æa{§ýa·ð8ö–QY=ºòN‡ŒNÞYÍÊ ‘É"Ê9b#-{m\-庖·>ö7úše•® ÂòóÇ)ûº‘²¡"Ôæ°=¹[ÒŠ…Þ7"g›i\/wÃI/V%ëá‡Ñ£ÏQ{0ÛÞ‡õtS¾óÚg[AË€°.¥.B ·b$½DKZ¢± JÌèIêC'Æßõ³£¥‰·!yÂ’¤_ ×˜œ°8ÛÏa,6õ5Úþzã4»ŸŸ-á’ª‚$x:µÌˆL ÐH–ýä÷Sn+»üàŸÞý6ljœi·áÜ áW2ÓEDkC,!ɉG«EÈ,>ü\’QZKtDÿô@W€y†l €o²Ì“-™]Õ +llµ2û3¾ ß aÛmÂä²ÔL˜ƒ+›·ra ¡ð­ˆ!w k 9Ÿ ¢ÈÿjÚŠ$¢ÑS0.v ڛ캙S 8ž³”Ú®H³\±eêIðûme¢XrÍûÅÒÕœ0={wþE{Ú±äÆ2¯¬0x *À­‰ˆB% ÌŠ!Yg¹{-ˆr 7Ix‡5aŒùO)L CÊ¢ Mؤ—Ù¼[Þi¢h'–÷íµcö„8ÀìlYØ–]`zjÒß"ŽB/t¤®5†¿ÂÞ½­wÆç¥¹éÿË'4v'ÕŸžåÌ<Žtlå'Nk£¶ÊÐ0Ê™–XæX´ÈèÉÖÛƒIoÇ]Lãñe×¥–º¦»¢sü\>Ö!; WWÉ«!²8¿ªaÝQŒ û\àèÚ4ß9\¶öëîr ®I–Ô9­Q/mR—–_!U]æ_‹ªÞ¿æP Ô}2à !kI(ƒâ»e¿dâ§CÞÚnnØÛ“µwå­Ã ÓŒâ©5Õé'ñ–mñq¡z& fQª± ˜ør §å°Wî m¾WŠìawx•²óØ&X™i=wF‹«g}Ôü¯z×;‡×C¬ðÊ ùÓfoÜ?†SC‘îhížYícä4ªÓY :|ï6Ñ­smüz–Œqœ Ðºª¸è»HÐ j¦Þ´1„+˜Ž´`Ô½jVà º;ìÞ>ŠSeØ×¾ñr(6àu³!‹R¿¿èׇG9òÖÆÀ ·Y)á6Cûø^o-Z=âF +;äŒ[Žc[†|=0ý–ÀÃ1‘Ô¼SOxû—ìlÒ˜ OŠŽA‚\—óOãH•cbÀr5ä&»5ù^sfâÇë1ÍÌ1Ì©9ŠÎwÜœƒZñ×ÿñísd8K0Í;vbÁV:Ñ@"x~®Óˆö¦V1ż+&âÎ —’:ëOÒ)Å8CÚA7z-!™!d§qèGî% ¶Ž²w$Šç7~d eÜ0ÕÔ˜RĪHÉo7üh%À6*ï߱ó›=Ÿ_'JÞ‰’ˆSØÉõ‹ºk–r×–i¨Æ,§Þ psìÞ5* Š¬_„¸,RNW.ú/ÀÚ>©öœåãˆtI*?GDYoO„¶œÇ­‡˜ØNq]#Ó}ÞO`aÁ6¬ÑŸ¼ÃTÛ}‰~R„yÒ?#FkrË‹;3ØcÓc&M©-ôAøEÓLÊ„ÖðC?ë1#@(»J±â‡õ#e”{Ïg¸糄;ƒ`Ã"é~8¡ØYþªð0–,¿F'úe{ðÓ¿xl×û•[ ƒB‚1Ͳv}ÀéHüºZ³çÊ?ƬÀó¸xgl&^5õ5ûØÅ„ÏdÉÔj5\É÷b¥™’Ñ?¤%Qëáç'L0Å @ŽßÑÃʶüjn…¸N1(m×/²Ÿÿlô‚cÙÖ[±à™/ì ½2 ÿ>ö©ãÇd<½ ty£jBÑ8£B¬l±½¹Ü‚VQÀ»Dú-ëݧ„'*É)DXnbTeX–Ç^K–-EÍtjFW†ª‚ ÐeJc—ù bÁÀî” SÓêi>l&.gªŽx–å¡6nÒ%-n®ñÃ?"ÙXDÁæM;ÿöÌ_(dy؇¢íÅv€ÚŠîb²+Q——MÚ×”vâ/a†D)™QÃêS,óŽÛ˜!ÉUŽè@ö8óš©S"e0x¼Ð®¤ˆE™ƒµ¤ÝÌ]r­õ>cØ2AõðÍ&´À»wIꮣƒK¬(‡ŽE·_;û~‰‡v@Ñcî 'Ü»ÿŽQa]‘ÀiUáš©&ˆp“\iÛa­Þ-ª‘”†ßÞ k£æáå].ݹañÓSí9ÿ9âŒpú á•OÑ»BM¡€dæ5KýâZ>[ |Å Èà”SÃÐ9R /£6Mõ}mz‹MÇVvvÉë*zÀ³Ø“{NH‘£Žë¶­xµç³ß_À1ô°}Ðÿ±ª[ch»±§è=|qª-/FHº!Ó°ŸJ¹~Áò=Iyîv¾élË x?‰^Íz»…ª4Ê&û¸™áH¯í#‡‰Ù@O¦4ŒzõU ƶ­“sÊŽÁv«…ªIlø¸¦?¯DØK–£׊Íò¡¿U’`ÑWQîù´åf¨óÌ«‹¾Y˜í~Ã`2›H£NI!{ÎÓG€ÍÏ]ÅÙúÕ¡Lï-ñmݓ֚‰2Áêîõ~¯Ä2ì•\Hü´½ÃÔð!N£Õ7ÿÒNU'q(dÀ¥Ch d¦LùðdÈÝqj8=I7\úΜ’Mî1$ýÛy)ýË\%ϵõŒ=ØÕÆüCc P´J¨VB*‰ª ¢`e“Añù]í1*±±ÂRT^럕Eê(gÌÆ’á{ø%5r#éF! Æ­}6?ƒÓ˜kMÊ@Œ€43r £µ5]h%çþ/{e‚$ ë)qP%T! XÁ@2vúñ:‹Å¶%9Üh«¶¬R›ž+ÀÇcw¿jqÚZN€žV9Z·JNÙSýR/?Xõ~çZój˜ )p›Ù|6íÊ[èv_df?¸Ûâ—˜$#Úè(£/4ž «Û[Ãqøbû£ëolâJü ÐVFf< Œ§DÅwÀŒek{[ØÂ-‹`˜ž!&iawŸ>ß65ðž7ìÍöïsœc8WHxÀA«,o ðÒOÏ‚Á@îëèŽõ9VPµ´lvMKÀ+3=yð4 ž”l|gød‹xjj””Ì Ó.lÅ쌮…‚³LwÒ€¦ó÷3Ÿ•ÚkÝëgª*œ²Wsµ¯TNp¾Ñ<›–}”eK;–ˆÅ¨¢ØÆôBKÎæ Zvø0Jt‚¦2=sÍãmšà5×¼tß5M[[„ø‡Â|¥yìXe ¨üð]ÞñǃÛ_õÂ3² W·åGyß‹âîð³ýàšb/p„ö“B’1/´²†J¶£ð \Õ™a;¿ïíÕ~`±Ä~éšÜ3¾¤à•›í š\19Õî(¯ ìî’°3-d5îB.ƒ• Õë…,’ž}çÌK ðñ :ƒòÚ÷ÜÍØ¤æ(ú±¿¶™*I5lð™=û]%~–Üð·okÓ…‰ðûNaz’Ì=äœÓÈèhXз_dOk9:8Š*m´ ’øqϳÍÙÿ\óH’+sºíÏVF6ŽÏ¾Æ$²N<Å&¨šßŸ¡ød =§ÝüLo9lÀ?,Av¾T²E+D´“ÁþŠSŸLåvúeTu§¾íÏÌ3‚Ä‹Z¶eé:ú®0Âh`Ùz\XNËw€X†Êmãšä¶ý*)yV‡>^UÁŠZÕ_wÀ±Z+ÝÄ2à«Jñžì7»?µÎÊ xfa=*KÀ´Y œ'Œdî®ÖÆ~ák°è¸ß5ꦚ‰f˜ZÊÞâ]™ Ç’@…lÛ’‰Ä”­+Æ×÷Þc€•*À9ÿCÞÚcÕrp§K‚ÔRl{Â4 W::ôbgl¿lõX¾S-–óÊêBÅ$9 €¢„ÙÕS|še„.ÖÀæžè‘µŠû{fÔù/O?ü7tšälÍC‰ðL—WFºšð£…‰ω¿ßöSdOž®<Ϋ¯ ÌëBÜd—‡,‡X—Å9¼M$ Eiè+“ÈX«í˜2d½§D@Ä í=ò}9N4']s¿Ç¿Üº¥ÕÃÀPϽM£Léµ ‚™Ä6ãì¼?gªð4Àªmh¢ÁXvγ×j˜æ?oÖöä×öþ&±{¿”W ©ò²÷’Ç™ÄâÁÛS±<°·±lŸŒ÷ÉiT¢…H;s~Ý_øª© w™ÝDi5ðÇø &g ¾ó¶—¸V‚YèÒ„º2 _…‘ºÎ%M±>4‰v4ÈÂYá°ôÈ'fBiîtï™ziïÓ@ìM^!˜¶k›Å°ï˜èý–ÛÑd~v0Ñ[˜›"¼Å­éÇ‹&µÿ¹^G®ðÎ䢆ƒ…é¡Jø1+æð.0z$¸øz‘‰2®Z¾„æ; ©5í²Ë æÐôkîœPט¤Y ÁÝ¡}©ÿp{Û¼5aÁ®X}"½¶Hù ¾¤+i-O³à×…Ó|›N]«#+°vMó¶Z€ Nf™ÅÄö¥7ãïžâ)`Þ½Æ÷bœ©Cw|;—xÇfð$Ük÷uSS~¸¥ýl}a¢fÒ\ޏ?ËbÓŸPM$êiú@þûu‘áùÄÂ%}ÑÈWBF¾¸ßµÎ;ð‹ÕÝ?4Áè#Aá—Å ‹rÓö*üí33ÁMüÓ\µŒÑ‰j ¥¡¶¶’¤R}3ƒTÆOœ…•L„|Ò‚*Ø_Vj]JÁjÎŒ3APΠ8§_]ÿ [L^$ÉÍÜCšÿ£V óN÷hÆÔ.SÍ>Ÿ|Þw–h3»(&&zí[•‡óMpåp¦wm®ùUj‚ësXÊ wRZp(g“Mߥ_÷¸(ƒáàDì@ å=þÊüï}™NùÑ•¿3"ë<¨wÖµJ£MAy’-6‰ÑUÒçç×Õ>\ï5¹1ÏDÛ3ŒÇ¡ßþ)ÝÄÅw“w¶(ÉØî[ §ÏÒžaá¡ôE>Käèá.×vòsËfcV{—nÙ‘¬Þý5ß)µèÆr·¶Á§£–A±õưÃB3½}Aâ¨Ã-?ÑE=¢t!ê{ÍÛ<äbá˜R<œ!UÅM_Ü‹fêÜZ1#=%iüã1`,h¢R¤¬¨bF–Æà;fÞ xîÙ{wµÝvúßœˆ½<“~µh™;!¨,+”;rÏ‘Z¡‡XÐ ·",QA#tm‘«¥ü‘tœ, pUŸ†Æ2% MúÚ+ÑD–Ë ‰ü8YJø_ïºÅP,Žk yùýŠê! °rÍû~Ää֭𖆻,í£¤cò§7´^<ÕKÃ8"4:w?¹:·Û¾})'ÌPĀͅ¿fpûïN2ËG‹—d r©ä—¯iG¦!@ÐÉ^O¤«¹òP–o÷N D¢*v Ry>tì6Ôÿ$,±;±x´”š 3JMF¬)ÜÚ­±q´ùDÍ–¾‚j’ÐRwØ }çÉ$ç’[@’ˆD/í&ŸûkæüìZÉgÆÆq‹×ˆ¨"EkiE+S†S'¢"œxúΪíŸeü¿wèšS}ü/†7²H5àåýê ¹Oº1hŸœì±€+*Z@5*9»MÔû)K|¨÷¿&‘+8?‰šGPE²æoa.°?Õåy ž—ÎÄm_·(‰C˘·õŸ}G$ºRGQªí‰XbÁÄ[ p–8j*£@ü]Á–¥{'œ3ìf‹ú¨/c“à¤ØàŒÝµöè• ÄJ»Ù²+j@J²Çø¾Ïg%¥ñ²`➯^÷ ãŠQN¨Âæxm¤j¸qD‰ö×½= ;f»z<ÑŒkœó—û)…ewœr¨îŒŽÈ?%àD†É©@ðôØf"SœÌòCÛ¥ïšc×^W±¢ëâœGuíL)ý¦Q½=š-˜…·q‚ç2ö6^|gf¼µÈúŸÞ '9™&3/ÚÅæ2ÎmIãù+ºý×äáoÔÒ0Œ|ŒÌ¢ÀÄÁ ‚PRó=$BË¢ñAF>úƒƒ&’?o]ÀPŸ˜ÛŠvñA8"[Wú¬½Œ­ïUö¨R¦V‚…¡jZõº+dîÅ?9Ã-”ø™Jé[“F—rI^O“c¾Q¬ñnÑdêDEæ tY¿ž×'©{îÂñe½† H$ nâ¨: —îmdxzsŽ«8vA¼ˆuïz·k˜ ÂuÝFÂD‚Î] Y½@ËLeÇsÔ¯oþ‚[Uû}FìùCã'ÑX|Íâ^š&š!µª|I„<:˜,Õà ãj«WCÞ¢ûÿ;Æ·½ç0†wIûmhühXù{}¡¢ZÚ[ óU}|-^ê›^T ‰ïOm­„2`·Iw<œ&¨ ç6É0½m¬zDY¡#êus²!¹l2ªÉcÛ.Eþšì|r­äÓÑ ÉØ¨Eº™¤ö„Kg“§ùÁ#S‘ÿ½hÈ“À™V$ã¾Û­Ðúã–y©(Ë„Í põ1´Ý¶Õû©˜±{…[Ó¥¡vË }dz ¿a2Bz+÷-ߤø¬#o×…@hILLn!’[[`ÿäS=YË—Š)ˆ‘ŠÑ[t|6¥1¯v´bc™„Ï„@ú÷Aúj› k2^LÛÐ}ÛÎ}¾?"&ª>÷ZUÉ·"Žð•Ydõ=-°ñýM]‡ÚõŠ ‚Õ˜í…ûÃï)Ã×+ä(K–]ÑÌ|½ÏÄ׎ôüa~ ïjjoäÿ —Õ‰fJ&Ó>t}ëÕ£ö?ÿ¤.žËøÃM°ûuI­èr-âÜiŠ ®"ûXºÈ‘ŒàsÔˆÖÃbXÆ¿¼"]‹Ã_Ù™Ýø$•Êt6Bk#`ˆ¶pÕô}K±ó”Z‰ábyòQcž\™—i»—,9§wvlµö€ѹ‹Ä_ž>’õt–<75ˆÓý哲™òM#à¡Om*qœyKã6#¯/«<HA¸^dFN.[Áó ìŸÝîe™´º{î4}“˜‡m@„ûäü××<»ýe)†_WU1ë“–òs[¾EP„ìƒÁ»ñ2äd Ï×ö™ |ltQrZ‚z Vˆ‰”›úê;<µdS.¥ñ$w µ8wvÞù«ö¨P˜0J)u§ãþ‘£"zÖ¶^aïøYydÝ<½â$©ÁU¬Â Z¡/ü+Ú¹«âAr½Óš¼¸b÷)ãøè{¬ö²Öõ‡«»ýP€ªÝª§ký„;ùæfvœóõ8«¶t³‚—WϳÎDß.C$PpÿwÜV—ЃƒÕf!›:ßöÉX¶7,ôË1%£ëò*£sÕ¹€íð«DX¿±[š< ù-N¤zS(×SøRþÆÀOwˆ˜œÔ8X 8îï¨D”߯ ÷W~i§ÙGQáããOtIò±Å?S•‡_ò[Pž@스#<#íÅÆý¿M”D,†R‚hqúuТğÞ²?ˆ'»ñ¢äbËVþÙEŠxCBP“¹ÒÃñSjÔ†–§UߟŠÝí6ÉP.i£‰Ɖƣ( ÈuŒûyZKù“cT—_>ò`øU†êG»c2ÞÝÏ Ÿªr?qñºðàvZì2#Ð8µîëÛË3gΚø‚…ê]©}„¤{vìDïŽx}wq_’6š±ìºNï¿«³]ÜN²¾•êïtõ÷ð¨gƈ~¡%!!âMLÕ˜Ýà>!Œ£¸ÑÛð4”-¢˜?§‡»®ºšç”užº¾0þ·îZDÑqª%“ý-ÓÀ`sĈR$ÃÔXEn·À¦1±?"uÝ{î¡`3]ê;Zöó:8}ñˆzîÛá$‘Zë¿óÄRÃR¢Ÿ†¬Ž/R·4Â$ëW7¯qZ²ŽÒâ@;5£Ü¦þÏžŸt™5ûì㶸ÚvħÚXvn|ÛÁÈ ñS RÜ`}l•+¨Œº_8xŠ÷7 E,TìÚTo<‡¾&ºZ¶UNG7©ŽGèQ›zà³€ûš8Ëy>28HIqXé±ËàVsz÷‰y4Œb7¸½V³+ƒÏЖÀlJÙ‘æ?ÑJDp¢¿ªù=äzaK,Dšh÷Ò( «3š'´Ñp"¬ÊN 7¾™]vµòå˜vG Îv±Wäßtôbϰª+-ÛÀÛcµ¬hX³Ì§Ý‚RÌìwº}œ+wf^F÷Oéè ^ÒÆ7‰-J(4b¥ kÞ¬˜öÛ©™ˆÁ§—}ûªø(W¦ˆÙUˆ¾LE¥·…aÐdi*õ¦ºi“̉¬ÓV YëÇ”×H߯Ñ9¢Ÿ1èÅIT’C Œ¬ÄxÝYyµìû¹îÛ%˜<[5ÚÐ\|½äznú4×’É鲌xªzF&²ëœíWe^¿ßvûÌÚ‚íeôt±Ì$Ö¾xÛ%8Š†Ì•yjv&šrRíûåènäEæø ‚ê0ÀYà#¹WöŸ*4 $Ƶ«ÀIRGg{kœèQ XHúhŽŸpNJ9)Ì|aôî,¯IN{Aßï°Ï Qû £þ²™aû|­i¶Æ4XšIíqjë\Ô‚›äÁFYèÉW4ŒˆJ 7äTþeó\!¨¥j ›q¹àrݪ5I¥Ð¥‚ÀìÙ©Èn™¦½Ukgc|¯­÷ÉÂú6ìµ°¢)ZÀÈôö•| ÓÎ Pùâ")ªH\M”× ÍÉœEVö=/´ùQV/ãB‰÷Y£ÞÆ^`Dÿëo°×?\Ô8×ÝÝÓÍãFéI¢ºÞöX£æ€:Ø“œ ?d •cLÜv>2Œ3 pmÞ›Æú½_>ñ”O;¾•À%à‘Ì×cƒÓwØ_ç=¯wŸþ&QL¬Ñ¯„xÁ,”5€A6¢®{Éa_{3ÜGß3¹·æ ÷ö³¿q’0žÜìÖͶPBÝC8 nI0Ÿ»R4j«²Ú6Õ–~ܴȉž„²1+"–þÁ‘jØJTèú0ÊQËþ­JaD¶ówfÜFÌ>8÷€ Ne €‚Fýºï§ÏGhr<'š‰…+4}ØØDó<%ÉbYЄ†G3×=APáG£÷)0°÷Úõ¬kµO3µ;¸ª¹HÚGâ¦^3-!Òíæ [°×µæá_éÎéUÙDåÍ7˜ »6ðš¬:+¾¬7 h‚cf¸Ve¦·å÷n“ƒn õQû¿ì+V³Å?EæJK)ð“ÄO{„‘av¼2 ¥o™ê Ì 'tŠb©ÇÜsafÏ‘ãÕÜxì¼Öq¿2TE¢©ó­·‰™úèÒÛ¡Ž`ߤé ‰ê,ä¡u‚ƒLâDÞ…™Gò©ÔøûR푤>‚·1r½þȉ ¾ÒUbÎø…•AvÙ£ôÿÍhž’Ì5]YÕiœìPªw›­²sÓª±AÂ'4ø¹ñÞ ¶¾åò@Ç1¦+¨,/9)vBäÎcãé‰Û*u8üZB±ãõ­èî/@’ÐÞËÙàœI:„ÙÒÄF taTu¨±Ò—²ó³kítìo€}¾‹óÒßCd7¯×E:%ó¦UœPŠÆv `¦fˆ"`$°È=×ìKã|æ÷÷z 2Ýy0íœ?×_0Äù¶6q>ÆØÇô™c“¼çø¿„OÞF‰ŠKà¦ÀåI¬¸ššž?~"%¨Ý©jPzš«×à¦lžP ´´0Ü\ÎP§¦×IH.A‚¦WH@ CŠã I}Ía\†òý;¬Ro‡ÃöÁÖS-ÞO¢l«¼Þ!ó¼ CR¾Ôn«$×(2qdå6F@Õië3´¥ßû²z,x¥E§¹IçlzÒ3) ÐÊ-9ù}† %ÜùþÒŸ(R7œ»^gDü!<ôš§uÿFõÀîÀ6 ¶Çѵç..¨‰ëG_$ï½®ºÞìºô›årn!ž:¢÷‘•r™ÒF#bVŠs4Mzgà„áh=¬k*2¸)•¸—i¯$è)æûÂ"½É!Æ•¬÷¯¥Z”º‰¤/ýSç-‡I-Á¡½È 775~cu‚ÍŠRWEyDZCyøÕ‡;]·“&YÛ[fo6ñ¡žW$kÕ` ¬gkÅæESgo#‡Å(¨Ô³Œ‰DOŸ±7y`Oð)¸žá¶÷Ý1ý’_ZsÃx€ÖS£Cm{‚'mчdü}P/|,mó\ªBb –Ï`rxðwE4„ÈÊž)Lt´‚e‡&9º2˜Å Ú…¶ÆLoLzW#Û ·Pܬë!çÇ9ÎÍ*nåQBîÉ úU¯¼l¶s„’vœsÔÂÚX4¸ §kÖ3¨kü‚Èw’’À¨lm#+vê¿øt²¡ÑT®Ex+(‘ñsSá[KM<”çÆ´ü«³5O¤ë…°C ëg”p‘¼±!yAVr è<á{Qv>ÐÓŒzuôÈ&@pQÞn&熔ͩWœ«Ý%k·ÈV§”_¦œÖ™—öá&‹%?ÁÁC㨾€àýUÜÒ«GëãòŸy¹R4B™ºXót_0ƒ¼¦ÛÖ”è®é‚<.cç‰Ö°€‡°£C}ª†¹f,n0lÄkåüõàz_Øë¨#`ß~–HÙšyiBïÌ…1†M§î=a‚ò)A³ÑþÕ0ª^îì™™šÂ²a¼SàègKŸVåìñ«t+bAëN¤œ¥÷ò냎söþS£Tã“Kæ%òö·O›Šg‰~>=‡§Uú %• ‘sbDÕÌy¥©ƒ2Ÿ(ÛNb$WsP;öúˆKY8¢vcƒAÅmÔiR> / þ÷Ù+BWÌÓ%Ÿ/êqú Åû¹Bô‰ßänµµZ”ÂH,—âÁÝ¢ò܃tÙ*¦.o»)%<®§* ’ÑbÄ2(š,4¹ò ®1h)þÖ#›À¤¥ 2VNjd-ÒŒ¾3äù¿:?M?Iº¨£ßMߤËÅYÔݰFKr}W3¢èS`à"¨0·öŽ!Yô6@‚éJF±6¾±Ç1†S1©,g$µÓú!û©'±<÷y#Ód^|ÒØ¶Ä"Ы°£×Ñ#Â$¡½rË1ù ;-l˜ðýÒ ÔÒ?ê`– uš½ì–œ]UÿºA©¬“ö-ö,ܹ?q“’o¨ì%ðÌèß´%ýC*;ÿd "n4üª}Aº+ÄjÉBS4>]b¸ÐWâ­£ÉP.ˉN›õdŠ¡YFOÕâÒ[¸w¿Ã^ýV:ú¦{:/¸ŸË™ðFLžF.¦lµÓµˆ3„ö±†:g×f„ '§I+êýKI!ÆûbM× C—Mšºr§Î¨Qñ/:Ïô׿ÓB×Ç ‚1ÊÚ}¦u¼ò×ÉÁä⻯y¤  Ù•Ó2~…ì×1ìBxËO½„ˆâpÅ[H5›0°®ïñS¯Ó•ޝÇímñ'Â>Bkõ¹‚l@ÄlšqÑ ð/Ö ÏàÞ3÷7|Ïk{œ‹{. Y éVÃ6É6¡3p›L‰Ãº§){|ô÷cÒÙ¬ÚoCܬÆêß<«¢¹ý4TZ»€*›ÔVTySïÜayˆÓlý>ïéû¥žZgo«ÀºŸ(©E°ŸÆ?IIÔ\†Â U~ßó,B2Í$åå;Þ媬¾Å6á_²:î“þÿ!NÚô¹EÛBh_Q›§;Ϧõ]±m¯†ÆÏq“ª½háÐfÐ¥ÛQˆ Ò®7®¥g½moÀ®›Ä÷ZõİZŸöˤWÜœ3Ú©:½-ó¤w¿÷?~9ëq¢µ7qšûk({_ðNÂç¹Ô‡Ó³éf ¡ 9iµ9͉Œ"ÍR…&O@²`˜ü¨osæ1ºo.ÈÊ&$Ÿæ›øíîNY8j¹áMXž§¹0ÍÖ¨š÷¬ÖªEÈ[‡õ´ ¾¥ÂV]4öÌ\¼-R¨5ÓQm%K€&°ƒçæD±ò%1žFÐ OÓÂÃY¾¤ëwª]5«µ“yЩ È]öѶ»|‡;#{Uû Ãìi7ã(‡‘ÝÊ ÓAåR VÛÖU·Ø­‡Ô ÷—*ÀêÙhãTüíÇοK¸y,1&NEiwÛí¤Ø~ý̱¤3ÿ¼Ë å£z ÃCðsjWª*Mÿ¬@Ð4n^Ó<¦¢ˆÅ/êÃ9ß Öíxƒ!0›P.Sj7”Å£<ÔÎUšëdŒ´ÑÆæ˜ÝºfðûâWÅnôHÞµÓ¼Ç[£ëßw‘kFYâîUž¶ íºâúÿìa”.¤‡ñ¯6ÉH=ãr‹ÕÔGm ©ýô=qÞ É«Ç†W){nûßZë¾ëS[8‡ƒ‘ï·f—…þÖ‚RxÙá 7uæÄvï`x&¸¥¡ïÓòþØ`I´µ$Ïä…¦ÇGº\"÷)ašVõW|$ŠößL§Ì°FÔ[ó;ÃV ý«DÂ7#e„ð_¦Ç1¯]° nÏ©ˆÐêè«u­£‹¾âñ©»Åõq*¼vš+gY åôj„þËÒ=öIP^‰ëw=€ŸR0“äyÓ$ÚôIØâÃ7 ‰n&) 08œþèqŽS†Õ+¢¥«y«ÉìSʇáí„aÛн‡0Œß¹Žg´Hþ+öƒvõ_‰žÉ„âöÜ’$ç:Å5¾³/üÑð=˜›OÒ!¤ÍË¥{ž(5]€¶ÀÉs؆Z $Jņt;$Ж«jØó€ëãã¡ÐL\°‚RùpAÆm0ý_ß¡.Q  £«é9”Åò´uIÙõE>ìç¦Zń߯·”€}¤ÏÃâÎ>LZ‹n«ÃÚ¡oüTüi/m¡¥ÔôOQ\Ö^$|ÒŽKí‹„ ³ˆD\Ô[Ã8‹–2×.oCO“ëý?üû•çfµ½¤Úoš[µË)´ìþúœq9‹.V—54ƒyPÛ³Ü=_;"ž=,¶öË¥`IK±6z…GÍ=þUîÈXÇ}U&ã3ˆ¼DE ô²Le¡Â´þéË,hŒÜo¢ ;ýv*wŸ¤¡ãϨ›r7ÇŠ¿mBÆN·Í$œ(Ä­â+§¦H@˜s]­n"Eéc` ¡‘iÌ\©A¾Õï£Qµ…•‰óÀªÔ‡È@±R$\€%Ð hà¿¡ˆÚPÑΈ´xÓb©ç~4i¡Úæw‡ßÜì!¸YÔTŸ@¿76¸—x2‰Îq\*CŽ<…Æë1èäa=;”œ]­ó OƒÍ6Y™dQ°«¥|é*æQé¢Pt#í™kƒ°¥¶2”ÝHLû7¶Ý³;Šg½4áÇwnMát>Ÿ ÌoMÞJ&÷ôåeñìóIĨwŸ<¾ÖÞ]tÆê“·:jDØTþû¾¨l(jGSr ïÛÖw8câ¾Ó}4ù1Îò<5¿©»vý²% |ŠÌÞ wÄËÞÿ•ø06))ÚÉ]ŸfKÄo¥O ¢yx-pžXFIÃøë“ÆÓäÆ+AûgÆBe»4ÕIkGa˜f¡ûw$]{ÎüƘ²ÕÒ@Ž]2ªEºÅìC?ÌÃèÀ¾›„à'†6>ãcÎÜuÎRä&–(ëßc2‘1lwyþ‘7BÖ̯Ä sLK0QÑÙñ8Î×é¾FÑicTHñâõô+ˆ\:¬ê écñÜÒ‡ú #@Œ+È(h¯Ù¡õ½Û´ÌŒ#Å™ÊR3I ßÝ–sѧJ˜Ln9M2š"}êÔ´&QH7fóGþIÔÉ„â“ùMíZÆp¨q 7rDÕÝéÏâÕÐÚ2Ž\q¸ºFÃÊ$m0kÆçýØÿ2T—÷jÇQZ†²#:R©UÜ ââ“]Ï{اåÔwI ÆØyöBgMBêhuî%Ó æï£û&RPo˜¼ý0 –kn,G²¢á)E‡®vK÷ÂMÈ]¤ÖRû Z_³W0{Üâï[J(Z-\ W‘ø+éF¸ 1ÒíCðoì»Ïl¦?½¼õ͹p7dBæ ÃÈFµ"*4”Ó«¼7ùë¬éÈffèú×ü&0º…#íP9ødå¦q‡µÉð?£vX }xMãæ«ÿ“ß^£ŸÂáÔþŽîšM7‡B.øzµø!¥ƒ@®ð¼Ø6'äFm‚ItC,1=Oa ½õš‘¿åºæ kvî³`U„%éS4Z›%zÊ^îf KõdæäLvIz4HnxMV@׉ŒÁL¢·]1rI>‡j]ümÎm@pnë ¸¢ê] |cO9™ÛÙQÙè GD»Hž7µUðí#yDZmÍ܇è8 @«ò$Ëñ[– ÕL€VŠìVnP·Ùx‚ÇPfÜ¿%6Êe‡¡o!½š¼Äƒ"´¸EwZ–±Èªl&ír\˜%^|øfu²H˜Ûœ°åó6{%i’µ·H× ‘i¥KßÀbFÖÉ-šU°ìÞtå‰íÓ \B2Ý–& u=£cD ­PÒ“S1” p#Ówíñsv!ñÝæ Ÿ eO…©\ïN‰_Ñté®!L)šÞ(ðIÉ›M9@MÍ ñE .ÖAûªü¤M:Û’ áJ”„5êÒ».W~k‹b:PfV¸.Í«‡DL3ƒ²<òý˜»ýUy9;´ÌððYÜPH•¦<»Ë®nÚÛ ãâsÍzŽOûY ]2¸›û0ÝÞx ç02+^L‚ßÈC¸ápM bXOŸa…¢øÆNðÄh´×e˜;{äßhÈmì½Hù;™æÕ´ ›5 hýí¨ |£Ä/Ó 4-µÐbl…àO>µrQàóáÿPóoHh­,·s¹ÐÁ¬¢íSÕDŸ¿Y"˜âU£3ªôLeUõ#ƒ*ÉQ)¯êÐ¥ 35ÛvÀð°÷ µƒ%q?ªWYœ@Œ U04;“|H?Öà4¯4×f.L¿V3–Ø_.½\ª¯\óçñº%KWltÉvìqÔâ÷4hKÅ›»žÛ|GÞª|\ÐYÞï·Ë$Jw59}Õ“„•¯x>$@Wv)+MI5a:„Ä4ÿ4œx¶ž¦@eÙ›ÊÓróÃ3Ú3÷á Ù)ÁCÄ‚˜*«eм©Ì”zö0Ñ%£ûrWü óØJ¶ðíÛé!]¯°%Oç÷‰ýk•¹µ©Â²näûÀmLPeò2 ;r›ßš©Ð ®1Çð!‡,Ö1¢®H‘Ô.`÷À»W [5x¹æµ×q‚ˆ` ð/ÆKµýIcÔtáÂ* ‰Ž†sýèǨÊ1õ¬í¨º.ÇÊÐùj¬m]ä{ìIã+oÛbôp‹‰µ›ä' ~Ýß ÂªüàdÐ4JÔMðá§‹Í'¥e¹ÚAÛž–¿£#²÷ÊÜ f'ötÃÌ›« 'w÷rŽÅ}¼t<â?zD qr÷¨»x9f¥H¿‘³G4ÅGÃÑ(1ð0òŒøœyÇÛ†@à ‰rÁ°ÞÚò¥ÔêwŸåû%Að+€­ËÄ¥kÓ•Ïh|œ£-ìØt˜ÄÏ× Ù(„­TnÀY¸‰ÃWý-\Ä­µ÷·!zC˜£+_„.ddÍ+ÁzŽÛgÊq¡Óú2ᆥÔ÷ñQpöªÆÇzs½â“ëüCæÅFþ:_ß›P rDD?µ­Y Q¦ïm*Å¢÷¥.xÁ9¦@ÍE16ºq¥ë[çøîÒÖ›ÞdYã Èt6ËE„öz÷þx‚ƒx9çüNç*NÏ‘©6‰D#/²±înöôÅ·ÐTj}k'§É3ð­;îÂΉI¡/³PdÓEíã )«ÃOÕhá*uHg cz†#ŠÞ¯òó¾Ãï-JÝç¯Å¾%XÉÛSxoH¬Ò…YÛf°|UùJSÖp|ø^ÛŽ¼ÎÄš“ÏMÛ6tÙy÷˃߰¡z@ ðð ĸÏÞ“å!˜„ªð¤ÓféR_›­#Èþ*æœV* Üú±j5˜Ï¯ôŒÊÉånoæ¡’ÂÊm¶ÐQ}ñxS¤ ãź\òÊ5–&´ŠXœöÒ}Iâå…ACs²Ë¿xí&¼ƒ^"ÁHÅZ¼B^Y÷|(4kgÇÿ¥2ý^?çÄÌÜ™¤l–øE ‘ÉüÚAù«°£+`“&'öžåDìû æ‚°þ 1šÞdç6¦W3~Y1 m¶Á~Ÿ4HÏè/ …žáªˆÝÁ!;±ü/ËÂé…9%s_VNõW·¾9àn;þ”ý>AîW%x˜Êò®fê¶øŸõEM ·`ˆ3R1IKB«çU"£¶”Àù‹ í]~b˜ŠŽxÚ‘€)ÇBDýІÍçÇÝy®'Cƒl‹•$Î!ï„¶>éÈs"ŽõÚwVÖèbS†Æ˜r¬2 Â-óÆÕ¤¢pFWã™૾ïˆÿ/–_á8NðÄk¯áÅ<÷‘,ØÔí¶ šå =7‹Ñ°)ß ½~Š:ÏÙ%2ý}@åxÉÅÊ”';ó góù3}Üõ*ü˜óÑI¦ÙÊ]ßÉo%wQ¾Ê»YXfZœ8¿ ƒ`Š t$*§S„ÅW:8:y &²\E¸¬™x¨Äö0{}æb±SÂÊéŒS´KèD¹j­« !D÷ÿ¤mw²ì+Û}»ööúÚ-ž®»).Íæ(¶T8¥÷KèV„XA1K.šÑÀæd‚âq÷¨ ['-Ãg«„3Þ“úkÆ€Hø5ôsÌŒ}1|^¯3"¦¡ÙúâÙQ+»?Œ*,P>î–ÔR–±W/ãî9w%w|O>Æ Ä_°XÒ•è ºò¬Í2µ½$QM_ <ØŽ°4Øéš À©Vá%€²mtyÉûÕ*ü]Mç’:éªþÞuÊ`uÂ\oÒG·ÑiéîP×Ã÷OÇFPš¼Ëv´µ2J·ÄŽ##Åz üœÑ€›î؉ùC»Dp¢² òL¬‡ç0È 0äâEËdF#‘JYïþµa¨r‰2”.Ô]¦À{˳?Úr’鞌•}÷ÿ.‚nðõÉB• åî‡p çRŒ„ÀqÇÍs=Û GâòÁ0–ù§& æ)1%±š=JÝ&8»>=J“&D(Ô1ÓqVITÞÚ{¾,… dóÿ·ñïg'Dšö— vÊ5Ü"þªÖwÿ2Æ*»ˆCþ‰0DN0“M•† ¦<–‘ÞÚt³ã *,Ùˆ¯º6Î8‰wre`õäFûïÒ T zt·—ö_üX[oWgÊŽj§»HàMs¦óM>¥•àÁ2Ý9CsM±ç&¥bˆË³LÚ-ncOß1!ˆáËCðk™û˜4ÎxïwJ`?d·?7ùëéndÿË«"`}9¾Ø—Ý<¤çÙ uJ-Šæu,p-÷BÔî È·=þ;³Å<ÔÁ﫜÷·××0ǶoÕ‰+WÂÉ`,eË EA{§ ý7Ýé¢\HÉ4@«kwk5égäüÈCE³¬Rç¬~uØÎ„ö,[h÷ŽÌ•R´÷ËO˪¾µU\ç;mù[J¤ù ñùåB„ÔŸÃóÇ |0v ´ ƒY¦b&ø„Û³§>¹snv8NW_T³sÆÕÞ ÀÑx¥2ïü•‡âÇÏCí'èOý¨Ý[:aýºôÔýÓ”¦U*(i‚kRÁ+äJ7ýuO/-…vŽÈ¯cΆÏI…µñ¿»ëqÖ…¡õ&º >Ä,[ë—wF0U>ÐK&y#Róàâ—=½R#Ü¥CÔ²@±‡Uùåø xm°T¸2简˜cŽ&©ºš·u é½)‘IòUF/.µb˜Ö^\”V54pï€ ]¸¶Ts˶qÄ ]7Ï·½6½y·v¨EŒºO[7ÌŽâ·Îî3[Ûo"·#L‹!è º7!ðDýð3U3+Š*|{<.øÆî!ëm±@*˜¶Åù»Bܪ÷Kô/Ó¯°›çMÄV³°L»˜r”/Æø|†e~¬ªJ®£ùœf=;Ÿv]“oª…²’,†R¿U(zão>„&·M=×¾¸††e9Òö]ýHpûÆn6´<çvæ0( ‡ÏŠr,îU1®@Þ@örØx O¢òà}òprÆØ¾*i4<¹4×`%£îŠÉD•[ªÏ­|ýšAܶR4ùåÂElwM–;ޝÊ8ÎÒUG ‘ËTÿCÜHÇ= ”§o8©¬0z ®Sƒ–‘Vö‹.s­ËjS¶_ÿ¡K—Åö–[¥…™ >I2¹b…¡¿`ÂÁ p–«zC»Qæ¶a@ëÙ‚zÜRâ*ÍÈ)Él¤`4Jð¡K“¯¥…Áί;E¥ß%1‰üÀ*üþ÷zC=8Km™^wŒØŸàÕƒ9¤äàdw®!Z,„Fš™0Ï„÷&Û:@u×ÇÊÓÆâKy¶l|Ú¢ý?oÜ®‹ýv7îû3°ÎfÛê^L0 ù”ÏŽ£î梊٤›­÷cÉУ¬°³—±søí4CØv“½qr^2d`È¥×vÂ\±ÊdÚ€Ûög4¢Ù'_*#«úoƼƒÏ&ÜÝôaO” įäÑÝÞÈ9mòå‰ñéOW„±ùº¨2„À—Å1Ý}€Š[ C™ Gði%TUêÛ¥57£}hð"B¬1”¥·É$ÝO;|èß›{‰ÒgMòøÆ0óB–×M2ˆº1kîRÏû1ɳÕ`ê¼rØ¿hÎî^dF— …¸+¢fã©ý½‚æ„é GZH‘‹z´ÉâÐUÀ—Í1¶ {E î›ö!Î?æ Î4¯ð™P¼~æU½«'¥ßÀÃaws#-ö}2O_ /AZ˜6¬'ôPžÀ÷GéËõ݆8&g°ñè·¬eæ?9»)f“§s-Ñ‹ûˆÉ~{Å1 þŸ:z˜Üç.¼iA#ÈšfÊU€ß¢œ¶O• \g… õ‚6ð¶Q’úÑÚ_×B î¹!áËô­}G9´&¢ä&­w÷ÑË=[ÂùðšÝxrŸ$‡e4Šœb¦ÂïÝ’äL,ù MÁ ,åäõl_V›uâGT~¹4Ýù5¢-$ë44ê I\é;¯ {L?ôíEx ä%¶ìu9ÙBƇ=ÁæÁP+ÑÙ¯d9¨Á9ÍoA½8¦¶îK4˜‡úË{3\aD"«f6ÓR•׺ ª‘ƉüÂW›@Ë¿#?u+S²{ÏXPìf¬ÓPì²ø?¢;J›M' ¹Ø}M™B½ø°QÝúÓæ× 6ŒxýâRD“½º>]/ÛõÌ}‡øHHq Äf %êθP,÷RÁ$-wVþHÉ©–e?¦9‘Ú†‰ ¡ Áë­xý¹FvLlWRŽ=°ð '/@gTçRª9Y¶Ñ”¸d ㄊœ8ûLàP„ñ¥AG¾½šDDŸ&î8צ@ÈQH͆ Çí“´¿0Ë …;®“ך Ñ¹ud§eÐÆ˜)þàO©1´æ¹{Ú_E)ËïKÒØ´ŸÊªšÐ36/%í~"²) §eAš¯BBŒº¼8I7ðž#-(7øÚ´‘{? ñêÍUJ¶Vbð@î]Z·Tâ‡Ý¡¹ë=ÿÁ¬Ä3òTú¤2ø1Í R3Z¥-g0ô…$ì~²iúÿZ?˜¢„Hq&Ñ)ÑfÎ`Ä2…ÀEå26?&[ç‰ gÙøO­ÐûÖˆ.¢Û€h_U·$ ´"Ũp~ü&%ò°;9AQFb©2lVmG®™=vòc¹÷ºœpLx[ÁŽÖ?ð± ¿!‘ ¯”k\ÿþ¤K0Яt Rÿ¥;„àt©mЋ:8©¼ãÜõ6ñ_®_)ÀRüõ6¨­vPíJó¯·jñ"Vá~ÑA£Lto¿S`ï ‹ÀœˆY0ÜËÃÏ<­cáóNû£P÷vܨö­ÉjÃjj†žÈö¶ÄØ€ÚRª_tCî0m[ã\†'f$þ›é¯4k KŸð‚çÒÕ¿ž$èËuªy­ld•Emåɡּ¼¯H•;™ç¼¾ÃѬÜÞ-æãÅòoLï•*cÎÁeq“½7ž7©]Zž|KöNâü×ntŽ¥=‡ÝpŒ…ÔžkÞdr•þSš£M)™Pö˜ÓqÌ…0n£2³Èjÿ3N¤kÚtn¶²I>ôý3åU˜õÔÁc BÚ=¦+ü[ŒêÊSe]õswçÉ"Lm¹}®[Jñ ôAâ©0,—®“HAh<8JóY(•Ta•íéJ “Ybχ¹Ë†})K*(Y®_æÖþ Ãse=i$A4|*ðÙ«å-AÜŒ¡×o¡°w–n¼ ƒD(L÷9ˆQ»ö,pe@,Â?Xx¶Úd/¦êSž>{KÙ[é sT÷ônBŒÌk¤øz§ Zݾ¢Å·Æ$ ÿ‘®›æBwÃí.WÝ Ò$7_‘¥‹g_C.HΩFQåG=\Ñ2”"TÆéá°v°¦%ý߆—GÝ*6›8lŒhµ‹‡PR ‡;S-€Iz!<\rP'€™Ðk ½½ˆ© ø›ÛÇ–Á€Ê< '•²t6’гV³`2/H+æ¢ú&"Ñëf`S¸HU4T%2ˆ68öØhÐæ”×NGÒßCÉd–5œ¤ùï…íp@êLÇ~ a­ÃQð-uaÑ¢|ÛZ"äÆ|ï¤R”£×ϯ g*º<ÖâKh³ß£t?¡øél•Á©M{± V†·–©3!™ë~^ƒÓh¡à‘c›½æ¨à/=Wk) íòK!]¢+ô·‡,I»! ,u²6Z”ÿùÍýºiåR“r.³›‰álõ"nÇ>sÂÕ²H:{ÙÇ4S©ü¦^˜rÉpŒƒM-?¨âQ¼÷ÍögòGcÿ“ÄeSŠiâ3Ò}ºü ’fí҇Ь÷¯7ý-4˜1ɦԜªýæB”ÉÇÕŽS¬MØÜ$e-dc'“Âßq>TËxdQëæðbµ÷Í=uU©Ø²ï'>+ÛXCAV¾´ÆB÷ÊŠ?ö„#…¢ËbÂíŒê+k[]±x®\ᄾ?#ÁŽ<¶,Ĥ…Qdx©·WƒãV…?žâèmŸŒÃ2¾E(?²$ëR„&s ýSÃ#Î=I-Ž6%,ø)¨L*td‡{{céZc㤔iòÖ8‚¹þ—¬ˆÅ_¢x¦¥ €eø$cõ/›Ãš3y±ÖËBç=‰4"ÛýwìÝ8Jî$mé0ŸÖb  #'\£x¬ã«nuݱ¸¦Z’#Ú8Ùú€“±™ÑkgŽ\ÆÕ””WÖX Ï>‰  ýà&ÜéàÚ|äyê?•ò;h¢r.5 ·5y™0w Úö³z —Í$U¼›u[AjŶ`qW “ü}#èoðìª$ ! Hÿå° ßžþ ¸îŽÉ ß§827Áž-U t|¶J0-¥ˆ— sêžø•¡É.4H¿Ð§9J±aË¡…ø£ª24q”{;!K´·{;‘=-dÓmwÒÛMOzáÈ5˜>ÄË=d2éa‡0{gr€%=´Àºí»bu̹„r-‘K$.‹d”ñ9øPûE¿uñ3 §XÜFAÓ1Œí¹Òøw7B®¬jÃóís™+ª1]PÕËÃæ,îW¦&M’X{ëW;®(Àê«W)çÿ@"—¥—ÁøôƒL"÷(›p®–0Ѓ‚5EÑÅÆÄhAH#ˆºó-X sÒy˜ƒþ®â¦:tpeF6}‚ {ƒbyU_z”åú\GãÜ5‚Š6FÇk—ybÄ"P¸À"^§/³]P>)³k8v†VwípI¶rª˜ÌǹÌêMÚlÁÂÎ$ôý·Ôôv‡D¦âÝò "J î¼´Ûá×ï#EÆ „ÿj õ«>Ïß÷ “~Iåƒ0ÎÔàªTͶ{žö¬Z7_üªž9©°ž%BîY–ÐX› w ñY¾ bzè':ˆ÷¿úÉïS‚€zmó·‚”T’q©Ù¡6—‚‡V+×I7ì®Æ/Å4§±¿ì;ÊC ÞPv=K)bbh7/”ˆ„ q|©@° ›ò—¼Ä{kœ›˜@ßæÚ±á[ð2Ôøì½P–#î-7ŠSRÝkÍvÅ’0F}å^üôQGPRþj·4@iÒ ‡ÕXµBû°Ù²%¯-ÎñœBK6IïÆƒÿéÓÀ¨!Om‰ »O·£3tÁÉäð‚ºŒx/E8ÉšÁé*ðq &ECè^ƒÄšõëõÚ€‘È÷Xg$¶µª ¾Ãô„4…³Ï墱 T$4îãv{‘¸%qR¨‰âOe“ÞÌŒÕb'4æ¤ Í°6E&å*p¦$\þ]Q†xîÑ 5ø™…®m~dk³ª ¦—d d7ÇPðìºJ²#,^»°jý{éÑ6 «MÅNðÙM8¹\ܯÔ.еÉ2Ϋ-H;Nv‡â4Ñ&ÂMÍà °ý§áöÌI­¼ãK±ÁélsÇeì‘í1ÕÝ4ot+Â4ÒÓÀ‘ÁóÞ¥‘€à‡L˜ERÀ`Çl(î–<Г]sÏš52/­Zy¦Ñؾ?V&ÐŒ㚯$ñ§¤Š@ÆÐ£@ŽÄg<›Xî™’³ec›Ý-_Ýâ$çÐõM—Óñôh[å™À^»'¸³E«jR^\%ì»TSgQ¯§¶År·çUÒFµ… ‘O¡¥Œ(ñ0EÁQ÷”Ó–µb~yìä­™}ÚStçz“ä z›IÍĦØUë×U‡ËÁXžBy®‰‡ãüÀÏNÙâ룛±˜l‘¶ ÷{²©úH¦¤Ò³ÿ}‘IŒm °AT­µ_mþ*`è«Zÿ@ÐyÒdwš¼3‘Ï÷|Iz}žv¼¼ØYØ“¶$ÑFõ~V·Y‚~4¼„5î¼ ©#þÅCì˜É(zAõß] B0š1¼nAdC¸,60mß&ÑëP¦ç®sÑùðøÖÇ=âkøô% .Ý‚v¾“¢¤Ù§u´¸•S™Æˆcí^¶{vÚ1béü:X³¸>ðÄ¥[¾§R¬õ±ð)1™|Ìèau&r¤¢w¾&:ÍØÓš§×ØV™ø½ÔAÁ~gX ÝSƒmJ‘œ Ö?õ¡éZ[Ä\>í:Ú‚Èk&/¢Œä[Žñ²HX ø„úð‹Ë®©‘Ö#àö€ê‹ßâô'\ï)|÷(H¸40e4´òªò9b@b¬ÅÐFÚ¯Úž£ÝNÒÄ~øsËÊ»¡6ÑÜ÷:ÙèiøßùÈ_¸£á)g…ÞFœé07üž:Ïün¡Ù:ŠK‰&8±¡½œJ°ÚLøKÓ5Ù(9A}Rƒ¥O ”H_¦)_DYÑÞ±fêÉtž;K¨Ú~ÄáëA4å˜c]–‡>–Ó&Gô 3kW9ù@åÇ÷ðŸÜÃRÂ3Q¶vjæð‚_ÅyŒ`\'*›¯->‡IÞq‡CC¶&¾ŸÖÓÞ4`ÝS( &QJO7I†A••T™ºSJEÕÕ¸ŸŒð’á_4(Ž©s¹ãÅYß0çÓO{¨ÄÞ3!>¦Z°OO¬—½Ò¸@ÜžM*ŸmöÓu^GÒÂ)$XþÙdÔp´¦™öPyœ×:+…Ô/‰ÂfÑ—Þ9uÍípzÔ|¾«­?>æ•øÈøÑ<õ_éåÈÖk¹™ÀÝK,-IÊÙw壼¾D—¨™4!%:ZDöçä&0`íÜ£cz©àâj;SB¾[Cý K=Û’ñ|pÏQ Fâë$»Ã!EÂâ,0ìâ×ù:äŸle¹Œ›íKþ#·Vjrâ2Š Æ${Ô—:fcV “~ÓRNóôY?ѯ#kré³¹O§S„ÓâÓk>Þß¼ÙSÑ£mñ|ÂvØ–;Ã6|FR½Ìòó¤e]ýÕ_*–Ìé“·3žì+ù˜‹™õMVqnkíùRîÍkWnS¡ýÚ†4ëh]f8Îávòú.žX·cÌŸÌ'¡ eòÝç Æödg“È3ÀTš;rv¼44úwîwâ&È`…j2Õ‡ Ðx£Ñ<Øtð «®g\µ®Ë¤$’¡ãìSå²@¡âL¢®¤Kj¶ÍÂr2ÿ¶8´ /úÚUV;x‚X\!Öi _:wþQ¤èîŒèAÔBØË(ñÍ…ZK=úŠÝ.G@¦Ûô„Œÿ3Âó锊N}±Pbií½£~Ë;æuÃ×$‚[Áe‚Zz6N> ªšRQÌŸ 2æRwóB‘ۨ͊–OxÀþ(œ£È—ô×C’uMZ¹÷/ŒPy—å(÷ô<çÞÒÐüÖ¥NîD5ƒäF_íÏ¢Žob%•ÙÌw›·P‘Ä1ëiK'àŠm‰1¯Û #!FåXŒ~½UN’Î_f±àª º³ü ÇäLéÛîýM›:.}GI9ùÂZϼ# Ï\m7/tì֯Ë'ØßéUÚËou\#êwÝÔ ¯Þ—ã[Ò)Ñ}¬ç­iÄñYíL/JÖ[µµC™;L­ÝLÓÿ­c78ÌÄ'Yç9ÎIˈ:M¥¬LˆqußÇ2·ìÙê\ô'K÷¬€¸;óŠ´Ð|Õ½2ôë òOª”Øxœ>²JðŽŸyÕåöC5FmÚùF…»‘aÛ×Àd›¸¯nÛä32USQØÖˆ¾û™%i¯‰†•Ë?óÈÑ€½çLd¢º,ªÄŽ´ö%‘¸`Ý2fiª´_ŒÏ¡›Œ};gõD]ðEÊ:ÊVÁÌ'û¹r?'{³~W X=Ù^YEz#ªþØü³ÏÐKkWŽ—Úî­¦J­´Œ®U†Ç¢ìë¿ dCÙÉHȬ>!ŒÒë×Ù7`§ôhjrZ–÷"º¥|‰ÎûÎnØ8‡5‚Ç-HãÄÂóŽÏ:Œ8AÚvCŸOÔym>*²œyxºÀ…ËZ VÎÅbO~ÓÚ½ “ZÄ“<‰D>N©ÉeNÎÄâa•0;°7adpBå €€ç&üZhÕûI•½¦¼7øÃâÅùµŠ*$ÓrÀúç®›’{z‹¾CV¥Æç ^1 59m—Qp 7±™ ° ¶/aªy°õBFãgüBQ&0™p¸|ôF{€Ûµ.bv¹BûŽÃ¶{9µØK¹ ÙÝÒ˜@Ó;‘Ÿ»‚¡õ:*Èþn2 ±ÍþØŽ õ¯®¹Îq¥d_Š… |3#鮹DPüŠTN»ºª¹C6jìà'W’SS¡ãS¦ADþöKX—Io›=7X,ðÓ²Ow8ž7þìí;AOgùˆ"!x0´ˆ¸—m³#¿ÑÚ~$£­€m­SsO®±ƒ®ø¥mš£ßJåõ¾Í_o9nž$§RŠ2íÙ^~ufZ@‚3f ›¶ž›}¡ærŽîl¨ùkVü¿%;B·™ŽùóúóµwcÖ¸DÃ¥8L\,`«"Ö<_¬„a¹Øçb¦ƒO0E £>o*Ž<·`œ&¡*×v¥É>¬?'$;v—*@$aFÈI;Ù®Œ®ëô g 貕CÎ~|ñ¤ Q^tî~­î.“¥B»Ç÷-òŽ÷P§w¾çV¸Œ¢š0Aͨtבk|r›$„¾§ÃÃìŽè '.=åF wS‹¤Ö9l2“¯!(e²q·94[ÍrÇí*Ìtѳ€ÒEV)–S¬èWHdS¹‹K?ˆ¤ v `¶¸®)}4±¦ãªî~ÝIxKkÌè³NjÅ ”yä‹+ÿh†fŠ©wÛ‚ ­L?ˆ D]1;~’ªüh c'‰…úoHMžÁ bÆÈ µõÖË“*1YÅ¢rè%Gm×écIÂÒN'‰šæ±Ú#]Ã\Ÿ"¶ ~ÇÖwy®—“,ʾ°“ª·î|¨ícc›Äȯ1†Æ‰ÀÞ›d¶Œ¼Ñ^P× ·|Ñ c&¦K‰þŠÂí2rSÐb'ÅV9W}e˜§’ÇWì¡#6¡øé\'ÖCÈVêÕb½çËzoÞïý¸@çÒï9|WŸ Âð~PéšÚû@4›«E³úâävÒ Õ!õ«ˆ3Íãu²<ûüàn–o“lÌ” «ßHYƨ¹•’©“äk&^9O‚BðƒyðÒ·ŠFý*ìrs³`åÝ&kÓÚbà•GßÊsÂàû嘎ñÕ›‚ÕÞfßCuÑÆNdC' ¦÷¬S9µ­H^ÜÃà5å>Sqh0yå°îÑñÿëƒ5kÏV0ðÿcý—w íiP=‘Äq¦žrBì$UNÒÁpÄ3,„n îóVN–у’sZϧ*AdC„h‰z›¯‡:`nÀPÉCÎX¿CÃF’Df²]´Ä"Žº|N'¸LuOÃ`í,ü÷$WL‰›á,~!=õêÂ%®W>ûù’jf9Îø7ÂìûDB[±Éã,?òÀLÆý"[–>\¾¢\žãì ÙS‡û€É‹'‰)PŠž!¯X ö]ìc“Ì÷Üuý®ç§kï€ É?„0?NÇ™$þÅ´„Š ŠÄ`NšZ`Czæ'ª¥µ_þU…UÛÌ ü«Î´_Ï“ë$³Zð&QY³e’)1¨ÛIô½5,è^\Œ/ûZ+ÊÚI Æ&­ÖxÜì¡?HûptßYXŠ(›ðÛøâ¢w*‡á½u6öÓž¡•µ¸cÏü*TR=/lóD}0­`¯qH=b¹I$Æ–ºžŽMwa-%¹²ë¨2}šQ \Ÿ@–*Ö´wf£Š¡x·õ7»k`»¬)Ð\ºT..¸ã­8ŠY:ZÏúáî}ìš4U+ÊŸAäBwƈ{å'Üé)WűÖ*’ÚØY¥‘¹Eñ Žü>yEçÅ0qPÊ4QG JÄA«ínãU·»z̯%³J§Ëúí™à—ÏìA–Wfä»}snðL{$›¡"µõ¼)¾Ä8æT¦õz™+R(· ¶To ĺ¢Ö¤UšO³ûI “ÐB‰%õcØ·åfnD11Yoî+ŽkQõË{ç1Ÿ¬™f’üf€ëý±É±±±¥7yåºlvHk>ý¯CcÛü Ȉ˜ÙSpñ…žf—&µÏ0pŸêÕÞï‚̘Ë:M3ðn¼v‡šâÒÇIê§z!¯‹¿§EZoH8µÃŽïÁãÀDþZÂdýhä8} :ãQa @e ýýÚ ñ|8æ)?Ħ/çŽ%% Ø©mD&çfIöñ»§©œ4Æ« ü$—.UŽÇ#]1¯Âž³ £j¸öržMDÄZlßôT^ ›TGˆØ“'#jñ{wÞÛÁEÓ~o|0bsʬCýåaÑ5ÕLì¾RÜ{]‘ ”ºØSšò…)2\•Õ—€§.°hOî±B­‹Ã¶9ìÃ7}°Ä‡Û"JØèÃ2Ç“ Ø9®Ê VâfÆYB*6›m^ã|`{͹¶q=Wt@ཬ†AOS -¨–ð>•3F™唜¢Õl•í›^'tÅ2çp^èˆíZ×™mµn*?·®¥.¡ÅW‘q ²,$wÒC&ÝÞ]}‰­1˜'Ö.`04˜Êž¯¢îT˜—Õ—ç1Díû›ùÇÂhN j{²ÿ®nà'¸v®IÆcÏ\®Â¤ØGÿrÕÿ|ÍbM¸.ÁÙAL’‚†Ý"ÄÌñ„3 Ö¦¡-_%ã_à™¸BD­j¥aÉ·ã^8Õ<¡| ÃõÔ”Ä\ÔýÒ5 0ZÎeMHh®íÔ’T¶Ÿ#|`Ê ó;—fóÛ*a¹ön°ÇdÏö–Øu”tMšB‘øj¾ˆ0r’ðI }`Üà=Á‰í z~`!$Ýo ŠÄwãO¥–)xb½‡‘æÓì ;¯ÇõêXè¯W/.ñªŠS(‡a6hS{|rNzÝvÒê”™-Q#áù¬%ò3¬^^Å:ä+¥ù‡¾×ù±»“)C †Ùôó‹NÛ¢·Å;"VÿÓ™ÑÕã:BEUäŸÍ´&ÁðUÞcéAÒúPh÷*l±x3Í¿]ßáµÂØœ£Ìˆ»À–CŽK f"«X¬ìTJкÀ)Ìdº„€[àgÈiw²p`21Z¯ X鯇˜³&™ô@|/ï.($/CåƒÆ…°†Ù9»È!Ä mçÕ‘M?±Š Í9þ•p5¨«!~dÜ'¹ˆu#Öu\j5H0pŠœ#Ô5rÞ†•K@ãÈÅÿÒHXvæèƒœ˜jõþ­‘ă5¿èì7:÷hõŠ‹7°H7}ÄÔ 51Ä:ÞB381æ¶ßÌžz}ó›mºÇä\QÖZgËþ2ÃnÁ0¿×9ì °<)Üücíqžú“ÀTÐÚ<¿Pí-Žéx2ô¼°vÇAU[s€‰¿:Bi6jmT×µöíPGàF¤ƒ†}ZŒûJûìL–vl`SõŸøha_m…ïØì«Å]ä€1H S4Îߔҥ– WZóÇj°g‡¡–KáæÚB|.Gñäc²voî÷xBPÌ/WbRM/û -`>ðb›^jà_]ccT&¾ž 7ýGå]ˆ{@Õ8DN꼓%# „ÒÚá –ÇžäËFÝŸ Ê7!+Á¦˜¶ÖÅÿïqˆ‚¯Í·ô•/ã?†íÔ+NTÊ,T`œÃ‚ržÕIÐì¤Ç)ôàŸµz¤êq=¯XÝñÊÀ ±v%°gSV¡qoÂòQŠâ{{ í>]3óZ'xˆ¸kN½5¤ ÄŽMOêéIÉf8{3~>Á>•NSèå ×sAMáåò“¥Œ Ðé"ؤžhb´Ü·Pг“Ð_;úõXd›ÀäŒZtY!ÆŒ\ÅÔm¾[tMnìoállnžl´•°]T¤Å²>Rߘš‹žÕûÀ¡kÒt§È\x‡ßZŸ9QÔC\(ÙÂÉ€I€5Ô×îgò»öJ%!1YX„¥ÃH&¼ÍD¹«äÃOº $÷”¬í“à4Fa˜‘š,ýwögþ¡`Œò5*©A©’² j’Léóµ_ l 'œªPˆq†OùÏ8ÿ¯@“±:ÚDOQø¬ËÕ¦…=Uò`|¨„Ú/ñØÐ4ƒ÷ºˆÿÉÿ´ub„v]ËÞõ.lÞÆ˜Ñî0 Qòë5YJ’Öûé¾ãÂNMïD }4ElÛ>ªs°ÈnR©RóŠàF¿ÿÓlõêS7%†mN IJõ¼TxdhùˆêjbÖVK æBwDA †ÕI„ ;ý=¤’ã‰êVxV"ÏŽCewÇ>ø„ÈG÷; ÷K»8Aép¶Õ¥ããWj_<žâ=ð®ÙhãÓ…}9Ý‘û /Úš“¸nXíÉïy’¿¡^Bà¼éLö# é8á|À:+[\€»,r¿O,)Zs ÓëÑÚ–=|)øb–5-ýKä@æ^»Øj¿Îîô-„¢“ÄtÍûˆ_,]UJZ Ÿ!ûuè9Oˆ;{ÔÉЋ”x0¶$®ë‚­3OÜ18™¿Í ™Fš©®ù_;ï/ ]ø²Åq!PÕ?/â¦Ém2P*N˜ðm `DÈ0k×§ˆÔsWfSV–<‹* ÃÔ3üþ“¤€@µ¢ë§J‹ªñÚ‚ée¸Ýeƒšþ£Mþ‚DÑUÓn7[ôê¢I~—ÝC]»Ä˘ÄZ>ò½øØ¯œÛ¤4pÝØ‡Jb²_šÚe†2SMe¹ØJlE»ñ…&ŒáÚ´ý0›’ëOŠK{(bõâ?S¤6|*>ÆÌ”^=މ|Í8O¾<ÝÇBâ˜Ï#™öFkaÅÛŽ?”L[æBÛs ¼ôùáþIkë>K ÑÚó\†¯T–ñì#—uníY$¸MƒüË{Œs9"K¸EÔ@"@j%Í5qüH)Å ôÁ?¡åÓ`™¹æŠ+Ãæ¼Ieÿ‘àH¡ôöAN¡&dÑ6¥­J(Lo0H}nmÿU‘1g¾eqãüÖ;Œš¹ˆPÚòlžÎúVeЉ(ñ§Çhl€ì=«°»Fñ½z™<ß8ò×ÎjÕ)Ñ§š‡­¸+s¯~€›µÃs OP-]:IÙ(‡ãšþ!Þ€*rCú“§øFóPð‰Ð÷·q‹¦Qeß $x`Ó2ÂO©áÂÆ©L6eªÓÒü]åíq:˜=߆(\åBÓD[ô?Mp­‡6¿²1ÔV Òw£ºäýJ‚q"â)‰$”°aÌ/? `Î&yÁÐØAÌTô„##-K *k07£Aud$Ó²éwˆÊ ôŠé#ÊH€ÿÒL(#µ¨ðÚ©õûÓ†ôûÑý€*¡äseêÌâ Tð2 ·ØðA*¸ ›œX› ¤Ýœçjt[ÿÜC®bAeBåÉL*åÑ`´ß±ü¤¿C3éjW±üëú{–~“ùo’†™¬)ÃÍÝžªÿ¾ZŠPi©t®Ù L2#Sݸ„Ñ–`×/Oê…w'Fiig`×Ö(Š !vƒù†(ßý{DLÙÍž¨¤!œÓÉðÕß³q¯ÉA’/: •9x“¥íI†´EMá—ÕQ×Mc3Žj>MØó¢¦#Ê•ñezZÉqiÀªðšãi†àÊNz÷³­¤OA8僙dYDú-ÍÂósó¯TòœåÓ÷2=rs|o¯­¸£ýsu2ûôåŽO¶V¢UÃ]ëIÇÇt¤‰ƒå=çt+Uç2/Ì œÅ¨7 ¼G–­¡þpnÛrˆä·z»lF2ÙÅ%¶0È D³ÿ;Q¶™®»_s#†æŸ®qæÛ×6ÚîöâØÊ†GZ¦„9ɬ8ÖImhÇ<ÉÑ#vÈhh•…†våL®0¿ÆyëO[̪à£Wžh8]t‚,BÍõùb†iÛ¨Œ‚ÒA>¨WÑ?žé›ª˜h¢¤KìÆkn¤)¡Gù‹µ;­¦YÍ´[“é¨ú<@ !¶ÝúE#ç>Ã<0=8t)1Îþ®zóœêpº=éþÅ,>S>^Læ@!‡bÜ6­j°8ks²84&Uñg¥Š:M¨œ÷…)Þky¯‡˜§ír;)ã¬ý·³ªÒ‚QŘÚ|}Mæ~L=µAÓ>gt8Ø~ýž î½t#ÚN«Ë×x‡ì# ìªÃ55rî%Ó¿iÏw‚ÿ{¾¼FEÖ¾®æ Ð`êe+Ím7ntêÛó¡Þ¯†Þ±Uœ§ª@.\{¨ÚÕ£w@x÷è>ñnÛšÄ,-Õ©«ö‘lˆoÙFѰëŒ~pÝ‚ÈG ì„>Úáw¸´–¾a³¸¶Ñ‘y&5ìÊV‡ð/-f7ñ{YõáEþ#DŽóuùJô°a²e‹¸±¡eÕÝ=3jÒ àH=°!‡@Ó¸ ªxõø Ã¥õ¶ˆ‚„¡HŒÅÓ®ܳxÁRvýËÛÛcOÜg«U“`;˜Ù·Zšç_¶gœµ~~ í%Ù¡í¨ûøBâø^bðš/ñy[j9 xä )e?(ÛsÔ8¼eÂÿë…÷<* ÐÛgâ±;µ] ae»¾Á™ôe¶ñhxâÝ*§Ií¬I:&ÓÅT³‘ßÍ>”©¨=PßÿiK/$üˆ|\ù§Rd¤UÚ¨©a¢eRêiÑ& áÌW#i{¼yŠU¸—é=z øløs1ÓµÁ^ ~úSdÛ÷‹ç<ˆÀ7†bg,¹¼Pâ×(Õ£riˆý|¢Ã¤æ‡ænú?ÎiYj §«NȦìÅÔÁ?‘d³8T¸ÿÖÛŠK¤0âGß`¢ˆaÚ¦‡ÍË"°àî—qˆ°3,€åÙŽ»ä&rÙ•I²Ù4I?Bu®6¾ǴRg{æçgfu\·,Û™©ñxQ·ÁC‡ü˜¼ëXØžBVýänËT¡1ŽÒ€…ŒÀg´ØItÒ.Mù¼×þê/UÎuØXN®nÕ>ë“p¼—¢ÖHŒxŸãËeC¾Æ5ÕÁptï#À#Tý ¦ÁÍ:uR²ó×&ºW^ËÈXå¡ãuÊ1ÊwBÉE@Ÿñ·ùßÏw^ÊÓ€K¹’ºxó³ÕšfzðM¼Ü e¨/¸eÖ>?K{¢ÉÁlÜj§³ –—­<¶bŸ·¯Í]Ñxu:Áû§2u+³pm/éüd¨YäM0œÉT¬®œÞLmÿ¨)¹SAMP÷r»Gý”€rPá»úOå€#>ƒ›¢!Þ=YÄõ±B! sn†jexûKÀËêmXÙif–wû©ýÔYì=i>=ÄÏŠ(úLÚ ÉÉ#ët(Åüžÿa’V3«™ë`DÃÜùz`‡E=‡ÀŽÓÈe!Ú¨âK%ZZîX„'߇‘±ö~Ý‹¼tŒ÷UñYD±²#šúg:½ªOªÝÊ 1=bw]ˆãµòÉp¥ó@ã2óŒQËû–FFW³WÅæO®O©Ù71Ž,è\à%NŒ“üS–=Âl µ!Ç &Ž#8¤Þ…S4 rmÃ Š†Ïn"R°zm%¡BÖÇðh¨Ÿ©—àóÂâ¾¢Ëúœâ`yñû\mØ ‚f.>Ð`8ñ—ÅtK%9&À(`T„z¥© ´„ù…TFM&=ZLjÕ7¼àNœ ýÔq[Εyý\j±ºÊ·ã.nY¶ôc[6s£¸{³ïºÿ£µºœ†@%›’€Æ®Y§ xlYk‡ê±+CÐ'äÇg°òJîŒÂÚøE]QR›š‰Ø‚ÄKigÞ ¨Ñ„7þZi›‹)‚ê¦.6¤´Ìet›vs—“ªœ12kÌîîp+Y]oiî|®|¢´-ÝsÞ«ÌÁfÙPKbÜ¢Ÿ®[Ã49›S·<‡ÕÛaµRei‘mQ÷ãðÓZ¾˜Ô¼™[ÊSÜoS†¶¡ŒC¶ ì|öÃ5µ@½}·A¼ëp0ëú#ѨÉ!ØÜ3É€ãªå,äs’äë·­ã;¶e¢ªî$;½Hh /ø0N¹Fb°,rȀ΀öðIµšýÎÈM½ä†WNV|yCþd mN§Fª]o€þÿ‹F@â‡ñ©øÞñAŒï9WCÜhM€€ŠœçS ø?ŽôU24§‡’´j^èLÈM¢ì$öbHhàWä/Å Ï^ç[†IRi2F{ 4t¥‰w•Ýx†P# Øo¶1”Þ{VæCù Jþ7ôjÍ£¨ +vX”M¯ñÝ07Vž`"X›Óg<—‚ qÛêï²…å¢ÚêØg|µç¹\„¼&ìëtÁe¨Q"o5À:Ä×ÑQ¬38ÌR±ü%ÛtvÉ-Ðã`œ­gö`…2õmÚ3ßPX¬È,¾2 ¶°ÔÎuX±"T}søI²múøJ+%§1ÞyÁ›o½«‚ÖFÇi‡Ï&âS©•ÇÙ*ìˆ3½oœ¥ ù$žãkOŸe tÎmözÕm¡ÉxC›€a_çj1Åü•DñÈwEš<¾Øß¬öȦ+:\È*×2ûÉžãÈfM8¨u¡þZO/|§ögÕ*òæ´?ýSÖ5Yá[çkŠ‘/ÖPõªifên^?»Aq */4:OOí ˆ„«J3ÞÙ§¸LE¤>Û­ƒµŠÒá Ê¤ÿ®²A›·%TÑ‹†«ÄPÒ±ãsó@È0¬ÔÙønKÌ«ýôU 0f³dul GÛ1ž“zÿöýEv|÷µ!]õóÁ¥Qf„뤾9t®â~€ Ý͓ȸOŽe:5ªÏϺI“@¦—÷K˜ÛRe;-ÆÀ Çé­½¨%,õX–”ªûÏ<.í+ÚT›¨Lù÷%¨¸ÿQ}áåŽÊ”‚€ÑØ—ød©Äg~¨-¢kØ•Cqžþ6¾$ÚO:/0jf¬ÜY¶ã‚krhÿ϶I¼dƒYÿá#ˆ›9ÿëÝ|~l’£*8õÌo¿0uWn”QÉ-¤ÉD4àwÁÙ%ZEͨUVåL†'éÛ#t»¹æX ô¸œ5²^ F^ŒïõÒ›ú¼áQE| ˜ñÁàN¤‘l &ì)ÕYóB7î7ï¸Òµ‚€ bw®€ÿ |1¶7VS2¹Å<ˆ,Q°3Y{z`óhdeÓßF}²F ¼—:¤ÁÊÕ.ÕÊF˜:ú)Y­VÃ&=”ÜHf[ñ¦¢M¬²R|ñœ¦Þâx5óq»é>yÈÅn6^}Û>„Óº°†Å Ô¸²ÿ¬(A«n"+ƒ„r(| ¡{4²æÜP>Q¾]ƒvíî% ¹áXD”+¸¾X3oI;f“ØV¾Ö ”z´‚yØBÚª¶WƒŠfŠQ0{@7¸¬7/žÈUY”©Áde=ý °6ć*ÂΤˆ]A¼vž¯øÌBÀÈ °ËoåŽ"fÂmW§‡úë/”¶mäïÔ¸ïðúÕèÖ¯äª×Ý,’"T> ~öñkw@w©|<è;îŠG3aS ‹äpÙ—­ €È±aEH'|¡ÝŽÕpVI¼ï³P ;µt¦f¿Õ­^:ܰ9ïÑÿàÂM6ä°«1̘ÝʃêmQY¶˜=N‹ë5K7¥ˆ¢BðojÅ&~Rù KGûŸ¼p2ùmå+ Ë\Ÿ…M~œ<}TævåQޝ¬äÛ-±‹5Å}¤O¡.ë—<ÎL>¬HQ«Rß§Yá2rT ÏA&¨}ÝÛ”|3¼ÊÖ#›MqM?Ó”¢f§?r ,zƃä` RoãZj‚1›¨ ǽ)¨™-h`‚EÇ©æ~è €B-÷B¢àÇŒGÓÿó90t  ¨QX& Ä’üd\­Ä”¹üx‰¡“pÙAÃîK[ò¤UÓS ×û€½¦Ó•äaZ½´ŸÆûr‹`ê†1Ôh±¹sȷݺMý õÓ»»c‚ÝÛOëMJÙ[°á´ê€ÛP™`,¢&)¯-F¥|±Õ¥6³_·ëý8ÏÐ8l¤yÍ{ qQU CîyÝ@)Þí-âiÅ ½3‹ï^;Õj)ÞƵE€Yë©&-Wu$÷ÜXx÷0‰åÔjrkib»VÃušŒ–Ö K ¼ÿËÿ[ØÚËñ†‰µÃ>ͧúðh†øÞ³¾²–9y³…watn-( \„XYu8æù¾Fï7Ë á~ÿRf2˜ì$cOm:8Û¹öM­jyHŠç$—ºäɳL¼…ñÒîäœ5\Ã}nH»}£ß9D5Ê«²ŒgaüÞê·c?¢6Ê"+wn(´`@˜˜ê Ûì Uá‰^Õ?¬6‡ÎB?æ¡åó…˜:ÄP,o?›=3Æù.5÷®(¬Ÿh‹>¯T]î(/ê¡Ù1 3Ø ï9Œ49{‡ [2 Ð}µ®å(úN TŇXô2³‰iÚŠÁ‚Ü6¸hÍØÊ\ðØÈm‘„ö"¡”+|ozœy™#þÎà\—²®BÖ ”Ëû2éWvºH±óÞE#ÅM®ð¾¡\\lŸ âfM $î¨÷ö¥ïdëÛ#Zu¾‰ÄõºXCÇêF@ƒåÿÝ•DDùäGkG‚WËþb妅ŽMgœ»ÛNÓP— öÔŸêI¾5Ãm¤Ù€2kzݘ#Y÷¿˜8"¹·Ú{ŽøÂõïóƒ/åÝjó÷0¥ÑyqÚ‰’¯U;÷^µ£ = wÂì¦é}Š87LˆšÎŠSƒl¤…7ñBLýŽü•@éÝ2¹îræqæ7À¸¿¥tη7Ü<“«—æ8³ð“ ­+ „㈻EÏïf×Þðom³xNëG^ócñåžÉ,…¢&“ŸØâ7áEk\°ž»X‘áêéV¢g¶¢ÿÙ cÿ9Ùµ±h5زkšAú|A ™¿ÍŸ6îWZM©C[Ìašç¥à+ õÐ%–ù3ùä,.µ»Ù‹³îáyV’Xêÿ¡Öz+Á-†Y~œG ÏT¿¶¨åÍósÒAIà#ÿÐ-NÕǽ( /4zV*Š´ÉìS›úÓ„‰nÃl¶û‡éÄ ;´i˜Ô®Ïì ¬Ï_a — $ª^†–ðUª=/Hˆ¥yH`Ñ#O[³éj‘‡ŸcihçûWVùËÐL…Ö%ÌPh÷ñW6«56 éºØ¯ê¸¿“áµÐcϱ̘ã×|TÙB¹ºP‘mê ›(ÅÛ–‡k˜’b°ÏèM8W«Ï¸f@e_‹ê­W…軵\~šÐgÍ^]¦1£{]mBFËñšºtáÆ¾tlÊÀÍȽ5åÖÂjb8ßÌÙI*GXB8\ÍOêÃ-»!{f Ïø&ø^ÕG!]Ý“ï5~Qº¥h=l÷–×Òq8g²uªGc(µ{~€íƒaBý¨Èuä?\—zAÜÊéò£_ãqÙÌ-ÃQ|¾,*‰PÕ½—Ì'ÛÌf¸8öˆó„؈ ˆâ0ñV—ov –:!¦»2ûÎø©<úŒ rHÁ¿!bqì‹\JBÉ4ä÷R¦’>¢5ü‡Àæv!NÉÜ¥Ö+>Y þ2ÍȤ¬‹*±Ü;ãuƒ( zöª4ÜK~÷ý"g_Î@BæŽ`À¼9‚ù` ‰q‘QŸÕ ÆIŸ©Šoaù)[Ý;’K]!É'|›V-i"Î6@Ñ­äËó¶¤[—©B¤žƒÕŒ_ðrÈ—0§eÝ] (¸kÞ0¿à½…‡\|PXC£¯« Ÿ¶Œ»óè|?¶Z?MÜP —K<ÛåôâòÍa0ÿY„X÷#u¾ é`…ŽÉ:èn+¸I yÀ"TGZ2ïǨýÚÔX_]‚*bžÿhrøIËB© #o¦›Î‘'QW7tAY…G^‡]ýÆÕ¸FS D) ÿ/˜³1 ƒŒ™²Ã½”Gu|d)̃°3æLD&·¨^no+"~¨ÂT¬×å~Ñ£>®É ÐŽÞ¶GÏxÆÝÜ•޼‘ë¶Fd}ö¾¡œbžâ#þr‚Ì?»¢–j„›ÜŽƒ»Æ‹®¥–H#^„®/ÑâÄ#¦Ð”.Q;ˆD¥j8‹}ü,Y:á­Ûj€,ž A.FRž eRêÔ4œE«}ÿ1îèOk^ž˜¢:ïÂ$Í+"/(Š;ŒŸï$N²Š±¯WÖ^ßOqvrxs³Á-‰¶PP·-«‘ƒ»äÊoD[¯?¨øÕP^Ÿ L¨u[­æf²)§6Ý/ ­”ó.æ'š…es„)GY R>Êe÷%vi`á""tÅãŒniïÓ-Æ”>†çŸŸmææ¢Îl©ˆ}nhBßO>¤²í>¨çùn°v°¼Î¿ ÔÛq´5wI9ÛßPê5TÐ=8=¤,ûfðRà.<ª-E™‰Ÿ¨Ô'Òé¥ð\Ð&w*!îe±NÙÖEBÁA»g½:l¥÷ø2ãfª÷)ví¸tÚ[½e†wym­Î|SLÙ©nÑZÑ{“"ü]GJ "æCE¶9Jûïz7ZEþæ¡b«1!ϯËHéù`Ëè¶Ð)‡N³ÕÅbY?w•&gصW9·-ŒÌr}ìœë-WùH¤O¸|&‰‚’ ÛÔÎL »:XÿÖS@6ZÉ1`ò¤ñ‚w¥ÍÄõ`§ŠêP«N´õVå6ت³0§¬{ò£Ašòøîª‘@|IlÛüV—Ò§t¥«=45 0ÝOµ,E­2À[Gï‰KçcŒu³¡%ðj‡ï&uS8êL~Mº[ª²ƘÐ.°è &ë*í¿?Sp­zq\'‹±Þ¯ˆàêŸmœ. ùÂ×™Ûù]õ¥ë>p]ˆ36UÞ°¹–ÊÒ#f¡8<·:ûI@šQt€ï# äiûß|e‚'Û8ù¤úìzÕÁ}„§Kßï3ä Z†õÃ!û)fkî¹[ÝÔU¤Á­hÛ˜T΂aÑ*Ýÿú¾Bß}©©;âHŠùå!ûÿzÂëÞ×B8sòn,X¦1ÒDÉê÷9‹æÆbï¥ôC¦¥1<]"Ì} ¨‡ºQb(ÉåtƒûŠP}1‰kÝj™g‹7ñ Sk,Y<чÇQܵ»Œx½Á_úd+7KæfŽüEìs,Kùz@´ Ò“d­ùëg¸fâ¦ñâƒ!äñÃHÝt„~ ÿ¨Ù¢ÑŸ¦aé¹'‹ƒÊv|œ((hbŸ—¢*häÂðúÝaÉ͆ž§V€Ú–51¢¢ù I™+5EŸ¸v³l&‚)œ”Rû/7SAzfo2yçfÝ ‚¼ïV1â¾íEïx„7ÁÒùãÆ€µ†Ñ  òk% †6½¾4ê­ÇDqÔ}È"Úº°H"Šâ?#˜,ÿ‡ZpÛ<͉;Þuè`^Žl¹ËóXJarŽþ²Ô&bØy¯Þ¾)õµ‡cÁGP_(¾’ ¼ÈôþG ©iÖÀü÷¹å­|:%Ä£ïn‚€g)[e'¾ßLÚµI¢õÛËÌ(Þ~ ê?ÍKüëM†Ö篚¬!~Eäö_Zª“Æ#v(Ò=&‹k èë¯Î¬ø”åR>c~ × "“g¨Tç‚s‹§k$1á…?%\Òä˜þ€¯aÛÚŽks ¢zéG™±ÝÔXƒ•ÇÛè· ;n‹dé:üa‡šêÀgZò‰ßéw‹)T•Éi¶9ü“NŠx³Õ‚ýÛýÿ(Î5b¼… Ù5ÊkyoUüY* ¶.)²´ÑC88!»*ï+ø@¾ôbJ¢TÔŽHbŸ½8Ózû À¿èìŠë’´¥Ý)¬{èØøõDöGä°ôËòMVô ·^8…GŽQöÌ>6†: Áèì+\æâ®ÕÀÆ}»óBƒ\ÝŸržÃ{Å=ÔØõ*‡mdƒsé)·+9øíWCa0››Q­ÀÁ™2‚™†ch³yë‰#½÷oÔ<…ßHCK[[âÜÂ_öoZ¡DGÀè Q, ùÃíÁ+f Žëòjųó—9\Ò3òA-4–TŽ|йL_Æ÷/‘§K2wy ‘%õ¶ØoOèÏÄæ–»Ðïk4&]c¶9Ø”áéô-[?-¦n¦„’imw}*–ì-ûuí;¥µà«@O»c&~áò òq,wxAFS©{ªï*¼»fI‹?'> |çí­Îd·4qz |7Sпz†Æ7Õ5­½šv›©Áñç D}Z©¨³—<#Ëçeáv™¬&çZ÷ƒm¼±‘<çÉÞ+ö¼Ù"ÔŠhˆ‘íjº3ÏF^*e¨SÁøá6^9¶Ä³txxþ|D{¦°:ÚˆVù.0Dš +a/±§Óº;àäBà^z´’EnœÐý†¿Ú’ÏÊ~‘õhûû÷ÆU¹>mu³ù‰¥•¨ þeeè%> Ʀ\„‹Ôá Cá¹?z/C·x›Úí*äðêV´$7@ &BááÞŠ·‹Ê_å;ú BÍ“Š£E™2R5Á ÄzRPÀÁ ÒáF`§ßƲÁ‰ÞIsA!=‹uOD=a“ÜÆ©‘¥ÖIỀçžÉ0º³ß^\ÏÿJ!§u¡•j=ýª)¯•\ÁŠŸUÍȬ2+JY¤¼;pÄÏ×{ ˆ#œG4!Ūþþøå+c"Gfë9Ýž™Ç2âÚ^’à O·aöŒe¥’î ¸ôT=è%èkƒ¼Zv6í®C¹%NL½6%†¾»ªð?7î˜'˜°*ìÚ¨©tã KßV:ŸÖ|àp …G¢ |zhèý!¬ÿAy}ÛWb’¥Ó¡ ‰^óÁ<-R0y€Ü™àZW‚>ˆK6®ÏŽx×½T‹D ‘Ü®£Ø% ˜M$ä„~•¬=lÛÆu©–ÄSOz¡°µp;˜ ¶l©Å³]mmA }ÎÞ¨G¥~©ûïË{SðË>vyìÇhkç éK©øP”~ŸêG+ø<änÀ¿’˜î_Ô(“?ñ”+gB¦J „p iA{^?ÂnÝŠÿ60ųÉ:Çk@ðÂ#}ÔEL> E µ”Ì4'Å“'×.Ø ¯ôÞ܇Këm@‚Ü|_ƒÐþ¦#U¥Ë}D“û,°÷‰Bá³óýpÆÜ‹b|,Dó½ UòÐæu—{*Žsú ”JÔûÆz¿ð`°îŽ­*d³q)ö3UÀ!(T6+rO”¹Q>@¤qºvPì£1«OZŒ,öa5r½L?+øî›mG„B—PúèáDcŸ^{ˆ»6ð/«|AzGØŽ’»Œqb¨í°ô„B1Ƈ!®Ÿ5Äeó&™„ rÔ¿4N@s>Úæ½ÉÁ%1?ýtÜçoL’1XU­Â8Ý0Ú–æ ]Ád­Æù[…oô6TÂ7•ðw9U-y}!'Eš˜JwÿHPÍ™œë‰K‘…!É'xî4þÊ!3<Á銴NèŒÔ&05lèÀšD™Û²eÚŒ&w/_B'÷)³·–Î@µ/TªÇ± ™m5õi³)f”‘«°¢¡ã_7¹W¡˜Ð:˜ô–¸Ýî„: Å‡BBk씯¨P¿*«º(xåZâñl¹ÄÇ>™€j0ð†H‚iZ¾üÜ[¡utðÓ úI1s{|N]ĹTû~ýÖ¥Où1Ÿ™X=í'áß—úRôyJ»àÀ ±m÷P=ï°ÿ0€Œª½ì®˜JÙáO³˜ý¶yÉÇ—2÷pÔ°RÓ‹××»»F)9¼(á²H+ºŽq¸.4ÕSãìS8—ÃxcT–J?USKç;²©¢c©IÜ…^Ñ8LѪ#¨ œŠû.«FŠÏÂïûðàc®”Ôx ‚çÌVáÎÈXL—öظ鲺û»na6-tÒuf ÉEáIL8êØÁìØ~¸ZÄBÒ"ó}ï7Aª«$`%.ŸèˆJ©:ÁIÝ'{™\kä%HV–Î>Æ·ý+;beÐ?˜5[âÌ×k§§Ú9ÈmÓé~BNØÏÉà”Dw÷3Èž&Æ É5j@ßÛÙðsdˆãØÀÄþ|¡¢J¥ÊèTåm½ç™|'«95iÀÀ/õLhÝdPQòíʧXã3¤·ïa‘;ä,ÙZêÕŠz×¥M_W€ÄllgŒTcç^i?G•g¢±bÍ×Ón*&’ô jjbuí !&UþTˆÄÅ r›P8=}-&(4öÈàÅ+¢Á)ù8:%»¯+QýOeLVŠïÆjû¶Ñ©ƒàbÁ¾]I¯uÚH/¿^‡A8ïEå½]þµª6tLiÆ\Mƒ_Ø=ÓvCÕÅ7U†mÀ”ƒÿúb…nsñ7¡y½aßZä”%k¸™=ÛP*Áp—ß‹`ëPÝ+RÔÁ·ì×UHº±F¦h#Ѷî‘Üô'Ä]ÿ&€ÔÚ7ÞJsÿÄ+Œ¨ÜV‹ï—x !a”±ÃЖǕ¯nÂà+HduúÜIµnMšÑþ⮪$"ªÐƒd&(e€Õ,^76x²tȲiM§7ûýé§í?5QìÅò±ÕÑÞ¿'·wpÀàŰ53ÞÈI°°Ñk¼¤>°þ-Ž_]¹aŸËËLÉšöB‹*, Y˜µÄ‚˜ë¹ã86r5Ô4,‰ÛÆYïpÁà“y'©¹ ŠÇ¡Y³2Á^Î;?Zݘ€@5Ýü÷íÓ•=…¹8Tc…‰Õ+¦ŒÆJùP¦ª:N³¶‹½®­ n̲QøN‰àP2&Wº3ï(s‚MÜÏa!¥ôÔõt!MØñ˜îUﯬ5;Ùˆ± Mf«õ †s”n<“MÍ×"þõÓóˆÆ»%1‡A )âyìãì]ƒ8ÔåYÙÒ¥ÍyHÀ_Õ¼â¥~ŽýªbÝæeX€œb-ú"¥Õ=ã(¿.ÆÊÇ‹»^¶kÜøüŒK=n.X~í] µÇvâ›ÓË„®˜!g¬Ùî<ÄüRýõ¥Ë ­ÿ¸@µõŽÛ$D䎴u‹Cò^ؾFí²àfËL‰ä´G|‡¨õ|ð¶´¤÷fIn°Ä#µ9U…å2¸cÈåXWþ)4eåy¾ŒÉÂSÀ¾¿›aøw¶Ôø@¬ExjÇb;`{\=%šOT©wAœ½Ýj/1¤ÇsZ|m(}Õ |½DìˆÌ.ÇR‡œØõØýþpœ_‘æûÿ3½~¨ÜbÎÙ¼Ä,J3ã7ƈKåèEä(¹ÛE3Nñe8ôÙûºp"ê\!-xB´·JÁrQ’v>…&ƒ…l¼pÖÅr޾‰„3ãk-Ãݦ0´™ã®¼àvNÞOȼ›£³g.FªßÀ´‹¨Yi}þ>X¶üß T1º°×²œ%DRëÔòŠ@p“–Ų¦d¡wU 6®‰-Mê0-Žh‹;>ÚÙRO„EÄQÝK'YâVñ„aPE‘–lâº~™=3ÌÜ9³¡<]Í@ßø #‚û)DéÉ=-V;Q4äEŸHΛ]è/[cœ‡ª1Àß\kÔj•ÆyvS= w šÒEbÝÂmQìˆõÂì&7Xç<7¥B5¨Rß “¸7„]{Hš~Jºm‚>wã3ÀËnW„`P·Àï/Þ¢¼¬$ZÒ„D+wM?¡«‘œÖòŽ†Ð !ýXJìd´ D^´8«z¼ŒîšëQÈé‚£­¦ƒ|ÛÛ;è$|¦yB¦ˆ×õ: ²lËÕngH¼t³D„ÉwâW™08¤ZeWE ¦ìÃP(×ÈÂÀKÜV%°(qw “$§¦_ø(ÍŒ3¬ióÙOß3ºðï‘„„¢ƒo+³BEúžçJ™tuÒÌ'†ºø©‰Œ›ÐJ7³ßJ‚d!Î „Ÿšê‘r¾e5++ñ8W‡Ž€Š–‹Êß´b ­V²ªtÑMŠU)ÑÃå#ý6oýVM}‡ ðC­Ÿ±©]Û²…›†, ùßooH•·o=èV“™h:èó–”f¢eĬšOÇ©¶¬íVä—·Ò%f¸›æZJŒvI#?Ÿ·I™Ÿ» Zí3Ñyƒ¥¶Óù¤âTýÐG¼6E[xë3Õ,)dûJxÐ ©†ùb¢W^¸ é<¸à6êÒ먚S\Š~·Üi¤+>t|q† %ƈ—Ý—Žå@W·ÍŠvXZâ^›2çZ¬È?9~m(ÅíÝðb…WXÝÀH"e/ßJ*^œ:I›ûŠØÊÔ%<Ì1§@NA-${»Ô¢˜ªº:©Í Z$¡Â3E.Ë×KÂ}eZ)'ÂþûW$éÕÀ°Úœç‚=ÙW%ÙÜ«Ùê+ä8 rn×ÏçC@ÿf1áq´ädOÙ3Þ‰÷œ˜¹2Ç0Ïâ“ ¶d™npǶÙÜ.5_‰eöp% Á_ó¤Ã p?%â T€«ÚÛ öºö¼ýÌ&m£µ•êh˜¡ñ¾RêÅî:ÏÎ3“”ºóœ¯y»aÄ~ô Ayßì^þsÃR6΋s¼0¾"»dTÊ×®Ö€»Þœ2¶£÷;Û¦+k#ÕN^€'€¯H=Mø‰ØC¬²½[>Ù˜ ¦$ŒãÙš”Sd™ µþþæÕ ó¸)"œ&UО麼¡P‘½BS‚pavLv ´þw Z*ºÛÛm¶7z`}*lß¾Á€°¼âQlÆOšÂoF˜óoâ¸å •@A КE`” ˜‘Óç5‚”½¢п]“QÑÆ8þHjgÜ¡ÝoýÂËKmÛÆ¢’† 褵ý¸mäÈk}b뢣e¡m*àØ¤ÌhÂþ¡ŠÕ€ÅIÊ‘rïÊOõp¼j´ f"È]Ÿ"n|ñ@çÅÖ¦­ûv\†ã$ñŒ b¢r¨nAªÎà{éÏa?B{ÒÕà{V5~áL´©{â‰'{e-±[›·a" fN…ô¥¹€Fµêíox®ù´0níê~"8k¡ë¶cB¨OZòet)xr¬ç¶WƒÕ×þcyäмyÜñÉa oOíi¾y1Âì9©’.×è·øjg¨F-5[‚0”ZÔU¡ 1ãÅwl’žE™úY”e{˜^ÿ“ްÞÇ>¡Êe¯?A\þøG¢fÆtô¶üÄÉ2Å3{,éÊýum×ã¹UpKº)WꄎÏy^BrálEáÕá©«[ƒØµMÇp¤ ùJÑ'Î:E,€ÅþQæc§öV©ÿ»oáeŒÛ^¹Ež&›¬LZä´wû¯e„'Ÿ0Òâ6…ï© · Úh¦®ü?\ª›;ÖöŽÃ9§¹ô€^Z4+­m={6öO„U¦ÈÌÁ©¸œ¶!$“~ž§†L™ˆHý‚*Çb®$UÒ"Bì¥MnÏv¹èó4ÉsnÜßëô5Ù%p¯Žn*™­Â./$¡e“¿7ö;wâ‚™mÞ›IΞhõã/eNt†*êbl“Ä}ª£Ey-ó]Îk&¦ù ílç+W{¼Bá™iæµqû,i€óûNYXVFù3$›:U܆%XSMJ}ó€zkÖÚ‘Òˆà? Œ”ìò[Q™:֔㕊5ŒbêRx%Sh¾ØäXy¢ðIq˜•ÈÙmj­çŸ{ÑßóŸÙäcyÚ!º*Ã÷Ñöˉ™­ÖŠg¬’öÒ5M аž¹)AÀqýÝ‚µüV NÒ>\êxO¼îÎ0©(ÊPGAD'†æ(–åKë«Þ‹nÆ^é:CÀ ì~Un–j¦£Ú¼[ü’¨ã'Aj8s2Ä#8e®Ðè¬+}“õSëó "Ñmf×Á§£õßÆÈ †6¸"øÖûE´vTÝÏöû‘Õ“ï”>š©Š›ëW,ǰ&÷–“å=‚®»Â¦º’üòñÑ$Two}4øó§¬8=PÛîÓ 3J-4ú…¨_‘ W%xO*¤wñüš&"&Óü§ªdœÑ¨Ñ@h1œÁE¹ QϹ¥Ü _!#Õº"ûßµ%‰Z?\Ö¯nUŽ™Óݸ/XÐõ.^ƒbÛ'j%ïþ^®©Ç,³œ¸‹£Na@@à[c(æ´ã5ò}QÊì-sÝŽ>ΚpÆ.§-l¨¼3Ñ$¹iúÂòì:ñz}ï;r{-n]}/74t»Ýæ¦8§ú÷BWÐvõ¯D„óJ‹ÒT 4 ³¯Åëÿ/9ÆŒp]±é×ãÃܬ¼삃Ø"Œ7ïh,€×¹wÒißéµi:f´aW¤ô¨Â1ï aµÛ§¹xßf}c Y0Ò³Ùn&5:Ýí©ÐèÝÖþÂä½üGùÅx avOÛø˜ÃåÓ8"™„=ƒNZ(AQ(!ÝLw>Àf¶9–U•YŸù~s™äÅöˆp9|å„_®·5)Ï)ÊGäÊùÞ¦”Û••O&‚tÓeÑ”“ù϶‘Û˜…‹¦åg˜´©GM°! çzeŠO‹ õ 4)´øw如c¥ÎÛb(|Q§ÎDø[žÅÛŸ5¸<½ûÑ ´¢aIhݳ,åõ/‚$ÝãŽg‚¯þ \T)ÓóG€½û=ÙõfÒÆ×µ‘ß-à÷  óºÜészm„TÿÓÉÜvÕÐ;âe >ì5*4ªôPV‹6;f@Ù5ç”Ï­Ý àéVíóÆwÙcª´xÖù*"ámLÄ:±ÝvAÛzuǽÌcáouÝw"Å$´€iZŒ=Üc½Lo­îâÊØYÔåãE“õì\>0hp"nH,®:#ô¿Ê¬,ù§=2VvÊÐÝ’£É«“õDåĸÎrbBà¦9¹Pcº‰¦ùü‘㎕F.q l“ú™¿ã­âßÀ Ó½»Geþí “\ÍLŒ…ƒƒd0¦¶`ˆÊó¢Tƒ'rç"¥:_e4Ó& »aN–iŒtø«ˆ©3D¢h>»™ÃÐQ©"$Aùðvèñq§ýþ #Ƕ€ÛõÖ3}†ŸüøÉb2 ˜M¾yÝ·ûª…fåŠü/ñYy–7ë&j¯xßT­Qñ×ùýïñˆðdb©ªhñM Ç)¯ÀŸ'¿švr#€çG•¾£Ì(‚'Ø:ÃF{Š1yòøþT";©öœZIR£­þ¹ÀDɾCQ)Çe„'Äþ“Eö†° ,¡nÄë_=›×/ÆšÕ‡³`'9`… bõìÕ Šä5" —j(q¬Ã‰˜(Ì6˜[åÀ£[tkôÀ‡d¶ÜlÑÔiQ;5øÞé3ã[­+l ý9–ÆP?d!‹/µÈú¼zÄãŸ,|mÿë„̳ÄE–ý<˜:@æ>G ÙK(ε©\çj ³ÖeÚÕÄšÉäO:Ûíƶw^Íš.¨ÒôD,²öŒ/téô¦¤Q$ÐU8Ûx•W¨–Oé1Ÿ"hoÆô "¨‡Çg©‚Q´ßÛÝÍå´E‡iò£ GO]:Ð*¦xcÔñŠføÙŒ‘iÆLÌ•aœ«£§O©Ã;—;õÓ®Ú壳š´Žúù“Á\î[Ý2‘Qð ºÄ¡[§Œ*n&LÃð™ßX €nÎÿu¨‘Êg±Î’¡íÊæˆ¥?ó”r¼šªªê†ÌÙÇj18Ö—9°µçùÎÔôÁè0ˆŠ¾Òæ€ö*#‰0YãÌûŸú(ÄŒ‘å¼èˆ.>ò‹êi¸ÿ̃ÙÃÐ]Ú“ö†ü^ŽR=¼ªë_ÆÐT½ƒÏnR=Ô™nÒ{#´*×÷ûâÁ¢ïšðç+dŠÈ,qbŠzYûJ\‰ËUý¢ˆIÉ3¯”°HwO …?Ó¿“Pt DÚ³k×þ-~ÓÇ©V˜+Ã…$~™K@5NµÑÿÈ óÂ"Ž“r‰¢§ÀþL—êÖ—–EõЕ·Íà€Jˆß¹…¾âKbÇÆˬ¤Pé3Ò~DF퉞©1™©Î¾øÏ¹¾7s?8þ@,Ù¥V‡ª#®.jð7F¼Ë:Æ#ñoñ 8üal;gmĬ͟k!—Û—"ùüá_Û‹ìŽ~%"U™+_4Ö%êc~Q›¸/3…ž2ÈÄVÍp\ÛQDºPÂßUò.I-œhLŽœùRSk„oÁiiF„I÷Æ'ÛñïóƒåY›>a]Ù)¶L9{f¥ØÖxlÏߦöÚ“ú}ƒ2K!òÙ:®s½ÉHêE-Tf¨™üI2n÷ j¦ÿ´¨ ÖÞ±±~”pøºŠ½¡Ü } ñotÀ—uùÓ.Áí@¹YT#›~ÿJêB±6Û[Â"l9"¾FGP>Yâæltú—WÀË¡_T:Nóî(cûhÌ9€Ãì.KÆ”¬|à–j6)4º¹¨A…ƒÓBs”šê2¬µ×O÷þ\Úµ\ílNÙü·¢£œƒØNZ3O(Ni=?¸`4äÚn†ÏÜùí8ÿº¹ w¤½ ¥ÓßueŒRŒ|ûEp¦éüS¿£‚㩽Œš´æej œÝf:ü‰¶K…˜- Ýu™|ût½‘„I5Ž•#UVQëGO´îjâi›Ðܤ›™d: -ÁõÓAÈQ°eb®(Ö"&˜\™],žÀò´âkÊ&íÐúÉUÝ‘GÿÛÂçóz³GÐáï˜ –6™]Eб€bwÐ[w/UÎ5Ö„ö¢/®UÅ¥I#Ì\múfrVÔ"°ÑïÍbÕcÁ•Æž—½¿ïâʶ;¶ô¸ ê…9×÷÷¿«Ü]ÞÉÓÚþQO™2¬mÿ-;½@EA]Eòe•ÃCÙäÎVžý–{2äQ&¹}&ØÛåÎyý”hbAq1qT=6þ‘’Õ‘`®b_ ×ìÍgh3›[¡n¢)_ J~]e Ù¡®þ'ú±¯ÀÎo—ßËåðM-ÜF’‡­šöqAÙ·hà“hÇá_}ŒûÂ[]TùþÀÚ&bV,Ê1ÑÊEA~šna%]`-d ÔÙ÷¡›®‹È]œÐ­WUS4)bàlÆ¹á§Øà‚âζ´úÈ$6Xh½#(ò…½tƒ!ãÞé­_Ï'Gpjqx)$±}¡…å1Õ¸4´øÅ8J%dM¤GQ…~+eŠlí¶ëȯ„Ã>îÕp•Û™J+ ðÔ¸ð#©}sÙÄ'€ •9nðˆJâN·[©üT Æ#Þ8³k¤Žö*(3°qgcVzd ]‚$Ó É>H¾‰³­ÀY]ÙÊÎÌVöJ,ÐÕâš«ȺAì@OÆÅ†Ž“©=ÞídzÑ^ÔPà[1ãCg¡yQO¢|à÷]^9aþpöš’áe}WÆ‚ãaWhè©#Áˆ¾öÀøûûQíXz4ËÌðú¨½²úl3‘)ðÊŸ¦×äÓæ’ñ¤!|ïŸå ¿Ñó£@oc,'Ç ,Öpô2P7ÕàÇ8ü„,Ÿ®`Cc»ÝÙ¯¡‹}N·¡(MjÔÆiòmK­¤tÄ ?,ypòÖçïpÛ÷ž4ìÞˆAúÀ˜UãbÏñ«Š7xôÔn’É%…b\aæp/«Úо™˜ “²Ö‚?vd¡ž„u¤Ïô'N.-œøWP{3ù¶î…aŽ.ˆÈïÑ Cf¿Çárª™ÔVµš7M¨|ª}½iµúœ˜ª+2¤â`Ü#@6Š©³‹ëÖA;© ‡ÙÇõ¼›&…w‰Vm§]¿¾‚yëQé´™û ó=L%š¨N0#ucÓñV¨Ò+ïôñ«!ÞzêQ]ØîWõ‘?^7WF®¯¦Ás[-Ì8W†uM„¸’fPAù d¤iQçŒÕîc:Jl7Ù(*ñƒrökÐ;VGh­¤‹È‚§à2=í]€& ÅnáÛ©.à'T!QõžÓ`b†S¨³±C‡•g"JðîP,bÑ1ãtâr¬¶Ã²@ñŸqfâðü¯6q¬·Ñ–±V±¨ì‹H$›€(¯+KÄt:ÉNo¢g”Fíl˜œ‡+€¥¶Åæ`éîý®¿{)G€ØMRù =T71Þºˆîk¡ÇSluã5Ëk`L?½HÒ‰R¢þgf\Ÿ0Äu'š,ã?ñ¹ú§™|•­ ¸8qõ¡}-Lën“‚Çõ˜Ø—–¡Wü:»|ÿù *–°$z)[´¶I>ôßüt_uø£n¾•{ò9Á´k¥Òƒbs5ƒø†¹ ep‹ˆåà/úøçÌ\ϵ•t®øž´owmAšƒ:yÝ>”kôšÓŠc>°òù¶v&"P£®+Þô¾a4,b¼]“F¿¼F%eÀÿ~“–T|ÇÛ-Qú¢°c–Îýwö@Ø„Ú ¶£ˆŠ0âÜ÷DîÙ—ØD’ÿgï³jü' ßZ¥á¬á_<]IƒïMƃ6?yþ–lP´ éÜYó¡P¹ïêOÆá—–ºtã{ŽJÐö}¸e@|Ej Öò‹ å¹Ô©qCÛ§c]>‰_Û7¾Ù+Ú™ö&k¶ñdz1j; Öó§˜ÐÇ—{Ê<É6gå§’Viã&fï]núåŠ?¸®úÇ¿+Y¥eÊåiø&åLµ7­Š‹¾gË“,³Ïì Š8 •¸6ÿs»nÉÎÏljÞÚýfE¾t£â‘0 ­<¢jti„º‰i©yÔ®JÜ-¯™ R6¸TMY™W¾ëÝ«»Ôt郡¥— …Ô iRLæÜO~v¼h¢«ª‚õçt­ÏDßÏ©'u¥yö)ŒYÖF‰TìÕb$Æîå—ÏZê„¥^fS þW «ôš‰Èº n0¢yƒ$˜ “bC&™åžPb=õÀ ôžhÅn0õ•Wfª±¼î^ìÇJ|ƒ­·h@//©¤ÇqÑv‹ü*Åâv_Ö¥–Mjt‹@¬æOõÙº™•ñ"-“—gð3 pø'î­•—™ã¾ÜW$Ô l´³h½;»ß™ À]hxïs<…Ø ‰‘‡ïvT¡Óð¦¡V®,ƒ’8I(Ò¤ûJ'ò`‡þEäÔyS²Œb—zaþ®ÖÉàR^`xêw¶bûPÔÓ~—ü…Þr«ú{ï½rE Ȉ—(áþ©IæÏLéËüaLþ ×2»nD>:ðÂêîçŽ?ðAÒYÆ)+¯®Õ›xú®wy1ganTz㆛cx[ :¹gS–4ÙŽ Ò^_šú®|xu\‹7¼Ð #|f™<¹µ­ìª/ú†€ðcà“¹žû›îܘ}ìî­óƒ¼Qçw8õê7@ŒFc’—Ï7+‹'«-¯©Ëšyêà•Ü(¦OØ¿Ž¦íH˜ ór‡WDñ’Û–/§-—Ö<²Í]à}:+0“7Nÿ{tR±§.ƒ™j¡*³[+öpm/ à…è{œPm'j{}%¦…×:~8;ÔÃðÆ^ù&PbIF¬nXÛ»«³OÑ]Ͷ¶œn‘ßb>{¾ ¾äsåú‡)WÜþ9è¦ʵÖÀy‚v˜H7ó…ÔQ»Žg•ô5ÃÖ–”»;AoLÖuŠ_6œ¼[^©üƤÈyò9gNf7m¿ðÌ(ÙûÝ6ºp;ø;ô;Ð×zw IzYPAí°¢„L·Ê+¦‡M6Çš‰µ£j¤º3ÀªŽ²Ú_øÈK¯‹óþ¦@´ú®^# –Š{-ÿÏ*eÑ&H—gõáј*¨3”$Kr»îÆLÍ(·Z3î“¿r_ù‘”qÅi çÓ^@NÏ›±|$—F ~?[㣎oì˜ÄæõÅʃmÇx5ìýµ[3¦ 4ƒËtÃÈÏ7 Ö¾õ/†®B·&.åÎ;™ï/>EÂ4ˆ‚—õv4® ‚Èlršÿ7Ù >Qöý}OÀçÝ?s$ŒVð âTàz?Gñ;˜ïƒþÃðjSä™TÿØØ+'å•×+Ù&ûž Ÿ(Þ>™–L ¥>@ß¶h YvÒû…²U<ÿ1ô#Lç†êÔ.nØî/Üb²Ìü?³›ZÁ<Ò®¸Vaùµw¸–ì>’¢L^ù¯xãëåÿ(=ÍVa,¶Ì[‡d-0WG'%½"{|¥<•øzÑ»WD£ƒÚ™õV”ÙÕunA(î¤SQ3Ðp>ÅY£*†ƒ:MK8¥Èêž#S<é)‡’áEóþº„f*éiŸÊsB@O—.j˜ÇÁGóÀ/H:­ÑrHèüj£Ô£ç žì¾ýµJESDsÆæ{(¤| GÜyÒ“!Ë*ü WIÂ@O®P=,]á+ö8‡f1®­¿§ÚÒ¾öT/?ÀÏIªvOkœ¤sg(­j¬^ˆêBf ¯c{X{m/‹ã¢Ñ*âƒA¯¸}I%<9• ¤_!_X¹8Á÷ÁÁ?Œ“Ć6ƒCÄÿ¸nx¡ —MèkŸ}æMÔbKןžX‰?ô ´Ýr}Ì­˜È™Ðا’\7|aw\ÐâÂtIˆ‰;nÚþ#[üÝ$¡@4þ- |M6ÏlL6«™¼—¸¾ìa‘¦~ Ô5ÔÊ¢Àøb.tª—ôƒÅ鹟8S±¹&Ð:åïæÜúÑäo\zÑBü…<ƒËÏMïŠD±d|Á]E«‡¶æ›aO5ØJ«Á–0Ïg7B·lú=¬Á~Uˆ"€ùüϤè°ÉÔ›Få?ЬxI&ÌcðW¤áüBT¢Ÿcµ#Eš¯"ür®PñH»N.çq‡šk—öóîuðÙf®N3}v^s&ÿâ,ð/Ô|$ðs2ùUŒW¯rDØÃ彤ȄéþðÜ-Ö7o¸ô–…ÝuÑ Š&HÁA GS€ÖðŒ=!gˆSb!oÊ?Ÿ¦ ¥xj0[o‰BKQ®íIW+2è×€@T–#Ü l¾-hxýtXwV² °#cSXéIƒˆTžyÎ÷NÌKþçuÛm 0ŸV´¦ðƧg™¨³¾êØ’‡ç0!ÊKk·ŸQø†K[á4m&ÒSÄûlHD§1 [ˆ¿3“Nž›#¬¦(—PBçß\v‘bÂHäòTp«i´†Þª¡£•Óa´À2”ÑnÓ:;FèjÉ´®N9¢4’eùrj_«ÿ¢yd+€ß<:!“}õ^3]FŽ‹!F€úÑïÆºÏ2Ø7•%o¸+NÙŒðÚ•E¾²•±”žë€³µÄG\Jƒ„â1È@<'‚-)¢KÚ‰eã’5¦äU¬f¶Ý†*TºïMA%úB;­üáeÔ\XÑhï¬ ½´p}(÷ ÈYù®dÍÀÑ9d>ÅÔ2Ivçz‡‡¼m·»| oY,rX——-d óßywxŠÐ"å‡~Ó«êE3F¦çÊ‚¾0àK®ä© ©ŠëÖÓ=øëVèMôaÌ9" HSš(@{üSÆ‚oìUŠ«wÀÅôðB\é;ÞH20ëºñ7†—B%Ö9m%ÆïÊ+<5Çì\ð•½ÞY'5¼å[giºHÀÚ‡¿=ìJ´ÞõÊçå¿È²ç=_Å7ÞÍRÔí*t‰´Psúnįȅ ¯–ÕSÝRÀàVa½†Íïdü+Ò àIr`jˆ;à tV—’ÅŽÚ’¯ãP‘zµ•Ý@ò^£‹Ð΃­:wÜü¡Ëô뎚µµ¯ª²“í®þL ]¡™FJÛ`Ÿ'ªÐˆ#_ˆ,¡â GVw«èah|¢ Á¡×Â÷f ¹wÚ;½ƒyÔ?b¶v´Fãåõg[V€|¯–- d•’¬rjd‹xUè´ü¨éWÀuujéqP—æ‰wYÂD÷¬}úe¥[Ü? ÍB!Š«˜ áŠSÖ%¹þÃôHŠWp& z–€ÚÓOÝÿtN®`Jni±s·=TãA'ꓳ²=‘Åo®Ç~Z{ q¼¹Q–4§›¶*sùøÂÛU»úô^: ïk;ÈÚ#!O:­QÐ&·Ê®5G0ñ­CuËÚg£k¢¢_¹¦bãF°I,!Þ£Ò:C‘×›Ës„` øXÇs_ûãψ‚~L)“—ˆÏÅr§¡~(³vïgͨ'Í,¸ˆ¬)Åcj@¤}o÷‡I?€ƒ¨øi¥žªð˜b /- Ùݰ.8f<êÒËÈ[@U¤éŸ\Ž™Î|o,Ø£Y usÀ<î=Ö5Ü"äºmC-ü¡¼œRè•x%"E4üp’µMÀª¹Øôâ/ã]M„rv[9ª­Gªé;>"Òe‡yðÓ]å½&ªš¤÷zbtãDqŒDX¦^ÁÚŽ]¬ñâLŒÃp:䊺á¾,ÊéÖr|\÷æawLšâ…J —ú}?.™nPòåsçÝ4 Æðå `ûÿl×Z­T—X‚@ï?kÆYwì†8ÚܸEÜ3‘CƒZâ J©3½ÅŒëâ·5æF¼ù#1˜‡© ŠŠ3;Á ¼:•’Ÿ‡ @– ifê.–! Á¥–sÑ!ZY‚­A\RÃJ2Õ¾J0Ÿ•|B,—¤Qd‡p ×@.˜œ…ÃY%Ë[!›²„ ]Ïjú¼‹SMHB;¤æ‘­¦|ë„ "ŽÍèj³r}ÅÏ©3ÎtŽ”¤2$ò•$»¹6ØE´˜+é… jp]ÂieÀùyÔÑ>IVÃ’ùÊà~UË¿øÅ§Šüf0a/ðÏ^³º2íxë ®r!"Ieô3T±<^Oþg’#ÆFP«ÛN*‚d•GëŽü${ó%ü Ì×ÏÿQ ˆu(÷4lršêW…ŽwæÚÜÌh¬Ï¾o»Bå=­L·ˆÇìÝ7…ß³xTœ›CåN ÁmƒWû'ð}Ó{AÒÒÿhÏ“óf©¤—+Ê6_¤ºv[èûwßÄ#X^ŠÞ7­À'2XŠ“>ŽÒÐ:ïÔZñ8줸I7düüO#­âodD1ÃQ‹+[c %˜'lZ‘”óŠ¢9†‘ibå•ò ˜ˆd}Ö}KÕ’¸Æ~j7·è!b3¿¹edƒÖŸÇÂÒ9ªN‰¹aˆßìpTÍlØ6Ðû‘ VþÀJj¡ÌK&HÑÝØ0ÚŽ(ÞÉ{i*ë~ÖÚ›cØþ)¾î•,[§SªdéE’c}†hQ‚—1Z^ Ë{®×kšR!jêõµÊ¹ÿK>ª]Ë©‡{L´ly±¤ˆ>5sÆygÂv_LÛ™¿Ön,•³K¢Jm¬ a#Å»w< íÒ²ÙÖP{üïT“ߤ™m.ŠS¯5ìkçZ&¹yqü<ÔÒøsŒ tCnY#’ 1 kåñê8|\IëÈæY‰®kd_®õâïÕ ¡ƒôÝÇfÞ/7Ó¤>,>{5[Éâ^Î_ÝÏ }ÁP… ºÐ’Údzdˆ`¯)9Ö¡wB…ßûñ !ŽŠÇUùÑZG¿ãdK÷ÂY¢]£ 6 hSj<œ¢˜/Ô©B¦8_Ô»e‚`¥ü£CŸ§!üçÎ9ÿŠc|ýŸVÙlÖÚäœÔK'3^½dY  Ü/¨øÂiÖSÕ @ò E@ 0uB 3=ä˜WØ¥a Ø»äªcÖÛÒ0kËGªïv:a'ç§—ñÊ»àB4v„žøtZ»wè Óá ± ¿×z¾ªžºDǧE'GQ;ªE~$Ï0IÉPÚ#§ô6ch¨š™kýuÆ ‡nHX?õðù¢|vPižÁ½l„óFÜ®ƒ˜£MºZQ”%cÓ¨GË78zê‘^¯×(o¡«îQùTž=‰g»“Ä| ó])‚ÿˆT!^ëÉ„–S™OSÔžp $1åç<®ZˆÿO©³‘ÓZF»‡N8¬fÑiÏtéø ]äíJ¿`ß®[Çæc?z0O`Ñ<õ0,+ÎÒ* Hh.e=—†Œÿ¹­Ïîd™Ž–|î¨ßhÙ{·¾ª0<TVÿθ“m”Õˆ=í9:@}§(8Ü YúÝöÀl‡Õ8¦‹bà4ìlg­¡º[Þ P•vÆY -L¦Ä-ü.+.>%çÆHÞÌ„áÈx€¸eLQÄw+Tu•­mÇO(?½wíòz+3!ÆÙœ4ÁCtgnCCÏ Àgô)n,¿kê×zzh ¥Ìæ·þÄŽ+ Š‚æ©ø4äõÄò䱬Œ×z»ÀNÜ9ãÑý¹±KPýʰÝa"]PzÂ71ÊÜÅŒ N3ß½Åì=í®†Ù„í¨àK2ùcM%š_’µ^Wͤ|™eÃOãÜ ü%ayp\ò«EjV[h%U9ç¬YF‰8æŠfe2§X‰UŠ,Î$eøàV#P$—EüϾ¸@YœÌ3{ª5Äúƒ|Ñmœ´C{zyÛ‹¨mAJoÁ ¬Ös¤öXÓ¸y5K=}ö“R(œ7'ï.IУ[~höÐù RßCPÀ}iÁ0äšØ¾ßU[n¬ž5пÂlÎM5.ÑúmºÄ‡ql”ÒŸAQÊ„ûÒ· G¢Ý— ^¤þÚ‰–H”P -Ü)¬SéR‹ÙÆ,8÷Åè+Ҹ“sá(*ÅÀö$öæ(+5h­ËÉDC-ŠCä¬M‘N®>G‚¡õTë<;9¯·„Z7²[ÛCmixxk¬Î5yW™ÁêžàúÔºfÑi¢Tަ¬Osé)ìbë*íævã›hò#'}~|².R5893›q_¿ü¦Ø nUµ¼ˆøHyz.¬7iårÉ…¾xÂó&ðˆÈWÕKÿ¹{ë‚a·UÙ•„“áø0žôu+²ðQ{š|.~©ÔØlØüôZ»r$¾"½‡&Í/sȾäsÕ%F³\D±›œ[É 0Éà±ÐOà¢"î3;¦ `dK>ŽJ_¼æs’,´<’4qñÊ–’ N1Xñ/4¯8µ Æà¼ýIÙ\Õûxvу•S0Í-¿b…Ëåhå™ 58ìÚD?Ü¿Ÿ¤®:ü Ð{ cÎÁº»ïøøhìUÍáè½r‡ˆ,ùxî·×£¢s’Ér¼wÇÃrúŒ|uÉ LŒÏä+T¢DÔÐÐþ{ƒâu×ADŒJŽÙ¼ø†ÚËù^‡¥ãtÑ^ï$þeö†¿F zsžCJßõouÜ› \þD—JÒ Á÷Ь±<³@DZàb€¦°ð‹ºˆ,{ “ï¬ïë ë}ÿeS©:ýÄ#›Ð6OÇ—0ìc ¢ëO¾œ¡?áQˆŒ±¯µÁƒTbÙ¹çôfꢂZƒ>¡.¾šGyì€n6§v‘òÉëd³ V,Ëžƒ…¾áÌðéÌÌao)ƒÕ>é3»]ìæ 5¯þSö˜Ün÷2Ò|uÑA“ßй.ê¯&¨/ØA|@­KÁÿƒšy¡Óž,Lï3ä)éÛert*‚“†–óJ·ÚaV­¸i8 ªdc‰"gÂ&hT‡)åâÄfM¯²U« îâàg­ÆÃ^».}™¥ ÷/š{F#ø =†Ãîâ#øÎû$ÓQV¡>tÍ¢!ßÐ…úV³3ÏEÆfà¶Ï- è}nª|æÁ @—× éF¿!§µ}_Å;ñ àwáo¹=iÕÍYˆÀæc¡Jß•ÈpÿÊV1-öXCs^íL9VÌö‚låÎQK´kŠ•%ƒ**ÉæŸ$‘ u£‰·2Ã2+…¤õüI½Øû÷d7ÆŸ¢+.W”v0{í$P‰”mÿ{Œºå~ ¼õ•¥9óœôe‚@‹É<žùJ®âoG$„/‘üwƒ¬±” ‘Àñ=tp¼}KÑœ`$a²Ì{.зúÃl½G›FÇ¿eþ„±£kœžS1»X¾†WËÝ™ùÇŒ•VÃ0z…vˆ cÝ/ÛÅá@}Ex‹ýjØXR¼P1cÆØ*R5³÷óP£–°¿4Ðãê”BÈ—â§LGÆŽcFÉUý¯¯0àh5úOYznäwŽR˜×îaÜdÿº+íÁû¥£âš^ÿq`+f4©>‹+;ˆBÊ.â’É øÖ‰ç<£dÄnoXcàñ$e$žÃÓBÚ}RÜÈN'±®Ãèí¾l5’ »ðÒUõ°ú¸^u4pù%î× gÜ‘UYílÔ‚´¬€oÔµ×ÈT9=ï°Ì4úɹ˜wïÇZ½,É‚xØÃNª^ðÓ£†¼z±Ç¼‘N>^C€S7ùHñ|/I›y¾ñÄ_"HPª9mÞ=®Y³¾­ÖAG}ï'â\¸…Ÿ£u  @ÄÎ}Ѻ «ŠîPc\•.ñÓ°·­–nÐæÙrˆ€;ƒá¢‰úô3ÒƒÊî¸Ä¥PŒo¶N ø µÌã°Pn%ØDH…ƒ©ø¦%|ÖŒ¿/w¦V‰g’7·ì;¾ýðBlÛÊI€›¢1>Ɔ½³õËF´¢ÖwÓA\¡ÊsöÆÎ*‰+í;höP\BÄÆó© ÿýMϤxÐO¾Îr¢’Šù £èyUÊüG”•Ëï‚{­ÒÃ1Ë{˜ßl”»Ë'AðR„>Ü­I¨L ­:’›&S’:]®œþ¡•SÇü_Ìù©õ²PÒ3üÑ‹ÎähPt˜y¡„ß á+ÖMñ‰¦6„Ûî3´ÈÔó»àë]H»T°8 ©¨­º¡jÄþ”¿ýßïk¹•‡BFtè®"줬˜¯U[X¹vÀÌÇn%RÁï&JQ‘%¨g}]G~Ïû”átD“›¢PÒ!žh“ébD öp^’I¥hiª™Ë4´{ʼ%gÛà¼Ô‹ª=Œj„Jqº9OL= ŒñŽO8V)®°à’zÝuÝã_éI­Fȳ×5¼Ø¾cïzÄ wÄ—TF|$âunBÏÓ8#× Þíí¥p;¬N•­2úøŒn‹‘EÁ·ˆ«ÊV&ñ~§âu0?ž&·¸ŸÆZ=!pÏ‘JXSêôJÿ-ðì[£òãðpãFTÕ€®Þ~m–”B —ƨÒ×»íD"._ž>FbÁ]2æPlÛÆ{eª›ŸEóþñ–KÊŽDyJ¼_• uyêèn_‚œæP=­¥éÃfV¯ûØL$»|úÒ×vÈwÚS=•5„`Ü)•(›ñ¡c3í¥Ã²p™àü†¨oè¾KŒ@îE8u]âoð¨j¬NRX-Ù¦Á-¼=sèØ™®áÅŸ·3˽šç“¶¸z!f =úÄírÙ;Mœ²×c ƒŠK_Y²^gíp´Dí±ÑÒ|„LÔñr¬©Ø¸V°¶!‡Ž¥ 5lÐÙ*ZùÝEx6u×aû>q#)Œ\ê·ÅÆUD–7öWŽ Ii7)rÞ>T¦s =*Ûƒ*v |§žçRÅ;7TVtÕY^#‹ßtéÙH”ë™í^é¦Õ×´¹úº—l¦TÆïs¦Ñ†‚ªÀ¬„“Êé䤀Ýq€ÙÈ(Ùú;RºL0…ŸQþfu8ï-C4}ˆuåA´[gÙ=t,D™‹è«ÔÁ¨MŒÄû5A6÷u ]4SKŸhœ13<+„\Í«ê­óÃùdCj6´dKŽª<ƒ6$Þ}îÀ5Ý»›¦ˆï ÚŽ¹µÄ˜jê?‚ð¯>¦ õ¢b{«“œPp;x­M+I#+ôæ¤äX¯¼A(·&dH™»¯‚•%ˆæ~¡ù 2OË xé©©¤ÈEFý¡Á\Ýâ¶ŽÖñÈ‚AßäÜÿ@v?¼ÿOP]¹”N)¿ŒAP­Ð‹¥VÜ:† 0DíjJŧH¨ÍÇ||µ4æ˜A8a á äâ¾ÎœLÀÖ |û) ³¡ ÌJíxOd²-WFm$³{äb‹Ò Ýqæ6&Ï÷ѧC˜TÞ·’9ÍÄçÒ@XƲáyj& 8œ9SÏf±[±ÈÒõÂ6!¿ð+âs/Ævô¹nž{›Œ©{!t^c˜1 Œã]›ž|h×´k¶ïÙM¸ìêÂqjA;Žm¦´ÔjÇ[6ᡳ(Ãçö: Ô¶(ú$€ÐR# ºš»_­ë+°¶£€2MRÃò…îìÎvý²åšÏY0ïØŽ#ã&Á^Ù‘/VÔ?ÉnX(Ov"P òˤ~rÞp·±„ô‰‡½È=¬D­¯æ+ß[=ã9‡Ï‰Qyî O¦Z€fK›ÅÀ‰ïdYÕÒÂzÉÔJh#ŽË®ÀðcžYl!nû$-„¨¶—KJ×âW~‚õˆ©IÊ„ càéÊ”ܽÁ–H!uldêzˆ*`U&›&vЉ…Hµl½º€ª_‹;I x8ûîàßÀªêÒˆèû®-t㕨Ä£½ô¯Ã^À°2õµ©òÁy¡“S¶G'F´pÃ]`RWÓZý‡<^˜xóE Kð: ¦Í&%•L›¦Ml\Œˆd€˜M£¿@D ÀK¶—òM½¹´4NP#f>! Ý’ò†Ñ_+4n TéAÛ'º'EJ•ÌrXLL*ð`hìTb÷büCXkü ø c1\,ž•¨†5E—‘©‰4{ pѲ@ÊÿáÞäç¶+yÂ÷»ÜãËরBr~õè» v”¢ w¥p…æÖFßRõÿökÁ4ï!Ïý4³ WYüfóôHú©4%S™êën†àé´ºTo’æØUR¿í"ŒÔ»:Á™?ë?üþÙLJ«Â¨Ý-`ˆhB‚Ózå‘ùFAŸ•hÿ(vLœÆ+’ÒBx&ß‚‘GRæÝ$Nää¦Jº)Ëx%p´ÊGؤ¿´û>MÖ6ÏYßUW™ßü6òkWX9€èS -ep6ÓÒÛ¢l&•ÛUknBš¾Ó¢ø¾nÑ~¹ªwl„ëâ³<ñ¹ÅDŠJŽáY«ÅycIŒ¹L¯[Hk}É,úΧebŸ9¹Îd;ÜÌXQ°sd‹ùG*¿Y¤çW¿ž¦RÀQ‹Sæ”·BÚnã™7Ë¡ly9Œ -t ö³^Ï)"‚,Õ(}"]|œ@Ot>8·ª¢yçÛ¤V…\hñ¨¦o“Ìgöñ /…ÍU P=Xƒa€2aÇxKǘóúí6• Ñ^#uÓ„üœ• 2žTûv• mÔ s¾¯18j.%8xÏ`CyQ¢^^ŸH®_;áð„h?þúiÙ¡Öêéá´}Öžá~¥§ÞÈU@¦Y§µËtt`6»[¯äBÛÄ™ {‘sÁï-& ªÕŒÔš‡~ã'=PÅHŸñ†‡q¥Ñ9akT¯vÁ&Š©q6™ëtô=’OÏíò#„~eG,™™Pþ‘/D£\ȃBÅ&A§­£TÉS˜fQ.ÀIk¡7QÖÏSU3Ó7äÏÅsÕ̯².-3³£í»¥‘†åðÂÜ—Çé!ÉM¹ïÏOº¦ê¾üäz!»%k•¯¸¤Ž2—%^"Æqø°ŒhÝPÂèÞàì_°þtÖ¾…T->†‘vËNæèÝÿ¼ã±zzÜÃzÑL¾·¼ûW½Í¸<™ÙH(Ýx"²‘ú¨@ÖITÞÆµÖT¬[@Ø.ì-›®:PDÑáÞJYß©»¾Sw'².{NOy"g'¬¼  cíÈ(a¯¢÷K‹aݶOsìŸlÛ“ ÉMå |s@"+²Q9ƒ=} N&\Ö·ÃamèïµÉ!Œ hM ª~=W°!l(+¹9\2º2‰u¨SÒîŽ8ˆ)ÚuœÅA´jˆ1 .êò¡;AÝ7ðù`O¬¬·ãÈAÒüMRt»¢Í‹‘Mat0æOW ì€ ókÃÕSÌÉ9~y›ør¢†XÇÊŠ†ˆW·j5´¶¹ø´Ÿù·³QîR.H4ÔÝTç*s’Ðë*½iªR'½…³ÄšÇÔèç˜i÷fRÿϾrŒý¾8 Àœ•{¿­@ãæ‡‡&~¢pϬþŸª(í#±hËÜV35:pY‡ëʾJýÞ‚`¨ñ x£Ôèkö#j¾¬·ìß»õµ¶Ýhë:”¶xg2sD”E„š@ {`#BçÔÐ%àÚ œ ÿ\œ¤iboól“Êa;Pnî*[ atìátÈn4.Œ :.ïû[UTÔÝË(ùèm¤A|»@§¢Š¶ ÿ‡ÜPRzŸÕC‡3í<•ý·\éÕ›>îÞ¬(uE ɇÄÀ[V7gF¦à°‚ø Õî|ànVk¨Ï’Ze½ÞuåÊÆ·ÊÑ5äèÍ¡ m€Ç$oßsM+–r§N…x5Ed§œº ýî_/ÖhöÝ„|×à ÂÕ¾ ÉC÷Nú°NŒï—`ÙéÆû%@Awn3ê~€¾+êÝɆ®±¬10ƒEQûá †·ŒíŠºÉ‰ÌЗÒȳùV)1sê€å¬•I‹"¸}¯†ÿéèwà'92àsÌw}QLJíëQ‡Åéúf(ØÄ“:9ŸÂm1PZxèôIÑ Öeø›û‹Î=•iq‰ÜÑ‘+×ô <{ê%—玥hÔ#„½zò"T˶à©ÁÐ\n†–î™nüôeèVFÞø _vƒ¡kê@aŸÑaqôÕ5PÍZÌÙᣞáøo6Ù‚[\nHÙÀNÂþ ¼²ÉâŠåñ€æóÍ%T#tf¡®e@aΓ¤H}“º‚^9ðãÈ×îÃY‚4Å­Pž*Œ¦¥Q%EjÔ…oyÿÅG`øŸS‹nQ²]j [ªæ.(:}À¾¨lÈž+¼’WåŒÐ÷á„ÝÏî†"0#Ö¿¨/Zu³Jƒ:ß,lÖÔhL Ê/¨3nBøjföH·¨8­Pðf†t$1>Aø¨öÍC{u½¸óÒ‰£ã¾¼ÛYOÅê6¬ScóÛ)NÛtýæDÄØÕÞ'¢ÝÎÞ‹ñ”{°?õ"¬6¥ÈŒªÊæÏý9Ä)4’Óð¤ 7ÃùM4š©y·÷ÿ™Œ¨¡¡›Q^÷|õk!cïç(²ÛÖÁR§,¤U]d[3G&+"tËÛ,Á]5~.â0'~2ÔÚ©IÉ ¡XjåsÊyj¬ÙÎßJÔÝ;b",^«ŒÀ$,ˆ a” p—ìŠýgÚ¯ýf nG,]Ãëq9N|eÞßPG¡K•„ý–*M°i»Cn ûœ¥Ú}a&‹1¬È'²h½ckºh¤âøiû6âXn¼‰Êmç Çí•ymmÔ¤Õ w:‡°"…lþa¢hXy%¿zî‹›ÅÐ@oa¬dñYFÔðt·ó2y_`´Ÿß*ã)q¡àb°¿hÂÖºtÁ骮¡†üýÑs†xÁWý/;ÏìŠÂn…ò£²úuù4ZUt5À‘ý. š_Å­œõ›Œr÷®ÒœóÉ3o <Š2»¾×õ³¤Lþ.OæR]iœ¼çÖ¦âÞT‘Á‹ØŠ}Ô)i”(¹¹eŸ%XÊí±íL‰ Ù™aŒâ&(}® "•{ÀÙbÿI‰ÑÛ7Ï—zý9Xª¢àæ«qцE·"N`s4TÆTˆŠmØÙ]A5ÃE¸?cÎ-DÑÂ-'z~kÝ |–Üü{ߟ3Züï¯ùàþç‘ɸò޵ Ÿ8â³#´ž¯1±ø„ÅU ;»Ùâxj¦IšÆsè’"F_E8b—R 6ø?n;QÒ•ºÐÜR'‡’ºÆ8òY/-Dv“HœÖ¤iH€ŽýývÿÿWcU.j¢³…¥®›#­ë˹|Àdn{ò;†“u¹7&ŒA[¹#Oû²lEÔäS“…{:ŒŠ˜ªUOÉõ‡Õß…Íë|ÃjÆ ¦œ=í,Œ|*QÃp=mû¨9E…†Ç½*uA%õyœ"œ!¹XË¥Ù!¨½©½S“i¡8)_ç8»^3lË“B$u/8¼Fõ q•5ý ÎÕ´F'`ÑOl#Yq$ðÆRµÍ¦5j0挑L>ÔBNã%–6Ø‚êó+ŽZœP›¬WX¤©qòcÙq/±pÔbãjUš»º~Þì˜í·m·'}å‘zbé7!€–½›þº0ìQì­™`óuGœ³ž4nÄAD^ Û0Ætòz©ËbÅë„Bt§V—Œ}Õ³+Ù¨}Š×Õ÷ky·C¾3fH ^õüþ_Èÿu$ZÚÐ×ôtØ =|ªÒ:A?Ã:–Xùæ¦|øƒ«*®MÍkèà(“Úõc „e7ƒÃéú¶èþÏu©[ü—*wjºÓ¯%(ϾaP­!´£w ý³cÀz ¸äù³³“Ö¥T;s¸-W•ÉS²àHú¨GlµW`‡ó­ðÿÑY%YyEN²¡jqîeÓ,Qίz©Ö²ÃÔSF´Øxæ~_ÙŠü‚ÙÚÀ\BL\ŸÓðnn@÷AͲëÜ z;ê߯\ë5ɧuwÊhæ¶C=¨bîâ8Þ²,´Dé#¸¬‘^%¾¬¶%`<…Ï„z¹†ÏjT7ךZh¼”¥¤RP ký”+-ïŒ;¼ŽÅ„ë$ f”;ž!u@'¦/1Ã|lð'²õÃüüÀýðç‹ÇV¹Mžl–Rè3b½”7Êpð ÌTôš‰ùEרÁ”TEAó4ížb&ˆm¹Å"T\IK¥×i‰LI;v² ¬Ò!é6J é:`ÕÒÖ戜Ôí#5ÇzŽ~Än7¾kÎÏ&xu“™Eƒ ›a‹Û\:aŠiÙb*^dÆ^ k9CóÊuE@©L¦þo~¨›éxÜí&M²çµjü?Ô\‹õU§îÿX_›4í²P/vîÔ†WMöÖPE!¼…c!ãmæQ@É$G¹÷e1ÿªÍJ—V6Æ‚§ÍÆfÁ`%iÈ鞘UÌwž®Uüö3.锎¶c}W]E!ÙܸtÜ ¦Žª(”wto!×þ ÙŒ—]»ˆp/‡³´>xé‘NBfýX•¸ž64Û°Ð['=e«îO*Õ³"$’@ZÌ0¹`¼£ƒƒ;ÛÀÔuL ;1>ÿ@CB"=OC*FÆDvv±e­ßNí–2L‚ÿ¦0æ§nõ•_R šJv}^°‹ØÏÌ„™ø$ÚÅreZ·Aâ^w ÝëÄ×°‘îI’®v9RhEÐnÐÕ•ÍõË.¢·?L€RÈå‘«¿ðÁ]©É~¸ñýóï|í¦áá*Ì®»7 ж{§D5tà@1‡%BBÇðßÉzÈ;™3©"ÅýjŠ…µæ± Úáñ™›’L8Ú˜8ÇqÃÛª…–Í»ÞG\TášÅ瀢K€ïuÈâ˜zù€(CÈk-âoâÁ2‡*9d“f³þµòs?ÖÿËŠß,—úëuO¾R¦Í×fGÊ0+F¿%z™t‘@§}:!^…g‹!êj¡WÔkKú‚ð¾*HÏ[P£oÿ“¯Ol{ZÉR‰oÞA¹Ý…gbøÊ>üË ê `¥wïÜy[×vGnJ‹U”ÕL]ñxµG.Û4ôâ©[ ‘}ݧE:câc¾l©dnØa"²(þƺ›C´ª6$õ”ž«Œ=ùÐÌ6ÐiÜû@?JU²gGa @Ô?„Þ’£¶ìB[êüØð}¿ñ’·àÅëÚŠR•L²õÖÖ~EcË0¿³<¹G΋ÇÓuL T£•)),ϧ¼³Šn&‡]ž(®4¡&Λ·Â©ë•Ý–°+€µ0, Íu¯z…Ñq%X­+œ•ê‚‹Ýñ,mdÀÖók‚#ÎÛX_ÒMàõ6ÜòMP‡õ9zb­²†§–¡I õ—¬óÝm¡Â4ÈjM¬Éö›âbG QÉ€Ó qïû¦!ÅW`†©ËøSÁí#X|Y‰UiRÌarðú ÂÆË#ãÔžÖ•Äçç€/?›yÔ'ÄÌ´Sð8ƒ)KGâ¢2fVz/:–{7Q±há×€Z›vïä/ ŠÕ†-…'SÔzí]›!Ùå??‘º±™ù`÷n5ÕH½É_ŒdÒ¡é¼R+Ø¥AݪQã·ì…‰£/—i£Q/ Èu—cÅa˜V0u+nS€ôªïmù-ß~ì< k$»³ôÕ«xñ²lµÊí3ÂÓoß’–ðFœ%Âoæ}d(‹“4–^&þüÅSGÍî-’f‚Ç›ä«JG¿¡ˆÛWѾ{ò·šìž‘'å3©´Þb=ôÎúÈÖôw¯¿÷¡þ6YÄtQ»ˆQl V;èÕ|sÍ1Ý@ß-?ïkC žá©çb2ðæ 6{}S·©ËãÝ9Üyh‘ÚnuúŠ Ï*¯p¾—Љà·r4,¶¥ƒ_®:{vàfQ}d°¾Ñ;¯O¤×’ö™*9çY:ã…Nè¿(‚Q~·k|êë!録æœìû’®@ˆ!À‚D<½×¸<E«~íeȽÝѲA÷ÆUõâÔµù…‡\ ‡Ó›åJÞHº¥…˜p—ß>l ,õ# ð/ Å¿ÿöÖS\—µô¶çkY5”É_ÛsVâ»7ÌMåÌQ;+hüô¯×wƒ}FyÛ“‚dXK7â¨ô‚޼›a5 IkI´Xü‘Ã|^²Û3¯gœƒÆ.YøE\”#¾Í %Ê(¬›Cäï„æIÃí†çѽ—uÒµø\PÒÌ,öè^ ñ¾ûzS˜†üg©™:U»<‚2Ï®Ðú*)œ4Õär¥i‘ˆQ°núAÂÉŸ6V£Ä(’…_ÅýòGL)ö¨Sñ•bøîr=Â-“IuÌ̓óCñ,ÄÓ¢«ýÃæ”–Ö>°½¶ºP+ùœAjÈã!šŠH‡¥›|îlVÛŽ©äãÙw‰9ɹÃàV#È?·Ÿóy_ÊŽܾ!;Úr¶JG ,–ŽËÎŽ"_ÁŒ’&³Ô³ç22¤]ÆñØ0…ôhYýÏ÷ëýúØ©ç—9¼“0˜¢Ú×^niãõ§¨È@í*¿Ï‘7Ï üÀ%®‚}¿ÿ‘ýß:Y_¹FÛÊ“pbà•HjZ,Ð^å‰õн:¬’¹ƒeàÿË)|ç„®Û9&¢ebŒ‹iš;>ã+é.}“š$ÑîùÝN„|˜êýˆçõµÊ1a†EšråÌ?ˆ†˜›ÙhˆY"ŽG¾óÓÖéØWGƒðwBçD°ì¿Ò̯S ”/fŠF•ˆB‹B7¤º¶%çÃñ çW(ÂeéæêÌi†M¨zu ê"úUDiõÌûI¯GÉÐ&×ÚŠ³¾Zò(®)¤ÿ6SWª#Õ6óÖ §æ „Aê“Ãêy½Uô|éTµ$ÈlDç­–r¾5§;ïhS&ÓèœùK½ÜžT£«ý[àM¾…?ˤYÜZ”Ƨ6R½Xù6<·ŒÛÇgØ•Ño úÍ/ëƒÍÎâú“SFÕë1úÜÒåOOóòûüùD ²ÆÈ»úp>C>øwÓÎ<Ýżψ­ýÑW²rP.†)MÇ|‘Tš¢Ã…ðˆwbé?«ýX[’í%¬þð)€€ê^>R£reÜR!% »È?Ë`~Zjá³vÿ ‚­¡„G"˜~yb±§ÁðÔ¤Ü\ÖÈnkPçãù=$zæâø¸ ˆ'7}…é£;Hœû*ÇÞ³%áöÑÁý¾%Ðîrï3ÝG“><,-\fÖ¥ÛràÆ9Ëò`ÜŽÂØ i”†·Áu—?ê1=ú¦TÚï¶@Ç$ðÎKy‚ý«b‹bßZlÅuf\,‚Y=LŒâðª„èH×B«­œ=f¿¼§ãd®mLR|ê(J C‡®°Ë¿¹ ½É5’®ü˜¶¶Ï…P a0x'y\ñ_kÍ42"Z•z÷ÍØNû=ò±y/ÓS‹òë5t®…Ÿv×– 6ÝÞ‰çæmÊþåƒe§ˆüâ=Î~0d¦å™ç*Š!)ÿËϱ f£áƒ`xða”B,F`žmèvÂôÍ'YT"ëg7úÊM§ùeŸ»ÊLjVâ&·¢haNGÿt.8~h(+1P}ƒ®:QznÂÄ8?Ð5iMH',eàWÍ4o–ïA\¨¹>øÏ©³ê¤þ4nËÄ3qC ¿ª Ò³¤É§Ž~àrÊÕÇ䨶 Ôm—b‘¿!kTPËH› ¢Ò «Á–BîRNŠ-õFvm0©¥|=2É]ãÃ磋´¨VŽ'Hµ>?”:d;Ѩ 3½­áq°ÆHmõ¿V¨*–ˆXÓÄç«{Æž±:a]¸ÝeCj²ÖìXÅ gøð‡·ÆXàh‘í®X (Ã]›g7³Ê¿ïÄòIÌ6+‘ü²5°†5yÙÖÐO·ù‘‰?“Û¾Ãl"NK×fT°¤n+ý2½x0Ë…þ_ñEß‹ï½0¤ zcÛÈH®›óc pO캣òÖÓ¡Îøa8üÍ]URÐÂû纥 DÓ¼ø(À6ÑGÒAXG³r ”ÞÓ©"£Tv:Úá²¶a!‡()¥e„} —v5t¢\;Ÿ¹rÚF”âM±*Ölì½#ð´.±¸0"›Zï¥@õõ`~yˆ;AÚ=üà§|éâت-øuÍ»A—‘|Žhk2¹ø1kß}ÌÜ¥€7êöõòß} Í"ªmm S' œÛúšõ¤È§ïð5’«!fØö7Ž{Ç 0™MN’7‘Ðf¡|£[ƒÓ¬œÉüö«¾ÞÊ\R]ŸÌDœie&ü8Se+42Å%8f3Ž/´²ŒÙ¨ÇEcÏ7((ž 2q·ƒo¹ $&9zovöº;a‰¦Ååx[áoZÖX^?¤y&× YÉ÷³nLÇ4ÞÉ{°zÄøu¶PÁÆ Ý¹¬Õ‰]úéjA£/…SPó„–Æèo=f<%rõ[n=eJŠu=[¸ßVt»2{åÿß}Û꾘 ½PbqÜ£…Ì[Peè!ЀØó~2‹Ö¹‰rBþ쀻Á*#,ŽÁOaë¸Ãä±¶Ë“ÀŽþ1¦R“dˆd(%l]üö¼™+¼PbÊ?âS9^PÈÈ~†sì$uøp‹ýÆ’ÌK°wë /‚$Þóþjn§nþºï©áÔlÝÚP~3†NÛátgÝNæb3"…BI~­ÞeÞm% À&|2*ʾW)àáôF‹=‰¢‡ºõ‚s]·^² ßÚí¾+KŒíèÏy+Ão,è8k£øKt\Ò‡'eüR}aŠç3ü-¿šØnË51m¹¯Ô× {)ƒY¾EoBa ÚÓ×hjoB™ý•/¯ôáèMâ@†8HP{£';¶86øÌàì¡»ÿÈ-îüSKú§† ­ºDQ¬¶ÒÑ …œÕÀÈ^Ty‘NéùBôi2ˆé!Ƙ&‡_k2ŸÁõ¾Ú‡±¶¸Ñ—¸nÀO( jbá"¸:¨èǼ9KAiò·Z=¢5^•½bmNGf&ð₌ÓêËd ï1Ènº„иÆ×w¸X>xÓÁô8Üd Q‚0T—,ºÎ/$ÄÁF…8Ÿ{/èuPSÀ8Ú¸¼q£óÀå%*Ÿ¼ü…Õ¹¨!dôÉ‹…¡#Nü,_nd|aЍcÐAÔÉHæ?Ið ´·¢$43lÒz‰ÏÕaY¡í¼—ª¼wä% ÐsÚ0¶/9Œ5¹ÎÐŽƒ½6($XûÊZ™2舉h®¸¤{N®èaïzÆ‚P`:•Ê >cTì›å§?Þ¢÷3òô½m„IÁõ¸K!Jô#2K(Ë WlØ"B"Ãi »6âС´½á;@wüõ Úê@P¹PÚ¥H¥”' «»+-¼7…‡F’Ò+HÌA,rÚ`@º^@ö&®êyUˆx’ö.&ŒŽQ¶€ówÿkM]§¦ÉØ“¿¢ŠÔŠ©À>wK:£³ÈMGG5 EjË@$<Œ¬¬Ö䧬ˆ&}Yç9n’ñðãoc¡R†ÿ“áÓifpÒÝKØ7Tô%S<òżÏY%­–y¦C®ñ“ïQfœ¡Å‘jcK5^~Êñf$i°:Þ0C‹@2¥ÝÀ\O@b 0eD^«“f/?D¦/yap|‡Z1z.~ìâšý)ï®á¹¹‚|k€7õƒ+?éï¥ä J\Æ/Q]t‰¥*ooM/ oŽÀ}kÉ Ÿ…˜EÈŸãÿ þ{ÏjðÐ%k1Ùæ§RjÉù<³†ºjiÖlÄU>ÈP°£Ü'¥sú3FËhûº™¡ªÿjp9¢$ÎoËV7AHò}ÑŽs†HX¿oSHßB³9Ùôÿír­]œüÇU7É=¸û^ô¬02Ø3þ<›Ss5×D§Ý*^ÁM §8zY·ö$ÎAÃ}°æ1O2†Ï¸_Aäwr6I~wVŠ!á° ¥¼±@„.õä¼ Q\„.¸R3O@‡;âF¢™º¦Š¦)вJ²œø yñ킊¡³ ÎÀŒmƒ©ßÛ§4$öëL ¶ÇnŒ‚Ä•w˜¿Äh%pþ­J^¬2\#]q]- ô %Bå˜jp NÐgdHØL  Éç c9n~pƒ~X•O”‹& £8ïb¼ÒðÑzçrU#yqwÖp'„d?oþ¯jýB3¶Ð‘ÏÖ–q; RU6‰SŒËMX:8bc{®®bwGÌŒÕrÒU¥©‘iûä˜ÀTÖþÏýî_zg»ŽýòÛª%w÷Y“„ÕJ&â/¦ºˆAhQëFàV5[Á+Þ"§/%Û~ý׃úgxJ‹Œ°fÑ&XïƒQâèSôäà½?ÍÁ• ^q©üyG‹íèŽo>Yè + [Ò}ÞÝtð5|?3ó”:­’§¿HXëªÔÆ[Ui–„µñ~KÈɰŠõ`|| Á%Ì ¯ä”‰ƒ”_‘E‰¾°ªi$î½ÀÝ(ó•ûâf_ŒYµ(‡ÒŠ>_<Ç«to„3ô“¶-Ï9ÞìÚú&åý]}‘ZnØa =Øç[ó^…Œ”þìÝ)¯zˆ‹œ2F³îÎÉû0û—^ŽÖ×-E°{§hìàÜ ö†Ï­êb½ëFC5Ûp×´ˆ+·ä›P!+uz?eÊþ<Ó4?î!o”"ǧÀb\ñ_ñ~ó«JJ¥¾ù@®—öH´ƒ@w—™U+ãFhi7 wášò ã äXÌ‘tš±Ï5_†æ( üíŸæ&×yP˜a½>º(WfoòA‘€’Aˆà“)5 þŠ ~ʆç–-ž1TÌZj³‡æ™Ï§H(ñ}Š´4§Ðžó[cµˆ X ›f§WJŒr*§:\ò9ävcîü,î00è­~MöÄ^%𯫻UEL×ëPéeU פ:Ëy‚v™¶kw.]Úy= _>±Ž-P)“ '«™>F%´¹¯3œqÜfRÒ¹ÆMÊ“ã!Áê`õ&ÞXK?«øÞ—‡EŒ# m„ÿÅšËc c6¡£@Áz‘bæ×?¤îbógŽì t%^b,QD¼mt¥à…˜Ga¦›‰ÎX1ès§>gF óé×,¨~!qþ§ÛDhYcƒB¦;Ð’q0× J£’1…ôUAÛ^¨ ÜWÐŽ²ßkûPƒ'B °½(á3@2ûüpÖÄðE(è ¸¼åÕøìª*ô‰-7€QVà`Ð^›(AÎÓ4“ÝÓWf;"O³\H-KÞRìxWî(­†fHYh½ÀÒbÂú2/OKñ,9ª>|ÈpGdo˜¥›q‚#>)»»~sª ÒÓ]3SIÎãΜ_ù‡Y~’¿O,ص¼ðS2Gë­r@:SÆ¿„·ÞÈ×þ¨ ·æ©ŠœÎcÌ+H¤m•üùát-÷úЗ¼¶ŸÌÍ&9zhé×ñÆ[`ºø‡­®ÉÉåÑZÎõ{jìýVWÛ«;î—(« À‰X3¤®Bä¸ÚýK@iÉ«“òøràtU9¢’´—Ö+©·''ªâº¦^„ä_ »o^@Õ—žëŸ(73"ålã݃æ×=‡…é´’-ÓâðH«)¯|W.„nßÃ~š@hJÐ-ûì K¸² ãPÇ»£T¦m$«fë¨|ó#^óT›ƒ<ж§» mÆ*®ð}À‹â íŠù²ÅICŸÃì‡Ö±yÓ>eL •&ÀC¹dUæ`A»b=3ƒ-–,ìÀw3ƒƬYt-LxH[M²`¾ãÙÐòÖ+Ëô8ÒåOë2m^HãŒ&‚§,Éo?—¿›Ý.{‡ÕÀÕ¡ 0|ÝQ$A^àÆ›P-©¨—<%%Ä=rTøjΔ¥î¿zÝÀ s ø´q÷xðù'ñcVtÓÒ‘r5Kðj²¢v6L¨!ÄተH¤Ínøœzó®$5(lA«}ùŽ÷hsj µGïLñ›»›0sy¸}ðÉxl­ë‹*ÊFRª»ášLAÙIÖœJ”z÷ÕLAºfJƒ¯®6l¿l‘gÛ4cæ†WÄþhÑ»}}éí€|˜_'J‘§Ÿ¼_,Õ©ï‡rT™g9{ÔWFtÒÆ*Ê÷axm3¿ù©T¯Ñ0iaShAÝïÐpö³¬ÃÕ[`r ¨©+:F–¾ò‹è«‡DÆë£µ- ¶@û&šsKÁŒ ¶ß‹ Ô­Øçˆñ ºB*õ37a:а\Û`ñÃãæò£)^¸Í…Š6‰ÁiìdµØIÅÀTÚ…ÄR‘™Td`£’àÆX ‡Ñ$WÜÞ‡iMQªãÅίZ §¯5i®ò¸—”M-&Í€@+J‘±buŸ]Ößr‹§-ä"jNSW å%¯{@×HÏ_ÓÄ”ð“¥T»ŸêwwýA’ó;î=‰g^¡XŠÄubŽN\yÈ#›çÏ"oÆÚp®Ö„zHÛ‹e9!ÒñÚ•<ÃMíÜ(°Ñ™T‚8UtwþÖì!wÁ‡•0ÆM'²<{Þs³"âÜÝíp~—X*QžG®Fj›Àt·È¿3´Ñf |ùsXrn`D¿s^ÞŸd²Ã=¹;öŠÌ±}ßes;Ú_:!îŸI7]²íº5iBÎ:÷L³9ltÔ:‰ù'éÙyìÁáuUM&)RËÖ“è1ªë{üöwkØaxžz¡QWÙÕ­å!ÜãC"Òh¥dÑûªTE蹄 »Tø–zšd¶ïf‘.@ÔÁ"u´•péÄÚŽ¹3Û…9‹¡KŠ×êQ.ŠqßLzýë~c—”‘|Dß?"Ô+î\¨×›9“ážã© üüàß1ŸKð+EÆÜjå‹­vÁÁ¡RLŒRNõvŶÙ8~–ð}™-©Æ:ë°¯ì.àq) YFø!Ø›Íý[NöyÙÞ×6m.óË"J[BD²\¢oM&³»Fk¯ˆ<‰Ç6àˆ(ÿ¶2xû·­ýýþµu}ïÀ´ CîènÜ3ûªðPg .M¹èÿ€m©ì8JÔå¦&8ßiËyÏú×±wT‰¹êo6|að èMÂ6åí6=|4Ìݶ)¹ 8‘‰¥¶šþ\ùä—ÑSÔ˜þj¯áѨîìÝÚW4›e¤…d7‘ÄhíùhBdj϶4úóK3%l[ŒìCö—Ex1ÔÌ¢{ä-ÁˆwCa ë&柇‚÷ ê—7Å«×èµ[ZômJÂ=K þ#~…ü@Gð"íê6OvN%)VRiÖ¦x9ÿ÷RÙ]=é=Ì«O„Eá'çrkÂÜŽ½òpñÆÎ"ÎŽòã(¡Ä ¼½kûT»¯9ú×:pP¶›KÁ†‡´âi°L"›.iC#·?ÐûÙVãÌÔ: 73«€D¡‚juÂou3î éOóƒ:·c^#ÂN ¾ ËI4g08ÕîiJ"ƒ0ÿÇ‘2¢e¢ ¬ ¬™ ßý£t÷ àúè†ýrÁ_5n=…küHÚa~y?ãäµy¥œM¼Ôf¯Ú›ß¡»‘‚ò 2‰ˆ‡ÔŠºѳ¢~Þæ{óI¬´ä´çPe+m&ÏòuëkÅ"NïPZ¥¿…xêA¸‘Æ(6ƒÚ*Ř4!çT½½éîãÌöNiS„k#Î.©¾wÛ øu¹ÓÎ@v1žF,Ð?—úÛiÓ.$ ýãÌš ‡ÔKÍ {ĵ­Ÿ"pù¾ãŒS¼·H3/—u¬š¡FþSS½·Ÿm©ÚdSø“z…Ñ]s÷Oµ e°–¢‰Ø2D°M+ÐCTVßtW p!2¦è—d™{ 1¿ìÄ؟¾!áÕ‹>–®WʽLS6ÏIUZ¬Ð³3~iKü„ľ¸¨|¯Ý£v—8%ÔTC÷Ø‚ÈU¥ª4\8$ò\8‘÷&öñŽ*¯-¤|Yžˆ d»¦WÚ’ØfuµÅxú#Ebd5:RSãAú:@Ay÷½ËélØޝO\±!¿dÛ+4çj€šéìï80]°S¹¹„ϯå–[RB9mYºKóaù°õîAßRØOïàGá×sO½ªz k3/]yzòjú>ϤWªlòªâGozmø°¬Ö]YŽ›;££#Z8%…+8YbôùóæX8ór8be/¯=´‰¾œâ¡7át­ÐצN;‹Ïô,-û§-Û7ÕÁ?_;}Cdƒ+*XüAøY^ìœ×Ûj%=¯Gs§ÄqÐP€[-ËþðU‘ö> 5ä@ÎÀYóú¨Ý%‹wc&rÔ½‡Ùr‘Ž—:丙iœ­Þòs€Ø DïƒùgFØ'¶.º"G6FÑ ½À0¹¢Ì°ÃbÚÔñ šÕÀÛ"æpEJ‚kĸ-S]à…òFÊ>;Š›KÙ¯ãsè]– Ï5™ƒ÷WÂ/§õ ?ÿy^lê˜?Œ•ˆ¨³®—åG`«0@WÒú̘ñÊÑõ®q¦«B´êúü®$µAAØ¥µäí|;øl¥áÔ¸©dÍ®ñä¼ÎN•ÐDëÏ* +ÓW÷iê§]JÕ||²ıÖ>Ê Ð³qôL9\/cûñŸÄ‹ÍHJ´“ ×Õ á9-@ÁÃk²'UW-ã™ .ÁÂÁ§I«ÌÄ_g-À‚K{öÑX þp¦=F¼‰ÑõÅÉ¢ I*ä¨S·F ¸—km3.&Ti 1°fB€X)Ðèuº~%¯Ðózc¿¨%|^±üª¬õ¯pIúôÙ9¨©EòtÒOȽ9Œ‘7ð±+y 2,£„ºÏÔŸHŠò€Ü”m]/S.EÁõã v²µºÞõµË)&î¹Z%YŸ@·%­ÿ,ì”1›­Ê®UáöŒõ›éA`iP~·©!lòx”p 6|hŒ\Ÿ¨ºý²å˜qÿR2(¼b¿§wjÜÿËs!K䳾н’&`•ß X·F[¶^‚âýY’èèÜð3ñ•aVÚ)lU— xهЫùƒ‰€k! –"¬.hŸå­ñyê– Á ÷FEO!´‚ÇÒ^-rôZü˜kaÉaZF±„¹ü) {JO x9"‘sù>8rM3™"-•¤Tƒp%DD߉ãÏŽmù›Ën©Cøæ-Ú|}xLWXMòw/‹xÇ÷-ÈaŸeº€Î ¦zÌ8;~,E–( Œ ,¢¡ê[‰u|ûOHÙ)aÄL y3š`KÔ”n x$LHl˜{8øR’;é¹+¬é&|òÌ¡XÚ«…¸ÑPîj óE¾áò¯ÆË‹•œÃ;~àG°ÜŠ1‰–®z:'5,Ú ž^[20“ö®ÿ8mÖŽ‡†Œ“ôýd˪¢_T¥ßd ÓóÇz²Ôõ¥0Ád™ã”;ÃYmG"ˆÍMK#ÉŽAÓsû¦WG’Å£!!,“‡‚îPÓaëÚSÉY¸ ƒ895Š ½[=†Îù”Ú·Ã3’§R-‚¥dÃ/NÓÖq³Lÿ«"/_ß( Õp`t8'yŽÁ®æ¬9¼P5i²»òˆÌ êí …~/†_MfÒåùkØÃ½0­ÂI9{—AòË„lý…nJ ©Ÿ_É\„—]õœüá Óþ$Ùpܦ™äΠÅÖ[-­a·ÁÜ ó.’lGwšû^ú:À´×>ªNªó«†è³èãR–×qj ßnD>i¤·¢7Éí Ó ~Ò`Å0ý8ˆF‹_DÃk§¸‘/Ö×,¥:~_Œ;w"J™Qß.¤pšŸÕlæøñ‹½xΗ6¿1!"í£`„EǬˆ l·ŠíE &pi¡*ºÈjÕcú»>O>"rNöÃrÖß%¦ôeÙ÷ÃÏfõX¬–M¯(Ìáý¸žø¢khñ¥²Êväù›!ÚD½ÅägÛB;¸Ý;¤µª$Ÿ`wwÎÊØ]ì0ðîϳ±-Y/æŸ-G äPni»¶ëÀ)ñÜ{;Wù[ƬInÔþ‡Äæü½KéÓzº1÷mä߯»’Â=®ú¦E¶õ„:³¥ù·Œ² µ•.ùòþ9¨ó=Ð/Ž-Ìsøÿhˆ…B;æ¾Q ÷$ù²©éˆÕèQ6{Ndw³…'(×uò*Ã:f@½Å4p ¯ê.Äú«xuIDIî}—Û#CÆ{JÐvãXúÑ&Ÿ\µ€³ÃÝúèÌA2ànîžrÏŒZµ·ÚE"j)j‹¼ÿçù‘ bðìö8ólaoEÎ •ŒQB)æ'w/IC18¤Ë¬®í9ŠŽIä"^¦¦@ ?Έj-Ñ£ª4iü¼ÖIsæò¨»÷ö` ‹Ò› C_;«øÕyú®ku „Æzàxì¿6Gä*ƒ1cìÕa(TMh‚!?G?”S Võ&Š,lè£ÙšÓ0GÜÀƒëÆf>r"é\íè«è„4}^<8ÍkèQs¿q#Y¨nN\·Þí| aE¦™¥4^Ά+^gDbÝi÷0Ù3`UDGãC®{xÂ.£ í—½ðX\3öÑÇ[v#áa¤ð¡\FFWW©iׯ‹Î.ú³JWá¹íûbéî„èÇÅæT²µ–7¯ç'‘åAö7,Düɽ.5LÐt¸.¡­¢ƒò±VBm(´‘m¾¡ðÅïœ=^ðåîFÒ¥êBòL'å;SAšŽÉ“0+ aÿÝî¹8‰ÌÕõòlkµŽaÒâÁ6þð>C]ƒl~ÆøÌµO—÷jàÜ€êÓ¢«\šãî{$D£ƒY#ƒ–@IÙaóŒëL=M0—pô謤 Ð“9(ÇDìm\gü⛆ì"fgC¹¨óðë‡Øù'ï’±Òá[ëõ'JÏÔ°jûqŠh_£7tâ—¸xɺ¸WJ–{>@¡XhzR4×§~Ø\hD¶¦D….±·£wzUÞ”.Å’ôS%ÝMçL…†¹9 ðÓSy­P—ŒãQÜ£¸¤†ª{Šh͈M‹… øŸxoÔ)ˆ'èPû®†ùM-8²TH?AîÞ5.póô¦i‡žOò¼´ïØüþЇƒ¬p%Û14X‘š(õÆùOVL¥õXé*vàýO¨…og•¥ )j`IQÓtÃÝ}Àè׋d£ß±Î0Óן=8#Jxë=Ç Ã 7ʯÀ× à¥í¦|ä´»wõPäÛý£\íÇ< 6ÅMi÷^2õÄ⢟qY´âE•ÇèY°[”`²”1)2ïÊ?¥DÌ@l•Ó,9Sí7ºêß;`;'ùfßÀµ˜^F•r ˜Ñquóp²¨É¾š 91!_uÒRŸ7ì|ìÙQÍŒZaàq¯zãý/&cÏxAñ®èhŒ©X|D]¯Øž;n«Lmk”ª-àžãX*)ÓÃò¤€—^Û§ïq KøÐB”µxFhÕ9¶V2f­HxaÖ¦¸¬(K²¬Aë'„LLKtçÞ®IØK.õçï ¾íGŒ» Ÿ³À´'Ù²ìû‰^j—SSÚzwæø j×ì~"h¨Oÿy•…ÞØ³ª³Ùz'§72t'z©²±Þu<Ä‹תø ©‹Á7&‚hê:h(g |Òú«+1<ç¥m‹Äì!Ï=ò¯p/y Pžšûª$ÐìË›ò ×cS„bòó`¬ÜõƒÅ¡:æ%öÐLÉ.~ºðɸ§ôâÕ ææüÔ)¶«®q£">iT¡8ÎKû,±4G¨³²aþ±’¦+,ñÙÔ•­9ß_=ôÂdo޵ÐjœŒ2š‚3ÞŸ£[æ îÄ.ÔIF’Ðe7þÂ}ý¨¶4¡û½Aj°áòôÆ÷}l¹Må«‘úß>8-¦¦BŸ^ú‡)PF.d¨ý5Q,±ê úMò+EéZ÷„Ç .Û¼ßIÊMå´š¶¤¢ô €` ¼CuÔ ¸¾íî„^ËdÍŸíŠu¬—~‰ èË¿q×Mç°Ãö57Bs´Iëqád_î6]tòžºº½ª$*}§MÁé˜6t= hóvK|™ë2J<1¹O@¹Òö ?¯)§bïÛK-8‰¬`ûj¦r'¹˜ËÁb(aºcÛÐåÕ §9˜¢ƒÈ€R­”ï½­{‹_ŽnYpÞÕmvŠ\9²†pÛ"H^BÑû×Rݽ'MJ÷'o“xư”ûVwr9Ï^Í‘·ƒˆB;“q„ÔÿãÖ£Ûü !øÞåÀë Xµâ®Jhÿ=‰ÀïÖTðŽ ¾9ÑÎ2 šéìR37A;Ïct@é§|¤ÎHMvˆ¢wHˆ¥–uÒß*;·ÁûN“ë{ úÙƒ¤ ©Öíñê@ðœ±Ûy,¶ªI%‰)‹Ï?!D®Xç§]É+î@…Žk‰LÓè\¨J&<-Øš5Ùä-âI¸+hÛaï2¤´ÑµQ#Íô=1ã»Ý]Jk{4u·"ä%ŒE¨ØyEOô¯€ì:Eù2;Ü€=ÀAæŒã–Bà´Ðž/€\*®v-Ün#í˜j³¹'©»šH.ÙY£E1êKn%LÙoê:мµa"FÖõ«üŸÔ.”µjnýCg¨UOpÛ[nwHeÙ–8a:Ís‡sA¦¿³xKB ¥ýÒ;SžN9ÿ°€Ç§ÐŽ…ãÇÛ{]åþ­¶–ÿµzé,ÙFõ4³(täœ4h+úAÎÂhL^ ÊË ‘‰U¸ '®ÇÆҵ¬Ÿµ¡~nÚÞkÿ¶áø£Ô}=¬îÓ7–Á1RÞíwç–uåívÙ#.­”<“cÄ÷&„%ÝÕgîB“Æé”µñW»*éQ<Ù×7×Û`‰É4r¾Î3æ3A*ÄJ¤´ËÓ¸b,ÿâ‡{$ø¡ß j,ÆÐìæoPé7šdÄ¿±åQZ¤dð›“Hâû. u’Œd@°™kו,¨3AixP,pyÞ5!ûAqþ¦ËºÃw©#\Y]c© æ°È1´A·ô8§™KÓ'‹ÎPÌ\ª&ƒ“28Ù|ƼÌ>Ñé„Àùf ÚXŸ ‹~A'Ÿ–[žD‰™œ[þæ‡!žP–²¾û‰뀮E´œƒxù2‰ˆä@ÔW–vL!ÛÿmúV Dֵ˅YI"DǤ2 h"ü>“%`Úµ×£¨Z×[ŠtœÆWÌs×ñQ"¦ßôÊÚæäÉP ÇF?o瘠éÌsòWerŠÉC›µ®´ä²ñ$Ò¾Q—b& Ðüºÿ30l!oÑäc¡^Ìd¬—¡Ó¯þBŠWª¶ÌÄ9[rìa3ñ>7…U$2`ÅIÏJÒ&#–ÁNƒð)cyd¥ìºÐ'·!Žs"¨>TûÔÄkjËj j:âW§6Ž”¨Ë¢‚°‹(fPÞ5h5Þ.ù,‰æåÙN?ó¶±=_®‰.€%ù¢F'ôl9e€YP][3fIi;S™,Ñ®8áz¸9À0FÂ*‚ø^Œ?Ä)äã dôú ÁÄꊮNívæö•¥E—s‰düuz -rI¾š«‚¬v«Û~eË¸î­ÆÝ£yªož™Òq·У¹^ˆžI»`íA"+½\ê…¡×wÏ87»uTûT¹G4ÂáU)&šù/ïåb쎵3×§ƒH‚Ô'¯$g†‘¨Ë_–‹2 ØÍUÙµfzžuÊ:…J7­àî9"´‘+O›Ú_Ñ{éUZÔ5lùHøb V9ÊÑWtr©-Øjœä7ŽT_z Q r÷¢ Bb‹b‹yÈ¡tA<z]©zQpšælJF‹Åöü‹-?á3¯(‚Y§é0=Þ#–~ê€C=H^’¼Y¸÷ܦ.õS½Â8µP so'dÄU.BÈŽF<¤èÆÑvj,õn@D‘i©ÛÛN.¢þGi):cP/ì)×°Œ°MJ{21§'PÉÖ"òulñ™~å'DŽҡBëNà7Öo~€ŽÏfd¹à¬D•ßmÁˈXjhñÂû/+öAí ¾Ô{þ2:߈Ƕ; %»•~þ盯ŒRŇ+WŸéB³ÓqæelÏ̃;Äüg»$qhÿSfœ—…Ðij˜¹ŒBVä¹:ìm³°Ötð¯qÿ5u®û&Øè¡a8ñP‚»t¦Rr–Sn¥Íý“,*àÁÏ–ʉ”µÃÓá6­Ü 3dCªVtr‚ŠÏmš,‹„äTH©€)L«Ã©¯~h¯0¡+äsÈe¥:¹ÙüQŒvJ¸=ÖÕ°™4¾…|éÑ ŒAh;*¤:³êÔÎÂ#§µ½añZÈ`[Rˆ·1–Z.ÀK0c#ß"mÑQ²BbB…ŒÃÄ~-ÅÚ¼Ó³#?ÈÚÕ¶y†[ÑŒž×ÒñCÇ´âðب1›”M¼¶&Ö Òm“Í(6ËŠ°ß«,¾—öÐ>ë Ò=MWùÖÖxøçhz«Ns›·¡ÿÌca£ûžÚþãµbÐÁ(ðãj+÷ÊÛ\œ':ù»vDŽ–Û,w_ÄåXŠ>ðx*Ï—s+4TðJŒâéâ2 –“Øøj;ˆ#ƒ¨(»h÷"Ûc!ÚK`‹vÌpè•%þ‘ož8^}0;Õš½½ð¦w©,£^¸©TÜ2‘+W±™5ó Èš§ÁÔé/£&hoÈ.Ä]²˜Ãš•¶’LélDjËÒ­ìõ‚èõLìús¦±æ(­ÉêÖ@^œ4xÔ›7 ER .ÑiÚ$zRuN.m‡¼•Àv ³°÷=-)mƒˆÉœÿÚ9ÒMùÅb ˜ä}BL²ƒÓ¼tØO‡‚¨RÊ$¾þšSÐÿ½_*«Wþ5JMC§ÕL’ÔxÊ—ÉàRd!ˆæøøMîˆÍ²¥"Y¦wQ3N‰’ßR© 1¤y Ú¿ûSV%mŠÄ¥U±¦±§}ŠäZÉ1šV¼ Ò@ú•ºÇ3õw‰¹x‰¾À%êdÖµ#2mÛöÅ›«Ï–Ôâ!‹È»F„o¾H™ÄA}ðÁüÛ Y®8`™½è&K™Ž¦1¾š€êD’#Cný€DoE~NMJ.±/ô¥¡ž5¬öN…g"•ùóë1\ísbû|—UÄÀ+PÅQvrj%ÂRKñÿr7{Znþf}?•G£M¥—‚8Ñ1·Ëß•6ò6çÕ1i?÷è·Á$#„§ÿÎkÑLÀ©®ÅÒ´' «UŒoêth¢H=¥vR¬úhfž/ú:f¤–’””ÃH³CßY óq¼%Ly©Âª°¡ßž핃 j©'³|®ÈᎣ4F޵fYQ‘gŒ´Pß®K´T»’{ƒI® Á“}‹ ¾üêmD"ÕbGIRvÚ­ôe%W1:=èw¦=c¸í*‡®g }>¿0Ž¿o ûØæhUKpÁDàĆKÄëa° Qä{±f„=§íi¤Åfë4ô­m„RììßXôwþ× ¾Š<óêVW5(÷ëH‰d êhÖX¾ŽÞjÅÌ–÷ÙOþi¿’¡Vt¸·ƒ@íûŸïHGÆû+XˆE°N È´Q}ª°f@î×Ò¹•B™©ÓZèþM,WN·:!'H\^YÓ2"PÉ+ÇÊš8A*×cHÛÀýRÓFj°áV!Q/–K‡¸5&©—¯Ô'ß^£¢zWÁ(³:ÓÁÕ)0ÒØ‹à4Á9ßø‰æ7Ð6 °Jõ£¥MdöÞÃ2cùÓ+FÜõ ™ë«ž†áÈ˦)Qݘ¬%݈ ƒFü5¼dÌ]³°æŒBVª›àó6Ú’©÷’šî¾Ç}½¹NPs'"±åÕ}7òv¶†\¹$Χã­ôRþ©ë“&­½½ï«mê_yÕ^”È“Ì{?DÒ^Ô5`%v7Û6úȾ•„wzá·sšÚiÈU¸KjÕð¹ƒ1B³Ðnú3T}ý¸Ä‚ËpOóãwçHˆëR…ƒeÇF~RO WºŸ®HÏÄݵ{¨Øþ¬9ì€Ähïö }q¯”?5ÊýLªü)}s؉SjE=Ÿ}ýu Þ#¥ƒjhÁE)4O‡ÃϺ{¯…^bNî×¹šý´%d „ÇÂZ,Q…í¯ ñbyU|옾¦Cø oKÿ*^‰ŽÃM´…rgCêÚzÔ|o2šÏ'HIš¢bªæÕ?#wí»Aw6kL¦ÚþnG\XI?ç†Û/¿’IŽÌªa~Ü^‘k$òe,¿§ËU!Ùm¶vÃY¤šf„:ÊSıËy—³×€Ò.bÅàZ71lƒ´—Ö{<Ͼêºüÿµô|L»ÁæÞ÷Õ¹rßÌvÎãy ›{õ~Ôλ‚ÀhLÁ7âJ'ìÞ€Š¼£YüÍ»çWI8¨³±Šn {„*}BGg¨Äì¹øˆvÓíÑ8¢(=[ag(!©4rùÏÇî3Õ*¶ƒ-D£xûs]šåFŒû;õŽsU»T¦±TØ<³$è÷iãÃÈ.8Ypq²Ö|<(LE|Þg|Z¹¶ÕØ êSйŒ«Ól~ên³^+õ`ÃãæÔ¢ˆÒ|4Þ¡}­ߦ{¢´@€*X]2¥¦…ò7Ò‹ ãêÇÊÈGÝW†KŽe|< êü7À šx¥ï ùg“: @QÂzŽŸ% ìÏnöHcõnëz8Ћ=W7ð9U/´«Â´ØJTµ¸Âé*$q´A±œ&õ|†Qû±/I•ô3\èh”¶¿&[•Rb*¤†n°ì%hPïÕRp±¯kîJ˜>Øõª}Ô“ÑÁ̪2]²jþYa(ü4 Ò7\wS÷:5;ï¾åØ{ØÓ¡‘Ã*•* o˜Nã<È>w·üWE¢y Ö3¯’ë$F¤ßVIÌÕ×kC¸°X3YOÂFJ9,×tÅloóŠ¿lÅgŒIŠüOóÃjZóð­éì‚q}îЗê(ÙlŽC¿sÉ®-[Êã&¡|GŒ£bÃŽßPnš‹Œp´A!ê³»—hþ•=|<½);hNcÚXÝ: O\§<`µ.³O'©Qؤ¤Ø¸èæ£)v²©ÆH]>Dˆwz¦[Žu 7N¶ƒSÚÊÈI‡€F;Ç_¯¾J¾ÒpªˆÆº‡Kâɱm5uðÆXxüµ#êu†#Ýãиk7CZ-ƒ48Z4•%ÅÄiŠPæ˜ ˆ]yÓ ~ŠYYË“ÆAÄLB¼ß25HV‹ñ‚]@‡;ø^…¸J‡ñg™fj@eÉçtÈxýZ1QͰ໇óPÇ2÷Û>üÍFsÛ/MèZÔ¿ ¥3I9\k¬žÊÙq•'Æ‘–6Úû>íŠ;Øæ,[ð{‚õÃV>u!ã{¤<»ú~Jµ‹>À‚b†p¥èÝÅpwe<¼©ÿ_¦†t°Èá¢Ã¹§ÿc?b ʵ‡å½ç-ôKôõ#RÄä’Êì(w„dü¯h†Á‚u AœWÏz¤áÑ4‹JÂY|c¸^½RG×wyh¤å¤3–>R–ј²4­µÓ-óˆ—rõÕÞngŸÔmCÊŠ' ùÑØŸ73Ó©_Ø^p¤ƒ¹þ2LQBÚY‹Ÿ¶íµòòéí„úÈc©)óœ”éßüqmA2‘ž† Hò÷ðÔÚGad‰¨›L£ªô†»LíIÍvëT*¦'¨™1ºr‡¥Yƒ&´3’´¢~;bg0äŸ&@=œrË’Œä”ÒdûÂX(1Å‚)ñ¥ÒrP¬ˆ¦Õ'Ù”šÍäKO%’(ýDDÜ §ÙXì ü¦}jÎJªã!(2ù«õÆ›<õ1$Å (ìœñ{ý ¯2¦+qªúÒIòG$]fˆ˜°äÈò\s°jp“éÛ“ªãÛ]méó­õ Çž»þß(ºìµ+@I‰†ÂB”³!"pΙQ,ëƾ¶\ ÕºgÄЊՊ=jÔðWX½iÝñƒÊ¨2 °‰ªGµ*)E /V;s£Ü=*Þ'U XF‘¶:bq7Ü“HEâHµXΗ”!pJrÕ½ V“@t§˜ÍB9ˆ8Ëí<—ý£»qÏ&\Kúq›+]¦Œ’ƒ—ðÅH"¹O*?Â-4ËCÄñÒL%Gn6äZìçÄÜf‚M²hHë3É‚ÄÞÙ‡Õež±B$ÄÒéÛ6©-Ù똿gDs ˆ¸€óäqìø¿ÊÁNCR2óÍ -ì.žºF¬,Ú”=í;5 ýŒ_jŠ1´fL Ð/vXX¾í ¥Ê9{pºø}a ‘5Ož{r[Ƚm(™¤ÓÇ!ºÞNOe!CbK‰!’c1ÑsÉ{o-Û0)Seî‹¢‡Ç5·àÏ-ϸ-‘éëþ7‘›[õà ´W0%3ÕÃhÖ4Y2ÆìZº²Zrhv\ ünÁ’ªUY½ÀpØ’+e‚™h*ê‚…‰ì ó9•ÿÙ¥Ù45qŲœ±‹ëõ²QB¯ò_Û#{ljE´Ü“µÅ–FÜu½à6¨ëÒë{ñ—Î[d± ðd[nIÉá0Ðܱ×T7>L⊟jÕ4‚(P‰êÚ¾uÍO ϵ›Bù`9B6ãý”O˜üë®ú–ز+Ô«âóÆWŽdv¦c9h•v¿AEO§–þk³5"CÌÁ<„#K;ðUŸ£|pжh–ı8>'¨Œ; sÂIb6ys¯¡Ävï+¹œƒœÍef Çü$Ɯˣ…ù…&Ÿ‹A9&µ~R;ŽNŠ€ÿÂ_Ç)Aoötfþvt—Ñ![h¬“øï[™_Õ$«ïMD„iÌ-Ü µfL¿Xð÷O/óJ×ÿæpZ¶èÜk§LYÝÈÖ$®ÏïDåüþli7ò·êoɆ„Æ\Y€U3¸ùÈ+5j¼Ø9pÈ*|ÏàÜ7.éáãP?CÂù[7yžŒ‡ù§¾ÃTxС&¤q5Þ›ÉÅT(Èü°¢î‡3°Üô`-Ά´¿IÅßíÈ­y]÷Å _ÊÄÿftLÏUS³•J‘qr¸[ˆêÛg±ëouЧ‘™÷¦Mæè-’ ¡ŸOïQ§3@¼eGuœ»,œuN•lRĸ޶T•üÄLf¤Va«|JÝNòóÜŽþ Å]„ãÙUêuO µ:ÈQŽZ”yáUzk=j•»AÚ'6Ä5 5ç’ðŒ+µC©GÒÿí]Á _dç÷%ê‰ø%¸z°–BíVÅíÔ$^nu«0)/­‡‹›%•GíJ¨é}VhTØÅSe‹5ÿÏIߟÈJæsqáî[‹•›‰ñ÷–ŠÌrKÚ°‚e„„’.átëD8zŠþCCmÒÔ«›k« ûÓ[br⯵Ÿí¦7+¾UN üûÑË0­ws(ÞM²XòL¯—Q|¾>š*ÛFa:Œ½iCÌ#ç‘iïÛNóɰ.4Ù, ¢ƒ®?%nKï«Ñ0<#¿¶'ÖäoÆ("½?~ ¿¯¸R3[cO¯mkIJ ª"s­«º®Â¯¨¼žzWW.‚m%¨æròf¬N™Ú«m€‹‰¥-˘­(âMy7‘P–¾‚ñ¾È”*\Æ4$ˆáÂØ¡åZá10£õšk¼w|×­3݀ʎÔ4Èá/oRdš=µ-/ t’½Ø‘œ'šZ<‘ÔG^¤ü`E¹;»Å_ý›bYÃS8 Í_ÁQ’Ðá`˜ÆUŒyýßD½Ï|[L&b°(||–=”ÆÀ;ÎÚDÁÂB¾ÿ;ÈÊäLFN6©—gã¡pù‚X†áæQûŠ‘3öxW½|Çi©ËÂzŸ£v¹åì!¸pk{ûž¢Òôi©æ‚ÂÏ~ªÖF6ŠI”š˜)Yo#ô¼¾3¶½ø ?<ºÐˆ{3{[¦uòû²¡U%òÄMWÿì;P…Èv—Ê=`Á“{…RaûIÅ8.#X|¶TE-XJs©e¶ðV Qmvãh6ØmÁ?u„%H ÓBó{‡Eœ éìUÂ\Ǹ²îÈ‹=nazyÈ—ãÌaíDg¼5°å&N¢„a2p=J“ѳ WÚ ! üQýð8tZx´:£o÷=ïŠþ²Â×è¤ÈQŽòNƉ8—ÏY7ø4;QU1€•­SvÆtEmðOî7ÞLNDusÅ}¤ï3€Ï:}àÐcH(~þ¶ÁøâÓ6žÀ¯Nk‰}T­x4GGG:Gu}äÿ¡òä òòð]z]Àk˜/XË‘xðŸr‡BÅåz„‡i§Tã§'òO˜E,`È}˜žgjM‹)"£(³g ÖóQD¶_àT¿î0õ5®Åý/œen(÷}i ãÑZ¡çÕLjgÝJ†BOè‚ØþÃõ9À”6ëˆr¿pö‚e…#Fî0ÂʲΘ/°½›ñ5Êvæ„_ KþOÜì®%¨0®2jPm§Õ®J×£gÚ)õ' ª2ßn¿>{ÌìN~ý6–Ÿî`צa‚ ‹žÏt¸è„Ñ¢!3ŽhÁÿŒ—3TšÀ¥/¢´íK  T~Ò`P*ü“† ¾ï¯OËv`8ìSÔ!¿“FØö ¸dMcº«öu€a]rÀŒã—ê#ït’ò0X(é0^Á¤7’ýW*ÃTâveóדvNŠfà@3ñp‘œ‚0ánƒAVÛ²|¥êšå(·8+ùv"ï€gFè—Y<Ã-XeuûoË7€bsÅ…ži*۪߾q‹®‚Uº£<_~lœ«Gæ¾) ×½DüG(«¯Ò²vå"éw¹`%îèïrk^Æöxìê%¤+y §à–d"w]÷{‘á«#iæä•àLæaœ‡;Šþ¨’z‘l9ÚÞù¸rR5¿ýÀ9ˆ•üç­uÃÊ‚F{I™jQEžŒ?ù¹Äy‹Í×; ò€4qcé¡ý¿Ž%¹îêàÑ­6‚OÉgŒ"ß!CO])bMë¥÷c£4Œÿ=nÃ(b¾DÓ?O Ú¥¥n]8ñJBÖH¬[wøŸkV›‘àÄ;ȬFQC #8vÏ@o°ôY2¨{oÓ€åhKO³ö`6™Θç Tu¾.R3Ö _¦pÔ/ DõŒ°f¨ºàbú¸À_Êr³——#Ñ\ÂÉÅͺN.ò?iî’«Ûîì#d½Ø~ã·XÑ E».“2¾áÓÊ?Ádø¥2ÿ€ÍSC¿t*aSÿ^k Õ.?Zú.§¥Ð¢ÿ‚Ÿ}ø]·ôŽÏ2>XEilÔøik_çÊÀíå0€+S!ÕXÓ5’2'K ß sSô(ýŒú+¨‰px1ÀXìÄ]‚½@>æ¦oi†ÿÍü„AÖ x0 =$†Ùô/ÅõBdnOŠáéÄ×5àjOó!ªeœBéÕÛuññ@Aã«áE h§UÊ.¢LáýÍØÍ1_¸LXÀÇc— vÌ”·â£‚ÅÈuÊÊv¸°Tç$’{4Qâ•/€¢d:¨¬Xs«23üúʶD‚Úh±–SƒÐš¼‘Ùžf†ÝðfâlBqU¢Á&_×m‡j8:`ó|Úh›f@ƒ¦¤­Ó±5ÆÁY+~’AÛ8ÉØE縓ÈóT®ç˜¬Ú@R+`G8}^F ö †îŒÙ}±½¼ ÁÀa0ZHÄeÎpOR³±È¤"j×÷í‰QŸicÅ™ÕÊ•up}±2ÓŠp^'ÆS`aHcÞTsu·ئ)èDc)MU+é)›hk³u(ü4Ij-žp5ÏÕÂö¥K&7Æä)¶È–}¡ƒŠ¸«‘´;vÎFXÌKÀÞ"æ2ÜB|éÜactù «ÓìaÁ@Ùý6šwF«ºE! ‡mM´kû<ˆ–œßB¯*š¤nQ‚g—H=¦Û»U¸´Æ¬˜Å:0ðGU¡ïM[q “?õãÚj›t¬ e‰±_†ŽÙ­ÉÆÍù_ªåç¯LõâK¦ rjB»€U)Öcˆ57•ü=M5 •½´ó 4îÅËÉJw¿P?Uƒ9¼Kßsç˽ƒ<à#â3ç+B߉p²~Qþuùqº&9"?D’BåPw^UhLÎ* Z½º¤r#=ÌTÛýr8’aÐ5‹JëiàÉ«kíf³{aÒi¸ 7/¦ÀZ_^¤ˆcIŽó2™f¼­T(ì‘O·d‰ˆ¼oK¼¸Ã€—{دÑrÞ5`¬Y=ç I£k«XGj£åø ü´_¦à÷¦\Ižß xªß oGž‡ñ(÷ 5[8%‚W_©ö#”S±ohÿŸ' 6Fjh|§ ýVaß$/N=´‹æÔð»²A!ã–C¡ ÚØtw­EØ$˜Ì‘jp/R°„|® ›ú\xè-aÇÙà»™Z|yyožD—:RŽ2ËéÿÈѼ´OÇw“­¥à»N¬¡örÄ£OlÃxD†¾YxNÁäè´.ýÚq|e|@ œ‡ì^ÍP)ñq#öØv ¨9tE"Jõ“}e¨m+Xzx Á‹3ÖhWuŒ~sbŒÐ_#t—¸%*w€â*h{A×—äNˆ@3ŽÊ†jô)™§’®B¶­IÕ‹öW¢ñ¨`‹¿ χå÷¹†D¡ØÑN™Tgx´å“@ÎÒ]]cW„b’+žÐ~fýP«,â;7Àÿ¹ÃFn#J0ׂ.S—Ö?;÷’ ÌL(@¥ÛЇ\‘…B c~Ú­W éD Wg¤@·ghlÂÕƒ?í€Æz·@÷%yW¨RR!¸)Ö;qé8n<Ìäÿ6³Q?s"³víÛs¬(¬Îþ<_;þ<-þ©GÇ †‰1Õ&b24’Ûòb.7GÈÈúOè:åE¥Úí£yÄUÏ‘×Pú¢JÞÚÂcö`Ð.yj÷±áOMÏ…eEÒ–{a˜â]Ë Ì¹KáŸâ,ØÝÏ–ˆ[ÁÊ`®VOÕ« ¾ÀA\q©§D[Y ÃqX$‘4èÅ ÒO:ôm|a“ «™uŸJÙ£Ò0BÊ”Îz‹-4´$Óynn!‹} ë·×Ó|°DM/â0Xõ¤9"Õï+#€†€Ç(Q.Ÿ_Å´ôßÃÅYnœÖî¡â0-ÀH,å³Uc¥ÆÔºã¡HÛìåräçQ:zÉñ©{¶†KÓWŽî­¡LlÁ"nNya3Û¸Ó5ÈSWóÛ }-m?þÊ>’~ªt¶ž\EÎÀ:vš¬CæS‰N­îüç-<[6e™eö·ÙÌ“ÿá|„Í(ß0sŠŠ×Î/VÒqfí=gõn‡´–%äJ,âECJ•ôx]º•Vö޹N\J¶Žƒ#Ôøå[€XR^T±……‚ÀùiòS2Dc#Hc²;WMu³mRÛ5U;›ªùU$ômH¿pÞ ¹”ÆÛg‰móÜçm¡á Û¹Çv!VW³îÖebë”uú0"Lw}Ó9ÛÓ@GJ<*”Š)@TZJôÛƱÓŽ\á픆 Pð¸îOðÝzË¡®c–˜“ p».s+å¾ Fýàˆ5Îjî7pað;¾I‘„ÒŽ¶ðá:20A4ùéu,ÖÍìlø1ÝE’4ây«ž\s‰^oQ;¹û£Q¢xHI¹²´¼2Å,£êsò,k CÇL;’ ±STƒê>5VˈÍúF¥\‚gQ0¾´¶kŽÚà?*E¾j<Óñý&ð-û5Ä#R†¨I†{ê Ow»IÄýÛÛ6ó›öË›™U¿ Ó6¹Y°Î'&¬ O}˜\cͬý ³T´üße[ö,[È¥|¨O ™ þ{ôˆ/¦˜NÔÇW 7$Ü Äaßñüáô0CFr0BE‡?½™roqþP»jÿU¹|ÅŒÅnzu“ýiæW@}«4&¬Bçà%þü3J>ÿ²x©ç8û6Zd~@6þ˜Æ‹æ5”÷äQ!K;¿t€È8´5ØÇàðÛ¢ÓÎ8VÊõQö&5=¯/Ô½Fyx¡GIL]§xÍ&¹Š3 ðhPâM9ê„ÖK/èå—a¦ÐHë‚hÌÐŒ­ð€zàåñ•†6J ߟNéÇvÝk­ÆN0µ™@ œw·×HÃÍÄqÐê›±8× D׆í”ûæíR]¬v”¤Â¥£*ûØ¡9;þÓj_Y£Õ ò'W~¦Š5åÛͪ-·ÉD3­_{ÂA9bÀ*«ÙßÂA‹T¬æml¢_®<fäYÌX`èéh*‘þHQå½QˆÁtù×Ì@/Žžz§šØÀ¯ÕÆ7X…Hó±Z#Gø UªÈ¶Q,«R¤OQE¦ïUàà;†+wÅ‘¢ ”Рû2cÝ8mËÿ<Û=ü¶ "YöÀ÷¥$ø ¢½ Þ0Ч5ð¨è£€ÚÇýºU(ïq½pžÿÃÇKOÒÂ×`%NOt®×,)+ßÝoÕ.¸fŠÆñ|è±7:¼Ûò>UXH6¬"ÿ±­ ëÞдE½ <ÐF£Ÿ[Ta–0°ƒ;Xäöá›µÉ lúnÔÐ3KXÒÒcv ¹½SE‹ûNg-ð;q좦É#Ö&Ç¿#ò¶õÆG:©zS·CꨥoÝŠÌëau2ÍBÝAˆù<üàí§´è0r~ØÎeÀ\`¼ªaÐ [l½åÒøœˆ¶îfÌ9Ý tægç¿¥;"4&%»Y ͘Á+éþ¯æ­é„Û`¥¤™7§EÑ¥ô®4‘X·Ô;ÀçÆ0É`qä?æ2XG¸¬ë›m* ÎoÞÀµæ¾H²ñ&`¯fÍ`R¿êÊÅ…_àî9Ûñ*}Xx_‡FQž'þuc‰ÆÂïyµ~B¥&EáÝÚîm ®…‹Ê @ä!ýK–+Šì‚p=?Ý $ØÑ”ehšøÆuv`0Vò8=VöOœYC–GžÌ'"bybäé«%KÓE!¶>c¯ÝÑb¿ŠTtžµ²q8Qø£öé8øÊf—A¿z\ÿÜTõÿUJX¶0§4ý¯Ð.‡ù3×ÙÝdT€•C©³mæñØ# ブW8ë3ç•çixÑP$áÑtp²ànò½˜ÐІ½•¼q»èËVïÍ… ºàJò¬T/(ö}Óqa@QDþáYŠyêgäÖ& Á_—1%²­‘u¿€Æ–ê p¢Û;ò.Ån’c9ØC'Q=ë®Gºµ ÷:;,‹¡†»ß“‚¤“Å,nOÕEKu¤¤ÖðäÛÙ*‰ï^¼u‹,KǕğ„JhJ¬©·Ã+Ä5Z©JI‡=Þ¢A)qš•ˆ}Ÿ£óe ùkÉšK5:Sîfž¦~ïf;Ç$°¥@ÉÖóüüÓé<^u6c‚î”öNÕÍ­Ä[ýÛp¯R2ÕóTlj%qL&%d¾e×îÕ>B´Lóí½pb·. !çËì‡Ø ð|­Šï´µÍ°c½nFL X©c¥zólÏ/5Xž\­ËµƒÈå¼¼ÁiàÖõSc¨OCA¶,źÉ¡#tÏ€êôˆ Y®TŽ¥Ö/L¹c'Hè¤e°¼å8ÀiD¯ƒä_ÃmÆ[®ÚoVSL ×sJ6ñd )M’6æA­|g?wÑ‚¤×*r|"7ÐÜyÊ !¥5Ê`UÒÇ=,_i“ö5z 'ŒfJ;Â}zÃY2$°wªï«têsï=HÒÆAÈãžmë`Eô„yÄÍ>‚ªö¹aæÙ E„‰÷ŒœºRN¤°ê‹uú|TÉ‘1fS?¢SÐ!³—ö·í˜OkOz+¹¥Û«mT±}Ëß¾²”Ȉiø¹óbÇ÷lšãduÞßóßúUþž(8ÁÙã®brmÆŠ•CšÑÓ¡$é[O¥òÖ›sÓøïÀüÃf]fAcú笩pŽ>׆ÉAõîP‚=0(iÐA3„àJŒPÄlÙÍZjڛв)ó7­@D:'íl+æ±Ë/–ü+²Þ{j1Ë»p¦‰›|Žg}¾’ÐJÿ‹èz.t߃áç(A¯·—Ocû ~³#” ‚`ýEœB4‹A;êÿ‘v7-¼ù‰/´Çð_Smk„É6û7âf†µ!g|§òv—6ûÜFôMïÆÜƒæq„ßÜïPnlÜDkD ²cˉž™nH%HI­j’ g9ò,ûû%4ÖKgEOë f` Ž”…Ä#‹žkð¼´{p=ÀÿΆ!3ªôú¬—Z0øo<Žàº…6t¼(î“8pZE5V™_Ýz…,'þ#ERJJé_fü拪©.¡šÿsþÊšø<íã2¯5«ŸÓñÁ8‘Ö8á€{0ñt¥$•}pà4éZö0n3”Â.˜ïãßtvýŒ{ šþ3 ý<¹Üçž5q4LžL¼¾¾çM[Ê?³wÕSƒþÞóQ.6ˆ."¹½1Q¯&¾ÝBúsûÝꆧwå<µ¹.àSŠI2©íæiô„p.×>ÓãPóØw ýNï=mÌ^É0ÖMc9–B  fvž_aä…Эù¼Äm¯ž¶ŸƒÉù˜Ÿ§Ukõµ–leÞ…=µ`ŸC œÉ)–ÂI˜›=ÆK#¡@sö3Ùü8óà ñÑ7ÛŠ:×™þÕ>3ÒÏ€wû–+çVÇÝU½r†\‘R™ªèSáÉvàÎ#˜ý¸™#†gõäú=ÏæWKøž*–©5—Eî=ƒ‰±^Ú:M,o•æÍõ’ðh¡¦ÇaÓ»Ö2{óƒ\{oýx.ßÊ#*Nã—<=}ò9›ìöIÏb}ØsÈïSmdZÐSACÉo5±é—&H:Î49¼äí¢<¾3_ÆF¨wÎ>nHBFOdìEí$c-a£¶v}Hä…â¾ç£²™l78Evà& mÉPî0Îçå|Jfjµë+ÊV|ê„So´CÜeô’ŸÛn#Æž?y­‡ÖÅ ;kéüÕíöd$A)/™3\<u£øÎÞnE½ù€0Þò,vhÝ`-´9ÅÜ)ó*ZF— èÖ[B"MSñ,\ssnÿ‹â q'|Æ6"Â^ÒHm&¨ïn9&L¤á…ugl÷3 Dß”~‘w‘€ÿ{ ŽÌ´éŽ{@-È\$?‡Ó†u—ò¿ëà±NºLRñePáVH‹¬ThÊÄ1òEA³tÎFù,h €>TøLA5 Ú@Ÿ~Ô€‡àð"7“+-¹ÿóu(:Uí#xÊ2%¥0—9£Îv?|%ªtBeªñ‰ã¬7>¿Ê™Ý•6êÚÚYC•á7_|™÷Gå;tYOòå v|·²-ÙåÎÏzû¥ež¢¨èG.îqž¹}œ úË)ùï‚D3—P…ºË|aøG·'–Dïƒ_ûøþw!&¡£)®l¦ˆK%˶}è$¢7µï‹ÑÊþ\L©ÙU¥™ˆ•[ ¶åËÀî„äqÐqJSbˆûRïŠo².>buuÅAþmñÑP[«<°ÿç–Ù…bÎD©kÕÚEªî'øàoT°,ù`P¥ÚH…‚Öz­m\í¨C´¤R—°þ#Cµ£ ,ÊgV”˜¾BÉÜ_/Ü8/VG%»¸½°À³©­iO-”Î!°Ðرš3aR'¨ÔH1÷#ûAáùÚußoÎ? uO¨¶…-•ÑEýh‚ᣥZù6°‰jè'—ß"Í5wku 7`}FM‰·­›­7¸ö¤Ç%‰È &ÚpC7L øKƒQ³1¾24%}ZÁSš³îÙF¢¦ï–é,h']*Ú^_»—clD>†QÂ-ÞaU&ƒÍ™8xW™?½ºuÉ©UIઇ Fd3֒ɳ’¸,/ Ðf|ǤK³ãI×äíRä±LX<Õm‹ôÉåXsC„}¦âöã`ìÜMkX˜a´´¢8fŠ÷H£s¸ÃñRF\V0 a›Ü®½O9&µ™éܨ#ª¯2Ÿ–ažHXš³L›¹L¾P]Ãþ ›oáaëUáFg“ÿôX[ d;ZxEöYY«šÉÀ\c$JÚ]›ºÎRÖü‰=qtqÕÀ5’ÚÑÃ$Ç¥0LØ¡9© ƒx<æVíåî:b‡á6Ò$‹3.DãÚfççñ»¨¢.Ã!!zŠ*9óýϹ|84A º^Ùmàƒèl2™ƒ³!i]Î÷\Ø-¼vm÷!š“Ë¢é;Ó ˆnAö«ñ*eú7)T¡pýÁ¼»0±ù:í’­w_R гZX6á£ÈKš—L.{ïù¹üWÍÛÌ*Óqv²ÞôÃÝäýhã/;­ÿG[¬Þô.QÐ%+ ¼Fîéj¾µvNAqႳRAGÊþŠMÁ¦Ç9ÂÿHM?WŒrÖAGT:Å2„Þe¹®FS5EZ¶óØ\RÓÉ|CÆRåÁ„CSw½“ Zÿ&;ëÄ€RÙa­P7ìyIWÖwm͉š‚`ÈNà·“þ:¨ß¤±ÿ˜íSÛކáæ0IË4È•ãÙ̦Ѿ4ƒ¢{¨5¬NÛ 1À¡ÿÙ ÚÃ…¦Æ‰µT”ÎkF‘¶+ú¢€ÔöêÌs­þX]í'iÊ‘Všc $¾œ LAØžù±“@¹ÊAÙCaWXïÿ$ÂØegk­9ÀSc ¦Þ¼Ê®jãá?¾H¿rƒqj}h­òµ{ôá`ö@÷]„+éËçiŒü, ¸t¿ÚOŽ=IVD?¸ïñ1¨oVcD>4vÑyYm¼¤© }ªòÐ8ÜËݦ±\˜¨¿\+bhܽ$û ySæäcA´Óäã¿D'Üã´æ•4k&ö\†ÝŽü'yiɶ"ÙÍÅlSŠš= üB¨ý.Rþ®J7¢gó òݶÄ{Û†«z)öÿÔbÒò‚Hlg$ˆÓbþ|;=ÿB_Ç´¨ƒ;on²{./ù%0»‚P‚˜AŸ,›ý=éV÷4.Ø'¢;EÜá…Ú ÿšjÝ´$­P!ÆÂìúèÄß“\o>‚íng\ÔÄåNZcT›¾vþŸ‡ßÏxO„D›ìáºn©®KÓ&5Ä  ²¶aá_ÇÃr˜” Ñ¢b-Lßq.Ç©ïËÿþ“ ÃQ¼ä[I£›û6ÞìEÄž¬¹rÒxä$Ó¬³Cœ~{èƒ úþƒüÕßÎŽ@DTB»>ñt>¦Ô'›A–ê 3ýXÓ„ºçŠ™¨%‡Ú ‹BUœrô"–"ž”9ý†zIÿ¶wu/¯Õ %±^CîÕ½í^/ ƒŠ¼ÍsW«–@çpãl š®WØSíóæÇm†Ë¨`ôUE8:?ôK Àœ$%ÕsfhTgr”“vôWý¹Øjó÷ÂÙ®NKA³9 ˆ$D-ب0ìœ÷Ol‚ŠB‹Y.‰½Ø7Š‹ºÁŸnð<×¥¹lŒN¹œÝ`qvî¼§cs2±ƒ0%l‡ýòÚ2ì së1¸ÂvÒ/ Ù~æT&Ö«Rü¹ÉùúuÓ³Xq·žìºÈ­ÿ ‡þåxªŸwýÉ}W7$÷g Ø"ýðóQŽÎ×±òÍÈKÏE¨[wؤ½rˆOm5oiè†ë¶L ŸXcϧaÝ‚· ƒ;©ß¯ŠC)“ÊÇmˆþâ2 DFãJDØo›d™‚îHCâÓÄ ´äÇT’z<8jÄt_Lè BkÂåÚ€Š‘™:š¨(ý.àÂôü­'Æ ×ÎMYå µ–«Q–xˆº¶IÀ`ןþcÀU^æbÒŒþF¥Ý š~N¾o’®±û¬o¹n<òƒaíÈšXüж9çèeNsÏ;Î0f áŠø-‘9åÛ,‚AüGiv¥Æ¨^U³³H9ŽÃ ¶à1€s]Ó½tU´˜cDèð#ÚmŸ€6àvIûCò7)ÒÔ:;û-ÆZÎИø¥Í3?ìOxà #¸¬ùU¶£ã4” @}§Â/!OúÖj€Ã×)tY$IJ~+^ëfP8v¿Tý[fðãMùÓIîçpÀ„>÷àùõÖ[Eÿ±ãåÖ€ ]ˆ˜".ˆÃ,hس¢…MÂ8›É7—»o]Ê”…Þ"*Q ¬È ·©ðrÿB·`E²¿ :ñÀŸÚÍ¢;;„ˆ¢fɺÆÍEú•§ñhW¡°70=ÁÐ S( •à*lö¨èdd`h*nè‚ï8æêi­È*<1¹µj@5¹+÷x °DEOÔ‚[?„,;R…[W… ñÒ.ût<Ù‚¥uµä–rabMÇ›Ö ÁUŸÕ?ö óeß…ùx‡Æþòd"_Ëü£ÙÜRÌÑñÏGk@mN‰õvÿ9>M;Cz~Ô ¸D®¶&Ûb}·«s`•DLÞD?ƒ8·Ãâ|©!XI{×§ ùHö¤lv^Ç";+ò^1iõ8øÙ-kÚêV›3‘ÎÚ›l¡ÅÏ"¹*Un¢þŽÐd‰œÖnï~×èdHìæ”F ªÅ’`L·ªzšê%kTeç{®Êøå:ðØŸ=žõ(BàEæqˆT±e¡9‰bW™0”2P¢à“9pžô® \ÈÌ12æÏeÖA¢KE{‘ݲ?˜zÛ-… ÏÀãÔÊe¬~I‰n¹Œ8Ÿ†WNAWvø:ädÏf8?ε–cu ìíª)ª».È kGÖÇ E<ý[ÈAÉ×Ûöæšj« P©Ý†MÊ%Ól¶o–ñLì„áyï ¨\†;Æ7ÞJ²ê Ì!©‘žÇÚbf)°šÙÝ!R'a™½~á`¿¶ Kr–_¨#×µóØw”7¨E<©P zl5ô¬qO#ÍcÙIÂÅ“æÏ3$ß´&¾²¯å9ïö £þ8Î*6ð„âQæ´ó»ëcÄå…HÍ€—æ ¢úbœ:­¡³‰ælݯ¾ŸoI¿}ÝÈt¨ˆ,F¿·‡Ê…vä{Ò5Íú†«ÝG|OÒ>,‚¤J„¾Áè¬çOò3œ±q^øW¯c9wV¤ú勽mìo’`pºAÈš_åBÖIÎ…ôÑ®O vƒ,˜Bs¼>ŒËÙt»v¢[lÁ«Êà¥Ïâ6?‘þ_95Æý¦µ ¤¬¨ø¬õzh0`ýn%œ4i8ÆwQìÌXgÉÿ2ÂÞ2°Ìÿ».T‘ÜdâWw£/÷^–ÿrçòó™Ö¨×üS¶þ`„»V/E7±¶õkKl浑 “ŸUT®'ÅÛ'ÝÇ4]ì¶5/fÂeŸ.˜¾]éfØ(£#!IUžÄøˆt‰l-5:êJ¥v •_‚<Ú;îøô°s+þiÖ¢ŸÓYêþÑã¾€ýÊrkmÞ§£M¸d@S¤à 7c4bŨi:Õ…Žìñ/!¹"älWl´˜?ªf[øq¨PɦhcÈVæ8½íP|¾Ä±8)½WýòJå\_ðUªå:mJOnì- tÝ{–]r^¡ö2pv¬öÕGn…RGYÿ¾ VXwÀšáV Y*™Öù™éôah›ðLyÞÛ Ñí»Ù¬µ/në_þ‰­¹‡7qœŠê¬O›;KW¦º ˆ=AŸGÐÝ꤯_•LúᄚÂ/BE·ÖŽkìYH$`t-ŠË¥U4ÅÚ^éVIª Jl(놫Ò ÈJ¯5§÷žQD¿•Ï òÛ`R¨Ä{š¯ÝÞøÛ ›><0}k0ƲÉ·© ðê·¡%U—õ—ÝI 'â=’3»Ú}»3Ù‹ Êk¡3TügÒØuÈÍ !ÐÄ‘BÀ´jM"Õu!Já-rï/ÜEÃümP¶$ÑÉk#‘&e¯éGù> /‰âWÿ:¯Dubr˜ïê´Ñ@ Yô»ËÆ~Í0`m‰´DûôèØãê8=_œ¾Z x'ùÛs\´…~]`µuqÖØ<áñNÛo†gú²Lü«âÆZ'hŸq1Ÿ]¿ÑA$Zt.’§”Eg8$zc¡…Æ}M2Âú¿Ð6ò#Ä^T¬úVCÛ:68­u"ž;Þ¡ÖÉó ú·EkG\Ö &W\¦Åñ(l=dX0WöÅÒ‡–2Ptè™ñßÔ[„ÄG!Z*¦ ‹Š1L÷ ´ô{æô[ÕÜ)Ls"²3ˆuŽYâ¼mÏ×K0þâò•}J0¨3ò4Yø~óª?ð4ý²¼ øynïØ „=>%Š¢1®ÿËM€;ú%«Ox#×x-wàRÈx”Ä&»8ª…öÃpõ¤Å_FãÕV=e²/ÅGÄõ@hצ_tQóÔ–zpü·{¾hoÃuÇUáš)3u®Ö|Æ`¶zl~PÉ„HÏ;7Œ{NÐÚ\Åçãñ¤WÔnLq÷ceô²Î”’eë^ uÑ‚¦….QŠùàÅk‚F§|Moc„ù[g•Ô©¶ •TâŠM7ô’ˆ|Ý“g ùwt\>ˆýî²övö‹¬Ü9TÙ/] 3»Øç£" E×ÙÃû^Ð:æÊß+‹ŸæÛ-×aˆ)‘ö,ÙW‡Î½8+Úþ´´©êxT‹•oàCz,fc1•,œFÎ5ÎSTé*îî r1%õ±îˆxº&=¼ Âî~ÔŠÏh ‹èÐy0¬ý¦‹›ÙKì\¨nQ’¨Ñ|õ —õù’Š"±oG0|ªßÁ5$Šä½Ù·ŽHäå -bÔ d‚ФLÈÚp¤@ã•ü©jÒà%dECÑZsùX©(Õ<"ª<[ÙN „ÐNúÔ”be°¡Ð'™;E¬ú^c©*3ôÝ Êír>½TŠ#)° #„»f™í(”âtÒÄFÚËA?¸ñR³Þj÷uYÂndKÄ¿¥nwÄ­Íi3h0†ZÙ]µÓ¤­g‰šï~èŒ]­õô‚#Çȯ9[²];½Æi^ã¹^ÖÑ©ñ=—x$ïv—ë9ßìС`‰uØ“uΛjª?Þ.Xô667½RQÏÕÎQ`‘‹nøÉ1%ûù)rÖýF`p|ã™Ûˆý÷jóý\–!k­hŸô–l~AY«Ë¬½ó’(ïÇ”³× ¹£ú•* ãEjIVÛ6–s­gH0>òXpŸÙGbWê³Êx!lDœóEFbE=QŽJëx8<îÿaÿ0Ô‹)Ö®gÜá¢wmXÊGÜé”C!Ç,XJ÷\%ê½-¿ŒÁ9çò=R:žà¢¬'´`IE®…Œ4Êô)éx…¶êntŒiŒwO¼S(r7¢yƲ夦Ìüßïž» õçM"þàØ‡±˜ï’9 i}2x 6ãU5ÌûQòòßP©gø(ìêo}•Åb§ªQ/Ù\­Ý¼Ñ¤óv"ÎFUè>¸+cÂÄr'T© ãû)ƒÉgã9òÒç:ËZšBŒúÕ”âWdé·L:kþBÁ30z¼ÝM~¹î*8å„a-än[ã| ‘ˆGø" Ÿñ„ëx¶ÞÑS©$å[\ɽÏYcNÙ ŒoÚæÄH§lL%ŒX¬ÚM²‚G·ëNì®t ª1—}›µFé½_lPÀâ/Úœva·¹ÅI~°,%7œ.3ì‘¶€HÅ÷ƒ§IYü?›™O×Ðró³\¼$n+";PS5Îó•—Ëc¹R6XÐK¯V"˜ã#(“­˜X‡ó…•KàãþÉ"ªÆZ§Â¤‘ ¯FGþálñºnÂĺHCÒuÃx”€ïùÈöÂÑÇJ6lÚ£½¡ÁÿÀµl»-´/N#aÊqb‰â0ݵª©`DÄD- ‰ú­’`ž`½Í>’/¨Kß+›†bÙ&é*”ìÀÆñ)ì3¼Ò­ÜÝ6¨þ"þâçø‡ÜÔ˜oG÷…8œ{9çÕ¬SÒôC± ¨Bg@ý>õÿ°§bZéiËžÊU€€­ÏlbDyÄÂ2'‘o!3ºW¦ÿåü5˜‚>EÐåmêX‚²òy¡S•2²ê-ïšUQ÷^ZBÏHâ+ï6³¥ûqhþP±"0U*=FR ^«1'|O6ãnü™T® W^͈ª •òœŽîw„IØþáÀHt î¾ ·Í§'#ÎÀDÊ×ÀG0¿tסi’ Z÷§µ<´.û(>òT~¡cOÑÖ@ÇÇó”« ¿¹B–Ýâý_¾Ez†C4ÖJoUTO?òß•Ílj]A™'͇šŽV“/öW ÞµÕ=T•K#/^`àx=?¹ Æ”ñÀ‘¹ðÚ0÷Ð ßS±ýÙÄ%Yxm2]m|µE&ínM"À@Zjùy¼tnߺãíþüƉ£éR“:–/Z-Qkè–µz µT(TŒ"4ɳ?›•ÙI˜Wƈ™f¿ ¯ñïoYÒ\ñN³ƒ m‚×,ó¢ Ow/“$ ¼¶·~ë,ª"!®–#šcµ¼/fŽè«+ë7?¸Šp†6ð!lÑI½ ñIÓYjpî]2BùI"¦‘Ü­½úsyFrÃYF4@„Á\šaüVªj“Ã Ø ÌüÙÁy¥ê~€æÊÊÛÿê…-^;Uwroˆ.(®#¼SûÔ$z$ –[?¸ p¿$·Ø&'êKE7Ä/"å–Mb¬c'NÞª<¢–¹u„óÆ‹´Ífî¹û®GjšoåvÐ]KÝÂá Ô?aà¨NA~6ýLõ”ÎV]á[uŒD¯åJjh„P½ažÉ|3^ÅÉíþÎ*é¢òÅÎÇ\ B˜5£pr®Ê$¼ÞlëM²EÙ¾§@ï×Ní¬Rt¦"l¯¥ÉXbèlÇ5ȯÖæÃϹ€m2æóMÁçòsÉÓçëîú!HÇTÈjxé½' š°I»c°¦&ñ¡Wvç¾!ÓgóŠã4}¶HX·¡Þ+Ø«÷`ºˆŸ²ÁŒq÷³ý¨wyÈõÝ£öÐ…ŠNqS&„LpÃL :H™t6ªtNqio ãA‡úAE˜™Z/ãf'ßL?ü¨3-Û);Àº+‰”ò-oD€E&*wJœXha7ºóºG±• Þúè±·+fšÄ§–éÓÁ;‡»¹uZ^¥¸@ìÑ–ÓÈ>5Ú0˃³@ &Øßþ¹ì?a iŠŸX¢Úü.ø–E•ÇåY«+}ÎbføGí /CN&˜ŽŠ©ÙŠlv/X š?Ò-‰í­‘¥d+Äa®63ÚÄÞ3QüB|i0Î&8Õúpã'Τ±³µr^¥ÆÕ/þÓ ü6æ/´Ê³®¨sHyÖûDu/'?¿{«Ø§ÙŽ„ /5_).%ýhZjd¥UMB óÄiœxOoä Jˆ WÇï‹; PÅ´•ßè;´o•ŠÞˆøîg¯[W³uÒ>>6©et· tÇS«Ø Åç¼A`Çp‡¹éÂjJ'€6 R>Å=›øËÇ!B\êxñ6¯Ìä!snþ–³$S:ìŒ<ÑçÃëZB0µŽPÚ(b=*†_‹#-º¨…¥ßîÚRüÁü\ŸŽÙÖÙòÊC¢¶' è¾Éé&4Î}iÊôüMÍl-ØaÏŒÄþ/Û“Ì%XÖp`*×ͧ19=3 rZ Òhyñ©d(˜0ñ‹fr>úôíð?‰jpóˆŸîåMŸáüØÚkŠ x8ÖÛ?{ã+Á½™ÑpÖ‰k¿LÊ´†:§«2‹à؈òOކ¾V'- ‡P ü?-yȽ€ ×ù  ñÙwCŽá“[2UΤ oŒ9•wÏ·Ô4'fwx´WLɶpSøb€iì­ø±Z¯>Õí¥7‘OÇÆé0Âp9mÆPÇÁ-U,åZ?RMWlö—2ÂJÙAÅ(F¢ç§69ݹսS–‰ñ÷ŒI9å7Pxº² ó¢ÂL´Óþø¶ôj³’ÿ6ßac®çfAïÒQ¿p{>1û Pm-pª¾z„‚RÆ$Mèò(únÛn˜˜{MÜžß&Œàòy‚wÓ†± £êw=G~5^½©¡Èñ׆p¦à»®º$,=Å5C'Ò"æÔ¤l^ˆtxTv؃®¦H2èµÿ̬šgÄ!aAq¥fS¸ŠØIÕ¡ÿùÄ›Mmʱz0-6¤=ÎS÷¾ ó­p܆„j9s¢(­õSRIdæÆ¶¨”ò¯§ÌÈu=fŸ:oo—¢D²Êph”í{’‘$ý,zZߨ(ð…¸+›¡ð!@1¯–æõÀßS™l/QÅÓ‘d²}WñîEšwf0tOW"Fûä‹ï±¤r; !³zÂd‘†š[f½'.änB}¾éŒLU"‹“›¡ú¨˜?V‡x1%_Ù”Yž›#UomNŸA5øAŽÍB©Iý#Oã]Iõ¦ø]÷Q$QlaŽÎÿ©Ñœ>3%û]X’4{1xÁëɈýüŠˆÁ Æ@¸lYv%°îõvÝFÜâ-n­Ø^x§ñÞÎRÎê° 3ÚQ²¦Qþø×+œe7š4ÛêuLZƒ8!ãZ¢Vý‹]Mô×B;ì Ä`#ÍË5g[Ú:-š×>¢q}ìwÞÞ¿y:ùLÒÝo¹æùgoýW(4Þû¸>a™Çó6Tõb¢J± À,žåň¯ «ÛÕpo[pØà鼃çÛë­çý"6Íl¤¹okƒ5mJ¯.ôÕL? sh¨ÄÿCƒ9sØŸÝÕ”¬µ;Gêº4'¢Hñ«š¾¬Žã¾Â=ð™.ö‰pI|Ƹ•§÷ŠC§°ãP¨”¾Köƒ.,}¯K8° ¡wc™©í\e@Z@ô¡fx~ÓXN+ÚŠz˜{>JÇ~Ö›‚Á*({),•o[ÃpD؇~¤î4ëVÙ–ögGc“ß-íû# -ÁX]ÔZ6<—ê‘ô¬]¤ÄÀHçJ­Á:$‚5¬îÊ h–Ø9*¨:Èw>ˆ¤Œ(^f«#W˜rñ¥1Ѳõ̃íMÕ|ͯ¾¦·º`ƒ®>®ÂCìÛ.o]†üÏ g¢Ì‰l¶õ`ÁcÂJGÿ¤²Ešzæ¿ ©[ÕoÍC£˜a°eÞ4³€—?‹Ö`“¤MÙ¨¬9ö£úqªÍh¬÷ÔÖ‘g³ð¿)nX‹°aw»ƒ9OÃ…)MÍâ·-]Aã7&V ‰`?³O™f>‡/†ä4÷£˜-ç ¢O dà%rϯ¤#Bºèõ¿Æön$Ò8·W¼«AO@çLÀŠ¿°Æ?¿Ì àÝ1c“˜3æNâÒ²Û§«(²ªÞä?‰Kïzâž?¢^vZSòn¬48Q®;î‚d™‡ø.îï™XËœdÄ”RÛEyì°›ÊrÌùþ V†Lé» pAÖ|x¯»H¸ÖaÂ"åÝÚ3&O®"]÷~¨]I1^¹ˆÚœ‚3‰¼à )Jš惲«Vâc"•å[µd i…P·²ƒ3Ú~†!%CËôLÙF]d½áb®R‰¤¼¥©:ÁS CCÓ»Ÿy&N€Ó¥ ƒXlVÐ9аTØßϤò^°¾iéƒdÊÓjPúmQiÔ<³qGP=!›¦þ»¦³CTP®c#¸º³4ŒâÄÖÖ•Iãadïx|Q³^Èf3Ê¥µØ¸@H‚¤YxÓr­ &HÜ´3t¬ŸÈ5¶œ›†?ªU ãüðÇÓ.×­jþšz‰jÜôÎUäyˆæš’¦pYe6+KJBÈn…zá Ž±ÕÍîàÐj¯ï“$ä½W•K3v&¿å`§üå,•ÃO=?/í›Å€Eþ‰‰È¯ßP«ßKQ'‰OÍá– ª–K}|óÅ$ì•)›Ô$pãUÏÍë´‰°çæÍ —a¼=c LSc!Våtå¿'9C£’gË+ÚpùYÿ» ÚáshíwI«©fx:$ø³ô“ z-GÔ¯…Bú¥HW¬¬W§žªj¶]¿Ïóîqþ+öma´EÜõ;š2=R±ºM6ß)¤‚®P©Å™nÂÎHò8l•TÑW©Áý££`µîê`¬™ –õI@Ýÿº<Ž lcÄU[ÈsqZZ¹,í·y¡s PJ\^q¶A(‰»ÅXõaO^¼¡t?h1Þü­;¶ !KDæM<–Á×Ö3ø\“è,½A¾?šBdô&UÊUa7¿žpôVsåA8 üá«=Ð/¼0†÷pHÈ–/í¨w Ë…q¹P´U»”#aUOƬ)§šìóÅF0zwþØ aœ÷Õk.¼à©~¥–¸+Ö„bÇŒ{­bf.'Š3Qrx^Ëi|ÔÌOžft›wa¤ò¤ÂØ¡t©òè©,¶%^Á…’.Ñ çá8± ê8–Çþ–š:åm `9”SNL@€«w¨$1IÊÖ¯Ù‹Ë´ƒ!ÓéÖܼ WUa+£(™þ%Ge­…±¥XSÔLµç§( ·d’ù غ~èd±úðo‹5ƒ®o8ÈŒÎà*èZ’Š‘¾Ë¹aö6¡8ëÖíó©XOƒ-âËÇü¤ÉéV åaÕMÂ(MV5¶`ê|‹z¶GAüæ[mÐ΃cúþ\žWè5‹ìmÉËdZ%Þ´} -,ôÄa%Ñ]u"w­\*o)6ì» ýUž§‹÷µè3©‡ð«²HTV¥„ ˆ‡9úÈ5w½»ÁÐZ%Ý‘º 䈔_¤Owì·é>È€óIlW&Àˆ²˜-±i\ºÁq®º—õp,¡Ûù€¸€ÎZÓÈ÷zÇ Ì“Î’:y—6sç×þãMpÒòZy‰3¤í£?^`#Ÿ÷/¦ŸDõ«}÷H6&Òo/ýZßÃcžcW4"ò†ª3¡Sr%,%zR¼•t:8Žƒúé%C+¾Â…¾ èΟ\•âo½‰zò«ã7IéÞåÕ?>-ß)Z—<˜£Béó ›¢|ä<¥üºîŽ…šƒyhÕã`&kR]4)¶'žiŠ€Yž¨¶ZJiBœ‘ÞÝ©Íÿø(c‚d/L»ékT"žôOÚu*ª”ññˆØ_ÀGYqû²é;∖‘?Æ£Ë2_ÏŒ=hñ ÐHÎD#áø¤(v]ø;»ß)¶4¬lpˆõÞÌyYêyî·iÜrØ…Ô2KFT{”S?V\›á –šhfÞè!æIðzâ#·lì,Šý¿ÛRVÖXn¹x*§ mÃŒIè¤F ƒHÝHAið&µ3+¾3cƒÔúëѯ)5ò‡”¬Ç 絡R ü*•:Ê©8™<¦E#haI^åI_æ3%y4t©‘'÷Q ³]r„‘ÁzÚ?©C d+ÑfaþɺÈÔ´2¨E¢žG–‰Ó[ý‰ã¦fs*.áŠävªâ]Ü¢ˆ·ò{WüÓk#\ïˆÁ„qHKû·©Ž Ü4Éô%êÿ%®ûå ž ¡–ˆRdVoØ`%FUË'üìu˜T[þ>^ÒÑ¢˜æø¸¨¨žç G\*.m!š è"<ÑúH¦è×AØÐMJ Q…ÿ?¨ýaÇã¢x’ï/.–ê‘{±²;„ckD´1©,—" ôk·fõù\°¨d4;ã´Q;}Î+9 c¡ž%ÆÍ[*PB-wè JÅ´ìëtÜ̇'«º×áãz_fȬÇ2MÎiÉmÿT‘öoÆníQ¸°I¶•¦çÞ«·½÷þ5tŽÿK¯~*éʽÙDÚ¢Æåßï;È„¸ü®x·<JÕíž»ÁY—vœ zƒp¸e‹ïøÅGÙ×@;•6œ¼)À0ˆÆêNç,ÏÅ/´áu­|³ñý3µ6EE¯%­ÆXŒY%\ÐŒ Y3‚˜¦áÈ¿ò9‹ú£—W5„Á£¥ôÏÓI\4«×L¨[_jEº`÷NúË3ð"oaÆÀ´VÃÏâ^#Mh4ÊÛ§”RÒý%dG˜ºUÙ‘-Kå°D\¯›|ÏüâÑmlË¥Bè‹›A \‰ó*w:™ê5œèÜŸöiµB´Tã–[(BGpŠûl¼(¯ZÃ"~[åNŠÉ‡Œ}ÿ¦tí£ñ˜ÜèvKI›ä ”ÆKÄâø´èL Qy|y¨•Þ)Åñw cÑÈø-ˆ\/aSE™&š B¾e~|a=û¡¼(— -îrcS=RJ,¹}®ƒðy£Ú0Àªláê›MmâD11s¼$xE¿`È?ÙòsÈÄÆÕ‰¯dl¦‡h:ZQžw˜d[ÆuêNÓo@ÿàØGƒùX¥­Ñ{ÌȇÚ5p‹úýœ/O¦Ò UGŽžhy¹DVWí4£0àÏ~WíKRr·!É)böµ1+gãKÆ•lÿ¸ö_#ÎQàÃtûÑ“†‹ã !I¼Œ¾EÎ?N fåæ_ý„‰@€ûÎÓ-r‡üýÿ.ê¼ò àþÃnZôÊëÚp‚§ú…Rôj¢ú“‚û¿«hÈR˜°µÿÉ#Ot®:_ͺõ³,HTh;‘ ´±ß=1C£N³‡Kk[¬“`‹ôçñ±ž‘»°H ƒ‡¦Á… m–Õ½ƘZ²‚0OÑuCPæºÂW €©¡f<šÛAh!|.Qó‘MȵágaùŒ'DùÑ ÕÏûª.V@)ÚÉW†/²q|„Dº"M\QÓ4&_j{Ÿ"ƒmÌŽÀCîÖ·D ƒs9¡<袂3‚}åþˆÃjÙ'{Y\0BÖrôs^"Ow÷íŠÈ Áû+6ª‡Іªûõ‘$éC«JkÌ ¸2›3Dì´`ʬ<ªŽõ§¸Zbhºnœ†àTûFXöÑ'rm– :ü¥N,Å‹ÔË£40rX_x,ƒ¡Ð2!(ƒ>P/‹eax-’#S{¬‹->äõeŒ¿G6À¯l]†˜3ª¶s×ÞTC•FgPÂS×àÖ„ @’—uƒø<£‡ž;Yæ5ríEF+Ú#IGá…Š÷Z«ß’´r©J„qÓçšUßp©N”æM”¥+æ}z7/jXÞmKsÙ(¦°O¥}ÎÐÜSÄ:Ùi(îé]jr½(?'Iââż’0Oöª¡L'Ò©q[‡i®éã‰1wŽ ø˜½7£4œÚnxI½,ó'ªH¶æ{ò#Ùm*¼¡ûÆîƒf»|i™jB½{í%ûT7]œu͆8À0dÖæÓó1ÔŒI.&ÔÍm‡»Uv½:bÅ[¼þ$l‰l2“Oòw’°¡ðôŽÿñ—œÛ1U¦qW“›BÈ|É‚I—hÌ„|`âSÇîºd¯CÀôƧϒÂ$–œãòî±X´aŠŽjR¹4ùôÈÚÍè_„~ps¿‰kâêÛ™'ÏütóØà5Tÿǧm{Á+ vâü• ‘bß 3EF¤ý(þ?D³=4Cv#e@R6}^d¡²÷ÏS¬š ÁË×L”êÌÑÿÔZ;ÛÁ½±RôP¼§¹i[ êr ÀE<e˜ö¿¨c@h£Þš3`—bEÛd‹r…fqìÑ8˜…B'´3æ¦Æ¯Õù^íïa®Zm¢;Ö¹°CÔ†¦Â0bŒ‰Â__QHGjÒ*It ¦B-ÅÆ<|ùÀaE’{Ó'sGuº¢ðT‹Þzs„Ó âÝ ã[œ‡+õÊeòºÉÈ»_Ȫ¡Ó° ®‘óäbù¡VÕ¡H¬0VÓé"ÖŽvz¹^Úë|™Ó°½•Kÿp=S(ëʶK'½Â‰F¼¬œ_S|°¼Êgå `]ëƒ3+Wf„×4šl‹vúù§=,PeF’h >˜«Xx„›à–‡äïg,SgSrÏð¸mÄb2€VUÞ%öO•ƒ?]\È ·ð»Ÿ»Ç$9…ÉÇn¨$]ä\) ©ÆÅ&®/€Ùš`ñý;çÖѼV{ÞÎG?ö)¤•"öÕ¥ ó®qT;Òþ–±·³³mil›œúæn«ë «=×?cÂÖ˜#ºS¨&_+4{+³Ë[Lésu‡Édv‡!Çv;®òò­1D}67â\*2V»ôöð²4¡Œ¬0„Ÿ¤·Š¾£áb¾¶2]¡E+šÇàqvž¦m´?ßËPû}™äjXÕÂ×ΓãX¼Wæ‡ëEÒ™ŵ´Q%€7ò xmèyl{/Z«t|lÔ÷7ܲ§a•]D# ÈØ"‹®F»¦£‰E®k3 FØ®¨ ™Ð¥^,Jïý»m¼wø†ár³>‘Ž ¤³ý)’>P‘Ü·C]Ä%ŸLÚN.žÞ#*¡-ʼn±"œIÃçžXpå¦Ç¨Ée&ëãh*꣌vdS~n„«"…ß_Øt3hùäÊœ‚%LŒ$û©å(g /Þ€^h¢8®wnÌÞ mœ·‰Œÿç’ÄcÌ.ZþsV–¥ßñ9~eº °–žz¸‘!£„Ìg ¯vŠüL\5x+ºDPž†F¿Oú|kÙ×ß¾KóPù·2M% ¶Ü•n®Ÿ'P½˜ Œ8.-Ñ¿œ9"ë̯¶úÏŒçÆ¸(^;c#u)c=¹mípÔqù€½øfβ,gåfþõ«ÉÄã¹¢àˆš³”`UÏ™5Ø);Ê\çYèµnÙ'„Øf@k‰ Gr‡vÿ~ÒUˆ–ßzJYû…!°S—dí}+ï{ á_ÆE]o±ŽãI?WŒ+Çø›íwÏÄ:9ÞbX"à]?€§ñب&—u‚Ò¡>íæ™Ž‹¹St&X ¡*·ÛŠŽ£÷ž£vJ°›JǦp"ª„®R?Nò̓˳{`µ×¶ !ÊB6/݈ú ?ަtµ¶pÃXb¤Žf ƒžýßGŽ`ÿFc9×u¼™ÍN¸0CPœñ\8dÙfî€[§–’ñuM5”ꄌ›”l†îøyƒÓŽ´5N«ËºìÎr£¸óHÕ0Àb*àR..AiÈâR{t›9‡ÔínµhqÅŸÉü›t'aÖ3¸/ ¼»2©W%b°VjÒ[°V#2ªPü§åZŸa6›|‘~ê%»é½ßË$…%œ\A¥ú E(êpe7̹æÜªbUH_Š+6jÍMsÀIRpºÅXäkæ-¹:: µÍèG4o¾Éï ¦*§l³E¢Ä_–@œ(ÝT!ƒžÃú͘‰v ƒÍÚCŸ©™ÿ¿™âG˜ƒ¼Dx®’``âq†)ÔG,l{z…0ˆÌ4OÙlÎã®(0µ%Ḻ×ç|úÇ8Ú·®÷Ä”uO }Ä~ö&B ­}Ó‚ž[-|¼³€PøpIв0¡R¹—Ët¿šk¬Ix;.¸q†·†"žDYC±®½°åÚ¸í ³$iÇ©y¸äAš@ò¸qÐí­“+àliž´s%ðÊκxy%ï Œõû¡¼÷ç<„w骣R¥sO¯º¢Ç(Ô.e?`§×•ÍÐDžÊ‡Fe ¬Zã}úãv2Ñæò Lë5äØR©˜ãƒf3ÖͲ'öšRÛD:¶(RòxÔƒ½ß—_¹Sè|fõ$Ò7ŒqßÝ ¨ñªöEÇÉ£•uÛ@$™Ï×ý<òYŸPÍRã¡?º”*¯ÆXnAð‘@#F.È»”i ޤKiK ›½|'Üô‹KÌÁ×ás`úx­å.tm¶L›c©›  ›!pnŸ$/`¥wäwý¹Šž!ºI’×òþˆ.\Â3)I(->[×¼°²ùwþËZ´ýVÍ|ÀoºeZeV„A¦½½Eûæ,7¸CȫΊş­¦¸z;ñ£1ÄN:ÆEΆzœ¼m®ñîÜøšd¢ôtäW;w6`´ësj  M­88HPÓPð†2²ÏõbýK~ºZó ï;Áäª&¼)̹÷&³+oRî˜K{´gQc<îbB¸´ÈôšÂ>ä‡ÎzÁgó9§5¤–+E›PÌã$r.Í+!‚`µ ¼BÍ—6æÑküG¸~7³†`¦û°Îœ UhÜ!0àÃ$ä°d„û>SoÒŒÔÓP(èÜ(Õ¼¨·á1M"z ôÇû¡%Jµ«Â?‹òš+¢z ”ö¡£KGœ%Z憗pÑ+)[®@ (C*^W—(×—`•8š]…´Õv7?ÄßGpsKTZ§ôq^ ªÙç…ª±J‡-•›•:Xq×y°RÝ—‡±ñ,^á7ÖŠSîÎ&±Òù‚Ž7Pxñ’‹ƒ"ÈŸÍ1Œ3MöüœÖÈ·‹¢Ü±#Z/[üq€)|fáê{¸ÂT8aÝ G'·ºðÙ@ꂵ¨ šåd úC§he‰‹“ZiЩÞ•~h<<äÞ-GÝr” ܼ¡ŒMéÒº~¤vüuÞ~§è6vNÅ –*ìD¯ú@fÞ¦¼%fdl”†]R¨xK!Ùÿ’§C0»±{…‚«òŒÒ¨Ö6¾4üä€Ö­X|!ä¨VŒÎ½ÎÏWPt}Ðð1Ò0D÷Y¬:#ÑyjÂÊöµÔÇEÊ$`T u†E^oJï#kðP¼hRÎò{ ~¼E‚dCoUR*G¼x¡"¡{J]òã§¿Y½Áƒ¿èS¾áõåÑûßÂë¢äÚF¶˜çxTü¼Žïî0('ÆqÅÒCˆF•ËÐv´ŒRK(~VH#rz|E¢B>‰}’€w´Õ'°yÑ[,_ÌX:ˆVØ.)s"j' ^ð›çìmâêg^j0A ‚Êg~¯~",\á!3œFÃÒ†30™1µƒX;Ò/Y„µ¸Üo)öA!ã¾d"AÏ$*ð:Øÿ^&òa( %ˆŸ„8ŽNÓiw<ë›'òoúo'R èZ0О۵‚µ<ƒÐ4®&¿êÉM½KŸRù§ñ)ú¡sX(·²ý-~ŠìX®A WÍÌåx;K¹ר¾¼Âv@§Ïœ%‰JîWµÈÆy´{7øñ˯^±šWß³)ÂaZ]™¥ã),›yöo]N'¸iV;àC%ÿ´…ÀÃûd ‘tÖw¶Gž²Ì±-¡TƒY¨y&Š E•¸íü š<‡Ò««jÚsÂúˆã@eÁ”ô¹!ï-NÃsc(.‡ºÜN1\Ò6øœ“éð-»KÏ—i! #Ò[ü÷U”‚@Ž'³VGj¿R0"³/ê ;øÊÔµýJvº„DŸñµ÷à8QÙˆdÈr%kâÑ”¾¤=;XÊeéÍ­$ÜX›ƒ–ü5@›wé¢ôäоä±<ùé“ðA"+.™›T…†¿ŽŠTÍÙ‰lщÓHUÏÕYr6àÑX ×”§Ã>WÜ'^ÞI%¸¨å걄C˜ØÌÖ£wkS ¡Ø{ÈÑH²l;Ó2ÛªòTQ2Mž[ëká9é}ØËºb@¢ä;û—Ð[æàÕcɳ’vvÛ‹b8Ç$&ßEß¿«ü^Ñe4Vå$±°Ô_õ²Ñ±­Sþ|fHA1X³°Â‰Ê'ñÚÛs¡þKžåÏ®……U(¥É$LJåãÕqÇ÷ñqÞ&r~û±Æ&l„½ 'ެõ•AìƒlõÃÙ“R£†äÄNoA`J®›fšàѵï6Üe¹Ö9ݨü?=ՆǺÍ8©¾Þ±†gÖ°*™ÀÙ»‹·Ð`††ai}Âà=¯V$a©Žþ«ª\9û©èx;·Ï2TˆµÙ£õ¥U_t ÔiPM^Ü8/jà#öïM$´çÀO>¢k÷/ÜÔ3™¦ázEW–“çpQZ/Pî«NW™"@­JÐq’€”nq1ÜüϱÍÊØì¹_îŒÀ;¹f3ÞþZ£X÷ß Hb¸É£ø—ÞZ1¹\sD·þ5Èc_m¦s|Ü ÌÿÊ Ðšø‰wFëü·}§ ü£q…‹ÀËA÷vVB1C:ó!¡Q5¹EÇþ¿¼£ñVêßæ‰9®²Eà ‰MtŸØA&I/Ýî9RëÛ['ªŸâY¦ úO.?Nˆ.c)K”Œg^~*Ó)-“Ø&uO¾Æ M^."nò@ "Ð Å3÷ÉÝÄ©~‹Ùò—-åµ¥h´S•)W˴㟶´6IAÀþú/vP²3ˆù”ü€S^[‹¼I_­Ž£ÚY67¿¡ð(LT¹ÈŽšÚW4Ï  Ñ)Ú³6.Oé&™Îp!ÿ‰¿âL¬’¨iIÓ® ZÉë!ÙïBæ­nmoƒI¬¤â#;gUÉ›K“¬O"¹ÔtÖÇÜæëÙºÝÆ±l|d¡Ûì†ý2MÞû ñ/ˆüöf¡â9\ÁÆcË®â½ÎßO@olÎĤ+1*êÓ‡V¢G{·Ÿ©D÷ÝÜ?}ú¦¬~wTЃsŠ«šk—Nt)5Ú*tÖ@Ç’’HýƒÀ¬Ò¥Rµäy› û:§µ%{"}d 8îÆÿÀéœÕ3’\(Ø}±Y_ukÛtÈÌéxº~q=g Kk[#QèÌCÞÔÑ2ttrò$J?l´X¾Òþ þÓ¢w;-Ú¥ñ'´Wf$:Â'¶q5âÞC’täÿmXÆÄl;á¶ÐeÊ©¬V!È-7GMb­×ÌeóÎ]EB=mx(¨¼K{ÅÀ%èrýÛaVWeŽnôëζ³DœBO vÀÀÂWÚr5 lÅɉöÖŽcÁ +#9̦ã/…áGf'AqŒæNsÇnM59¼Vd@p½¥öÎ ÜÀ# !}‚¼ôi±ëöLv–ƒ àòV–ùHãTG*XlOUHDV€®ˆ(A/£É¿qw §)@©èÆOËV-ùˆ«ñ4Q¤§ˆŽŽtÔæ#Zq?Þìedhv¨0·)RŠTŸç¦ þ›¦&N`ÑsˆR[o›= Øí¯ç×´KŸzäVŽ£ÛÈõ“¼“„×JErã¢é¿Ñ­5R<VtÁCn½ÿžsº¬:ˆÝ·ºüÖí6ðg£7êõ‚©áŒG.ôi„B·‡À¶Fˆ!‰±eöþЧ€ûa…/m‰MnÎLmO¾ˆ¤Ô‡ø:…=® à×9w¨/8Hûóë3|cûÍò& Ì+—G9Óßü™FhË"¦Æ­Š?ºqÑôKÐÑqÂv Ž^¨nÑû_uµÜV*Ìðש¨èÑt‰ ò\CŸñ€¶3²ãÈ ·¤„HÝ5Ö’W®á®,÷ùíôfÌ(Êž ì;sc­u/)aR{p«pM4E•˘Ñè¬+þÀ0’ðhTa,0)fzYñsÌñÀ†=ŽV…e%X¿š§6:.rëµÿ… ÀZòky0}­ü{Bq³Óºbv¬1¶ƒ €‘Z Öft5‹v‚f€´§zÀe²b=À°†Ÿ«ø*‚‹2ÀÀ÷ïâw9-ãšÓ]Ë6¼W'Læ~><Òî/R6–öÐDA8×ýr‹hò÷¶`ê 5ítW½>vd&,𘘵ñ¦)€_šczÊÊsødŒz-N¹7¥SÑ Ø3õ-{ïÝfŒ³„/=ûÖÊkQFY¨À¹oSì­fÚ±ŽdÊe¡v†Ó¶ 5×ìv 93£v r£ÂaeÊt"H_§PI>?T@“h‘?<Þý² Íge<¼v¬ÔIÌ^ËMw“±Ÿ¤ÎÈ)¦'*Í…ñî\Lˆä–Y P¬Ý(¼f¥ßUޝVíºÂ›·Zxô_ŦöPÛ•®ÕaV*ÇðxÄ·Ž8¸…êA&òE_I¬…B¤o·š\%ݰª¡ºÝxK1Î?ñHˆC‡9AîÖšr?O”ÒUï{”¨Jìà¦G[+Ñ)õ!ÛYûµ‰Áð (žm'€!zX“i%¡4“ÊVÅ6¡žÙ¶5·ƒý eOæ°è8Ç¿|¸cè:³)oÎÓ[!$ Ê2ŸÎú£ÆSï‡c»Àú3Ã[Ìë¥ù+‰ùÚ¿MSbìq]É<‹³|Éå@Ô*m¬Ãû™b_#šŸ’ËC;¹x$V„Žæ·£«”ñ 1¹®4A•O{æªV¥%ÿ±Þ²ëºÒk<¥Œ))˜Ë%?ÞÃ}¢,>K§(¾0ý@ßì¼ñÔãWœÌ“¯XýC1¢%]³©iUסInÄ© 3V`þÃ;Ù|bw|ªhN™qŒ³Çº`ÂÀ3‹+ËòŸÝ#˜Q+ è”çRñÉtøbzDMdÍ-–ÐRÛˆ!Hå^?ø‘ãM_þ¨Ý …È&q•©Oþ1 %¦_RêVΖ2\ѱHÀý4ã÷u¦ìÑâ`+½Žä§ ‰ôiÝÒkwN žù[ZÚ|*}ˆþx–|™{ÂF:«ö|0½‹äÿ|~vûS ìX&5ñŽßà€°$K€Bò#-jÛdl5¥3·AÿQì*ÿÙ,ú$‘º÷}ÒºJ”ıYSR}š$áD­õñQÐéNBîždQï4u̘Kõ MS UÄêš…³ò!ë(È;'Õ1Þ;c¯ZLî³×äJؘ‘f|+G)¯ÏEaSBô¾-2Ï|pñù!0Ü0–âu}iâí‰àSÐŒµ žçý“î©|W¡£f7r5zÕˆ @OßNxO[kfõÍbÍ&- ‘ÆÒ­0[Zªæûæ@ _Ç ì-¬ò´ÝR·Â\ääÄÐŽLæ»ÁÓÆÅ#ÉÆ/ÒBþ%h·ÜÇ~Qj ¾îíV!í_¤6(Òe ´,-¿î#wmÞ•êÕ—<®>q¨YJ÷S\++ØŒ&~ÛVQ{r"uˆ JvÞ ¦}åâÝDšäHù‚l.>Ÿÿ”$,ð=<… ©äœ5+¡Rè$?‘{FpÍ%òŠ:pàñà'€ ËŠŒ\›‚˨„Yç`ÚmÚ’"FäÊŠÊQ€=¾5pW’~“äøÑ=²™Ëuc]Y¬ =>–_r cÿ„>ÁOÀàºl¼(g¤ìI[µIsQŸÞªPé-YÆj /ìUÇñ+®–<îBÊâO†.Ö¥ÄJDÎø37¾R$ùì󉨛¦Èмš†Àòj5: ªû!©”4©m¶zˆk¾ø1}ëaéÛ¨†U)èŽYŽ%MF õ{r“f"¢œ–¬\ò![­16«ázX®Â'!ü½Ù» )³oaj+ÙƒéÄÁ~•aèKUÏ»¥¾WEï(IqQ»Ó/[©^ Ó(TIçŒP$Yš—ÉD™OÞ÷QlÃå‰Ù»/†HŒoÕÓ; Åü{4‰Šà÷¿fŒ`l¨x•X;ƒ>œš¢tÅ!‡Ä'½† RP®l÷¤ ÅT¸‘–…3¡ãæ|ˆÛµž1ißNFtK˜*`5 C¼ä®ž§¬ÿ÷ût¯íBüA^ùGFû‹OéèN;ßýRz?ÄΡ„LâÑf͵'Zn~|Ø2’˃ª›3F ?ãRÍ«‘—©á;9¤| xºínœç`2uA9T#r†á>Åqߨ¾‡b‡Mè[ÅtbsÀØ=“˜.yšðvÈhxÆ£/ÙOgµWiÿÞæßtMí—mt4ºW©)ï /é‰ÜGã ÐÆ“d^2n.£Î"­¤EàÙŒÀô;'#y¸ÊÞïˆæcjgÛKèj¾ 5w­ƒ§áK ÔÚj%–9k,¢yc;Í„ñtsgÐø‚ž»LÞVžQ0ô·®mÒ^·s“té©°¦Ë „·®¬Òi>F)ÐÔÅ’¯±åx"zÜ6Q¢U­X¶R݃Wot‰l’¶ñS·u™Ÿ~Ã3C=9éYŸ~÷‹í“F_Æ Oȯ|‰q/–õ½ ú9n4iðXÈÎã Gý,Ó5´£•5a’<ÁJý__ßl¿¼ªü(LKùG/¼õ``ˆï¨ŒjAnp•p³ñv‘ ÿ?ÂC³^rV#‡?¤#Öw#SU—ËM7qL˜çÄ5.˜âò,ð«Ê Í–V¼]TÕÕU »n{4dÛî1Ù÷k€„G%6¶‰F­ûÚî šV¬ƒÞÃo’^už³ÀìÐÒ&>-?ò²aÞS—F,Ná»á2T‹ÙyAÀÏq!é‚ðK$³ŸâØ€ý¼KlÖ(*54ŒÑã›–רíG /äF¶Ñ}Åy0©‚3AÁÜÊ™#¹Û¢¦Á3âŽÆ â\ÊÄ8œœwõ˜F }‹G§^Û0=´2yV2ÙÒK‚ÕŽ¤vô/ǺÿþiÔ8×tyõäró¦¦Â7sм­G¬¿FñÑÊ&‹àµ: n€Ï…¶—oí•k€´NtbÞT—áøa6Ÿþí´j*逈·ØÕ{8Oò_DJb…"LÜlQ–Î$µ<³ɧ­:—#=T¶7¡,dVA ØøEaë†ÄX-s2ç«Ê\°§ÚìÿÖÝåþDMYýð3«„«QóßK«z|õ¥1ÙÓ”}!öxä¥bÚ&Pƒ\L€p8í‘°Ón@‡5# õ²YSû˜`=òµÉC ùaòIRó2Ì:|žK·™œtý¥7Æ-×±¼Rr™É¥ój,“ÊÍr&êas• ²È‹”ó‘Ê—êV9†õÇQíÎ0¥)ÊTôÑI$\ä߰t'ò0÷Í•v^^üê1ájëK ¯\ÍýÊñeÐíºò,óBgÅYGþç‰Z2ãi®‘LdìT_ã2ä ™²ð¢ÉñÉ %\ò^W ܇­ÔÜÐp6xBð±¢ùè@F?_ç¯A>™Ç QZ¢7 ?7^žqmö²m˜váJ8Z’È`ìà’eœ _·>̤ è8iÈãqrÏ¡ $ŸñŸ€ë"[ã«M…ådïþd¼"oyŽ!Xü/g&½KÏ A¿`E ÐýüðÜ:Âçù~X-šÁ‹¢×2Ã{5\½Ë3ÅLn˜\’0œŽ—ÓÍinZÉâXÝEu„J¿3Œ=3 ‡b8_YdÊ¿a‚ÆøçOáõX E¢hðþI…ÛÌš»žþ8 ý¤§æìÍu–+˜="ãÀ‚ÃÏW¿½£é´T»º‡l}ͪ(Í![ÈËæÏÈ3Þ²ëÎCѲ¯Å.Ÿ÷3²ºVì7âCÞzZ”-6•E ¤þÇz@дâ÷Y–âHÀ“^»FDäiÔa™Q„p­¥ë‚ÏùÑÞ„3ù’È~œ8« Óû嘢Ø,Ž ÅS‰^?çvWOè\8w17¶q¿h•Ú^³´§­þ¦xÎèÕ‹8Câ§0™ìfè†T±o $¢–% 5yùsZäë¢7õ—…õ‹^ÐøÆyvüú“ƒ{$¡WŸÝv0T]TNs*üíKeYUÃÕ~Á÷Dzž$&#\­i‰Ñ§?€äÒªlPÈ|Gü¦(ZÍ·†žÏp²Èµ ¶ô EsI0pj é ìá{âǨzP]åଘô¢7XÕFµíÔ¯ë)èį&‡ÞœØ.*æÇöqC+t¦‰Ü7ÚöÎà°0ûü!ê]ùÛB´Ò†f±ÐÜ‚)å5* \Ç=w“¦¸4ZƒÄâÊ*å” Æû|úw øÚyäeïÜ 9cZv§ác¹šòõiá¯âqU^YÀÍe%M%Vù úê%¸(¢%T¤ùi¾G¹uCõ•†Ö`ý˜üSÓcV¢\åÙ»²õú?7iŹç)ï«ÄÍßNU=æ¸xR)ü´?•Ú‰¡,PÄ ãâmTñ€h:u^p$¬úªd¸$JöG9Äéè›p²ü$D þ^2µ¹-<ÁIAõ‡÷5áÝô¾´5·}´×1^Íôìäú¾oDå^€lM)t}9ª©1F$°AÓð¯oŒÃWq¯nçæ‚6w×.VKTtÿóîkÔ¼o‡¡¤ÈŸôçÊhßPmžx†€Ðö›™¥‰€ÁKûã@Þ‘Rû®â®<,¤ JŒªd*ñhU ¶ø«y±ðÑÞ"‡YYns +¥f³wqõß¶›÷´ö¶"™;„_ìcù¡ç:ò”/<®eŽÑqâzÝÏðü0"”i‰Ä„ î¯Nów±è^|LoÇâRúƒ4Ï'âø†>s´`×jp@yPªIéݳ#?¬òJ bèõC!{zÖÏ‚3¸ghÿÞÓVVýà°,ôSò¶ J‚oèRˆ©˜ÝmtÀ­%»z€NØ¥ :Fõ)wÊÿ~—£‰›Oš5ˆ@\íñŸ¸v djTüxC¾%½|Y`·•ç¦vhD±·Î…0¢çH†˜QéQ¼ü ‹ßÚ«µúfÀü„m‡ì´ÄŒ‹yàÑ­ªç[ñVË™;ë9Ò_…¼¢(¿›zÔtÕ HJ5‘àã÷ €å¯_ëëkT‘ѹrש6+²´ë‡[¨ ©éØ&lr&­ ®öÄŽ$&§xR“ž ¨¤x3õ®”9ˆÛL„ߟ@\{b¨»Jš—«BèNØp¦,üæË©LÔ¸¥NÕP\^®r—JduãÑÛKAª ÷‘mÏÑE§ÖþUŽºÙ=fˆÁÝïäÂá‹çËOϦt_1Êò·¤©TžzÁ4Ò9œ¹¬¨Á> zê!N|ŠéɬY”d4®«[ZCܰáâq‘´|ÀS¥µ³ÉÎHàÆ}D»èŽ–LCÛ\æÌ±’â76EåñJ¹D^„þÈ"@ZÞ™ÇKÆÊk÷bù¤†(‰` HE<3”“P;¶ÖqÈöª1Z9èŸlØ‘FFöÁwà}çŽ\°†ûèîM…drhíלÌÀ¥1@ê ¤ÓÙ-=ûªsÚýà¹!Û÷c´Ù¡C’ͳO ëóa êʸô?²y«fÇë³H1 Ï-oÏö™’¾+[(;û×ÞœðסÏX dà"ÿ%`¤H”¡ð˜?Ϭ`›ødž% …^¸H8PsB\ZÃS ;½¼E6<*¼N‰‰h“m³3\ìÊ@HÆò¼Å‘21ôŒ¥aôÐL—k'YˆÏ{Ð —,î Ñ§¥ü4‚0ž0ÔâzÂ=×8'ÓÍf‘áÜ(ï;’ú½ŒOaU¬ë7÷g¹È—÷ÙѤŠYÍŠ+Œµ‚*Á½[Åy¢þýDèÒ£IÒ-9Ž$§›rËY7´úIExbÝôæ<ñKRÔÀiïs"­ŠxžX;àiQ†ŠÏ /b‹¯*CáKš%›b…œ ²…| ×µ£¦YM23b¨÷,aøáèÝ«°ó«Ÿ¿1,SÏ¿‰Ž*„ü$" ¹ôÍÄ÷$ÀáÁÂhê S³( †1¤”g¢´2Œ“+[è`TáXχµž*Œ}?³Õ0Û˜ ÏU=·504ŸµÉ©*÷„ƒÐ¿ªÀ´z°ð¤çw»£‹ôܯÚy†þ=HóhòÖ{Oó`ä½,LÀãœö÷w vG–œ7¶öQ¼¶# yõ* ã½üìH7 "•~Ôs¶©AØÄØ–BJY‹n*H0דà<,Й:Ž!² ”¼­Ë¤ØÓ=r« 35á7U  ã‡øÒÅwÞ¡ÿÈý¨4õÌìƒ9£ßgª¿›<¥ûÈ`¶Â•þ8Q`\ÓŽ_×4r‘ü «aên”Ô&µEšPó$Ïó®s,ÕIw «©¼>òØgœHÒ&Mó•$1ÿÁË€–>~ê,¶Å‹ŽQ™ã:¡~«"šû/£.×w…¯…<¿e=Ö› d§ƒ˜p@fÜòŠÝüÑë,åд³£^dœ!ïHÐâ"S}šåâ‰:›ÐŒìó“.òA𥽓5XB""ç©,Z3BYÀE>¶×&¬è84}’‘¡tyÖñWÌgæÓß½âÇo6«[)))÷)£_­Žv"o7SóSÂLd ãdŽÁ{êÌ÷Ëø—(¨NXÈú+Éûnî¼P—jG ÏÇ S}¼ªìÂ8¨g ëó7Væü CMÿ ‚c  84åÈì‚åÀÁCïnTÔ¡!ùâ‘už¡-a6¼2c±ÚBMlœ¯ÄE\}z†ÖéãÀ3cèípÈ!#ÞÜëwXK†]…ºz襙­2Û<œ?Ñ訬¿-3žJJ4ÂakNu&5›ôoF!d–®†3'BpAo{¡Î„œ¡³a~ƒvJKfl÷«(Î̘%ÈMx°¶CYó¿öm˜fŒñÎÀà‰ä´Ú'i5)J±2™ö^¯S9ò*=úÒ ƒòÞé¨õŠ3 ¨6`¢ª’ Å*À±Mü6¯ütV¿@½OD+œýç0Z/‰2è{; ­ªŠ´k[e•é%»Û˜‘±3ôs”òÄF»,S(¬ÇÏo57S´­ë~íß±Ýù·{ZR\›Qcä«Á‰—:*P]HtDNm$È ­%züv¢Š[-aŒü¨UëÙzºÊqùÕ+UAC§ÚÄÃ,EpBêÛ·†ñ'b­œŠ¶zS¢8=í6Ôô¢z½÷üA3YWZKy¬ijÞkY$·“îŲ_NcÙN­®]8(B’3À[\Nï•Y|Žh=—$(1P¯Q ÕÅ¿xŠ´é´ ”›¹æ&(Ž;;Î rœSÜ ‘Ó©ˆmØÄ-Î*x ­3Ü`VCÈK~̵kü,Ô°\äò‚¼CHï©¥^enãqÄ`RŸä”?oœt^º†R~u<åÁHaòàŸŽäñ8~õ¨]¸tº´EçjòÇ ö lkšýzPºªˆ\”{çÂ4v”§l3%f}j®QNQî Ηݾ~õ+§Äs·ú5m¦¾$@:ïAµÙ)q8?TÇäö¦/1þÁˆˆfõ¸í¦g!ïI“ı  SB…Zßm†¯µòÑ=ä<Äå©\I?¡’Ϋ@uyMuWêÔ>é3·ù ¸ÂC5¦„BÐñŠƒ´2þ¡cÂ÷Ãù;¦Þ&ôÄ…nzájöëQYVxN%%é¯é÷#\æ¸àÙùl2¿íD*Îç(õ®™®xš®½f?ݵNú£ÓW&³ÿ•õâdí§ šÅ«cíÞE,Ý,ì-•ÕÓ:ê}u²G–˜[Y¢y•öBñÈ7ŒWÏÞÀbñʯ¡li…·rÁµ¯hš"ÞY½µøâL¾Y¼ >@Ÿój/ Z˜Xˆ]û0ñ ]˜¸Ò·~‰q>2jZC+Ç殒<å¨Òð¤#`ž.ð000K,úFì4ꇕðçe躣涫iÚR•™cþNe­¯QQÙ˜jÇ;ÉRyšggm×¥(6'*ij™î eA( ÉÜÆ ܼðc¨ˆÁêtJYO‰„n¯Úà†û»{ãÉIîÔ•/$<ïŽ,ýCùYiƒŠE`sê…æ·)òŠç¾Çï®bYW³ñ º‘Î1-ÐÎû#!ïx6—LhªCÃ.úöœêSú[J¹½Ê‚’e(ì&=U{ûª×~Ñqå5Qñ߬x8†Œ"ÉY í‘_OW…l6¥'´éeŸ &°[¬{Ä0j²¼‚µ^üof X.RȘKÛ„»FR‡IÐäd'ÝÑ_õá9•9¨ÿ+#.sw®†õ«ö ûÉ Üš×ºt£=Ú›ª[ª‰²\ŒX1€v‹ ¸4…#doÁ{Ѭv ¥Í`ާð­ì!:¶)XÄ]¢þ_Éõµ;£Œ†Ü2þxÁaï]î²+ÖͱÁä!ðZ%eâz|žN0€;î…y„‹ùV0dÞS!žæ»o™ý7§Dó\YÊìFþÁ%D!먭 è*KHéè«Ñ¥ª&?ŠöRÀŒ <3gMÊž<DîšäÀ¼‡Ê UU;¾”¬¸&ÒfÇ«Ioê"¾s™‘¬ó¼µù¿[·ªâˆãÀà”ź»ù²Ô¢´Ñ Ólaþor">®}ƒZ¿êŠÞmk5mʨÐ:œ"Ê+1X~åRväÞ‹cÇdpÒüXÆ;u¸[7bMXK{C&ô?:Ø(SŽOêÈò¯©5Eïe›VË*Å»òš‹]ù«Ì·’¥Uê•©a ò敹ôÃ/ 改#0ëM½ï0¨`–åнúöK?ðÊ¢ŠæÄ¬%~õ©üªuë 6àƒ[±rû– žYÈòwo@Û}#»?$!vŽÁ±y7ð¾ i”Ö‡8MkÓ½êVF]‹À/´= ˆIuö5’”®¾ÅÊÈ6Psá»øê‰s÷Aϵ‘¢6â‹^Kbr®J{ÄŽ{œYu»Aüw¡0žSìëÉ„¼z“u–H/ÖqJÑâÅ5 ’W„iƒ©”:^véif쯽mÈÇQøìR%…„!ω£," üR¬MÅÈä£7õQVç%4NTÅNx¶À¼§.|é&GѧÁþt¡5O$`‡Ê65{Å&;—_ #×z9ôÇH?X õdH% ½hoC„c¿L*>Õíx?ÕÖÕsÀ} ¹Võ1†§H)™F-“ðª},âK(¾¸Ù+©¥d°i¼XÏU¾èsTµâ}‡ ÔöäGšLõ £®Ä›dÔW'!òêö+˜’nCäÚ |¢àç\U,/räÚ«›K2À½¸R:i¢ÍÕ|¸BcúÜŽ3¥§Ö€t—¸ +Xò@÷ŒËž Êè…QS6 }Å5∄þŽÃÜŒëcSîa?“öQŠwô‰Š¦? &Èd Ö€ñßyꫳ§žÐ¶" ©Ü%KÅú/%Õx¾e( ñ| qìAg÷™?YÈ»—Oe¦Ð ti°ˆ-©Jï·š°LÑL9‹H•¹Ÿ; Õ>Ž)´±A¹Ñ½,Õ~<@LÔ8åàð`Èzåß'¬Ñy³S9ñšM[¹ ä¿·0¸õ¤€­äNZä4áÌeð[‰Ž£L qóôžÿú„÷pT¼Óøo_¤jyp£Ò=rªyŠ `ú¥Œýù*3¥M¼1Z7$'¡DÆ.}eý†¢¥~8†vÖÒ¤~ÊØzrW„v-,îwƒLÇq‡š™5Ãizgãþ+Û§>©Ùîe°]n*`‡E!¾³–СïÖúÁ™Â’Äö9Ç;È–¿I¿5Q9ü¬“áäMŒ·»ÇˆQ¶dª…ó7® YK}t”­f.{-N›S¼¶Ì í2.Ðɱ_‚è4›·5Ñw¦î:ál1ë+&sf˜PåJ‹ÔÚ%Æ@‚òƒ ‹j=¹¥h›/³„nAM;caÀähÚP->¸(܃gX1.ßìZ.€‹êéJûá9}Ïy]€ú"&Q·.›Š¬Al'„¼s S¼Ñ4ŒÍ_«^•F)ž©¡Ïà@ÚJ2Ï…éâsÁq°¦¨[„RT’ÔÜ¡0 M~:w©Ó÷ÎMø3 :ÉhLœjtvc+jj<õöX.4EïCŠó±ÿíP>´ª´Íåë6Æ[Wσ÷ ¶Q¼R< ?Ç8€±ÐÁè¹[Ò^r±lN:¯ÇÕË¡Êc`!6/®''³Ó–,ùßßÉOEêMé‡\v2ë ?ýG¬M5DWn/ƒ×²_©Ÿ‘ö+Öøä”[.y«ÿ\WõÈ2*•åêZ‡ ›p¶Ïó ¹v ÙßäíãÝ¡àïN˜a­¿ sžlƒõߌ¶þº·jÿ«ÛWb0K¯CcÅ)ëqš 2{ЙFî„Á)˜Ç‡ª>[xÉd'‹-‘öœ‘ÎGÛ»BYXÁFª®ÙzsèCŒM˜„뚌’qZü[#ûsxÔÅ‹¢=PÿÆÅ¥RËy#‚= 6‚ñw‰…% x–QE  /P¶3¸ÁîpYxAô+sè„[ÜÅå 'A|Æ)—kœ›Lä;0}˜ÉÖ¹²uuÇ—Œ7±z4éúdE æ,Ëâ“ö½ÚP^en„L­w& bÊy‘TÅq’¹hprƒ¸ñTæGé™H¬1üh:´Ró4íÇCÅIJ `+õg×EnNA§¢"XçÃAî9ætlt§>ïS ›Š&ÞˆÛnTÎÌ–ÔOÂ:wF)ü¤¼²áe<‚ìÙ»é9\uÔo™÷Ù \< ¨2Ú¹øCÑ!¨Ü}55W«UIb/?²ÛÒ¥„¸Ì•žN^u")E½Mšúw¤¬"ép ¼Ÿ­òàfWc¶(åxþ£¹Áò‹m*è®_0“ÆÆ°4havø8ƒ8zTÔŸ=9\¾¾XØ®)òÝ’²’•-3°úI/üq¸^Ó÷.ß•ÙöH¤]¶«Ð„iw‰gPs‹Áä%ÃDȳˆZ(2ÜÏp͈ÁOÉ´ÎDÀuФ’nîíQ»­ÉnÞ¢.h_ÀŸ>ötÍ9~ÿ$ú›D@‘ݜͮ?–±Ù¦ÓODÃÉr”I2|3lôAl™8‚¥ ¹¦VîZ=ìÍže©Î(ÛÙfÀ[½$$é®Åñ…ip‰åkø¶z0"¸E½àHä]µS&.ü9Ãý„€R|ôÑ4{€ aüáõžmbÂï4„“æVŸO‹æŸW†o1rü1ßêƒÈüh·Úê›}[of”d9û‹}vš•${æcúÓµJ!"’iýŽ{–ºí¤·Å—DyŒÒÐã®îNØŸ<>¥ô»˜ƒÀŠOý‚DEiµL8’*í vFD¦28:°>PÃï€Áó šœìUý6®·èÑOAKwDÔûg¢ éËûºígüý½ŸVÓB ÒÿÜÓgÈ÷9 U' m¸[iÃvâ6ªs}á‡}BE¤G8Ín³Æ—ÿfAQ¦T<\&y ºò—×Ü?l¦vSf&Àª,˜­žÙÉh2Ú[}ä@ëÚÒÉ‚¥*yqe§©¥Ñ|TWp–A·uòÌ\áB mëIƒ}#sQ™®žÂ©¯h–J ¥Š‡­  )XCæTâ_là½ë˜éh®ü_å`|™ïƒò°2‰FßéèÆüت]êÌ-[úÛê°^¬JþåOPîŒXÇé,2ãº!¢©„K 3~Â?:Œ-ZíGò¿†²“5cøœƒ„×éiÁ¿ve:q:Êdb&œlJ‘ËŠæš³1ƒä´6Ù¶ÝÌG€è>0`–ÓÀ°8¤|ò·^'|uw?ªfÌc @*S}²¼e¯v’¹0±›÷íXñÔ?±ÁO <]©árÊUJy|2ü¼7T{:[ä¢èè'°ä›¶f]7 ˜É¢/— Ϋ "‘`áÖ’qü8!0¬ù‡>5„}Qlm æ$ãµ2·¬¥ÙZh Há¶Ì/~5“ÿ‘“Á¡°tNù±%« PÉ”³’+\xáŒÔ,ëp˜¤x’}…íP†ÅbÔòrk½ò†'%p¦ìzP¢Â„¤RøŽù£9âS.ÆYõ§ø8ôb+ @!Ý ßsÚðù…ù@³4³ª'O²ºY´8Ó_5Ö3pöæm‰)!üϘ. ƒÆ ‚‡!¸Æ~ï¦#ùA„§ÊËð¯Bå@õp3Ø\š¸¾Â&~×óÿË®$#²ç/\Æÿ{z%ù—¢[ ùŠv«Š*ÓY±Î§ êÊ Þ™æ©*C&Ì´S«qË_Z®3Èz Ü·úŽ~ÐH•Û˜àz³ÍÁF¹Yô°Z-`õ‚§asR*1_1 fF·fdxD„×"éËC¹ ÙØ­6 @¸ (ñ }¼:øœ­åe !~]|ÙBKü¯hGòLÊ5;*ëœa¾áv°|0ÍõÓñ—T¨vƒÌÓlŽô¾N5™yÀ'›/O|félÜs“•ÛsÜÕÎ}•'‡†Åœ  tÏྲྀ¸O€œ'rey’¯TrˆL.Ðjd;Á’E”Î4w%ɱ³F/™ç½d }‘×ûMž çïÀ³ Oãç²Ôã5ð´Iüð”½qPôÌÑ7üW—ùÂÿI$P-Í·+\Tad^E½-A!)$a&‹9 I–ÖPðýõÒE/xÛ(ÿ·Pºüü<oWæ»è2Àì÷-Píò»Á5DwŸk•€Ë}®˜|äÏ»{içD§G dã<1‰$ç}R+í§ûÁ¶!¶ ¨¿B¨Q¥ßùKeWB\/öQ´yŬßî¤yzHôèJøê‚:µ„ˆãÒD1<ß~׳VX£ ÖýÅgs¥.kí57Lwz,»†»ROB!„Õ·q©«Èþ׿²¶Ðd(wCùZ´æ®Žm+ø «kºu' }j‘¤ë8™Jöî/|ŽX¢°D˜ÄãI@0 :ØÀk^ïyɉ ÅKŽOhÿnz°úÑæ*d™yßѨ¿ÅRl¤—PÙùûAcæ©ï$K룩i“ÔEÁ_Î0ÓSŽ"rmHu˜¹DèÜ—R’]©žB…(~6æ ;g8ãGôs쪑ÌËjþï/&#'êä¿®ù;ˆ“1úvã§c šéÁ.³†`c2.’eê°šîŒãÛ»–ZTZx£ w#qÓØ’"†ÇÑü#—jå‰{mÎ+ßDŒPŸË]…WQ«^ºÿïîl›Æ ÐmL‘Ñ¥Ù‡ÚŸ;üc%CÍYsÞ&V—ûT xZÇ!^ô|ÂÚ®}ŒÂo…=Q¯TMëtxZ$E:¥¬:lZoe\ŽNP˜Þa´ñTFþÞdL\H´ÖKeaöc2Â0KCÔCÉÙØZ²aÅ)OŠ’º~T×#{ÑìS>Cn(scæ²’O‚Ïi/Z̹fmˆ&ÉTjÍ1Pilj† t†áÃtðºs>7RÌë©èKŒX‰Iºùð%ÚüÎàýÎaG%’bуÛ+Ÿ²­¿¤/] Z‹o“ÞLjºEÀMT/K6oÞ»¡[ Ê*Ó|ï%èch:%ê]Ds+;•£¿‹šÙžZ–kØåR™§sfÉ®ò¸:E?qpHêú©¹‡r¬X¾ˆ‡Üf÷Múþ„æµK°þmǰ°ú„/³³öþ¸µþ»¿1KC’ÓÎËqЋM~Ÿ´yù<Ä-j·u!â–˜ ¤b:È+'ÆFxVXÄÇÑb¦ÁsRß!:«õa.K‚qrWT€`8XA:éQûT©ë£bWmD'X™OÿëI‡×PW]Vb`:œþ3–)!ºÝQþ1IšÎé¼?Ì\[Mà:´TÜk­bæ|ƒÎטD.ùÆ.ïIÄ6@0Äç6üÈõ&ç!|‡M¢õC2Y –ë8qºrg"v˜ž&?ØXUE~$cè°y£ã6m!"+ØœÏÛv¶èf/EïýŤU[à­j k«‡ß…qyj¡Wu0> 9/p–wäÙà$bû#UIÏBśў·iFÉn*Abî5´¬2!,r_ |äj;hºCw¢À‡`SQØž'ñÐ1 ¾ qì0¼ÿæº2){TT6ħš «Èæ¦9ßB]© ~WŽB?³?h(I%êr†ÌFÃ÷zœ7%Ë¿”¾‚]y…(ª0é4°¿70#ã ›ç9ÖÀgå<ý Íìǽ+£¥ÚUu=)Û–ýÅ]²× >¥êrHOug&ê‡&†û>" ³d}7Ýc†ÚÿrŸz^èŠÑ0Ã?Ҙݧ8$ey˜ËgÚ?R§´Æ¶Ž&¿Ü1 rÃã?¹ëû3YGN3q>m§Qñ…Ì»ÏÎÂߨ¥^!7¸\í FG…7LD½‰‡TÿÙþ1XļÎ^¸4!²ÖB–0ÿèd ãá§Üö:‡U%d)Ãi¾Lm¯:€Äšr˜žZØÓ@ý#.á9¶ÇÏ)¢²ìX\jØ…¦+È4¶aÄ“3CÃbÚr”©æpRQ¦~52Y+@ìK uËùŸ!•EByÜeÇè V{M “ÇtènHÄ1w@¤Pîj¸S´Ä3^€QÒò»OM Yä,@ÅŸKŒ_@zë·^ 7@¾â=–5÷|]vøë;bP¸e½ü^̹-þ¨·gZ/l£†jÓh–”ó2ÁJå¸gz‚BÞ/ø¸Œ¢(@úÙŠÒbð¤!FUÃÊåps …,4¡p ŠE @À$Qg‘¤RHêUsw€Ûi™(•«ôŸP­,wˆ­;—¤ëDD\2’ú70€ ó—‡r{õ!q‘€][²j¤¡µå…ÔóÙ½û®j„\MF5Ñm–“<Ö{o®Ý|Œ*“èþpksÑçðŠ!´p7 ðo7©žêµÁëxÛÒ,Ô ÙèXÅûóoëšv5‘¶35GK„ÛFõàçß j+‡[PÑo1Ä—Æt—Æ5"ä·=]¢¬µWúâSµ„‹ØùuÄSŸ°SΆökáe]”ÃÜkëÖrÙzs^¤»³*‡qŧpqEÉun“‘ãýΞIy´­#žÒf#¡–é §//Ï2óˆùD$´òÊ9wä­Ý•—ôìc~àú-¡ØTMÊl»Ä4s«ådüQj_ÖRÌ­ô;ë¥-¹iΓI¡Û|Ð1à ãç‰IŽƒ„Z™n78C8Á|“Ûdâ“È33€˜¸q«ú WçX¾}¦ŸŒÑúÊÉoµ¶4%êJeçcèœø8”°_øwØÖv’{Ô¿Š°"-)£Šh;î450ÞJºCù˜x¹·Ízüul­ƒ!;ájºçÿÍR6\”x¡gø+½WiàûB”ù.lÊõ&åæ/ukÖ: ;Å aE[n"oàãÍl͘Dßîé?/†Òû´è™R5gm*¾^nsÖ+•F€…9êË=?}ª%©gÉ÷Òòy†CÖ.%†ývnß­™l²êå¡gʲ ãgðNU6ïß®ˆ*ð%Ùšºaœ€iOå ¢Ì .Z lëE'Z|˪Ajå¸íТJO“,atÐñtjK @"Rø#t$ê6ê cïÌž-æð{#¦$ÏËÑ™?û¢¼Œ¦¦÷Í̆GÜ0Ri¿;GE‘Ïø®$ŠçÒ³Ï-»‹c'K'F˜&†ÿ×”¢œÔÞ^ôÍVˆóð¨Þº>üè8”sœÉWx¾kôðQßÇ ­XXŒ×*KÅ€5~9·¬mî^ ­aAO‡;¯Ù»7ÿú5ö}×öù,V#Ôçd_âò J̱šP zuˆµÐʘÔáÏ­_ë¦r(œ$¬Q«…#`K=­¿ÖR¾HYóP'52i|o’± R}¬,Ämf_0L©‰jûŠ’DüÊúÆkZð°äS:Š*²‚y ó¡õ¢JypA³qªÝ .!O±á{­3~l»Gid…mòmÄvbF¹J¢ ™b:ºkk(?̵bÔºL!„Õ;ÂÐÆb|ŒëxÆÚÈ Y*©~Y‡Š¸Qå/³n™PÙF¬Õññ eÑÓ!³Ê6U„ÙÊ‹\x°óÅW\ó”0sPH¤_iý/ǹm ý‡Ïjøè –µ›.U­0,ã#Á®ðD~ï: y_µšM«–ûfh¢Ì &¼ÿÈ8šì¾ÂtHŽsê4|5t‹8@ƒSÀ9ÒÿRþ|ž7 Ú«‡>M,Š€ÇƒU„ýËØðáT¤#V˜f®Sö‹ãK‘‹o©2•µ{¾+‚Ùëý¯/©Óþñò(ê¤ýmQq¢î/£•ƒØ?®ØšEßæZæ”õ©ÌýõMí r§q™ôov¡ëˆ4I—†³Ä_í vèÙÖ}z@P|c¶ž»?SÊcÿ§»©·¢ÎB¥Fµ› Þ~FÜà´÷£Yí†ržC>h οh’ –® Ô¢+ñì\  qïð°-ý¡Rh.™Éssg†ÚÎPoS€o¸EAÏ¡ZúßR?ÑÔÑÿ}"±ÍØ&½Áúb_RIOºÚA…XçóÃø…i1·3_ 0V“ŸîÊÈ )ôÏNŽ»wú“ D7@nwÔšYä0ƒ8âM õ®U9;™ü”‘*b_þ‘.ûïXuüÒ_†C¥Œ“5õ`.ààÊeŠ»®ºõK3œƒ6`« òP°Þe ãd!]Þ Y9o/«€îÆ=º½Ãªk»vˆWkÿ“šÅÁ¸óíǧ¹¯âÆ öíeW„£÷õ©´Õ³VÝÚå2 Vi˜+ ‡Á“sY™Ú_:wÊØ[Ð=™ ž@7êݤA®‘ÑåzKÉÝŠÐAñ˜tÉFÎU¯¨,Ï@ÕÍ®âö7¬…çÈ¢Må,Õ?:ìœÝif†è‘#µwa׿íž0çæŠÑÌh t3GNˆ†$9UÈ"Òp_ºÓªÕþ­ŸfOÙ8‚©eÆû4Ók|«žç q‡_U éÄ‘ Œ³×^½Ecå¶ýæÃù¼mž¢$Äâ^“Êï4Ú_æ;´¨kƒHp§‘ê”`¡çúd´R_èƒÈOwžA Œòröœy,[Þ´Ð-¥Ç{4g°Z?#áòh“Éc¤émê£u´¼iîŒc±ÝX¡m9ŠúõïzÞ«!"yÇkéñM€ùçvB¾ÁÚ –ü²\‡Õ‘J=A¯:Öµt$ ¬Ž’žq{NÒ´K ÓìtÐód2ª  ®Z8tŸÈÚ&½$E0gi>u´޹æbµ—-)ö±æ-k"«DÉÿqâߺÈBÖâYŠMÿ5e'ž}áT{ÙK"jø´Úálâ©Ü¤Ks¤ È£1[Žv^‹*ß¡Ìá7$0®vëÉ7? J"®Á9¯Áí|Sƒ Ï;šÑÇÐú-‡ª* Æ|¶ØÏɬb{dôjÔ* ¼ˆ„å­BLZë L;!T€Dˆ/»/,±J)$$”Ó÷…WÞ—1Læd/µÑ=: " T1-$Q£Â…°’¤1›Ï€Úö0™¼ŸnŒÃ¦ªÖ‰BOEܨŸÁab~(ÿÌAº¡bùm.QéÀ’ç±þQ2Ú(×&ÕÎS–Á¢L–2z­\®b¿vGXê.·P¬Úežª|OÆfvrQ*è+5x©ÏÞªï±l(= âÔ’2Z˜;N6xŽ›³´ÿºKÜÔb/ÓEª9´ãA²µ[ApJÊ­Îîò£æ4?N'QgnнÌ[ÚUK"}¨F õ#à…R¶mp8yaë~Jå8Àц/'ý#"Ê |§OIë9Ñø1èĨÈ̯3&ú'–qüº|‘9Ë®Q§ tǪžG;aŠy¯Ð’Ì@ª ºC›õcBq·¼îjÛc³âë˜(:·)3¢ÞçåÍÌ8Àö±K‚™i.màòÓ"ÜÚ )÷ÑÉ×ç]æXæF,3P» ä{Göx¿Ùiäor؇±X„´:Ó!gæG/æªC²r!ãMž¯t¹U!´ÆdŒ}¼© a\aŠ`•«€â³ª0ã% väW$KV0y»×õ@„R®Ï1tÁŒ²(ˆüðŸXCœÎ¼¡•Ã+Zá€Ô7-yÜÜ¿©øÿƒ‹ô¼T( >8z]O`bZðÍâ‘Q_BÝÅÄ®uþ‹<@RÓè»h|xo£ ©î=Ž<ÞoÜéz뻞ÔÈt7çøC—ÉÌg9¯Bª6-”,ÞB_cñ¹¾†-ª2 avHáÐÈÞVÁª)ÿˆêþ8få6"·c@ÊW ¥åÒ)n£EŸž#ÌiØ ,x@ã¨ðŽ´žqÑb8wé‡4k~-×zíæÿy¼eÍ*ÿì§„PÏ¿0¸ÛÆ©%³Mv 8Ë0¦hå,2±\ßuûŠál,A”8ô߇m;B̶ŒïðúÒ¹ñu¨&Ôù!ñ·…mߪ]éæÖ@ÓëÒ, ¬À³ )li· y Våª[”ÏåWË&!†rÖì륱2Ùâ@ž_Q¡å€­…9Ð6ÝAp³´I >wNn tG ®/J¹‡C›¾;?™µa%„“·V•M‡’Í›RóÀ lOÔ–'Qºü×0˽¨ ;÷®/aИ${¦-½AäI•®µŽe@S@ ÊåEÅÐÚ)°ÆÿôF給ٹݘ}¤ ±x8´Ù]!QXú¿¯yü>š’î½G(þÜð85–ÊCDÃF£öý¬2«ƒ„:Š…ž¡E×jK2+h|q“:ÿÈ8óe ´E7PI Ý$ ®Œ=§»ZwÖ”dNFÊ'ÜŽ–yÝH¢Î¿"üD…ˆÊ”¸µÛußÎ=%n0?¬ß¼. Yñü%ŠŠ5Qºw™ÇBÊ‘öàUÊE³Gþ½,ÀÅU®3´ÒÞÓúœÝ;ñ/wÅs/Bm~¿œØ j»õýìˆ eaƒãAH8CyÂIËM\ëÍÃáZRemæ 6ORe±)>M›V$øÞ»fDÎGKGw£Éž?~¸ÝÍæ#ìØ²Gÿé9|<Úp»Öªbî—¯è{Ú_Ágºåû¼ƒÄW…µõ0!ãÂô´Tª)K÷:#±ƒØ€¸!_;Üô!ˆÈ˜4mgl¿î+ŸÉàÝÒܶ7) BûéEyî=ÓgM=Å7ýhvÛs9*‚±.£qp)¥£¡¡:˾¦×Oï¯`÷'¸^È¥ÝÙ—‰ú®l©…FYŠëØÞC2× ø"yXËsnkýŽ­j—Ï<Ì\$àcÝ~te;j5ƒ:žR¢ÅLµ—9iÞËÿ1aŽ<£NÚŸ܇bkßÛ·’ÔIÄÖ 6iþ'7*BON í ÷%˜&©—lju™ldõw–C2Çåd§ÂѵY÷5•&Õé“Eö¢cjF+VS¥Kž·˜r±qZ»y™ |Y°SfŠ'’hp_H_’}Ù$¢ZÃâðzÎ&˜ù®- ¡zðÍÈZJC#Ó¡[¿Í0 ju/éÙSìÏíC"´ø¢w<Œ{Áy_kÎ"†,,…•f‹j;9@è¶ŠùÊÓXë}»½¾«WÄ å  ”Ü'Õ¶’è©ý×ÇY@á8Úߟ7=ÒêÂþeˆ‡Õ³4­ž)#„®èH–°ö™Ó R%&ÛQ†6‰…’2uA‹ èžàm,•Á£~]î1ttãÎâ¡P+O7W8‹@»ª#½é‘—Ð@Œ4»ÖÒK Wgˆ¿,Žôÿýór#{”Åx¨úˆ¨kVl°×ôp¦z?ƒm+üNÕª7±ÒXÞ”ÜüY=¦Ý+UðI¸Úˆ˜â½Z«Þr£j! ØûXþsŠÇJ4ô~ÂÅÙÙûö¶\úRž­+[»ŽÜ´ÄMèE³“5–Š’ô—&ó ]:wË™Tu8¢ú¨ KIdéÖwã¸\†² ñGwÌKÎú£.»£ÞóÍoƒ 4uJ•,^‚½3 ÚpÍù´ÂbQ¸þk‹¬¢ðmíGVòÎ[}B›qZýì¡9bqnÖ&5Š#äBÁè¨ €žÃd|M¶\³Ôó€x;5c jèŽzÐ7S(ÓÊp\F'E ‹IO…\ya×S:p\Tw;íTÎÑ ^Š|&@+¾­'3Ï%cÃ3³Œú¿Yì#àC7#Î t€çKU#׬ þýV å4֚ؠuvGŽQ¹ÔÐØo„|2Ý‹ÕÖ:ø%è7­Š°3®8öÊ”!Å62íœQľ›Šc”’!fV8®ØÑ&í«"d×ó—Å8~"ß5ž]×Bs‰g¯8çýÏä1Õj™W ¸ßÞ¾— ç3ú.ʈs‘»yÇ(z$¿ùûØ÷ùnEÝ€#‡Á:ö¡ºN¯Ý±&‹81 ÜÐèⳜ.Ý–§: 2€"Ë~7Ûàþu&©Q¹^šÑghpø8FqT3–.X†Za£Q«÷Á&õâ5jœéíî hƒø·oCAÑ€§8(É+ˆêÇsÝšOÍî“S3k9›©ÅÉGzÇ4GʯªŸ:rCg¸ãrÔÞC<—µ\uÞ…{ùáá÷0²F¾ Ö6[¹U‚O‰å¡B¼×»ÛØ;Þ!Ž:Ãn?ãéqlÎ,i‘Ý…ßyr$‰A°‹rRn³êø±°kºN¿9¼<&†.÷·\p³Ø\hÞ²ŒO)¦ýÈQ8ïj¤¸ÒöÿÇÚ)(’éúlb)óv¦. ª´¿Ü®à4^ãÏ‹§´†Úßûÿq£Ní$5ëCrVíÐuð­1)L³*—qPœÕåEAVv‡#ÉÌ¡¹ÈÛ¤ zçÖñö³E.=^Oi‹íÜ­0è‹§ìþÍšš Âvñ7|=¡,›–leîAP*ÚoXtNÏ?õ˜T;T£S1~|©—¾‘17Uƒ‡4 Ÿs[†?©žŽ=¼C3ù¨ô„bQÕ‚UØ>U§TªÌ’¤ž! pb3÷ìmöOoq7òçjj²ÎøÄ~´H£í³¾²ÔûDÏþ½mç.¿6«ih)*šÕ£ÈØþË2VÎ}=ókû4€Óoæg«§ÂDã0¦SUr¿BËN½Ì1¬†|3mm´+bŒ&Þ³œãºé˜’Óá´ÍÊW)$޵{òP€¾rÏMÇ^Ðp[²ØWw0‰êíø —­¿ò´ W1°E¨jUGùŽ}øu˜êºI )ª†;Òp¸òq@ÂîŒ …Œ¸Ø™•ŠW² Yu câ}N¾°/ÿÆo3T5ÅÏ÷Nµ¾†ÎBcŸË‚êÝè”qóÒÏfµ!™´„qÃ…Á65´ëU~ã‡7NØbÙozŸ[Ý#È‹>cµ¯”†ìàR¶]–El²3†yŽþ1ÞHØäe~/]!øA†Do!ªìõ†f3zjNá,¼ôp«tB‚S’,èÀյѼµ"?»ð±35!Bl¹6ù½ªtTÞ`~ñ’IP†‘kвYýø4KÔí3É Žˆ¼P܇æ'Ș÷7` í4BË4Pc@’œDb°p.ÝQô 0øÔ£±5¶Ì…@ªã— &Œ}qFpÍÔòpóå:ˆ–=±3§úÝ>Švk²‡£z'­îµ¦‚ÏJÕ0‘èûpA®"u-s3†å²YiwŠ7B¸‡¼)‚pÓúDÌd`9ö´ªÙÒž*ü¸zº£Îb™±Áã`õ;²" Ÿ¬l³ßØàu/3hÓ©Ö»#†­¢ød½åɾ"š[÷7gíøe·tbînໃI?à,´jEj ec´ˆ¦r"K²ÀsŽm^æäMЉW¿¹n+Šø ¼ŠÕ7„Oî8%sDP ;¯„…ÈE8Ím^ŠqtKҤ¤º1øOÙgõ\-·Ã8ú1f RV{¨Ú6¼øfh>eˆéÀï2lOÊÝõNU9nÒxoqë=w ‹:Y«g³hjñSÆ¿,‚GÉ!c§ÉK‹I«/—";±ÄùXà7"8I kkÐ4ìõ‹Ô p ¼$äÊìéªù/°ð×cçãØVåòWßs¬$ Z þ†àöüí~ÑÍÉå}¿¿¼£ Äöí&p*þ:”ÜßDîŒÅ.;»~˜b> A©’ðùvX«GÁ¯d/@Àßq£ Ê^ šŠ/8®<ó'œJÉ+´ ·°ó ¥U?:Á$x|ŸV¤ ‰z ¹Ä<ÿs„æ‹–ûû¦:q³hµÏ+]G¬Ñâ5Ïô—wï¥ý }"qß™Ÿ»AýÞù¿(ÏŒ—F(/9£4›üoò­ufÙœCÚᇸ$Î "è 氄ѤCön7Dp`¹©ÅÈ_w‚v̘-uèüì%¯MÌou¤ÇÝ&Ý‚o4\žëú›~k7=ô¦aÃH‚å$hòÀ%üÉÒS¿‚,ÔÊ?"çÄËø"±Ç?ßõ,ÒpÔ5ÏVKbWà¼ÙڷþŒ75ñ8ŽþðÙ£:¬ý–“`FoiaIç0†åtû&±ß'¸?-ùm¾¾ž,{ùÝïà”"Û,³¼ Íå‚™”o¹üè1N ¸¯C¼¦…XéX9FÅ¿^Æ^STÒz¹"¹’´¤¡¸‚ÍɃüFj]û´¢w Æå+ËAI+Áœ`ãÀ5_Hb‹-èQwdV{šZñiò#çùLa°P”ò]ŽY[ê´÷ó9%«…oi¹¢Â,ÌØ¼6“Éf̱ùs{»OMMûÚ³Imôi1K‹»VHdr7ÃÁ{6po¿áp:Øg{÷(ÓLW<²K~—FÊ£ä]­É¶âŸ¯7è0Î(d½H™,¡ùÑŒ уÕwy‰#ÑgAõdaºoílѧCÐèNØ•íHø›KgLŸïî «ytþgª{»_"*š(5ãÒ½¥§±˜2ô¼Ã«¤7¬Dº#½^Q«î(P zH_¾°ó¼Gö‚ºÚ(¥±Â޹]0:* Z߀ÅaÊ5Å:òÏnS(üs»~ÙÚW7æáhä]cCç+0p~Eç«íµã7‹D&y©§v˜ßJÓ¢@Õ™õ$÷=wx4 ÏPYuKœØûµhä=B&h/½_Ý÷Å´K·¯ =çÀ„¸õÆ7}Óé’H¾(ŸcÍýÂmýõ®ŽùݼIæ*O˜ÀÚÑ–d+¨’ow?7†1d JS}9èQ/Ñ"bÜÒe33þ›­_q vB¿gk}w"rây·‘º OhÁºûåþÖÁ,$;,0ŸàÊê~}SÊ&þxQ8Š iÔ]ËYv|QåMÜ +]pœ.óúûØŠ^*to­¸D7•“]gOÆ4Þ™é©À`߉h`€¤Ðħ%µ¤ìn´c…êÚãËhÉË"ÈÃu[Ú%ôÄÅPH".^Ö’ÓçG>h7zŠþ¸Ã4R† AÙ™……ݹֹÎKv!ËŒåÀã1¡SçÖXå ÊÏí~á†Á†¥gŠô´c±==€ê`’æã i¨¤¤ZðX ~zƒ‰¿ª‘O¿Ü}ÔäU†vöù¨KŽË¨6¨'fiÂ{^™Î3&«dã2²eð&ƒ r¾öRšEä%ZpAæ6%ìÛ‰¹Äx}ò@ëG?¡&2–}Ójr+¶õ7¸ŽÕdLÐÄ>þ~fغó ÛANЊ$;L"®= ˜òSóùZª»i ìSëòæµQþ‚þö…á¢8O{¥2”ó8:ô5Ù(D¢~ý°d„ä”=*UEËbäw.@ÔÉó‡ÇÆÁ—ñ˜Éa;ú!î≥i-‘;(,wtk™­‚«8~œãÚâ¢è:Æ®¬ˆì–ÖVe“KYeOU› Põâ|Z%›Db”êˆõ\§©³ ¬]½ü}+o|îï td¦^F:~…¦E[¥<iÏT¤‚qظ¾„ôš¸2Z’èßÚþÍ//³àr´^¾dJ<ç–h.îCзfe°#޳Ú°Òg ^M?—?q*¤Úؾñ°üüD³ÎW^[ã4 òJ°ìS(E»P¥FÜ>s. {Ú+6º7ºJæN#Jté»Äk"i‡»n™œž2iCòR”ñæœß2ÄŽçÀܥ㛋ðšŠG.}v†‘ƒTóúí¿+8Ì™#Ü9þ»ÀÁln"­®¢y€ðlß\òÜ; .uË´Îò±ß— .E p;9°{ÏÐ/úµ3¦+Îôhý¿r;Žz¶a]ð‘&¢£ÁX‹»få/?³I®íèÝWÚ;‹¹¯z¨æQg{å•ë›z*éÊ ­ÙC­Ð‹ `…¨Ù¸áp¨ÔÖ`Sê°¶%äééªï‡„úE v»¨GRB:êkÆ“oú:ìawäM€‘áÖ Š°Á»2ü¿¯_Ù£® ûŽMÁf¹ßjã'r³Jå/¨–ˆFÈ û¾jË3ÒÕ„ëAå`kÄUû '8 V à÷=/ûÓòI ºzˆƒŠCz›„mŠj‘ŒxÛŽÍB|U<Ïk˜%Ø^ Üþ¡;65\‰ÓƳÃÖ"^H2Ÿ»ø#ì5±œ7>ÊQô©2aeÏ«5öS{‹S"×€F\fzÉÇá[ILÁ1#ig¸!u‰ò4J¯l{ÝßÒqŽ„‘†“þÓ8ÈØøôï’“”Aª)¸±bUÅ}.¹ÚÜl¬y„R7gOÇÔ·& «éÉp4ô*}›8uå_DP Îx“†ZKìríMݽYÅ’‘SÃÞf‚8×ÈDm>•¿±õÂzƒ©šèÓÁT¶Êƒ5l¦ðúV‰F³ß0ÑwÀòÌvRa³*¤0j „†¼[t¹xîPæ¾&ߪîh“¸t†E‹Øóz±¨aôb*•LíKÏí¥c¯+yÔ ÿƒÞ+Ou‹ùË=ùbÄã°kÞùí´Ê]1ÿOºÒÔó'»ôü¦yÛð£) ù‚Û¯þt+'zóžÏ×.o.:•뉊43ûhh2¥ãd XDtž¾×"2 ÉU²³n ú³Í²ÿ±¤cÿ*%ä¯__R,ÇY“ Ž…& Å0̓쩮¤¥ßÂc3º®îÄMÕ…ŸŸÇ©„§ÈÓå!àÁǹE¹÷V¨wЖFVf½`§Ú…µ¨3>’F”ò}]Ù©›™f€0Ü´¬Ò“IÈ]4ŽN€|•¿páƒæ—-ñj\¨.]ç¢Ä¢è>iîÜÕu(ó2¬ba) Ìü`)xªj¨œÐáôfeW¬¹¦›º¼³æ*ÇMv“L•ÎÌdŸß×ÁàÄ9ÿ÷ÃÄ/@lÌöl÷½ËépOù) ¡Ê>c2mR'= °Ù¡Fèd^áuij®·(ÛhÄyx÷aÐW|Õ­Tó Á–UKe™ß£<{³ZyÜÖ+HDqÌÚÿ¾~³ Þi59ÃJ‘Ü+Þ”]ç)ó1 ÅêË)Árh¬¢ŠøP ¨q”Ö±ÜkžŽ^ý·×ÃK„ÿÈ6Cç ù+u"Ücð OŠáÒëU\FñkÈ ‰ÚS…ˆPÎâ—–y¼ßÊä<™BñÉ*^‡è:)‡ÿ{#Mâ$Aæ~£ú|ÃHé{‹ïRúnv8ív RÒ695•¦©ª³#XwOô½ w½áÅÀ®ˆ±ùáJûÝ&¼’;"qUÚsy ൔ@È^¨˜‘l­B}Š—YøOóU{cÂmèÄ·‘±ÓñMQ©Ô|Ü u|Ì«;íÔi¸€åŽš9áa–z›–‡€,w£,¹X#Á€еì”­,Ón‚2òì`A† 2˜†l²_Ñ tì2M€ïÄa·ŸÑC#£v*Ý¿¡1QùHz¼¸6ÀâP—±1©ÜE(=Í —,‰èÉ+ÞW¸®?ìàÙàHì džßažÂûœ½´‘kþ;Cd<Ó<ã-”X1õ…EÕy¿ó qðK©Ù›D²Æß%zµ¢? {j2ó‹Àǃ¸ïÒO%2ñ™ÖRÚqñ¿Ä„€ƒ:wI©÷[WЋûAf‹C+SeÅ úrVbY—eà|/Áž± ãŠÇâ×ù¾$›ß8:›9ÊbŒÎI6QïÔ9ë\­žG—Tkšy"™P”Í¢–H_•=ò'ù$Œ I¹š"5s܆Om\£û&Zû/!MñÏêËØžkqAF¨íÖ›éü tψ,5eÞÄ ÜM·kSáê '&ÖJÔNöïö¥…Ïk¢ˆ©\†^ú~*îJ0¶ÿˆÑl3¤< Aa•Z¥ÁÀñ;ÀŒ&×I‰ÊÛe2Åzw¾°Þ•Ñ¥;ÐÌÞéáÈÚ1‡ºÀðXóÏY$–ÖáÇ .€Û >¥+(PúÐtÉ_ëÍ]|xú¤½À5õr»©ãÁtÀ±(àcêLÕâOUq†ÏžÊlÓÚV(UýQÂô\îY=½åÖ m£BVÏ£ì4Õ$d(ߤˆ=^nÎX”•ràƒÆZÛ°•‘hÐz±‘‘>nCA¢5F 8ù£¥9ÏÀD²“Ò©|šS¥þ²Õea\Ð9°¦ÐëÆ»ZwÏØjå]x§\U~‘¸¤›Ý¯4Ù‰k0UD ½•| þRòU Õ5ø’œ“b[\“IB¦b¸86#˜gs€ebR’jôoÊ´ 7×,Á¢˳¸›Ë±{/xùãÀ÷ZÈÇ|Ö ­.Ò x­¯ztÛz˜G½W’ô~]vIéÓôG/Ùór©€Á˜m¶S2M?h(x´\ l™`Òd›gtnžUœ~Ü`u€Ô\á&àé¹YgáÀ|K2zzkÏÔ±öYÎFYE)äXð2 •›ñvßö ª‹nÓ¶Ã ½ó膧D \(<×FJõ+ó»g0Z7!f²h'n±’±üÅ™Iõï½ûOÝ´ª(¿|ÆòIÀýT»ÿ@$YPÎÊÜš23PJ#‰ñ(°*# f¹ "øó¶ lÆä/HŽÕEââÒ4W¤pò/õ3SüâÊDTßeÐÙ™µErw#FÚ³× 4N&”—ÙY€ý{(tߨ„‘h(ì)*Zˆ/Å®½-Ê=t~#q§á/gõA/Á?Hi––äIZ·îK;ÁFƒ’Afó ¡'C·øž¨ïÐMã·È(»Cn)à ԛ@”O•wÌ…±—F›èó<ü”^ÑŠB|Óý| ZÛ/™JwSäüG DfÌt¢67a[c“œ±(¦Kgë€AKr2aHh&ÝôYOÍŠôëmh[[Óñ!$>¥b/Ia<úR{mˆ—eÒ=Ü¢ÃAæœ\ßq¿oÿ{n…„Ÿ8ÖgS£c¼}emcº0W¿Í¢{¨n5X­`饿ç6ݪÛ{N7nØ1bÛ&¥ ²gÖŠN"E„åš +‹ø[õ’§X%÷öŸÊò5ûèø›‡ t}bλu,Žš‡*LiøÙ­2ÇôÀ1‚V-]kй ;ˆ¢Yç>`«Ì€m¯Ó²];=ö‡¹[®øtÉh`:àß$囯÷ËVÁN”Sf¼À Q»¾7¢ÚkzãFIH­*“J}Žnö¸o(e×âԨ耂cìUG1ž¦Åª8c0¡ñ‘~8¬HŒdLœ®8w±„1zÛË.ëøe3†í«hM- ÓóŽ¥w’û1«†:³Ïj¡ O©­@¤NîÞ6≶˜Æ#¢Ü§@Uü[{»ÀƒEýª‰¤(Žnñít·zúX‡”R”ó¥Ú¸t›ÐøšÔ3’ßLßÇöâ1*ƒ]oOu€É`¬öì`Ù—[Ùk6^4Êÿ©-|qÅÏv°(Fþ°ŸÅVƒ7²ã¢ížÆï@Üée¦O ÍÇt$|œ«ÒÌIñ!¿VË·¡ìÚ`lÂÅÑ®ÚÉØËqÞ¾Ô¶>êyò?ÌsAÑKX•^|âvïá®zr³%ðßþ¢&Þ’’Ç]ˆš‘áAqÂuy¨m2 "7!ËI zf*ƒÄ“~m1ËÛÕâ6êHB©³…ë oølºO…ìQUŽlÑ#‡Q¾DnÁ ‘éÇžI)v9§sŒ {û{´4a8qN²! ª‹+ˆ¸W¡$׾ꌆ\@J+q=@¦nŠ÷9J-âZpeç‘B•½Lz¹ñj/1-4«¨5í ±°š«‹ðzëõŽŒ\¡ù§÷S–ÂdÑæj Ë®ùP¬>ò e(ŒÀ¢ÖlÃA Ê|9v4ƒ~+>S×<æ·× V{*aHßœ€ÅSâß¾O¿Øèøi&°ÁÙ4@UXsxW¨‚½¡sx Ël%D·ÒÁ7ãsV|—*l®¢—øo[áI£J»l¥FÜ ú* ˜<Æiî} …ÑGoz«‚ÄH ?‚4ÏĸÑX× ¹(†iBÅ`»jžÒG¡"Ù.-l ý„0ÍØƒ!ŽˆpµÿµoçR¿âha'Ÿ_þ1‹Ùi\GU:›ÙޏG¼fáÁÆB¨és3s¸eŒðÓÄ®òSSF?$®ÔÀ¥€Ä…{øéyA±ÐÓË?$Œ±u•9É»)½É ýY”Etm‘®vÎz@MòjCV×ô®«¥oÁ.¡w.‰¤€»ë¼˜ñ@¢Ã{q°JlôyÞŽ­b'>é¹êôB%^)Áöãcãz±kÔ±Ñ×qŽÎ¾³dËM Êm(>‰3â…} 2(ÔT,Ôb:®UÉ9]é‚w²$ïûl«¿›û ’r½E“as×bΑHtpMNú ŸpNØý +>NÇuNÁ½`˜è;=±æi\p½š¢‰î g;ÞWœúØÚÁWÞ1è°-ó½ÈfbÓRÆfd1KÝM—}R·þ?]òƒþ©ážrY.É{¬³7IÄ´>'/F¬‹P¬Š´¿1˵ÛV6ì8Ašêe ´ÞüÃýk«î“8Tú„?ø Ó)Çú×V—²] «Æî´I‡ñ•P‹oT0à…·GçÇ;@¤<4“™ýð'q4êJ|ÙBòX{¶²¶¬‡ÈhÍ%ARôÁ1”VT1 r]Ô‚² ùàØë €óûL¾æOÉ×&•!Ö¯å¡ctRL_2å¡ùF||ÄZPÖ°+­¬£Œê·ñÊzܰϩÝ{¥&‚­X?FϬ;{¸=S±LV#˜KÕ .Š}‚Åí¨«·ŒPŽHf§÷˜”ßV&‹!éqyÖ ¼È «skÈå H6GLØ`\J1 _2ÿÄ'ìw³ O þt­ÐÎçMçc–‡à¿Á TsEq/­¿–#þƒ =övÿúî6˲‡Ò9Š¹Â­\á ünö·Ï‡yübЬw DqÑpŠïOe´ÆîÎ1)ÈV/ŠK“ rñO¼fÐ3–µ#Œ>l¼Y†/z¼ýÆ•Q½Üf|Ídql–V«Ã)/ìce ò‰+P6¬03„›=ÔÀ£ø`W¾’û|÷[ˆ á÷ké' õ Øá‚‘b/y—IDé ’š­ÿr¸«C=T=ð>ÑÑþ¼‚JV o‚7ù¥¯G÷12ØK~]»Qd[A%”Œ¯p­Ü-!âšù† u„™šjNÙ '4òæ³×&ÎÍzXG’F5ʰ1Ük"™‚\þHîS™9±*Tzõ¾?BÀ;‹Ÿ–´¦š>Jxù;ä“-NÑ#²)+‰ì|’ƒÑæq´rû‹ÈÏ™Ô-î—R?Hë_þ6¨$n3YÇ¿ç— Ýf4Rö=ÎØÒŠ5x¼%Þ!÷q4»„x{mF•:Ò‹Žúd¿¶HšKM}¬]¥1øµÐPM¡ý«¸4Æt›ˆWŠÏ 2û˾ Õü(¾ 8“we2òέWÁWLÂȬã"˜uí&3c³dE$yy'XU¹×OâÞ¬oѲÞMk—vĦ˜«REÐ{¥ÜÓÙEþÆ{e%ÿ¾dðÿ<0"#7ó F1š²çövË(Å&1}*n˘j¢ØŠ„ŠÀr=ý9·ö`Ÿ¹ ¿…MÏÇèÙ©eb"ðäú“Ÿ²@‹í¬so„#(ȵQ2MpÜŒC6KXùôêA,GÜÔ.á u&ù&k¼ÉÁN¤Ú'‚fö¢è‡ ¥ò³ä~ßCíq¨£;Ç0gìñôâÍGoÛÚXV‘,ƒÅöOufüÏö²y|–³/)ˆšpÊ„ÎþÚÃÎ+lÔR5½_8Nk³ãHÔ÷ÓAVñ\^1JD”ß"nÐFêÿnPxág8¢RÈ& <²´ŸÉk£óHYäïRDyXhë„ø¨c„Ù I“‹°«Cã±îàÝ¿T^ Æ&ÔÏ™S‰PÜë®*í­=A?T!¶a–zë9¬,ð½+†+ÃæMz![ò.°†ñÃK€),ÈæD@×»ƒze”)±uL=‚…pj’”£¸.¹Œ°Š¹2“}B²ß‡ |…ý’¿ÀDèUÁ(E |( ]èmó’Îma@¥ˆ‹oÙx/d(õÎÀÉ«ÎuÂ[écK[_E`Mëòû$‘{Å”†w„Mûvw{G·R(L”÷Y{—±T ÖÀYˆ ˜¹ÑJà劢"Ì»+VÜ[–¢Pöbw÷­¢fOjÿe•·¾‹åYæÔÛ”`¦®ƒpLÏP}{¸QÊWåÇðë&øçtñ^ éÇO·Á[Ç‚ŠLßLqpéÅÏ£k-Ö{IkvðUÛ$T@¢í{xï‹^T¡ŽáÜÅ{±zkÁ—+ëNñŽ“©¯ ‘ZžÈÖÚߊ{Ã)Kj«vz¶Ÿ \b1rË nòJÍ{¯¸ræM5é% _»)ãü~™4š ¸Ï†öµg ò ³ ,øXÏdÍã•ú®êSãÄuvÑ!ùød¡m¬ƒäË´=PÊ&1(–òOiajJ÷Û†>ý‡ÂÑ7ÏáU¹ÜM×TÈêÁ •û.ÛQrå]$ÛÐ:¡Ù”‚Ü„`µ3†O%o*P¦‚‘<ÎÑ£[ìÉÿä¹î¶]¡`VàÆæ GM³Øï²XF ›Ì@#ÁäÍz"‚–_øs†ÑZngy>j´ªÏUÈ$õ Šnȧ£çVfV¹Zlâòï0Ìÿx)ËIî† .‰ßL;GpNß½x3шfVG,[áÚmt¬ˆðÚÚ]¹KÍwø¬ê2Ô®=µ‡kÝ o™ Ѥ{é@%r™! |à(¤á\=êV‡·ÛKP&>³=~ŒPhRtô¡ð£tlDg[º´$øÜÌìh‚é,Lb"4úäµÿ*«@Lìº&·Hæ;šú^ûÊ¿r5\…X Ñ=­ S`gNÝeÃßlÁ½m;Íl$cÎ÷ù¬ë€11¯öÕ3ÔâƒóÍ®ú§´®Ÿøí„ž,WC.g¯æ=Ú÷Š(< Z×z…á8¢E…®hM™,& -*JÎ?§ëÅ¡ÕûÕÔþœÕ¼P#ìJg-Üñ§YiD;gHy!þn´Ñ \OK(}é•PËΜœýX–2³¥eð—Q‡äDËŠ‘Z b±hDÇ÷a޹d;= (EÔ[Ù-B{¯·»A£‹¦0füçØ9ìpW×: ;U¥{A¤({šøD8BƒÁýá¶’³©ÛÙÌõ5Íyòo' ñzXÆî¼:=ûׂ#à»,0õÝ1®RÛˆ×ÆÝ†w³@K¦øÝ6®€»Tš×Ýïoˆº«†ËõÙïpø=ë«>ý0‡&ÿ™0øÔµ_ˆ ôÿ$*T0Ü«»ÚÀ‘Ž] Ï«º‘BÇè{.‰JaNp mcp¹»Ê5ú˜}QÌîjPC±ÕÕTà=Òã×U¿òlèÊi Í= Tn ÄV¼X¿Í(\n6Cü ‡wÚn ¼I«][Hý¿eHýÙ(€ Y}pl©8Êzl|Ù$o}^ÁBƒ0 Ykï k4 û£I1éoDW­ÿl˜ îû?0!Ž€Iˆ»cý£·˜òÕ^ëfÏ6Ç‚#'â̆‚”8Ø,@ väÆŒƒiÂC›š,þÝÈYm¾¯GYZ¨gò§)&S24l”Ÿ‚,2mÇKÔghÍûµpx»š$¾HC¯œü`M Ík«´=@‚Y»j°ŸÇÓZÉr¾ØˆÔÍ»Õý“ÌÈŸÜ·k͕ΡbÓë-kLu’„Ïûñe ^-çüÐmv-l7˜¶…¢À ¶EW½óÝdú~\1ùLQãª/y_ïôš m­Ë¸¿J¥/æ<ÏbF¤$‰2eØ)q„êŸ7Ôõb8±x‹¾$/ë1_&™ÐÏw V?LY7±UvªØé†C]ÿ¾ÊÞèI!‹¡Ô=d&®‘'Ø:`ìÐ*ÌÈ0šN´Ÿœ±?k(âìw{µSyFnôcÛӿD1£/øPUŽ5+ø‰oA#h˜¾‚&7nè‡É,”ˆ˜'•œš•â×xòì‰5a-æëÞÎVç,Áé¬Áôµl"ñŒ9ëÚ…Lx¢+©GÂÄÐ$z°ÏHó ƒ£Fæ3‡èÖˆ¦àC]‹ZAïMÎK5žàYY#øÐ~âƒþ’h¾¼G]ˆr}ªVFy1à4&µ­DÜ <-V¢x®<Ò+"%=aŠJ=ðOzwÒÚUH?!FEBc3Må u‰¸`bs¬kÐó NÞ+•}EJÜQ’Þ´0e§á¦oÂ]-º…ë8¤so ÙB6ä÷>¢F€Ê"¼éšmvü1ùë²pµöѫߩ4£UQ#·sØTUu ±21J;‹K8B+ÐHd¢ªÈ<ÆÚÖ!*gÎɺ…=ÿRË2­@Chfv¹ ÅBâP­4¨i¾|ÊpHkàÍÔ¨‡Ó(ºw«#DL–¬¡”·´ÛIÐgwJ³6¤#ê¸Õáì&%¿Y ûŒ)?R—l­H…c²ÐO`<'éªШšY;¥;‰¼ª4W1èDIÆeÝÚÈÓ÷9*À˜Ü‡ÒgžEà! ¤é ¶÷$’A=j9^ô,Ñã…n´¡I}Ó¯2ç1ZJ”X,ë¬nTp…P7¶;¬¿æ;ä1C I?Û£-ê[VïÆÿüü‹»qâÕ¨´˜Rf)fU‰#;ÐnIìÈ®¸—¶Rß'fXÚO †gò¿•r¢27,ÃÀ&.4b““¢Dµ‰ß¹³ÁÎcÌœžòw:ióº|WöªÿËÿÄP?nжü½µe‚ÊŽ¨³ÃGñOQÿõq ¿è6Ï%p»ý>ó[Ð?K°ŽaÔ»­L-aÇ•¨›§w’lK1œÿtÞrìM9ùi)Ôڼû²áœ´¦9K—’9]{]°ÿ2L´ÑFÑ¾Ö |RÈ®!È ó Ê’yh¶±[6Çk„Ù챂8G¤”.ÝÒ5! ‘¸2 ™!œ@;F„.Ûý>³rX뤉ÿÖ6¹ZÜi•ºY'“î%DLù¹¾Kü8 Îâ¢ÐåÓƒÆoûRsEšˆgœ³Ì°>ð¸Æ'bi€ô°9àB‰”îí ÍŒ`Ô)T8Í”¢qð1Å;|t[ZîSܳ3ÏÖwó‚'!óàÕšÌ7/»¸±Ê ËWÆF”µëb:ùOmÁ ù[YLÉÿû–¨1@oè9½üеÊÌ@.G½S;tƒd³ìÐÎ6íšc ¿“Ï;vR¡i B™×7ô@üŒ‹®YÍÍc²ƒÜêY8åDêÃ6°Oîÿ0ˆÔ¯n­ Ñ®¾œfú-D ¸SŸ¶álzu‚çqå b­è¥ÏŽ2Ám ˜{Jõ 8)lu;Яv{ŽNi¸H¼yºyØW-"q›ËÙ¿“ä¼ý'æ: T\¤½ŒÊ¿û á’{òW™,Ê=U—Æ9cìùe«¡Ë#¯PÇHŽæV~ÝÚ³QáifŸæÉNZôtÉ„»½0X÷ô}Ï›Ál"ð­ÎwG®¤ P ¡׆çíðѯÓþÚKYZ®_M‚h7a+2ï`âù²Á‡w¦XÒDhm˜¢6Ѭ;(Φñʶ'n³k‘†’\š{DqüæÂ݆•3´ µÁ•O©LµFN´õR x0cºæµšÖá„]‹ã&Ö2$¸°ˆ¸.;2“l¬­èŒêÔÏÍÑMgª0ŸD“ByoW!Ç_!}•ÉŽÓŸ†ÎšÚ¿ÁZˆNƒ51còpÎðV»Šº«ŸŠãü•–ýÏ#‚2Øw‡(šf?n)åo_Å{{©¹@îíI&ñÑ\pýª3$v÷â“<à ÿØ_“-ÏéMp}€®Ú¼LDL?3 „ï3wõ¶ðú]4ò".ô?ÈôÏÚä>›‚u§oN®¶ôÕîÀÓ1bxØj¿/^M!ÂAÊJ€ÐG›$‡Miî­J¿ cÈf3)ÏP\¨¹eÝ-Yñ¶Œá³Œ‘Ÿ=]ØA‰vC²çãúæê䥡¸q¾4 ]šŠU?'tg 5ÅU×ßoYAÒJÎÊõÏðâfuH´<¥î–ó¹,aÚ`5 ½ÜÀS+€Gâd®‡ Tèøþ-ˆ.žz<ŽÏâö0õ%*dúLbß­Á‡—9Îöõµ¸ØZ›¤Dp/e'œ1›|Ö¾ïÀˆf>{r†µ Ô™K¥‹|UD>b«R8¸Áµ)Îë—4cßÃÑ/¹ˆƒh؆3¼ûæ÷Z¾šzU‰T;=¾Ïåä•CäÊ«øRåØD¶æ¨áÂ[§1út±a.Þ'¸¾äcÝx[!̲‹mÓü|P˜Hˆ _²†ÃåjÜØ/[·Âøxº˜Âëxú Ð'ý|¡ ìæÂ/ìŸÊ¥£IMkKWÛZqÑHÙ–§Ø/{4ˆSÃ÷Î^E!°Öǵ!Í"Oi¶âé¯uù¶;hoßôn!ùt3cA Ý-ár•¼âû‰„]‡AM³DtLd„¯'²ÀŠl5Ø€!Ò¡ø›ö£S ï¹Å`èc›©‰¶s ^G âÐ]H逭C¯\Oæ,÷Hì]#ËP3ß¶,©ß%gpÖM˜Úd•„ $±XÑã},TœX®ìGõKNÑæ©? ÊsOÒI > NãhÛâik²\ßë(1˜ýC³¼WbS¦Ö˜[ÍYwÝ­m$R³6?äqTÑMЕŒ€|½»œð„ÁjªÍ&ü%±î¿ÛÈQ+SÜr,Ì„¢OÑ}Äÿ\Â-·Hz…Úl|.Cx"O:ÚC6ÁŠÄsã;ä>E5~eXTpÓ¬“äóñ¼<ƒ¦9à :3Dt&F¿Ë«ªj!qBÌí*÷-V…œ­‚ÓF›XMÉWrðcPÏÉêôó´”›²vøW¤2yËLÂQSÍ«Í µÜ!¡ß…UΣþ”aºeH ·-Ý™ý'ÑGâ½ÏÊDE&9XK=ßåÐ]Þ°*Ã÷:öóc³šd1ȳïCõjë=- .+>¤g>Tƒ×\9LÌM/­Úf^4È@A=š0 0gMáAî5}Œ«0X\jÌ­^åÏÐ:‹ ZÙæBöCÙ1¼Ã®yª] ­åýOÆ´hêeökg¬‹D 1Õy/`î g¤ˆ6êŠ{fämÀ>ÐÕàDçÔÞ~u°Ã»‹7µì+ÝÏw#´ (¶M@7Ûk®¶¾L¦ð7%Fde;rÑê²Ò-{ƒŒ·§â -}òÓR]ÜZÑq¦NÐew|ÞÐ1³2¯–uKÂ.ùÿåÁæzœFÐýBNØIâùàÖç™W5Âæˆ-"_ŽR/H¢X2!ØÃcÜ`f¶ÀQirmMIX[²Ñ{‹è4»‘  v_… t ðªeͼ6g…!vÉEµ×DÔûüwÀw¨㎖6Z?¤°Á_ÙpEøÍð-G§*`‘£×>UëâÓ¸[µ|²Åt›‰Ê8 sU8|Òû k}»ó>½Äk$˜Ðö©+Ê&É‚ìFhkÌ~J1‚îÊS̶¼R‘Æn&¢#újP ÊÀ ‰ùäŸñˆX‰˜“Ïïîlïq!¼&À#»¿GúÞÆå ·l±âíOÒ]v{Ï¡xdF7Z‰²Ãlé¡lòƒò.ù¡d2˜—>*áCoÚDû—Z4¿EŽ“©³@$”™<ñSSl¯—-$IǪñ¹Ô*-v¼FšqÝ|HwÞlŒnTâm¦-ì€tÞœ‚ºÈ®DÈc–šË2PÄðøl΄Q+«k£… ÿœcµBŽ‹:@z¶ÿRÃÙIL# à.04WÚ3fA@ø¢š ½ÇiáÌSNiúœ‹‰8Õ¦ÐK–ö<ÚYÂú¦éF$Êšâż¯â6Î7W².I¹©RП›|2ƒÒíÍeÃø'hq|¯¦½^+ü±«›#óÔò+66°0wXmò¼Ú­JÖ^ê½Ú6ðéŽæd¡±þÙr#ªž ¿*Ö of¶yá—Зž|)çÖæë÷ÑTsGk¬ð ôa€%|8fÆö"ìÎÀ™ýgÒôë&ª‡OvŸ»Á'UpŠàºYg¸bC~ÙƒF,~H6æHĹúÄi[ë¯IÒž%ý­œý'Æáª'¾3BÏk@gU‹ƒ\+öê”é%|ÒÙeWpš‹&nêüßl³Á²âÕÐ JÈèçA9}Eâ&M®<–3qÏ«£4‹—n—Q­+1ú?ú7á²ÇåùtgÒŽÿgøÃ¸ŽÑ-jWÊ€½1ÕžG§9i›koCµM)–òİ#ãçÓÍÖOÅá²&h:„qÔל’xá…w™uÏ^¯e¸Äj=;TɸégµÜãqL¬7}tQo@scϳ=¯l‰€Ç%'Â6Øö¬>(1(=%úf‹HëÍ Ð\´è6ì3¨&ë£4Øu×̦Pºæ:\)#Þzãc‹*ž~0×}[Ú*`Jµš‰ª¯DqîûIIÙ·½ôB»Èñ^dk~Tˆ6îë¥My¢¬ÚÉPä‚ôÃŽËæRŠÞ°Ï8 •a~KÄ’¥f4¥’aêÅ-Øhßü&Ú60Šä-›Šz£p.K‰ÊL¦¿°§ U÷#v0┯–»†0¯üW-™MäiÁš†B¼tGä‰kxsÒ: GT{¢X «*Ó€Z‚ެª»èýüû”ÍõÌ‹~Ùø:±û+˜qo+û+¥ «÷ïòÃñðù"_¢ÄºTÛ‘> 'ƒæÚC;ã<ï’Ò~‚‰¶Gw­†‡Ô ùîGAðd¬¢kÒ5‘p‘eArTÙƒhÁº4¥;¢-ýA©*!³ÊZ5žÆˆtDªÍz«°>\¿8udíÉÈ%þ‰Yɺ#©¿Ùgw8 QÑݺ^U(’S¤DY›T·Ô¡M]3<^5ݚŶßÕ ]ášz r i(mgü`9i)ÖÃxÖ”—6€IB/*ŸÒ‹Ñ—®x¤È,õ­rŽ&ªX¿‡ý|¢ ê›Ä•i¢l/¹¿µI•"²ÀYÁÊ­îJ¢ÕMj¤<Ša’¾-¸©`E~Þ»ºÍÍ@ÄV¥;(©ëëY¡ÝÂ/Œ³<…8<·CzÆb ’[–—³¬ ÏnVL߆óbUåüõŽÚЪeÄüûUÊÚ]ÓgñŸ/Ÿ?ÖνmZ}Ì%_ÀRçJ‹`öÚ…l†–ueü[@ªðrßU°TùÏ(Vr›†mA™=á!ÈÀO¹"ļlk´7MÖ›ƒbX„ƒ’ÛRj’:™Û©!¦Ö$87ô³«Þ¯Ðíù6—ÄWÚ¿ ««û¬ýÞd¡˜iRHëÀÓæ°²OÕ„¶³'P§%„ A™â》PúI檱=¼œ\&­YÜÃú¸4)¨Ï’Í-=2Ó½t„ªaœ]åÇW@òëÇŸ‘YKVgTÅCˆd¢í—¢"®ÅJN*gÂd„øpL ™ç*T<›’ÑxšØR–%ÓþŽbN»®FBð‰Q¯Ÿî Fq¢ÖŽÅö, %óo´ío¸êaOÉí}ÙH[ ưP©¥kÏK3ˆš‚þ|¦þ޼gÇÒ¸ÔÓ‹Ú :&þïЧk]ŽÂÙl¬˜rD˜EÏàA[¨ŸŒúµ’ +e…¼;æZ­>PÇ!Æ®>·¼H,°Ä>ý7 {.zE•ªO/ÈéŠMת«5- 4<[fQýŽN©7)å].‰–ÀË?Aì^øF¼ˆb’öT«$¤±uÛp£oßñhä¸ÊöHX q‡*ïR1»I§…^ôÀ«ÒSD>IKËØ÷I:ôÿfž”zTkO¿ØckèT\ĸNýB‚k ³Æ}¢âT"ÓTöí­NuÓë¹VÂúNÄCU5¼OÆ Yüà^0¦É¤C›wGb7,Ƶ”kø!›¯š¿ P¦¹×³>MhcÕ¶‚ÍQ>£µª'|S¾ù@W^¸kãÕ”ž¶¡ YIBÉ}Œ‹øéèÄIíÍÔdß;Ë5‘jÝÛZÎÙíÝä–ò-ýެT&\†?ÕñI]·ÄDâžx ¶Tq©KÑÑE}›ÅÉ ¹ÁE:CƒˆI„ÝúXA¸µq½2{gìù­IyŸÓXŠY¡nR8N‚c‚ º¯$ìb<ÞÕòMU#V =ÝæÆŠõ¯ ˜‰¸–?:¬FF ñY¨Qþqã/匥%(eÔàFTN´r²vf@ê¬7ß«,£ê"CbÞ8ÿuœÃ†œ¬;ncqçLžMdT0Ûó¸õÙš1mä——›ÉƒmR*ÇlŸT‡ÑþÏLu묚±•÷¼n*Y¸Í!^ÇÑ#ÃJW…tÄ+Õó”AcbàÔ£Ý}s#‘B’ðÄ­ s„Y™ §@Òü M€%ôQ›ÃDG¥%ÞÌDH‡ ±Ö’ãu‘ŠÅ3•c„/’¤Cè'JeŸ¥=P<½,ãêÌÞÜ1´ÿaGëüŒ½ïÌÈü€uïœq¶0žÊM÷Ô¬„á(dœ´Ú²ñè ñ fâ{L¿'Stu­ìRDž‡ =G"÷Ñ;ä9hèƒV - aŠfX—Èkõ„tË#ýDEÑE!KÅOç¬hßyæfÑã$¸Ï$bžÕÆ:`$ÒG4‡$,KŽöû=œ2mKKd7Q(¢X&/Šº“P%C!†`Ig\à}-Ñé…hjZ(«-®’òbpÒ‹ ¦.ç7¸²á†ŽVE}^u2¶¸uÈNÐî÷§€´=üWÓ©øV¦¼CÜŠ"MeÖ½'?5˥ۛƼ«ç5ßß³‰«ô5ÏA¥Vy ÷‰ð£dÄxÑ÷Yq6<ש–6'dj}8G‹0ëé`צPµÊÃjÅ„2+`rJZ{Á`Ò´Ö,°ze·C‚¼ñø39¾ÇÈIš„kŽÖ„¨uï£&~Ïð”ûˆcÙ7èÞFœ^/ImÆ!§çUSm¾X¤ÙÜÅ”¦ï·šq¥ gƒ m}¼¨øž¯°ø2*\*Ù—“µá›?`'MK¥N¡V[¶VTÐÒ ôÚ 9&°1&>ËzØÃÃ*oøjvžÅì¿Q[ 3Ȩå85ë×wM öCG[µA¬>òü[5–•.ªÕ›Š•ÿ­²<Ö¹`jv¾ ÙÝÝͧH{|gH3œâCšzx†‰ÎgÖÿDW—÷ªzJäŽm¦=‰óÏä¹vŽI àÊ0O‚¬ _fP0x â;*T=³§Á‰“ Fÿ’áüþnÕÉK{É„Ô#*ý s`x:dçniÞŸé‡û jI–ô¦Vð*¸ÛNÿu¾¡Ûù%~Àyã ÉòOÜÕ kóÍX¯|äÖ³!yV’XÔ“zôó'Ùü£"ãºB‹êzÓ £ÚlB‡† ÞÎ+ØÿH]· D;©®eš¼Yû^.6„eô=¥šÄDÃC\t-QneãŒÁàÙbìSÍ|û\ûáÿ£x5+ 9s»öÀqð‹Ú·Î¯ió6…8%Èꔬ‹¬à&+QçÆ=¾±¦;Âês8èW“·"¶†î}Òƒi»µÊ#Y¨ÒàB— (6û`?è‹Ï¥½î‡•¼ô˜1r5~‚;íZEï«À ‚¦nT#ë|9’³rËÆÆnÏúPÜ&HEÀJâYØ|CUG õÕ•¿NCÝ\Ô"v¬U½ÑV%¢%mª´Þ‹\‚2ª¢¬Dšß{£^¿û}aWàéç!æ•CåþêÜ”L& 3²þ°„œÈá±ákÊ|6’J“Î!À`|*nª5M…äDð¸´ÙUÿw«œè”uz3s]˜î²ˤˆƒ9Xĵü²‡ S°FéMäE°]èFxÃýWæ{9µ—þrÑÆCÓü –×_n›¹j\ Š¥ È0´fÄ¡’(7׉‘Q(?f£0 KÈ™ïã=£Á¢œ_”Ãÿ”ŽÊ™ÀÏœ„xçI$½:z¤Ù„š‹˜ìÆ¿C‡L}ňm¿{ÍÆn(9sÈOJ{ƒZ,õhv%eïÌÈx\.)ýé©à ¼ükŸl¯ÁÚÝ0µÑvÛûƒ¯‡gBõôm­åúÁ&°ï;”P¸¢ ­‘X‹žD·YyÛß×rM{iÓ_”ð e(A™ž“HNpQ;ôøïJèÛ,2N0.'þ¼cø=Éeõ¦S/txBt¾ÝcšðžÎë–7´Æ£DiJ7³ÄÅ»&.ß›X:ûh£ÑëÉjd-ƒ¹Á"â:²mR:š‹ˆIé Àûãü›…@t®À‹ûq³ÒÛæÅþ/ÁW ¹ž’v‘ÃÛNê5é¶ŠÚ:>‡T8Òçd¼b`éL€ âþ* ÓÒYmïÿÈ•Él„FæÁ$Á‚ÂPe®Ã‰H€ÉÌ_@Ø)Af:yá `KÄ´’ûÒ *Wƒ ˆ¨à¬y^¶må.ý ÿôáO×9螎õW-‡mÊX¡Aøƒ|T†¬¾:†.!ň˜{7;Š6]o"ÞSy¾U÷¬€"QütÀŒ°ø8¾YÄõU¦çѰTä?oKÃÜ30>MþnÏÞ4á±ÔI<³2ÎÌ0Çr&8—¯Å%î²±Aö0g%줻$ÿ¤!–G7î,ïT>Ì.ßrRnqàk¶ä9ìZrA¬ò6¦Is2÷€UhîQt’ ®²â–÷™›«ùÔK¢ÚÓÊ`˜ÞÇ4¬ä¾Ü¤&%ƒºeX€¬¶*5o‚ÿ,üeÓV‹gî^㌾ätŽé[»¶ÄÅâ“ _¹/Œ+[^)o¢,¨H¶\›•8—Œs}â~ Ñoœà³n4µ—›Úm]ÕÚQ¡ý;~››³VW; ƒˆÎiõ§•êE^|ç$Á/µ<@‹Û ŽO2¥Ù#¶üË™‹¿}ÿN‡àSʤÃyƒŒѲ퇬ƒ8T1¥ˆwD£©÷2Q]*ÜèŸngX»íʶÇÞÕKÿYK ×~ÉësH‡±ÊgÑ8©ïÅ£l€c:ì{ 5ª˜ôL242™Á®›,ʇÚòz@Š=¾>V0ÆúS'V²QGŠŒ¸= Á¨¡ÌÑóÙ×Yƒõ°¸V}ðº¼OP=?™8HB4¹¢Ê÷ÞÅaó9çK@ ‚ëúÞz}1•3<•lîx=zÇ)IŠW7e*§|÷0aã„M2ßoIÔºSÂ"ggZX&ìÈZ¯†·“§àe€k[»ÑÐ%N"‘H =¹_E>3íÁ'hìî_έÅüÇg{%G®a]¹)öb”N ¥]ð>\u¦kCz!.p.2kQº4¿!QÚ|Ð?žR©€ä7%^LÚ T§dÙ TDÛ•ÐJ¼ï =l«]îïá©:b ¬+}¤ËL„4‘ëÉÓP¨ãL¤{蔤‰ÈaÉÂì²<ênÇ—õï¿ã)Ü:˜3Aû/¨^)ì€tзô„•æ)Š*žÊRr+:Û'òÞ_$¦›ØOOÖd'.íôOãµ—Ôà SZŽ ¥LíÌE'Ž!Ø :C4jD yCzß[™ŽO­u«»Yw-œ à\9ù×f7vÂÞ ØCæ4綡ı4™ý¾Tõ hÞå±Üh¾,nˆ7] 6/uðÌ€jz*§ViÁˆ Û}LQý¥·i–È´%ß©ÿ‰}:‹-Ápº¹€ªËލ¨ð.©Ó)ºOú…rúè_¥#·å·ÙA޳ùàÙ·Ž:G_[+±GVÈG¼ñ¼¯§Ëò*BÊgîŽA2æÙÖoÚ z;£¦›™WG8ˆDŸèUÓÖ¾ŸU 鍨¿S •ng«´kˆ¥xæ„é×Ξ¬kCšJ¤Õn&¦›|ØÇ!Q9?ÒÃ2cžOzXÔÜlOÍA*(qúΧSÌìòù=,›`®ž ýÌ΃¼À%ãsôr÷¶!¥”™\¨Ä2w¡Æþ!­Ý‘„Ÿã:¨Àt¯•îßfVMMË~‡„­?ô½ÜX–ÞFÁÝäÑ/Mqº´«Üä&ŽfQÔƒÒgJ„Ï~ps¦L9 †+<çÄ´Gdcr¦*F4Ð9}äEÈ­kUÇ y©Ò9ÀÇŽ¤òൊ̂0{Ò.Ý çÁ@§R=Ï/¤«‰y'zI VE‰`.àtáBv€tûƒìO1¹O–íÚ÷‰œÖ.ã( ¼hý‘°ž>'ÑJi~/~:3)šUïdsñ¥„‹a)[HFÕ{ÑÆ,šè„zõë»>r§¨µY`¾Ð}²ç²k5é ÔA1K+~œP±Qo¨/FxZ¹¢ýAÚ0þüH¥ëfn›É Â¤#Uv„<–¿­­Ö úÊc°i9Œi]Ï{$,ži¡Ô9åÌcL?>±Ù~\ÜóqY?ç郛çXÈì¿D€¼§íBG=“ÈÈw Ô±:®Wàs”z„ÿX¡Òf2ÉËü•U‹EZìùî J2eSüWl¯ì ™ÿ3žãŠùÂhq`ö" ÀV|ÿ„îG¥-_ŸÕdü¦9 ‰B8ì ëB)ã¦Êyõ/óŽ蟸yX ‡:–†RGîÜeNçûÕ—®ñ¯ zNãØ¿2 ÷gQ:ú|œ[w¯}Ð#ˆ5; _˜¨ fZwøU;Ää5Ä …Ho°U^LØM&vÞñ8ìÑy²¬v°c=ó\u÷ÿ!=º›D£žAK÷äX«ß-œ™„‰öг¾ ¾™š‹¬¾ ‰v<²VPÈ£VÎäxÁÓ%‘9†è©‘#?ó®:W5Ζ¿Á²wG.¸×fºËKgMÀ®´û"j/\Åñr?¥%ÛBmhî–`áÖP9%æº ñÖrízs,N“ÊMCºFîžáú&"çVÛ¯'13[;ÇÛ瘃ª?è`ýg êêOØ=ž“]*73(ªóË|°oŽøº’>ìÆSjó‹•;o§‚h»Jd±›Ý¥±rIfÇ ÊöJ¯ì¬tVÈZãÁðI"T]t“þË$&_Ð_¡ †eB£2¤æng*¶ }º`Žõ¾¶^‰V˃.lV·?îëà2šq{wIGöï?¦Ý*Æ{¸ÿ2º‰-EŸD\„ÚΉrŽ$A¢šg×/|RØßC´ü©Þ*ÜŠ=C¹½öŒ"\·ezbTsüù¦ÏF[é›4OtOP›ÂÞqY%]ûjSWÈšÒ!¿EmmÕH†ª“Ñú)ýëî¶Èd™Hp΂ƒסólH¶%Uªrå"ñØ·K2MØæ9Ú$µc‰I‹¨‡©\ö¹²K'Pߺ{ÔšOGOæÙ5Àº'jª¡s/MÍ?[züéO2|—¥Hv¡¹é¼¢}!©l†çò} V±ÞkòPì¦ÔMPv†Ó³@9|'æ2'ž uUr°ŒÿäžrºÕ%Ñ2l:ém7ÂW¦Ê¨Âc9Ò ,h?Óëb¼ÀceSMuåzGF#Á,Ï»L˜÷\Ær.ÁÇC„ïÛ\þåØÄ&10‚<1=ÎS—þ0ucÏ„½˜­—Q÷îûã(·v£¼ER+½pÝ$4jö±s¼Ó ùO%V2$ë–'è4³oÁG5}Šº òñ põ°ÖÅ)3”œs2É !Ld䲯`˜¥ '1ré{~ÀòBulήtÁïß0žñè¡Yˆ­õB§Ùt x€Ð'CM>‚Ëv¿^Vë(uÇÉ £â›ª¶ªÌôù³ Ø,½FÅʸy—›öŠˆÚÙ·€¨7V™zÐñüI²»Í2îÃ’m9 Ð;·(óa©ÞPn¢‹œ•¬.½”{Óâžó§ú1üE29Η"h¬QžÔhJûå寻vÖ´eµÚ‚‹ñ<Ÿ04鬾û`&eû·ÑÿYžxepðiËn?P§cÉìûÌnž6*=‡²½9 G×3)B­’èG+½{Ã|0)sÚýrÔ­ü–°ðê>c•:9ÙÄQSVP@Ï`a–ÊN½´G„¹ðèÄdÇ6ÎôBGž@üæˆFÍ>wÈú'fë·v0}F›Â šwÉþkhÚ´Ò‚ÛÒ.´'®çôLy6Ó_Û¿Q´¶DªVMF.{ü‘m縇!Ø–á®G³Xèm15¸‡ÀöÙIÖÑŸƒ×äúÓ#_t¨¹Á˜Ó¥Þ›í-rå$ÚÑøÍî©’9$i&«"|tΉGaÍÔ}fé6@¦œ´[DšÒRþ±@…¢±©΢Gq ‘–Ö ”`\}ú×oý‹dÂùÕqTÓ ‚d<›uló[u¼šî&/sL‹ó¨Ñîe‘í{%'€Ô‰Ñ­ùNGd® );¦ÌsΕîQ åcYBE BéªT=©D *ý…"ÜÔµ`&ៃ°&Ö¿Û’=zMȆú™ƒ ì6æfYRú¤Ö˜ujsºÏXH¸P–-¾"ö€÷8pÊì_wÜ;»ù´¶õãÓ§¢¥'W¦¨WÀª1àma¶“„v¼†@ÆÒýÏÞ^ïܪª´¥­ç¿ß¸Â c ²Ë©>a=ÙtÚzžÛ¸ÜyZ1´Ùž;‚áÂŽú'‚ÞÝlƒÚP/Ø È›A€G)€S)žû¢´Ã…Ë@ûu "…=> >†•§·ÆÄÚ8‡ýèÀô4¥VºvÙNm!¿ þàÖÃÕ[íÖ!Ã=;×ËÎláð‘<Ò@ dkÑö³âuNÉo‹ïG«“ò–Q5ò7«YvX’dóNWŠ2w€2©mÕdÄM\Øžpñ:Ž%Ùïú{67£w {â­V¯¥©ð>‰ŽüRžªÔ“-PÙY:п€P^ RH|{& ¥·éµÊK ôg¶H°.ëÛ©$QΣíP{JÅú~}9!SqåþG³óÝF©*ÐÞùXÖ8["C²¢«Æ“ꌦ!ÂpCÄ“}7…þñ¢‰¬ÒrX¾ô²_†ÀSíóGÌ^´e?Køÿ߉ÿ/¥Mùh=½îS&*+ú!p!‰pOûpuÇ,4¿S(t u?ÔŒ Ò‹Q¹Yä«Páû¼ŸU Õž·Ë9¢þe¸¹Œ†V¤•Ãן~8¯£[Ý*šR<Ïb²`¿úag» ››I÷9z'QŸ}Ž ñtË| ’õä†_ÔÐ+ºKn KöwGtmIoY4‹ÄÅë¯ß׸ßQ3Q¢÷ë`«“²4:êšlŠÜy¼=ê÷IÞnŸ€oRuë~Dggn»ì¿K­Ý- øÞ¥FJ¶²#Ð6ï0›#ŽC+EïR«ät”–ùY lH‚hŒs ~/Pm˜ åC³—Þ§Ùdƒtcd¤ÁÌmlýʺ Þö}Ο‡é|•l,mJ!­Áëþ²…C¤ ·ŸÂ¥]Óp™Ì(º¶5ÈS× ¤‚œÚ›Ñdo}^woÃòêHPOÑI8¢gØ„ÆÅ¥㋨\¼Âäí4Uæ.¦L÷ÉØVÃèŠ–Š´ÀwA y'N  q…‰Œ G WÍ[˜×/+JI%uÑyöÑFÈëSèÒß™Âsî×`%ˆÿêØotX°³i÷£‹®D~f”ÁÀc• ;[.‘bBé4”Z¥± >ÆZaó7BôÏK®I× å¶ä^ǯp›¿žðÀóuªQ}ƒ%+z¶ýC÷ôéWœilPhXÏÿÅ÷йšæL>€Ï¤xàÈŽØg3éÊ¢GªšUÐæ÷àL{œnb‡ ¬¨©Ãk{›BêÙºäds.Û¾vòq±ÞHÔ,ú’·"w±A“Å‘)Š/v‘–ö ¡ËèÛq°¨°]Ü=C[„îšûtò°Ggw5SÊG»ÞŠþG¦ š(úÆyªaDÑ…w1-9Cô€p³ÐO'ë‚„†,ºôL–ºÞæ@ÍÄðÙmU…å ¿îJ;HvçPS¦ç­.&£‚‡fIºþR0-‰4>‚v8¬l&±ž›!Ö¯Ë3ÍÝ™iбÖ좤¯_œC Õ•®Ì§DÇÄ í^dŸ‹ÂoמÔ28ŠÞ®ÇÜo\xQu _GxáãÛ„ñÏyõ2¾«¨˜+S9!ˆHÚm"mÝ•ŸÉ{Æb-å…øë;c°vî\Ae¼ø”áGVT.ðBÀ³mÀ.X\"£b•`¿Ä¯')’†7 Úœ•hŽdÎ51¡*§{dmžðªoï\ätîžÊož·ži˜;!±`\},„È‹¹“¨^[µR¨ä6ˆ3Y 4þ,‡ËêKæ 1P6Ë^ ‹èu]ü·4 ´í9Ûí¾ågוçòCÍÞ#ÿ:½T»þ¹Þ+Xé€3g‡|Aéé$i¡c‘¯Þú‚õ´‡}Ž䇶{ÜS þV ÌjÌ¿d=¯­OMàk¥†çk¨[¯î tÛ©(2VwlàÔ,³œ¤ŒN;š|÷+Öb·#âwÙ¾í@"±Ï»–†Ts¥¡ƒ+Œ‡W€7æ†>f´\íSCtœYÖã€3JëÖÌhîâÓóꆀOä›s쀀jÛ£=Å쎔‡Õ Fû6ôÆPÛ%².AðïÏ’µ‚1%›ý>æÝ\çÏþE[kƾÉ7‡:¡|z ¶–ž-w Ùg\ô“lž³¾3XÒÎ8ÏJt††î“>8`Áˆarf0Íj‰jàè/KO8RìŒëî'sè×¶Ía·üËñ{c­¨™ïÏÄ Ð)mº"ƃŒ…ÁÒLŸfþ¥éiÎ…MÛ¼sóÙLÏYG›!^fÚÄŽÔ,zŸ—\y¼Nl4nß[tdòÄKg;) !i?æ‹òƒ´øà÷žk—€M•)¼DN¨žÄˆ³‘Á¿û7[iæ 6ØÀTØ7š#Ð$V ç²ß”ÙªŽóBQw]°šì0`Ý­Â6’b³˜ï힃pEÌ~ðßK¦ÝÎj.„›ßÖ9‰ºfGnbžG ¹°=‘¹‰‰NE©îÛé.E'‰?¶WFˆ¡(højÛz$¦5Q†sº¼¨°ëò:˜í·ó#– ^Ö¸Þ<9¨ï@ddQcÝ—ìýKÆ ©:Ó{U¢Úø×NÇÍ%®+ïÖIE0 ¬óþ…zŠô¤q?¼ CmNXêâ7ŽÂ×mÐoCò×À ¨D tnE"ª(q°è×¼ù8:Ä…pTØpy¯†¥Ä‡“éæOæÝ¨onb½$|ºzFr?ëÐHà6y‚+ŒãØ—âæõ´.sžêP¸lF)[¿ÊDÜéÕÙ%8S¤{¡Ç;ó0㺈£ÑÌb(x˜¯äâï;#çTìspò„âÿ {pÞEÛK¡ËÌ¥ èé“ÌHýa~vyÅM:=+>tÊ~|b;´3¤¼Óµ£iWGûºÉE™³”Í€Kæz’—W+V6ãKÖõÓ'vìUæ¥r’. &:™;òK¶¬È_úã¨^óºÃPånº8pfœù™?ßÞb¥Õ%I§# ´v†Í ¯j/z„[#q¡yÎ,¿~|Êà±A|UªÍ7r$Ý\ãÐ@Îð“À‰ à— ÙO:BÚ­êʬ6\»y™ o“Fb–u²Ýì›WBžCú1ŠFØmy‡½ð}É«çÐù{å)»35wV¤„pe&Ú² ÛxÖb‡"•b‘–ä¼õÏéÎÛ³©f$¶_ŠðÐ"YÆ;ZëfLS ßÛ‹js‚׊üêÑþ"QÑ aŽR»/îh2¼lòŠèáYOvý¦ânÐÈÇãQ°ê°aOs‹§¥à[w`&£t)ƒQ#êbvÉ©í™J•@˜8<°=Wçˆ]Ñ‹?àÌÅ™aü-jÆÑ¥IïDq{§sÁ—‡¯Jˆú}¿sžnÜžsÇ:á×dlgTˆ3=zý£µÍÁþÊT¶•CŒy RZ.޶ñ.ÀN,ì)çwaU×ù©9”‚.‹:7{Ù‚_øÙÄ}04Ù8©TðËó ¦ßvrü˜«SceðI+i@b:äýª&$¬^nÜÑØéú½^!—ŸËÿçTê; €‡ˆšª¶„KAd|áëTš„ëO8O,º¢ëU¶ÙfyѨª¼ !¨çi„2lÙMþ¥ÿ’svÓ¹ëûׇ(¸wö”'Dóh]PÙh¨ï†W@žj½ ±Cã!YÊx8$ö˜°ˆþ×­ŠÙœvÊO ÔzòìhR6dù lƒ¯Œ¿¨¿ªx~­Êߎ©EûB“¡´œJI/'ª´c|x2Y ™¹9…ž'!«‰u&ÔW*o)ª†Ó¯?¤‰˜7 *¾¡7vÏœ þ,Ûñ EÎ"d àašŽÉür]†vçܘäš. OuÉ e&fkýõõŸËI!XnmÉÀy¼N7ÕO±ºhKª¯ùþãóà ó­l؃õÎ]Žý ãx>£ ¥PެŋÄêêm¡ C‡3ncë•6vÎk)yÐ'*œ!ý"ÇîCýï/òMyf6Åç¿>nXõÙ–,òt,Ê%ËìÔåÊ„ÝßÞ£¹ØÞŽ¢7Iq}Џ×h¥€ÅÉò‡˜]ú5©/Q4ŽÑIŠ ûÙ˜ªXöí4`…Å•$}­wBf—V†Ì‹¦ºÎáÆè Œ6S.@+}'O¿ÐEõc*þ¹m »< Å wÂŒwð³g2kÐ+M:’‘¥fhkTì‘ÞóùÙ˱]m"J¡9ën6p¶úÌÇ~üMu%œMyCÔè/ÛY)Á!vø/m‰.S¶ôñ™–x‰i}Nnl\•ØC\KðƒƒÇól Ó:ž’7ZìqÒ›O0ýSÔ& mŸZ¯êõÌû©xàöML˜¹rPó>‰2ê~MI‰Ý-íœLÔð4ð{ +CªÇDn®²ms®°ˆ‚[’^þ&áz‡©¹™âÚ h…n†ÜèÃæ"WJ‹é{ уŒ­è&É“G_/ËéÎv.I–'ƒÕss³2!G0?GÎDTf s ™íLv^clÿZ˜Ö@qËôëŠéñ”¦®2®½ày%O›ÍøŒþÕ -ob-™îr…[ý®¥ï1‹#qü¸Ý/œÁÁg8õÓóD´È2¸“÷%•‹W´«›þ?…A Â[’Ý—\:¬š?6ŠÏ‚2˜W˜g¼ÒÏO`[ç2ú‹ªÉDî§ÈD¨DåHFˆ‚°àAç!-{-E´–‹UÍG«Žæüh¹¥þ8œ¨â×Þ‘Þݽ„«/©Xã“ ~Äè¤a|HïTÈ ¶,¯¦K´]تŸ(£WiíÁ›çYg<ˆÑR© f.q/vÁ‹-û‹–ç¤î’¿×s÷ð…ŠøßµÀèŽKŠf*Üh×ÛÀ|qbu2ÏNÃ?9ƒŽ;„Àª,KNSÈÔ¿H:ûþý«Ä›DšhLÜD׎¦aàBÏ@îUäG!6n_k=áAV’ǶS™Š¾“Ï1w¸FOÄŒo3ÂÃ†ÍºëŠæ¸.&VžöùÓËÏÕþsýi°zšUÔàE°M£ º°ƒA‘2&•ü U˜™I^L±ÂNûCfüÃî-)u²J _?¾«¬á‡šoù›lG{l¥!‰ü´] åÇm´‹=$÷MÕ2LZ÷ô˜ãïü/Ÿ£ö±­VýŠä°RÚ×uv‹ëSʶæÄ Y Ò¸úáÅ‚@c¯7»îq‡Áç’’Rð ä&øuRùTO)Qn¸ˆcñ¤×aš”»r@´+ù² ãw¹ýˆ@ÆtQlÎÏx‘ ' ÿ]@ø¥~ûÜ@jL™kÏ‹%&[xÆ­?ß/þ¡JUÇÿAƱH\u¿±i6é6öÊׂÔ.Nø¡Š¸í(ïͯâ4ÃY‹D CCë9L7éî)’ƒ—"²àrb–‚ l÷þföOgêD”oʸå)4%3ï8³gw'CWW?¢W0ªØ˜9_¥|㈧¶µ ºxܥ͂cô»}îh³{ŠX˶R@êÕ{üâ—æHGpt«­|Ä5EŽ ¾S™SëÖûœeðôÔRùÂ|lL›Y0L®”qó½¤J• ’ä–Ñõn§`-IeJ¡5GþQ$-.cù)M¦Á_yARÂFHö¶W9ÈÕ2üÐ}Xžöç%¨öZ=@Pzv€á–÷ƒÙóöìôßÅCÚì”üo`g~- øjÖ}¡]SÂ9¿kC€ýNCÁØ«3ªƒ v>ZåíàãÕ¿<“tÂ+ö5+€¯g:ç / !(1öÐoa4!€%€'¸ïñ}¤F<”#ºr[¨¥°Ÿžvññ_րџq¤à]W2›aíøP#O²Ds¤õÖÓw:UÞ· ¼áB2(Ò('äÍŠ3/A.—Œ;¹I)öFRèm&Æiiécõ.ŸÁcIº!8+Q"8Õ“ïÚv\þŸGÏmsÙ"°T[_kì#wuëîLÅþLy9 È&ìZFŽò:b;f¡ÿ€<éÄnö²•äR«ƒ.¤ÌK`÷v9’{) .Ò ÞÐ"ôWBʯ þµr£W½KR~ˆ¥|ûî$;åaü7Õ“z8¥_‡O`J§LþG”÷m¿ÙI9PDÈ[Wîòùs€ìôU f„š˜ÚS²€íë©Ã0†Â$k_;(¸Íÿ´è¨Ù€Úå_iµïu Ñ1<òžù¢Áú-úyÙý?ˆÃ«Z¸*Sß1 6“ñr‘y`6ÿL´Ç²ÝT íqòP ¨Eà¡N]?hÈÂv«¦*ûÒÒœykpº‡œ¤Zäšf$’†\;Mº¯£¸–d´J&kjúIü‰{±Ê]ºŒ«B®—"Ùìã÷<Ÿ¾®T­ÓoD1ŽÅŒ(xuZ3¡‰)*d9½—?£&dY}è² ˆiÁlÃ!ᥢT=˜1‘¶Û¢sìQ3Êнƒ_¢Tæ3Ï.çË (¶Æg E3ã9ʶ‘÷|Mà¾oó6Æ ékJÒX8ùQdñhëæ­²ò?ƒ¸gU ‚-Dk»”6^â}žõD}úÂê¤oàÇáŠ^ ð5ôƒûÑ^(ÏÙ]÷$QÇîpóE¶œ]UÈU“ 3Xše ¾1¥ž*û?¸]·,a¢õ Yü»ô`yqVÏXS‰^AªÈÏãö²_•q?ƒα_–_C€(U&Uœ=>!K«»á£…:{Å>¯}Íÿÿ˺k‡l^Ûš©ôŠcûn”¸Q\ÝÃm`KÄêÅá(ƒºN¹!Xß«g;Ék²{H}¿r·=Š6Õ|+n«_Íg„ÝŸ Âÿ§ø󸿀êÁ—«ùØËóW-ò²³ŸjºÁ¯£ÁDÏ‘HyVË/Kß  ¿Ô\Xj™ …«9û)¤¨ùHº¶¥´xŒëîÿD¾,ÒLƒƒI"Ö¾ž€Ã” ´ÓzÝŒAvªËõ. aàm"¾=í!ô_f•S9«%è!‘pDO²‡ WP±ºôµîø½)‚dTÖªcÚX‘Ȱ·…Nw‹ ˜=L0oGÓÕú|ÀB´OºdTÊCÿŒ³¶íó´MCÏÝÛeݾ¢­b" ý¨aiESt2ìWe87›ÿ°| ’“i&sÿ¸Áo”"TI‹$kç–—­Ÿ®þðÍbþ\øQQ£ÈÞLðs;1áJ7º÷õ¨-Ù–3è©/êFRk“Ýói›ÔäÛb¿ [·ÝqáJµF0W`°mÀ$/êÝÜÇ=TÖGÙW‰Ñ«€Õ´Xˆl„ía¥8@} \ m°êb©ÕœfÍD|‡úìÞ‡kfp>-¥vj•G9€ ;f0&ޮȗ² >}¡½ßCËØü_í'1¬ÁïâSe©¦¼m[ã…µ6S>²CÜÛÊèP÷`~¸²=ÄÔ³ÇcûŽß€ ˜D§K°þë3›[Ë–âT{y7‘j:\èÝ£»Úã‡GÛ sõ6 Ø À +¾0xxÉÒ®×ê¶Œa;.mËpUƒìH¤Y²%±»IóPï#´{tÁÊ¿·ØC“B«ˆÚÏ Át_.Lg*qÞ3ýv³™%æjz€'ò~ÅlÛH’YûLî)ÐI ŠX)„"ÊaîÞBÂv µ½µAù^Lù#—üU.P* ^¦ÓDh‹5àJö({6ftÇŠ¨ ö/úì#p®^ðÖŠ4 –SP| 89DÆ-ìÕÐûj%Çøsu÷—©p2?YtázþQ/‡ÝØuƒ~lÈ5(x´£øýÐþŸªë\¾)ÞGi~ãÎa4ÄóÉ_)åÔ bt–Es qDÍTþ!ªbýÔLÄ€duºlQ&@æFñ¨ˆö I¶Ä-Ì6,åúȉi•“ e¥ÅÏÑ1Ç.šàz`eÌD «ç¾„µB¹­¾D䦘 3_€²¯Uã 4ƒóö¸°>^ýˆä:ÔYýÌñŽÉ;ÔÇÓÎðh‘+½9H‡YgxiÒâ= _'†–q½tp|AìHFüFÜÄ‹ú=|1ôli`l´ã÷K\®c†xvÂTŠò„.W§¬PŠ–GÉY~9à­£F›4Ÿ‹òµÅægH/Aw¶ãSÙ±»7&ÇVV•ú—‚Mª#§ðNæÐ bü¯0†}fôV²L—6Ô¡u»ÇÍô ñP¿† ßKw”¿ç½J&è•%ÚmFÌvÂz †’×Töín1¡¦â ÖHî ‰&ðF€…½/~»„øJ9þš`ûŠ^’– ÛÆ’š# l±)ЫÉöFE^‚åE¨T¼ÎbϪû¨èÊ|÷íè¡<Õ„öa>èÔò_È3žÍ/.G\w%h:Gu8pAÏJ—è-ÁLM5y-ϨyjÖ«ÌGìÃsæÅ€­K{Ï®³;Â`.~ô¢Ž^­£¨¤8Ók¤ò….®´ª€̰Êcw‰]zÉž-/bœ¯<+CaÏ;ÁÞì÷ÅÖôÒÅ0Nê+O†]±ö¸ÌG2Ûÿ¡ÔÌP—èO£ÐøÊmQôáOxéŸô~’•AÜMFª]mi^ˆCÔäÍ)Jœ¼ÃîZDÈê²Av8gFj5ªD×Lu8޽çSk;r§qðž7xLÓ]|1ܘtgwdÕaUº·^E.ü´­qÆ. P±éõ d¦'õ‰3Öwi}‚À=_´/ÄÙ±TÜû—tÃX¢Æ}óù¹‡€w’‰u·¥˜›Éd1¯kR¦‰œ•/I)@£g-([‚âg(e ¹ö ?fý èŠìq'—ym6黿eJ‹ûº9ƒ½‹r7À%á–w­SqbÉP`mH—j‡xW\‡lþÝñ}²rl¦rj„Z‹zÂAfýè_[¬e3V‚rtev3¿1ìE€ ¤møÏ°K9Ôªß]¦:Èç­OR7)Æ›°å¬©·ÒMw?Œšˆyüãp”ÑÙb–àÚ(9n‰(âÁ÷eˆE(Ö_åÏf¬œ[fÀ î‘ÐÞ¶n}ÙXLt#*˜y$fD³ð°0äå••_;8x§¯àÎ-a1_x“Æ·`e£]1âúéÏÓf7êJ£BÌLkƒ'øf²§5-ÇáAãÓB§Ð Aœ´‡?BPƒt±¡ÉM¹Ð°ðë9ÎKˆI;GEü‚”Bú3É4Ý’Ï‚Bv¿,{GÞ‰]°à¾h&D;£D¿qhEÅ)«Ö«`‚Ž~cË+È[/g%tßBçéÆ]K~f çÔ£%86˜Zæ2é=CŠ:~°›Ù0£è ”é’KÌ~ ºìγð}FŸ“?GâõÜÉÎþ8œ€FÄÓ˜ÝSÝoP›m1]ýc«@Çb@}A4:¥;š¦+ˆ=àjïZä¢Aâ[좖)B;C^bÚ+Dú²Z6ø ç6祪’ÚI`˜$ÐÕäòþ®,í”æ¸ƒqgæ!ÇÂÞpT9PUö\éõ#Ö~͸VÖ”æ‚}bÌ{R¼"x¶î>™‰}‡•Ö}5ûïÕÇjýË%†µÿv‚'zÕÑå„ýÉ&s·[ÀJÜMKlŠgùYüÔ©æ\ä‘»1 nB –*@:¦³Óäß&Éʬ(MyÑs~·ùuÆmŲFÏ«`d© øHn ¹Ç2ƒ­ =ù+ ãhÌ…eå]d³ñ9^Sü¼Ðç'…[KD»îHÜÕwrƒjF<¦³®&•ÖV0CÓ?%Ë;•A‡i¡Æ[ÀÚ¦ÚVü/V¹’&x1Úh@Ik/Å  Ä oÉ3å$ÏHÂÓ9NpÝﯞÄRîõË’k_=ÈÈá^y²X´ôÏHb=E¿fì W—1ØY¯¡f-ýê**Ò7uÐå á˜)‡î[Daƒ¢kÐf^"K08À)ÌFà½ÇÎâ¯;Qÿ£:Gca#ãM~pqÙß2z,îoý°¤“0®ý+öüL—ÂúÒD]+ ^"éÔ-õ% §_vÉpQø,v—L:N}ضY?Œ,é% bf·P¸){ëAOP (!O¹?1:„KQ ²€”“DÃW¿ÜøØÊø‰XÍØ Š©É˜õ‡+H0ä¸8…ÄhޱM]öÎÓVB';žÔí´îU¢[ÿ[&¤e£¸ŸHg÷ Lë!÷Zããþ ¹€qLu]ÙN’†‚€q²¡%¿|”Ô@«þ>ælCîóLÞ¹íñÌ%!“Eâ©|®9v7ØE€”û;uö—ÎH— ÿ)ܲtÉ|·GãBª~YÀÆÃÖ||d‘’s*ú{ñ\²EûäüBFgÆŠWyõhСM¬ãΓڱ]RB£QE<f?/“·éf1š>¹^Ñ™‹\Ú”PÖž‡ï½2vs%ä.Wè=ñõ>ëd™®G-›Ðƒþ°3>ÓO§#DV(é 7Á ED+]²*¡co±#rŽf8îÆ% 3·¦›ãŽy÷ŒIG\}&gV-¥PFÒjóy¯T¯°AzÛ’úo †-a5 yAè¼—®· , ð~jb™r,Áªƒõ¼FNëSûO-®p‹ ‹!ÝûfYðBÅŒiW ׯe°mIywȤü^½<Áßv†–÷4˜»¾à‰éæ(¸Ä‘ ¦ëÛ˜¿ºv²Ì檢-†PĞáۺ¿Ãz¢?Áú õp‡]J9 S:qq3Ù&„¥ öU’üŒþíV§Tbûêß®Òü+!'ê¤×”$éáËâ{!>w\ÑØ&ñæÎ#ÿ32Áz¨L¿þÙ\S¾\F`ûÀŒ/¿­ Œ.ïp %f¼@ +OnÄc“1Á)«©>SëZâåÏÐB³`ÎËÐ)a$;mÍ¡ 8W©É¶ é„‚ð6F£rÐ3=£åÖÿï€ ù6ûWŠÉV6x»0ÌC6†þ¢øqòÍû>e¾ÝÍš¶z–´UudT{‰Jïluv¼€„$4Éå*›4Œg.zûO+Ö|{;¯b#޵l‚µÿ&ªDו¶0Î0fßxÏ%"¿ô¡æ®‡ê0DrõÃSPjÿ.ÅÓ×yEÕºëƒAT '¦††¨îçð2…£PëƒûÂ8 G žê5qDð«â¢"+Œþÿè[þ5Ïvæò–U9A›˜qË‹  žî¢´¼2uðvÆ'yvå#¿8ž#šïúHñÚ„ÒŸ–0ï…âôMK˜}åS=v¬E !He&Væ«Zˆ)1JBëè+êÏר¢¸ÝÐH‚Éj®6CjH‚ÔY©Yý‰)ú¢‹{eü©sª²·€ñÞj裉‘Ó BY ª¹ä#ñM1h}߆™ú ‰”ñ²"MÉg)0ÊÕ£e??/}–ß,QT¿Õæ¢níkD¶æ¸+aÉÃ[‚7 '‘—ËðYè½Ü·ÒGzë¼Öe$e½1h=(~œÜÄ©¼ÚCd‚F…Hxš•Öy“ËN¶rg5kÉþ¿9HLlQt8 yúíıƻÆ!Ân£ßrEœ—hÑ^­ÇT¼„Ÿ´T)å/9îz2d˜5ºôÔ2M_IÀøúÄ“µ“’?;Oêú="ö½c@FØÿ‘e5¦¨x3c|Ê€CÂq4RýNü{?còöS(„®HÓˆö+-1á<ð*‹}ž~¿!r| qHklŒð˜Ìâž-ÒpºØb£åHõé§ð{á‡MSŒúƒpì|¸ˆxsmf:Á“5'Ÿà>Z} |©<]·¸‰a .¬ U Ì Y?kù¹õ@‹^û¯qGKà´Ã»7V¨èJ¸ë±.XÁ«ï‚+O6;7OcxÄФµ|„|Ll"Ӊ̈́³¸¹ÐIXbï¥vG+a†µ ™É˜l—ø÷Yœ¾æÅžKb¤ƒ¿’ù»!¨âcáÀR|öuPâ ÙƒòÎ~ôfVÑ®—Ƨ•…{Ÿzwz$¹þ>­wÚ磶jífO™Bxc©T'Ït`¥&C¤éŽ3k®ñÓ¬®{¢($ZOPàPw fÓ‘VØ ³;vsŽ‘¾øˆ7 O›GBiF†#‰"oM}.Ùk`džÆÎýP‘[ÜXY¦Û"Ÿ¶E¼m7]ây*£}þÔ‹Ñ͎û¡ ÀxPöyãyΣrÉÔõbu¡=HË7.}øÐþ5T’”o×ʤ*y®…ùd㱺:ÊïèÀ÷ÏÆ´Žö‘Œ†>g+,±öH°7¸b½éÚ èÂÕÔ’7›lç>²co¡ÃrüTKc9¾‚€Eh‹™3vþñMŠÉ­± ßvojæUÏi¿G}_,À‡! d·_°Tm-8;‡.¾rè˜\®!Fs8`âbÂwaô¼4¾‡dfƒ‰RÜ¡J¾&ÍðœÒðª H“p<Üÿ…qeÖÏaôì‹z<¡âZt|Òœ©ÕžËíå\sz´Ï¦÷(Ú´O «6ÛþDšêðcï°€¨ò÷=‡·Ûé°_NPN˜'ža¼A¤Á ”«îá-‡‰4>P±±ÕÌ`­m|Ë=V{\T:5Ì+«&„ERã«GyõåÐ^/ÅDÁ#wQúaKç6XÔ¶uÊ®t:m¶1ü¥ ×9Ù›J°¼¬Ýý®–Øå Jôã%§2ÿ÷å 0X¡|ž±àÞŒ8 @Lò“LÕq[¾j–ܶ²±kšYZ.~$ÀtGúŸj.q‘çô©"œ1­PÅ#ÑŽk…þÄX‚íB¹˜Jë\ýŽ Å³XÑšyJ¶CYQ¼F˜Ûo‡ÎÞÍ©ª(á4 CZ©”hŸårSg`jó¥© Fðõó=X‘Ú0kQ£@›s¥Ì®oÜ_Òã<+)ùÊ¡¶4ƒì!‡B€ÿi|¡o¿vâë.aeFõ¾$wÛ‘¹0üœƒáLjg±®{¯²á.Þ xê80(΂¹tìš͑.Æzò«éÁþÃa®Š^7áoãÌᜳ0õº(Ý´°áÑǦ¥t¼gÀéŒl*^]˜„€ÌM`•ñ«Þm si×óØbƒ˜‚ðÌÔ ¬¶eÇ3}°çžêe¿h¤Txz’ÂWPKã~ù!ö¯`Ý~‡xSi¨“ˆˆz*”uä3ëm#Íá°šM„!ŽÐÎ-ù!HÌ&ç¬Wx·z:ÜòOn_ñž¤—\„׋7›,wOšä ¥ ô››ÆHª(­´a^4OVUÁ”ìèñ{•sðq/õÿ+Ú­ñmåûÖ·L³pò’iÿÙm}½Ñ§‚ìÑ“˜¡¬ÎöÑ|ØÉCgÚºƒi ÂB€Ÿ%à,sí•ÈBYð;˜Ç‡å\ óU€¶¼)æ€[4³K›’­ò€fvx$ƪ¢£ü¹×Ìu¹["·&þoØ¥z‘?*×ÇwÚÏ~¨¶¦“gv„ý´?UÛF7œJÔÉÛ´åŽÜð^t†{Il¨Ë¿Ì£,´ç>`Kýßx¾LEG\„iš¸âŒ60‚2.wç¶*^(Ïí)Ûx¦®¶ªµŸ›ÞBVÏy޵ÏÓnœŒ™3¼cdóF–l4î*ËÔx 5ùTê éN½²ÅzП$\%‰¡<[å7ß‚ÀS“zH9m¢3–kš±¾’Q­¡±ÄÙ§J±G±Ü vS"Æ—¯m‘Oìgv€ÊUfØr‚ùœÿ3Êï:»_­[ZÚÇBvKÿ¥A(—[s}Ž ­tj;§°¥;eAŽY¥[¹goòÝ‘©Vþk°ú#v![º#Šo¶<Îðò«UŠc‘g"Öe¿nø+Ï–òâÕhѬZf šÖàkÒúû…ÙÙr¬0I¤Ø…¢ÔB€ ¶’öE#‰˜¹´=„ÕT¢6E3GUª¸ãc_÷ˆ ‚PwÃÇ+ùä6X‹Éî¯ì×ç8¥‚xËö‚ƇVILS Å9þ¹vh_-œs´ž‡W èGÍÔ‚ª“Gøµ_+õ¿s<å¬%ÔVR³#U‘WŠ)*s®½)Œò¿JÐõwñ²Nò÷5juêÝH9k6ü†Ÿb«Š`úb̬|ßED6‘ÏÄ¥ÆXÜÔèý…sÓj´¿Ê’ðctÇúÿ6èÿËÏwÁ%«‡KÄB‘å ’¸›ßÔYçbò©ó²ŸÊ¡ü×HþÎïiàÆ(»™ Ü ¡sêcwõ†­ZwŠ#òUõ±Hó|×¶`4òÿ8ˆ¬é·D(ãd E_€˜íŠòÏŽ·xÚÃ\~ËÃjþwxåè‡qÝ06AŸ+”ŠªŸ™¦×¾<ýhlxÛàWùz­É²ÀˆWÝ ¿õ÷LJA¦ª)úhÕ§—– üÀ6ªíÏ8Rom  ‰Ç§_t@~Ÿÿ~”êO^¡:͘Jš0âõÑŸ·À1æ0€`ózÉ4>i4ʪ*GRÈÄær9åuj4šóen‘H}W#?šóá·îkïb•Ä3Œb[ÿ†ÿ o ÊÇÁñjä盧Årãl†|.F‚X~Û¤’(勹Gn´Ÿ—º¹G^•=×§†â“%øøg–ãÔpï[6ް¹„Y=/Dk‘5ªy‰YTy‰ß®è_VŽu ¶òB÷‘©¾‚Û'“{>P©[BP#¦Ž¾y‹ðp„qX¬ \kP`–ˆ;n{-ߨ0RQ¥_UÂ*¢n†[?¦Y’”Kƒ• á©•˜o®ÆWÚÁ/0F ÏÅʦ@ÎÆ€=u³JôØ84Ñd‘ƒ–ûÅ)ˆK­4ì¨É© ùÍAî¯M$“™f›¢ÌÐ!‰}s(¦5›S_Ý›3˜?|1ŒÃÃÛ å d»ÅyÁÕøô\.@‡ÆTµ±†wo û§;}Øì¼Í½… 9Ð^Aë·Ç„ÏÔË +ä•Sá–”„:t åø,]=UÉÍ$)§é¤NqCUVâöt؇kxlðô§éDMýPašCnãòÛmm¸ªÝ·n÷,1®ƒ§ïÇ›:Ô‹XueyÌ‚ô=ÝNâl)¹ùFβÝé(£Ü¾B˜Ý¡‚ øVÄ>+óÏr¡_=sìçs…·ýѼÜÁYå °õYåÔ3pÑëÔ2(ÓþûsÊL6™’>3vµ >fÙ¶dƒÓr›–¯¢‡¦¿7Gú›J¹½è«•ä`›äÂ*¿¦ñÆû:(oŸ/®<çÁçîíf:F–c½çò¾ÜŒ5&´í¤ÑE"•ÔfªNðA.HëÖª`š× ÂL¦”w þ!´¬jÔF@Iñ¸âY¾wÌ~ ˜´« a÷[È‹' ox‹´l‡¯¾&b¾P4€À®³SQ¥ÒïÖ÷¾H ‡˜ÎIlq[è¶Vî­ÅÓvÕ¸ÀòVú0!óW oÈš'{çÉPœ¿ül ºµ—õäkɶÈty¾˜]„ªÖÅHä[¥Gª«‰è:#Š ª…Åw‚øä²ûz=÷}1? ½QPçR÷Í ×ø]:eÛ=¯‡^±Ü×?ôCݾÀö ♂ˆ§ÇÊGD0‡¤+“"༮%øÖüÐ#2HÕ-Ü·2÷x°‚eí3†g‹rsîæöú*÷“FJÜÁÀQO]sFaŽÖ§˜ ªdÔ1³ÇU[ÉELMáJÐäÑ«íó<<åÝ$k¢°Gîñ„YYý¤ãJcÌóÚÁM_—ÌÔåZgäjÊÜNë‘Üh—\VÙ¥½ö¬Óô·²´ìªW÷V\Ú/„Da:>ëUYgª6p€Ý¾rqö†¹§§u.i–HZ[3ºqœ˜FœEh„q0ðß@£›óíŸ s²ªx² ø2‡×$¥¼$sOë+×XµòIŽ–NÕ*+œÌ>p*tÏ#~qåNZj©òl_œÿªÔZà6]Ãù­´»}7Þ,ºŠO®S:ôI}#Œý ³c».h«„ƒKm[a‰>^¤â”TD°åßôþÁÉp0mYð‘y ,„`ùxf8v­«Ñ`bƒ‘¤•y߬v6³ü»S‹Ò—¼g;kè_á‚y¼_-ƒÂ‡â-©¨ ΫìE“•ˆnÈÉxë{ò²ˆ§Ûõ3Rˆ¶ ¾ªëZþ‚½SÕB·îëVü“n0|á*"á½=ÂÑþ «,‹4KuL?¢ Þ:5D}Ïz¹Øê”?×¹&[¶-°{KwÚ¾Kø$eø/OÇsªfý,.ƒzª¹q–&fq§¶7‚úÔþ·*ÖÛܑΆšÂúÂüîÆiÖ(;B­³c:Æ×u¸Û ìƒ÷Þ½“íY°+X*!Ç ßxÞ'‰(Æ»ù ¤ü%™½î9Áú¢íŽÁ±= GŠQ²ôrÖwÂ\O`Ÿ³DDe÷òúÊè¢f–W´(Ζi—ýOã"Z7´“Z ùµò_¨vqÊݪQìÛfÿMýG~ŒËw§µÜâbÏ𦲙~3¸D&•õàù >7˜\â²])èP8 jvÐ’€º§Ò3­þt¬‚š„ÃöÙnæ`yOE¡˜mžÎ2‹ØgTFdoù÷ϨHó+ÂurÐ!¤X_E» X—ºi†×Óí¸;c¹µR,% ê9µàw ¡Û“0öÒÉX=R²øà“Oô¢9‘½¶ÕOŠ ÷UŒ_7®.À¹70=¨Q`ÎU¥Ë¿bjh¹ÑÚÍ]Ó§Œ"êsçN{š"ëBÃk¦´¤9hz嵿Åe€k-懅°ÕJœ\ DwXj.·’ö~ˆb¨Ç,áóû a³ö¼¬Å”¢™4¾‹ÊâµÌ¯Oe᡾ÑÜ*Ž@·3V²]5‘&ö°aªìá·‹Ç. R¹džÙ,s8À½ ÄCe_aB6å ãÇŠ¥“wM`Žñ?îwà9=û¦ù z™‚A„àyÖÌQù8zQÝ÷.Óæmþ¬~ÎOgŠe @‹(`Ù1ãv*uåÌJ¦ª6Í-¢ d´¬q£gV ³tSFAo¯ s|K¡ç_"Ïýù÷¾R!A„`ÀÜâØ2̺öôó¿ÇÔÇ›ýd’šp¨¾3Ç ÆqLÜSòꃊ`ÓÆ×'ðx»VV3†®Ú»gÓ´‘rÍøçÇ.d~;Ëã—쬚w.—¦cY¦#¦{)D0GÜNq”Š©N¶µâ MÅb½Ë¤m™ .kær gOR¸·è=ˆ¸7P•tÕbS3Ï¡‹¸VøÓlí2†1–JqËÏOÞâUÌÞ®?ß A:i®¢víj±Ò3ê¹¹‹;©¶hñißuÓÎíÕ1JÿÚ£1¹î½¦1 |ìáŽÀ¡½Ú T’ðuäÚ½”KgÍ m _µÌ€jb÷J5H‹ÂÆú”è2s£ë‘¥KÜ<Ýë:ú]œŠ;É|…:S.ùpÝè²n")4™ÊOiªsÈ$†pL-MÜúÇÆç[‘›Ç¯arçLôó’3@ºk­d¿GF}º7Ÿ]ÜšZ°|þ4‘ Á0: {;¿dÖ^.Š.þvºÜ¨•ƒLóNö¼Rj.Hjw>”o”[!kt¬FÇÙ·#Ù«»ý’É­É_„ÖC… ´LìiL*Jô÷ÈÖ/çôêð:Î,í:‘)µðŽ`´wzË}ZADæa¾„JA/Gpެ¬M«þ˜­(hÎd‚ö>n>˜× éoÒy ’™m1Žý “ZäiA\Yéü^ÜS0J9kðÅ®-]¶¥Vaiß2“Ë‘38õR< <‹¼óZ´¦3  6BqÈMþRix7…n/:2¨cñ‹h›nîz½X½ ¢ŸY†ÈÕÏ4ÕŠ|•Û[Š0'XY5©öÏ¿âC0¾¨{¶seOç@¤+ÈßßR…®òU3ù(`7ýøõ _•˜i¡vÐ2Àî¿sTßX±+©^f³#'Oó5ŸŠzEpçú«Â¶TëŸ1µ¦Û£cÅ@¦/°”eD6ݵ›fêheç 4Þÿºq—Úk 9  «Ðrì puÇQAõ¾ ¾SëW× P*¼u¯ÝÛx¨sòÚ|èú?T¸ÕOA¶fÅv„ò Ó}¯Á{œ p¯ùW2 Ôc UaO–ÏÈê ÛàìVÄè\~åÜ£a£¼Ç?OðØ4 ¤ëø?!€,Q¾l‡ónÈÞ”Õôœ”ðºª|´Â—±uJ†=h~À‚>9°²¤!3…˜ï=ϪB¯­¸:ß³¥YeÀiPùàa×Ü\™ÿ)jßCSk¤N`¬ˆcœ†IMiåNÝj©N®Ë°Ì1œ—~ùs3)üt†Óã’-OÄT  ]¯z9njA€5_•UÞÌÓ¥+]£QØj8WôÏYŠnvïâë0ÒPL-Vcx>ŸörÕƒ×?T‘Ò¤.ÓÎmìn§N/ýµáÚº€ ‹O„Ø£ ¯ºPû vÜ—ÈKç+ØÝ ˆëÙ†ÂV9[“eZG’•@€ÔÁ¿wHnWl¢Ö~Èp|ˆßK„Ï…Ê ¢&ɹ³ŸüÜjñ´ÚO%‹´-üdÊÇ…3Ηy%SzŒ×âo†ÑÊè§ìa'k¡! gFj¤ç ›iÉåÔÿÆ-ÖÄ/ª®Ïô¤dB4Ç!åËf}ÅO6•¨cR¤+]ôÛl®òùPÕײ6 Œ¤/VaŸ’ÊàkØO”†¡!<|;wkª?¹®a3°³áEŸÙO{Á¾—ñ‘XÿµîÌ òÒi¿™=#ƒ-1h¯yªfs±3Öc ¢×Ú Ç¦[Ö…¦üYœ÷XC,ókçH7Z}uªá¶¹Ðº‹‡ñòÏˉ¸sÊ–§]¾ô^ŠRdžß³ëÞ¦@GldKv )Ô‘MG@ե܋“T>t' æ½»ðÕ%Ó[ëb÷³8B¶;›‘Z—”$I!~»„Òƒ|<¦ç*£cGàªæ;·)µ‚$e¿szRk–Ð/ EE,K´ h!’ŸtNðÓÅ nšš â³úH°E°zóû\WÙŽg÷cUŠ`) «ªº§¦çªlPõ@PªR¦Ã)Û škŽƒCQ.^K"^(œÀ˜åøË Íý«LÛ]bÿÖGΦO½ÆÎg E|¬³#ÿŸYØ*}œ„¦ïîÎ/I&‰-ü•d@ÌøÔ/ŽBÛâÞ­.¼27ˆÃ‹¯Ù½'dppÔÊ Õ&À7 _غGÏ=¯-×*«a?Ñ}‚Ûp¥~ð²ÎB¿mrˆV0%ÄíåM§Þªç&R§þIÌñ@äyrÐX=åI±=›y‰»ý9’Úü<ªÐÊCÊôµ8!´àÔ§ñF¾;yQ=q¥Ì&À7⑱ß÷(.g°ão$ënÿ=Ki¸dðgUÁ1æväQõÎU•4à5 ¾.n*èb]ÎÑŒ¶*Ù£ƒå¸ÔŦƒÙɽì‚Ë¡)ñ«ú‰>Šíõ«ÆÓ¡ˆ<Í}”­Ÿ5Ó(ŸØÕÕð ¥Êmǃ÷¥¦ô,¹½;ê†;µçwªp¿ÖðÿÎÉwÊG4H0׳§O›wÕû¬ØfxŠ墼šT½©ˆ‘É“§"¡Ì•"Þ ·lâu Yü®Ë¼þV­Ôϳß3–5ݼ¼Jó °ò Km㧬p;  CÝÖ4z³_XΞ€“ 3•gá˜ø$¬Rè¾Îèn!^}eWÁæò=(†ZzÔ‘…ót%0§|Œì×”ž‹ì÷7ŽhN á"rè°« ‹³Ìr!ÙÉÊ.&ÆÉSz‡° ±i»0lÙ{–Ê5ªwxèóu}.‡‡ïtBò¯-IŸ9#÷ÜœçÿDèø›Qécõò¬Ô|ƒ5BËc:‰½=ÑJë·ygŸ`UŒ º…OÒóÀnhr£b Í%ã¼¹`š±ÂiçÃf– ó23 C3±=¢¬¶[ÿaxW3‹Sô®Å—sK„mò £Ú¢N?_K÷IŽÇ9@bAßh—v57&?͘OÄþÖ^"ù¦/RÛ9Zs¹Ä‘P %LNÅÞ‰¿’y³ìWè=rp}ºvY8)Œoaƒ( ¤5þvò3GÐkV¼`ðÊÁ‚†Q®;)CŸÄª´åÚ »{-"g¦Ü©ãéÛ UîæV-l€HÇå8ïó­” pvF§ÆPV|ª:qÃÏaYUú,Xz)7¯pÜk÷a4|©+%³›A†NVjTC½®ÉåõZµØro=E%öcA÷&…XP'Æ]edM?¿C WŠ©#6ú§²Cæ†Xv‘ÿ××ÇGÅ¡žoïÀ>(t@ñ§ÿîÖz`Ó€Ínö¶Ô?£À¿®–ÅT^à(þÑÛ08[‘Ξ83ãæ•“É+W„®¨bVÕ\ž»þ=Œ^§9¬ ›+ª%T.[þÍ$×l¼Å yKh¸ 1#àUƒg•æ(òÂ-ÂVÚóñ@—÷Aø3›ÕRÔ¥çz5°} ¸#M˜8ÿ`d¦P‘’ì’ýÌx@äë ²Þ ÏþæªD¨3¦¥åÑ©(69Ë0M6 ;„ÈÖy¬¿&´"‡—U›Õ&¥»'VPCo\Á¦ÖCMIÑQ¨>?¤pfs ×Àæ7ÂXŸÂà˜²¢éÃàÈyÄâð9¾çDÞ=€ËD ãòñ¡ü×ñ¡Lh6ÖãD®VI5*peYÍð·o£vâ×ápÙ8H‚ne^Ej‚å‡2Øø˜.¿Ãh|uëúâ0IÃ:A(RÿàyRK „s‚ÛémÞ@Ò¶˜ÜÚul)0vb§;ÆÄ,¡WQðSXN#&¨áìè”ÚuàTáSrh­ê[ôÃ×M!1Víè—ß|ÿqsF)SvÀË´ ê ìºÿ¼¹ÿÃ'pKÛ%#öàÿwÎXsŒð*Ü0áŠ!_À°™·ec KïBR•0jÛ3†yN²Ç…!î«{‚ô ·ßqw1j_È–\U·Ô÷HˆœOÒÑÛe0Yµ¨î~»ƒ_ƒƒ~Gaçg)ãÖv÷ï¥Ì›D7²ž2ó­]Öèõ÷:Q„²È³“myÑ·bÚóÛOzu°£X”_K! 3”ÓÃ1ú{’¿wðÉ&[¶ñöï…6}¡ Å÷go÷šÊKZ"ý³˜L†P•£ Ê7íöò ,WjëX•Á<ø&M7h‡†~öŒ¡~8™ä ôÚïû¯ô"2 4Úî&ÆÈlËåÜmpygänàÌ‹~3¿.¸íÞâ¨M÷ÍC¾öáˆnç˜êª•¤7f=4|¯Ã‘«CWˆzŽ-RÍK´/ÎÇU í+õqžø äý#+â/6éÙÇ1õ'Å{UÕ:áâ,̲3ÛÙ aäi?p¥\xz¬·õî5muûCîËZ14rÉçjÚ„ 2{'.xÁX»£(ñ4C ¾q"GE p\Iéu³ýLaD?›¨¸ÚmÐøá/æO?å¤Þ^]eÖ(’uûzЀ£Ç5•fC„4Úë¡BQ›Í—N'©Jº¾c»{@ða­ÔÄ¥m© ~&º ûˆ·&6 £–|ÉÍàÌFlò‘{4OÂXoWs’Ž÷Eߌ¤›íVa чÝeTNT é0«ýÅÒ¥CY¹l)¾ –:j´¶k- I:–Ä[PÚýF*û€säÑÔ‰ºßˆKý«Ãq²'sZ§þ"˜AbÊ?ÿÝ«eª"wE@|äU–‰2Ö1’Å\¼àŸQpöYäïptº °kaÚ®–L^+P9ÝvÝÐóát¼f©1£Œ'Ó‰ˆûY˜¼ OÕ%Œ}ÇX¸ɽ‹§²½«\‘¤Ò0Ú`¡’÷Z `õó}XZוhd5%n¯U}ˆ‘t˜Ú†ÑõM Ò9™ÓQä¿,Ÿ­Æ“»g‡ë®žIfÂe¨„šh*Q„ì"‘ž•9ž] ùxæ:ÄÎk\,»|MÐ'Ž6Ç¢#Ça¦ ªi`6TÒ8Ð[ÔGì™ }kÙÌE²“([¬ƒkmTçÜ…1•·ýŸgŠÈ)˜Ýȵ]šó=T Ö&Þ¼ËÓŸÀaÅXî±T±WèG¿+ÊíÒYòà\Ó5iëýŒ˜÷ÆRæÜG —wæ÷Ó¡Z&<»pÈP´L•"ÀOšyc`›²+QÌ+4ðTÐ5Ýå¨6®T‹ÜîPÔc÷æµÐgÙv#‚?aÐmµß›0ô®/Sw•nÐCK1¨Çîîg3­S• ˆÎN“†ŸjÊIòEoÇ¢~¼Fš³ýóú‡»WqØo7Ä6*•7FÉà,WI‹Jé $í@Òn67øÅװѺ-D™Ÿ‡”œ3Ö“Áß^™‘##ðºâOÑ|ú\Úû‡Ï¬>.ë(ÑÁëÀâ„4PöõQ]V\í#€éÒf$·Nl © Êà#GòÿªÌ7ÉŽ ¦´—6öµPÍõ'öRê4¦´ð—I£È;w™§ÖðZš{Ën‘ d}–º(þfP††¹%÷¡-cÔ%n\Ýï[jzñƒCQöÙø?ä‡Ô@žMÆ3‘ƒŒ%ÖÁ/¹ÀÓ'h+r?oË­nQÁ Ñ/¤ð‘­â‹WTjÛsÝ:½„Dø?­µï}ÊÜjøP“Õ)øª;ôäÁgäÀÇ3¤œô?$øÖñ¶Ú­=»ŸuTâhئà9ì&ü+ ZR*çò¯÷€Ù-|Ñ=e8d©ÝÕÓ§þŸIŽ-•X6Ö•öÏJ[y›“„|©Ï둃€Sð\™q^Uo_9ð àêk„xYwpDb~þ³¯D…P’Ñ"NgàÄŽE}óGÿý1´4`‰º¸ïçBÏc "‘zô1¯‡ü*’nFó~¿¹mC+8-’dIíE]ŒÑmCˆP¦Do¤°Þšæ¹HåN¹yæ/IÏ´ž ÿ°h6¼_aKgI;$¼‘¡ßŠ®Ÿ7÷§›4uˆsþ E›ßœ­»@ÇNä œ(ºÊÔ³ß÷Bç} S6É–¸¥^À¹ë¬ 1-½Ñf?uÌÁý1¸;%•"yóÜh ‡Lí$”Œ¥ÿÇÍþïéoy—ôýicù7ñÚ× zwªÉF@¦D[ù4Ð÷Ft“a¬| {²HbJ ¢‹˜Ê(âˆ:?G"9µÜûòfüÀ·k"ªó×ü¥¸úÅÓ:á`'Çõ$Z+ŽÎ~š–Å“¨¸™W(&ÿD øLóÉV+Æör¶OVÈB¹¿O$¿³Î^2V(­š¦!®!ÕÌ« »åž/žr†·BpYò9Yƒ„ím]ònrþczÆŠz3FÁ`H>œÆ÷^ ÐǺj“wo>˨yR–°Tu¥•öI0FŠÐRÀVW.×CB{rÒ÷;f=‹çTƒ„¨ä—¦ÿyBˆ¢èæÀ—\°g©lRÉ·S’±XÕ¿€½-ÌjLvY%ŒA–e§…Íã¡Æ¿X7\ÚKxßñÝ«ý8Þ•™¹Â1NOª}á/³ùϽaªkÂħQ]?-…|ò’ÕöLœ\×:R‰Jô3à*Ј#?õOlü“„K¿² CáóŸÙ‘'µµû’N;ð/ V,¸öåG{G—нŒÙˆÊÁ ¶ûÀ(£ÑN ‰aŽ2uH“ô¦Œ·X#§œáí¬`…k®købDö"uÂ<bùä‹ÍÈr“¢z!Ýu­'{(hã «N9uÖFOsБQÏ‘ààÂíÕo‹HõóU´b†‹RGö„1÷áq÷±â+åJ E¡u–!†ÙgOÙgƒڳDZT v$âìµâ¬L:Þï´®soâÎ)ë+ ù8°lYðNæ¸e¢Ú¬[ 0D3MiÿÀLJôµn¢»ZDÓ£´8z+å{³µ<©|Tñ ¦ß²Éå^TÕôw˜„È:²,®a³ôÐlS›Q –GéQs^³¾§k<0ŒÒžÀëÂÊTe¼Íˆóë…Š”J®IýÙ$-†ÖðŸ?»qË#d5Fhÿât'cÄ»ËQILi"ûãÕÈ0ž¥q$.˜eÂÍu:Rƒ&‚È@90²U=¾³7ÿW™¬Ü[9 ãÍz„s©¯ü&<è² 9>þ¹ÔÅìv—˜"x ÔK“»Ê,ña“ïïÓN=S aíÐ#Ž’‡ºóÎtŒx¿&à‚$ÿ'dÃþRèvPü&c5]»ôæczÌ|÷ÞwãR-½ÂÁñì2\˼]W,Ià+½*‰Ôß+TÛíPç±ðñO™Àlk'ù´uª £îŸ{Ò8ðKt5r9eBUx‚5cm~úceΣ-DK7²¥8Ì,Qa¾TçtáoÉÅ-ç…nœÃÓÚP ¹]X‡lJ ~äU^ix=êïý‚þ2‘u¯‚6¤îù¸1ÚKŽOÃßã1ºŒÒË÷z߀‰Tîr“ìò‡¸Pü(Ø{= »(µ(¢f—ßÑÕY(’˜ÛéݦðU°Sáù@ùYû=‹J§hŸAL 4#½€:»,ò5Ô£i\ûAèrìî ÇÔâ(!Á·•Ó »hVõÜ3 òNò™ ³l†’{k­öÝŒĘ .@‡½s鱨[`µ%>yÕ¨ þ€^*50â¦Ù®&g¢[9÷â è™fcŸÓH  Ýÿ‚À^"Ù$Êxß_¨ÀxAÝ>¾çÇà¢úÃCìÚãX >ûi ‘»M˜SÔ>»í@¨ í̵](üg:› ÍUÅ*Òç̰5{’)zâv;_L-‘ÅûC)¸Ôèœ +´hõ“=ǽ /t9‘¥½¡“„…„Þ=&¯’lÚ£.7¢SªEÚrqMœDdSº[[ôãz¯ßGǫЦÕf®á6kBð(ýò¸r7m«0Ê ì éÙ& ‚j ½ñtcûNõþ/äü/âÒ eâÞsVK•xýà>¶«‘“hý¸I„½JÂ_šqûÍÉJ”HÏûíºßc¬úU ˜óXvacÅi‚" Ô-úM®8“µ.pþ“[N¦Õºq BÂ-’þó¢S©ŸèEù±Ï]T¹)üívñ¡”.ô«M©‘±Ð,¦5rB?çuŽÞ ³íhÏËÇE."EÚuªÞQuc¾«f¡V¶-[ Œ…¹1¸ÒÄÄW¼1±rèvL€vÍùæÎ[œÎv¶½9Éj*÷Jó„©‚O exx½ýÇ®SUÁî3^γ+üHhZsÌ EÀ ?œ›mŽðVèÀÓ¯‡ëWÕâ!“[ÃðËx,t[œ‡õ,ÇÀÚá°Õûãî±Zé³,‡dh4Ï Œ±EJ+&Áu5 ½’ ¤»òK¦xÙrm,ž©úuàñ3³Qƒ‡ØXðD”­ÒmüÞ`ꬽëCmä Îü@7»]ÍÖ/Y¤øH`)‡°w L‰‚£ã Át;Êx SÍáø’¦mPK`Š øøzw“{T=êáwœÞiQ} Ë"ÖÔ¸L|ñଭTBo&kºÕô·‰J¥†¸bt ŸÝΊްšìEªl—­æ¡ÎC9!È]éÕ'm™{‚mç\àŽ•3¶»Ö´ÊyF>¯3çÂÐÊÍ[ýC®9!¢öLX¸¦~Ò’ùf¨ð¾N….8S˜hN/NH1ë½cÏ̸£c´Ñï;4×…U^VL/_Çí/ åÕK};«%oJLÅÉ÷›ª÷M„™šAœÌ—}åŽ(ѧ`¿Õfpóôß@öYBLÆ æ! Þã])7Ý)³Ö¾•¿Á–swÿSî ¿Žÿu²7ºLÍKêYÞÝÕ*.U ¼a¼*iGÏTmp¬À`0yNÐ"gCÂm¬s«'-‚°Üÿ|Ï~ðÅÒC¾M=ñá4ºµc"Jx{riÞoÐTScŒ¾ Æ—ÚAì–=;P¹wM½·Žf]u ½0×ÅÐÀcöÕ(ˆâá^½XZ’ ¯H:ubN`3~/¾ D‘_¢Î$¹®-cëµí†ç"0)”<,à¸+c™ÂH1 Ì#|ö €Ã=MSq ‹‘PC=à’ÌU8†3èÆrÆ püÇÞôsŒ›¯'Ç!VLˆˆµñk8?e#Èšœ‹NvŒ ¶ ¿¸¾ïña"õu?‘¯Ü„–y¿«}ÀuxV;m¾»!ÓÒ$7ÔTÜ?/õjøóÐÆ‘S.:„×Û !'¾±3íWb¶Úp2ÜÅcJ·ôRM8‘‚îT_ÎEùûí‹«À¢d6&fuz¶gÖÁ)õ`'h²Ã£P°V%>o ã\Ö~Íðݹ<»¸jnÞïÎïMÁÅ݇•…Å"¦†¯}âE¤ÆÃf§¤zÄ6µ…I®GœÞRð ^rÂüÛðxø`[Ëâú0L^<Î} gLŠ«ÿú·ÉàgðM·ßŸ¬ž%Þ[ï1½´†{å€:¢ r°u*óaÖ?+„®Ã<ðÉïœrE·]1P¹œ·+Ýâ|ò®9NÂm”µ÷ùJ‹¿g ·ÿ‰r7 ®ˆ˜·#êÞ–X ßñC޲—²F:ËÁ³$!:Û3½F0P<–h—ÓÇãêï›Û>nK7†°ƒó•Ñô€b¾ ªk$€n^—žú$©j¶@~ í*!díë¾+-'P«~úÏV ±(Ò«iù ã>µ#ÍI*‘BÆ-ZqzÙÛÞ‚é3]¢Ï"Òñ …iº®N欹¡{üѳX{[æwí­‘\™¯'L­ab'¸Ö¹nˆˆÌ–ÍAlE\a£¢'?ðævû“”Ö×Ú•§©!¨í`+ó%CS¶i@g—š×0‰xS|ÏùpÀ+;6¸,¯«´ ïLÆfê=ŠD0C˜I-úŽD¶B¨'Èãê)ö8ùTò°¬È#’*ƒêk@”•s<Šf_7û˜b On¹5H&´´ð)PZJÓñÒ“,oÏ&ÆüÕýõ…uÎÖND'ÎçB•Ft.™@}‹Á®ý¯ K Ì“Û“pîˆ7p¬4†b™Qè[Œ$žøl^8œš`píäàô0ý €^oàÑ 7K$e³¾ý!U1™5H Æ'ú)bø¼[ך˟Ó¿mfN:@xuö§ÀQBnó ¶ £ÑeWâm^¦¡¤þ`lG§¿îY| èq*1£{OltóÉq’F YŸPO n£õ“äá%A_ÍA{ iý¡—Ûþ¹>Ù®ò|P罪ùÑ؇2¾Þ²¾ï æVBŽÛ));¿n†F4>_ ®m½‹‡…ÿö}(ô¥[±C ßßÏo2--g¤Í—gïg“'ŽPÈ>–µBVÿ?Ï4ÂV“]œùË“¤‚Ï&5vý¤†Zøb¿¬Á9¤cxH<ú›Û¾ïg0€Å-Lç©®DC° T™àMÞ$Ü”pWUäô|)”W”Y˜®çBéW´e;粑ËG¨¦òÖµ äÈÕŒÛò!C 1Ý„ïŸ÷s ½¼‹èzo\ŸWRFûGžˆ#ÔO§&ô¥ì©ñ®â~6+ö¹ðáðk:º Ÿ3â I­$bp¯¨ççï}:ëôBºéYòN™rÅ€qJ&Qª«¸wYé§ÆSfP£da™†âzyîeBNwFÙ[#Ù rŸ'|f„[&Ê3c÷تe—ÔNKVÅŒtšU½ÐÕQ¢ßÇM˜ºÿ¨ñÕm÷TŸ¬øU'Øb€PüT.cü«[»T.‹¹ÈËø¿aú §þÔ[ýlm²­sb‚åŠü ÑmN Ø,9Û¹GK 1Xmwxó ×uóÞ˜ÒA89¤êNÇùç?ÖvEN=Pp/e œÂñ‹v.ø™íqð|A5¡O'&Z¢?Ý=UÜÇÙøxB“˜YÀ0_Bðåóó´©T9sŒt¡E%+•¤!WuŠe3z…‚á1Ö¸òàg¬=–4u¸^G˜!9löâ'^œOžCÖï;~[Tc‰û«¾‹žÇAq1&—(œw¨<ÏKì`Cµo‡¥¶'cù7ÍSµ;¼íc&cOô4D“bL¯ê.ÿôábÚGÂAåNý‰aˆ°VB¹Ü¦½lEŽÜGl³˜£§gîé[OfÊÄÛçëGo–Þ`™¯(Éqeó1®ì iȵÐ&9¤µca²æ±)`S¡˜A2x: `«Fê®Ê»d°å<|Ú'6lÔtÇ~°$ ¹…žh %^~Þ½èEß-ÿ•ûÿøôdz½nlƼӠW½ÙMr/¤\¥ÈîBc“x†%´/þ>ÝZ4ÈÃ]"áøÚ¢Q?Ѓæ€Û¹ÑÕï-*ÌB šÀdzþ»¬|×Ó˜A<^[„âí"õ3:®EBh[O±'»ÃþÑ%U¶rñ ƒo&ƒµ¾Ä…WèÁ2(Ý]¼kÕ@¾4Ù§~Í¡(RVN´PC*…ƒågæH mª‰@ži…VÜèŽ ‹1W\p…Iˆˆ¿´ä ?þNª?rÄ™Î>0djÌܬƒ(& j¤º  õ[8]¡Ú}`¼¶%ÈqíÆBó8UK«°mç:Yôh¾›{…ut¥£S>Ÿ(-Äf Wô—Òð%‚:BaĪ]j5mÿûš§•N{Ø4Õ5¾Ç·?<Õ"WÎt•ضûi®ñØ ·ÄIè…Á±Ø¶¥ð5(•ˆc_¤"¹õ4MÝV]®È<âÎçøl%X"_zNR¨ùµ¨´j9““T—;æ^Ïû½Ìoá§ð:…«ÍòýZN¨>å P­`Y2EÂ1Ra½Ù^^\®'ýªà²BòµAy8# •5i‰j'/k«SBÔCW›®Ë"#4ötµÙr”ïå{’YK ±±U²r¶ ª¦Püák#¯Ä6NŽut]ô+ÊD¾ò7Jä¿á°_ö.ïè\£ñÇ'd–ÍvZº›D¡rvÛØJjñ«a’HØ”·…ÉžP=ÿ°MÜ‚™nôWàóxÙZµK¶ØÃب•) ÕÃæ-mÕX‘  íë†'’SgÅÿÛ܈€èÓ+÷U†ýR"i¦¥SÒlq¦EÇM¯‹Ï«¨hÕò2bËU†S‹Ö(.‡ä]‰ sº@ˆÑ¸¡rÜ»:ïÏwÝx–…YV]­˜§l(÷×»õVûÂ딂„[ÿkÏ{Ì ¯2K£nÃÈA^ôæüTº¿ß`á®ÆÐ]jsÁË ÂíP#qÅÈÐÁ]¤Ë)ª„V´¢ÂÛ™…bÔ_¶9ÛÚ£¼.[)D­‹õí*ó¨Æ3Â>2€¢„nó>3Ÿ›¹«b€(ÞÅ}zyÞLܱÀkä¡©…¦Ckb QÔ<ŠR+ÃêôLD{…À ÀlME$½´I>ª¾´€–8µ%š­E]Ñ.p±ýÛs¨äëÊšÁVPy{°Ò±§Ô×T§›äÓÊAl\8¤VòutÊÓþ\ÀFê+T¡ý貨´l;®?Âý+†•}µò7‘ î—ëµ,ºs­õ[AF2p¸ ¿¦RÚ§™s€üú˜0}΋+þ¬ƒ3üëN†Ë Ÿ”@Z‹ÅÞb«âm戠ÊÆê’vqÀí²Ìî¼WÀ}ëÿÖlRlKK¯ÿ1õ\Ä**j•=/sö®þÇDjTOêb{Ÿ…Ä)‰k,l\ýèl%S2.õ˜ã·jJÙ¬§:¯îÉu¶Ì..L[1Ž‹ Ä´hsn+¥ù£ÑE#òÌŠ 8e q!ª x1ø³ Íœ%¨/Aä]ÍòIô#TNŒÏ ›ÖP‰ÚN7Gz ‡“8uãš#¥sÓQ…E‚ÿ7²ñEø+]dïHÈÛjï-ŒQþ^ÚÒ`K_Éìôûº%)ã3yÔâTghYé;½±˜ÑÉ¥‰Ù¡ú5ÈÅdCPgÔFËÖ@ÃÝV´‹ýP-û8» $jhҜ귎@¥NE&Ð1¡'@ڵʹÀ8¼ö~A»µ3,ûªä!æžr®QÖ~ho´å£'—hdØ,>ÅÛ–NÕG¥•£\ó­µ#–²Kxo6#0Ï nƒRü¦ÄëQ žªx7×FQîìs—ÉK‰üÜÖÞ‡‘ž„ô©˜5P3õ°?òz“ħ«dz´cJÚêDßÃŧÒÌ\ö\FÝ1G;D|™«¥¬ñ|çx')Ñ ‚jbC®-‘«þpéQ]‰9»aîÔÝíse{œd`»'ýj¬™q%àv X¾=`èœ †´ˆ5’gšºCü6Üx‚únjkTn\NÖþspƳÈ9cK༌âa‰z Ox¦WÌ@b½”§QsT ÕtïC×në‡ÉÇ—¬å7 <š}áO·©âl ìf~¸ pØÜ ~œ¼Eq1z±¢þ F0öW¡Ûò7úRyßõ4ó:P ¤”Íâ´ìTÓ: é¤û¹'µÕot(^® A Œ‚’w”"g·Ül§§l'“… ×Ï«6Q'§¶o4gwJýûº»Œ:Ñ`Of÷Š:ŠŒV!·&f„»„¹0êÀ¿‡ÏÈ.Íý]—Áàпä[4Ðýª¤£Ë ÉYÔö#Q¦Í{óW®P“×ذÖáI¿­"·vÔìÿ6Ùþ}üf†;¸tO~ «àÅ]ëðo÷•ÝzfùÄ!CŠåçaÌ:-DÏWS Ö¢rÙ0Y«€ý^³$Ü=•5¤Ž2zÒ€FÉ'V´ƒ%055Ü|ÝáiCÖ…ÅKÎä ¾Þ[ û4rzªhRš.y?ê5®È÷ƒæw¦|‰(êtèUúR˜ÿS;R ñë`ƃËnvŽDºÛˆ ïV: ˜ÂA,îC„RØ‹*žÊIþÏuoHª¬ñêžÅ«]—.¯¹4?àþuZRš2YÓ¦Zva¾œ*”ìú7~ˆ„P© ©-Àý©â-óœ­ìx¤¥„¿ãTܦ¤÷ðÎßÓmÙg²×Ü\ŸrN"˜è}ØËŽ09x W1Íú‚¬¸¥ã(ÕÀE«“¸:üð1hƒÆ~6„›MjïR²ş¨:YÛ¹g‘§ë¼ËùõÒ¬ÞÅÄSB%°0¡î*Õœ"qñt±õû½yöIÓEv³Ç–’k•á°IïdÉ ØJ ]V¿d‰ÙíÉÏ7÷ìàñ•`(øG-=ü¤x0Ʀ~-—û%7ikAxOÛÜ¥‘ˆF,šr ðŠ$JÄΜlßìΧ¼ëÖׂÂÕF¼~S5V7¤˜“SÐüN,ƒÙj[KýÑÇÓï!­Á!IM3‰D“$¬Œ66ðŸ-ô´,xâQ:ÌêÓTBŸ†ÛÜ¥ RÑU¬äèwîdGàG†W¯3ÌCNôSy„Õ­HSD.y: ½_Ì_±e©/Qa%‡è¸P^·û–•fU.‰>e”~›Öò`õEíZÚaêÛ´6[›ôT(¦3áõ¤*ƒ–žîâþDHòÒè„Þ§1yìovgÀ»©©ØìFµÞF;SzYK*ÎÅ2É‘á’}¼æíËè@|mËVç ÞñÁìѨ5_þŽÀ«Ø»\…»kë2ñ×f®¯¤MFƒ­!ô(_Ñ…)´;L)´jôKñœ<µ}ˆ£b­BÞ Ia\‹ÐW¨¾» B©œf¦œdqxÛöd‰ðЂ†ujIypwn¢4õA„0ØîúZ øâ!%¾ˆ·^8‚Â+èî¯õÙá®o)À˜âgØs–yÜãE™Ž„&ŒÚý}ƹ€„XÑ‚xZº Öö)Œ[óñõ™JPÖ]Þô°7¸â &•µ“œ ÄÌÐå†E‡Ìë Æj07^Lß5vuC<£r©ZV¡ÚÊ´òy!´Iöx°ªÚüÐÏÏÈÌqHˆÇ&qÑ÷©žT ‡¥<Û˜Âç\“’þyqËœI|Ó­©ÇtæÃ/L›ŸŸ2±ó¡œ_ *GZ¹a¥lfn»#Üæ ^-æ¢uÈëæÑKŒÃ¾l˜e¡A›ÙsP|€\=ŸÚ¼£8™Ãjô¨F‡ïe•X dVø&ÕÇë¯2_M6‡ Òô:qPxÖÉ ÿXð€u£èæÂ©æÌÁš´ÿß5ØÊˆêN*¸TØSJf{=Trê˜nAQŽ„»wƹyêèË<Å7S§9É@vç[Gnßj_ws—ãÎFz뼊Ú¦ªbÞ<Û=¸ñï"Õs—è:pw½ä‘?s"ý5a[r¶œÑÊo#‘ íÏ*[>›ÜF—yÐÙ‹ªÞ'r=(ÅYB§ÝXµTK‘Åž;I \‡±¿\Zp¦µMœŸHt›O‰qš[ :]j¢‘Œú`‘ »MG¥Þé"ÿù³~õÒ–ÂôÝI„ !Á¢´^"Tå,<ݦsØâ#’C? }Ä´%Ž¢ "üúÒ«§íö/½òžOoƒüžt ôÕÌæEýÈ@ÌÊ;Šš,Þ«pfÊTFh?}môþ&5¤pÀ§ëÕò”é—ù„÷QìϤCÃ5A¹îk1›r÷)#. ÇäË€-4Û²‡Ú»‡…Hý*|x»šŸ@á—?ôXÁEoŸØÈ¦£ê›ñT}¿±*Cʵ´šKø´0»Hª„»ÓØzUJš×‰–ò>ÄôVȤΒõ» ‘ ı½Cé¢ùkRo”Í Æ¡¦ŸeDñpœÖI’Ä–n±òM/ž ÃJ‡…çQ”YdìÞ5Nª²àš¯Ò&¡o‚”$ vGé<ê]Q&·$„û>‚ÐÇPûèøc3qe³0\ t&£„`[¤2Šœ³¤`ÚÙ]Ep­ÔeŒvu*õ<}f²mù‚†_Ä 7Êóúö™a ¿bõ|ÝÐ,² ;mtJç)ÉëKÛ¸ò -9¿ÕŠ&ëаzd„ˆ%pêæ`ü]KÜ‚ ¹(¯xdÆ÷˜Š²=Ç"~9%„&êÚe*ÏàKÍѽrTg…æe3’Ÿíè‹5ŠóâìgBÇúÜq5†Ã Zj$²ú >¸]‹vâK7ü„’öÖ8jˆm²Èª†:U5oýÍŸyg”u‹ºÿ!’aÝWD1ËA¢]^úXÅÏ:Ï"ZlÐ…‰;Ñ3 Ù&ç‰âl ÎOÀ\K@©döþù_¦ôš‚šÊµø&Ûx,E¾TÆ« \sn¶âÉÿÿ"dà—žWL¸’íS6ÞK øÊ¥—”¨„vŒk k ù¸¿ØäuQVfp‹«”ÓŽL’eccˆ’ ³œgÇIEÒ#R³VÃ; ‘·öηžˆe; g²Rw®*Ó iòh¦•C8~ô–ªúÓ}Ôç«ãu«¡ÂTþðÀcþQT5_›78{`úlæUö“Ž{œÍEøŒ»1€÷ð̲ )ïŒÔs!#°÷ÀßwÚÎuˆåÉÄûaÈó‚l«Nð‰´GXUÑ'š‚š×~YõÔúúî€+¤¹6ÝÄ~¯×"Ï{˜)§a,{XŸÛð‹zCBͶõŒ*ç#< ´ÍC.shÉ(,(ý‚÷Œi ™H@¤¥ ™h²@ýQkOKÎÓdâ±$1׿thùKsϨQ”¸Y… ‚ 館óƒÃ‰ue‰ªÕ`7n æÎtVwUÛ/3¯LAו O/Ô|¸¾^2¼E9TcNróþ–;FžÀo?¸g–GoŒ¢û ³‹@éǤvÚ7¿ÛäFÊN\"ô¡Ý’S5çÇ7Tœ>qOÎȳëÆ{‚—à\j³å­ÀÂjÍ #?§4­ÿ‚`¼€ŽÒæ ÅI—HØ f—‚Ž•ûÛà—¯²a×¥é·mâöù *Ÿ[ÿ„]µ0È»O6ULmY§lÿ…Ö›/“¼à´eI}ƒBŽðCÅÙ ƒš€×É̎Y¶6^2eüá9Ït›¤vkT–Þ,^Ä¥Ö yÊà iÕ›³tªªí,¼tŽÁ…½b…/Íÿ?¢]7޽SÃPüüö ß¼xœ?ÖäÆ!$qvÚw"õß¶»Ã±àÃ}Æ8µ²„m#âG½éý;ý ñ!JœZÏæ£â6ëýFr0€·YФ“{­{f²m8g_j澘‘‚,$‚¼›}R×ü'Ý¡*g¼ÜS=?åðf{F„²änå\Š þ)IpƒŸó ¹aê€Í<Öm§Øô9p1Рªv¹4aIágo—gu-ÌZ€ÚÔÞþæÀ×üÇ'èDÀwˆÄË_Wí…u,kmöÙ'ñ$jÓÍ?T~ÁÁü@q€_щVà Ûr^m®÷D¡6öñS ô:÷±ÎÁZ¥–Çr»F΂ׇ •»^?hö,yí¡ÀAºÈÀȶ­“èeEçžù&ݯgw›wWõ‡»ï4¿ÒDðk—œÃˆ1×uE=ëçºÚ“Tõ^~n{gá7yüzûß×á*½bûl³ Z–³‚=°1Ñm{þÉ„Yã—}“´ä¹¬9cbØ&!\×»=3;)ÀZÆKÜ÷ÕÊìÐâ=_ZdÒÐ ·'*µ2õª³âÕ'iµsªÏ÷O|Ô{­8ÃŒŸ}§Ñी7Ãr“Uî–o¶?€IûLúÂãŠêYΓ‹‹H ÃJ/?¬/Îú„?Áft”/ɤ¯{z‰± þ†D-Ÿ×ß©'·ŒœP, |ddlØ`fôXÿn²‹J°ÁÚÞ y}1£ÉPv)÷Š2 ¯«ÿ.®"éfÊ2DlFR˜mZŸ!Uß0xgLÜgÊ/uWM'¯ØhÀ”Žšw½9äkÚƒÇãvÁŠ»¨AªoÙéÊgÐ@à ­k»ÿ7šAÛléAÏivãžÖ&5¤bUë™x4^hþÁ£ùËìáØYI,Ž·ƒË¦Öx0‡Ž4ØYœ¤°XœéÇœ `ÃNh®€×£mÑ'ÊãõïF–ÜÏИÔ. npÁh£WŽqò…ÛOXvº’xÿ”¥ìr¥±@4õ3b×ÔÛ_Px>u• 'TacÝU~)ÅI­µ>-*é€7~ðSüSÃè4D¤{>ŽpšEHj¼äÇèR@ÑÏÌë9¦ôiÍ£ýʼƒÇ à¤à³hí.Ï‘vÂC¨ œçfUn IŸegm±¾¿˜Æ€<}wºä½î§äz±\l©Žþ†iϨ’SZ½P(GŠÙq’ïú¢õT˼)‡¨r&ã‰G®ùй+" $àµð “úê#²yo1ŠkZIUÑÖ»AN*eOûùý8YDRÌÄìRbMÛsCRw²‘³iÕ ŸŠò5†ª%µu@½»Zƒ)X’aíñ ÌɉהCYS⬼DŒ2sèæšæŠÄîç¶$LŸ§üÂ]½¼ú¬X°€<ì‚^G/hMbÉk t ê"*?”H€Å×(w'¾LHãÚCgDN‰Ópëؙ’ïÓ-¸J¸ ­ é°”¡Ptá?gùülÇJc®(oýN°MGišû¿o¦”Ùƒ)aÈÃÊçY™Mw4‹WéûŠ]@l(˜±&Ônà¬ÑÐОC/:yÅð6)éø¢ÂIócåE‡ ÁlÈlÇî1sá㘎À± LUxgâÄ»Njÿ‰<¬GªÑÍ÷%Þu#·%>ÙKÒ¸7'wíAœ3ÂàŽ‘©Á¡A—[ô%ú¿\E˜KþYœb*Ïznà m]›åm8Ðs,R¿0–WíÈ[¸Õ^8A3,'«ÐM¨: ÖÂ4Û/e3³O‡ô5c •ŸJþSȆzW1váû49)ññÑ}¥ Lóeþ쎱pNh£ˆ€IF‰‚åáè®)5ÈÆÑ´¼}—òæLË-#œ¶37”Ý h/•úv2°8ØÄ Fg¼X¤¸Už¦ˆå›"î'i2Ù&Bk­w+µ=Yu'oc9š6ŽÎ°>TŸÉ—¾fFÔ?³° ä{G1ëï¦Ûbå+7(Pp8+3ö]"3Gº†TºÄQ• 6uj§ä?|5ˆM9*sÅð—Ç)…Q…ÞgIø™²ÿ×r?nµßñ£ "yÈ ×G©{*ïÓ!Ú›»ÚY¤®”àÄžF_¾J6«Ó÷iÌþ†$‡¦v  Ähp<Ñ.é)Þ-%òWå6ÖžoSÂøÁ*¢–õ&—‰4åÒüÙ"i1É' Fé_(;=2 åG½@v9ý¾ ¼¦P„¬Û—ëUÏ\úRí @ì¢|y$ÂøHÅM,ÜADSI$B"³'¤j^2Ɇ½ n1¢:ØccÛZ’ƒØ€¬é)¶à¡àj+mO]Ãæ+?é@u<âæø7Y«B:!j†Ýqëž«N,Ür4V}&O0*ÕɱH#³½qEdøc¹,ûÕA9ò€w«ÞÄds৸4Qì-´âãiùÁ4¶¹UIn„Õè’÷IßDÝ|ʰQô]'J«Þ¿üªG;ôÜT[DÙq»­¦¶±Ù³èì·«}©!ð~äà–'àƒ%®fTmï°’|5Ö·ªD%úå:k†Æb uÈö¬˜á™(ˆ?æ˜P™’§¢ºXXÁp0°V$ù½>s­ÀMöÉšo$œÜÖ—Qs+Ò¨\¯)†U 4%¬_ ³Æ¨8zªüì”?('‡Ü…OðËð)¶ÂÈZ½*·óˆÙoøÑ-Å’pß,ðîÎ4üÉ yá¯F1b¯à”*¬{ú|rRUgÛ$ã¹nIôˆÅKßxÅn CvL:^ÇtÚ#le+ ö‚Ùy½[ý[¯Õ N`_Upu·¹.L2I*`*ò‚£qG?ã÷èÕ‹‡öÅ>Ct‹PÑ{ɤ¤2²Ô„zQ x(¾ØËNÖ«üPߩجƒ0ºÁ£~é_ÍqÛ@áƒ5=æ5RæÞ?‡bÐ3ÀYW—FiH'î¤P®‘vzA: Ø¡Ã>¸luœëç—;këÜg©O×øèÆ6S8­rôj;g:7íÛ'ÿ£ÜTÙù æ[r–ž… -»Œ4‰Íî¶SÃæŒ[}£}V;ýg|þ€&žçT&Ykföéí"ƒŠ;c/c­î%ž66ÌÞ¥ãtŠE8R!µqW‰µã“Í¿þÎ#S ¹Û¤C¡9 úÔE¯Ú!lÀ\s 1Åfà“ ‰ð ‚U5BË|kæ67½8²‹‚ÊÂÒ‚rk©’ÍÚßÄ3`H‚÷XÈÑÁ6íyöM$߃âs {½w{©SðJ‰Œ·Ð4'tÄÝäAT˜×AiÇ”!ŽŸ üáìÙF L‹‘ßã¢Ç ]uËŒQ½§< ä™äLÿWŸ b‹Ã±}‡Çl¢þ›Ê÷>Ä3'„¿%ñÇc Îä[ L!ÔÿøIÝ‹™÷-RBœ‘^=H£ã[ªÅ²É]¼oYL2µ(³Ì«!k 2ýx“Í:øÔª(Þí‡]X{º£Á(lˆ+îC íÞ¬@IœQ>OöR´9¼½IKYç‡Ù k±‰é*W¡]G3Ç·\Bí±A | ޿hm½¼™&žnN·Ĉ¤õ$Ò͹ÿè›~˜>~Ám‰*^Ù eŸOÐÕÛ´¯v§2 ë+;m¦$ hœe^þ+Vްæ"§L¤R7HËÌU㋈óY¡r¥@¼h03ŸÄf;OS€Q,¹ëøbò÷®¹ã<ßô¤öoc|‡¶tÆB‚Ý)GHÛt9VäãË%:­eC}ÜïXrï~‚¸ >Ű}-Ëö* "ëɺ$iæËšŒÜ0Å8N§ÉƒJ‰Óޱmÿ°Zb"‘§˜+Îå²)Y®©çâöâ^X •úGe€ŠmÉg±ËUB[ÊžM !Éknw%Í´¸æŸÿÛH‚œ™ô&ü%>¯ÿ7«û­*hÒx¯°¿Æhá-ÅœÞ)2”ãƒÃìj[—-4]ëÀ²8Q@]Ò„^ °ÿ™8Xžƒ[@{XÚø~J N¤”]í$095Å`xï±yFlêþTò2¤qi†´Nÿ¬såz÷¹ ü–Âdüvg->Ô0íÈ‘ ¬ñ6*Å•b‚Ü#Añùª!\2ž3C,‰+€ØŠ¶•ûpƒxmò )CJÉG&(`1ì|îü·X~;ÁÖΜÂbpÃ0• Ûð¡NÆ•• “$Tpí©.“¡Ð㊋ÀS2ÑDsT#ýE9b¬KtŒ¶U\ŒöWy‚Mïy²¾’ÁÈœ1o™:ªzž§èÔên9nuPßæFìg-nUHÅýÝß0[îÖ…«GÉЯM ŽÛÇbé±Û»Ò„~ÑiѽZ ¨B j]êMËÊP0a©Š&éì/ä„NI`b4v-Ÿ¾#ÃG2Ù¿†KøÏ&wߺªÉÍØ0X)çØñpU!òÛ40ÄOõc?=*wx敟IE ›&¸-Ncšl €ñá_oË9’Àô£$/LFNËce2ÐÊ=Ô#ÀÏXØè2 çÈ)*™°õ6Ëþ‘W‡ò´!Mnææ;Ÿ`\v]´µ‚5IP›ê`dQsÀ S:ŽJÉ2µcVõÂö©ŒF·î:ÕÁ2¿È i°ËQ‹êÚ»:D3QeßÁ\ý À¶¨ÓUܤÑŸçW•‰sz4IÜGÆ>$‚ˆàùÎü£j5&ë­&/G¿Ö¼<—j&óx%ºåy>Ú£^âë:‚0[P[k`ÈÖ¯¬3»Jßæbö«…gØn™c„¸»+Ù/ƒKèúêþl±h?(çø¥Õé‰!³Üý솆ƽœ)[»“ ÷ –‹"+œú›E:kor1¢%Àûît±`þñÚCUõòñgÕYtBƒ¶Ð”Š®"nVŠ?n¶f†…N©nh¶36ŠŽ7b\o¸:tãÓ1¯Ïv·_“¸ ,¸ã3®ß<7A8ñoxÌé«9cíWÀVQ^’»Í[€\¡êŽW¾·©™ª»R üoRu#ëøg‰Â!r~‚ð({²þžbÆo… öóOO’Š}Ç"w=vp9‘"ë^²Ã}š#G›yfŸ6 * =ù»vo]Âw1* ©ŽQ µE'†d¸÷@üaçEßÞ,¹@ëåÑcn­Ró &ÎKunþ$¸ {áHB *'Ùkƒæfi³Îwð!A`¸Õ¹9Në_ PÆÅ¢¹(¦·z‹ KßÛonš¦¬kR>}nñœW'µ‹}è'“ä YÊèÏÉW9]C(\ÀË/ú “†ü‘if;D…œŽM‡Lëg䯉!hä<°3.¦v9#–Þ+H°+ÕÞëWLI£¶ûÎݸc’:RaÚCÊ/äŽsD•+*V‹yU¸ÇB™J&”7UyÀ¨ÒÚÜÁ&z1\tO߇¼ÛàÖÕLõ;ª5]Þ\S ç ô0‹†A½fµÖ¶U¦,_N î6|“EîÌ–luŒÎ:;kËHbð3r$^t ç3 Ï ãRßí¾‚Z«YŸ~ÌÎjn”×,P)G8¨;×@ظždCWZ‰Ç‹çŸÅó•qV{UZ ®Ckï¶O"+ÃËCOýU±Î«yíéÊ÷&fÉõs¨Ò§B»¢…Vþx^_‘~àU`U¤OæÝÑóv|r…V Î/ò{(gr‡Dùsó‚ݶÆtÇœ ó߯eéP¨JjsP€°Ž <8Ç’žŽëx½ÍçÉ–¥oIL7 é+=¦Š`9G ÇR¶‘³Ýga—8ï%Ÿw–¤\Þ’xRu’]hT4YMº¬±ä ï-êœ'*1.úçlÍÁS™—ÉLg‘OÓ丳àð]‚àòvmBÉì|¼—Ȥ±åUŸ5øè2ì¿:WD71ŒÀæYz{9ëže³N,Œ%J),;»Þ†« €}ëç%.Ùö]-«ájCœ•Õ´Ø× ¤‹‹{ §üœðâ<‹•0†g^GP+,cYN…i†À!æÞòàeIYkùvé7’hF0~Û­ƒztå5tb¸™ÔýÊæ‚ÍóÒÒö’Ë/]aIß½„(ëp+Cb ×{˜ñàØYª*Ýë¶Ñþ\`Mã9xŽR­O&ì* !™H¸¡+YÉVÎî/)C¨˜ëcÜíÖøØ5¸ü5A?ÞL¦ã{&³çdÓ_#¯‘]ׄX¿¿³Sä>XÑP NÖ,xÓ_pØ&וë £ò÷ Ì=·\áŒ\à†ÖŸ¹Øë–´òÐêÒò?èÁ¦»oèƒ&.‚KvwSÊ© ·@4»8Ö×K™j1„.Oìx'QÊE׋»N‡@á vHÃý·É,¼ûEìqŽŽYP­.6q£SžÅ ÎåýŽ×ìáßÄ¢Ç#â³²0…J)ï?¼o3Kçp颎w£Ìû“åÝê‹ê3Ô„'ªQ™ÖüS ŸíÉY‰‚™ísÂ,½§(§|ñ¦<^«¹X×Û¸Æ\û8‡¹ÚUò’kQÕ% ̺'(LêÙ*ɺ¨É~ Êá±»àUÌ+_®+€ìŸwå†d¯©¥{(?o´åÅù^þáe¾ª™<ÅT¾«'ùúJl\]ÆËF¹nbVÜ‘Æ6³÷\tÊ©FÙüñði÷U@â{j_ ¸©KæÛ/ð8–vqóñ¤ @3É/*(HsúGœ¾¦óëks·Öæ¬9ÎŽ»çxû“ö6Ê—•޲дs}• ¶<˜žÜ›¿ov„‘ªÀB»æ²ÉRd8JÓùwžy.í=©õG¤8B—&&té§w9¿‚€’6~·ÜÕ“”5Xó‘DÊDðÍFæ îNVVü¢fhbÖóìéɯå!<{ÀêêAv%ëbÈF’¢M.¿¼lŠ„X<íµvKáÚ‰îÑ^úóOÝvØ›/×ÁYØŽW’ïGxoòlH¤„Àæ¢/PÙA¶™Êé#ëªóóºM mîJûAž¬y%¢½ˆïóÒçé:ABŸ Î3hòïþA/õã¥&økE¡çƒ@¾ó! yg§Âv=Äþ|Í&M¢áÿLòB9|ƪù ˜Š|9î—ÂJ/öh‚j»ú[ÄšÐnªSéïÍ“Ød¦çÍÅOÉ(F´ýjÔ…HÞa]s±5ß“R¼ÅHyYÙ9á³HêŠÛl'” ëg .[oï7b õ¹D‰Ùµ…ÂKRu)†G±0;WíG1óíÒa­µbÝÚûCcw=õäWqí]Sþj¨êçI±·q²Íar©À9ÒW„xwWƒ~Òµ,6€ÙØãjûe ±ÞÙ¥3%®Ÿ¤ÖÃèŽýë ¬lÒL«#~Tp„5TÛûO‹d8¼l4¶‰&Tø@*š%aJ,B¤•†]ŠrVX<›f6[—„Hö¾—Ë^KBfp—%xazÔìÉlhQX›:j•ʽæ rA·f%ÀÖvJÛ[H0MÖ`ïš¼dzÏË©\XÕ¦†½Ð=Á«?öÈâcoÏååCÀCŒ p “‹lÉ£›¢6ÿ*Ýë=z ß‹3ûyÙŠâëúÅ–™åh¡³SêSG£ C?H-v\x:Õ€÷·³’Ÿ‰Ý¿Gà+¼ùÀþ´©„§`Ó,¨2Bd«¶˜Ì¤gPÑkz™Wž¾¾Ì  ¦$ ù{Í£œ5ê~’Ú‚gÌ%*°¥í†É°Ÿ¯Žâ{™Þ•ÌÀôSHܳÀ½PÀ—Ö3F=•N±£žDÛªøÉ5þ»œÍûÙO[Ýà.=†9˜]xšš4Y#POzÌ)k‹$BÙÜËL‹ìêt@ØNÙìhtç°gÝië*­ þz]É¿æq#–'"$²7XIÂzT>­jù”+ºÊ'¥&0 8·Ì{×î†Ñ¡×bV˜áEŽÕè*ní1fQ}qøydSÇ>©ÿqû±Ð¹ŒŠq­Ý;müˆÅôy{DÀ BÁ–˜ÑNýóÁœJdï™Ùö‡¼TD|ò=)—s'íX‘¾ôÝÐHŸ’Tæs‡Ý ö twq¨¸ªäEз5dÃûÁFÌcœqŲïT $Й¸TÖO6ßW rò<í¤Á±8¯l/Pp-–érâzÊËXzŸï5F%õTlZ ¢>N¬oÊ’ÐV÷~ÜʪRu—yÙ ÅÜÁ ˆ¤ÃñVw¹þ&sÅ×|DB[œp#2€Ž¢y”$pi—>s ÖÉ×ÿXÂ/­-áå4'µ­*{|ÑU%Uà/S÷6Fâ8£Âî*M¤zмTU¥ç€PÅÑ8ʶW÷R´×2>õSômE}6“¶ F…OÈíÁß*òðöl$¸;f¦^P¼×á ;º×2kSµ*;b‡%ö'ÀoI‘”SÞ¬‰¡±—Wõ'°õ^ÄÍ#SêW>¯Gœè)ô?ŠfëZ¿3°¦¡ü±¸"m8žÅ0^a¾Âî b”¸ö}€?GðQRäLó'ÿUPuºá*ÅýÈZ)ezÝë=±W•%e@×EdE¾¼ø1½«0·`oJÕA4F _°ÑüR¡ æzÉ®;À'ML^Ú¼*Zt=·{*À¢¾0‹/黣o7ÃKqPoéåÆÝi å|}dÑfØj·&`ÂX„Õ5Ûb !ʸ|{}, E)â6þq­]iY¤ö_2IóÕo+7â¸gÔÐ@’¸ÇH£ïA¦¸z¿/M€;a”¶x2-fšÕ:ƒŠ®\Fm8„*ÖÛÚÏäfD‡JÔ B’øGm\-”ÇG¾Ò»ôšFLÒ”“¢ÃÃaÐV&7~ã5÷„š–Ø"Wk¶Fw½Ëêú>êWÁ¾Ëi¥Âo![\O-¬R 4̵÷a]h³û®‘‹Ðȹq†”ÒŸÉÁÍ[i°¥œieâU…fÈÁ–GPÿ~†s”î.(ŒcS·LQ ­ÇE¶K¥£‰%¢Z¼úæË±HƒÉmìø›wÍyCt4åcµ»¯ý¡ÜÍëžÎRY‘ŽÂCz3·.2½Þ´æv”¶t œ±ÓX5>Q|ÒÏÝYæ€Aú*¨Gº 59\Ÿ4:èŒ\þ¡úºA ݘ¨Dh þ¼šCåÂ>Õ3;\-Ôº' }ìeéœ%ª šžN€Câo=Ö JàÞ8dʉ›m[ÃÕœJÉ•\5œœ=½ÞĶ nôÀPÁõ=® i;F1X¸Òò‰Mò|—u˜ß~«’Œêü|ð9Ç´æ&ƒÉÙ™)°SÏí ¢âþ^qÀK ùÆæŒ[­êè˺K×|¾Öa7åÓ›ª€$þ]€ÕùäOX„ýN[»ÑO\Þ“{H6â,)—–ÀUzuž8sÚ<‚A{t›[¢Bפµ¼;*"qQÒ.SŽÐwGô›çðåȸi*þÞ¥³Ä^yGUxW¡o\ ¥[ºŽnìǽCÕP²]@»¾p<Ó—6Á›|K¨£ÁÅ.8ƒØs@DÝHõWÓÌÞF!KÿÏ ÅrÏ~ùtIú1Ìáçõ•ÈDŸPŸTÅØº=0ª8O:J²wÔ‘0Põ¦aÏé»à>`€Ýᨌ—´ó£Õ ÿjŸž.=Uº—ÔÞ»r‚p¥‰ŸI‚Sà‘ñÌ‹F¼Þ!fÚøcÏWÚpãF·À°¶ƒM0sò‹nÝ8¬W„æ,ðŸJiË9Z,ŒYǪÜ’h05ò¿@K¹ú?vý}ˆ?œ¦ËQ¢jšÞG)^L<³Ý£à™zCîœ<ýn^á*œõÆç¢Š}r{ã]Å¿'‘l)€XÔónM/t0¬v¤èîpG¦¥*À¹¯ÖÙ«NAõ¡=G"¾Ç×.tÏAsÞ–,® ¹‡ C¨©±ÐU š¨çS&¤`«"¨¹ðBÒ%8` Èz+1Z©U³ÿ~oËKÝÚ6|áElKâ/&&zÇÄ>òûÍ „r.÷YÃ(µÔI7%£çØÈ‰¹P'÷N7ä™åµ/UéÖ&:Ze×Wv6Ëu/´t)¸L²y´˜!ì€Æº3¾{C3)¿ðÇõ­Æþi2,7÷—¯Ìü»ÇGºÖ£’©_ÒŠQzÊÿt^¸âF²‘Ë×–e››𾡽kÊøwÂY}XT(çéxÍli¶Öbæ©¢ëÎGY¹-gªBTŽ5ƒÜhšGào¸ÆâKqØVÚÝ1vl"-uIÁÝj˜hôvÃñ¸3x¡±“ÍÍS%p³ÐçÃá.}Ê6 <5ʃŽK)Ñhì‡B‡ŒMùëšs_Wì%D’RwmhÿÖÚß…ýþF\ç*ìtaüûˆ|bóŠrS£j¸—“'§8{h@èé¿6oýo[Étß¼5y-nm,-µÈo¡”%à…ß,¨Ô·i‚xê$´hŸ«ÇKT¼qÄŽ*`ðªìšZ˜Ò»x)ÊOn_ì @÷”‚¼ ˆ‡J¾Da‚ê8KÒ@¯,s¤Vç /ªæ„Æ8|»¿ |BOJ°É ŽÃBÞç™|UÙW˜QY౟6†V_¬w0°ƒbˆp=áÚQägKÀiÌc]ŸJÒ‚/ÿ…!îÓËs³:¤9Ô£U÷ö7„£A¿õãªÇæŒcò®›âMWJÐG E‘Ÿîî:ìB„wP£ú×H—+|5Î|Qû¹JcÙ1Þ8©EÝäC%ÈB tÔlL˜ú¬I‹‰è‡ŸÚËžÝ/Œ…¦÷su'^mÛKä}Ï‘[‘äZ l˜™¼UIxÈ7Ÿã‚1Ueí€eJóÅ q‘[PÆ’h²V…ÆÙõ®KÐé n‰›Œt>‹¯øâ±ZC°µiw”&6 ¼ãYΗ¦¬Ž ëmiiv‹3±1;Uša´ù+ Ñ`#°<&`4Baÿ=Áoh’ʼn¸]-î ϪB.Û±ÇtÇt×…ÇYg’Òð;åsÿ¬U(úe¯ô°¡§V® E:×”6(aÊ!à ¼l¦b¡ÔY]õ)±dò°šo‰xâ>&/[2|´rÎfseÒ$Æ^_ƒð½³y¢xÃÜeÜ(hkµT,‘Ì‚© ýèå'Eõj2UóKƒ\Ç1±Õ·ÅŠK”êe«sM9v’@R¯‘5:Y—&Nˆ0ýT·³q°|L7b¦ÖkZ‚€F6Íbz²ñ÷ ¬0ìñý÷LNÊöüà+«d×®s¯Ucqh€~)¹äœ älçB&¢«£eòy`äE7±V¥Oçå ÍǺ ÜN…¼!ÕëžYcê ¤SOàºìcÑ:»`çRcæ…M÷†Î¶£=5§(oåžã òÐy»Ò^2®zW ý`3³šÍøÆ ¿ë½ F¼aåQÏŸœ Ɇ÷nYy’…¬ˆ¾ˆimÎvÃÔ´pÒ·"’L¾”³X÷×KœG@›'ŒáÌM˴Ͼ8%¡]á4;ÃmR©[½Ûù rk¬ ñúRý)£’ÍUX©:(­¬(’g`o^šð 0Õf÷䨥ùˆ&9¸ä §Ç#í8TûãÄëÊ?G×¢c*L¸)&Dö³û~Õ‚5Â;b CF׫A Q5£»s=ÿÙh |°t0ôF?pU±*.O‹5Š„ñ;á'/ÉÒ\ÿ¡Û§ZøÎ)ËâŠ\wuÌ¢D”ç©’9TÝÌŽÿ8AøPl|)홿m3›jké·È&P·-¢ª ‘µ J 2ý5°\ü}&™-ý(ˆm“œ@yéÔ¹å¢ÂÝ£žpàÄb³Z02*Ææ©R‚È{ÈÞ\ÙÛF?Š&fBWÒi÷->‰.ˆ•ªcC×Xß9UÄ?ˆÃ˜…™ÃXoeƒl—NfôÅó®Z&ˆ4ØYcŠÒÒÚÝ|!6ÇkùÑA$ä×%Ñ_¼w·˜Yªvû ð  -Ô&Á]ÕðñÖWh À-JâÙ‘1n„ŸU±{ÇLÆYoKæ=T,¤Î`´ÉÔ º8¦?ÿ³™YSìJ]@V‘G5 ­ìUù]qCö2Xv¹ƒÓ‹Ï©ûžÛ8ö‰\+„nM"ü£ýæcY¦¦óÙbïÊ(<@£vÈ4·ºûš¾$øÇ(ˆ8ôºÎóÑœ*—T{ƹ°†èc7ÛÈÌÂ4t÷_Q í5Îú¸Ûý.ýnRQ§hEˆ8w¢ó!¥RBÑNi®´%É©£¢ ú®YüK¿çÑõó»ŒÎš»»KÁ{¾»©_fø.ôûêöu5NOVÑi_ ›âÏg¸XÀ!è?g°qŠß¤Â [={ÉLåš$4ƒQ0™ªÒÛMOJäÇ?›.ŽÌ >ë8öùôC„…]Âo®îÀ bq6‚¸yZ.F2o4@êèË£;‚”‡èf+Ô°›°ÅX 1nQÞa…í‡à¢—ÙÈF v‰¸ÿ#¹ž‹ƒsTÒ{3xÿÊp¯Ïø( (æncy Mƒ$À'Yq”št²ˆ³¥HÁ þ&ïÏŠï.vR«"Dtø[xÆk{qŸ´‘Í—±ó"PʈjiIð›§ÍnÃØvx2½ZOö¡¹ ó¹3i\yôFÚEÞ“V˜`j  ¨×Ov'çDº¯Gв”}!euGW 6$É´]d>Ÿ€=ü_Û€b7ÆmQN‡ÄݸO…uÊaš<&ßu0.a) §ÿ ­iŽ©ˆ9 fù,윛’‚ê='¸+‚aÖ°Yº~0‹3[‡Ä¹â´šMÀQ‹+FüE°‡<œ=ŠÓ5xB<@¾Tpn• 6ä^kŠ‚ï/ Þ.éö­EøV‘ŵÌ*H*“ 0ðÝã€ßÖ·-sí Ë‹°R›Sèºcs@´\àüñÐp¬ : $Èߟ£>à#‡Ë‹@Õ[÷0²Ÿ·×'Î(`Ç:}û=É­àš$š·ÐÑwÉPo÷>6“¡îâû†ÆLùKÝ0AËí.|TØÑ8ÂÝ”2‰ÑÌk‚ŸqS„Šžpgl‹4ÊÔ –o.x”AczŒÕ^a,SøÄöí"ó¢ï·¬óL”FQš ƒîvâÔ¨Ž‘Š•sý›mÿ¸ø5.7£àâÚ*/ß`ù€txCpÓf~.´±i}ÉÏœ ’#g´£'x¹óx¥:\×Mä§0é¬9´|wýé2¸$Ñ€i·;ÔhÈÆY(ÚÖÊ*Œ¡]húDÕ(7êG™¶¤ÖcJ8@ãCAZ)°,Öš no"Ê+}ß ¥nò²ð3‰ ÷¸FZŸªçã9:Àÿà˜ ç{`š@DR›«¶Á-¼ò.Í·âuýØÒ¦QÕ66"îôäL‚H# žM˜ÃÀPô.pB/3¶o©3£· €KnWg_Ÿá$·bø‘êìA?öšqÿô嘹ÔWØÞî8qðt¶¯#ŠäpŠSfŠ Xžšgjx¨ÎkÒ|z’”¾v'5q¶˜¾ÙŸŇJT @ª4¼_ÃgåFÕoÉYnlOUC÷Û£’ö8°F'#[7]¬jPî2ã1H6‘X@¦¶yª?'çÖ„;…/ÿ[ÕTžY*Nu€TÞÔ~GOÜ€#ÑnÍG¡ó@v6wgKºw'Úö÷j‚lH[iõ7+o箆Ä#—Ç)8³ã';§”Š~ƒš÷M¤h3‰ç`Áè¡÷db–OÝ|Hæ'× Ó®º™êÕAÙ‡Ó¡°4žõÍðsªæ‰ò-_Þ7Ú¡–tó ½Ç9kß-˜‹¸¥QSD·|Î/8úd[ ¤ÑгÉðàËå_QÞ‚ ÿñ ‚u8úkQ›†Å}o»A/BzÜ~<{6ˆ·k*™ÉJY•ìÍ&÷~‚yhäd·çôcôšÄ\¾²$u€fî&#dê’Ñ܇®kB›ü™ãã°'jàÿäËå&®òËuý/8Kwî‹þKY;Z-†‡[’8ü~kû™oZqýÉé˜÷ˆ ôØ“o€0£à´šéÌwƒ!ägSÁ†•Ò¥” nöy2öņ̃🪫ºHaû{r¾d-ù§ëë19®è{åµú˜²]hWOEÓ¹!22k¡Ó#{ùª¤n²¬eaS¤J£ä¸ï0—¼&9û´¡0™;£Â!2;@ËR˜òezÔaøÙ}'` a{Ó %ÆËO«´Œ‚‡´ äI²F<0a*i5ÿ v4ÚC†<&6H.Z>~˜ óšyTûLÀ'÷ör¡«„M¯ßXý«0’ß`¾¶·<~—·#q…tÜŃQ€Òßòf 7W-©w‡ÑŸ|àÂ@ì}a,ð¤&S¹7 ·[Iøä?¦ÜEF­†å®ó½GˆÚ8‡A×KÖðñZ)C^÷(~hÅ*çúød–’Ê@ÕkÁèªË߉p„Dʼn˜6ß®ÃÄfÃÛÇÒ\z¶›è¹¼¤äþÝÿîW]ì ¡L-S{°êU–gòÊBƒÄ€+”L¦’ÄhEWI8ˆVU ¶$5Jp)ñ„U£\!"it|ïòŸBñŠ0“þÇ\¾ªM©÷\À,ŽC>‚#陜ÕoÍÊSK™aÐp8{Yè ÚÅë{ÙÌ0vèlxÅMÁ.öj˜Ï––×DuLÑGÙÎxvÇͤx Å1zÇ´†‚ò¹oö¯Ùe;rä|;¦…&í¿‚'Äv™:n7kSlŽn]LjQ“ ÍQ¤1¾w’JG6FÎÍùºÕÊó'Ò4ž.*>uaÜF=E4 Éâÿk'1Ša)w}H`fÊ<îV/—KKÓv^1Ø:àÂý@µ­îδþÍŸI¥?ͼ’¢ò¦Õ17uvX>CFm¦÷ 2ÔŒXÕÛþâÓM#8ûFÂeÍÕÛØ2o-õ`b“ø“Rõ}JÍFJ>ØSJÝIîŽÚòôغûó½µHq`ÿ–Q|ÔÙ¾h ×¦<a”êwó–µ×P˜ÅY+T\©±“6)°xýE*‡Å‚üÆŒy…DÙ%vÍc@‰ƒ{®yW6ÑW*}lë½Ö·ÃÓšjs+Ù~µ“»4œtÏp4ü I&i¾)§*˜6œÉõ@#×!Æ-tî§YÝ/Ÿ—4u2)¾øÝ¿ä¢ÂÉ_»ÉK*t¨™gE„¦X¼€e¢±FH?¦3±{Ю¢2X8’Öà’€KnÇ^fƒö+†'8ÎþC0´¡§Ú’£‘}†ýX÷#¦o°7ˆ±ï,EØt¥v¿‰ÕËnG·v1Ï«Êù:¸†NóŠFeöP=}-¿ŽÄSye´]zñÈ\“-³\c¨‘h‡[±ÞüEg&pŠ7Ÿ±QÝ Q§€·&Iúý²Ã¢@”->‚.ºb¸&Èl¥ëvDSL¥§­'!·É]ÔK~˜Å†ŒÃ'åçbîÉ Ä§–,E€ˆ3·L`“ÔM.uItq þ¾A`äLäˆÀíÆûá@¼WþTg^fœ;Wžs¥:j ²IõtÞÈÂaüþ)bapûnœä{1$„x%x¼@Q­ï9Òæ)‘ãXÿý»i÷·ÔS6¤è·èí.ÎŽØ¡ÙÆ¸DE¨idíN)U&¾–ö°ã4]¼6µ±­½¯cÂêcÓ"4O¬ó|+^î1¥¡ge{“?Míºã‹µ\Ãü#ä>½2…%3ðA &_¥ûŠœÀ®9zI:Ñà`„c¶¹I#°‹èKJoS ðϱQé_ÈQ16%ÇÍÕ{†=wÚîÏ2_®¸C´Læ›f¿!·PÇBÍLÐÊ´1ì–Z¥/ .ÁŸlõ0 6ŸX[׫CkÁºcFûCü#>]¥¸âù҅ʼneÿŸîɧFÈ»f»{{˜|?ð¸)´eí®ñÅs¤’Ù3NýÆv¦ÇÖOtní]ÉšÒE#3x‰ç¥÷Ò…1Â䤒ül :ÿ»€3±Ä|G÷Ï6•¡2~R쉶DÌÉÙzc¡ó‰Jd͸~mIÝs.ÍöxþÛ¾³ýžšµõŽ“vÓDµøH \¿x}¾Öõ WP#mçêÜR@N¹Âz(2Ñ ”˜K|"γ:è› KW}ÉãskΧ8¥,´S–héÞ þÍX øhºd1>vÕR ý,ZQûì {u•X-„åÆ|Âñ²6Ï«` ›6‘8»ÌD’…¯2M‚aÁÕâQú_XÝ¢«Àß “Ü(8[Ç}Ã%“l°.0`_…+r…SEE΋ãnh±ÚƒÊ9‰8¿ïÓ«kwÍ-ÚI7”c@Á^DnÜ–(I wûÃë ãOª‹˜¸ässeõmÙ>µ 5–„i¨¢ÎЉ©Íl©LË„áø¿?¬È²–Ëš²È>nêvJˆr—Ê”¼º Åäßvü-rÓnYUx.¸˜Äã¤É´4(¦¶dÅ¢ÿÚf©-(=uÅq“V2ý½Ñf89:,ëÒ±Q—,ØD@u@o‡,—8ÞÍu›vÏJC(¥ì²qHˆ*sMTqsø÷Z_ðO“ùA+—³ IH^Y„ß‹êÌÌd2÷kÍÞ·¶T¨®0ü|<ŠzX›šú]²Ÿ€KhOƒð%<Û¹í[¯¸Ü] ´T8SXÕÇÂÌjog ‡]¤wæX…À›r¤ KªKó"ÈÏ/Ed¾VKÓy)ŠP_¢éFlyþ’š§–q»ìX9ý¸ì²g‰Ò0ÆèÝ̘k>©mCäµ8ïáAk¬¯½ƒM¡#Þw¶Šõ÷]+“¼n¼¸Rµ5t<âÔ¿'9Ak+²NŠ¥f"+ƒÏ—ò«k|!þ‡~1e¹Ž@Ü 7®†ËIGàô®m§Xd‡{ç£Ú6ܳg†l(…6h I&R~X éÁÁ€–cvP`ëjm$D{Ó]zx¦`õ @(¨î¥ó‰W­°÷:¤ÁáÖÑ7SïOÔ‚ ÆMùŒ;ú¤î/ÁAÒ©ešß‹'Û²¼F2ËðÀؼ€«m!ìç ŸÅ»J÷ýç¡j¬ŸòÌ#ï˹ÒJÙ5aOÆ0h^Ãjå·Èü-³ÿÂ^=6®¸@ßÛ·ãËØDã ŽÐóS,LŒ3/ñ¼]LEö¯Èb7„ÏÈ«²p†–ûºç¸a!äNÿviq¦Ç†µv®ˆ5—8Y†Ø–b«•HÀÀYÙòSw¨\PˆzêP4cK¨ª€èì¼V>ù|f×`/þÛæU€¦sÁéJ¨Gì~ù/uhª*K;ßÈS7ë jmRJ@•ômUàkpzÑâ.bô.ëÞ¸ …)¬ívƒË¿¤ }KžÓ>1ÌË/ÞáƒáÞêAÂnDë’JtH€MÉÚ5KA`¹‡¿ñï:‘ VnêžjRÐÎR@XaSîÊùt­«V[€à(Ý{l¿­qu;_"aUÑfˆè}ô«Fåƒíkò˜ÔçµLª‰ñ-ƨþTj¹Ðz¬§»Á‚¬ sÔí‡_Xº~zñ<²Ïx=‘€åÅœ”¥ë7„q0õ ?.b!2‘\™ôµ” Û'Œz­$* ´â/‘IXÁ0Ø=6?Gên~}Ö“Úê/­u7ѬLÁ ³ÔáÛ„[é–,½ä³¤VÅ r·¬’HºÏ8„›øØÔS}_Ä Øƒ†ùIJçîVHRj 2¥ªa-‘S«E-èýð’Fß{LÇCvMùÏØúŸ/s~Þ–!Ú¿l^5Ndš°`{U²”b=X¤˜ÄŸÙ Õ‘õ€õrñš%fp˜ª ^_ùÅâûª¦]Ë—ÂrdHÿYe:ùåó7Ymðö§T³y-…¥Ṵ¼æ®©ž8…–‡5‰D,EÆO€áe´EÚT„Û‰› ‹K) ÎvCõ»½ñ=[;¤a+n‹™Óg¤¾'j–†¿&ƒô‹‘w’•™#ú˜m?C(Îs±ì•ÉÌžd,ÞÓFÊD¢Ҫ→R -ª»¨¸â%»vùóIp<•Žs]Y—o×KtX¨‹ªÍMÞZŽ)«2‚[Œï·N§£õU÷eÅêï‡æI÷I;>s€ògEî ñhô™A)ÑC®~H†;.±¯»šÿšcþä ÄÇkA„i„QÀÀtܦY[õ÷ Ç ³ò$8æYX†]ò®22`Ã^0†ôniý¿Î\ñmîª7Ëû$2f/RÏo]?=q‰oöŸà§ËfÔu>;4°h®&·#-:ÉŒ–cc¿m¥™Ÿ «ÜM¡Ëzk¦ô*SqËY‹­í,x\WšËW™Ej©œc¯›¨>m¥a«YÕêÿ¨vhèI¦Çhó1mÝßá~^ú !Ǭ¢SÀ ¿6u…s^ ÃºD¡º¹?€–gnöñô¼)f[Ü.€‚Tê<À}qpˆžéò|(îTMý!%/ÇÃ0½Á_7L¬`^]eM£úHFoÀs¼§ßŠ)J¼5+bnÜ†Ú ÅDšå°S4^  Zîè ·û'–P‰lðš>S’s†ï­$:(ÍÀãUí†aæ>)‚ ¦Íû„a.xaþÒW£Šïž˜|Ò{¬ƒK‹h$+KŒÍ€õõÒog’¯Üï« ÇŠ -O9ã¢gÓ=ÞéíD­u"xúxpœ„_)–eÍ„[¤êgŸj=KÔʾ. QØN žÂyb¹ÏTªà_øýKPÙ˜¥K†ÏòK’ïlZÍ:ÜÝùÅÎW…‘»ƒ5Ûó~°¦Ë`ßés˜° Eô¡Í° /1ËþAÉþm s®ºo§ {}âv…ÝÈôæZðv¥À´ñ Ø —µÐ…aH€‡í¢`P5ø€…hØôRUþÑ^)îG`EŽãéý&£} vø*ÜÜ}î‘2Œ&èêuÕ}#U.®™¢]¹n†+¦Y|l†º¦ø^±¦ ½ÕN)-)Œí³ Ÿ%¶ãâb?³æ†¦¤’IÇ—­¦P“+=õ5ÝÓblÄ2 V+´?;žBd½äÖÙ$Ê~lø§^}ïû¡ÇÁhGæ´bË9Ê÷VÛwüŒósº[Lã¸!OÀí·)%ú“ v¦EùðF÷@%^ózIŠ–€Œóœê$æ•B‚¾Øün;cÍÿ.Ê‚oZ\±ñb¦ŽÖøæ,*ð»,RÌï¹ZYbYªÂÐmüøtëKVÏXlÅÛÅûSÓúïýåzù¢2o„#%¨ˆÒ·õ¯Ú  'ŸbŠG‰Ê2rF‹?Ë[MøS[Îêdž MÙ¼‹º&<˜ujm&–Ì%oà‚S4)¸ñ;"8ç™ãŸô Íývôr?ØåsM9}Å&3Ìs‘N•ÂÍ€²dêc_ÓzñUT- _º•Ï_ Ú.UupùÖ¯¹CWÂÒ$kɨxk“f»ø¹J®Ò‘a`‡úè5p  dMôy¢ÌþVÓ~ÝoÙ’~±©CXò,8ëÿª.¶åZÅ%˜-á^Pbb¸ §cQ` ÷½~ —öà™Q?~XE6Ïr‰afÚSÉì ÓCä¦kÀ‡–ô&‹ä^ =à…1H~.L|Í·ú@ÕqµÇ+ŸVܲßÏe÷’ÞRüV[ £<½ñ‹ø × æÙF'g “ÿ‡ºKn>¤ÍqÑÞ޽ϗY¯B:Æ?þº$]ë5IiÝÓ"/oé®»¢ ú:2ñ/°ÂL3ŸrˆŒµü8EË|B²/ÁݺêÜ_óõZUÕ"aäT^Ü¥’=‰6©o‰ÕLxŠ€0Ë‘Oq7ƒ…œL"¤zd‰jÁ­1:—;šf@]C1À_9Å혻8}­=·§É¶ú€œÈVì›'XnŒÝÈìaðjáÚ‚ÓˆDÉý’XSNj¿:A®ÿ¹³ØFY#Yþµ'æKxƒçvG¦|QÖ!zÙ¸ <Öâ+Ü%»`X"Q ºeøor^J*PÚH^R^9ìåT±º¯Üù-ÞÛÿý¦× ÝO$_dR:SãìîDR2ŒkÚÞ­Ø‹ î5ÊÕ1+ÐrU•âÿ[ÀÖ(ÚŸçù,6°`3¿§ku`UW‡8—˰6e ü®½#t"sóåx ,Ÿʼþsœ*ô ¶X[& >£âº§OREuVV‚ˆ¾ôÝÀú:@éþAUF€aÅS<ƒ*~›V¹ŠÔ…Gf®<í(þ]þ}³A¢õý²›~ìm$àîkº³B˜­ÝÒ,âäb¾¤bÀJNÁÊQg ;@:Ò4-ð%)¾lèwÁ,û/ê˜ÝÕÇïÏZáð=-%ÉjîÞYÓØâÿtÑ «GÝ–_Þ…´g9oQT¤:ï_'j[©Ï^ê&ÌŸ¿‹>©3lÆ2£”åF(0Ú´6;üÙDMµÙ´võa Ôt/¶Q^nþÀ>çÉ’:+"Ñð5}È:)×K’ꧺ¶¦ 4eæOGψí£›q#¾`£ûæ{ÿ*tön!àçiØìÃè6†mÿüÛa4ÆzHµÚ/Âm #w@¢Ÿðh¼©í _ªÍçùa³iºpÄ>›“b"ɸ$n©$YBãO\Ȉž<µnëÁÊ?ŒKO¦ÐçKð¿C:¿ÿ×u1K0ãÏÿôÊÑ)fR|¼rd¢>½RîúͺQògíp®òl.Ý7‰q6hði­I°ÅCsbÖYg©\÷†¯½X)Qhžê[bÇ$uP¬Ø„öø Vl„QÕ¹Ó£Tá¿HHØ¢ã3„ÊMPÆÎl…tT¹¼ˆÑédƒ|£´ j^Š¢†P¤Ubß·G=y£c£CÂÛðýšUæO³3uz¡¦ÜêÒ-¥s‚‘Ôi(¢‹9Ÿˆ†Ù ŠoLμðãœñãns¿ì}4Ä?LX„lPübü×Lˆ­z¸¼`Õð]79 Aû©D¬vœXÕ+$@8‘óQkeMW×`{;<ÒÊý:=mÜdÄË0°ûäŸ5À®©z.e§°óX=¢;ûé«3–ë×x¯{·öwç=#ŽN£Ÿ"·¾åvëw ¬AÐsIÄÂê`QÓƒÐlÅ]—øA¥×QlW’ o“x ¢ùLtÂÿYŠ„¥ˆ³BÇõa¥PEKŠ“:ü»Ô>¢,ħÖ¿+ñ^ZÁg°0fI3q謫fŽJ0,"¸Ëˆû‰¦óÇúKr¸3P Â1§Ãu*œs²|eܬ#Y•û ªbOS5Úê±ö{Ä^Bü1bs‚ŒºA+mgÝë&òSùÇœ¶;.þ¸–]ÁKÒ'¯KØöµ¼{ç á,hÙMKÏ”ƒÈÞñ¸;b6ìñ,DÐ_: æ2Y-hš@„¯¶A´GNõˆô3îONÄ Ä§Ç ®( #`ÎâMXÞõés'85^¯Ý~ÒfeZÈÆvb÷?}ªö#Ü#\lêÀ‘xŽ'£‚ˆâý-Ÿm°Ý"…–¶ö½‰Ö’¨)vð*¦€;¶¡ãuˆS¦q³ØÜ'ÁäRhVÀTÃÊÚ6ãÛ,HJ(¿UõAÉq4å{¨,öB¼p\‡ÑÈ/¨®GÂßÄƒÝØéùÌ@;q•b© 0Ù$1»-ï7È(øm[yw­ž_L‰ì~c9P®ÙBŠ*ÏÎ+ 0éªUÊ”˜Î.©~Ù9ë•Ñ(+: ´`*8´;âÄHNµe˜0£ê' ÍUæ¶6³RæÊÙ™wØ€K̯1÷ø="QYû©Ø÷3Ñ^FmU¤®);u•îN~Úìóo¢^Hâ»9Ýa.8/7Ì[0¦H_dM”ðÈÔÿ¤¬/ÓŸ S,§eÔ~. ÚEH B@§|8þ¨ ¥2¬ÃtZ¤`Ö'MaqTË¥¿Å¦ â_%êWáÌ2©æé ˆÛWX…‰Ó[Ã_vË9âI•C ÊuCnyyú}X¨h&3ƒ‹Ì ‚Ħʾûó{’—þøÏöÌÜL4zKJ^Aßðfuï¥St䊀›È=œðÞÅÄ«]OÏŸbÁGÄÉÈëL÷ƺAñ· h€Og¡UH3*ÂM¾[åDtåpÃQ®£ ÞóB7/p§èVu¯ï»â¢Â#OÙsUçïÙ’HÃ3dyˆÍi¹>É (ß)§»zïë•åXñƒc͇:jv=˜‹Ñ O¨ªš~ÙwŠýwgt°¼LÝÖx÷º vçœc!…5…&°}}+æX;‘¯–Ù5ãèÀΪ) 3û?7Ô±@PïèpÆþ”ÆøFóÊø’ ˜94:á€3Óþ1pÑt¥m…Èíe­6lÛQ ã_Õkëì4Sá_·qËií{ÄÖhm‡àoGzg_;ôq'.³¿` ¾HøTî ûŒnk6v§›ÝiŠ’ Õ‚¶mxpFBeS[B.ØF0“?.ôq´SmÇÖ®à…û$à¦þúC`‚ ,¶‚€’Zåa# Å•4º£Tj+k@û6Ë,Ü1¯ÒìÀLÝÙenØí=nZ(( 6¾]n$Òoà;wõ‹{Ë~ÍÆQÜžÝÞ«–Z ¤ÁßkŸ ”ó‹g05qË‘3<¾ç¼ñ&·+ï„lôÌ#|ÖÐ&h%èdºn¬yQ5†ý7?w%Å+HÔoWÙïž:Ÿ¸ŠD«<—¿¯J'0,âõéÇ^ËHí–\ò7Gðã›À¿™6Žª¿Ã²“ÛãjߥFèÈ7ЏÉ)%LyÅ|M ÐA’ 5ÄnÞ¼]­u¸„p À| ±¤âlÝ\ñóLösû§ÃÐé^ ` _2òp'1 Ô“ä[#XŒ5¢JSåÅEQÀ†Så–[Y.`#ö¨C†¯(Èd–iz«_ãÀJ|¥¼ðQâ×ùP('j ‚ûèty5 ¬¯[ñ%ù/sÄS@­¥§lêe–¥müÕig™{DZ)áãì¬ÒåùÙ?T±MΟóÀ/³…i릳~è‰Vå¢ßÑ:H¶@¥/!éõƒK«L½ L˜}²•Z°\<>†S~ÏûÕjÓÔ›­À!Œr`êoŠØ {ÏWR`!½]QâS<Òƒ8 "e2ù …+UÔ¹ÉØ `5z¾<0|ÆjŸ0maàÂÝ>ƒ‡3§^‰Å ŠojŠíÎ^Ÿ¹FØ€ۦÓi“;¨u-œ7ƒSË,+bõ…$¯–Lëíᤰôfœ‚Îë3¾‘;ŸµÁ¾;iEN— +kŸöÞ@útP!,úºbÛ¯˜;QP1>ˆ©õ±!«Kä» T†eRŸUÈ%Ú} îD\4al^ý Y¸‡gƒ¼Ã7«¤¿‚€[NíÄÅX·¾kiZÈ×<°ýY%Äuv>zžgŠŸÏO«b™æ¿‰ åËU}! ‚Vk‚»gx@ˆè>•ßTËD'½ bR z«Ád&öUïŸÃ6)¹)ÏÈcwÛ‚m8ÉÆð3¼«hcAw«Êt½TxÎIâ¦Ù ÈÄ6L<Â=Ê¢|§Ì%qÅUæ•”rm„Í€ÇFqeGˆ5ŒQÈdQäÉ>DˆwŠ`˜S—Ë=NŽÊ=e…{é<~bî¯P‚òsc٤ټ×Ohñ.õsƒõ-˶U­U¬C¬M…¾PÊoìw…} 4¦uÒátÌ‚µ A ’wðœCC+ÁdÄyîy¢ÔÂÁy»HEPwà‚~¥”oMïd”¡2g¿ç9å~Äȹ“&(ذ§„" ;¯t¨¡s§ÒS®µ1òlN”%ÉòƒÁLYNx1¿ó,_<’Ôæž“Ãr3,Àe6i™em{LI¨žUøãÔ?¿`/—ô›ØB¯g zéåÖª'’àqýÅ>Ü9š¼kß"kDÞ&ÄÓ’]ÄõÛ"~ÿï.VXÇ߯ˆä±•f1oK\úÆKK£D+\˜™Bþâ6‘gŸ±ì£ærcÆ\­FÜ[Š› ó_ŒCð6€=t3~Ž+ˆ¨²YiÌë­|5Úôù^$¥F)ë#”à\ŠX´1`¸ÛbS´T"Yp7àZöµNE䯂þ¨påAÑëFU£G„`±“4îq/˜Èa‚¨K÷¯°¸´ú˦ñº9#‘|.D±»ïŒ¯-»~Ù³V"WÀNÎÓ]ŽÀPŠ3liÞýWf)¡Pá/ÂX§fʆ$­Ô8ÅjÃJ`þ¦0òåŸÀ¿§UgבgqÞf­¸)«Q”k: ûåï%¿( #3~Gʼ|PÛÅ_\¸5§J®_ŸØŠMùÂj!زÉzÓÌáüƒõ›#Œ(5ûþ­y7³#ÿÿ ä;fóM[WxãdL{¾ÐÍŽz,¾ëÀdLù»•ðõJCL¢+18ò´T£IÍ[¨š×§‘·'/Òº™Rº0UsÇ—æÉi7Âù·;ÅÖ}OíC=Ï‘Õ]Þ>`è‹ëâå^8ð”™«ÏîÛ‚9ôÃ3Ã5·5<¬ºúKƒ‘$¥6+Oª1ä7N¯méMÞPJYD ãƒ@hÖËÙé˳zøY|gëÕlcøM:¦’D‡RêhG»×ð‰?èâô«üeO)‡|Þ£K#®ž>î]ò2Øì¿ILµ»­Ú@¥S߉êïðéù.Äóéw½,FùŽ ¥bØ5ÙèbIÏÖWEñÕԷ̯Í+€&ôlþÔ‡Ïë—å,Kšá%ÍO$Wà tG͋ڡ¬ã$Ì+2~ßk&»ðèkÃY#(ÇMÑŽÌ?¯øˆø•aXÛ¤çés*Qb¢åîràaÀ® „ÜÏà2/Hè•cÅŽÖCþb¼Ï í—1®{Ö¬(*€0uò°&!©‡«·ö»®ªúÛ²J¢ŸBd{é:€-UG‚žÝð>7,i,bùý.qüq¡Ú«}‘Oy†Nz2þ².fðˆVÈzå$‡Ý›³”ÂÃë2C¹ú妧0=e6 žr‚j"Ôˆ167GBŸçÕ@šÑº" …F²1¶…úõ2&*O壪Í6G•Çegá²nÌTÝ„sa'ª¢î»2±–l…ÈymH¦h•5<¿›L0?=üýÈÁ¤Rš—£òÐð9À@×;l"® †—ˆU|;Tm_“ü”8 ãÜv4"—¤”fŒÿ<î‚U¸íónÚÕQ—öe²Š@àÓæ“Ä©WkmzwHƒ2L@‘¬ªäQƒ@vÈBˆÆýBCHè”fÜ"|%ÇôŽ· Œ³£½tÊñŸt`ó‹6ž÷ÁqÀd–®³=(/Ë.l¸’<7ÏÅ‘ ¬Pô?ö¨ÛâõGD-íè'ˆÏnf/~‘Pà&÷ê6Mî¯H`AqZº[°Òo\IÙìW ̱B7Üs?΂zÀ·Ž+³%îV ’gjª;N±ÀNeFò «•UvÅœŒÞå2m—X¦![݆q9þ;¤`­{ÒÞ|¼«æ…änÞå¾¾§Q;ÅZ^äF–}'Êà,ûVÑäk飶ƒìâhâ>U´ƒ+ ¤Ã€uÕ˸f ß“\š–Û[+¤@4É©²²0¶ ÔÒ‡KÄe^•Óù‡2@A&wÀ¸V­Z¤ª½…°›šaY\Åõûð‰)éÂcÇ!Õ<Ø}@ë‚’ÒYËE‘w;Ÿu›„¶Îñ.r*Ålr¬¼0bõ}fØÃ™Ê-ªòœ8Z5¡LBiü ¸p*š[o# jÍü¢‰ó‚â}åXøûÃÉ_Ó³ƒMïx‰,)zß|„i¾‰W']En%‘3|ÙºJjæYÃY#[q?o1Wbe¿Óº‚i3 »W«Sî-Ó‰€Ú‰•#âbþ0IC•áìŸîù÷QÊFБЕµiUö¹%**¡BÅÐQLjWO9ï‚÷?UæÒUÞÞµ›Ò²ªpÕå¤Nøˆp¸òJûu屋^ç°H¨]º‹’±˜‚Cd5´ ¶écu¾ž‰ñ{â:c£çí=wC-4Õ-ùXë2¢å½¿]¦ÂÜþáÍœT MxvëŸû©Æw|4¬*oy8W¨óöó%»Xð$yÙ öœÔÍÓ0{5wÎM¾®AYK»+² q„ìÉEA_M‹µÇÞjN: ôøêż·jˆLÇ#&JÀPm¹.`r.iþ]#Þ^>‹{-*Kï„n›T™pž^4ÔÐÓebO”ü3Õ$ñ§Àµ_|Á9ÕQ$9¿nøýÞpé0öe~À(ÛÔ®ƒ?P# ð¼’.6Gìç$ï VÍe2 ”ùÑd¨ÿö·×¯zÃxXvÜ«¦æ]™r· ³–0<»|ˆË -¹Û±š(×Uù˜$Ý“ZÜZ””z2,Söd€Â–²f=¦¤c[¬_f.é —ÌlÇ+ÐIòZHõ|Û·‡1ÒýS`^èäØv;Æ%§ü[*WÁ&Tâ @W%?{ š×ßá`:AÖPr­ŒÙ5â(¯*Ä^~‰ˆœ´âüCð£Ê^„0X™þd®ÚIˆ{ALW¹ Ž¢YOµÞ&ÙŸ(åìªõübˆçßÉÛ˜Æ:qURs]J RúWÍ¿@LÅåê¾Mçüøœ hºË´’‘0’¼¸KTéq¼~>{ ƒ4 UØúj¾ò¥‰ur„E#z;7ã#Ç᫸玿¬ûm”ö »7úUÏY†€ô-Å~°ySNL{Ð3¤9ãÕ‚Ÿe%ŠáÃæ# +W7¦@¿«Öž¨¬¤âÿ‚4Ó@ áp¬¸•‡ÿ= +$íu@ˆÐ*•qu_WúÃ.¼JV¡±Æ-W—ø­ñƒ“*ÁòŒòvÞˆj³û¡€v}EgK„ß¾ÒÂ~EÏâšù#iÖÇ+€˜¬KFG°¼!³è§¬yr—{ûMŒ“„ÄÃÆzãÎ=&TÜ€‰›d€*C®“IaåÃå‹„8W.˜„1ë8¼Ùy™ï¥çyÝn† ¡moëlŠœú %u”–¬™YÂÁ»ø¼õMDЌӇ6ïOz$à™–)Ñ5Ý‚†¤HW¸>¦Çž¶´=T×÷¤û Ök>£’•ÐXŠ|(éJlYSˆã7`ZeKÃÏ­ð* Wþp7ÇaE=ëz3ÍÎxÄ6Q C»F–›¨Å€&ñÄiJP©6a›É‚hlÍ’óS"$K ®ýiþöˆvÞ»Þv¶H;iKöQĤ­T"1µÊáÈÚeÌ{)‹¹Ñ3ìvo:¬§çÆÁKxj¸d›'Í!Ě몕Pa‘D€ÕÈû«ÐCN?ÑÝãæu†ûsµl耦®C±î(m­¦þ6jñøV!†CrÍðw*ýº®Êg ¸ÞêÑëËIúêÊÇúògLùº³Åü×Âó oÝeü9'AÙƒbiÚpJû÷ÏzÞʧ—ÔÄ'KAÙI†šó¯Dfêñ“#øØ}U}eJŠ—ô9àBŠYµ ¨Í]ßõ8»å×cBÁÙd\á_‹3¶h£±WFælÍÕ>³ëÙE†U«Eä|{ âÁѾtìÐŽ.»údߤ~ƒ(pÁ­‹ðÞPTE«säúO‡I¡C ÐrO¿°ôGÌTh8Zû1öËŽå)"á€Ñ#ÆHô±‘§¾<• {,Ùh‰E¥”Ö*m•­¥>-¼^¡¶ÞÓ*;Ä”VwÈû·«MŠÄE§Ci&”zê^¾ÁäÕ.Ë,…ýåF—Ë•Žª‘&Î ¢ƒ U'XnÄePOû깄:37'ø Ž%›y''kd¼Þì h~œ£‰¶žš8 ëê<â¥gT©aÈô`hê3Q“ú6/£ œ\ÀÙé·b• Õ^£l…à?:=‰1.‡nó`=Ãt(I,®¸¤ðYŒ#0óåí¼‚ÂG8)ó7ì}¡Hß|çqÿ}„á‘J.91÷ù…[§—§t!8$ÜN†@ÇŒ*¯[§ýÞχ…ùCã•J©0Žž€ƒmŠÓOÇ\eM”̑Ể@mÒx”gúÏ„àHøÛ1NùÇêÛ¢/3ßéÈwoÁ±épåÇq;g«¹k~Dß9¦Êî Zý:·{׬؇ೆ.ö/?¬à !Y²–ü¾ÅQÈúÿ-ö Ø7Svü]ÞN˜q„_oœ7›b‰‘;p+‡Û±Ó÷äûœù”¤ªhç2-BÐæ’J:[V¥<®3Ïs$ 6ÙÜ{/å¤ð¨¥ú#wòöàõZ—šÌ²V) ÎØüH¸ÐfAÍâ‘HeÉÊá˜wyw ú ã÷cÝX¨.ðsø²WÔr¹wà2c‡pù[¬¡²§¹Ú°YNü#ú(!œÍy›œ}•<î-¤­ÈÕ ÇÆ¬Ÿ¡¦qÖ’„¬ê x~²I æ'7·3Ú’-Y LiµHN¶IôÌ ^zÍó®j¬ôKÿœ÷:¸O ßäV¦—‘j•Ö!¡ÎÐ6e¥³zj( šÁ.1™ŽàÁ¾Ùôi<ý¼®»s’‡‡o.'Ù¦$3Ô¡0;çq†@m": L`ÊâW^…¥…°¸Y0~þý @'&yç´Ý Ï¢…¢Zgû˜mFMÑAUÎ<ÊTóмAM åv¹5d†g\ãJêiõý-—?‹%L9¥Ï Ö»ÐbD¶}ÕÔ`\Ð;Ôï~!oÀjpâHaªxüj7Ì_MîbwÈ,ŽQ"äû Œì™ "5›’R€ áÿ7 +g(8´¾þ…o6çÝxÚûHµÈí¦Ýy§#ß,Á ‚TtÖ b¾³ˆŽ“ïˆ,7µê<ÝXPïnüúíkcÍ zv…lð¼átMH ²ðòÙAÓ ƒNЧ? ÐÈÃ-õÜÔ5ÞÍÌäK¸YïúäMè$A}k5C|æ”Gú †\¯v!{ƒÆEß6ÕêÑ­YØ?OFs³IâøŒÖ©ˆ¿&[é1/µ¥§§¬˜–ªò^òã{0£Ä-õdw‡wåćGW5²jG‚êoÁ¿­T§1e`P(™ˆ9§ÛJ%‡Eà»ßsMÂÃÕÞý£FP~1ð/ˆFù§X&& wtÒÿy0/è·wí5l`³Uš-éEÝ“yzk‚úú± N*©7Š4Ôdô=j'Ü]îï‚w ´š-£âéç*ÕVÐ[^Êùúh2®.õòJü]("aƒ-×á0r+A85ãØìcÆJ0‹Ô²ÀÞ8¬5ó°ÚÑa bSeOs² k jꔢÔªfßј߂]9#F«6 ØÏ›ÆþY¡&õÏOêÒ}D ùÈ?ø È®Rî‚kÝ—ÙÅRÌTë—µ?.A%¶'}Í!¿œImW6l+p¹#å$®ÄœF ’cq£Æ‰?Ÿq{0ÙŽ›Â:~ò£ynõaBnÙ$¨#íµ–Ø!à<ñ<-5Êw6§êÚÙ§œž}F¶üø“(6‰,¸Ùuéó jÚÀ"Š,»`¤ùTm1Ñý•EMTeû2:§;ÂÙ«©G¥Œ\¨JÐÊž§ADýpÆ)¢<ÓMШÈá¸Õ(Ÿ®úÛö§É—i¤fzåÉkñ÷ÑуÂÀáyàé_™(íA€Ú ´å¾° ,O'4bêö”c»š%))ÖIz`¯1 ¸×uXEv:¡´ŽÓ¯§J ¦?yIg6Z.hzbç¶ŽQjºÆÛ¡)Û30ë¨m`¨›©§`›‘‘x=üéZño^$ bR¥Öä/¹=Íw þ6ƒ|ÓÍ~Üdã ‘ñ*Æ6QM²ã"éð…¿Ît¶šY5@ŠŒÔ9!¿QR‹ÕŠÿ'|ÖhºíD]‹¿fÓ@1+ç0¥ÖÜY÷Cö̥أǬž“¢ÿzZ^RDµÚ»^.bY÷öÒ@eŽô‹¦'ˆþXîdàñ¨‡€sÂÀ u ›ðöÞ(ޝjaÂ6r$t@¤Û¤0–EНç‡ü˜¹ëšýÈUdÊE×l‚\~fýпý¬ÜgÀ4pÀ—’,Á#ãŽÓ»Æ"K›ó¶z­ÀU+­iƒbºŒRdìYŒ´±¯zøÝV¢y^>MFü‡(À…K§Î¼™@-I›ún¸p_´+<Ê.¾ÿUïÃà!dKšõûè®Ú¡ï]ÝÌÓךý$cèG\83O…°-úøÅ¬CvÏì<|‘ÙD–æK%sïÞ#ä>ï¼þQeÍ׃N4ík9‚(ÉÛØ2D æC…f$ŸQØsq~$^XLiÍO~­(eÊxÁœÕÄðw€ó ñ¥†Ríãß SÌ¿Ÿ"¥Ðû,7ôÌ_é©XTþœPÚ}.Æ[ÅJýWx9!×úëÁZ|cñL&·,ÝúÏ9ºöenÊ}oNŒ·Ò±ÂˆïU‰ýcÕ> +@\Ìð9©ŒikQ†÷Hþ €Ä¼É´Á lo÷ÿ‰V*^nR„êˆ 9¨‹0õ1)û¨P¼ÊduìÀËG÷Ã.…t2dA"ë<Ë’O=ÊÑ=Z@Ëò¢ªÑB´UÂ1åúA¨ Ý-&„øí·Á|O†Ú0“ÉχG÷dÍ8åäy£ø›cðãH&_\ˆX*p ”/²3ú…ö´Ò½þس6Ÿ“Z]§'OÑÖí—Ï:@Gf¤fË_·£pkmzª>*¨z oSôp“ìaմĦÚß›PYO¼£÷ÎǸš˜°h¯´•ëåÆV£§©i”q¨aŒq‡åw€}½™Í ì¹øú¯µ1.ÈÓÛŸŠWâVB–;u$ˆ"GHO…©æü¹þÕ$xž\Q·!ÑøÅá %—ɹµBÏ#ч_wfv¢$xz´–öß´.šä?A{F Ï@bÚ ÌoâÇ_®Œ×Ä  ÿRÆÈRÞòòÚd}ñYÔ„!q)ûƒÖ”ùƒ• ÙI?˜ÕÅ ËÀ3°Ô¾åôϘHº¸ãJ•~޹  QbÏ` Î$J']÷«¸ ½<D¾w*¬ûÝÃàúðÖê’}\nÚ—Öà_o”zÈêHZá)®±ôêòÇ”PcÖd¾bEÃù(%ÜH v‹lDI¼ÞùÿpkÄ{+ÅÁ ùÜ’Z%éžþÌy˜e`SË"ß”ÚO°‘GÙÈÓ”›¿8rÐú£Ò2-t¦ä Lð3-¿ÀÄ©;òj3¹'g[zF\¹²*äun¦ÊÎçg<—MßÐâºÕ§V»Ãš yèÌ’òý’ø/Ô…[§óž ÿWâÃIZ†ŒbSOOÕ(H†Ež“œJ»42pë!mš§ŸbÔÕ§g]mTÿ~Åå¢Ê7 ãÁU3i†,1Sô’â¾!>'zßÔãÓ¶w(ºýûq¶?æ~êlµªæRx ç“ ð‹Ó0JÓŽžNêHû9S Hå\ïòž®rª±µ Hnk75´õÁᶨ…ÑI1h¶ÙØð 1¹ÿž·"X1Ríð}_ß%Bà•Q³TÎ÷€“tRýÒos'{±®nîîP³æ¬a°Iü½$Õ¬Š-¬ï“zm2æ3‚§ÝªËv ‹MꀥC«•—io?ÐBúo^ý¦ýŠý~*Ί7ø7Ãã3MR„#•F JWË$¼uÿ TìXyW$Ô©èfq]¼jÉ”`×óØÌÙÇõ…ÿ/3Ãêé°‰c?½á„dkp̦WurÌžHµ}÷)õ·WSæ§F2Û©ô‘=còïLh%b³2c¸±#K6"Xˆ þ4Z.›MZé ;kVÜÏrg"M¾=êw0ʯÑÓ ­÷ÛÁ«šHOªg‰GP w–?tEÇ —žd#q~ÂC4Ø„ýSÑhEÖþO#Z¾ª²k¸¢†V…íãa%{5@'ßžú½\7þ™Ò›µ¡Nú(=÷ƒªeoÚä'öö'¡^æƒISÛý"ÕGYt¾ ü:4뀸jiQ5Ù¡rM¾·—VI‡69ä/djËðw¿““þrbŒ’d§ !UdŒLßÓ%dB¶ëTÆÎ³ÄJcIì_T©^;ŠŸ‰¸‰´G¯GÝîÛYÞ4èt!6wŽ„µâVêÏ Á¥/6T¿Šéòà+/_Ò‚ÞªÐw·å™Ij Wp î#7Æë<¦žyuàì˜ákŒyU-¸£«ÇšE/¹Oû~¢°=B‘ÓfèÔÝ—Æ$jCã±Iò?5ÕHÞa>Na¦b”߄­õ:4»TA\ãBrNžÉ ª=Ù‡õûÚaÍ–ùŠ‹ïNáB÷•Ú[#®Èê aH)ìÚeÙX;y ƒ}!g94Š[Ø‹¯¿üû¡®°ÎmÝM(šq*ø9£S‚ú…6ƒ üLþƒ¦òZAsoô‘QŽ/z[ODÓ rMvÕÖ[¶QÖb9½¾š© l>T]Á¶odŒlû‹·’¥RUÀµ%›±Êl¡*ý-µ˜ ì•Òü„R9'eG!q¾fì<}[r~+ùžžL&Ž”Êu³¾#–ò±Ì ‡h(GÍ'ä„ӛ¾5íç|œ„ÓqL§4:Ù.ím„Fº“¡y6ƒAgÍ &÷H@$”HãQòݾ³÷ÖåÒo­€ÀÚž¯»ŠÙpã_~º¯u:é‚’ðEÛÍÓžâñ‚€(oùNäãÃ/Iaõ«‚nТ¸NŽ;‚ÐWL$A>ѻн13Ç”Ö2I¥Ä·4;ÝküÍÓÚiAs+¾5ý›éIx=¸£-0¢Yå–Rе‚x”c¨ g½õM ¾O߇3ÊqÍ;qA•5ç°J1ûjÞ, X+û¸Q›ÎEOÄ uƒ;=>¨Ü=Q×—¿_H²76"%éƒížÀðþÝŽgfd/ é»!a‚¨W­ÿÅ‘ÓÌ2ÐÅçOÞœ ój½w…æêy Óà~a#KL.-/£Îã^iû‰T°ÿ.³dùÀ€©æ9€yDz±?Üç“Úû"Ór~¾j3¨ÙàÁ“•¼Í{äv½Ui.¾ó|:œ)¦‡ø-©‚3Ã8ÝqóbŠrÛ©ÜaUð(¶ÿïÍoƒ2VYZ|NØ™n¬Vä<ÍîGŠ0ÐIù‚­°yJK¢²½+Zj7o­xôx[ßñ|y$ÂÄõ¸ñ„£Ò¨go5'>^𥠳¸ºr§ÝÜ´Çâ§BJ¼f|LŽp0 _ŒL`Íõî\y,ÍáŠjøàìRäFž‘Óšn»Êλ\¤R&ÿe£oÝ*íçú£Ç½ÿ¬-Uõ£¶ˆ¯Ã«ör; éß²†T™™7Ñë9ìr“|%ÑÎ=àò2&Ÿ ·˜Èmг*꟠ýM?’¬`áÿy3°©6|–Ž}¬bPðfáÔÒ<é²Åçâ!yAÎ ìé[`í`„Ï?ÑJèÀ.v]XÞÿßœ ¿˜ Uk Ê!ɘÁ’çÃ¥Ç*„î%Ê욦)ñ—êÅ¢šÿ*W£àW´º˜ö³sÕÆH*ŽŠµ®l@D‰+’gfí4g–&ÈS>BFãJÍù¸°Übñˆ"ÊÃ$ŸtÜ ù ’oæÎƒ[)¹Õ  šÈÕ®»–|¦FüÕ3=;ÖNÎøs×d9f¦ÑíNy– ïV#…vâ¯åz²©¨Ê6qž[CÔ°•›sée©˜¹ùÖ0†¹=S]DóR]+­IJáðë[S‡ìa2•3þ¬ø2.Üay¼!#NÕÜ7{N1¡çªžh!†°‚}MO«:BÚúúß“¬‘øÅ^þo˜Ná› æuÆG¶ÀÁLá‘+'ˆ_¿rVº¦£LòÃøÙnç7¿>…š9oÀ0Ž×cÒÈàÒ;±±7ëëãN™óCåÕÆM˜(Ó\  VA–_ú"\1 Ò±·ËÅä(y§–9z:a̰¸Dñj`»ûÓ‡àúïÀûãŒÛc~­›q'PÄõw7ÏEF[¾E±²¨d‰?ëE40;`‹V{­jR¸Þ€}ŽbVÕÈá.Õ™‘9ûP5÷NìQø‚ýí=ž‡8¨ÆKÞoR·]”ÃüÞv®JÝb6€Ë¡å£$2«›ªHfn +ªÓø×Oë„ØØ)iƒ6ü™%{+¯º­B‘£Ú8‚«Ǡ»}P‰¦Š½Y¬4¯ÀmmαnÖW„¡o úÝþË’z á,Žiè4S9n´ww‹9b5ßqËÿ+ è´‡ïƒG% H@¤¬<1%«—e¬Àè$Rxž¿8mie³ÜÅ´MÖÓÁ>õ–•T«+†é“€µ•ö;¨·…¸N Æá~8:èS¸W0½Šc×È´À†"—°„‘5„?÷ÿöËTMpõ[ƒHÔS$?‚«Íl×r÷¥=}.ò:hZ!-ä„^O„Þ£+ Ž ñŒ/‡¬´óáâ¤'·Ýð!ÒñØJÀqìNKjÍedzcÞòCá#àJ™¶Ðôi2oêg 4Ö»tRPg°HtÒ£«ÙÜ^x>a\ sIa0ߩ՚tEA¤¦‹ja†¼¬Fª³ö°ÁÐWpÉLcünUÔâØ·pbeÑà¦ÙãÀ–Ö»… âxm~y4{Ë ï;ðæ²šØD¦ôflo”ŸJx®sŽš³å)Û(ÒV&ÍFgFÖ¹7ž_òn/Ÿ¼»Y6ÉR8ˆ†ÒhDUbÅTCj>0@ššà5;iÒÄ}@9¥x')¤ââ 3ŽÚdf¢ô‹þÈž€LŒOe8öÙ]l}þ•ÛÙ*Ÿd\LÚ‹øz  »À˜ís½ytêî‡ÍýuQ V­¾ Š O´Mf/õ–Dµ„‚…R-AŠëåÅ–Ž[&þJà5Nn™oÈQú ÜÐT)¾ßîvü¦ØÃP㱪ï’/§ž7Þð!üQhk/‚D3 CN.ß«¾Ž¹ñØú‡Ê¶% rbØw©h¼áv,¨\²‰VŽõR6`Lu T°áìúFŠ4×mvé†M ‹÷æ·F«HÐѦ'éòìø£Æ»>Іp­"hS mWá"08>ˆÖL‹`¥zS6!Þåœ#ÂO0ÌMÜ)€´F ¼ ų*\}*8¶Êt¡ÞyŠ%Ô—š½‘G«\ÑoœÅÀ…õ||ÂR&fä˜Ê=ÈPâ÷=¥ìüì5ØVìžÍh‘jˆÚ¨ï’·Òÿí&ÿÅå¯ím2º€³Ž²QAËf£»ôç!½è"×–ô¼MÈ~ÙÜfýÑ1‘§mÝÌphRqñà´[‹Ó‘|ÁŠÃ#t þÃ…ådŽ-œŸ¥ìŒ2ÏüÂf‹õr6^½õs—}£¸ŸèÐå—üÛ4ür¹BÝ¢Ÿ®º€ËZ ï¨@é ÜΈdî˜ ý®NNÌsVI:©Þ?fÇйÁ-2T|í=ÛÕ»eºâø>\Pøp20˜Ž‡Ó\c#£Lm?†Ñc€Ž¨£¼óʇ éÂÿH/«¥^Kü¡7½Sˆú‘2£C¬(\Ê¥¼7Þ‰B‰-ª!³x SKpÞ¡ýáµà>ÉN…°âi²…îçzÞ¾ùÄ¡×Õ>ý{GÅ»QûŒìËâ¸àXÇ4ªNá.\>@ëˆå]7ug^n°-^QO¾qv®fž¤¨Xb€¥yTꥅÖ<3¤Õ1Cˆç^ÊéX%‰!ßý¨¥¹‰™“OÇ™„U•´éÂ5­K€ ÛCÚ,j,2kv_ÈáÊÑÿ(7BcŸÐ`«ô Þ/‘’I/w(9dj¢åÖõ¨†ä¦£©•Má¡6ÙÑ<¨Ïûäýö7 `mϖγ5p—+ÞL DgVZôJŒ ”)™>9lZZÐ!.yGÜTÄöªþÒ±^“‚D=Ìì¹®¾â+ä>.z‘ë4Uœ­^ ß)&?¬Ù«Ó+îz–³¼$.¾¼ìÏD[œ/äé‹3éÐ,“¼/.pœÖ£§`$™ 3f¾&ÕãÅ¥•ÛÎíÍ\ðƒñ„õ2x#P09b=—+E«ñGUÚ…¨U36H»$Ysmäó¢?;åA=×¼¸Ê8¥¦¹`“¬kÝzãÕSPêfšWÀѾ Ä•"U~Éxƒ¿¢ñ–cÍ ©²7tHášñíç ?±ý\ØÍ>¤aÛbž›§û\fñuzKÔo„2µ¼?3ßU’gPU˜‰@¤&ÈE8ÍpØITU–ì‚£Œ>P¥ü|h≛×-KT-åZ ]Ñy˜lýòh|øÈ†*F-ô?æVéË\5ï­‹Toš–ílP¹AÞ +0Jošž:UTß< û¡Mæ¿i?Z``{­{AD&_LŒÊY~rkªAi†À5;ào¾±’1e†-¹Å„‚îhÿ¶Ž ë¥×ù%ñþ|ˆ8N¿´µm`œ´Qj/L¡‰‘vÈü¤³QÊÇo…·>$N¤M^™ Q!u©ð.E¼ÒÍÀñSE˜¸up¯Ù°ôÖ¸p£jVh“ \Îaq¨ù­±€½P…#ÉHgqker[Áì'˜›‘qS¡¿´ çÕ`Ÿ 0O;„‘¾×jæÍ:Ù îîb‚ÜãŸÇ¡…qiOÌL)vÿ…’ð3v™ù,Ú+Ú}—»zÞ¢ ã© îþ¿ñµnˆ ›àÄçE'Š©îULk‘þÌ ¿Ž‡ÑdiÖäÝÐRµÛNOðd]ÇüaÆ!”7MÜê’åå^QÜ9—ô”ÍD†á€®’ëðãUëˆòŸ[[˜1ÅÈ¢)v{A[£Å•‡çàŸ 6¢5UW'ú@œBŸ#)Z)šÒ­¢@ô5[þ>¾Á®¶ˤHÅôãR_/¸ùEyLÎù!`%,ç„ߺI¡¡3/§Ã°´Ö»x6A¸†!Ò0Oç2 †ë[y@SÐÖAÞ— Ñ61³è/U }¥ôÐD^¸ƒ°´Ì‡œ`ÐÁZ…Ü^<ÓåŒèw\NIBÛ^5 "ðàaÙ×é°±B»²¾U̦¢!p3ÕSm•áWròmú}Ìß»'&™B9?=N“eËžÓ<ú&um… DÅD4çj_p'Õd®5x¹Ô˜§é•²bÞ€ª?O$Mõl/É:¢†WâtÂyNà¢ßœth}YH7Ü8й ¦*7“•˜¯þÎ wK.£Í bg:=_œ¾ž§JÏBD„Ô£2¢VÓï†%ÖQ‹7\=/cBྠ¤é®eN73})žð•.Û‡2ºbûùÑH%ð›è>M_$1@óp0M+²µ¼-É[¦fmügÉêy¦BðšCrÈ/Þ·Kž=‘.p™7wÇ-ØA™_ÓZ©ÐÅSð7U¨!¦c0 êÒù2翊ãó…#ÆŠÂþ@ÎÕ@¹DL,ìî ¾Y-Îé¤ñ½8™ID8nýu#U>!Þ’Ô  øÞˆ‚0¨%;Ktò1;-S'U1¬CNó>heTk}î'9ÓZ˜U»ÝOd=ÄÆ«š^¸åO€ˆ´)¹D}–ľ€o@)‰kˆ¼?jåˆ&ÕñOP0ìý°yĨ>°Ùغ°öœ¨üwEëJÊnñ4i:VJÏ–À“y]…HQEil?Iñó|¥Ê†sµÀ fâw¢·zUrÍõšFËz—|†ÙR¹¡Æ­xOg*'±Æß5¨ê–Ãû•©,oåœý§o1,j#J»ÝæHÑ™€Ÿ€#—3A^V)”c¶lÓf]¸öug¦A™½“™fæÜ¯Ø)ÿð8Þ¬Pmý%ÓAÛ|pÔV@Î+ˆïÞµ¸áæwžG` ÛÏé »;)ÛJKÞ†Ê I'ší^¡ð/S˜çƇÝ(1¹¥¨ª~õdÿ¯ùäÐŽ”¬/¸¼žÜ„­ ’ãt&/Á»žœãQý¾üjïáq# •ÀlÒ_ýù¢W¿!<÷¥¢x50%†Ð:ØË­dëNikyy°»]Ô"¡êç×,F•í:ƒ¬4\sg™ÒñžˆG€²¶áUNhù¨ßEZ±Ø\²¾~‡"zѤ‰Ë•i[PÈ%‚ >‡Fý*̘Ó_çÞB6ÚkÑ*»%e$;ÇP…ƒP"ÀoDŠùÿàó…~I¼#°Ävl‡H›J<©è&¿~"Qç °L±Üøì[´b\éI¡CÚ…@ˆèáDzžLnkRZ»‰µ#Ñ’æ¿â—üî$½Ë}ÉcÒ2rå¤çkJF‡ó´ÆDÂôÉšþZ¶ð§¶°mwLa·¨«º±‰e~¥Ý¸Ç ôdqh«º×„ÚìІ*¤¿qšo¶“ÜÂ=tYÈÜ„>#þµMMo/³0‡3‚raGÏá=P7'Îi—f’ð#ú­#¨” ; ð¹wÇÇ^­Œ®(LÏ-‰Ù¥—ƒ³Â‚~¤3œgzS>^Ó|-k³v6¡šj]ÎpâÆYL¿<¼¾ JûïùÆ«*˜©BR7&ë ç…3pçeoæE÷:3xe ðz96.Š$-@¸½äæ§ÞÅ…ºT@«‘Å¥C“WTI@þ?Öå|Ã4ÔÁ#(¾ÎŽÄA#+ÍözƒUñ0¶È¢±z³[¿¥>¯_øv‚õwûáþ{ƒxÒÃÅ~úÃK“ŽHûȉl±;èfa€6† >ÂsÝÞ½Iƒ²©:ZÊý?ˆWÉ«±dv°©¡nTœüPŒ 91àM!Ò "Ý^Ê´¸0è"Q&pB%Þã}>{xP›+Ò ¬°ËÕã'µÈŽ·)—þþVbK篞jW«ÅPr6˜¾nd ½¢ãð½H;Än<±Öž3SÆú(K”)وƿm§9–†ÏÂÅígm”i[.Òpô©nõ¢Gì‡N²>µ?ï€s¶‡P½vy#0eÌ7?‘hÈËHŸÛDlûœ aF¥¤µ7=;§`9Èû/m11Ì~i¡V60£" ûîéuÒTÖl¢Ç&yÓò÷›K’Õº;ÊZÈâµÉº›š3²JXêÆô.…ªvzk•bÂÍ TÇIK¥éUtL ˆ§ ˜Åˆ!é[!„оkEC q‹×p*ü¬Gšx)u ’ô¶Ýæ ‚YÈG>±Ó ¾éO5€ƒÌÚŸ‘¡|yL±YÕí^ut%@W†N:°‚j_5(\¨E+‘a,¶‚, K¦«Uk¯l·%|z“w€q—0ª$Rä¿•®eϺZ ?× Ê”.=w,VZ(Ÿ¯ƒ~wØög[üi?ˆ™Â8,¾Ö·Úyïðd·fJCVmÜ'¯"m€©kqnÅïTueêB£FÈ6ø”ûg”T˜Jö ihïHÂ7‹˜iX›OgYÂåÇ7#Þd[êê#ç=˜ZüOÃCœ å¿Íî.¬ÚAÜÝœË×»º¯A³sy¬Ýª]¡FŠOáÊ"¼­û5ŸÉn·ƒÍÄUÂdÖM3B. `DäsE¯áœœùr?±ŒÂý0-±+Ïéõ=TL«¡ó § ,è ¼ÒB¢Jz£l6¥‡ü’ÓãÆRìËûκŽj›9j3§;õ›Tžè Òñ5£3˜üüU¨ì`¡d¨ízD¨˜áÕ®¾­Îu+5½)fÁ\çˆÅ2  Ä‡¿ÛSI«ÓþX/¦r ¾ëœËÔIpfcêŠÔ´uñÐ.´RøZ8éL¼êÑb.\ l 3?ƹ"»’íÇLvÙ (ãe05¦ [2ÕûqVŒïÀ±ÎmÖ9TyDãMjæôx…¨VÊíx0 èè/Ée°|¨bHâ÷ƒÖAìÚ÷o*ð½f$QŠ—ÛËN/ø=îf}*†!ûÂô<ÙT¦$6ÔHeܱuñðϦô»V‰áŸtŽÎ3ðô•ïh6}˳P¶n /Ž*ç%¾¤ìœ?¢ã‘)ÕÐÑOšÛ\YNõ™ÂÒKþR`Hyù²ÑX¥<¾^¡uQåÙÝ^h¹SàþïÜlf~“)äå.S•¥9†ö¸z×ѹ†=9àÆaóÎ:+\IŸ6²0ÖÀðÕÝC ñèá©'Ucæ… ¾0•·~¥õ£–'Ç{íC#b~ÁÓÕÏôp³+L:ÂÄð4é †ëeÈwBÝu:Ê` ‡Çø>c?‘Û°ñÄ¿U¼iV>Û‰$âHYUê"ÎÝ”ó|µ~õ‡Wq'ùºÉt&§Q«ñþ¢n0®:8kõa¾5¶¦h7Ì#C”ÆéÈ^ÿ,OûøÕÑ€ޱÝC) ,`¤Öù^ÖkÄLVÿ2è:Ÿt/qwAW[ ùc´6IXüYþÌœ“r+pà°”øu”ÇÑã`Š7â—_Èö×q{n%VAC8{œàHöÌTec!4÷ ƒe´Ú?3æPˆ»f^© $ç)^U>¨“žoH¯|oíÊ¡tœ•Ò«.Ao²;Ý}8ÏO­Ö&@¬qòð!‹óq&Ns 2 þב2ɪ»ËÛ£Ù;uïmãŠÎÖaßíK/ÍîkSWËMx¾hêò}ÁD[Ÿ2Ãs¤*Ýõ ,õw7¼^ÊGÓ,ã‚”&ˆ}˜è<^âoX*Ó…?‹; µB N@ sÅWÇ!ÑÛ x_S8Ú$»ÊS7ÃQ“?€ì»ÁŒn¯JÁË’g‹ß}… Š•'QJߎÕ1ŽQÀ½ƒ´¹š‰…Z¥ªª}„ ƒ«N[”ËÊ­†Ý×\¹¿›Ððj>18#Dgð‘x:̧©ëæˆ`¯tøã7ÆayÍïUâ_.2-T¦ÚvËÝ5ïÕíêÍ++µ¯qœ»¸SZ™Ÿfí"Orã$žêùŽ£—6†,œQ-ÇÚÕÉ™b÷½5/ÙcÁnßÉ­æ lÎ’: EKvÝP_Ó®#DƒÖåÝîMÐÍÇ;9Mº{jèÕòÝÞ&Ü FšDaؾq_Ü®–¹?´Ã•Hܨo3•®¼ÔÃ!¿V8@®¯f!¹†¾Éèt%V×÷8JõHþ{Ï ¾…—<)ŸfT%ÙtË­ïÈWHÚú„Ó3¹‚>l"õÕ—~Q$PjG÷<ÁOdtÈù´Ê»Ú"=­¡ì~l=a–sùÂfxŽ?æ`áó°È¥®UÛÞ PAƒ] ˜s³«ßœÆ[@Ó–9|PX`Ùy;¹”%ÏMfü·„ÿ£1&‘HŠçè˜/4{ $fæ·;±qæW “‹i2èP—xAÓÞ&Ó¯@”L§<µ—^Êôƒ(àÇ%6k£mà2gÙ[J5®qÂ0^Ä|P paÌ 7"‚·tÅ+¡¤ŸİgïRG¿Wèwæ#2€ HðǤ"YsUþ§>!»/NÌ&Fk  û>Z$·a4ï¾ú°éR@ÑÉŒ•Šu܉¾9O@û‚?º Èy`fRŸ[HÎ2ÿ°ÿ+Ѭ éþrô ÐÞÿç6ZlÏ3ì¬ø€p œøxˆ’'ÔkQ¸ögãjRt+ëJ=ÉñŽZ›YÑ=õúýè­pÍGA©ëŸ0!6=7yö"Žì¾ä,”ºàqG MULÿqeH‹ZãV0~²Q+üÓsÿù­Áó(Xâ[(MOäDõãxá–öÊáíÊtçýWþ¼Ì?Ô,ÞX#³L™<[v²õàY‰y^€'Ýtòrª Vi³,-Ãzì0û!î†lµàÌ4SÄ˺€—\nªÛ‡«+GÆtz -òüÚØ›YÛ%1±)Œ©ýÐï>P¶««êä³Ôqò© `Rg‡qîkséeûŸÆÔq3%¾íï•ûiR ²B¨p#z"Œ í=d¡ÊÜ“>¸”YÚÙÀ!÷»QX@rU27gÑ·?KåsœJG0üœGœfaýâ¼õäp0]󭇮deÕän’¿x^a  Šl¤¹Ñ«ù}ùÞ7ðt–Ëü†|O²Ì?2Ù uþ7×4e)Ø-ŸщÑóçG¼ >×𯭮18dìàóDU¾4_^ÜÓÞµ”ÛÍ%V)c'Ë»¼Üñµ*ØÜòž1u-s?€¨6‰²³_I=6묌Ü{ÃV hr#4@iŸ+ôïãK-ƹȜMÞÁS”ÑÔݧ‘È£Š‘ “Ð<Ñnà‘PŒ9ÞNÛ,¢yÎWµâñcY… 6óäA‘0ØÃzˆýÊ…(*Ô9‘;'PZ@~š§8@nuQß’® ÿÓ¤ÓV|ÚKø ±ÁYZÆ—3 hqdBÛÛpÖfƒ”²lë%z ðÕþÏïˆC<þÑnÛÉu æÙ5¤L¼~)žID¤{ý{ΛnÜç=ïÕ(‘Ðõ ^þúÜ[5¯ôUl¸÷dò)ˆÊÖ¢¯Àï÷ …ð¿J1Œ”käZ%u‰W1ù¬e¤Â‰ óÔ³E8`dâTã{RIp]vÊ ‹õOí$©ôr$ý×j¶¤îå -þæâèÁ…)kܲW#ù•³©Üš AÄ F0‘íKƒnôøý‚{›H¸A¬ï} ѲO¤€ºx.—ë÷.=ÅcîË Õ4 ³ºŠß€(ó)Cô_ëåb)(Ñí[1·ªx ÙXà-“([&5Æ<òNR°|W±C¦#wX›Ps®9—ò1rßʶ œ1|Q›!gø(à À®¼ë:e8 ûW 'ü(µÁ/„®1Ì–%΄žû…™çLÉ÷ `ï¬€É äsûÈv)‡%?©!8öy»Ì>nJÅ&”,31OšVz}ˆÔÃŒê¸c~tól›hdtñpüN©lÞPœÎÿ(ïbÍêÌNwöSNHz|«>ðŠu½…ã¾ ¯lë±-œß¯Ô Mpì†O“±ßi[—J«¶vÎ(¯N=yi¡Ñ¬pVSI¾¦ t2$‡¤øò¡œóé×xgsp«|,¤å ÕºÈAàM¡gt:= [ªÏ˜Ãmž Ëæ(l¦³PÖØKjû”Öz•¡_á’½‡U]¬·C{¶ÀP®oËÕ¶¶ >ÖKN?@šTÕb½0f¿Ë‘ 0¸|dÙîKNïÕqæCá€ÂɼrÞ³±ðý®‚¼*œŸ.SèB@>=pq®“y.‘ÿ@×n_qÎË‹Í÷xMÁ8î$–³¯Â˜,§WN9î(QP]cw´™ßæÑd…ª£¿Eªu…"Ž© —Ê}p„­‰ÂN o”téVã0‡åY»Wãe4Ÿc9ù…®þÕ7„˜ŸŠâ"OúDPÃÆ«ÿ¿Çô|áó‰gó 'äåyšmS…ä öï\ohÕš}€¼Ã ©Fo‡à í ‰Ê-æ)Ä‚äsš2[m¯4S±T9ˆBæ¨q!€ -#f ­ŒÎ¼àzžía¢à+,FB=„Ia)zµÛ¤QM,'5æ“Ñ>Ý,±‰zlÊï|àŒ]_ù‡0LŒ8rtÒýŠÞŽ…ª¬¤néüÇó–Gç¼p°ŸOºßÔ]H&JWÎ.i¿µSõü@@²,­%‰û‚mû0ÒИÿæ¡Ju€BB¯óBÉys‘¨yí7?ܔۺñÆ…S•'œµ·d謅ÀåÃ^ ÍM‚2Ó™·š¡?:uë­âÂ2 M€€ÀÄVšø"ؤ:L*Ö}­²C{xNŠû¨(k|7äÁ—AÝsBú²hA $$÷Þü”Q|­4oÄ2•årJóœëüD5/™T] ŒÊ'f“Îf;m1\lÖ‹p> Õø¦LX²Oß)qb»Œä½×Ý&_€ç£ÈxeOþ $õJä°¡‘¹¶æ¬ñNdB1ÓšËÁ¨Xö¹‘'‚0vÀ=ëYÈ7<­~8d näP,>\}S‹%5ø^6ûÜ)\d.H3`PaŸÚ-Qlmf—ãšTý8hÓEu·'ÿ扱´²²´ Ã6°ç*Ãs¶Ø Ð ]ÿ[µöÒl€¿Dq—d´óûO›@„cŒ—Ê zû £‘!güI`'{Õ‡Æߣqn˺÷×—Çd;Ô)L,´G%»Ò{HrL†b¥Š¹ðîÏè¾cFÏÕöýP2ó ÁÁ¤_!ƈ̳Aa—m ¾®*¿’6’¯±D^öè4Š.²˜Ÿ$±ðªòÊÖwéìOC~ btɨË.GÖÍ»×› aTÆF¶íÃÁûèîK+ã‚€p úäfIyÐNŠH}ç:c`T“è•ëQ-?ðe²ÑÛvaªMáç'.¿¾ÍSf•^Φº4÷Ü4'fƒ®@w9âš Ø“U¿h(˜¹gÇj¥D‘:÷h™LÇì£Yÿ^é;<Ú±Ôc_Ò«;Är)»üm“Ww¦±:¥¾/Å”CŒllmCȰÈZ¹; /Y1 ëæŽU¯dŸ8$ãƒÊÁvóvo¿ø+Šã‰ÈÉJ¢ò¸¯ñ¾nq„xxkC+ÏÀÍp@kÑ–„üᇋM•€M !T¯¼ì¥çÎ{pq—_»sÈÖxI¾9­&z°ç¼ã)2&ݰ˜}U2ŒX…äèFÏÉj>ÕþH«î,¬¯ïsõÿ‹©0²Y›’ˆŽùfô¦ YtŠë/OeF>½÷ Ë'CGéõdÁLrrŸ”o‡/5 ˆZ˜¢šíˆ±Ü´x†´yl“{Î ù&ýÌ€ÙàÙÉ™÷‹›D$>?΂?€æó®f|öÐ&x7Å“ÊåÏ¥RyXöÖ/• ^𲸞ܲ©7ÿ{6OG<Ê3bbøM8øjíý´®x+3~áR/«¾!j ¡Ø‹iª‚ éPP¡Ã×ßf–gª?ŒÂ `cØ"3¥ C9éw ,•lõ @\5´ôÜÀ ÝZ8¨Ç!”v\Ð&œ“¿ÁØå!„“Ê´ól1\0€¬꜓Kªï‚%=}åÎLI Vq®›+ÓJ*dô8´Xkßøó$ya‰+¹µœFÅÍ\¬shB(ë9˜/)Ú:V¿ø•Þ&ƒ4q][3»zJ,ö×¥fÜBE ¨a¸/(¯…V"X,ô@—ewÓ(uYhø7yW¿âXšx“õcÛ (Õ²Áމ¤^¬æ{Ø‘œܪ ƒ»~ü¢m20?4Jž‹fcw\´+ 4‘°!â«Ââwæ~´Ð«Mâe±œpH+¥=<}­Lñ§ ÂŽËèŸm¥sÃÊ/¦´¶ŒFÿÒ7T†Ú(²O¿C;ÏÊòƒtC­eP¼P"v.¯^óXp‹Ó1õE™ÖßCù¶}@9 WÂtÆ;ÈìDPí;ºDí°ÖÕÝe.£îëeúµÕ\;Tå)7ħö?Í8*’°\Âk±Iêàáxy·þ×ÇB±B"éàU€‡ù¿ü®Y¸p·¦›‘…ßÁ’P*ÚÈéå@v ÂÎâhtlZj¬ šê îÖ@ÏH7ëëáï¶^Ú°—7C´X„¼x¶§âtÆœúH1NÈA™ee^¦q´Õ°¾kìHˆ#G"Óýå†húþ‚g,—¥©/Iú‚Üqž³ÅÁF%¶BC®uùq÷îD:¦fÖŒ(Fb|XAó»`úFPË“ {] ßÐáÛYœ‘æ®o™š'½1(ȵˆ‘WØ®©]̱á ʾª1¶ýä°>‡£&RØld„¬_´Œ =Ó5]YI]X´4Ö/gßGt~À4¢¿'«!HL¬¯[Ô*G;w*KÒÄ;,bB¨&:”XbfÎ5ì–í‘àPƒZ}¦‰•ù£ ñbæoÀ¡×À­ÉÒ:¯-×%ìG³?*¥e&é¤K£³KTp~1L ü¹6ýÜC§3h?Þ>G»A‰*n¯oLgÕjìa¼rÐdÓÅìûäE±[—Èɘf~œ“HHœþ¥ÝNÕ;áPbMýN”®^¯)“î‰pVÉHŒ—#ÍæUKiz}ÃðÊ W™|‘jð FêÜ<,2ÇÊîÏ#Ô:õ!R˜ ¸ï*ta !œExõ𠡝eXEÃVÈÎŽ„嚣™3¯ä’•¤_EНՑû'Ô¥t#| \{çD"n€ÈFä+^SÖ%Q¶fyG~¿Û~Çÿü¡Mc¡¬yÌGïç^À¤† ‹>l8„‡a\Ôì+ÅšRCNßìXžX•ŸÛjê]FOÐîÚ1ý›Bl±"gJ+™á3«DOÑ˰°vEìw&2›¬`pž>O*Žh–­²Êò›+‡åôÈÌ+YTÎùRU0=ñ6ßôåCÌ*êWA\‘kwš-¼êØÔ€ä¥K‹Wª®Ûìl%bUVÇêB¦%/ ‰å}¹0ü\Í=Ø8'¿ñäpÚù+Ô?ûÓ§¸AÂ^аkà µdWœ¾í>mÁsâ. ª?+ûˆŽŒ¬Ñž[З1Ä´+W0Îe£_Í̘ÞǼ~‰;ÙÞc•3:þWGJ›/Ö4 —HL›·üõ–¸“9SÕ†jÅum?:ÁÚo¬ Ø9ß%¬”½ä­£L׋ԔKC‘QŒ8„ì:¿)~ùýÖ/f®_gw‚¯—g%H÷‚>(¬D•ÊÌCW&£K6S•E›O“‹y./¯m’­u#ÐþrÆ´Î)”þ={]#öuá>˜Äµ‹3_Oø3¢Éô»äúÕäø¼;iÒ}HQ¨Ug§¸â.y ƒ[¡ƒÉžÚ/ÏXDW·ˆ/÷øóÔý>0ð“E$®ºJAÐkV–ÑŽ ¨€²*áÛ:N±îäBüF}‡Ácü44Сé"· ¹Gë‚÷aeü)MjOAKJ˜½ÍÝ3§`³l‹š§ñ±VŸù¤ðÔSV|å¦ÜÈQC«¥/¿„š«R}ÁŠg•>òcÅòp#›†Æ#&ïrÎC|qÌcóV~,Ün4šÆà=NÚâÀL¨ˆ¹UR“v+ô˜ÞA®—&:ƒþ}n¦4Õ^J}ü¶¹UH[&š³h ÷{s”•­°ha’@çäÒP‚rh²|yqr. ýúwWÈN­ÃÕ6êƒN’˜DRô£5§â=ŽSìïwî××Viæ"ªïÓRÚópWƱ0X«‘pUê!š=BoÏ.Ë·m·{:'NSÅUºA-ÖùD«°Þ®ò L[gùT‚”£÷Üh¨Ć–.@”xÁn*¤á²¦Ó\tj–dù ªÊgÔÆC‹Â¡1ë̤F9“ôë@줴¸þdøÐ9Éý9uå5K¼¬E:Dðã÷)ž‡¨©8üÈÍO¯uöí×Ûžú˜—(:õ¡Ðá÷¼ —i‹x¸3º ÅmûèHº ˜¡·ÈŦìêâiõ~é£^r‰ðd‹© ØËL˜×j ®ÌƒWéø“5ªø9…#†Èçì2:9¹,=4÷'€öÛI¨­Mz; úgº|ñˆGéŽ!\šÀ$ h 2[wõƒpzÂOÿ¨ ø‹iñå46îV±¤øÍ·!—\%ˆ-LÄNŠÚ:HÙYTcRzÀ’"’Ñêj* å ÛÎ:,9I xAœÊÜ¢JX´Ñg¦+´Ï Â@£1XoyÐL9e…J¯µcÇ@½oiE³Œé_¦m¬LôÿèÎ#ÚÃÁ² ƒžÿX×!P3!þ¶îû$Y“!JÏîî#·©‘ä]²Wm½yG¼o¹L 4âÀ–{*T`WiRØÌ†âqSI«Ê މxÅ QgÀL4„ø·àƒäx³ðð ÒwA@RCNƒ ºc›°ºö·¸~Š' Ÿè¾Ê®8à­éímÓ…fr¹XkËØiÕ_0ÝZkq8¨¼øqÍ÷(®ÒNåEâЉ I(ý1,ÌH³ãfsçI¶Höœð›Ôžˆ„m½Ó¯jW‹Jd%:¸uI××£Fd¦‰uDÏs‹¡ŸoG<·—ZFìEöËáàµÃ!& ÄÎW™Éšs—oÄgïßìfÉ1œg=b”pýlp ¿ÚÔÂjõLe£§‡Pò.IÕÛùT’;eðRÚ7û]+@!_d_eáç©.•å#ýeäÛÃq¸ÿ£B±_ó<´”Ñúx’+ÌP<¥_nok¹L„‡§:-;ÃV6»=ŠPºu8Ž‘lîŒPx48Ìsž´:&⢛‡·Ô‰l ~‘4™v‡8s¡6ÿrX`K:{î A0¦ðyvœ*÷à»|Oõu6*¿í£¦÷z(‘¦ ü¶Øµ>×Ñ÷ÆB‹j/M"I»æ"ÇìCŠ@SV½GÕ9R²¿ì{!|Þß§ŽýT÷¥—€paYê¦>Ù'¿ºx„O2,?`è-OORõÑîÕbG’++rÛiê‹D¾ÕDSy]Òý#•¸i^¢ý-ƒÿ{Rþ¼Š]ÊRî,/Çv]ºYF>\mi“Ó»ž_;†í@-Ò?ÉÙ±FýŃJtVÂDZƒ¨±°µ0Ã9fÜôk† %å@àäÈš‚í{,ÜæÄCb‚tå¤B2NàŒ§– -5Þnùðíõ9Ùéæ!6‹a÷×5‹$€£FU"¦Bm6ÜÑX9¿ôq3KD°•÷¤ü‘ q8žÁ˜#¾„•|ÏéO‚Í¢Kõ3G •?˜ð|›DÃÉiopÄû¿ìtÔÝãwÌY‰H«Ù&ã›<øÔ}'u¨idZ8–œ³ú*"òáÃ÷$2ÇJ¶±”‚r”ëëqó£'»ó¤ïPC•Í #íáÈŒÔÁ074åü+vF˜ 0–~>L!l\ޤ#íg0m²/,Á$euŸ¦W¤Ÿß6Nåˆ=S]´2ÚSÊÍ_À'+ÙõšÆ%®¹¡°Æ£¤EñUfoÐÚÒ(~þ$hôý cZyõ™P·­.‡k3EGÜÈbEoAC¨ë,IAI¹zÀ*ÿañè£çÉvE¡¦ë4¯T²á?žCùˆà‚è¬N‡(Èþ+Â@—®+ hŸaŽöâ„èÛHçùæôªÈ%¢Ë5ÕtQ+¢ñêÌ…OÚMr²î„'gf ¹Ø{eõ‘åºAŽë£È@¾êã{I¼âÀfÓ:fù46 kÝˆ×Æb’ÉŠøä²$|oÚYȉ{÷ˆòßVu´Òe™¦ÿ#v ›0Ù¥–Z¥H"JýÙÄA3˜âŃ(¯"†ÜòzRMØî&½ÁÚÿá„ú²IÛF—ÖË,¼(kŒBÞVÏ“3 ,Æúb}.îQ¢`,è‘€›y´3nÝk†À §°v¥Î2†ðY¦ s©¶Æs$(¤Ìä6Ö²¬ÍÎúm}3»ÜGêÀÆŽ %•éÀ=oëÔihzUV!›…‹Èc‰±°/©6$˜×F#@ƒý[Þ'þP±q‡ügp¨pÁ€ŸËᲉBÄ {K;<9i^K×òõ|Ô„”UÒÅÙ‹/o2«jxhÖ…Š7Üé.øaæñ‹[¡ð´ÚåjQ-be?‰r ² —kr*ü³ãIb¡7ÊÒð‹”â¼ÇQ¤ˆÁ„'÷hù¼mö;æŸr¹¬?Œ(1®Æ™'"(r5eš•fb»¼=[ðÆëcjû§öØCÜXä<®mŒ%5Q#7=XZòÏIŽa»º6)8}µ!ÚÁ k¥-1R¤*àsÞRÞùÞKlce¯Ð-ú=ùÈjŸORÝR‚uÄÝ“×s‚/öŽ£¹g#Ã&‰à S²Ž±;^lX%V`„ [ª/ÏݬôryÄKꌲWKÇ;Kê4º`½þºTx5vy³àoýawF“=²‡åÐÌ÷ޏ ðô£qZv z!ƒ‹­J*py`mg‚Çœ?U®a•k»Ô‘/¾# F–T‚+rVÀ‹ÈOM¯^#\­…„¼Ï+æ€6hèqÍêñ$ÝÖû׳˲Öõ—HÔÒ¹•ðlÚÁÐîô¹z ƒ½ÜXQÆêAU< ½ ¾Z±ß›©Ç5#E¥æä”Vsmú÷´=>E1È$êa9O3ˆšw(”ßöæŠ_(WmBÇa3àÝ8´‚­¾ë1 UªÏ(¬ U5ÇÅCgå¯\Ña¢ïQ‹+Ú}¸˜õ>è½[‰BE»]ƒ8ñÉ•Ãw‰KqT¼ã'ÒƒûÖ½Eò3O¶ü­P¥óe4†’zvJ¾¾pÙ*ITÒtgöíY…z‡œÄyYÑ 4·ÏwDw÷¶Ööñ÷óå;>ëøzüšÎ•à)좥þg-ùO¡]åUÌuœO u¶ãJö?ª¸ÛÆòok ¦%.ûTZ†ô‹çJCGeéÝäÍcÂ`GQ}ÕY0+$.NóÚû¥é´!›Í£öìks’bÓè‹)ʹòÜJƒ›85•±‹óÔ ÔÀ<ÄôÐ>íõÈÇ…'(1*×FÞ Û¿™oü¼¯wÀtRd´>iô¼´Å⟻yEIÑÙÍxÌË:q‰’TÏDJ1Š’ÚƒžçãÁéX˜$PFúY5,~ ù–¡ÏgƒSÁ¿Ž²P춘;E‡¨P¸¨³hѲ3f=%¦¹%V£=å­=ˆö GÚaª0 "FdUö =½Í„Ä|gŽÒ=Ö‰™¨˜ÄɃ)QØ\&࣓;šÈMV p~!voˆ™é•  ïI’ÅžæâSgq]|üI¨! –hÕš×ã£ï"ßãã%>ŽrB)êz|àäéNZ°û®䅩׺CÒv—þöPÓÏö=¨c†ëÆ<‚|+N;´~žEÔ¼¸pB5Ã7Ùã Ã*¤Á¾PÒBôÇ¡@°ÀÍIŽw2­¾lûÇ tŒäÂ;d à‰-#4XrDÀ÷%I^T×MW—³r:žÙŒ‡)û™Ú‰}¹¿\zU…/›†$¶Ž‡à°öX•t5¯Ä£U©&»ÏðEqéÁ÷r·ïk¥ V?¾0GÌ©‚Ô?΀ˆ'ùƒ@[`uœ$%»«5<ß%O[OÒP×Ýa_™ßÌ‹b©_|ÆíÃqݤÑÕ›1êWž¹úï?U7úž@ªý?ĽZÅÕ/«ÓïNYgs²½ðÖrä$:&È‚š¸+€g‘([¯¥Â˜¬ˆ7´{öþ½CÓûœŒ:q/(cïÜÐéØ?…ji¬ÈÎ&s>r[6RŸwͳ;Bx7Óa6< ÃØŽlåÔÓH©Í…Þ±üø“q'}𵔄ZÜøITÙHÛú¿Hfeó?ìxÅp¬<ÝKH‹ÅþÀÐZaeƒ‹ß:Ý‚õeF›C¼¤ŽÙù‹õ¡+:ÅpSTÅ3mG_Cb9Œ.«bõVõ[ÁN0”„Üü/¸ò8Q’Ù;Ñ;&ÃÏI4ÿà`« ÒbeƒCÜÆÇˆ +ˆ2íÖ7Z™7hB™ï§FèRÊA']/³Ý†âEi òœ•¿‰ôwsÊ)Úgu¹—˲mÈR,àc+üv‘ ŒßÀïí%K vf­ö‚D§~ÇdyË‹z7-+¹¢ÒŠŒ¬ùÄ@оjÞž_T¹`[zà•pZc÷í)0Dgiù¸oS@8[J†¬©|QsËþ=¥ƒÇ;;"wuálS¹º ÏÄ\6H˜ç…¦Ì͈)½!kIڃ׺ž·[`‘’§‘¦¬×Oæžò4Âdr‹¤ÿ ÷¡ryØRßÞÌQv´Û…``Á=R)Ê«ï´èÅÃO n²¾Òå\_CNœñI[Y?G©ï©€RÃà³/ºó¢®¦`€bƒi™v扲䱄-ðs! mˆü“íÛ»^%¾š¥4à-ËVdí’³ßh¬EßqÔþŸ×Bçó õUÊÇ™—¨Ñø*zZ¥Eªít;9Yp6=ˆ(±ZÑ#ùÈ`œí[w;µ-Ânçhþ”·@_ÁoK­¦L­WWÙ€×Ó¤Œbk`·ª2šä÷Pßï-+ÔT¥øñ‹¼Ç^î•Ôzþ^ÏðÆÛÀAž¾Rø&»Üx¸;ÄÞ’KbÊ,¹C—ØzƒpÚDM¿E*0²Eƒ.Wt!mìQcG (zŠýG‚™ïh2'õ#:û¡ô…œBñ:푦àà‹{e(Àन´xœöÿ3§§?ï®íRŽN0I”Ý[_îoü˜ÇõyL xùÚÖ]J·3Þý¾buNÅ ¯Rö> „±E MÎnW'Xhh9—Dà¢Bíit‚¬iAv^¤6‹*…&B‹r〻uÒ%’™ûyd÷EÏ鮽Hß­)Ñ)¹;ó©f`a½°‰±œå¶Y¯¨°xGêÌ76Op¶~‘© Mþ+Ì[loš±‡ðƒÄŽ„ÏSËYNEÙeè9·º¾áp¡÷uC\` Ò-Çú›»Ãv³pó¦t)¿½œsê§%ìGG®¶3ÏÕô˜ð`›«áç~/vl_ÓGÜþû%&b¾úæÙ¡I²o b â_wötK8a&7Ä•vƒ8@Æέ_‚‘RÎ5ØÑò"Ot ÃÉÏõBà{È©C¡_qQ¯lr;XÙöi°6a$3¸Î‘–ÅBþÖ³yÏê@xãWšlKN€é•töØ×b§eá㛆DQ™|D#æU&ðr&Áý¡V¶–ÅŒº”3BñD³Áš²—[ô‘èг5k©òâ8=ÓŽk²è—¬ªÅ!vϰœ"ãœÞ–³¨5´áÀog¡_ Ž):ôß*²©¬ëPKÁm•£ÀnÝÿŸqJœó[lã°¬Ž¢8ª ž² j¼¡ÚNjLà¬Òõ·Ä»°ÖK„%¹B¿E‚ŸŠ6ue»K^7Õ{êçXÄoñW–¥ø£ÚP^%ãN9IFy›·@¢4éΕ¹õs.’ˆ!ï¡QÎ0ç üŒé~¼£SC‚ýÍ~Lº¤ßÄèÑ‹ðÌÞšŠnOUnŒ ÿhRƒ²!-e™Ùò1\. ¸ÐOmV‡L’ÙÊ?7}hg‰ü5ƒ™ÎZ0 §Þ.“eÓÐ%ñç_4×LõOf–'²”¼ez@kp¬t† Ý*bk½ ýœö³ùÉf€÷ ËÖ´ê`ãé’gøOÿÁfª0ÕÀæ—ßÄú»á-,L²kš,êG~|¦ºÚ À̱”4e¦0V(·)ü:“#A·!+é}âPõ{‚¤-•“ùV²idRÙXbíV#º‘¬"l­ä%X[ã’ïìr›ÉT:óØ% `ddÃ_Y¢E½oö¼ùŠLÕè‡N¥Œu[͈<“î–É„¾`j–³Ú:eLÊæ=¾L^ ÛUõ•!ˆÂ+ެ œœAï©Ã—æJå2ª¡K·‘|¤¢ËŠÁ‚…c²Mò"“ Ëć!ƒï@èpïÉ$ÀTí©?iBNÉÖlïsbž@fiJõv¼®i¡4à^k{Èàä ³+3Q„ʯ’h&ÿ2xòqIÌ#Ä(ö\DÚ~ëªöÁû]º-„ðÖaU¾Èû~…|Ûò˜u襥ؿ٘iquXB€Ý(ã'°SV‚¢làëZŸËßíã:R©?ÊKq›ìÕ?\qQ²:;J¸ö^œÔ GUf¢Z oû7nÈO¸¸öÜÉSà444ô$¯³rb#-ìçxŸ`GRI’kîÉX“¾Gg÷xÍY(ë ÷S m¤¡Òyn§yfȃz3.ô*£e+ùÙV鉊GgÔ@™#6 ËífF{sm¯Bq¸`«x¬%¶8o¿}ÞÖvõYèJfOºÓô^¯ËÕÞ£Ãõ@tsåhgi£¦ßòâ[Õ˜3ïá:ñk?¦c«jÂuËS÷gÕoù˜wÚ$¨ ¤Óˆš;öaþ,âIÁ­è #çªäÍnÀ|Ά½IvœÂc>î`ëÜ¢©’P·¹T"ôì\ºê%ÍÒGïÐ+·zT¾ØçÀ'IçWáT—’Mj£+ÒËo|$7e;Ê÷¥j®’ÝQ”½ð0\/k%&*ãå9si¬}*ªÉÖTs''¸(jæxï”áäÍa†çÏ| Á – ÿŒl•à÷,«]HÔˆk\°'Fs*†жÕÛÉ®õJ‰î{‡Åœüïv¡ìþ4fØ[Ñ^¾6]tJýÌ+_b?“%Ûz9ØØuàîÑQ…€ ‚ôú1 @oB Rëž<3ù¸abóË'QZ7™OÉ÷71d¥ÇhUÙR'è4ÏÑbbyr‘xQ A{·Ɇ¿qU!ÿ][ 2ä6Òx÷¿©&>çLÚ±ƒúq 4Μ0Ä]#÷燐ò-ZLu¶îÿ×ImÄ=~©Ç ZÕV÷µ„0fÑvd#ú`‹œˆÙìeÈ7Ÿc0QøÝQšmBo ô]‘¾È/àËiŸÁ}Co´ £ù“ž#‰$ãÙI³Z "¬ÉÝ[q,OÅgÕ((Sóºï¢6áÿ1sΆØ7¢ç‡[„ŽºX¬Ç(‘§jøî˜{B™bk>—”òk%ñ»=k9HjF¥WJ5ë"öˆŠ(èm xX»(¡6Á Ø¾©˜Åô@|~ׯ㜙Þi¼_œ$×\„ô!»Ë9C€\TªÄöE<ÏÃ9L˜Sgk¼îÂáŠñ©}AèêÇüê©ÍhFãÞ²Ò–cÔ´Šk8Ïœé ªR[ÂS´ÖBÒÁ4Ï,Ke›õ– ÃsÅtä8H#?³ \éæOlù-ß¼„>˜Yî^8¡R7"eRQ}5É3ñfWº, ¥4ÆšyœšÎZ?s>U%|ä9„‚&÷J=àñí£Ë3|›‰<(ÌŽy2“v)i¿Æ¢—͉ßszM#þÜ}x |qRÝÖãÁîKÈMÈDz˜zû¯ílN—jÕ•—*DTðfíJ=×T±ÁYnØÃaÎ¥Ò|`%š§¼õ°Z‹åkˆ©xK$ï…iNxÙEÖÿ'øê2 :Œ|Ò~N/¸ÆóØà­ääMÀøZ]Ûü÷[¥‚Rê °qmúê åºÀµ¹$~¬!>£û=êµûöµe¶ˆ6,§Ë ™L öL.„ÔrÖe ®ÈÑJ{$ )¢ÉˆÐöË|ڧȱ÷V›¾ ½,ëÞ¹‰ÖVƒçg›!d¦5å‡Íaè…À^Þô¹ã@/~¥­ÈªږBÒÿ"†šDÅsQDêG‰}™¨CðØò°e3,‘KýÖ4˜Ž¾³ýØ2ô ¬£ìGýKˆ-ÿÊÚ#‰¡ñ=m&ϹŽQˆi#ÍtôÛœ(‘CK˜ÙÓgãÂîXÚjXo´ ±W¸;y$Æ·†Gàš#ÒÌAÁX„m£¦VsË<µ)Þ‘¢\ÌÕ€.V&çȬy ØµùlR°p8ÕDm’ÍÊÀ·“6»Á«6Ue…”à~&ãwÿ[!ãvp”¢Iþ_ÙX*#˜Aº`р怲áÀPw,3hêÞHÏ&  ˆ‹‚`‚ô~ÕyTÌõŒVp(1‰Ý9yš¦âsÅBVwÏÕèDk!}=î›J”qyžÖ'áSµuÑ è™÷>eõÄ»/ Î7éíV§E+Óª¥Ö¾æÂ©•L¸=Êb=$VÏ;åPsñj~ZXÜܨ[‘2·ijR]ägœEÈõj}³(z<=¯,Yxä7è%D_®«ñìŠQ¼j}9 ×¹û>KÀþ¸ %¶š“„[¥_þ„ŽíâéjÔyARmØ ‰Ñr øY„U „,Äv¥Í—+þ¸x“ÿb#¨¡ö;øDÁœ¸Ù—£ÒÛÆàòÉwªüSÌ.´ê½Ô½±;Tt  È´_-Ö•œ¡¦›^ê~/cÿæu‰úgi}©s¯ÖyÆ y¾Ù]у‚+˜jME @¾¿&­öDnF".WmX»¤ó„îm#V°ü=`û–»ÆVo’Èu¸H_ãˆÂ+/RÝx•ˆäYíÖsd¶v½øéX½8fZFóÛJ•Â#}*…1­s>rrëäWC¹ýäj“r$J­rðÑE>¸óyëæ³L#Jš0 >M°µú¹U±ÎÂ`fQI©¦¥T9ÿEšfhžàŸÀ±ýžÖ,ب?‡·/¥ÖA²vµÓS«´ê5íÖ{/u}„dsˆå°™X⮣=Gé=‚úPêxmtÔv¨ ¡\ðýðû-&þ«–ªP¦tƒTwN&G–ÿèIÈ·Óư½ ª WG´H¹@oZ‡mN½O?ÎÍ8Þ ƒî€û2˜ÒÞã4ù\zö6éÆr•Ý*ùîRkU¶EàïRkf+±²¶©Sê~:­póó™~Æa¼7 ¤Ÿ÷ôh³¢¨{ëÌ5ȺöÅ“ö¿OÛi­¨{VÒšuÎ> Êÿ£¢tš4#ûOïÌ:ܲmÏíiî¡®0¹¤4Œ.Ýðñó}ÀÅú »éú€Ô»gR³ÌÏX)oú´~«R†þá¼ò¯×ü6E àjÿoÔ=ŒÀôãżv,Ï:@ÅÃûÖ#òFÝë³¼H±7NÓ4ž««jÁÃPf;®HÞf˜B˜¬aŒJé¤?6W…6´˜Ÿ1¶òu³t5‚.7J|¡‹VxÍßlÏ8ö*ï/1É®qrhÝÔ“G)² %|‰ìþ ˜^ãÔ{À§•‹ÜÑr}0úüXæþsü fù‰âb°Jk¢²¶$­Ÿ!Ý㓦‚,GÓŸ´Æ[Ûr§Ûk8ÕçÜÁ““M¸¶ÒkHþƒú]îï•Î;jîŠÒ«Ši€(îõb£+êK’2QØÏœ«Ž·¬Gâ¥ÈAa¦³0ye±õP|y/»RË|DGüœ.Ò"Õ? þé æ}ˆâê¦ip°Y»¾f[§`†+¬lº=/ªƒÄûïDyôÚäÒ GO‚gz8WH:@9ÇÖ4‡uìœ'b3™ .Ö t÷»ü97yY²¢—vȆìEÜúEégª]yÉ€õL(˜Ã´?I·‹Ú,÷Ô=Ì”§[€§gÄÐ\SìŽ&:9? ô˜*&~i¦lÓGz¶‹0øâÙ ú½0iæ.ëBý'¿ Cþ>Ñ‹òM ç%.jšÍWUr46%¯g„• ê)B¨‹8$2{Æù¨™‡^T=äé`–QÝQ6„Úõ}MoµJbƒ‚õ‘‡‡e…UV#¼]N½}ö¤‰Ÿsݕ֢3¯ñN;Žì-ê’ƒB¬}$–JíÀk\`¹8tÅlŠì9½œiA§`Շ¤B*Xˆ\KBqG5ƒ‘çq ™œåä~²‹3ðyàÀNP’ÝÍRüœ)ÿ[Í*n»öFÒŸ´¬ªÔä‹v”8Á¼Ž»¶×äµh=ònˆ+ ‰Ú/{ùnà ŽµlVŸ0†ò*ÙJ8¬ÿîªÅ½H±ÿvÃ8#KçiШÒÞEÅáU'Э0Õ¸é MeLÜ-ºADÞM·g»ëÔþ:˜r ÷Ù.×” õ(Ì®‰Ö´¡+L‹vn»…ï0bï¼!-ì½Ø÷ÿîãÊO”ßµ%++^õWBv0uŸŽgG©Ž¦ß ]¿‚LE¯oR·2þ/V¶ûgèO–ÚÖ«E²Šéè(¬PQ[h~@ô<Íé |µ—óhW é§Î,n4ßßàãE¾Ðüäm[~gþ‘’™Ä˜["ðN©»ó[?ª¤¿ß"|Ùúì¼´ªõA ÛM$e¬½Ae:ÍE¥Õel’d4ί°ì¡;‚å5õTÄ[*…}3›âE5‘ýl¿Ây!UôM~Þ »¤ÄÖî•!~!âr^e¥? ™GƦ͔Î,¡ú=ëJÊ¡´:Èážc.•jc€%+#k4q d“AN’Îå’¼Yoƒ„ž1D9èA#ùbèµÕÿÛR­˜ú­Ç?«»'ýsô­¦7tÍh·íœÿÑ X×°zN0MXÖòÆx¬Ù=)ìç‚jÓ5±‰ÓÙ³ù„-%G©nãÉ9ÐæMÔšUŚƆ¥Â·ÛXjæVYQÔN~ƒtèCò´¥EòÃmíÔ½µëó Cdø½ªŒº’l—±j}Üiç˜kÞÁnÊÀpRzvÐËò6ö°Z7ËhG5çà¥ÿÁ‘ç„?¹r©ðöÌ‚ÄÍ#>¡P;h-à«îHß6wë°¨JÈØÅ[8õû]ßF2Ô:š7Ù\ffO•$Áí¯ ¦½uÙÙìÍcKh=ÿÑì,t¡ÒÀ¸cœjÑ7æänÍ ¼%idBçZ.^]vqyè±é÷Á€×FŠbÆÀ–{A~9GH¬Á'}GÑxÔÁê'ö(>?i÷·V$X¯yJ¿šµÛ]š"åðNûÍÝ÷/œ ±éJ…´Ž•± 0"b}’* „Yò¢ÈN-΢>#ÜE[/¦buµN@s„©í5X—Øö‚žð»ñ*ˆ‹ÂÕ¬×û~âÔp–ôÀÌåp˜F¬æÇ϶“ò²ÆFHôi¨²™s’y‡uH·vT·½¾$ùC4…OÇ`¶ì¹Os¾â‡Û5¹’È©“h‘Ò³¥D¾;6›]Jט©w¬ò;6™‹ÚwBŒt;дէ€¤u óGp¦/æÜ=vÏIU—_B]¦D¾’*µ"”ysÁP9AöšeÈž²d»Ð–­b:’õÎ6±#!ṉ¥L@©a§Ð°ßy…xÔÚU˜ZWiwHBt©„üš¾ŒõqmZ9‡A†À~ü™¥Wç¾às®`vå+ŒzòlrëÓ^EÎÐÂiʧìïÚÇžHg•öWM¬S7Wüi/—Š¦Æ¬?jsæ- ^…)g ­dO Žkæ7–boŒLQD4íØ ff¿VEt µÁcî]‚u ñ?B5µÓr:C[Ž€6h”¹Q¦Á'y†UtàíakŠÈê^TV¨CÔݽA7€ äm„çR¹lŒ¾Ë÷–Í¿æU¢ûÙ#´îôxÇp‹×ºÉ•\„(±%Í@P¦´sËÚö´ÒЧã·ñ–Z†úçùäÜ¥Qž§DWX‡@ldÙÆ¤GØæc¬Áñ¬~(›C]„<+9À„f–E°J±¡^¯Œ ‡9'•MDJftЭVUFÍÖ©¥Ù66ê›bpZMQ½Ü¡Ë}¢X6Ûy$Æ¥Àͦ ¤ÐÂ,V1ÀÓ°.EkÀÚÐ\ðëéñ'/IjA×EŒ³ÄÓèOÎV˜´¸mK;÷Ÿwü§¨1I(Flc¯<ÍG-Û <ìÐ"ºg! rtä’‚.ã7¬f_¸¢²¥ú±¶Òšy“v椂Þb4ÉgJ9˜¾™òÇ91;£eÕŽ/  âzG ÚÏfFYá÷Û’{ÔïIGóÈ^•uQ"°,[®¶/¹¥Ä2þi`ïÆäÅ”,¸cZU×€è.­Ïu©‹¡áÊ_—Ú>‘{‘­m~ÁŸè(JUq–Ë…-C²Qžˆ§<¦…<¥ò£à~â…‚0ØÞnçãL"Ãñ#½n~ô@‹‰XÔš¾‹y°D›vŒ mÙ÷²!Ð…“Œ½†…ÙÑHÀYoFŸVj~aœà]W‡8zÿ(QdEnG ¼sOòÎŒê·âMT\ÂEW?°?ØŽ.¿%¨‚«$û£¯BáÚhT§í‘óñ1˜‚EP³[LSMÁ_Y—Äï‚MR㢙„ýɤ‰ˆ¿ „žl5Ö%4îÆ±q9öb> —ÅÂŒãø&ϽíüÆëkØ’âøÏöÂ1Pãß\ù¾©yõ˜Œ0jô¼Ÿ§m1[ó?¯Qˆ\Á--\åZ{ÁWaQì6Ž"èø¹xbI¦ôï¿]œ!(‘J!1=suLgìI›|ì»#þý¶[Œ”œ%7cfbâ5ý©.åßåØ[l2\ßÀù!qÒé0½ü&oR#/·éþ„‘jñšqèÃK¼ÅBž9BÚ×_|EÝBý¾ÆGnhþ§‡döÖ[Q8 l/i"Ôè”%7Çó㡜pÃÖTnàE¬Šµ¡ÄLº(ÛÖïCIp `"dý.„¥ª„am¯$—·YDT.×võAFâ‡KÔüUèîXÁĿ٠\q_W’ÁþV_ûäBñ3ú€‚õÈÑÍ“$EF~pj?újÁ0À w¸Üj7-zœÈDÓhw Ë†œoç ttËý³c¹ª[Ü…×$Ù3Â!ÓuѽýqX™¿åÁ_©R#0;vîî—”9f¦µ[÷üµ½ÑŽÈŸ|•øY§îÕ0Ù£@s»¾ý?決` ŠêyÖíÉDX2vf f’mlçIêÕG ö6I@Ïy4Hœ‰J6¸l¶‰gb×jîGÓßÿЛK¤›Vö;v‘C!×”CCu¤Á:çÞÄ­dÛ åyU"³ºFίÂq¡Ê¬+Èö?Àúoqm~¦0›„QH].¢«"b˜èžÒ9gM,lÀ e×Bs´ Uèz,))çµ~e>(NS£L):ú`‹Þ p2NQ³•¼hüoÖå*_kÖü¥T¶Â-ѲLŸÔ…Œ+ ‹Î>[ ŠÎ*3 4XõÖÕcޱe!ïÕw†32—vòwÇø±¤…ú0Š·L[‡¡?eCá{Qb‡!ð•æv>5_b©«cû 3œ¢ÑÆYm„ìüDŽU|¡ >‘m…«¸'(Ï#.7¸ÑkŸJIÛöìO̱ٙêö\å˜ý„Šs-Áa¨DCµOñïåyàÇ µØòæåðtàšB,š±±ÿ›"ƒÇ›Œ€>kN `AÀvÖÀþªbhæ ‹°pN™ÓÝ(ÓKéñÃnÓQ0ë¢p¼dÍM ÖrÌê!‹6ð&¨†K×L¬ÁD§³ ÆFWªýåä¸,}=ÃÕUÉ^]<7Ûp(jð$›,¾Ö ž€‹ ¡$šö»ÀÚ¥ö²“–é<Âádœ¬5/ߥ?­Oß’í|ø®ï¬·t…P¤ëº¥3ǺÕ;Qа‰¯Q3aòÌU#Ãç>„¥ç P¼ÁîÉwèýìÛÕÌ/šÝãÄw{Yø+^A; ÿ¢«);Äõ% Nã¦_$ÌÒž³x¦•RœW¸êƒ*î¨>@ëÚ´Š[º³à&ñ©HÒ}ET~Ÿ—pl™&–[ÍêÍ.]Ôþ^¾Ê¥Y+ìhÀZTms*¿K‰g€Å…µ«D-»HƒÀ’ù;ñ°\eÊv¶ÎßcÖì™u³›ÊKï5¬áö j¬8©YtÆ‘ÚI"ªá@Ú%o.W¼mó‚êšëžÐõÄŒÎÊæñì©ïŽ!Ú/_[lŒ ×Ë„XŸ÷”Aè¤Ö€:|l*|Ô¦a a‘j‚š€ú¼:QÈÅ~4Rž¸˜–KPî, ÂHõЯJ¸˜k»²`¸3ªÝðÿ~À ¸,âíÏï^ÔX3nN…u¬+££¦$ú Œ F +óšñ{Hÿ BxOÁ°F îU f\¡1~‰&3.„{ãÕ…àÐÆ—šœõÐfêÑ÷iL2Í(móXˆŽ¹œÃC*E°™Z”Õ°™Ø7ùþì™iç;Ä´Ú$ $RêK4ÝÝߌã+¡ê&S¾¬þˆä ¬Óà¢ÀRˆ|i)ƒ©&)RßWؤ hvU)xˆF³JÜ3˜k¸¬HjÈ€«d.<]‹–>ÜDßð¢Ì·¸?;Š¤ÂØrÕPÉj‡šOgìâ©KüSñ|ÝœÒZÑ—áフ;{K³W)äÖ~F_Ü[ž焤µ˜‘vyo#é½°Ž"æm hœ;‰<“v¨BÝ «p0Lv*Ë=„ܪ¾ Õ1·y€üeB#òö[©açÁD–ÉÐýLOsJObõ7&æc:\ÝÀÚ3¬è>ž>½ÔôÒyg ë“pb«ÆàUë®’ÆQCºÆ”Q»™ø¹QþÛ€«ä«±ÄA» ëÞJh†ñXÇÑ0ŽMe¸Ky¼uñï<샩7^â+6ÍLèãÖ¿"2‹//ø¶íyŠëÊõä6è›Äò%ûxj?`Pµ_jä…æ%ÍÙ°‚êçØ€”`€ÓHÅX-,sƒ6—B‰è»¢‘x—‹c–àßãÄ÷ˆJ›rÎ6æcûpN©\¶#côQoŒ˜‰Ô+}‹ÁÜÉ4D%Ž‚‚n ¤ Gâ 7Á˜Ò?\žIê–æô7 b®: †{eºN–~ÅšŽOÁÓ¯¿0áúZzãF înõušðÒãJÁKúùî]â ‚Â3zý†ï…Õ€f†œ^£³²I‡ÖošÇB;q‚G€ŠäI‡ÐÜ€?ªY·”ëj’ãö-ÊX›°£oãª'z‡5LŸÂ×À@(Ï6“€'‰¦'NÖ‹&}T?T<À.ã¼?ËóŒ.R£‹¨?»íyÚ‘kÍš3&ki†ä?ˆ¶š$^Û:ÔBdÖŽð; ÛY>=ísc¯ª~þ‚zl‰¾-Q¸ÝfÜ{¢4PÞ¸—)ö܆“Џ¢ë?é)ØI ]A )\Ęßdöú5{{Ï©;²oõ6YRËÏÀ ¼|gwAÓÿôfšiÝ´¬×Y=ÉTÌ\|“Y—ùD:).[z¦Ü8O[eg]§HÒõ¨e|·ë—ý-t%)©ñ¿2kèK†hA¶Ç¦|(·ŽpYÛ¨7´—³/¯ñûuÒxÀ’®ÇfÒXUðñòœó¼è8aòFªv88ø?¥÷Âi €î41À¥ÑŠÑ"÷òøˆì)‚¬£_†ËOh°)zéDiǨD U¦òéõß³V_—BYRßÃY¡ßôxMX¹a·?'œÁDŒA…|ìyä–ôWXhu¸)«¬ Á&iÍ&éˆQfg³ïs*š*½™—{õRóÙ7)͉T®ÒתH©·Qè^‹ˆ;+?'¹q°Ü`f— ¹4wo3‹75]øš/#|JJ§åk¦­#Uç·>Z :DÝ™S&S—‚ÑÕ”0@Ó˜K»Dý‹ÏÉ4´'e<…ReÊ ¬% c|ó+e Ù³ªo4ÔsqG…×u¡ o“hut¥Ke ÓFäÓ¬`Bøp¥‚í*AB‚›tFY„ç#ϧ£˜=Fz²ût ûÉ#ßÊS)b= 9¼“8ðHxu+OÁC¿÷X½á´-áR-yRú²R–â(´J£ùK\RA[CpmÔd$fêñ¼€« ªßHï¥Gx æ’òÉÑ?ÔrB²©ÐÚË~Âí¨ã{ÛNöô¿£9š•X¥¬î2£´nhhÜÞÓÄFÎØ#“ksÛ ëA?ÎØÁõ›VøíäËÌÇx M¹Þ¨Ï©Þ¦ùï£òuúÖÉ!œº¡T®ªdÙî—ôÁ_Ê»G#Íãä+¼7Üg³`FÎÈ웜,«'T)Š2Y¥3s´,Jßq¦æç{—ìêsu:’"N?DŒ•Áøk²4›‚ЕA€ ¤vüÅÀQç­ˆÁµiåÜ\½«,÷êÂàôŽz4 d©åž“V›öÛýmø±ÈØ3é&ŒïB&Ú,m¸ßJùd‡ŒŸ«¦wq|ú)Æ-Ê:ô (ÿ½ ø—Èš‰íºW»¥Ö+Çý•…™3ÅÆ{-±Ž¦h-u§¯"m á•*ŠHõÍè¿b* <)8;.%vma†EÇQëémû&ß¡‘‹9é¤ÿ?BèF:‡L%=—^–7Ñ\ÓUŒcÍ'/ìÊQðlj[ïg+ãi)­R½u©U…è ½u3Ç‘ùQ»}còȳª­KÊSWFþ’ÿ}aIðNL`ÇXyÆOüA—ç–€ð~z"Ðo àîhºYDZ µÂh’¡¦@ØqìõØnR|\ÆZ‚fgöórÉ‚œŸaÇ'ÝÂ’®¨¶áCú€"»²èƒÃ>$#Á€y­ËÈ“ŽÍêÛö©Áü÷"Ý >„›ˆz{+(òéž)·sÀ«ø†3ìÒÝ7¯û;ðEL4‚QHˆÂZ¬WÈþ`is¾MîiùÀ×Iœ¿í&‰…UÞQÏGì7‚÷ÕfrZz$ÓåV&úíÿ¥ªæŸÊÎM>>!¿=Tq‡`‰«°N±6šæ_’Ir½}e’ÆcöeM†&.;´é­Ö‡†d鸪P·ßI™Àò¤Œž·ÁÙº‚{¥X"í  jŸËïËŒäƒöþ:"xæžBüïÛÀgS°žµ"á±÷êìz7Î8Š\'•M·SpÖ÷Wv-åOhT$_Æv†šÂ1ÿ —»‚ÀÚ 8ú0´òMê°NÊÜ÷w¦b¡HÁK$F,)ð¯BÂf%irÎ*±†Áõò.ËwM¤‚ˆÆDpˆö|ô| VLÌžA„ç¥Ë¥2°H°Î.®ÞIøÀcÑ©pgszH—E2òB¢Ößœ¦œtîô„ÓºŒŽe×FÒ¦Å"f!ûA—8²’~ ³êouC7´K%/ÿK”/t6G‚ ÿŽ4Û¼¿0øˆ“gûess©Ð`Œ4Þ½¤oƒøkˆóa¡lÆ<vÕ6¤ [ÛVVÁAÛ*iè˜æŽWo*ïù&Ú`Ôÿ~#Š8Óý¸Ó­­Áß'Ù6§Â' ¢nT•ãíf‰}v4˯\S7Q4ÃwߺFWVCÙYoÙª@ð﫜\@(ÂK¤×ß$bÛtx‰Œkõ$ά& z,)Bôß{f.Ø:µB5Ÿâ™{ç ]ï­ß¤ñ0v©yÓ gåËÁ…_•–igý¨7¼ ÎC¶Ï°²~ÑZ™‡rš:d½Áö:ð…jvÚÓåÌÜ7.ˆ\…HU}Ïàî¯lÁ±ºçÍÜ/ah¾½¡ßÄЀè¾áyr3ø·ÓÊÈÖ—nÐòjíP' kË's”7;³Ô}È»™Î±­ð§ñ³&sɺ¶ÛÏõAÝ<’šÁï˜k­õž)E*rCRúö÷H7cPFÖªaeZBþ™HËÒqìh§äÉSÈö}¦L¿©M|2ªkŸ¦2*w!šýkÔdÚ‰¶Ðz×€l ³€€GÄñb>xOOõl<Ï.£¤°ÂÀohƒ]Æ™5ãn:–`‡„Xw&×[; ©ÉŠÉëüýy覦æúãñÅ&ìò¾!_mtÒ=¿óHîÈ~“Ò¡í‚\4+€¥WëMû™Dg'ýí»¶æÔ2®Pj¥büîÏi³ÎÙYÉÅÚ!ÝÓc7»Æ×™!òå»þ›]gE²Øbvm&@wûÌOK'6 ³uz¸Ó¶\!ÀÖ~™õH'a_ŠtøêhðJ™{€ñÛÏÁ|lˆÑùÅB4™þZ%… ψ«šÞkÀL¸0xV2ytxBͰŸÒ„ªòKŒ²_ª<Ù?­&+¢I©Çáz32ë?}WÓä7OòQoûyøØ¤×;3ó•pXµX‹J?ä†ï >{EÉVåô†¿ä€*p&á\7’m®BñÅ'>íz_¸Ç,™ˆOÞ†þ§Uõ ÃÝoõ°ÔÒ-¿èêÕnQ;(Ô«Å\·ÖÄ×< ‹¸‹œ¶5LZHy–kþ¹†Új±Í¿þTÌ¥ÅÂì!]S½Œ^-×=[X÷wï1gôÂù4´ÿêfÒK7Éqù c-r²…§Ž>ºˆ÷›X˜×I ?j©±£–­n@ìF#´»½X(4"Ľú—~çs5IíìÑ·'…`ÕÒé.+ƒM¨^n¦ëò#.Z»¯²"¨÷¡x!ÐŽý«ñÃÍë],€Ô´gò/{äsè7m}ºhìË÷n+4cñQŸð”¸º”%†Ò ÚÞ¦ êZ~»’±úˆ¨ØÿÝúË|ªSïÙÖPYæãoê<ÜNjó¸@±WV®ôÖ¤¥%iÌÎ!Þøœd†¥¥v³¶=™¢F¿ÿzÔ¨°N›bC9¹‡Eã˜[±IOŽg.èXÏØ~rZƒ:»¾`8䊱¿.Þò Œý±jM©“~¬Ó¹¨9…H¶Ð(è AôžHßfUÇl^w¢1 &¦¹_`͉'å`;ñ‘©#皪åx*ªˆ¶çªæ­K!² u¡^Kê&UÁØBå蟓ÕûÝý#Ê~U€N¢›hð'OnU)9éŸîêé+Õ$_ؤ +\+’ÊåÈ"5:>ÿ„îðB†”)ò§Å¡BÔcÚ´QÂx™½š…ó›(Ü`ÁD×¢…Öîµ±iV²ú.?Wð9Ë&„ @KúßHÓ0Ÿʽä«ÛòˆvË‚ÏL*Ÿ€rËПXW8Ô‡zôĪ0þ-¹Á²À³{(Û|,FͨIH0¥pˆÈiŽ ýõ¶éÀö”W‰Ê%ÔefCîMOúöWF˜z’Ý»Ž 8°>P lôˆCw¨Y·j;#};ŽL16þâš(õ­Ia¨œ¹ë"ͧéŽo?Oò¼½…¡ò·"·Bg©ã"Z¼™´Q±û“§›6¿H÷Ð]ûW3™Óó¼†e Œ2ëqvÁv–úƒ¬ôA!½‰Sxá6š¨ñ N­ÒXû.K£¾_8b7£òÊD亮Z°šñ&ÔÎçMàï—½yk·û$Ö^$`¦°¬r§Ëw±UÆÜ§ãðÚóp²ßiNknœÞ6[½æšc³ÌÂ`Ríãìcôª(ž¶>/–èÇÌ›åéKQfß¶¢)ï{!q&,9Úð41£î<3úï «áVv¸¯LB>¥ÿ,½ÄüÁâ©|a%!y†j'÷¾¢J…TôÈv8pOœÃ#r7l«Ž›‹ÊŽoj 2ÞC9 ¼f¬§'øw7oi×Ú|mvC€žü  4¸m¥g€'#Ûú°^¯_轉-/Â,ù9¢o*K\ÖNjëõpyul>… hNäèл½Üþ¦{¡<5Qˆ&×ñ¡±qíU é Õ{®kóCÁÕ>Eœ‘G¦•O¹˜…ñ.¡¤œä}ÚT‡È±ÑÏÎ óØQ¾*ÍQKúì’žw*x[ŠýŸ‚¸¯Q™YЀŒ‹ƒþ`Ú$U !‰®gr’iUq°0¾Õ˜ò-—Ð,©ÔôÎG5$¢ß›þFU†'—þI3³f¦wži2¹N¼m±¿§‰åñ 7Næ­ŽdR«Úr50éþ»|àá0|Àlü`€ª °ObÈy½€c\Åz &ÛK~œ6÷í´ãu¡Òö×'¯ÊÛNº½ãºŸ§W`‘º¨d]·Ý·üƒ_Ò”!3WCHv{šøò=²Ì@…|ßɾå2ð…AR5Éš¡†@†Éå“á)$žcº¹÷/¼~ªÃëD4ÍÆBX· è/—†58qÎŒ‹uWnüí×MD\Y¢ÆÙUÁðÙ¥X惺5¸xIÓ“úg®]ãCklÛë* áΣr-–NÔj‘¸‘5ü½@—üܪ4L©ÀÒõŠnÉè úz|©=?˨GôJ‚¢èÇÌ@Èʼn§ˆR’nÉåø1‰@£¹ì½ëŽð5²G'A8M‚ËÏ~D¥˜w,B%ÊÌú|êÀ Ïy$w,¼ßÈ¿Ñsa³v€sõ"¦žË 5}] röä6ൗNT<‚<ôp8*WãèTf[›‹++ÑñºÙöáд¾Çv :}ðYB%r›ÂUv<”E›ï—ËC³$c©‹rGÕ:^÷ †Å›MÀ󗢑Ã=•_{8Q¥ #ì<ÈãžÁ8Eì»5”B™{£•‡â eAG d‚¯DJ.ôC½ƒÍªï«=H–“Ú×|×=J{nw*²ë”—aÖ€-Úˆ0a¢á0 ƒ†óaäÖ \û•<Œ¦Ú­ ¥¡ã N´«( ‡ ô«ËÕaÃìƒò)M3°‘+ó 3ƒþÍJlzƒ=߯ÉR0eî˜ÏîÇ:¡ÿF«œße?¶†gtAwÜ8*NÄýf¼²´‹¦„©«éòùp®ÐM‡ˆ¬5ÞRT*ÊØ¬íxëBA‡˜ÒŒ¡'¥ÖmÒß .tô‚80©áû‹>ÿ«Í/¡èt>QZæI•™º10Ëô”¹'D*“ÆLù›äBjnŠ>I^•Ðõ dæz»;äÜóg*%‘pS6UÈŸÆÑº«¸ýå'›}˜·9¡Ã™m訡ßÂY«fÓ²øÀqˆ·8œ1€dã"÷Kô÷.ífËÀ¸–ùp”xé&,$¶rðòMé¿)”Ý¡H×Ö~ùßëŠí>4Ö%Û_Qv¶¬~0¨*×ùõ^qdéÌ™„Lôb#d£ouõ³*5X»ŸfWÞZ×Ò¦uV%èÕû£- 0õÁA“k `¾ëpjéƒpê½z"¢Èàˆé¬ï×î¦I ù—zýÛ¤××Ô°ý‹\Øå +ï‚É—K$v±_)êýÀ(² a1NÁšdTÄå2` “šØºYlj]Rßj}2Û¬:ˆí*|ìË5&|‹ªm_>'önq¥’›ÿ Aœü„LržÅ¼ä"¡Ì:n€6^JçËZ´H®{N##å†ß€$E{ÌhŠùÎdŠlÔm¤xŲ%öN<[†`ØÍ‰æa#ùdjÄ.Ó»–x)—kHJÀ¶‘ïÖÄ©¾…Rtà@³‡‡‡ÁP?îij/ˆâƒ>PT3ï °ÊäæUùk†?Q¦Ãêr3Bé¹CPC°–yÆË #»HøáÓ þM6—=Ó>F%›j<‡Ø¯»ýÜÿûE(\+¢Iîñ8B£Ï²ï6šA5RüÔj¼ÐšéÛôÙÙêÛ7ƒmŠÜf¡˜ž×Â|ý¬c¢a¹¼ºjîDIÖƒ‡Ó|’3Iª6WPRŠ— Ò•/ÈãÌmè-)PýBmî„á¾0ÔÊv®þ-‘‚|æ“¶ +â9]ÚiÖÅb÷0˺æ·xÒ­Ù¬$sÍ'PÒ¤˜úäÉ Å8QR‚­R5̸9›ì[ä´­Œ]Ùνá$•·tª[Í<Š.0 ¾JÛ®õÅcŸz@ܪ¨ðºRgÁ´žaÀ˜uw€;1/•N]z-É(Ü0C/ ù;Ü{Ð.'ÿs<>.ôéÙþ$r-º™ä•÷„¯ý«KYš…÷/¼C¯¾ˆšæ´8 Ô¿©ó‘×)ý¶çÐØhWNMÍÕr{›Ð` ALtøï!<¹ÈO¥ì¾DUÄÑ`Š~™QÜ9Û„ðrõùùà1Ъ¯±1ÌCÛºÒ‚µY^SÒgc>fD† Ť<] ‘&@u_'4Cüf‘\<Ššg¼ãð˳fïJGÈÆå¥>¦×Ò€"Y°­1Ö LˆïB§Åø#¼”\O½>Æàzv‹©sꎱ×,ˆ[†(&¹PˆS 23¹š]»€` ¼’üÜïõAæî -n8ý5º÷’]„tu·èbËó™f]§š÷×:v׃ïs”Œª3šLFæsž´9Æ)€ !Y¦³S5zÙV•Ý[ i•‹Ýzí0O „2L…[Ât_1îÂҙͱë÷ªBy[^ÓM[ŠœJçxÀ®¿r¯"“ß0_dzBéNëWç }°CþrE°àÂöS¯¿„£?ɽ†Kµð”þŽË/•·®Q ¥gÂéT¡bŽ 4äYÅÜlÀ0?pú#ÔõÊP»Ö¨èáVµÈ— ‹¤!0c¡†>ûq‚NK(êï»”öÑê:T ?É r'ñ+Ö.°£Ú¢«©G#m²šúº4:~t„W@‡À9½¼5­ej‰›¬¨gþOŒµjÆX `Q6T=â(QñÚL&ŽsÿDûåää >6$¯±,TæwF;gÞý$aÒVNjŵ7~ºSˆ—Ô»?^ö%ÞW}˜l8Œ¸ÑF.ƒh2&ŒBü $ÁÆr8Æ«ž³ÈÇØàÿ4ÃÚÏlqê•ÔÈlå 铃G½åbnöjdôuwöz†o;¾Õ”-KK×éÁ®–W ïMyN©üÜ¡ÕËZ@0—^9T@ç‘~£,oân_®]bS„°ùu Àó¨3Ȧˆ/>S FÜ/ÚúÄÛCyhÝC«X}IGþOh3W<C“×üÊv©â ­ÛëÏëêÇ|­©«Uäcüø”aÐ3Îk8vŽ<ý“W Ê4X«š,!¶¾¶o÷ÜÒ)•ê›Î%—ˆ¹vê]a“?UX.YÀ¸!·6ÝcȦV¹b¶qC±mV¥Ï6…¬Ø)¤%1öG°rc @sƒ¦v¬bèBN £Gÿ>ÉR;¦])34˜Fšs"¤g„uïÖÔb×5×e¤M-ƒä,Õ¼š*>“æÞ32òJj?F«=À×"¯³4q†ÕÈTiŸÉRÛ§eÔ{½f[ anݾƒþ†Üé©>Vø“šäð ‚ÚdŒæ-^£Ñz@] ð€ »ºm?ÚÇàŸŠL5e4^IÉ`!Iˆ&óL$‚5BL¤u]šÒܤ ‹[ÍY,bÌ‘¤_ë0ß ¾¾ðo[YáÏkÅh3ñ¸@^«*¿ÂÒç¥È’Ê %ʈ7$mLT}ZØb2ß¿§ß’sHÔÁð;îÀþõh¿@¡Å§Ê¦e °ÄIŸE:[RÍ),Up>‡Ã᪀ra_¬_¶–ž|ñ’x£÷n8±k$HqŒž}P?gÖ ƒ>¿êç‘Å«$qÕÔƒŸX/‘æO}U-©ÃÂoË+=¦Õ²Ä¢Ïž3ÿ‘÷Õ£Þ¥žhÅm+‡4Df‘jxò¼Ü9•Xv…2» ­¡Y¡ B¡oÔa?N¹”óö¾D¯õÄ+úE0K›9üôB.ŽëŸzyÁrX4©ýa>O'iÔ36¹«2o}¤‘Óy²•w§ÒÂÃ\a÷e„rf[-ø¸®©¬ËRW}MBÄ>µ{  ™ÒÕ®²'ÖÝËeðÈ_±2×H2t²Óñ~š;Ë£¾Ë°½P#1›Àz¶Ô•¯5‰¯5šŽ,þ¥G€"ìwŽÚŸÛ¾Så´uò´0AMoŠ×‚÷©Ü{_ðÕ9œÔ…È=œ¯51θbVPWüßá r…ÏY·u¦A âË!Å ôȵйž~ÝC…îŒbloÏ ê‰mw…jm2f ¥Ÿü–`Yw …#$Ì4˜(ÃúŽ2ÏÃ¥—òð¡Ä5ºø]R6ÏI8Úš#eÏÓ¹®^a # LØ0Q~ò£êu!2að±¶&\Ä@Ñ$à¹DöPhjý‰‰Ð6탲k’ß™Àa¡ü‹w( líµiM¶À,§¶ÏÜ­íÆ–@ÚÕ‚F!ÞØ@‰06áà…¬æq0JîZ)ŽHØ45Pt]”‰"œÉ­ÏYT?’S9ޤÑ}Ìh³aÝføËìhy‹àñ_†qéÓÎÆë„χo®ŒLû!(zÈ€œLÃçFΚ٣wäÈÑ0c_eÉgÌbG¼Ð%ë±Þ‹‰ÀõëÊá±äl-Z‹¸hMðÁt ÷ú.Ãõé¬lµ“þÓ«ž© ‡ñ–¸ÚÈë¼Â\Ãl-!õ²xž¡‚©¨(¿úýñ‘.[.òî·Ãÿ~¢È8ºáÌJcöbtgŸ-LK*æÛuiØ0ÐÅÿOUßí 0¯^¯WîöqOûãô„>ãMÿõyG”Šéø2þ`bôVËšaçü´Ø8òÄ€];$+ ºšÔ±ñ¤f‚‹ÿEO´•К¡9³0oˆ³fÇk8'‰$·¶´D’_¢k£«Ø»«¦ñ•xËŒÀS*gwË(S÷$Ë«\€>/[¹fPÛçå¤,)q²gyW^°5ð+wè N}wŽÁ5½åÓ *rcö<ñu›?ï ¢YÆÔ Óoÿ›êêÍĉ7°$ïÌ•ì“ÔpM}ø’üÉeDUb¹€W¾M&,×Ñ$‹þ¡×xJ1¨©â»D4öø(°3‡óÛôþÃ$UÖ;­ç³ ãS‘ÇÑfX9ì|jÉÙ¯Õ† @ÎËwˆåcÝ|§Ìt«!¾ #^Jå 6Ε ’õ˜ý²ìáq¤(ñ8~Öx–&Η¶¶ìpzFl¶RÒ3I (Þ|¾%µ/RZsjö/¶Ç „úÞŒàfÜa‚ñ&´[— ? ¼û£ï¼³Lêœ øxØ®Â8ÁEÐÖ€ç­CEq¶¡ßâ–ób‡%FZ/Ÿ-÷Õ¶0aW+K+žs 2çîÖ®aV©˜©u Ú¡üuG ÌecNÞrÉ nfú½å&5nðÝuâÓšb57Øò0ðs2[bãˆõ»ÚR¿úŸutñR'–?q1“ueéLú-´!¹ÜÔ”Õ˜•jð=ú®‹îq#Ô玥wqñïÎ Þ[;©>ü¸ƒÙC“¸B%nViøålÉg±ÎpkäÚüÙ_ÉYNGeØ}ÜûœË™ e§i£ñúË7Ã{ŸLm"è05ˆ…³lŠÒjb“â.µ§‘eODÄô>wîmz¦ëÅ_Õ¬yœAy½gGðp³*᯴]åÉ'…Ÿ$¼µÉ†Ö;ÁlžÐá˜x<'öîbŠœÜ–±ôJ»:!si×÷ñ$ÅSiŸòõ±•Ó0†žÚ–m LörLé‘GV¶Ù<—·(›³DÁ³Ññž4 ¯k—FŽ‚Ì©ŠÂžÊM2g~çÄÀåÕ¡_q« NÚãW2†P8Üq%ôÛy öÇÔËä{úXÉS‡¡6”ÓÌ‹5t]†ä¨Þ€RÐk"HQ#¸ÛXõqz°Þ;å.Íj(¢¯àtЛ¶‰Îm,xˆ ix¦0Ÿ®Mk¹—=}ܾH£"ŸH°C­—üŒ´ùéŒ{£$ídáF:P*jöl˦R­ÙµŸd%"/k< ÈïX§Y Á OH¦ÎD¤”Æÿh`ÄJ4Mµ%}Ë7ºJ”FžS$U±ÂV´Wù"Oü®¤„ f>Ü‹¸ÇÛu6ù§4’ÚûD~ñ^ ÷<Ä #×JµœÂh;!©¤Eð€"Ë#®Ùi%¶KÞÕ9?Ët:ʉ*ÑM k=#ËìjÅ½Ï ”bSèB±×WjR…ŒÛIiꀇßÒ0X¦ú*)/^?´Å)ü@¦Tɯaƒò‡8²§ÎG/{]tã}É&W_¡Õåô1¡a®­¬„_TPà @Hvº´ã9Íé=oOÐr‡ÓYH˜BgJeYìiò‡”c‡8n¿œrÙu§9]¦ôõx™9ÊÀ H.y™ØÑ˜™ùosÝ{ëÑ6'aø‰ÅªfÒ|Üxú].‰q‹ø7:~—ßÅ3¥$F1ixDå]gD¦ˆSš:]ŽÍ>Oˆ–*íV[ |¡#Uüýµ‚2”acHƒ!£~ûà!5£®è&ÌG jL½vT².‡!ÌØVïé$¶âÄÐ6 Rõü6à¯Æ#Ikxß«h ±Oo¤]oÛvCúôBÑCm.çx{&Ò¥«Ä†ß *#éR¬kçÈUÙÌ`;¹›ÿˆ¡#Ó$ÐÃî²NGÏ7ÜÈÉVÛ.«Àum.må°pÔ,Ë)o¾tkFVZ¢š×Âl]!Ò®M$¦ÈÀ&#ÝÏ)HG¬©SGï'Kò¡¹ ˆÕKñ.­ÊO§#ü™Ÿx%%AØ;Õ†`µÿJãòàUüfª1ăqäÓÕ e5½in»Iª?dQœYg郩ïæ\UÁÙ*_m•–³JÕð¬Îˆnå ‚(¬¹µŒyxÖ··Ô•…!‰ŸBn­'^ÀèÿߤÚ}véØ&%RÜŒ`{+ê”jdT‚.ø"m< û:˜~WW´"ö2ƒŸ¥Uz„Ô„Ÿ rD ñ9ƒ™îrÿÖÒ«Òü†®_ÖÂS­®:óïÓß]ù¥!ØLÀ*ž>Ó²_”…xqÄ%؃¡7>iŸŸÝ1öª#¶!Hrl¶Ì'€gKø5Üwäº8x2-9$/µô5ã{ÐôJ7é¤䯛0ð‡S¤}É+>Ÿhš ¾MF.æYezC­è$u;L&4òQ»²§‰‘ø[26^Âuù+òåÖ„;دáôB£xò’$«¶\hIpTõïm£Ãwµ3i¤§‰Ù"`×Õê¼· ÅnÙaý”¸²)±j³·e½J¯«®cþ5úö=ð`Ó0=úPzù>¾.Fo­Ò™ýù¡‚þy/P­ ÌžHfuf¨+¸A 2Àë,åþ U‘6“l`—[_ÄŒÃb•A’æ zïjm›Õ7‰Ø×£A¢““,lµA,uv0×FÈ~ßóŒ…ãÕzibî󇉑sÇÈ(Ï—¾Ò‡^J‡òÁL²½µþož¢Žr3R·Êä£{á%ïúrìÞYV¼Ñ6àŠfñAý)ew¾»Žª¶I;‹r/ò\ý@?"] ›Ð_ÈaJ”7Vó§ÖÙ¨6¹mö:@ú<8W³ŽÞqw™©•ºä|уk©\&ÂFÖ¡îgrjB×qÂÞmw0ø•èÛµ[Þí«¼7UçPí«?è¤}Yᬬ÷ºLær2Ùˆªô˜®Ï|D´¿¬Ó­Ëó ÂAÜ6èãœBV”ÓÂï²7"Õ‘ƒ(ÀG ç1æ«“¤ØŽ8_0sF¦`‹ª³;’E­ÑøÓõîvŸÚS¦æ$ÖF”6î¨-éã›A¸H*ÙqÉÏ <ˆ¥~^_ØöÃ7¨šáD¹gShj€ªeJÖ+¶€Wc—YtªÂ;Ù)Úô§ú•9¸šÍ`V!Z²MÓ» ™xsZûc –}ó­HW£8›‰È}ö^¬è7]ï®oñk–ý²ÝÇÎ}‚-õñÕÝp–Öt=íD²8V¥`#MqëSò¿·ëíGùÚ€&B?ÍøÃ”æ”}¢†ïÍ9š‰*âù*¡X§ š—ýc×0Õ±ÁËË=…SB JóZˆH(Æ/Zÿ²5®±ê$ßL®]X B)çGØç±¢:¡èj,¸hì‹ìà@~€[‚RÁiþfz¾«ñµŸîPôÅ kxáj Ðf€:8ûk¹æWÛ˜Ã7š³ùЮ¬ƒÕbI«KO¸øË‚o)¶ÅÑ?ã˜38ªCÆdß뚣¨áÿ`ú’–aORotÞè$KÉ}Çö6‰HóáfÚOÒDV,Ɖªö’ @ƒp%³%—ÕLi2“(€èZ2csöx¡hjW ý 丗€òÊÖAð<óò§õë{_p~SüB½DÁbªœ¯9÷@¿›ï!„)z­Š†BàU‚øc®NãÞî†SìÑpZÃyôÚHþ“&KÀË“6ä?a•ÒÈŒ;õJénb­ß|å·ÃŽÙ±I°t…{+×¶ö¢Ùè ¬Gµ2M¸_ˆr,ëo/‡4×Õ…€b ö Ÿó¶@IJ««©¶8fÜé*ço[ä^ӯ°‘“s€;´î•àw_ŒIžˆ¿<*ϘÓWw‡2]¤f~N¾7ΗWÂ-Ü,ñŸÛGäê§ Õ¸¶cÃH”î(9t7†èH ˜õ»»B˜ùe>Ìs‡TÇ@©jê¹yTärF¯Mþý°'¤~^žÖ©¬?lÙÃÖ¯3HÏÜ¿ª#Š(rºô7z '_ð¬‰GNøš®²ä¥lC(ïã{G"¦‡Ë3ïÔ©×ÂZñ\þ?ו–MrË.ŽÊ©ƒù’lQ2×9“ü.yK@™srñšæÑµŽ”ÏN¼B¢c¼¹æ‚™‘Þœ2[Iú\Eº ë¹>Ú¢ÖäÞ_ׄG|Bé-¬½A•ûÄ0ˆ‚ü>ÖWDN£èhgôÙ‡(ç¥<ü8±0÷ ÔÑ<€ñÂÐv¦²¦7l X¯Sü9­b™Ñj:û¨?hÏ)œî’sc õ£¾û˜h­„„”äz¢efšçäúèÍI=ǹٴġ˜Z?tú¾Îb^SÊÛPk„•AÆèጢØ»¢ˆ†[e´¼’Ë„¡zú­ {ÌEŸÚÝoÁ4l “–þ»øì*Òh×S·™-šç(öö{Yì¥]ý€f$DÚ€lõÛ¼V†Ï¡l·xÏ5gÙœæz¸ÿ&û§-o‘‰}œäLÅ\¡=2ƒxt‚”ïg0v»cö§Df¤è5ë=)ûŽ7¹tq¢s•·t~h’ÃÝb/ZÓ3÷W¶¦™´ÌhçM øf ᡃú´d?ì7,Áa³HŒ³ehºE/Bpœ úâ3ñ?Ê›$KΘ Çå]§¼é+¡…‡As`n6ñ‚>Ìä×F#¿È€Ú ¯ ó ¶ô:‚ú^‰ª® S¦dë'”;¨‘f¹ô2̤±X¿®„çé5Öø§&/®ã“½ö´¢bm<Ê>˜éƒQ]íÉŸq”û¿ÿ/c±¿k;¿Á%øò¢×,©fØëdTÇiŠc)s¦Ð$ØŸ›ìRòÏüb-:;í†j¶µŠ2•_œw×LA­ÚmØðg½ÁùN¶b&ÃTåþ}–šÒ«¸$‹hw vU¾ƒƒ"m£Tã,‰p_ ŽpSþƒÂQH,è¼3elš3Ái߆Ø/"BE·aV ùé«ûr?Ÿ ösö9(Õ+±«Ÿîƒ0‹ÕË’qL6®âl`(µý~AæõlVÚó'¡d1(]ŠÉÌ𯱼÷6ûÁ־ȱ†¹?ú®¶ŸXi=Ù7>¬ ”Q,˜;ÁTT’úêŠh÷œÖ]Y hÊô5lõF¬N~¶A”>ˆ+;4ó%®Juß&•$w›û}bþ@G˜*4w|1¸¿(pÚÝå·ÞW‚9j6džŽµmPͺâ ’ökp9ö÷¯Û€ð¿ÿzVÄ#Æ:„’ð]#rD©¢­.A6ÝÌåJiöJb¶ÏAª”uV½.­}Ÿ líP`§ØQ³¸iL³I ì\ãƒúÍ^í¬E”žÜÕ{Õž¢#rj-™[ð6òKê–¼¾Z¶Ú‰i\çÙ[u6± :‹Qïî8bjåÙn‹Šé?_0‡µ—D\ÛX¨eJ‡¿qµ´/ùXÊöm ‡I^Ò`™RÆ›ÀÚd Ñ–ì+»˜½§¶ÑÙÂë×µÓ6ÔÖ³…=zúQÆl_òb½v.Ú. ùé‡Bê¶w§¯Š›»þJŒR5­»3þNuÍ9=’'&Ër'/¬‹gžiW){ÕÉ Wà yºÀ™~ñ-o½<9,詳쮊™w+MXv xy̓„ûî4¿UQ‡‹ ë>·m.·]4 ¬vbëÝѺ+HpNO¾ªJ‰K¥µ\¤ÚtakcÃv«ÈÕ k6ÅEiM{›â²ÝKJ ¬n)—ú뎳†°jÍH7Œ²ØPHÔ4‚Ï7~.µ³F®‹1˜wbqú°5ÝóÊ¥k4u#OR2;vØ„æ A¥Rr•Õ`[ÐŽv¿ÇëZ=ç]Ïm nKOÒú31ËrŽ÷™õÅqÑüØ ª`߃⃼¿i®#.—Ò2ö%#1«a0¸³=[œÂY+à«×˜»‹˜" f‚ˆ÷ñ»3îÿ1܆{¥³+w]¿ 𽨑¢kE=ðº*×Ä)ò7ºR”²Â@½7ÛãÀ°pŒ¸r¯wwPO‹WSk.€±rؤ6{/+ý C£¾ ƒ×ï&¼.½3qêM»kcB{¹?/â·:Ì R…žÌŽ-T€Tö%ò1 ªl2››4ŸóÓ¬8Ku9ÕS‘掄”ÈÊKçŽoÖ§&4LÝ ?ÙÑ2QêDW?4¨Ýà2‡»PÞÈÁìA’Zä›Yf¥wö¾?†ükl–o°cÂëL KB –DCð";Õºå’%±9´êEŸ-#vy9sY+»»jQ‰ÿ‹Ö\N$Hµž«üjìfA†xxÁÑ-šÿRµüૹ&ê¶Ö½R{Œ]õ7;Ÿ¹M”õ8´çÓŠgÀÃD°öV:ö÷LÊÃó,X¼X©ÕzÍ£+e|ñƒ½Óre"½ì1q IöÓE ×cΪLËR!=b·:‹˜@¹ÿl7ýQÀæp¼)n•ñ¯Í/õ3òMo¯E¨½èÛQïxTwQ^£WêU„ÛÒÒd¾VòÓN+‘f»’Š{)ÎÙ&·¤•?¹F÷¯“BžƒÄpöd]ÄYoHÍ? Øh%ŒÍHÑaýeñbãÞ%¬1ä*ÁaÞ¾ÓÔúû¤H:ËÐg®v@ʰaXø¡§6|d`axËÙ|ºýõÄŒ·˜Xáòÿg/ö õ§l¯V!S–„dGÊ1Ä´XÈOÇÑ{BM·LëÏ(ØiËlL |ÎÂKº€‘F²ìimáÄá‹_™ˆáJûV±OVÖXß5þ§üݴ´eA隥Çç‚ò)¼Üû™5xÅ ë ­ÅüØ«Y:v1PµKL»$œMœ¡=aö½×¾€y÷´: ÒG1 U¢Ò<ï®Ìª;Þãd˜ê£rÐÊYE×`d£þÅ›P³'‘<é«ô¶–¦˜dær§OÎÊüB3ÌÉCdI:[[0  g a˜Hô‚… Íü²…FÁ¥{iÀuÞ–†Š ÁJ²ä{Ø"§ƒ¿6JÍmì¸-ÂdÜ>TÊ>«¾ê‘sY¸.§ê~ E1;¦PÝƖÀÒž«°_³ ƒ|À]#¶¨Ýäîa_Å<û¹ñ0àb\Ü'€`ÕÖtêDx_EÍû.©mâ­áïÈCñ ŸËoÑ–ø`‘V‚[}®~Þ{0ZŠ"™—+)ί&Ø` ßË”øë½OÚ\¹L¹¹ài6¤"³ï£%“\þOì¦Ó„X–j’Cc¦`(ÿ†ko+?”™è‡æƒzRú½3 =aíù}‘†B&4ƒhTÉ»sÀóª kÈF²“.sÓø+§={vàC<Åþ8§`ÕóóTû»Ý´Q:$0È=;g@:`ŠdІWh>òIœ)-07…T ÿÛ îGêkOkÓ€UqäVi)ŒæzOá’ÙbOvËðšu±³\Ÿ…UIʹ`öLÉ8¹Mn^)r?"í ?öúLÏEÁÑÓþ/þ²)wûè3,}µê|±¯æ£D°1Q>is~Gˆäõ N¤ØDÒM×§Õ Òì{UQä¡5À„÷n,åº?ƒÆF…ç³Í*hàBŠM›W‡²¶ÎØ~úwˆ |Alm—X‡w¦? _+JÖÓD2õVåûå j|ï1jxT<áÏñöÖ.á¬/w÷ó÷ÀwßóCÝ\P”©g¢ë•¥”¢ÂƒCcH E_L‚);‰së…_ ~ úraˆ\ô¯§ ÉÓË|UÞWa–¾;—M"„(Ý/´H™U´Ü¦j€<Íþp®X¥âõuœ·Qî>l(gJ¢ÝBü³`ôXýO« ’!KR ŠÅp_xeeÈÖáéÕWÆä Cen……N Tשׂ¿% _${S,Âî4êͼRÍóàR3çGOE0í…‹LºtôèEêV]à?kFä|k öToÚá—o*I šº£GnðçK4[=ˆnt÷xÐ(kF¤ï¯Æ}^¯Öçª^ÿÒZÐ0«Dc =Lùz÷am¼I%ç*™ÈÊHfCt= Teš‘©+7f{Š1÷bVÑà~õ¨J†2 p˜úóv !ì+ ™­æ³½¦!~’D­ʧ‹ufôCe”Ò?uîÒ¼”Å1›ÃUØõ®óöœÚþ<–êT·Ó…Çx»\p¶­¨n³dÜ%ã{·w/C ©F"Ê׬¶3<$}±ã u mWAûNqÈT˜¯Ÿw’o 9t<¨ÔÏãa‡)ö¯FÀ·A ó*N‚âh¡ÐÁ\e?‘x|JÙ£:€n(Ð8qe æWx`†üy §ýš}»0¼Î£ Ä à®¼èÕ× «Þi(ûbi ¯×·!…pöo¬[»Ymilè_ΡmÅ{ód®w?*¤÷ÐÄ”…X²Ê<—¯+€àn×~9Äûî{·© :‹¡'ææI%Aâ¬pqt¼_BM1ÉŸAÿƼ´‘ɱ5Aƒ6_Õ;;Ä…Šö¥h3/mרáìæiåœl—-Ç0 hO¾uºƒ\QÎyamO$}P7IµþO+R—ˆ3ÿ~L“L± ¹xæÊ` ÁÖz$¸hùVžñ­c§·é,1xº@ÈÒ2–¨ ¾^Di"¹Ü’àé²ÛuØ[QïxâëëÖw¨gÅ”wÖf-dþFlm,å%Ú»WŒCE;lùº."uj:ÎIƒaz³Eà8TQ·ô‘7º’eš ûñçäþ»¿ï·:òÚ8SIg¬Òß “þDÙRJô¨ÉbÜS;1qÀÉåKm èK*I§K 2´²¶tBË|Ú[QãߥÍ2.È¡îoÑèå wùú„¨¼Àï²®·URzþkM59¨ç’Qp#áU^gÜä©4ž%8ÖŒ&gùS¨Ý'·ù²¯Ë|Üö8‹b’À†‡IécŠ +œ¶%¼ÔЇÞÜ®£B1I/{Ë܆WQÖU «,ɱܦ“9Ýœ2õ“äli÷šT7¤u¼A¸b4YD}8‹þÛk¤ò³玭SZË‚ÝN„fæÜXº¥M©‘â­b«°I7tP!° 3ˆã{íŽÄv’º|öü2™×\"4ã™Íý³2R+ÙƒgGÐc¯¶³Rɉ“ˆ»;¡ó–yECMvxªEx¸нÙår-ä™U<:¢géa°Ð•l·µCß1Jw&Ü»‘K>¥“1ñ `ø?Ù“ÙX¦ ½ ]xºäw?žÙÑgFUò¢w%ï&æÈoÓ£unå>ÆB|×¹Jû^‰Mú*Òx¥Ý“'¬bô—" Lýq#¡-¾`a* Ë43$Y4³)´>»œ$B™îé/íQwÛqº o´Ò;×Î-1 ‘œN-´CjV›6yªïÖõ~¯UøDqPØmQVtÙ{´Ç •fÖµ9^×Ô[ßOІä {ô‡z®åhDØv¡_“=Õ'½ÜlÑ]·ÆæóAŽYëm¼sÖYæ×ÿ‰‚M_3’¥Û/fÁ"#fS<µœé$DN¦xNÀ€½U ×4ðN6n£Ê¦ÁÄ? ¯DgRãö-ûâÓ<ŒÞœ#£eéi’Ò+†¨Áô·ZÓ8ú’’?ÇUŽj¼Ö-ÎkYÛg$´ÐÓWÇŸ÷áwEáð‡Ô¤[{Ý Òæ¨ÅãEÝnÛïê3\:MzÝÜgC‘ â0œ5m ®Öj»ž}ä#ð^›–ci¯DŒ©JT¥§µŠdþÔzúvâ¬^D4<ŒE§iá ]Ã,·Q>í*M`À{bQêÔ¢=3ù_Œ€ƒë ŒP2S\'-ð¨‹çjtG £Eÿ à^`†œc›ù/9×.òAÁ DtÙªE• -|G=nôiBhçŠU-Á:'çÌŽÖ 5fpnµëíÞIbsD³Us¸Œ€Ëbé0Ìû½CÛJN?,Ü@ÑêØò7(L«ýÿ10윥˜mú¿™N~;í+I¸|î@Ô»+Ìß—Õ „oóÏ“‘1Ÿj佡NXÁ©]Šxžãýhuè¤Ý”ÔÙ¼¶é ¿r£Ÿá“ÞgúMÏk%Ô·¬­ËºQÙçÄU"ò¡ã†Ô)x­ÎSuÀïÜÊ»”Êb76Yåm5°Ô±ç˜o¿ó+½' KõóÎpŠ.˜¶N'F; JõŒmhˆÓÈ­N›bБhßdÊãá/\ú!§»’ììÉ0o¢`5Œ‰ÞÂv,úŠ^7ΩÛ~¨×Q¿w1Çê 3|X—c=úÅU ¼BXV´Ù¾—'b2¶Â] pUÆk`m‘\=U»EKˆ4>„dJ ã®/Ax*"*)»cm$—*r’×Ó´áA c¤pö6IèªeïöS¤çabã=Pš,i.! ä4MxêJÊ …yß^?ÒÔCD¬nÁûáó…ç¸nØ5´zÎìjà§°À-„»fæTib–iû÷s™Üh8Ü  Ój™I^KR›RGéíW°äµú8ˆ ñq8‡âœÉÑYðÅi½MË«±Gm­ÐÝ€ ›ÅÙ‹•øJ™O©‡áÃ$Áj!ótðošuµÞë¼r©åeñbµŸa›cWí¤šÇ9ÀcÔRx1}/!|]$¬ÈÒ椉RÞ’Úf{™DQTîÿ~í%'\ô$ÃkðLZÊÛ¾š_Ä¿þ;]X±+ÂFŽˆ$6n°½gÌ: Ÿ“mú­R-‡ÔÜjKŠðY Î)×ÚK‘®e2yËçŽvùP©V-¢´yGˆ= ,šá­6øž þ ¬ìÚÊÅoq ?¾ÛRÔÈÞ„"L34ãíÆð5vÌóC1ô¸k`’¸)ÜÑz9 Ÿ­&‹½6KuyrÙÿH·Ó€¾½`Rˆ‹Ôö ü'Å›\þ8N »¦N5`¿ †wð~Ž/¥ëxFrµMM|¥6ªðs£úŒÔDöS„¹%¼C ×õ ´‡ñ[#Ï+pÄ¡>âSöik'h‚QNýê´ÔHîR—1×&Qiéqå©ÃCjF#fÔFúSãìÎ^,¯:Ö¹ˆÝ_ý$ÖÄìtÐ*ÂûîQªxûÖÒàĨ:‚¿hS2Õ~ÿžBÒKçÞþ§ËŠ~JÑãâ3~¾öRåЪÛ×9ÖʨÄ/]4<ý2[ösÁqøÌ‹¶¥ÀÊ¡5r$«ÏÖm×BT‡ ¾ùœzEzf^0ß¡mdv"ÌX2_{BT ÔöGÁ%ð,ºô=k-ÙÛ“¸­¯<ýH[GÉÌ8ù±Ò"üù+$b™åg šôê4Ø>M‹6ÖÖ]Õ[5(ksM$å£a-°&€€?:/Þ_]%ûŽƒfP¸àݜئ½ó‚Ó<:9öƒÚ!uW²Ük!²!¦ 3ø(=‰mæ1,eF5Ï´ây[”Þ‡®MôLÌ> hŠ0§qÑ4wg¤Ó¸§Æ±Oø 9ºì¦‘wöû`æøK8ÍúƘ|³k™«Ÿx'D…K’È1òi ƒkP¼SdT“%kÛÒ„·n…¼çGùeÛÂ#’‡ƒ¨U¿=Wªæ|Ÿ™†êo'1Ú"ïâ=ã? b¬•(‰þ?ëˆßqyýê—p›%Œ Þ$ãóÍ#ÜÛ>A*ØqYÚfu†ÑòiC䬜åÐìwÛ×^²ð•/²–®þüM×DD†!A®QbG^;¤ ³H\Ønº*ß‹\át\‘gJd2†œ"sþŸB?ä2ÜăÿmvËQ]_oÅ”“{f¿eÂ,`Àˆsã+7Ž ¬á²;fDá]tp ^Éõõa%mjŒn­<¨;]nÄ3?ýà÷&ÀuØtš¿­xß&ðà Ñ×P)Ì>ƒî¤HŸ¶Qcñ÷âzuQ–ê›ì•e-ƒÎ“ûi­žëÔL¿›1ÛšÏø+g»%a†ÀmÚL’×ÛEI~sÂ[F“À-_BÇÔÄœ0IÛ³tF~wkó!÷lSLR[¼-’F ^ÂQ²Ó¿B“„¼ƒrÛ›©¬†*ÞfùÒ̲ƒÇp©¿ø?òúu|ÇY@œ ضVx©Ð^WИö z³"Óh_rPב&K‰p™aþ¼ý|›6‚´¶R©T*)‘6=l¾NJ0Å?éJO_ÊA´SÄ…j9›èÀ¢u]oÄ ø»¯¹©ËÂV_ʘ#žsâ#%L€¨ËäœqŠVN-Ó» #²˜Žp±£CbÙsø Ž­¡NÔiwòöñ@P[i¿õaS³ÒŸf„dQM£ ùUU·¬´Òð¥ n¨ó‘å—­Þ E‚ükbžÝгY,KúU¦•ÙŽDü¥‹Z;ÏOz T{|ù†ß‚ÍÂÖu¢kL óTU‹}p¿Ò†ÝŸ¬Ï¹Ê˜v]š¸xÛöë˜Ã‹™Äûž,Ô¹‡æ!,L\ öEINèªÆq0 ØY†jº6^Ž×# Ÿ ڻ˶’)iÆ`Þ3°llzÅÌ<šfm•}ϤX2Rü_©2ø*ËÄwtç›ÎPÂ\p¾m$IML¿œßÿm EwÚJÆXµu,_éÄ8zx‰°P¿X „5ižÝŽ- ’ªU\*$±ênçOn[ÐýwÇöèˆ uòe€¥Î ÐÇ=²¢”(ÊÖ-§ý·„|ò^02ÊôÇ^#§P2t'Ë®> v×’êØN¡ÿBãxñ„Z ãþÇp%¿¡TùaÚc5Í‘†—iǹh®2:¹å\Áó¼’uêÈ7Õ¡&öLÓÂd:Ñy‹¿3ýÌ‘i1*òÅH±N&h\k|¥:QsÁ¾M|U¨ªõ:¢–äis<ÓMŽìg#âí:\ òýÿ© –ÖγÜÓThæqûÓ,1ýY(ZüŠJHžÌÙnîf¤4 ð™Ji³š‚ûÇÆ¨!Ùà]>oC‡£^:ÜA>Þ ¾5{/xR£Û ÿö&ô§®àËr°¸ã9ÞùɦýU0LŸápÌ6·RTUˆHv%z¨3Œ$óÆ…ŽX>Û’Æ!ùý¹°î”娥|Ok#¦,à@ùI…h]¢ž ODümèöufn«ˆ³u\‹ÓHk¡üÚvÛuÍ.mãÈæ½i7ÍgŒÙI_J2ÍŽüË2 änî pœ—ÿœ(7¢â¢¨Ñ­Û¯¶ÔJ>G!•?”•ÆÆ6þ6’úD×i•öp"‡øº•ã ä Q‚%epžó—1éo»\ù‹”œ^ÖsÂÅÃ^'µqk„æ•í‰Ù¥ëÙ².~ž ä例ð#2¯C’Lä{݆†Æ¨pËÁJatÀMºEžYjDË™L¡>©¾éï,3+ù!¾âãqTu›—Se©r#šüç*ò e3%€E¹(²$v¯ë©ag ¸/ ³ÞÃËi®0\eÐ(Yë–Ï# vdÙ•Îû0LÎwÀBàú]1ÄÈ#€àu–°($¸šr`Šë¢70Á€>±ê£éµR1”DÁ‰ÿ#8p 'ÅÒ¢•³’ªŒù!3 ¼Þ—HuóO‡FÝBCTô" iÉ£­…ìYÅçú»ªŠ¯>enßÔ óD5Ëc“ï'V|®®q/ù”ÖyÁá5PG·µ|¢3"« Qwž"ެ9!Û7¯vʲNâõ_”´]åL›Î_çºNÈêÈ4÷©Í€Ñ©¿"¸„žh˜Qäiaù¢N&ð ¨éîÚW›ºHÆÅÚˆù£?–3zAÇljÚϬC.Òþ¯´]©ßfk.ïµáù±uÌ é‚˜gª6L4æÆ±„µV¢Ê¬a¹N)]ûÉyˆóIu÷<‡bcÂKQ‹jGÐu°˜2² Ñ©8 €°‘H%¾"jÝÍ‚S.H[e@H°¦¯*ÜÐÎå>ÿ¬Òeb[´”Þv{¶ú3Ÿa’þ_=„HãíÓr75n›EUà¡!Æ‚%S⎿n «3šÍQ×ÐR>øªeí”A„q Y„0, Å…) òT´h‰‘cYñoT×ò ©ddÌÐ!ç+›(ªÐš½-}æ8XyÌ ·˜° ÝÁnìÛ” Í¡Y|¾%¦ýI­á¦È´r,ïµN@0–.9¬ØAŠàâ&YàfŒÑS‘UpðŽ×¶¶íèG+ª4ÝðYæ‹›QC°u ë 1 ópÒrr)7lÖ–l‚†Ôñº:„?Z#—;)«Êø˜­´3e=CË|ζpœÉÄßSj¥³3moÒ³~vÌ:¿¹A?†²D˜›®ß‡2’ÊXîÇIwwe¨é÷hj\õÐúÏ÷Cò¦”p±òÌw/pš±5\]jàT”Io‡, v}.…•4þÃù4_y78ßЯÑì°AJ(öªU5½0œæ[ôWÿ¼Ç‘hI¾æ•8 b,UJÔþ¶øÇcTå¬]ÔÛ`¦•÷Hëiñ‘^²Þ¨7l1!)2Áþ3`øÐ*$À±Ó`'qœ¡ËÛ®qÂílîµMõcOYeŸÆ9\µg¿4HôÌ–æ¦[l‡sv„½Ìà{j„ªÖ"d}éØR³ziù½cnÊ´;²¯Á·Na,hNß·œ\¸óc5€L?aÑ’¶jÌY ¬b©Íq¹ÓÊ¿çoPÁ‘÷{ÅÙyI—“t-ÖªµUŠdÍååpƒ—;G0Ý‹¸%ÿÂODZ•0W7°ÃiìôŽvHŸÓÞ`z²êeàæ¶_® 9‰‚––†ë  ;ù¼s±Qæó ‘ퟠQ œ‹ê©lW9B˜RûRò@\HûNZluHw.~¸×Tèê$ÍÈÝÝrÿȨmÖÛˆ½:à@çqšaŽ2(Ÿ{© „”KóSb §«£}’—•)¥ýÏãçÞæ¿jtò1/;Zú•\I$X¯±äóJ¨MÆzO‚”úÿT=÷¿!JÞEú%Ôß[ŒN#©ÍµM°‡­nˆüC±ÔF¢’†¸¶ÓJЉ¾žA3²SŒØ´ÊoX _«*dé¦6ï¥(s6Ó¯d…¸Ì28Î{¡ÚÙž™‚rmYøÚé3Ç `pq5’*í'‡Ã¦zé+’|ýךÔóS^ûí•G w­´m¹9_šš~·™}ÜŸçóårNδ6µ :ÍÖX´#J5à!l\ •‰åÚ¼Lçè¯ãŠöQl×ÒìcâŸgš§³íñØx|iu¼bâ¬†Ž¶úR[Êaøå†nˆëxÀ QÁÎ2mØ‹Á•5àÒP8‡Ó’ ™Y)—½º qêAS¨;àZÝ&¥”­œ>CL&éhcllIñÇnu2S£\ðšÒ⾿Î-·{²š¯] bRÔ[\òrîÂû¥!}±q GóxD¥'ÖÒ)êzâÞѰ7ŽYcqwš¨g0­ÚP¶[v (—¼¯¸êP^ íŸÑÅ(|É›˜‰øÐOZÅ3ðn!2Q]buñq/**¾šÒ”‚ù]Í—ó§EØ­,eùbèÊEê·À íØCÉZ•Má~?£ÞÒ¹\liÍ¢*ÎL‘m§’¿ ç;à†®ÖNÊV±Ü95{ÙŒZ„›:`ÜFÕ‹Öé@Ý‘êµXn½•}bÆ}O~¹|ÒMˆ»A,´)Óš1´‚>®céjTèsñ ˆ¢`±$ ^\“6°£B“ù9B®5Ö%Uüq … äÒù»[D7y<±´¨L–NÖTá—jÞY ä¿ 0¼%¸òg&B –øœÇoÃsP†¥ÕI϶<ŽØ¨Çïžø—nêg|ü6n÷LøòÄùŽOÔ%[áåµµÁ©òl& ƒ¼Lz El ‘)±neR¹ _œYžÒm_7¾Z–L[fA8ê¥Z‚I”…j¯„qlrfÊ’Ë)ù÷Ñš“öUŽÑÚàNpó¢" £¥Ìê`áÐÖá—Ý”sï+«BqÙÖŒ%E~rº­\€ûÝù‡µ·U¯¦Q»Ä’åý »VGÏ›u¼í84W ¨¥Õ:¨ÆXbgŽï޵³æ«†6@Ïá:‹Ô{€kO /}–µÊíL¹æÉœŸIThÉ>ô¹×îÏœãe Žfœüa²PsóäùÝŒ"`+:üíÛúD€·‚ƒÿQÌ‘(#ÔhJÞÌn9k¢ðÐ^ƃè@tIJå¤ZkÞ_TM9ÕøáI$eE¶cÈC8Ëø ‚¡èNüߦuÂ!›Zµ˜å»9Rw[ø‹u¡ëÿ“3¥˜D‚ˆlö²e©1 ÅeÀ1á_æÁ·ã›VaàxÙk‡ O ¥Ç Á§g©Ús ­)¤ÉÕŽòÂrÐ>Àò¢Y À£$ý–Ô²AÆ8-ŸŽsÛ<8mlÓ§Âï•XÝê§ÈD:Y¿#‡ãp­êótÒQ®è^;;èú®£×SÀš|!6V¾û Ͱ |3‘]ÀýA “#okRy©Wƶ8êq·È¥R—Òî"·ñÆ€³\ÈÂIu9»w2i.h'¿)»6A…ûko^¨Žød¾X²±8 ).”Bà³ôà˾ŒÞº ŽtFtÏá¸ÒeÜ–ë–ïÒBwuƒG ufœ-ÄI¯ÍïÑÙë«…Ü»¥’L‚±·ùT´‹`%ß)ÃÞ牣5çó—²D8Ê´Ò¸ÝsÂ¥[¹I<ÏÕjA‡Á• s_j™V(槉§ÓËÁWà€‡œyr´ ®†ê| Ð06äc´ÒV"R³ùlˆ¯á ¦#0ÚÛkäH ©S+ÅeƒâÊ‘˜(²æ^éK¡æ¸eãÖ~‡OδÑr×rk÷†Z„æpAkaâÜ[óág½ Ó&ʳ*Ô¹µŽÄyÄÌÎbçÞËÇ»sLÃU ¾MàµÝ•¢~÷i²¡=Ó&EÐ3ñ¡fèYÌêL¹B³Üµl ~;ùZÊ$¡S+M¶0À[.<„kþøX.‡L"ØtãmºpI|¹W:_MáªÝÑ,k‘Ò™™záH„Ž  –+§‹‰"ê3Ç;"ÿu\‘0$¤­¤PeÚàYkÍQï [¤Ó°T'EhYâaB¨ƒ½‘˜Ç¨z;iý¤,ýF§Zr5.ªu—ÈWʰ§ÇZhòJ$@'Û4"YSö‡ÍÊ,£æ]÷›z6ôrÞáJ\©_ùŽö$òœ­©yQnÿ’LñS—¾ÅçÒ_«u›±ÀD]ž1Ív`ÌuÛSê¶,¸É†‰þ”®;á1~ÅR”¾Nâ_Â÷ˆ™ãœpD™×çˆÑ]ÍâÖ/-¾ É©O*Ú"$Ü”ñ'`ÎhUÐ`(Z`¢ ¨;Ð¥6Í™+p¥Ú²cº÷?V«G‡l2ò¨‰C*%®k;|B©Ï–ª×ZaJå}Í€ÌÚ‘k“¢±œ®‘Û<9ä]ÿUÞ |ŸÏ¹ݽ–rÞGœ,“bFü ›Š³•œ²æ+,Š×z;#Æ GêrGZ è>ü!-ŒP¢ÿG éuF‰ú ‹Û€F+cÁ±Õ^v…£9¹<qÌ^0».ç+”€™º·,µ°¸#¹X…ÒyIW)/Rñ™Ò(p½<%.+`çîuú9¥º†ŠFèjd17JŽ"ɉ%JÏ`Ù-Õ+É}Ç_úhão½vqÇ÷fïž¿>6a‰Q¬' ÉÈ+g¡ØSÞ"‡””q5ÛgóûA»oÐ…Á«Á®ÅèÃ-Kû$д¢…ÁüAO£º»TD¤³¢1âg9j™Cݺx÷-*?Ybh7ì‚Mœ¼÷]BþÈl«3YlSî>Yjä*eºXoöçTñ&Nûü‡£…wNEÌ•ioå—6!»câºC›RüÅÉãµ{ðK´Êâ>ì‰ØÈúôvâa£}†cXºï•íò·és)œåÂÊI¦Îc,×p‰Ôôõ´­lÂøäéÆ1Ff¶¿üÄ&0¿ã«–ãígÊý-ÙÀÙ›ÊØ6sÛ†ˆ‹å²[ܪwÇ Ìø FƇbã\BŒ+‡áÒÔðÌ÷ÃVìû¬Û2KxŽçõy K†1²ª$ îêî;=Ø*fZèó׆1ï 5&[Kxí–ö_Ò¢¿I¬(Ò¨óu(~‚µlúߺ(Ù`,àÌñ%âˆ9ŽÖý°87Ø ÙlrÈíñ]äćFñôߋ…б%„z÷ÃîÍÏÎaò¯î^Ò/y ›Ñ.…Ÿô3Ä9ÌBy3øijD†nZ«ó)¿î|`™ìÃTU¿sý…/a _JÆ]uºØ‡¡Ÿ~àdÑüb°¬N„¡jÒ*Noб ÁÞ2´¬kµ6‰A–Ù¥eƒÚ‡Žøo™¾ß‡´Úá%MqÊy;`½Ý3ÓÆØ–Ž¼ó¨ÀÒ¥q`+}S*ŠK²9Ãsœ¨î&UGa¼Šrb…ÆÄ–åó“%D„úÉ¡/OdS¹Cs½È„ Xªü‡\Ù®Uê“#òFãÊïr/ ‹„Œ7õÿ=ù¼BG +x-xSòt6¨ý…6*Ðm Lôg½†>Óƒë4/PGàƒXxo…YÅt‹Yìƒt÷r6Äò)I …Y±¾yÚavÄ«ó(v¨Úé][ ù>®pºp‘Ý®Rq<†Øtáäy…šoæPWÏýÙåË™¢èÚëì»A—Àó¬óOwk™%€i]÷$öÒ2¦¸ƒ1ñÇA‹(:´DúSHæÖ‹40Š.4ïRþ‘zD³$~’A¢š9”álS¹.?xŸ#r<»!¿}‚¾3éçõåÛÇJÝè9‹¾Kɰ  Vd£á?—HïÏ+l¤#™c%Dv´¾ÀÛú;äÓÉ êÙSÃrÃ8 áÖsa|ñ“JéaÞÁH/:Hµÿw­ü©ª²‚ÙK ýºl!ì[rpÚø™Ðk±dyV(ô&j*= o§Î^·zsï»qYqÒüüH[ÈgŠ[‘Ô¢J]ÊZy*Âduå]jHбPS--ùí Á.Þ€GŠy^H”ÅÌO?¸ÞÖ¨#LJüoq·»©uoR(Fäññ¦;îâ´+Íöóü8ɨæÆ5¸Ô-ò•¨FáËã\ʶúJì¢ÏÊ'z[ «@v?\åê1+ÐÃ{½¾«z¥¡k1¶ #N»1ðÉLò¢ºÚŒÃ§…§E˜÷­Ï#kð8QpÏNši¥¸Ð,>/÷0Ïz+Ї'ÚÓÒC9¯r-ßn)‚ù]Ö|” ]Œ8*?2¯ž©ýøM i¬§àË3܆g$VI+‹ñ²AˆAù„µfTNÚà 1*à ®³Ê‘‚V3­³î¶w[œ/XX]øÅ¡{K24µš­f^û7KýØa¤ïñÓ4=‚ "%à)]ôlqj ' ìõŒGäΈyñVÐýÓ]™W›oû¸Ó'âþÌ€ŠÔÒJÐ'Y9XyõO~w¸ºkï‹qÐÏ ¢Qï2ŠŒ\ð¹Î’›sq·g;òcç-3ÿÝÿ]Þ¶ £‡ÇàýImRú¯ì¶_%Zl<ÂáK÷OK>ñmMs¦ ¤•FŒà¢G0YBþ°ííéSå?#º"¬<&GvÆ¥xu j·O*WBî{Ιd›Éù¨µõ¬}–öù¢y§õ¶&šNþŠœÍdç¿x‚u„¸ùPw: GúV¶ÛÝld¦ Cà"È"B[b"DxÚèé34B½lÒšá¸Æ‹>ΈÍÎÐA¹Ë °ÙÌv¦|è»ÀÆØ³Z#yn”¾Ò3#üG”ᦤƒîH1_ËvžÓ=¿¦ÅdÎõ²Â0ÿ/#h%zCÎ"d2'i[)”Ÿ$NÛN¶"¿yïŸè^çÊáKbkK¦©ÏOýjÁÝíë<´L0uA2½Ï¸«â«¦¥‡³¨Q8–µfáSmê§5¯>zµL¬ã¾1|Úq}E“HG§îdÑ9 ƒ"ÚÊÿá*‡(…‚¹®Zò•ÑdQn›7ÈÚ¹¸ïN„ÈL_öe,t-L 傜>æ› ã;iÃÕÎrk6ìÞ’²gCV_D)DçOª!Ðû¦ÀãU¼‘õ·!R–dM§)¦‡2,ñöw`¤DÑíçä¿Xl¡ì^ÛçS5ß[è,²î¹×ÐgØÐ8yãï6¬(Ö¹¨r.¨ÙÃy••Ëu§*‹Ú(W¢užŽ{¦ŒA#0·0‘qÙYQ, [j*ö†OzG^àµÅT žÔJ“çyÜÞ€_ú͆“:„úåðˆþ~>^7E¶]UýŸcÉðQ•ï»Á¨³ŸsÝ(ežصÓíg<ón3 †6ך]C}[G‚N7;ÑR‘_–«–2ÓÎH!yEhs¥Ã6kö}s¸#Åþ×½O¨í‹²ƒ®{ŒÍ½rï]¶[ÍÎ,‹1ß…®‡jÅÎëK`iü(’ŽaëSBM¯j¿ÀàÎ'•©ˆ­5ª‹=IOÄ¡ ¸ÃíÄ€€œ1wm“Êe¹9u“ßv.ÈÚ›Ô½'MxÊ ÀKpŸ%}ŽëøF<7Ól6…YoÁM›ÍÜ1môs¦ß®g£MX´gL±+38ÔÓˆ®³ã¿©0¼ÒW5eÅó*qKu;‹6¢£õ/œ«€]„Ö98¹”ßLU£êhÄFf“+˜Ȉߓ Â}MÚ[Áyh:ÜrhÌsEzNÞGiD_²sééÏ;áÂw¿Ò6VÇO]7ÁY{„1m&Å&I8jÂbå¹߆U?F¿ðv­cÞ©h‘œÉ|Ê3ÆR­~®üO‘öY"Û¡o‰2\ý'ŠÔUšÆb+zy³Øº—uM(7ä":XJÉ`OšV5=0‹³s° ¸ç>B%w—Ÿó¡ªñßo¨7÷‹Ã3UÿrA6eº8Å:«£”¥­Fs»ØvŠÆdÐC)Ë|GYâ´dHnü£ZP‡¡›<-¥öêzZ½aBDóSgAðüA؉7(ØZYÌ•¦…5ÓîÄŸ‹¥@ïmÉ’Üšìøø 3yŽ3´í޶WPÖCÓ^.ŠSDm5¹¦«Ç³žj~ )¬½—¡½ 6„k•A˜§€á†f÷Ìø€4áI 7Ž3Xža ŒtÊj”‚¡š@žPËw ú­‘Zï·•_›v5VzN§¶òšã ¡ÚT ܆&«Éd“ ;óÅ~©÷F•÷­Ø"zÎF^Ô°ÐfpŒFZlôÊS¿j$Þᜠˆ£3ܬbݨ–»Ë9ûe»ãëF°ŒßôáàV ¾OçUá¿”™kÇ$1ô½»Rú`) 6Ù<ï3ëÝv›4“÷ý§û”HsÇ@÷³½øåµ`9âE¨"ëÑXLsj"5c|eáQ€º¼J¡1äHª çGuŽ­ØµQµy3R¯²ôeÏ©¶3PSç÷ßLÖ„l]ñè10“º^ó>ž‰Ÿ¶XëwšvܤÿRá×Ï>qÝxõñ9òÓì’ÐXN: ËÜ‘RÇÎÐú*Û'¸ü!·zN}jYR€Uª_ùn ‚˜•Cû¢gL;f á # õpŠÌéÏi-3ID=°žïˆlšVÏq8¹5¸xV}!ëë0>$ŠÃ/Bj {…Ыç Òœa%û+Ú“QŸ06%çX¢íjÃ/±5¤=n€xm*»¸Ueõ¾ï»0@å÷eøªË\˜Œ¯Ú‡Ã”<øQ9 æ½6@£³KH•Q&-âä;(ÔÏé;ÿKàêcmïo°Æ¤þ´qbt .€A(Þ EŒçv*a¾Ã•ÎEÏ:_à?fxržó ³Ù ΄ùUæ–’¤íÝ™ê$–8D½/7—´«ÿœ›ÝQoéïˆwŒÆ l¬h´¯ŒùM _µþ ˆ IÀ¸«FYK(F"êXóÉšt‹Ù9-*û_UâŒî·ZÁö.JSr±z‚£Ïù^vTÚ}°¢+×^Yˆ~ed×.Ù40FÊ~€)KŽ–é*\q¯×ƒQ ,"Š)aKù 9"¤àÅQߟ•n¡!”%œdÞ\éÃ]éTRR@l\‚K­G* ƒâw”w×"2{Ï.[ŸDŒ²w<#Ú0¨AÿB÷©ó¨ø\®1.+C\ßròŒ«P©ô ºÂÌÀÀs¡¬"‡¤€M'×õ^Ãíä07é1hï?Oõa|°§ ›Ä´ÎXÞ+ØûB heÝâ6;g°’–¤YÚ Î_ ïH2oTèd™áÉÃÔÿÑ—{õ'@gm§E„.Dä²n°W˜‰z^¶u›`ÁŸÖÅö¿ÝÉ=zA¯ô ¯B ó%š{×¥g€™âŽŠçŽ2Oê´xŸç">Y[ÿµµ1Á¶‹cçí4ñ[s,®IÖËr=éAG̱©1 ÐÊýáàfÌT~"Á` *V„b$ë“dÛ¨@辡qûo³§yxÏjUÅu Ü"·'s’ÏM;SÇÚl娣vùÁ1d®f¾d{Y”ÿØÇÚñý 6ŠÐ‰[4Í¡ªS Ñ÷T¤Ôph™¢G °îm®kº±Zk›öÉð ohœxÅAPÍΫÃgàhþIKFªZ{öí¢Âû¡H1¨MÐ:] ˜úV˜ ¨lWªÞ.QŠôƒ®5cZcxsº €ÌG®lŒ ƃS˜òš?®YH¯KÅ’í…uǹ»ŠYµ0FÅç)­Ó×-L\fè0)Z´ò–åH}49ŽÂ¥=>õf‰W×°9ÍIw<Ê›Q˜ß4³Îùq Tø×hxA*ºÅ92-].°; ã~Rq¶ac.©µ2È ,ë=`Ø£%ï_½êÛæÄîûW1½a.D˧IÚQâ,¶xH¦M7wµÇÔ׿+ç-2©#ØÃ.s+|ì?]‹jm{îB̶ñ‡ú§äÇI4£|PDä$œ‰°ŽÔ´qXñßå(FæEXo!JËw.•¶1›ø59ø3Oæ˜>XœÏðÔ‡^÷ÿ´ÞkjÉþ£×àC\½Ì"W‰jcÒ+ö3ª€Ƚ!©C2µOºd@c+ZÔú‚1ÆÚ†MÒRÉgBhyÖèDT /*U¯éy»M${D3<žkp~a‹d·Ž/hV5U¼Pnq J³?&¦š”w—Ñܨâ¿·þéÁõîµvbÊuÜ<: ZEP€ò]øE¾³š{¸wfЧŒb;aûÚodýÆüêËü™'î¼>n›nH ®b"û?ý-W¯æelhà3Ô?”…v,Fr[À¹ÊŸ!de0À¬®y®rNªý«ƒ¿sYÇÎ!ÝQ·k›fï#‰ÝÓ[XL?pCÂl—×À§áh@!U—§ä}»E¡Ùb!ïí¢d½.§µ¯$”Ò¥®¼ ~›~—0*ýt'&ý–ÊiâåàŸ7*üKÿyõDW ë¶ñ†—)ë¢Ìk|;•Z~7‚`õÿ™$Ic(è>êúKS¦AeGËT¤¹«¡=ÕÑ/쉯%A­ËM¾€²}?2ò4Cä;ãVÕ:R)ù)å°+¶{Fß`KÂW¯Y8©ÄÊÁ9YÝ¿*T(`{øËy£ƒávt\ 0Žlk5ö?ÝTvØ€Šyܨ&¥Ÿ4»YÏj´.©Fµ´qB~ü88ÁþÙéØY£åÕFöÓÂ*™ÉÊT®Šq ¤'=lÇô·å«Öó·kîÐ$Ø¥ÌÏc\¿p“÷öîygPy"£ÇIÁ=^ÿ+Ć’@ùÃú%ª&m”ø©1k³­/ÇIÿzlšÏ£>#7Åk¦FÏYuú-Á^~o/’(¢c~Ãúü¯#‰ÒÈÀ„ì´TÂÍÅü[~e°?‚Ví¡jݦôí®Ï䨚òmôƒ9»ÄÒƒ·ó«¡£ÌÜæv#ª:&­ÚyÐ,Ü׆P+~g`Ê¢)¼Ã#Ö^%¡Ø˜6¢GÁº:TÉà”jþiqüÝlšóSfGPÎEɆQ€“”;QYz³ýÄ»V~ZНoíÕ»´‰Äb« ‘Û ›/"wÛMé–ñDÏ\¤1iØÀÅiðn«zoü¢¢a¬2ë‘©cvÞ@1ð0Ž%†p±»íG’,Àô«”§ÕE*FÖ|¬¾¬Øga€lÓÌ<(·VI(¶„ °××àS$Ñ;9'q%õ÷¤xUžÁ;`ö+ˆz»ÊȾß2T± MŽÇšGZA’aϱ‚î”ôƒeë®±ÅEhl¡yÉK†sŒÙeŽF?4ŧ$tÝϯ> ü-Ù²‡Í t’ùæ!‹¤.­GÛi×à‘ŽÒ÷ çÅúý…åƒÑ žæ08þ nTÏèP~»ÝB9G»ÏOØrÏín6,cµ2t‰¸ÎX5yC½ã4>þûõs˜Wº6˜`ŒéÁw×§¯q9Ò“‚¡¯§0ªª#ÐÈh?Qã‰5´Õ­àç™éÈãŽÙ Ç©1÷#}ÙÏœö<Ðý½¬ 0â@*[UMÛú&lYDæ«Úý®Ï‘jSBc«ózŸÐQ¸; 6çgÜY‚—1‘Ò:¥ìxܵz¸m¤œþż£ÇGšwVÒî×’óÆšÆcÍ'º¬ë¦KÓöuÕáwÇ€,r•]¤„ÊgQ_Ý–4¢³û*à¢\Ü•œº6dÖ“§q!Ÿí¤‹´QYñ6TúF8ΖâJTºlU|æ_&¼Íz@*á‹’:°å‚öÎŒàþ3ìþ1Ì ©<|Ë‚Êñ~è×àšÓµÔ±YX ü¥#JÃ3rßÖsL·ðßÒC£çOÝ!6ñ Uïèò"é«3‡¹îøµXd¬]‡X°êo[KÎDâyn]@L~¸í!{ÍÆŠ|zÙvÔ[_âëojÁ¶žìH›ÎQ¡lýf©A"œ~ê^@-¾’HT‹4ý¢°l¯x ޜ喥U~¾î€gG}® eßw[¬»l$ØBçou“~‰Í“]ùêeëXO®Ð›¾P ižfëg×Ö—çôQRÑÓu-;°è´känò5SjÊÌâÃIgÈ‘ÁˆxÕׄÓb!.Á¦õÍèJ°T]¾B†S°RÄ19Ýñÿ?¼*¤´RF|°±19v`‘`ÜZI“6F6é$°Ó6sß‘ L’úC ÀÖ‰ØN9šñ@g R0tÁ²S×åXÃûæ6û>Z}Øác„õ\’&ËÒSž´’ZÉ×9 :±@Â)œÿÛí-iP­3aq—Bày©>6âO›Í™Êve(P—æ±õÌ¡­V7nîË»‹Ò0/?>@q·ƒ“àØè2, km·ª?ÞÓ’rí–nÙϽW+s‘ÝES÷ž$«OäœÁZ§…‘ Cõö:6ûc«~Ä‘®aü1e•‚ þ­âðv# 4Ñ>œ}™{ËÎ}å`,µ9¼"†qq/ѼlDª½`”•ÁLPè÷^*¡"ŽD“òÉà-¦_u;ul˜HãRQ-)€y.¸q&Lñ¶[eëñ®©Cý’ú *˜ožÇ>p+´pߨàÊ£;´ƒÓÀðâ6Õìüº÷°¦ Òœð @ÏO!‘Éd@U­î(ñŽw®üëE’°wÍ$6]&]EôÑÊRfçNÿ‹lÜ.à4ë`ÖU?µÂ(!î6&:íU'çΠEåÅQfÉé„Á ,Ñ0ÄA½þ‡6ˆòñfÕ“D•eDefëŸWØXÄk^Hõ«XíŒa0}^‡Cƒm!35L–&s©‡'‹.Ŧ_ú¿³8^ R&p§ìz©ýð™™ç‡š»†²E œÙ£Ûã<ÅŠò(áÍÐÌÅÂdZH·\TçqšfÈœNNœ›‚îÅü*-#žVrÈ-Þ!ž boÝFã ¤i¢¸eKó téÞªÌ@ºÁ@÷äHŒþÓÏ7J1‚sµ)8aÂAô;^J=áJçåÐþpV(ƒS6}ò1Ú^>SéÊä©ÊÉ–uß5fŒäÇzÙ°îBªÐmØŽBDJtÿªøÁVs¤Á¢‚DÄ,5‡âJàrNKSÁìѾµZŒð)qæÎN{÷0Îp@í´hy*ܼ6Áí.`žíÇ“äYÓ¬µ÷ßè¶ü^Y‰®+½ å&ÔAàÖmñ ¯t¿Õo ß4Ê+Ç(%D¤‡ÿȵ;+̽ÉΧ &'teúܣ㑣 d©äv œ ¯¦õQš¶ÿ¨ŠÊmϧ–‡U>;È£å\ Êç ˆºïnX=.‘ d¼ì™ tm¢°lðÓS9fœŸÃR}79¥y7/Yûx hú*Œ%|Y_Ñ*V‚)VªŠðÿ™{Ëw ̃µÞŒ—’SçwlxˆŠçEu Û‰›9ú9>ÔBø‡àOÍŒ´ «l(­«­ûJ}ÌŽ$‘Ž)Wþ¯°V.n[û®&3²ƒ‹Gb£ãß© ‡}Å…ËÍ®ÏS$Í—ÅÕRƒf‹F|ÙwMÇ`nœ…É —"d‘„;"ºM;ÃîïköVŒ‰ðă nÕ*¡Mö¼sÃÕ\Éøø˜{ý¾ ƒÙêa]¬$l ̓7Wf’ʪŸ©O‡Äß/|ØÿÜGbM‹¢‘­ËÅs¼oò«3 Vä…â”㽬 ¾ q³Î0«DÃñ¼<®¼™íËs÷úrøûX+‡})Ð;Rí©Îûžê7ƒÙä*u§B‡ ïCVŽÌì­–:-nª€áبïs xÅéÿvÑêNìfwœj X/E5`‹Ü˜Ý”Ú"›×ÉÁ?×1ìñ¾qßt;Ì—¶jr^aªJL|X-;‘Á˜]\ïÄ"û`­©²îxoÚa 9"( Ÿ[F\OŒþ§åù5¾%¨[Z-cI¶î€V†ŠVn³ÞÏ Ú¾¬rйøÂ¯p2QÝÿ 39]Ë{Á ÂöŸUV‡ž_èÃì6QFgô;¡õüÊt4´ˆwiÐû<|Æ_Lö4ÅͧAŽŠV9Àኑyu)ý¨Zk„w}Í6N¬¥ÿ·h.=ÓÙíµÉ,LålköÔµí³ÌºÀ°dcÏümÔ(Al’$/ëuùi_àPÈeVø0ŽùÊP5í ³ZÐQ«°ÑVb ­‘‚Wò„º£IZ“é$åJþL9È“Äê}HWÄï%'RàëÚ9Üš ÌKÔ¿ÞÃeˆ5 ò/gžoÜÕe4õ wø£³1¼™Š^mi± ½¤e8xãg|ü$<8ŸOÙuÇF«Á)…t }Ö&]aÔ )ÒM]À&Bús5hjÆ1ØwQ6Ÿ9¥ä´ÎZ99¤Ë÷¯ RJ¶RÕäë‚L"7—êCîUÜį(‘ º6ÿ!Àä ÇàB¶Ùà*n#4™¿,L‘~‚“b™,Iaoj}VL‹xÉÞ ÉU¶íÈ«PbJÑGqÐØE,9÷©¬@ ™ÔNúØøc^ü/ë#/v‘V]²´1†•äA–DÒÎ-ÖÛ{SZ„µÁ Xæíóœ½ýQë„Ó_f î?Éf<²rŸ ’mˆ¡Úèâš{ÞC‘áFCÎhúxi0)Y½…„•÷n¬¬iHÁA‹c:EÝ =aK~5Æ?å6ÛÂñý'Jôæ  ´ïYÓ+Nu*þé”"G¼<§Ú oѳ ß4ú «Ò *ìæÄñÔõ~ž‚ RÑ;£ƒÕs3Îi)a"Qâ¸6qß®‹.^auÐ>O\‚ý²NËÁ®ï|OÝùï”UךyLo!ÎÚ³¬Û(Ç&YÐQF€X§>¯Vx·vŽbKFdN±¬ÊÀ:観:Û|”hþ‰PoÎ*ó(4öômÑÙê T¥ëÚ¡•ÄxHyK‘æ>ÖÅRCvššouðµˆñAéë\þ†ÐLV„]dœ)",qHã[åVsæ(ó–uN!ÐJ¾Ò2TûÙ飔1ä0‡÷$Ú¡¾½OOÕâ%W/@VéÂY“a;éA>ü†á¢q늳ÝK‡P9ê…1áá`187˜d¹ñ5ÂfuW¨-Aõ~d3è%/±*,å9Äy®…_6íš¿¿þy+[ðÜÙ+ä8zwt©K÷•‰Zï·ÙêÒ€Ö"¨~$ÿpßm b(bùk¤ÀJ?Ÿ*vL_¿†=foŽñÔu²iáäsˆÛ§ôòß¹5ñ—#Jœ¬Ï}ÂÍ’L)û@Yçª[—ç­I‘F/»Û0Ú_¡tøÜ÷c­`°¶b{k÷Yq¼-mŠ$·Å|™«‰p +Õ¬«³r̘ÔѺÚ‘ V„`>ªYª6ØaQ{Ó(é¡¿‘]fD4sì¾ö8´6nQrt‚‹çrà|©jÊsušÃ0¡v{ ?ãlMuNÎzîb' ôµ5ÎÇ©$g3®.o— {¨ÓЦÏhåÆ;3…ÔC©y+õ– k]ë"Ð6c/ƤÛÒjÈqÇÖüCO²‹­Mˆ? wf3$ˆÔ—³©$Â8w#ê-Zã¡î¬= ©™8·­f|èÑw¼Ø•`À%˜ùÐÝdo]h;R**×_·§uìfo0ûIrŒJæËÝ<ÀšpG±tA=©ñ‚l SÌ3"£˜CÒªÒ¿‰Tšá8«~ Ÿ¶QþúÏÄúŠ‘ðñ”o}` ¤”ÐW3Œs¤vï 3±ñ*¦ž‹œàéŸÂàÝÓ׬¿è\rr:P‹Û%° Sƒz©Ðù¬Ñú5ˆézÂÆ‚óâ§µa÷xWoÿœŒ› Þ ¥àóyƒ³Iy:‰d_oæÁ¸ öBU{'Ðïå9~† žœPÎ.ІnÊÖ Åü•‘Ø©óSâöQ(¦1¸ Fxˆ B`G”¿Ôp-(äa %¸V2”àqò@ƒƒš<,zlª´ó3¿mÜp&:Tɉw©Øª ¡#ÖUÕ‰ö$kÓ»Ad“Zœ+m o×e¦‡î¦ybKÑÞ®^O,D(”Z F€s[Ù.¢ñ¤Î¬Ú¢1±Œ"eß= õ­Ä WÑžf¥Ü*–Å–’£õÿ…N kȲL+~·Rtº N ¤œß}uNïŸåU° *ã‚Jãè—8Œ¥öïhíz[‚‚{¾œQΚXòFž€(Qu蔓¿¢pŒ¬»Ík"R±°“³¨ö…èú¿‹î‰bÌ…H‹ïÇŸ"™§žE´Aªú÷ U zÛœ,íUªÅ&RWPY“<€ßõèT4c83ÌuÄÑå=ïØÑã«I)ùëš+ߥ8Ö„ue» þ&œ-½¤„*p·™$f\R÷>KÕ4‚¤à#ínÍ´ùx šc+¬³ÍD¨^°*Õ£[³• _–›L.KOD>îVÛÚ£[6¢ê5jž<ˆ]Ö(Tê¡ñEš `ï°±+ 0m1ø qÛ»§½a»/kp镃ÛVÓ0- zÕnÒNpD™G¼Éj?£Þªƒnwvµ y:6!â|iñ6Úy¬@w¥N~kN`’˜|Ž:IZð»´/Æ6qÎŒ Ú*StÜy¢|$Õ“(¢`°“›/¢¥†Ê!t3~ΰIW 9&*õ¬¯Ë—ò9ýŒ¹:ÿ£Î0· òxªÃá“j9߉s[šôNÏsðÁX«D–1…¹ÀߘºGŸÀÅÿŽ:ï[¡œ³¯øõ'°±Áା>åI×/Ñ«¼½‚£fb¾(p¡ã¼F³‚BY»q6ÂMä;yqaü¥õºÈzŽªe†U¸ Ù"¼WE[jä¼*¬¹XþÄB\>jídÚ4îÂ9}ZÈ4F<ñQ—µð´WvÂiÓÖ F£’­Õ^•F}V*σÈ×¼rV¢tÉѤI\~UÛ×s ¯¦µhöè—,ö”½eÈÿïÚ—’ÆM·šx3½ µ1RNµ#”¤ÖF;£[‹X7%¢w7¢íɰâüšrÂbµeº3±¦Pª@ÇH²ï–ˆ{T>S£×R×å’|` ~BÒv:š3²RIˆyÄ9}ý]YÖ;ÆòqôêXt]vA’?Ö¤"þöJ!JXdQ¬š[¾“ËgðG*˜ C…†`µ?Õºi߉– y‡‘h‰€xÿÁ#{ƒ‚™Ú‡\ÁR<ŒÒL‚D·«<ý8 áq¿£Of]9 •ï4×bÂËàWŸ})ÞyGýv04cæA. 7-¯BºÛæwŠ)ÿAt¿ßÌp=bçùƒ[ðl9æRk;À%¢A÷,og b¶Åðõ‹´/f 7г8„ã¸PØû=ÒÅ91â –"—¬C{ª9T/‹6¸9’ú›ð¼"GP0µ\gcº}ƒC)“>®ãèîqØ\!Ÿóͽ€jˆëíqÀ–…P©/ü ]*œ«¸ÿªibŽ?²õ¶ì埾F»ÁÑm þôÁéÑï¯pyÌ“NL¶G¡ì£Õú„tˆÙ>9œ7gôÞYSG’ZúóøiØ Èu_j˜š˜Ô·•õô$]Ǭ aÖ /ý°B³ºz~‹›ãn-C´Qd¢Ï’2uÌcÃؘ±%¤¤g@³áV›Rò¦}/¶€˜Bƒ‹üGeLó pz5ÌCûzÝL_âWЬ©þ®Ó“¯^Ä>&²Ê©»š½‘x:·»m»SšOÑ«9'íNoõP¿Fà ee~õ05PaµuæÓåjÝ»éQO)£ûL⨾|/8·«ÑÐÕÞ°ˆzbÌ7”h]ÏÈ&¥D»3Ï}L­ƒ ~Kº… Ä §µsfÝH¢·oØo±õa:¦Ý’¹JÒ;Óx- I6¨žwavÚ¢ z(=GÎq-ÇT^„¿ ½8lh‹ã˜Tö‚R±3ËŠ«þ/;%~»w§wp‰b M¬N’1«æY¬ô¸¦àzxw¿`=WVü‚”»˜XÞb‚)WUuê79ÐR®×ÄÿÌ0Gzé!#Ðß¿~aM(¢¾°ìÚÉZÄh`ÙýÔp{t0ìî” ºãFlXôFNq) 9:û5ú² 3ÜNÓ½\ëÕ9ÂÂ6ÉDþ"u8ØÙØ«U_hnô¬!í\ÿ?süN0Ïeh3BE⼯øŒp‡oÇwþŽBÿ Ûã8°ú5Êì£ Y×{yÕ}¿¯2USð/B,¶}ÓV^:Bi§$Í,ByÇã®°IDj€¡úàWWøT¿< Xl$?Þ„N‰>¸ó å}Îñ£Ñ¾å÷3ß÷•Û‰N,ÝT3Õu;xIÑãä˜ë1AÀ?¦ÅŸª‹éÁ¬£³7*÷q—º6»øŒ¬Ù‘!/Œïv=uC—özúíZ‡e‚¿o1×ûãa?D0ÌršuŠÓµþbb5|ضAiYÇaé(½Õðڄ਑4š³ùê`€N–ð¤O#ÒúÝÑ3$Á¨(Œƒ]À©å¨jø|f8Gk#Æx9fGöˆ?Çlæ¶ðFÍô¶ OõœwœU(Ê¿Q¯3>üˆ)­®¬îüDtþXË<`x¨¼5/¡dR¦XmGl!Æ|¶23)- x»þ°jYÀ)eQZ+w|«$pÜ¿€"Cª,˜K&"Áøgha¼}µ}ø¼Ê›7AÁ«_I¥Ajæ[¦¼}"È!V~ïyÍhûž›3‡^%{V6a}OŸ“îðýá59aéÑ$àbW=°pd¸§`»]ËÞõ "Jú¾æLå¦ÜV¸à¡ÍôšudKžøÁáyå§«S6EJÐ\ÞÏnt¥Ç=Ì{Yq/1€é~‡¬Èx“‚¾ì¡Ñ;·²E2[@ck>&¦+Áa> ¶¶¹QV­zT¹7 °X,ƛ޾Iç??z~)b€Çj¥¨ÄZ|±î ëLÕJ1ç_ákœI‡ì#X²) ÜXw&·ms»›ûÝÆ×‡jÏQø‹íÙ~œ4"v™YæÈ=‰ mÿCp‹La¦uö8‘EÎjÒ8 á)ÚC%è–šø&ßÖ4vNwRüÓ¤Fâ$·›µE™…âu˜JEUÅ¿ZYŽgäŸWÜÞ[ÖD1]°wq›6g|,@ ñ ÿ´'ሠÛÃxQÐÏè‘,*®¬á\§â·^Ó͹‘°{íû2mŸŠ^JçŠ9ï ƒÑSâ‘_ÄêZµ¦ý¥jOãåô×u®2‰&[;Ù×é¶µøe;)xA\ø'!OÜ\Ö ´CXÅüø•ì<²ôÂXš OM `KCÒûtPþè‹ì´C»°8ERzÌk°½ºÒhéç*âýtCIÛ8𰹎ùÄá Aì†"Ü”É ÷ß¹¼' ¡3Ì›0¦“IptìH¬\éãÔ¸·ùT­èUq6óÈÔYáõÜ߀tÿ^tÓ)ãeë=ÝJôTüº¨b@ê-ícíÌÔ²ç׎­ÚEIeóI8Ų} B§þ<íÙüÕ2]S*†ôe¤_…ߦFÛ„É~¦ÇüðmíŒ&åEKðÓ\ÁÔ×á¾®ÛQºV#JÊðwn1„¤âc6)m×è3ŸMrµÇÖü™ÿj\„´ÄÆÃ ?™jóÿòwUãˆÑzrb›ZKÕŽCÙ —ðÏç#$Qq!›÷Gò×}$sa È#?onî…›ô(°²ü—Ú¤ø=¤Ü5Õ¨¬¡?m§%oaqcrv*nP—‰)n&8wu¤±Øfå6±¸Çy÷˜Zè\ ßÇrfb"³Ås—ã;w÷¯ Qy6…EOV߇d£:ª‡¢S kÊÄ0hX¢Ò Càd X~{ ;›Qe?Þ2N…2œi)…"Qú¯Ñ€ùP^3páê £'ÌÃGHìQÉäãæ-æÀ%ØK*Ëz ò[‘²Çm˜mö6¬'âR…‘ w’x¼ðlG§#Åf¯è›Ý¬Æ÷uÿ•˜ÏB¨¿½ø·×^+×5Š_:CZ!º¬Ô@d=`ƒû„ u ‰š*S-„›½¨ˆÔÚP3qΜòKKá,…ú¶¾“Tþ Ò*GXuýl”cøšÅ½ä“¹RK,$ooT`Ä\ Ù…Ãñ»çËÆ­^;°L{KÌÄ 0:΢Ûäºèd÷tGrëÔÀå3cÔ)›€¡@x'.å¦òTyä«NçÚTu(–´{­^KåÀ¾TÖE:Þe%ðÍ˼Rɤ0 ߯ø gw]â‚/V­Šý§!Ô… ñ„”úB5àróú6{ù£3é¿ëŠ®í0Tws›yrš—Úlvr…,ÜóÌ”°&\äõ{ý+ã§ oÞË è¸Ï9¾©B´JX»õ•<+ÿÖEFTÆû‰Dåâ†÷rïË~&Åqô=Öëô|­ÞxÍKþC¥Ç5Jÿ\ý eÄi‰ÃYvÆ*u+òSÀ š£øe‚±_«x^C´'³(Sy(AÓ€@ðÇØÎv2j½&ö—â|è,xTó|o$úÖLý˜¤„yq¡š„H“;Õ696ó&ö61’C¥p%n䇣E‘ Ũ—~†‹*‹™ÈäòQq2·HAi>RF½+7qUk#a˜FËVò“û5Ò Å˜è5áÏ’4²¦o»EìmD[…«ÐJ{ù+¿™h¾ê5Ãúh4:Q«ÍÜT‰#gþ1ºmß™T\šò Ð…5—R8OkJG9´ 3 3â—ùêæ$xdUcÑY¦- Ã-ŒzÜ…ÔìEÐEÛÔª| ¨Œ7º%HàhŒX¸ÀÇŒ^c¥l:éN©}WŽ‹4ÒúkVÇrŸ™ÀÐÎv­¨"#³ ž§ ;ᧈ~æ ˜!Ћå[‹–sTžÑ_ ¢÷SÒ¬5 @ÀxcÉ„tna"™€ª? .n@ÒzVË.äpŽ$Þô—- Ôì×íö -”UyŠÆæÇ®DyTñVd¥ÙHjg«1º½*wåŒú©^YÚìf%9WîjÏMû²xæb. ™åÇ8ç0Ô8£RKŠ“ŸPްhŽ*^øÔ>¾ã ’s}2 ÐIâý¾’o8÷µò:‚—ß{㔦UäžNZY ×¾…¼Å­³°]²$í¾Ä¶~yòb´å¹¦¯ð®DzÌR>G˜Óšé^-îµ™,\²÷zÚÝœx%:€7_£.óÛàaåÚ¸MDVªRWýÀ<'º' ‰¿Gu™²DG{À0l—/Z~ûU»ÖT·Y6z5º—ŒÏe:wOFFs0OEFZ‘¯¼R2۷߸NJeŒÙÈšðšwV <ûÙáöíûÓ|øÁ£ŸÅG,.H±(Eè$Ýë )qŠÀYù\¸à§p60¥xîÇèPÔLr* ÿçœ@dŠÛ`Ø_”ŸÞá×uiœŒy®ËÔàBïéÙ¶!f°æ2Úe‚q+ê¼›»‘eòyÜBÌýÅc…Ž>ú4^0TõüöÎRÝEpÒ¶a MüñòÖ±ØiÍî@©Z_Ò',›§H#Õ“ÜG&Üzêt÷¯är6#Kè°JÌ´ü~Zk9’ë_,×B\%kÝ$îS¹•œk/ƒ-½Ûp@K Mvý0öÌ/¬Ÿ;ª²²ï'{Àð¸,|˜üZ‰tkà§刬#” ‰ÞÃ3õj~„bcâq'Ÿ¶9È’×ÀL×1oÛœGË”Öûìh×صfuOÐ}³½k×;õœí ¢Ávp— fÔ©¸X ѾŸðÿClEOÿmƲ}7ûå<%ì•H8åÜF:’{êyì0œÝ9‹4ºÓÌ£lz¨<’qoßéY¼xÀ7)ÒÔnoýÙy¡a@‘ã< _°ƒ‚2¼u÷=ʇâsQøÜ=Ÿ¾'Â%6 h fû> ØùáÅý5 R`ªQ£%¦æÚöû(Üìag?çÙݸÐV‘$l{’ é7ü;ÔsŸâãV¥¤ÒéPŒ‡ÃŸY(BcÈ27=qÕîÙ=àjWºô } Û"ó×·Žûš mæ ïZ@è¹ßAëmh¦Iç@WkH0÷l†ÁU^=øAkñÔKûQðýΰ#ò—ª·àH1 ÍaY”ÏxË¥¢nH—IRCnÆüª¹ÈF4SÿVð“„Frݺ†©L2»yâÛ} yŸ©s­„¾“ ÔÍûáì_]mšj¢×o”<Ùýâ¦ÿ5àë<ÃñÄ“Œð\³Úň=)Z<ç&éÙ´“_vV(@KÓÂxûŒþ¼}ˆËõâÄNYüþwSsnèÞDhÅO ÓtWöÔì¹Øp+¶Eq BÃüp®Ä3@–Å®ËpèNÃ÷D•R{ü…½ŒípÚ#N­€gp+&ŽfYCõÎçm £2;tÑëc «1ZtMbvôóC€à&G]·›™M&t…÷Ûõo*wV}fåvc‚f_.Y§eê&Vìó]îÙ¬½gl;ÆUºOQȬ®‚ªëö®Té ŠP‰e”a’œä‰!52øãÒô%…iáç’ 3ìócîòIplRòY’PébIëM`1‘HªœæÿAÁéáæ›UÍúnŒ. Éؼm›˜BœÀbNHD—¬%´C+oI-(Јf†b»TÏÛGAXå/ã•ÄD+˜Kë²URôé©÷ɧ]‚Az¤‰•ÙA”>ŽA±*òN°z_3Ê}°ßض—]il;Vw¨Ç&жÕ÷Ü$pIk*gµ²xÅWL»‘Ê ƒõ÷”äˆÉ¾¸‚ù’꿆ìOå@ztïX>ó²¨i,tåª@¿’a§µR8_»öæ=Òh¤FZö>=ôÞàDç‚,¾ +º'Jì ×ÉQF’Àõ޵I5ZV8ß²¯,rJô(Ç;ÐDz1šØ8»G Ç(„£ÿδêmÃ÷ð¨[©¨­}ßÿ2¯ì.¾ˆá»M9ÊcßµÚØYø»~$lþê{vô©DWL(ñSIâǾîç K4œÿ@<™!â¶&Ž¿´Ú”™+åB«ÁŠ`f0x›†¯“fT^3kÇ¿£‘t}ˆ!{Ò¾z0;†ÍÆ–W¡þ ©hŸÚ³w Ÿ'uü‰Ê¸à©ø¢U¥m*¬íŽÕÞ>Áo+*Ù¶®s(UñºV@u—‚ÆýCÙŒ¢ƒ…®•š“ÉórOõð‘'1Î(cøÙ8*ùÜÃ"Ñ˹žåµ¶Æ‚>‹÷ˆ êÅ`Ê*&_~îÔh"í%Jg¬¸f@Òø`nü",ç8ÑöŽc´Œ#øÀ_ïh± EVÂ2tVaíªBÓolC;”Ù0Í2¢´–1¾(+,ã7zÃ7?Eoý¶Á÷ä<ò?´GÀ~áŒÑR¹£ÞAD¥" Uü23:béKè~Q¸„ŸƒœÃF¼þ*ŸèÐ1Ì‘À!,Ú;g?•1FÃZEÀÏ“•ŸBÇ0¹yé2†E÷‘;!¹»¥Þµ‡ûß]´È’TÝ Tpx.Ц¦HNq ɰ{N„+ òœ5HœóÄ4æEÀDãÀË*ˆ·‘ÈŽŸ#møÜ©(DR£r oµ…¤ê¬CÎäK |mF1µm‹¥ˆÕŒ³¬8`«û*XIÇ.‘¡ 9½Ð_aÐz.êï,ŠÛû?G™Ë! ò†ÆWÄ“¸}ÌC]¡â ’JØÅÍÏ;bëcKл£!­¬8Ìó…@# o %¤+a2>f~ëHÏ õÇ&™\ï`S1f\’馌DM3MQþH7¸0÷õzx:êwªäpµ›²ié9û,éesüA5Cg6ÀÖÚcà\ÃÔ“êYJµC§˜ø-y§Ãcº ™9~|£¸ßºý„ {óI¶°è³q‘ó.|ö]ÊVšJëC¹”Rn:¿Ú ]e)ôÌL)ëÿð©Ö6Üâ‡'b}@û>¼ "ú½JñèämC#Þv9;‡XB°kÕ£"¢¤v™üž*DDÖ.—òmï=ê%ú-9³_$¡ Ô‘ÈÝUš,ð?Œ mx™ÁëÓJ.ÝfZV¨»PoaDן1Í3ÆhkXø¶Ž=™2zÕ<Ï"s®Ñt¿|G¡Ø£¢†"Ã{9ÿ®æÝfÉ:ߤ{@WŒƒ¨1µÊ>±Àat„Evàazq€¡;Ô‚¨J™‰QÒ#ÑãÛ›ÂO6q`9ÖB‰Ò¦×æ¬FìžÔûÙf/ù©È¸~±8¸D*•y{*´3az0\ûLŸLø›Zˆ/Ám&wÃÃÀI*îoÙ®)¡¯? Vc¦pà"¥¡Ym[ê˜T˜în÷4ÿ‰§Ü®³ÜU*F=Qrþÿrû*ÜóüЈRRPØ¿E¢xïè´:#ŽÈïËÆ¸ßž³ýIó„þŸ(; ªz–·io§ó–*…èë{&ï9èêæz 4ƒÏˆÃŠ‘-ìóÑŸP'*U®“Ã=’l†Wy.ˆÝ[îƒÏ˜PÄêÔ }[ˆûöÇ»&÷ÔLS$]©Ub" p/*±+µ«]¶TYXßùA³’lÇvÙº:¸äpéº+å·Kúd½‰N½‚¥t®¢Î”áR»Yœ»ƒ^éeŒIïå÷Ö6Z`®Î»šô {·ÅË\V–_¼„`ª‰Éö]Í‚gâ…yÜøÈhÌ ‘pü^¥_Ï]­úZ™u€.©ºÄ5XVì fNÝý2µÂ\í~E‰ZþQU^È•D—j~R¤x˜iýá4Ò ú½¢LÕ#°¿¾þUê‰;ÕÐ+k ‹™djoîgV6@ÛäÍ$”EcÀи{"µpSmBŽ”EïkòXŽ”˜Žáü”“ó“yeäÚ÷Ö·ðòº(¦}¾ŸÆMÎìþ½9hd¢}Þ,Ç ¨æS8Û´ãçìÍiL3Úê}ÔG ?·)—LÇ òi¿”ܶŠÝë}B¥‹ç‰‚kc£~ÔØ[ÆYJð)v臒_¿TðòvVæþB-9£..¥8§!ìÿì/7Vd(ÏyÑÛgßMÎ}Éü¡o|íÒóMÁ¨x]Þˆ àg“¨Ó$šºèÀ°“›ãQ@YZrtracklayer/data/targets.rda0000644000175400017540000016772013556116552017223 0ustar00biocbuildbiocbuildý7zXZi"Þ6!ÏXÌíü@ï”])TW"änRÊŸãXg€ÆqÅjnçj-&éµrYØàŒÎz{¢¡ðŸ²{Ph,H?Ž5q4ù¢cqèçtA1³‘û«|½¶v"ÊSþX¢‹ÄbÁCA!A•*T:ÃBÙgq‘rlͨäÚÖ©_Ó•Ò"x _J‹Õç:ö›.òðÝî¨Î%5¾óý¯œFáY*\•Â]£|_’šžýÑÆâJš E§¢‡;§µbm«Í˜òùó|¿$.I/üý1ãá— /Ì:YÝe©»êôñÎÿK÷R'G{| l7f1@f? Ê™7`âÉд»Å båýÆ…sì’:=}\™–yÂäºpŸ|i· î)ä.–¡½!ú{G ôÙUvJ -ˆË“ý±î 7zû†Ù&Ó¢•Ñ÷&+O¥‰3Yç?;ßj®èUå,Ñ<¨6n6š‘D|Éá± ÿT^d;·±¡Ys¤©/mE#ëåÞ?`äþ$éš9å×<°Çîoôûj±\K=‘¥!HSØ¿e]èQq:aziÅ%2I HÖ‰rSN |r+||éü=®ßi¥£]»M»É|¦¸eß’I3‰Æ!±ˆˆ¼ß .JñØ5t|ø¦Mç9ÈÃÁ í;¬ð\âÌÕÀ÷9 ˆªÒ`Aó[¡ê²k¾)xâÜÐ Ë×zù´>"–5بš á×£TõvøHPVc´› ~PkÎêÑF~”Ú·í²_“îsá›&ŸJ¥QG|n"Q!–”çæ€þ… ß(µL)Bb¿Íík9N³Ž²DËÙût ÷8;Ÿþ\òX@,JxNe8PÈC2'scwÙÆ5õð¶oÐ/É'H‡ ƒWqÂÛi™zå_“"Ya‡HN «#’ ²³æ\„·L½a* >€„¾ò~~ÉOR¯x‹h›Waaçç„ôq亙ùÌú‚ü×a˜ŸOŽYÂdA&˜]å«EInV'7ÿÀ¹ùûsw(5ùÃÁ³užtk[< ;¹xý«š–¨¬A(Ÿ9ÓvTr“ŒLòbÙ˜ Ú§NÍÊšúA Ýc°bÜES°k&ènïå¤Á˜ÞßNQ£D\¨ßâów¾ù¿ïx ±£/G\¥pP3þGCïhITZnegÎLZøkÛÙ÷éºJÌr–¿\%7y› M=¥%JHô‰Üy¦ÏÆ À ewøí´—s6A]úG—Fys7숷ï±Í €—\P>Ò¸û¾¢©xeY_ï°u~Ù 2Ã>ÝÉ®¶)n*ó ÖB*ú?º³Çi6¬B÷‹ówÅyÞ6Pxo¾i´â´,AÜÙßÌ »¬ãÐc¨:Æ>’;š G(†KwregLêfH௹¢l¿~· $ׇÐKˆ\Éž­½TîÿŸ‹¡7,4 ûS¿AF¬o½çž!$fœGN9áŸÂ_ÿ4² 1Å~Nç;XšÆð5–Ò‰&ÉÎ!•EíÑkAÜÓRÂõb—C4JÂÓQ/‚^»Æ\ ÚUÝlré Ÿ_:«û@;U÷ƒI›ï}‹é°¿µÊHăd•ЩñàÈi© Åaî=  3¹(À¶…hÜH±ôÛ‡WË6Ѿ ³†Y—%Ñ4äRñ,³qCâÍlÞÏiqR:Æœ<’{&Œ..Ùy(ß $êçݰFs„S!(Öéà±Á.k¨›ã ’mw‡Yo%| rgá=µé¿ωÌ9—¬uOØïfw›~8¨£0 r¦N:ûÂÆOÚ>ð`4û½%n] F|û}Þ²;IwÛßIÜ÷³W*•ü7¢À℉oôJý¢ùÏ)^2=ú&–õ}F½’-çJÛ'޼1°F™>@3{”r¤EPX‡`\ÛÒøXȺÖT*l2ÝÉ"ŸOã1„ã†AH˜#ÿT]GSÈBêŠA•Ò*,‘²òPMø1! väDÙ 2Šx=ÖDãÊ2Œ$5Á€ ¬:¨²Âç8j‚ªœÆŽ,Ü(ÝûÀ ·&¦ áòɬ¨RîûÖ:!oHnpiå)¸ÚöÙÞRb¨rÆ/·ëØufJ²N‰ >pmªã!Ji§`)¾®UžMiHë4L6×ñ¥gŒ+—…9¥¼JM»ð™&p*‹àê8ÜØ_Ê©i-tîcÛüŠØß{üuæ=r¬^j®=Z«Õq¼ûg™è|SÆ%ƒvÅ”{âìr#ÚÂRj&«›Iø™…+`Éçqë9ÏÓ<û£š{x—D]†¨,P„çõWß©Næ\Õã%é`ó%‘LÕxÆ›·,!1ó†!û•9}k4CÐ{(s!ù"ËÖ7 Ï f`²“£H¸ßB5$\ž"’…Æú/­º)®|ªº1® 'å`ÞäHˆ,љǴý¿&ùHW<Þ$Gd ÊÓHLƒ8ƒ¶|a|íðÅñ#ÔÂvó¦íq[~o®ÛÉ:þ¹ŒMs0_KÕ2dÏæåJ•Ó¥ÅåžP 7W®¤Ò¡TOúòœ#Æ÷zWäuÀ÷rËþ#½†c³þ&‰sFÜÙ„¤SbU¦O¾iÈJO#·3Üì 6«m‘ebÁºå6Õ\PqAæá¥ìù§aâƒJ0îÄ‚½DÖØ´«¾ ภ´é­š "*†œ†õÎ(a¥Û”ö»v•ã°ñÙª]ªã6âRmTgzF&†ìH,òëÑv½–ã¯xàîÄ­•öçp %§áÙáËš|ýï±,¡™ ꙢüßNmÚ^Øq+\æ²÷Ù&sw a I(HøØåKuŠWƒ ÂlP£øQ<ß ¡ÛN% _ŸEZñmDµ«2)¦+ÌTb‰È׺éy]± ìÛ[X¾C¶¨¡r¶ÂlêqØÜø^Š¡õŽ‚‹>Ÿ< Í[¨”AXœÜNz_õ¸Š×í9*ˆ‡¬ä’¬Wg×zå*ϤJµrÊ:ÖÈOºÐDLh Ÿ$çµä‚ 4WŠ=ªr«6«ÝûgaU ej',Πê Þ½/d /uF€?Ôd-bk‚®ÊxU~v˜ÍÃö:á Sã%áœmq 15ïœþ9Øs ÛÂ'ü©œmT‚PBù«Àø%fè} ­óbÖR~10†æjµÐ v­Ôî°;©.$ xšTuÍÞ8Ô%ÿ”ë»ã•gaãi;k¿Õ¨˜0Tެ ÐÃ/­_4l¸êý•;Q[BØ«°ƒÓ!&ÿ ·µ§1ÖÝÓßêtèœp}»¶¶B¶Ä„hðmS·HŠˆ( h ¦zuÝÓà¶›MôR­Üd<´¡JŽÇ¡§È‡aör”í¥BéþØ4‚…Pa4wŠ”…ÂçCDÊHZ4¹… ~êõM¦­nÛÆeˆ&Á´ÚRôRT=x&a7Õ’ßû@öÅhZ$º9ƒ(ÚhHÑÙ¹PdžÖ‚½‹¯Ù´Pîîãšçö|Ûÿ:1\þ¹ºÜ|â©Cmó{ á rl øiÃ}ËòG¼áÀÏMr³&ŠrÇ’H˜…DC79%¤ íu¤Ké´,½+›@vØH+c³»X÷º£–œ&Ëðþ+÷Ý}.¥G»k|ø[:¹ˆ Y$ÂáOç,œì“{õ¹| /û™Ä/ŸÑ;ÁwA/+:»ƒOw¸²ªÝ„4AÒy¬ü‡Ð[V­ÿÕ8È” #açzÊ'3|å)Q?ƒF s“æ‡"­ÇWëËÙ€ âÖ åÚEðk¹RÑa±n)«µ×'#çR~^ý"a‘œ¢’âLòš×K?³ÆBç†tHÌ W÷JÜwæ5e(õC­Ú5ô\ ³`Õ'ñÀ§º"’†–ö›Éš³âoÑêMö]ÀA jŒ®o^Óö‘b#«õl*fÔýiÌ™:¤k­½º­ñXäïû‹Ãóõ@ßF×"Іãz—¶9]¦F',­ˆqz9àEÁЃԲŽ:.:FHi½e£ –ÖÁ¼ëÑ«ÚÌ$“z^¸ºfä)-™‰nÀÎéS3ø(9äÙ>ó2–}Ç[—ù.)75„ê]e7wI|@ÎU¤G©bÆD䈠ϣú¸/õI߆hÅ„ygnC¯M«CkÆq§ö-e¶Q Ô‰¹hgЃ“²@e”_"¤ ŠàÝd!;ôäþ˜ó=X%[¹õÎý.×/¹…Ì[tÕ-~o@IÚÕüð˜îMgB„C#´ü!iüj£Í‰Ö-ªà’Ã.\™aÞ˃›*Éèi÷;ä"SF–ŽÈÆëªí(  }Ô›… ½© ½:²¤ 6Oã«êô޲`]Kçë0 ¾­½ç1PbˆG‰MïX]Ÿ;³, Ò³Åÿ´Ç ÑwÈËwý³&©–Q¿/וƒós•NªOáa;p RJrR$|ëxp9O˜ô߉íùÇ଀SŸ-ã)j+RQ•¢“}zó¡æN{²>"¾Q¨¶°,ð¶ˆ.uvê”`(T`®¦ZoE<ÿ€2QVö†_;eöØ=“ WîyiÞ=x4[é`“æª}q¨Hìv©ì| `óM½NÔ4Ô fy¡¢¶äKÕM Wè©ÐH§?Oísôa޶•sçp°qÖ—1C~§4 ©Dr‚`ùŠ„}V8TrC”¥>öÕÝS1$þ|̰¿g?\]Ãè¦m§…ZÛv?Ï`t£ÏéáÕ.¿q¥\aÙÖäBQ÷yKÕ rtW´È4ÁU…`fÙAyu?à½yƒeÉh¡äµöÌšt^ì¿q¼{³$µQ~ÊN™ ¸ôÓ¶MÓ”ÙNÅZ«zi­ð,|UA´[~‰Õ;1¤ ¬Þý#Ì¥ÄÌ!< É²›FuËⳫ4MFÍ7éÓ›Â& m«˜Ý¤c‰‰v? 4m  t¾ñúdé0Æ“ƒ¬Œ?g¨+Š —PÍ?•¼ó&Ú¼M-ªaæÏÚ¯» Žœ„(µƒêß2Ôq©Z’ëð\A7Ï ­dCâË>?øj_ŠU;%6K€è«4º]2svˆìr†û6= z‘=×ÁŽšìrSâ¼Ð`±( VàwüÝÅ_/îñs‹yúþá…€€oz õ¬v²ýû«áBÖ‹… Ö#jõŠ´†¦Ý„fÂÆš8ÊtÎñš¼9œã;ºß+ÁÐÞÐ<µP·/dAš!¿›ÿÅ#Z+DáBOÍõžX„àíûj= ;¯†¦ÉÅ‚š˜"9« Þn÷wvn(à|­Ñ@(Yk‰ESªßWÔÊï߉‹ÃŽòE/¶;l+f´·}éc& º¾V þ)”ȳ¶Hx³Âƒ‘ƒíKÐ"×=|™zEçÔ ¯%%¹HèÛÙ¤ƒÊU5²¬«ƒç5\£ÑìýÃÒû”LJ°¶‰í^J¥•øðãÀ(˜y­ŒK­³IÒª°ž©4š]¿‡uPI¸Þ®x=êÄTÂ’ó"’‚öžýܯ€ªsÁÕ.&š+Cóü™¿R•ÐÖMfC/ÖUŽÆzõë]¯‘á~‚Dû§´[]º5õ)Dô£v ,IZiT[ºkÈèW2Òzâçû“ 6‰D…w±7ƒ2š;ØÍpùÛÍ–‚lb:úE¤wmöår&Ù ûÉ!‘øv‘ϸ™ëÔ(#ÇTÕ‘\Ÿ5-ÍhûŠýzÎÄBç[€gW<ŽÁܹ&{Áÿ²ùº< ¬ô— døŒEWiC?oÑ«DÅ}ÑF:ðöšÿÐß>;îà‚‚ô“5ÂÇ—ÓújÖésžF¯½¡ÑÀì»è!Hg\–ëÕ3¢@ Õ°¬’: 7¾'‰æ>ã‘øë¯;b? ˆª‘eÇŸE ì¡ÞÙxH3z=® –ÚÿÏÈ*ø±ŒL¨â½À:9þúµ®¯ŽtÅ$r&Úý:óéQs<+"«±½6Á´þ5‚ `Ñ^KÙ*—·Lfh9 FO{>$ÚRõ«®5Ƨ>Æ’=¡±—Ü ß6ŒÓ¨r¸E”Ÿ}›ùJ&¦[ÈÑ 5sùuÐÊ5hPÿŸòüÎ#fŠÅeß®ØâäÁ<És0ãu©ô{.K[¾ðY¬?"&ìät±“u¾Èì6btÊaµ*îIþ…’h/²ii˜çt7Í{ŠVÁ=Õg¡"@zM’]jÂT›§VÒº06A5PmS3­µ3NŸž)zÉBQÞyqë'94øŒfxLÄö:ÈAyøšÜ*–=ì93r"%³sÔÌcê2(òûušw9ŸÓ¶ý“¬Q²©ëÑ;ÈzÍB•&·Ý‰óz–ò›`ƒDùè ‡P!#¯qWVæ/×)žŒ¯AQ¡W:èD`ñË µ*Mle¹›–Ò:ë*þIÖ·Ö=&üX1¾…™5‰|ˆfsétЃ{=;«§ÜG’oe±Vs9alÍù¤/åÝ÷]f  Ì”©¨Ô»)CUïï¤Åew©àj³ßWnúU¤!ûƒ @¤TûêϲU %sú<54›D|§?&|Û_‚Þ°©n5¼úaû쿵 ¹ÛŠqaqßyÐké‚Îé}§Ö ®sÞx$„'Û‹ó¢³&xß*²†Z­2bŒ»‹j—[Þnly|ל)ṵ̂T+ Y,ºTgú@NtTœJÎ~½¥¬C“ÊÏZÃX f-ÜœãiI9ZÀúš&¾c5+¸i*Q­ÆPsÖNØœ—a$51?ù¶S:²”ˆ±Òª„À/pp^£7²ôÍ¿þ°s5ä×UÁƒ Ü„Evõ„׺eȦngN§¡ÌÆ{0Ò`ôöB ýQ§îZJE¤F¿sPÚaG?Ù}E,»‘ñ°xyÛ pÌL½ÝøGéÓˆ}îË—á€Ý¦æb¾oì“˺”-H”/Ø$Q¢w¶Ù®sù¾Á;±@n2`Ô;; [-;´²iU U]õÐÇxq´Œðò„ãS Úh\y=%ðû‹Ð·´Xß­1dÂÜWolë¢Gž¹æTyœt¡0ê¡ã²^›‡ #QBÛ¦]uYù[}­›ä2+® "©Cý·n–Fô7-6ˆƒ´œŒ÷Y,0ZûµXPñqÓÊFa»ý…0Ö]Á]5¤ý~Â)q¡ª»yƒùR[~{Pœ|ùmZľõŠ/“šã{ qدús³=eŒà«l$ðj)ÉO×±‡ß°Ëóe) ¢ÅøMg_Œ×üÈ݃fF…òrâ@Oc×nþÀæ^Ð è– 1 £ÖU†qšý €Ü-‰:å°…8cøW™Kp&ñNâÝu4P„õôÊœ6ÕÙó]/²ù /3ÎÄP±š…!Ùa: IK3d”§á‡´Iì´Ñ§rœ/(“B%ùÆ¡•Ï¡ý¬yXmM‡V½Æî³ÄTd§ýÅTÑWê!ÚØ<ómJÿ(è8emÞ~oP‰Æ Ú`»êp>Z_zZŒ•UßßPpÐ í/[ˆ7\Ä={e<-Xë¨pÓŸö…IÄÎ[ã—w¸Ã¤‡¦_ÓŸžéÆ<ìaºÁƇüôË­)KàG·ª ¥üݳ@×ËzÎ|©3ÊB¢ûâªΕ_àís4Ô 2nÉ+?›¯×`èÝp…OX[Â:Ã3÷dck‚üð¶AEÑQÂ8Þ>öž/¿Á›O‰£Öy-Ûƒ‚z¤~” i1ü¨Ü=²ï—åâ§¼÷MÞ'#pÚÔêZRLNYÈ]°ÂO1ôuÕ­ú{€N4@åÓdG¢4¥%m?h8ÚëVІ€ÖöF¸H£¹Â)d+C€§ v'·{±ôF°Ô¤(Gï=lâ!=H²§X#¦0~ïY*j÷gÕJ”Ó§rd;”‘EiÔÇí N‰f¹yªOUg ìœê”×ùÖPz!Ù˜…±¤³ØÉúÃ^w³7‰7fÂùÐ'jQ6|7\ò&’E²ž1=€¡9€ì oJ«; ;Ý'ó»òß«†xU‘ŽèÙöY§Øò‰ÐJ@ /nÅ„c+d-¾DÁ_-ÁtÀ•^S®ëõMÄxBе º'âYßX~.8K@óN;”0ÔDnÔèQ!PÂF¤Šàp-Åt~Ž4¬Ý/8ÃØxµãc·3…‡6V×RìhJr;RÉÅSïmk¨+G#a« h!6Ã!û õ‹—Ž€êqnˆï8É!@ÕÐNcÉ⇺V›C¿’°‹Ž„ A„šœ»‚ Ãkdà÷9ÖÆ=-ƒ.ïà7”ÕÈ3t#9Ià;¹§¯Ã8²GXծᦑ­DļæbßS¬ ñÎ ®¹îã'!iæcéI%ò˜ˆ ÚT¨zH¥øª4K†Œ^€ÇTµs[ÎI—-a4´Ñ§oŽ­5.,ÍùµS}½ˆmîñÄÔPyÛýÕpGT̸U•ÅdSÎAÂ"ô B§ù1¾XÄ/ÝJBÐaç„\àã3’ò†~щ_4A ãÅ€O¡4hËà®- *ù'IîÀÙ=ãÀê€-†L¬ñ-nBcï¸ôŽk¦’b¿zúå-àTš1á!–GMÙ¨¼ïÐJy¤‘¾™è„'#®lQ$­‘wx=ÿåHœS¤w‘?ÀhÜxu~ Ò†LŒ&Xuy?^‚ýÜ7ÁPÌ2'ïlÒX¤Ò ¸á5¦M£T-‡ë ©¤Ê4U YI„z~ ›-5´!j`8×£#vUCÚ1X4Ü«ØñÑ¢mË¿h©>Â-eAÛ»ø”Öm 0¦àè"ã]è³r¨E¶ÕÔ-ï¶™¿O9$%QåÁ:²h¶4‚ޏߓÆÃEý2K89°8õpÒPN"Ž Â@`d//â¿TŽ_ p#‰6$ #Äü÷rÄÓs’¼ýªg °mÈýÜ'´iÑÃS~á;÷@»¸×Y°¢ü„͵13¦žl'IÀz Ù¹M`ת À&üºÁûWq¸î‰ùkeÜlŸ÷–<\ÀÕïiî IºÍDž£ÀÏj¡üÜä¯ývTdâ'xš¹puú6ìíÀ@Ï^‘q÷'urN`tÉÿ Ö#*Š\¥×¦ôÄ.ÏÁm­ǰÊ=¼! ˆš…V„úŸ”®¹gqËzî 4%«‚FÕ4ÝCàHg |¯ú‘Gò37p¼ÅôcK/XFÿf™_í)¥—& Ê0Ðå".vk(wÛb­ì“hÀ饲Œ¡hûsêàËÒUà+ù…ç0ÔÊ'^Ðî˜ÓiYè ²¬¸÷,?—²{7-Ñþó- ûÔ ¨Øüi¥·³šz_šåÿ3o}ÌTs+¾PÆÖÇ\û² ­´:ÄPðPê/s§"é„«]½ßÚãÆþ_MN¨îÂ=@¼-Ó†™˜EHñóü™‹Û¡ÑcBèûÐ63û8ùéÒŒ»ÙQCò3/–/×L)XƒÃ+Ç×à8¥ƒ…‘ÞWžröƒw¬Öê¢ØLv^â1 Æ'¤1e«åu›€Fw+´CZ(âlVÂè&/!&+9µá_ÈûŸèÁýœ–²~RVFF„:õâ]&áÞŒ®ƒæKè v,Ó€ª%[ª¸í9€¬€‚¬ƒfj¾Ð?!íÑXžn‹&%®çé'À‡-”èªM®ÕX„ñ¶N梎Ð0Av[“á?ÂÁIÀ2/oÞ–…6âA'‹Š5ñ;•™ÙúG>Å+I_™ïèbJvªYÊŠ¨€oå׿ù¡»Ø÷‹Ðqš›‡sØt©—·,p_IᆕR;‚¿{ÙùËP«1¶¦e”¤%sûK8‹OÜ€²M7é†|¶ÄÜϡعÊ.Þ·káÑá^éuÞt¹™ñò޽ã_–×m¡¦äîÔ×ÞtÊËá îÞ,Í7¸â=¬¥¢Q78˜ŸD6¡ƒúÞ°¨¢¾Jޏú°È°rBŠÁ ±}•keiy§Šžè v0ŠšÎru-lö š2B<šCy½å†Åª‘xC϶~åéœÇd<èí©Ëûê)øÙ’AúE'±—ÁKsÂYbG|¹ÛD•@³ž„5·qn¡Äël³Å?mÔÆï™öªÿë<¢öJ£ëšB°h·ïB ©B†ëÉ ÏåÛÒ׃#!ö” ï†<²Ü ´,âѵ’Úñ0øš;5_÷u’ Œá±Mˆè;×õy/ýÕñ~] ·^zïhàsÒ=qqlCtˆøýÃy;’­8›øŸ‡ûÇ{&Øì~ì2¾S!Çþ„Tʨ¼©\{¯&æ suTÞìpŠwBn GPR¥eá%©…½€hhG¹ØIÕ§H§qgwU<-ðÁ¾|»ÏE‚È] •JÛÖ,ý—Žx5²“ÊígSg‹Ë󵿷f)ŸTܹ…M.P¦[NáÌöhì*Ãb(vÞ¯M3óY@£‘¥0›KL¶P”²ÖH1„,› gŽ2¬H}÷u´qÞ¼À‘öÚÛ)^3¨I bH’ ÛZFAÈ¥ƒˆvªv—ût¶ŒÝÓëÑKc§tý›;w™Qãx¢ø£Èœ^«°¤ - QäƒÀŠî¶vò<¹F¢© K¨é¢Èâ}`Î… {4wäº@9HÛ÷À6#JÓ$6‡2VÔ†o(û¦E/žç®ÍÝÚš Åï/Q˜5ÌØ.UŠ_dGã¯WÐê,âÁ8,,Ο⌠‘ˆ_§# £ÅÄZ cå"( ã0²©AÛÙnΟ8ÛFÝâ¢÷г¼Ð°+~*`y¬¦ºÓ:ßvµÇÈ/á0nšNýv¥<9­¨ÇþUÄåÏéwÜÿñ¿®GŠ: Eg¶Ü%´9Šã{ (0ŠXŽovž.床ñ å–Q1€‰ac`GÔüÏS²šÚ€‹Ü\t5AW)³¿+Ïú”yEÈYÚÆˆÞöê³Ýã³#˃!%E&†91z¤¡Õ§hÛޱë–í}pκ׬hðŸjmÛb“MtœÛ:êm°k„ó­``>äÀ.αL5Ï 5¿›+s tþ&}–Œ&fË@„çŠ ˜-JŽlÿ|±¦,*hsšÐEµ÷º˜‡É¼M –ts¤Ø¶Ö¡œ R@Î/58ÔºXÑ“€å¥¼n «ê¶ëO¸à“_Òðx&ðǦBj˜ì<¸A‰òq¼)Sâ£MDß §‡ùX§Ü{JYÒÁ€m Š Á9NkUÅùžÂÏÕÓ¤ü²B¶]åĆӋ³6~dñߥ¥8ô™ÃÎÍ2QÑâ!$0C‚$ØFþ[Tºs;ú6R2±˜âE£ÑêÉþ=ow|SFsg¤€¯æ«Ñ %ƒ‚= hÈ;¬—Y¶·£‹Yï1ÀW°@™A‚i€NÇ´a-÷aéÜ£à´{„>“ú­o$œÿ»„ˆä'Ö¿š)ꇑ=øúò³I=¸—]Ú#•1п£Gb:½NÁGŽ <êbt-|½I§òçK>‡[NB1 è_m%MgEü!g{VI@­WJ[»JÇ((:éHæm£ože‡6К ΪM T!ž”‘KV9-¡{>:5bï Œ¦?ÉïØ\i¦=ì*É÷MÞ§æT²Ê§wê‘FR¢J÷ Fî‰ðÙÒíubvjÕp/Õ£ò¸X×ïØ-¦…“ÓÒyR‹T Døy¨)õêœ=œfÕÝRй˜«îö /ÐÜŒÖ8éÛã*]rU—žç¤ob¢Ñ=õ\?0Œ• B<¦p}c^.ñŒ·>ï\¬&ºçó§€|ú3±F‘eŸhK‚ÕT÷ãÿ<µ¡Ñ{vNmÝP>@öUd¬rú=vO7`LÔ¨¾Å?×ZžXþbHF‚ŒóÎCŽWï ë¹€ÃnX@¹x`>m+š7ûMÕàCj¾‘í@êК»cb‘{&SYìþD ´L\´zÿ`·‚Ïžmcg/‡°|ô¿ò"³÷%÷ºæsuÍY¿qögiÁÁŠàCÔè"ŒËöЩ”%pX¸Ì’#j|³ÿöcýÐæ5Y2Î8“æGI=vÿÜfž[š¤âJðWÙ`c÷và……|Ê\K¦›ÍEÜUnŽM&V&ç@)Ê!NœÓÿXô[}ïïMkÛhÒÖbJ}–l‰ Yýµ¦ÕÔ¶´ ¨2 G©H5)Ûé )Û ¤ëâ¨ñ@QÄóµ„ä$Ì,v©å¬/4?–âiˆ \NÙ ¤Øþuj‚3 ïÉâXþÓÒ‹l4ÞO!/oPÚ7=¸M¦îû´},dã•–‡‹U²ÈÑd…ǰ•½^¼iƒÇýÍã,•‰õ¦iøìQ!~«F61c}„*ÉÓ¨Nðæ®‹Âઋ1IÈnzÝ r›”X,‘V5¡¥‡?O>¦ÃšX¦hÀÜ,G.ýàÂg5˜90ï#Z ÚR;¦à$ë¤íÙƒŒ+ôéÀlØ ŒÃƼXrë'zóm,» H¼ ¸ë¨A Gèø³o ³Tb‘dD|„‘èÅV|âà¸B†Ú]G«íeê›YÍ:†ê@ÇšÖž%=~4·]ïNó¯ÈdâMFO­Õî…)8&h}Ø wÕgàP`.ÔØ¾M΄ž¥*÷¼CxÚá|UøQ 4jŠf܉ýàç hQRî$äl @Øé‰¾ï6îH¶²î7ÝשMnëzU۸鿵û«ü¿>^n–õ„¿Í}þO7‰±ñ™b¹"¨ëÞ,&læ®Î½pe1NaÆA]˜äâBkóþZ)„i+Ua˜<˜Qr ñdµŠIc:ešÙqqb<†`°æžŸoýSEíO“¢°55TÁŒõ º°3Èú—̄ΰ¹‚s´þ5ƒdõèᾄÏ#n »/ f8RÛÿïZ–¶¤>®S´œm… IÚªÂÈ{HÊýã¡ê¿Ái âõåè:(V a°ôʆtÔ¤â€EtȘŒ:æ«m¶±ŠrW@éû´,B •çLÇÐ0C å 1PÉ~âþ‘ýnëY·ÁµTÃ…Î?™Û—Hõ@™÷Òq¨¹6¸]6€[›÷´¶…z‚/×>M¸ˆ„ 2}×r¦¶¾°¡ÄÛ1ž¨`òS2f>Ž¡Øäág@¼ FcU†®Ì´e͇Þ8 k‹xþò1ŸL0÷‰¹htåÁÂDpCm}ÇL-ç¶ 4‚µ“Kþ B÷²jJ±c¡BÊÒ/%˜+µ+’¢W¥ -ˆ7øßK+´@N<¬¡N—þúœåŒ;…ܲ?Äè–ëUb»Gt“3ezë! êz-b cS[Ñmöh«­Užmî˜m`°•xx:M †VUšP"¾á> Xç™q‡ñ¢ÙßcÕ‚; m–Ž›* …^˜‡]°t¦¨ú=ØPÿ¤Öi“«9†éSS\™ÉDãmE!š†Öé+Oôª<úJW^œe¸­Qi qC2»£bÔWÌŠ}n¦d¥¼”†”1‰³Âcg+e…{;$Õi|bp•6ðH1û™LXˆU7ÄÀó~•«W™V»%9àáuQ~ g¬¸Ô8Šè0H†§mF߯õéåý÷É>Ê0^FŠög6lrߎ„¹©ÞDé¬|Œç0I*VÜ[V/f=È™÷2¸E¹´¸d¹ÿYØÔÁ‘G\w²Rig›þ”ò@ŸõJ„UÀÕšõ@¢Ê]È@LÚçQƒxã+f@Yc û 3rÞ#|à¬`ÿ»ÆÍŸ1ì¤g»õ-~ÙšÇÓç®yÃÛ•.ÕÄm×°•Pr´ë§–ùÚ2®¾Ü´\еꈕfñ`î˜í^ê!Ž4(eNtîa‰m€Û~H¬ŒtÌ{|¦_ý¢âòG|ft´¡½óÒ8B|æß¼ïyùôLÂíªõÎöX^q½MÕå×ÃÇRÖ¤"u׎q ÆZkÛäqM)~»0Ø¥Ù-Xä™(ŽõÊ“ô‡A‰Ã†—ÛBÝ™Mómqm9ÈyÈ_6 Wâ—§À+‘×Ç' AÕ×F”³Xâdtª÷Ã…¶¹„ºne»Jƒ+ñ¢F*C/¥wP§ëÒj¯^ æÉu·B6 À¸%5bŠj¡'dM8‰5"éèm¯4Œ³/­I‚v6”xì q>RR—Û6Ë\¡¨·òiØ”ÕÂÉïÌ:“PáÑ.8Ftþ©~yŽ/¯"ø8tÐ*s«²ÕÿÄS`cÏ…öíÛþ{¢Ý¢ó«aÑê1Xÿ!ÀpþšúÖëÌÑý< ù¯füéuźÎCÿ>Ëþ~!i4Ø<œWp*lßm‰T¦–|Íf£».Ãýù :éÝ®¯Ö&§xÜá"&"7²—“ j»%ÛfDLÄð´O¹ˆ–\³F‰|/L‡¨JÜ€49£$ÝaN«åKÄíYíÖøzíØK´²C.Á±÷%iÈs$–†«©©|Àç…>¦Ÿ“oÊ5A{Äì®Bôûκ£Ü §×@º3 ö/¿@^¨!]ÒìË™}¢ÀC¿(‹¢¯Ì‡W7—F;Ù«Ë‚§  p;ن슮 5ºˆ+"[gíNhî1J“㘸¶¦Þ°œ¦ú­ü³Ü a±£Gqð4$R±Ã­Ã­ø¹Ú¸vˆï±”v@ÏaŠijÎÿ(BÊN7ºàû Í引ÓhÜÍbí?€ ñ_äð2*E’È&0§¡ªl‘j£w"òŸCÜwk0ž7 A;(•ø*Ç|×—ËÚS…  9ª|*Ï:€æ]ø•ú›ƒQMcDØ5”N˜Ì—7ÕW å:¯Z&¸€µ¤”;ÚK4¯/ë:©_+ã@F©M²ÈÃ>ðÏ“µ¸ðŠ–ÀA’òs&_ÎÄ56rã·g.ÂFϲmâ†HÚ|(jJ œÇ¥Åžó³(pÚß=ÿW2&ËzoÊ3"‹‰Ò·A* FC=UŽCuƒžÖÅçaG¬2î ˆAR°Í[/Í™;¡;e‰ B‡ØBô!±=7ÓH—¸àXÃ-樂;Œ§ n˜*vÝ¢†S¥£¾Âv†—Ó},ð6=…~–è¨ß¤Õz4qïգ߲žsw§ªýäÑ@+‡KÑ1‡©‰Ë&؈Œ O9’üª¸'è»þ.Ÿ¾ñ¢HHˆÝº7ÆÇš^PÚµ õŠ´‘²óWóSP²Z|Ñ’Í&ÆG‹3täw*†ð­`»§½×ºÍÑc€¯ÜÀ´­§]Éz´«]¡Ó°7î[(eÖd¤ˆÔ)´÷UolrM²o/4ë e ØÊ<˜d¨ÁÉûC‡`ˆ©¶¢Ý¤ý€âpÁ%„.Ê¿’z€ }žO)‹,–¶ãa ‰÷+äöÁ+»"C&D ]aönŽ[ñ}dÍ1ÞÚRÒ„ìÕÛ­¢œ@éýÂH6J3B攋\¦{ ëP ªMWS3ã¾a§Ë‰­¨Ùa×NÝ€w!m«%Ñrô?QPö@ölCíP]vÓ±MØKJR©19fqŸØÖpw³å#¯– Ô Ô?Ÿœ‰ mõIàÉˤúœx«!¶¡‡ªrÛÌš)¯0:* ËÅÁhí  "òtÌo_æ`M ðZM!ቓ²ÇÈÊM|pžYQ®ZÏp&èÑVAiש6„0È6ƒ¶<0³–©-K´oRÇNÕž‹ÀÂÍv°“Ûw¤—÷·žq”åŸ:9,@•—•ƈiƒ›¯½eRZËĤpÿ¾ñ‹hït•1olÉÖg’ÜíúR¢Ý¤Ñ^©Q‘®)…u‘=¿K¬Bñ ’ˆŠèÌ[E£ðJ˜ù×Ò‰,xñÛÞövs›ôÄmL“€yÀì—)`c¢½ò›ô¥ÆÞ&R‰¦”‡TvEowÎ]'èõÛ‘•׺œl9„1‘‹€`¶#+´ÉŽà+)šÈtéÕ‘õ W¶åÿ'A(O·Úõ/ÿäáèNäÆeœ4—M'‰¹Æ‡¡9)ÄvÅ7¿~bVíkÙãñö¬]'b. ÂÞbݲV°ëwŠyŠòõ8í1G˜uÔ²Ò$¸ù‰áR€uóTZ„ág79ÛÁ䃊ëÖ£±%ÇJùØfù‘JÈŒonöm) 'Â9³Ä,%!ÍeD eqÄ4 YPIè"SžÇ({öñy™@æ»u»0«ŠV:þ )ºÐ°:Üׄ/c®_• ƒÁœùPJ‹ùj`Á¢+êÇŸÒ>cšÁpº9’ð3g#æ¢ØTM2XndžA(°îÀ+íWcƒ¥×%%oá:‹Ô†iúчӌÅUSI¾þÔ±—G–ÄVYg ÖüC¡bðo«ÖFøOOL Ð’£Æ˜Ê i!*[ßIóSÿèÑó ²Â¾eqxeG:–py•Àdp~ä^[f«´øš$XW—ì¼ùã³J̧Á-æd\ý_3_Y޲ÏÁòê¢òç•ièÔÔÅ¿+©ËÚ?e–ß= lÉç ”à!@9 —Z@y`j}î2`7¶öý Üªµ}Lϵ»©£1c@ÄJRÔ†[k†Á.Rvfꞯa¤ù8í×.OFúLšò{–ø~|áß×U'‡‹þ1¼éA#N¹sU.BGY™7oà!MÓà ]™©ôÏœ2¢}-ôb«káàÉÈú|ûNõ8ð±ÛjëcX¨Ñ:¤k©åÊ+"fðÝs¤/›\¦¿¿qD­(—Â&ˆ‰SÃ)p‘Ld‹+x«O_‚Ó#=_IªÚö-“¸3tµ×ßî±'‰-ç^#£#[î¹a2“! xÃ<{…ÄôìÂò±ˆtZ§yêb\Ïw5@{ol‘E6‡½Ò]׳öç°ýƒg³ûó%iHˆVÃ4öM¾EÜ?]¹R6Ï®ÈÄ«X$¾c"yŒRÓþýµÌSm³I=-ñøÂ‚Žx"Hµ±ëZHÊ žŽgž‚$ç}î‚bVÏìf& 4ñ*öE;Äõ•¬ ™VlE†>q&(OS@ð8÷Úº¹<µpoWkX,¾Û‰ … jøH¥ç4Ö "Økr0\“Ýd͸¦É“Ń è>É®Oãƒë¡ŽŠ,Ùveï˜qÁuÕÛO  t9RK@E€øÁÿ€z\„%œšP;?öDP¿Í*tì§xvHlÐyJ¢§1} ¦‹3–RÎþÆ8" .CrW„A ôÊž‚¢x¬z_ƒ²ÿÙ%3ˆµú§-t R( ‰—©–—†ýD7âYߢÃr$ˆKã$ùö µ%Ï ùÛ} _©©7¼»N%•o%wZT¶#ŽõÆq5„Æ0§7r:û©Ë8rÙšU¾ƒ«ò†—(çM!€336p·ÄùH“—?4ÅO²uUïÓHÄ"ó\øntå<ÌzÒ4ò>«ŸûBû$N£˜JÀaBõ‹¶/µ’ ¼$‚ݤ½yô[‚†´ÃþMò{Ý4æ;A”hжÙ³~Co½ Žé²ûßã{kÛȦ¾•‚Ê*B*Æ×Ö³ÒLz1ö8ÔêÁ¥SŠZƒùóÖÜf nÄSUöÕ# DÉ÷zïÔveàÒYê¦õQÊÆÓ.kÇ9×E:Ã¥Söj²§¨C°2¯œúøg›“Pÿ!+qÔ Ýüž(£(ÝϤR|Ùìs£sºÜ7Ó«HWqÈKÚƒ¯YÙ†Ž«pÀr_»‡aœjà­l4ïT†„ÖDí™}½Û±;?d¶S±Ì‘ÌQ#6Q&^Ëœùýƒ²}lš,¤fyc²/£ÒÆrü|Xð9 òuç.iîÁŸSp´NÜëÜÉ'– ‚Çã?l‹ˆû˜÷Ó­cÛQæQ¾T­rYö:6îcojióìïÖl¼Ïw_1¾Ãq]¤ ê67}â›Wß×ëGæÂ©üT1 @ wO¶û•‹H[³Ð†|TB°nøHÐì,ûWms2¬¤®1*p¯jJöx¾O«†~kè Ÿ|Ú¾Ò4’h¼3}ÌŒ~¶.¤"ǘ©Uµ¼Ÿ~Ѻ<©3#ïᲸÎô7¡…á€]Íìè|Í”v‹× ÚË3Lªíßewëî€&ÍÎÔÊê”=¤ra5 Ç®õ9úµ¸^Sê†À âžÁ&ÌÛÇ·ø“L5\ê¦#²4Ë‚;¯hµ¦†•†y¸ £»Û\W¨ÅˆA7¬±èš—î0ûסÁïØªZþHŒx·»`r-…¿ýá ¡ìi¹Bô]V¬Ú­àÕ{ÁCeèSž¶4\Þ¿# ÍK?ìIÛvª¾ú’$¹S•¸&M›€=ÑSŸÔ¶ñâ£놦À}äìd…¦½~*Åxb«w0òf»Mýû™“dŒJ¸¾jɦÑ×@eŒˆpkÞµ çýO^ò„¬ˆ{¼žÕüÚß'å#þÔd¾\ÌuèS© Ô@…¨Ì'ÌGµÜEA›Q‘£ë.¥EH!ç/1¹2Y_Ï-Y;VS]O¯k•¨N¯1)"çÝLÐÛ´½j¦L53Ú™S$tÿ¼§7¼AØ(PlÇ®³ÞÎ1Ësל‚Kªæ!QaÔ>f°¨–E…¯oÿyTÌ9Ïb>.y峇†å Ç‹–qþ¶‡†Iš/ä]5kãs÷È$óu*6LEŽbjÉÞÞÔͪ°¥b~ ôòa½øª”Ð[º]WƒZøÚ˜×Ð8Û]PêÆÝURÒßP3 lûVÔ}8`¯Á÷óøoŸŸ´£½ÊŽFgmñ7zœÙòECI ¨¨Ô¨iÖ–vi7«X0è+M’O¯É»Û‰ãã+ÐzÞ¬|Ë<±%H`êØƦƒ£>ó°ÝƒìN@#ºáîgcÖép…]Mˆß€b°-r¸º®ÝUä©xQàõ‹­$ïÕ««8¢"MaYô޶ßký<=©ì·N€ƒc»d¯vþ44fcTš(ô3[L\ÞÕãF/T“O]'9Ôºy£áù|!p¾ ,/Q/à Ô-)±§ªí% Ÿ¤€¯Dàd„¹¿ÝŒû#ÅçM ˜¼±­1b(`0ñÇRÄ‹ç¶HÅùê+Wñ;±Gã ƒ‚žV§_…> £iL¾?`9‡gÌê7å½Ú‚]÷µ{hžž¬g­û¥øô,=7ŽÃA_a5°žpÁ4ÎÒç=!{íçŠk•ˆNÜ·ÝP[bìÛŒ½ |Íœ[\’Y& bÒáH¬s®5c¾¦£´'ãG©v\¢ºR#Ï™ÏÞ®ß@5ÝQrñŒR“³nÁû€ôÌ:&‡‹Òsi²}j]0<Θ/#(3¢ ³…0Šì< ¦¥eicT@Á¡µwu70î%U0M¥JÊZçÞ*—EÌŪ§u‰ì´Hq’ʦZè!ÔÈkF#vè\Ž„Ñ(c#»gåª;¶›u6Kûâ)±ßY銟šŸÊÊå>yÈɔ蘗ßÁ‰!܉#!ì°)9ÅTWÔB ùù!ñ–ÎØ·¦öß{Ñ,‡ïhd¡ê)=r)šÄú˜™ª,ż·îÊ?*/—ƒ/YÖMh\•f]³¬) :[zäž ½X­ M˜ÿ÷ž¿{œé‡MáÇ(Än4ØÇ©¦½zþ¬é«#Û‹»Ùöîp>CWÜËóÔźóÁ€~ÉA» K Ò¤\!‘:|vz…[!uæå|^~š\,‘+•†ÛÍCÇGZöÅ~ 6M¤qPa‹ Ë ûd%'áäã逇)è*0äëÓXóDåŠ%Ù³ƒß‘í;íÍÐÃõÄ‚>œNªšÎ$ù³tÇãYW,ë»?¿‚)déP T£n!˜NºìÈy²Xe`i_f{3—ÝÕ½ï]µjµsø[´7ÆÄ¢ÖϬT*„ tÌžu×nkÄáÙPÙÂrš“tPÏgÛÆÒ‚©ÑØÆ]|ýÀ:ðöIãÍÊ$T p^N[ÐË Â…SI/§’e¹u¦õ{ù@6Ót@Î’g¥â.”$ lÕJ/« tº*0DŽú-8®±¥»Ù¡bžãïÃ(í§Í~G¾¿ç‡ Æ\ÒóÇQ "*2ÞóMqÈ¢HWþ®Àd9×Èœþ™îŸ9šHC|O`pc=^Ñz=R€\Ç/)áÿî¦!d&³ãª5ä'•ÊßýOgˆüÞ$ÿðe™°7“ˆê‚~øtZ–7ù¾Oÿú¥‘A1áñO±nEXI®z„Ô6ßêñÒaþ0×å±Y"ÊVl¼Ë¿¯&Èd? ‡9ÔJd#údšÄ¡´š~ˆªÓ7fЍS¤ñ¬»ßœ5й*$èú%ÁH=T¦Ï‚*¡óð%‘ï)RVG"ÄÄ‹¢ˆpZƒnÖ-qæ‡þ‹€§êgn7Áþœ—¯« ’A÷CÁRçz{­0ÿEa3iw¹#Y݇Ӥ‚©^é*CƒÄÕÇo†Þò›û Ù%æHkÙPÿ}ŽÆioKXhPÌ5¼T©à2½2¢;¼ u¤ÿ)@…ŒC$àì¾/Í–&oJ}ºÞ,7‹ž˜Ï/ºæ5ÿ  –’ ˆHA|“‚¾àj^°¥tï,N{R+.¼™,‚åAÍbuIÔÀé÷qFÕŠ“šúÎý½0¤V{ÓÌÁ(~½r\Á6Éœ‹XÊZ{>² c€Ò¨—ú¬ð+»7« €ê:}äÌ£ÈK¶Æ Éù™Üo´ss>ON2aò1Èü­ï*bß«êô×iä;…òZå$$Ì7*1*µEwªF¢Ä•<)=p9^^S€Êz,ËДC¯åí+gÚi&p§¸Õ-8&ß&ÓÆfHô¡xú¢Œné(ð–%ÇûK7§WpÏ&—­dXþNv® Äë ^Ò¤ç$̘€á‹g:j4û¨k Ä"Àè•ÝÁÿ5]£BD™Ý^Íb3NÞКŽ²¬"œoÌÞ>4ÒµpnUë3páBâùаm"‰qˆ&Çóµž9Ì·©MTÈ‚5¢ ÐóùÅü;" œ¦ìK‹íýùaŸïùŒ&(^[Ø¢¨m7›(ïrÔV"„„]6ŽZXyˆ#'ô €„Fà¡O£òX»N»ª_«ÙB#b2°ûrÌ&Ϲ¯ô$]ê(übVI\8M®/šìE-;Ÿ"+¿g^ꔽNèΧª_Ä:&’·0ßM‘ÙööZ'Y~ÝA¤¼œ÷rÏ©"±™ˆ¤~|I@o%,akâ,Âo$dèg3w¼n=Iÿãöëweµ³h—Ùûêhäà¥Ö³ñÎbhçåâ7h׌FGöøÒäŒXoGoí;‚gø¬p„Ï(ª;R¶-ÓÖÿ,÷Cšã>A…oP»ì|_‰ï¤<4PüØY‡lúœî:95GxÞÇQ0 ÃÒA8Üöس£v±R­¦>{õé¹SC‰¤òƒóM’æ^ÁrŸzŽb¡™&]£gú90Qís‰—/Þû°cÄŽ¨z\x–OÖª© kÎjÊÔ 7ðÙDÚÚÚ; Zýî°k ÷x6šŒüä;¥p©ë³“fˆ(Sj[É«x3CZvÆ¿}‹®ô›ÊíS/£…Œ ¶û‡@œƒ ñ²:à 2Jêÿ0hÄï}5Z~Q23«Ž MYôèkóJÍ·fvø=m3É{ÉåÛ”¹É¢°1°–S󦿹“ Ü69lÆ2mtj§Í¯#àºÎžb|í(¦IÓ£^&QsŽ&Ñ‘˜ü‹V‰$‹¶°o£·ÓFô²$Õ«aŸáÒ~Ðè{âpÂÍÝœþºhö5Ø"y•šLέ$ÄÑ Y )Õ«RA$ à v©†·ò‰£ÚK”$Î`ë­ínºìN'I]L6`©¯€_w çð›þŒóÙ<Ë17’u½ñÂÇYèª)^‰Ä™Òh€„£º%÷=g䨃ºhðôýlåÚDð>ãûí!cbåˆyRK¶ž06Y™‘)¤ÔyTË!˜¤KöwnYVÓG‹éŸ–/Œ” ª[!=B“_Q8ÔÚ!¡’çp›]Ÿ†¾@e’ºWÊ0ŠQ³×2¥ ɨ¯, ÆšÌO¥¹H‡YÛÎÆD[™±‚"@/X(VŠT p•Ñë\ûë¬1Röä*¿ySkŸßÑK‹–Ø $ªÍZe<²Eó¥½mDK,Ïá3ŽÕ›@’Ëpç1ìÂElû• i 5/ðìŠñ}d9¦Ò0ÿp’ßzæ\WÒ‹Œ¶?{Ìžë'F%Ÿ¶b›úztNEÓÏWÈ‘+lžAÛ',è*7Jú—ÂÕ\Ð=4"%s?—å*—Z´â —~¥–†A©>ë ¦3‚5"x©reWÑ×-ŽÑ"ÿ’·¡TÒëЪ¢zek¥®fAç±dãzA7êЪoé>M^õTü¬£›²ˆ A ª!‡Ïé6ÿÞtSl?]¸Yì¥ññjrñ—g,`.5„¿á4(¨ÛltçMÿa«˜4Ž!ÿJ;óù”Œ÷ºqLȱũN¼ü¯«©#ÉÙQæû‰–vŠ>ƒ*ÅC¦¹¨t0|BPÑÞéó‘-ßì!Ôþ[éŸæÔÒ¿Ÿæ¬´ûNš+|–lú#m³~2tÒ?Zlý"'w11)È"Ÿ­e"ù XÓüø½EƤS¹0kÁ°õnÿêÚËšl‹3ÑŠ:$­ªµ2°-h`)‡oý+P¦Ê1 Ç>ŠYè^—UÖ™ÊLÓOóÛ•¤ ‚z/Âêªî»ÎûhÍÊn#ñ]°í†»ãÃí;ÉÝb(‹èKkM(Ù…!F"?Ž¥DŽ7: H9bà­\k\)w9ènG¿!äÙÌ×I»ó+ «Äï0ɤ­ÌÅp ÎÔ…!Ù>XêªÛ€•]Ú•$®Ý6ŸfµÖ¿ÆzM9•¹úžw@>Rå‡B‚SIíDŒ^I¾WqþÆôè¡`Hg€Ã{Dg¬ÿŸ›]„šð¾—ýå5‚EåШ¥wÑ–u5Öêægý}0ݪúQo6¹2ëïg½œ±íx:ß'¼ÿf>$¢ ß2¤qN ·¹þÒNiß²=< V€ÃÓž{’^öpQÔ'»¨y¶8á `zö ˆê_»”úåÇóú¬¥S>/%VýìäBªÑ4áß?™õÔ§mÒ&ÃsçšQ•’5&›1º[vk‘Ou{ 5çŸö4§¡ñSè:ëB΃­GÛid{Êu.T¤>æ!‹; ïD4ôvêF¶tæßƒI\"Î4²Äõ¾ã©I¯Ôý¢šäÚcGHˆ/F ßxœ"ÚÅwwºƒÌ…Œiº„A5|z50 ðÚþòßàû&“Q†çq˜:êÄ(¤øÿZ0‡©s-¯Ì rÌÞcÐè{^d^sÕc^Á,›L6] q¥¢*¶ºˆz­s-¸ñ¼Àõò,/X!B ©Q «üá”o0më&xÞd'ÛIA™+²÷(ìä( ¯-ª[¤KB×~nÇâ¾EzLý³‘Ëd×P/t„D¼œ…ã“ T¬õ0a6¾Á~w"L«ž?µâíLñ¶G>1—s:¢Ê°È«ÿ²›±Ï2=+n+U"ÄwanŒºõF\L(6^&™†ÐVKèÂ$à£3Ù›t° [>Ž0'N¨Wïõhœ Û&vDüoxw»ŸÆ É «58]mªO¢c5Â݃÷/¿Üm‚~÷»ö_XgRNàoÐFÀΆµE;nò ¡]ÁŽÚ¸RÞZg¨…¥©R)elå¦2±{›§ÄIHŠƒuYùYbJyË»ëôo‹±&\fFH iï…‰ÿgýi4Mµ;9h!du´ tECïéÄ´ÇõÕÞªsgÿ”àšäY®ó–{¦iT)]a‚b#a_|”L»aˆŠ_ön&s¤R‰Z~wÌåóI$‰zl(º;ÆIî3Mµ 𥮤ïðÉ8Rï¤û'“Qý=‹¼É“†9—¨a⛜Aioóù¶öÏ›?4p¥·ÅF²;7£…[È»™nHïÊ·òÝðHÖhò0³q¹TmSô¶%ì•L-¤~>³¿Cî‘3ÜLL.»¬4’höX±ÍŸÏ˵E*#n‡:€èwm´ ¤k]b%ȑ޳1óú'Ú#ôƒôõ^-÷ö–—©<ÜoFg§?- +£<Ñ@ä~œÁQqðò”MäkÕ‘˜"ª2¶Äk|šÓm‹_:¢‰'NrpÞ z‚G-›bÙŸÓÔÔi~õè¦Ìy¡¥7ëŸ^7…?e«Ôç“ðÿDfyóˆ•u‰¦€ 94Û¨m»†ó$Ž—˜:LJ]Œââ›1gðFðk“« $±u ¯óG%'ìå1>…7ól㢵ê›y/\–´’¦N—ζ 'Üc™lQX0§¸Ú§G§áã2¶bŠ[Å1Â+õ]àgHÃåjze’ë÷á-Lšä`3ÞkéÍš âúj³ÊCÔ”å›W„ìÅöúFi…©æS¾ÚÏêèË)ÓÂØ)O¿Žü£4læÜÛÇzþ¨€±y Øœ‚à`’å£"'àX·sÛ°»” $I\”@—µy½¯ú7u…‡#YvÊûÝÝàÃ\vü–Ùvb6.7·Èâv``aJžŒÈ”h8¿{OËeªUÅõÂüHøã§ÓŘekGb}‹Yœ/·Ç¢š%Zãß’Èׄ`̧¬«µ0¹á€ˆ $|ÜsÄsH,høy­”¦±áŸ®õä²Éþ§*ÞlætÊvgåjKæ‡}S'­KŠÙ—Ó§iô÷ŽÑAÅ;É(aj©¿c‰ÍRðü„~‡ižx…Åœ³>;JSPðÒ+«ó 3†-@÷!mÿpªF¹ì´ñù›ur­2zoí-2[!ô 1î 5–ËmÖOP)tîq‚£sʦ•ò¡ª9ÄDÅ}Ï:™Ÿ­‚!ºÃ Î? 0nÕxüäXGÇR1˜¦kEºÒuæyˆ¦t€z(ؤòªðí¡DÃ>íñò‰(âY¿Dr¶œb31›üÞ˜ZÑËénNºg¥Ú o oê™âf¯‚au‡Á¨UÄ‹£™&–·2„ÿƒ/ÒÏ;gÂT IrâøA…Á<,Ûò0¨<5ñZŽÆDTs[Ý }­›ûW¥5ØñK‘rñ%’ç\æÙ5šBUüÁÇÀ¿köl;‰x.œõ™nsèp¨šÎ„´íbÂ(.…5(6²Â‘Ä0=u!SCÄb+ÄZžkG˜‡=‹•¨1y¶ç@‹lD; g]güõç"?D–®¸K‚‰w„=é­Ýýª$í{AIën ¢šGy_ϼßB‰³X!?ô½c³*Ž8ò𠡝”ƒ„*–#8íÓp»Ñn¢!\ I¶ )޳"°û)OÛ(å‘u‘ÇYê(WžœÊµ§dŸf™† ‡uó7µ«Œ[mW¬ýZ£ ½zóŒÏ“­Aáè“Ï{yÁ$—Æ5X+‘‘ýˆhm¿Q"KDÔUOV¶Ð—d;ÎäQ#ªPÚV%›·¯‚ø@6cLÑ`â@‰ç õÒßiV)<5ÀÕÿäsþQ=ö5jŒÜ-*Ê1ÂEˆfdýj .AwLÝ3jŽ”'%“™‹aG[Ê÷ Oàh^¥qt$dz¶¹–ÄNð§ÉÌo>1ƒ½Íw3ýôwŽ™BåÔPVÒ¼åKê̺f;´4_oÞ@urp[?_æLúÞ]ÕÓ#jr%Ô.íR2èí¥Ìušã)ˆî<ºžyý¡NãD' õ¡f§í“X$j'c¬Qdž®^K¼þuQŒeb·0.Kò~{>Ä ZÎ{_Y}W‡êNPùD ÛÓ­‘ÏÌÑZß.äGˆÊV-P(¡÷åtAª­ƒÀy¶€³9…Šuì»ýûyéDÞùîï5wÚ5Oн[´(î2© €Œ“ûß=ˆŽR\ÝTñĘ‘#') ÆÒ¥¾ho™søîÆûEaâįJ^©@9˜@ÿy5é§O¬ÅýëõŸ·ot‰^Á¡…ÓÖGáVìNØÜõ€æ'ÉÙzôIâ™7Sµ9møñy*â„È7±"ý>á~VrÕ²"ˆ½’®|0‰c?ùÓ‚<[ÖÖq‡î®ˆ8ú±ˆÃ}dguÏäÞºê×Y–yÜ–¥9~^beڎ‹™Ø x‹;‹¢ª G¶¢¶^»´N Rž?NQùxkq cTr:õ÷Ô¸½'„æ&ç(Õ°ŠIJüBòR¡ÓT}¢´;ViôÊ,!}‘ TœáåšGVu®ÕC¢¥F/Œ#‹’X¼Ü©" Ü÷8ÔÓçf£‚å˜u±Ë¿ˆ$ħ]çlùã Õ¼wÝ>q@ ŸÛeRžsMj ž[2æc™Îò(,\Ÿb×sºLì‹ ‘µ³ç»¾–òÓÒM¦+€硯®/mݪÂSÆ<M±'å;4Bcœߺm&¦ïËóÑÀ¼÷s[!Rhñ#:Èài*©}Ù+É}‘§¡•h³œ¤-^`Ø5ç Z™ WSï¸Àv)Úóó­B{8èµgO­~ Mëf]ûAä¥p&€³V5ßÌ¡`Šb» "oQë Éíb4$\Qà´a?˜ž-—wRL‘ƒÜOçYñÓKÊ¡L²ÑUÙ\zêÄdŒ Ñk †ysši÷1­3ª<8ìÇ ^áL­½i„å‡?5*^„U…éWŠZççKQÎYo Ès¸\‡‰Ms–KÎÉöKÌ{vyÅ՞ͣ&FÃ!`0"F™iì¯. ÈŸp瀧@ØŽÊžqk’ Içߊ5{#%8ïù Œ:¹âA¹-ÖHzbœi(täÊpýØÃ…gD†"ŸT{eunº,žCÀ4ýdEclhMgsö2mú÷e?š·<•ùé-µªî(® (Äo•…F¥cÅ ÍÆÄ[õïnŰ`+¦óžBËvU‡Ñ…(À©û9“®s´ÆX‘?„ ¹H·e|•ßê8 i ŠO ÂI¥ãä;Ñ ºã¡«ë¢pc°¬´APŒw’‡Î^t‡§ƒTSˆÐâE½ÍëWi{êh$Ê I_OÙ‘üYÄiêÒ¾ãiñEÛ×­Rš&º¿sÑÏ7x˜‹¡´//§—]À4õÒ_,Ktí¡¶ÙÛ`û|<”±!à¹Ts¤È¶1:½öTA¨üø¬Ëùq_b™ ºà¡^<^kR]4+¹À÷ Ö÷°÷QÜÏÃ87?fûW‚ñ¬8Ø;«,ûzO@o {W[€&ö ]±I™NŒ†«Ý é ¸'×Gbî"ÊíôâY«š5—k‹Ì¢bó•è2ÒKï Åÿvr5Ë6c® ŸˆIcœ|5­UK³cÕ¾QÓÑlmÜðu/Œ˜|v–%§Òèd‚àÉÂ.k™^NU|(~¹^ðg€©Å#á=·åð+N=M°ôˆºK·¿!3ªðÌdG²2û1€9RÖËg”tUvM1ìâž"²=‡N ré…`ÒÓƉ¬k¤PH“*ýó-Â:G¿X€%{vüÐ2ôX1óqýùY.‹·íÒu1o§}$©¡Á$Ë»o‘¹nã >òÌBêW :™··½î8­ y&µÌ½@-‚ Œ½+œE>\Õkce™?]¨E‡·dŠ%‡B6‡ ¬‘§™tâ]×ôxTè«­Œ!¿¨!åÝQZóy]SØms%ä 8•€èxŽL YòÆôyF˜Â»gÇ-_¢hdôk†D–·7xÜâ_ «M›·tÜ‘UZ$wq'4çvBep÷;´òã)Þ¸ò < ¯ƒc®°/W‹D·Lé‡7íb¦V§ª—nÁ¯÷kîulÁ@— ¨®.¯:ΦlôÛ‘R¹ZP"5pØXâÆ\·Jï‘Ð]5ÄxPÈÝ÷#u#§ "Ÿú-çoÑÞXš·T ¸ñù ܵ±ê“, uk:|œô³&!Œ¢púÄ: ý´…Mlc™œ<;Ü”xøz—ѰoAb#mÁhsnÜw’¶¨Úýó%ˆ¹‰LŒ´í˜“~ÔaÜ¥dxEL*´LçÄ“‰,2•´–¤Ù£yb¢UwXp¾t¾]Á:c‡XZ“&hpGUj1ò…0eP”×ïÏpß‘™“–ð ¹Âx(Ú˜ùµË¾m]m 7K :¬1ê”då±ÈBÍ:ú±¨~â¶gî äG’x5àw¹‚Í#ÜöGo ŠMËg&/ÖÐO¤%c>{6æjYr‡|Jr¤lÁ§×Ãû€zaœfaŠmE?[ƒm~.÷Õ‚ø—“Št‰ïVÖ&3¨Ô1ðÎ?¸°êÝpÌQܵO;V†Ï–â:)/ZÉS•$i€™:™K¿cØ×ň ÌÑṲ̀NþÒBßÍäQ2*a e|SÓ–ŒÐÊîoG0Ú×lµ`F3Çp34ýG3ÅÛ2 ’°ñ°V€èÐél·hrÆDãð%ÜÄbþrÂ7/ šW’¤% 2û}l»>ØT3‚Æ™ö=ÒÐΛßËkŠ^«SX vÏ_‹e¬C’ f#IWKpßÝ#f¤Z«Ô¯Ž'â~®\fÐu"Õ©'6˜×(ÃnЕօ†q&Ü h’9 {%f,eW¡o/z] )å,#µZLþ¡s^˲ˆŒ¶G#¶l mX˜mˆˆÿ8 q¹+5àÖ“r4W‚r–›<Ü-¶úÛ‚M]÷Û+_V÷Ú1za:‚ ¾àE«WžîœóY^­¢šh›\qH«LF\HÆ»m½¯mÅfKw¹Z&™É…£ie4ÆO†ê“ÓápMc5íÕ?5!í,Ä¡#Èbh®¥Q”ÿÚôˆÿPþîYÈ €ýÏx÷Ï•°Á’£ë„7âB…º‹)Ðél¶ìqsMÒA’ò]Ÿí:Þ½¿B}=¦[¸÷ô³+Âäi}{NÇ·ÁÇ’ÕÄ«otŒ…Hr>A­œ#¥­;zÉ÷îÙЬ Z<°oר àDÀùéÆgöûíûdšª¨8 ©„K®(âp¼c>®8îU„çIïÆیÖfª ¦j6ü‘ýÈIH{“â#á÷5_§Zïñb­å€¸k!öüL4ç¦h(jµqJ%ŒÈ S#_ˆ»ˆiŸj ç#÷^FÕùÒ 3DÏÆ?ÁÝšKñžão ¦f8Òvެ¹¦%dÛüÜ¢–£ÏKx¢ÕGÒz¨™Ü†Íi×øjè˜aöõµ#-þ(`êñvì¹_³ˆ0^GéZ·JåźõØ [X¨T_ ·Î5ïcá| w[ùPPï<ž‘†=„â… è\bFƒT+ïÕÉ ô‹‘Ô¼¦Ñ•”ts³a†fjú‚–~úsÑÝÙ‚ÀB¼?™úð{ïWL°³æ¦eëÙ/~…5ø¥u6â¸$—ÈÞ(—Ê0¶ ßEz^¶ëÆSŸdõÇzêlFùµøæ\À߯*Â-o0¹$0ȱ¬ÉÁ÷²#é>]@] 2ck#VŸ`@Ÿö@ÐlÂÓÜ^À'7S/ò*Þ¬¤6y’Óð¼¨[8é2Š–2¸´çâ¬$%‹ø›ÇÚH¡k®©Iå•_ç:s½Gj;5“¼mÊÎýÓÈÈ.ØÀl(ÝõìƒsÛ• ÷÷&’N°Y}®O݉+Ò~’?±)Ý…Í«*?•Žûw9;t-Ö8¦éÄ6· Õþ3îïÓþÜÇa…0ñÓT`5+hêtJP€¿yþÖè¹Õ³¾Âò£1ú•G‘DRˆGCÿaãˆÕ¨fˉ{ü¼'¢pÉd£}P5%nñÞÆp¢¥qgÇ´Ô»À·©ø]O>moËk.!ê1Éšª©˜Ž?”ÑñU}AUýiŸÇi‰Êñ®}±EÃUˆ‡ ½hìÛK.U‡¢-ÑPká˹š=”{<üþ¶¿˜ÒºÍ91<€#Øb¢#°>8â›d/TMåV§­tæªÊÌíD“Tÿ)¾ö”bUdÔPn6ØT~/Ÿ§5¹& 1:¢°|€Ö¥%þ‰aš=ŠìÍðÛ=?FÜÂW¦•2³ì½=ÎÓЫt¸¼ëð|”¸ßÙO•>W+KA+JQ³çñ-8`¢-á¿xaÐJî¼;ËXáñ®K-€ý¦ÙrùT“—[©Š”D¨Ç×ñð9b®agLض­ –ñ¤©~nÂÿd¿¹¹Kóv#MÅ!€¡†1zòxÔ­ z©gn'üU f®úÉ·b™yjË.¸¬V§,ÚG›Ð>ÞH]g¶®ªÖr:ó†Ç’6rOØÞ ä†ÏA “"zF›Ç|‘ȇäõ£WÇŸž£Ç탛>—:¿)µwª¾ýg3ÏÙQp«è§™m~ð=™«rGH¥¼0Hx…°’<¨;qü¥¢[A‰Ú‹S€\CRôDSêqˆ6{¾0yë¼óŒ(ƒM°X—UKphX祱DœÌŸ—â0Ω¢åÊr+Å¥ºÁ|¶ÓB{½Õ.9À×êU$ m1ÁôþA+¥¯¦Æ¨íFÐQ‡F¿èr1yèÊ–ì8˜¾V¨˜_‹ѲÓÊ%P „{L­²èÝ5ã87J‡: ëŠãka¦¥DOŽOi‘Э¾ŸˆŽcRþ^66Žþ4[:m“â‘«$™{`Þ!Ÿn…ÖÎ ztx©“ȹðÑe0®ëê:³Øš”‚…ðîx9€"VïÞrs€ØŠü°ÊxÍkÇW]œÓ–UÝúÖ,ÚA®]™ÿ…Æû厢{Ðÿ?pE$ÛA75uõZLD^´ßêz tÍžB9í–ûrŸà 0ŸªßYœ¹òÞ7$W¦å)-­Ð¦X ât/~À÷Íp]fò«šTˆÓv½ÁQ©µò¾cô 0þ'wÇE­à3Ó´9o)Ã0§Q¾^Y¹ÓÉÎÛß#,í¸œ°5|ê–iG"ɬLæt“ågÒKÚ´<çNrç`Ò÷5¢îßݯFöåqYóß*5ÙÝÀÙÛ)’õj^s`,Ú‚/ D÷I[ÓeYGB„¦,Ò„& ýêÔ©ïZ‡È³${Ââ<k;&Q[¨(³Ù³ÎØÂõ*¼˜Ô£|DÄö÷BðÒ·FáPd°6ØÞÓ™Z`ïm w@àƒh?_OW©Ó•íÔ«4îv¸ÂÏÕ»ˆ;¾ô0Ôg6„7ódn…ùDšxY½wŸu¡zÎ’úf´Iø’îÈžÉJÓ5D„ÊH¤$ø…‚YQ:ê½Õc¥msb»¢ušKæìd.« š¹«s^’f~zíY‘‹û_t`d(›‡(9åî8<Ù&>hæA‹Š³#ô±–„ÖsÈ×( “ÊšFy—p{ôÐM©û…@.멃 V©Û€Ð³s¿>ÜUKœãÝF‰ÿM~Ý·p_ሺÔqŸbÆNE¤ O«>ô/!5ñ-̨*F¬°ñip/ ›³ý¸<Š™ ?Õ|Sî•Ö˜ˆ¼(‹˜ìB[ Æý%êQ:w';v"Y‹°ºP st!”õ j V™î/ìOóˆÍã7OÙø>…­Ã1€ lÙj&t,[d äåÙ.·`iNwûv(²ÒÀ4š|$Õ ¿ÕnA;n¬Ὄ¬Š«)Îy²zÏ©yŒþ“-‰Ä9TX¸ñþ•H,øõǵ¨(¡ Ø}0ü›U¼pU)‰ÈŽåöJvÐ^º‹Å›BÇ*/÷ˆˇÃMEEP.Þ}Lõ­yèA홋`VÏ:èì¯}«¼+U¢øKßÙŒP™þ³ê(í/ËBƸ¹Ïù!hW< MIŽFsöCRúTúNkÍãþ1uUüÖÚ#2YŸ×÷}ôtÚ¿9Àñ<'W«A63†5B+ræt°s£Îñ¬ƒæu”ºš0†(_µþЪí;Ò^–‹˜˜ÃþÙ–@hT¦!ƒ'”9»º PØ^s(ÏoœÎИ˜Vjõb• œf*ÍixÚöš´V2YÇ$&Nƒe†ñ[×Aê:µŽ±c ŽŠç™D0¼xŽl†ËLÓtô;Šñp­XxÖ¹WÌwrÎégL›1²X±ëOI1Å”V„ï2öåþ71žú§€<]Ô x7]OÄè[&ßÛ"Ÿ™•¶kw‘N±Óv„Ù¥½1f>G¯È“Þ"—B×Bí/g_?mÈ‹u¹M,ˆ‚;5î)_‡…8C™¤?ûÒb8Ðkg¥³S×»&X-æá–o†uòꊹá³òÝûÞz¬¹=ž‘›âlšÉšyõò›¯Ï'žÆƒÓúW¶‡5âs[g4d8¦—¿‹u-Ee[ZÕâ&4¾rÂÆÆ¶PöšD1w6ÿ}  §ö1V…÷„]•d6ùa¦­ÒSïš™™BSÿ±…ý¦¥®ÅiîÖçTó @©¶qe†v9Ñ+v…†?¬ÕË¿ÀÈ$Ñ…¾:,¦¼Ávàá(«__Ã¥4ç³.A@<.­¶ÀÛÕy¬£ðÔñuE¥ŠD¿&þ‚Õ¢f·iõ #Ç{ñT† ëöŸ¯Æ…{¼¿î®rÅ *Ô™·™ðå{¦Ëñ³•ãx&8.¥ñ·_öœZ׺ä±ßK‚¬‡!iª“u1ˆ³g¿«ã¨¯Ïë¨8GÂï½LZ¤>DC÷üsN0QSHüózÿÜÔÏ$ØH7 Ôÿ'’Úl©‡æ­h^èó<”äø-{FkVY-{¦«ÚJV6>.>ZÊM|S´ctÜLdÒbèpÕÖʸ,ÔÄnq õ’ÝøVX  Nr`>絈産û6µó™Å Ž#žÀÔ·•ãT¦üé(–$ó7ˆ¾öí»÷@‚Y~ÈmØwk-c¿ÍY¤ ÈŽÁˆ$uÚíÂ~§Ýíq;µ²±*ÖRĹÕ?u1£KÞƒš[Ln(wÔ¿lûŒ8V &|ÜjÇÃhYºmŸp«ÿ ÒÏ ÕpNOOný-æÊõCÄS'Z)™V-‹œm×MÄ£ã©ÖÐ%& -$J–1iQøPm[zñ«â:³DاŽÚŒ©!v¶i欫Îõ2S%&6‡ˆE`Úâïí'ÁÇÌe1LÝ»`êì<Í÷iF¼Ÿ‹'JÄ”Ü?oÌ3ŒQÒÕ3 Qã0RRH d×@©i‡'|l^NÿùÎ@?¹døä)7çã†ûãj#ú»0­Œ{ÈÑŸî—*¹Ö[ðöEÊfn=»RöVÕ€$t¡£r´ÜÚšzÙÏPÙ¶Ú¶©´ÒÖÙ{ú†k<ÌûÔgÄî0b+Aïÿ(þ®OºÀ¥»_–`rëzê-e_ë¯XzϾІÜgÃw œ4³}qè-³Å®•GF¦úm[î ùÝmެ¹»Þ?(61Œ˜Së#îÊr«®]c’z$¢çàV³¤íà¡%|H@v‚dÖè-cVÍ®‹?É|WMª<žÂºèšóç\[”¸¬x{²–¦TŽª×ÒtÝü(àhïødç(?ñ%$¾†Í´&¨îÀ})ä<òÉῤ¹ê¹Ð BDi3Æzå¸÷,.Á¢7ñ;È'§ Î|Pv‡Úw%ÙCWˇ±Az;Rómí±;HÍ5¤uÞ.:’‘>‚ Nºú)7üí•¢^aÔ÷Ëÿ:±t¤r5‡lŒ"D7ÁF¸|¹fµ]mzùÍã:ÕŠ]­%v¡1‹êÜïC6fÜ)æC›¸ø_Åñ™}äŠC¢eúçÈ>\ø›ÿ°Z%]߇]w ÈQ¡E°‚ŽEÜl¸ÍQ·€ÂzIAë:”ÃKm `Ä$*€ >ƒo¶b9,«ûÖ¶åXJx SÊÙkO!Pxâž–S@‘ç”-¦ÃÑåóG¿×|PpM "¢œgäÓA£±ŠH 8¹7ý”¶"";»z°’ïµêÔ¿"ïÕ\§õ4¦á0ý“Åî &®šà»Ðõ&5™Y¶™#IU›¨CÛä>ît¦±â`yÑvÌÈeÈ@]±XÅ'L›Ší,a$~È c%äÊZãÿWäȰ_^ñ#ß×Åx (o Œ<Œ¸EçdD7âÈ—p'抭3¼ëÞU=è3üXŠ ¿\§ƒâGÌîó¸æòŸ×—àg—&ân74.Îúº£{ÍÈj&ÑÂÌ_OÙ¥Ïæøt´¨…¹ÉrŴϢ³cР€ª›¶#o£?óês·ü“¸„‚ãäñw‰®&/ࣣ[î—u`¯p%ƒGÏoñQFGZü°RÄIºI%–Oõ¦a¸™rÞb8¼M,(Ÿ,räR6ÕLêV•ÎvspΡӉ ÐpAA]©Ü{‰]›FâHÕ1qw >Š•+›Kó4—¤2Fª¾wþÎæ]ý†ÓÚÿ7Yåvësû%¨î–”eªÛ·µu„â  Džße ¢ˆ«‘öÂ~@Í~œé^\w°âõï[WAOÞª¼¥ÃöÖÛJ—‚ÂvjøM+)¬§ºj# Dùï¶@º‘h–-±Î¶ `¦8ÇuÈnÅ(€‹EœØsÞøºt©wtýp@×Ðò×Íß2êSÒh\M¶ýæ2Œªä‘ãGÖÔ/„÷=–@‚cr­éh@ã=æ?|·ÑxÑ;óJº…îýÁà8ÞÑJÃ0TGäšÞZÙý©à§<Sõ:šN^”[Ð5o¬eT¨§†#o6NªÆÚ»YBŸE—ß½7Ð@gÙ—J#À~u~K•”~)€ÄáÚPò¯©þÈù1n#Bà<©.,?ʺXdG¼§½Ð8Ò¦Ÿ Ì™XÝ[PÝY$Ôï{–­®à~m¸&³­sþŽùºJAòÍ/| ì\ý¡- ‘„ç ¨È Ï¤Öµ;6!Pð–-²Ò„h}ÙÖŠeÆC¨ŸÀKÊLý^4—Ù="ÂÞ•>é;n.†_æÏïô6­3,Üž÷~À_hæó¿¥ÎU‘ZojKÍDmûa•~¸öÄZš’'ËØbdÁ ‰#$»e ÚÿÓø.òaÚâÁOƒ`µÊî­ÛÙ{6 ,Q¹Š±Ì 46‡U~qI 鹬åÁb›‰ ^Þ¨S¥îžM0«S2µÓh¶i}RÛ©,¦•§ø˜ÅåtÓð¥:#¾zCºr\î ÐäF+¨-M‰ˆŸâ¸%ñ’Ze–®[í"rÓÃN5Ë·¨0Ý^‘ÕÑhÔƒ;“y†", @ñÿDC"S*Òúе¼ò¥Ö@-Ò#‚k딆ŸÏmç%âê#²³æ žŽ~E•N‘°óÅð©6â„Þiíß_{gƒÍ; OÍÎPž%6’Kû•ÌÁæÄg/ÍÀŽòêîY?<-dªÃ!Z¾÷Ê×7"çtþ)æh£Á«°©^?RLþ†Þzݺþ¶Z 8¼Å¡0ÃQ×Ps½Ž¡úH¬ðu¦'¹;ÚÑë¼>`íWáÀd¹: þðΘ¶üÉl¼:e‡GñžK‚&ã7Ç÷—KäþâP¯sfuR¦•¿uc¡›•³â·Ê©â/Vû6s‰S<—ÊÑFUGJÂÛI €BF·Úu:*+zÖhHÇ_§o¿üjºþ©§ÔœÅåf4 Ö‚ÈÅo0ÅŠ- ¯@Pð4_Þä1‚é¢6×u]WVõ–útk£+ÒyÛÞ7 2N"ì×|*@7'$q"ʤv ès"[\î±%ÊÁL9‹ró©j¯XeœšNê~ùtMÅ÷§ÈG§}sD[YXÖ±_*iæU’·5ÎòÏðÓ’D=«Ú/x&[Al3Ïu@ôæ0¶}Õy ÁÀ±Ò›«óZÙ˜±üFfûl½RJbúÙ”ëÙ—åañ£t¦•@Yp€ù$ Î ¹þPù £ž¶Õ ú m_ šþžKZ´žšñK€ŒÆ\ùîÅ÷üg`ÔhPoÚ£Öïü_ØíŠäQ÷¡©V¥éH_–éÇÄW" bΤH{,È;8I€XñŽJ?ë"µõV‡O„šß/_¿ÜŠE69.¯Uƒ=u9³ŒõÇOõfF3c~I‚€Üã–½§M¶Ã-xÇhªÊ?BOD+BSy©°rf`†X¬U •ã•ô˜µ½$«…ó¤O´GàxÏÇïý=8y÷ªŽ2¬œ]²Ïª6] ZšÐö¨ãçÌ1#9è«g0Tƒœn°ÍMûSCï † ɾ¼`IõLÅBñ>"…Lõïö=VR,Jqî@ÜëhATtÞ³x\‘( öLÎëë ¸ühƒõ¨Äk˜L0‰W­Ra¶³šN¼_rFÝ„þ{¢ÖCQ±ñìóàPSj¸ªœ,þG|b÷¤Ò¯X¿¬‰)ŠØL€V·`Ïäü!ð-µ>ÒƒK÷˜]‘¡ðýñ^Ü„Óä7Pô »ïç›ä9´ª§ÀŸçŒaØö#©~¤÷ Âͪ—!÷µx™?ºgØÞˆ.‡!& i7n7m¥û©Ñ•4û…œ‰5°ÿ ÇgBŸêÖŠø²×jGñ®ýXØ)€–ûYîàWàû6 ö”l¥SúI8ã²oÐ û’±\ ð"á!IÁÚXUHnšŽ— ÒÀ¾¶ãÈéãaQ‡¸ðÇ‘Þ h_ú–¸I©^à‚ù˜q­)zǬÝ8"5ª]%ìér­(î@ù'…רç¾WA³Î!'’Џ¦’qŒ·a(³Â­Ÿ&ݯÃàŸ2x¤%,Û|ÿÌ%‘B%õ_¨O&;„Eù»ÝµÝßÃñÄ-•  a›g›ÌLÎ{7mίeªº9»?ûÁ_?Duçyh¿û‘\17M¶Ü¿AJbB‹¾@Š~Ë«c$ŸX¥'Dûô^÷ÐW ä±V½…@÷ôŸ‚†Ñ?´à¹G…÷”!|™ßNÎpؼ|q_5Á|›ßeµíy4³X(#ê¦Ú´µ„Gœ¢^éR›ûd!Q‚]²˜Ý"*t´_ž¢(-ˆ‡Ç¶Àwš ã³¹·ŒºJNNSÀ™“D@Äbu\rÒ1¸´0µ¡¾xå_àÔÐëö ~‡Ãæ«~ÍÄ4ݨfŒ³FgzUê÷îú‡´ï)ŠT‘¡t•ˆdÿ”ÝBÑ3·¥ŽK!ÝÄ«PØðwͺÈào—¡+ÊãÍ)î¦ÑBš®ª»xys^eÊá­*õY`MåËj±»B»¤s¤âÚ‹Ï­cW-ôuf¨¶ž2œUhQìÅ”ŸgålRˆ“qìô$ß-:I&ñoC^&¸mºQC6tBb¼ª¨¶ò«¨;@YØ”¤Ço½D¯Û~‘np¬7Á5üØ‚Q‚½ëá]}\ñ03AÄzCãÛ¢×Ãöd¶çiøGBøBýW/ºTdØC.ÓøÀ‘2q;f5|Îwݽ²ign*"»çzÃ{l7siJXït§•éŒaƒîÊTux;R‡I™=¸†{o“"ÁŽ‹•s€\üË‘Z.Ù)ï×ø¥èì£WÒF‚ý*x¼¸'èþÅ£WE‡m›~azäÙøžkdóÄÿ¬=s 6œ-NKÆ…‘Ñ% $%dÄ'?{*jˆ ³õßÐç†nßtNð¿äZ¹Hàkã¦ï5Êsöüա·)ƒ”Ò'„m>m›3VuNÉ»ˆŠuå?ª*ñ7¦»*m«Ýc>3ø†=ÑŠ0£…y„5ž‰KzâÛhÆŽÐwỎ¢ `¶û|¡ÿJ}ÌG· DÄÈ*œûäðuĘ„·@41š+âÅ*c Ù†AmÚ ¾èžÝXµÉvi³Î²Üh̳‘?®¤¶™R>˨«ïlÔ… l¡%ÊX^2W€­D’ï!ÔÒ8+píeU—vÏgŒ8KRÌeØ€PŸ·6²–E Ô°û(™# TNÎÎÔÄ!½S“3í™Ð@f´Ñ‡Yׯk»]ä:.æå Þå_”&†R½… Ð!ÏûûÚkåæãßÈëp•áÒ·®ñ=VÄê\Óšeìî´ó ‘1ØWh÷¸^ó*®#ÚF¹qŽÊ»5Ä4UY!oׯjY™oýVÞû& ÒºP‘ýc†?têìÅNÑÈÅ›G‚±2®êÛŠ”v µÁjÊÌ4¾‘NpúÔkÐq© ×Ì졾F­ƒ1°µàEw,4¦?zÌpØø¤V¡”g[tVY³ ŸÀ|¤¨%#CÑËÝÊ·$ݘ?XB…Ÿ¡Úþµ¤§~:¢xOTYâÈ–ŽÅ¨3ësoËd*tm’GþGýQ[Jrn€‹ü@ q"Ýy{,Zƒ„4£æžŽTÉŠ!2‹…ûþ6¯(;}jB²¸låB©YGuNñƒ ¥*Lˆ³Êñ¤¹þ_|ºÔ[<d„ˆ“W»â“ÿ€³Õ>3ÈãÆ  ù é|ÏÜŽ‚ŽpÁu°úÕò0/CïE2D“™÷ŒÛNA¾¢-#A\9ø½_Á&ûõãåÜa/¼–­Í ’D*q'ØâkÉ >:a*Óv'Û=ý¨ïîÈ5ù£n’VÕZQ¢p¥oQS•#VK5×=m¹Òõ„¬î[–fð„²}GM{Ïì9½"{;g±¨ GßB÷àfq>)”lªùÓù«O…RôäácH”iN1,hxŸšÇ±~6ú]“…ÊÔ’DWÞ•©ól ¥q†æ»¥¶¥U"±H\°g±HðŽd’ÕN´Q5¯1h}¨ý½ÐDƒ*_«Y¨…=àŒ›ÉPÔ€q}Í|FÎ[®´dÙ¯ÖÝ iQÚSÊ>óH×% ÖUf÷ܯ…bEŒO~IทywmtÂ×µAF˜„¦•Æ?.ƒ&ù0‚œБ-=BD.üpáh m»(ñijvo ¥ˆèÅA-7u¨´À«Ó@PôJ–SîÚj.xÓáÀ(eÞ¢]€8¨•²Å,\ÜB#h"ßÚÁÕÍwèyYëW2Ää2'°ñþçg{>({©;ˆ€7µ#Tˆ¥¨•L¹QQ=@ת¨¹Ò²e0|ÀkG‰¹5J²ÜFž± êÎÿð7Pý>g€^»§²tfñ-ñ"lõÞ¡/¦#K¿¸K}¦fåb]ÙV›±,í†}ä´S»wk¹ÿܶn‘ìʲ·x{<WÌ™.À ¬ë·­F²À—Ïèi)O±Ç J,ŒÑÞ&õš_ßòüX1Z¡B¡¬ eîYohú_k,?¯$Ьº\£Xµy}ÔdF¼n¿(BÖ™T· õ€qÏÕaöim’ µ-=·CjáJ*ç¯o€‹ Ðâ,\ú€R1~½2Þ$^£i™;¡ÝÜM`gÄøFàK`;7Ä`üF}óJy`ËÅÞN*l LÌmí»˜*ñ AÏp‘îOC]`Ê(!iD[ª´ÊÖ/l yy[Z’SL¿iŠÝQòk'»8³èòõ3ž\1UÝ]Ô“—Ö(MýRJqø©§ÑtÁ¸ÙÛye›â[äJ—||–nÈ·eö˜'ÔAOÑÏ Wµ_F˜½ûÁdÚøÃx¹"æ+îº Œ³eªÈŠ<$xÑcô`)úgªOµ!{ɨ¸:7„ºñú족2o1– YÆ §Ç17+±ÓŠŽñ¿»T¬-¬¢=«%G=7ÿ¹UÕax{ß—jÖKNƒ<C'ÇAcßìd‰wH¬4³Ò_…Þãv¬‰×@à®Â˜Ûn0±ƒLlÚ¯tÓÂ=œ¨ï dBùž9Év#*K¯4!ÿÔ÷0{ØãPÒÎቾ‹ÐHs}-)ùjÝ,Š´”ù$#¸ …6#-nÂc¢ø~êYÊ<öÎÿýwÒl#5C3•{RÞ¼+C-nÜõKZ+è!f¬EÃdj^u˜·¸×Áá§–u;ào·§?êB9§5,d#Þ'Ù9=\⢶ױ•˜Wäêeôwå²Ö––ÿ‡ÍiïHÞÙ&´£ðMT•…)‘(ùBRv‘±ornNtf¤:t2ÜcgîL466©¡ÑÝH¨ïz"ˆ,¿$+A‡S?6ö‚f–Øî—ƋΠXÑnØÕ õx½ãGX1Á°–¥¢À\² >ب›œ±^ì úÞ°B"稞p¿øŒa8I™qò±ÚiÅDfݧRÁƒöZÝÙÅgú4@F÷›Â€PŒÂ„k¸–þ³5—šÌ€Ù˜u ¯†t¹_ÖÇâO߆¡} »•íޗʳ,Ù ¾æ¨K¿7R ÆÙ¨˜©`ªRk\è­øÍ®ŸÝQ n0.{–àe! ˇö›^éV ÛC¬ŸõI¸%á õ!ƒ–Z¹Žq×âšÃô¸5Èt5Քķª]K½q˜,ÿjòy\ÿœXpñÙ¤–;øCCO¢M\ÜIÉ„ïúô¤èPÆÝÒE­óåQdõ]lLC÷ÂË5®bnNXÕ‰_½B6R¹Z·Dx™ HùÍ »µ¢á­ ,®•rÎT†Âé;F¯Zì”é`¬w ¿·öÎ'á@#J«bÃÑÍ0iT¹¼À0þðxMDTC0©Ó:$Ô®n|KæùÔò;×VóÙ]ŠEDŠ÷Üÿ¡bÙÍÚ ÅY˜»·êoE®/—=»è„}ipþš¢ÿZ®«qǾ…Rf¸—£˜Sç0b°‚¾Ôƒó5D ܰn"ia\¿:ñDœ­ŸÃ¸ñK¼M§ÕC&s Fù”xäÛ/“ͨ§ÙEL‹¹áºß0Mòãâ6¤!ÈE.åÜÜ:ħU‰X¶Z‰gm!¯¾4=tox±Wô &“ÀvHVÃØ®­×HLjݨk4¸Ô<~ÆŽó þ¾ã ¾/l›©Å©²Ÿ°€'Ê–É‚Æ?/õ¤.[7'@9ÌW¤ïôH;ô¸‹äÏÌVX¹ˆ`“̽ˆy Žuu]r%„ýð|ZÒ".÷i4º!PnˆDz ÅËÆ_|0¯ûßþïœÉu4Eýõí€^?wm ñ:îO+.*ØÁxãe9±áÒ1Š?I[McF;=×ýC˜±2䢆¢íô%¯ŠL ‹gõWÂÖ'AŠÉ¬iøæÍà,í[z@ú¾‚Ú<|5ÑG ‰ÃU…\ò•-²ÓÏÜú>…fmóeFÑœ ‡˜wÀ¯µÝ›í¬.¡¾Õy rdm“+6€z8x»ÅšÔ0«aÜg»¼vqÑv\g‡>\{CÆ¿ÍIÌ«H‡‡º€¢K| X&«Eè&bÚ,h¹Š5ä$jÓíþWµØ¬‡§ÙrÒpMšx,°ôx¨zÌ´T¤V”H™¯Ÿ<: ¡+ð(žGßÕª¹¦ÎEëX€J¼ˆ Á­;$<µ„úÎ)¡8£ÒWDÊŽNhGÛG/û)°‡2C¡™ßV·¹tç•0ãò±œ|Ü?ß4W¤»©GE»ËÅ®—ø£;ïkãéz0x£uJºž76æFð9#]Ù3/íd‡ùÇœ_Ð0ËR–ÕJÔì,®aàóó6‘¥´g&Jã'§1#=é¦Åï´' }V‘Ù/|[¨º²‚0P¡æ›ó£ä¶ÉÔÊàõ(~€ˆbyÓŸ¥ÖÃ÷ô-}B—…_såV±Â(iõu«˜Gajž÷ JÄ»ä’ÂóÌ.ÔxÅz¢VùÌs­Éåô®ŒQµY»5ˆ Þuõ[¾L’Ù LŽú\ˆÅí{6ÞàB/~O>mÍJ…L"x ½Ï¶®Rn ´¿~ûW$AÂ,ä×äQ4âáâbrøËPi;$ ¦èç²D\‘áÑ¿ÎGy'¥<ô¹ŒÈ=:èÊXg˜jmÇ•ì©æÛ·!-TÉ]ã*^â½kYýÍ-VP¢=qaû<0ot*•pgâ¿|º\÷­¶C¼vQ}>ïÇ…Œ*èBºd*æc_â“©º¼öG­iy‘Gù´= ¥óñ²;i5j&*ü5LÌÌpCýõ`Ì BµœÑòЮnÉê ôbIT'!-ÜÇU¶cDÅJþ…Õêïþ( 6Ñ/MŒVñòò"ö.ͽH EH9|-ôýÃÁ‚_H þƒ,ø8º'½$¯MÉG‡q­ÐòÃ?h œl=Nt~j¤E`q"‡{Jz-h:“¨ Ê"ÑL¸¾ÈÏ‚ÛY¡ÐC‰Á1÷µÍ%zëYÛjÒ@,¶¹6?h*%濊C5Ê~”7SÉFâYJ€”ŽdZ?ö>ûSßòåÍÒõŒ6¶6ÉoÆ›CÕŽ•0õϪNbZ½’ïhOY–b)†Â©Ô¦«âD*£yÜ Mè6ð €õ¶Ëâ;:;«dçÏø·K3á&C;ÈRàòËÈ|7Å%Z/MgÐ4r³Ë]¯õ„ªÆã!HFµpH[f X–ûIi"G„%â\!&Ù:¸â&nV>ª$Yu_ù‡,>8€¿@}qYàóíB(.¹,ØÓô£ŠU¡ ¯Ñª‘K’#°f™ÓôÌ¡¨ƒhKÆ«3î`åOÙ…‘ú¾²éÏCæŸk½µ.™p´w[ÍWÚúP;imJµTÎÍ&ÙdK ªH?ßhB–F~üºŠh‘ kÖ&!ÍVä¨rúò›«IùU]¸#á§vp/žöãN2Éä@ŠÓHjÖ4ƒîoöN%Ã×ö²U¬Ý ]œ‰Î&§ÍÛ´¨‰Ô0`¤Í˜»„)¯· b á. 7<æ«*ï_Ul®dÄRMj&È¿¡:Ì„jß2PÇ)â*è,ÿE[å„¢µ"ùp1û'â¾a—ò(˜©.¸œY@ÊkMNÆp,mc7ðl·f_e]'ßîáξôTübðU¯ÙeªôθrýAcù4ˆÖ”𥰃¬¿J,ªboî8ŸÃœ˜›ª4Yô7/¡©;9’ ÇÍ…Û=ã »7æGãuL©bINЫbj5M˜U¨TÛl¿ŒÑ;ÆÿB©Ñâ¬É@sÂ`‰_o^Ø0j°öȸ?,þOÓîñ˘9y⥠a¨çíp‘ÃL«Ýh2ëÃͪ1 3^]'ùQð®“84Q{˜û±9D. ÔNó°ñ"6äl~ÇÎVƒñfÕý:ÂŒD&ü«òhÔ Öl×/ÄÎH#s V/*±!û^ž6þ3Ô¸‡Ç¼”’SÐ\dÍ„a4[ ×éι­ý+g]Ä:½rÈüÙrsý¥³Ã±9þŸàoÃŒJ08Îþƒ'ÿ´³ 5äÙki¥ÉKgK‡ýß*OǵóXÎJSÁÙ8uR[˜h#žIXtât ™?;ÞX/ï€æÊ'ÖÃ'F8ã¤{uE&õeFÂ…ílwMÒ#úÊFÓK4Jß µÙ81o‚·ón¸õg™;«a.ÇZ€<Ühpü»˜áXx©.Š{Æ ­ÓÈJQx¯Ån‰®<{ò&þÓÃ$-Ø€Ñ}¥oGçÿ/EKÊ¢1$Y{Hü¾ €±s¯(§Á6,‘ŒÛRŽˆŠ~=©Ì*Ù{%B:©Õ†ßÿ¹cœÄifH AÐ"Ç•¢¬J î>ûoè””´ÉØ¥'£Ÿ<+DU|¿ ý¤£H 7Éß ­óÖD dÚÙíQ½u°å_“È{ðð`N¶¹2¡3_<‡¼éÍ’øƒØõØTâ<Äqm/‰Š¥éoìÜ-††uÜÁ® ÅYà¨uÈÑúìÔy˜ Å.‹Ô3LGˆ§wÖqoRoU¨*íEŒPåìZ?Q\[“ª "8Ëgì×…ãonÿÐøÏ§¬Îm æ¹"mœ^â®ö äD§¨g¨süàb¿ÌwY/=@ÿ­¾ƒ?ÕFê1.Ë¢ª9™³¢›òI.¤ §s -i*ìWì`©›Û¾AÄEÍ 7Fô^ºæy7õ¬“”ÁQ”>)•SA:U®ðiœ1<m ’•ÕN§|fóÖ;¹fõT·ŽÙª/ÿr”i}i_c®1ÈxüìÉ{•NÑÀPÁÌ}Ïc“‹JÀªEbqhŸfÏNQ#è–2"µÐÆÎ»ÄÏ/×H~»²™ÓYhDm—¨!U£¯ ‚#I¨—®ŠŒQõ´EF ! ¥yr¼ÔX#«¸võ’¬Í,?ÿ¸ºbNp8fÎö^Ëôp! >ø›=uÈÇ?Ò‰Ó¥aIȹCVü’”Ô{8VDuý‡]W· J:1ýúß,þ4¤kA˜&Fy>¡¼áç‡'üõl±°+µKÈÏÆ"5 F‚Ò†BøøÃiåáå³¾ÄSÍ®Ëá–î3xŒÒ2Îܸh@\¼çen† Ç>³öÞ<âtðâß#ø&ü "È˶°·^ƒ[Þo]âÿŸV‡„b9Ø_ó41NuFbƒÜôkWzKFQvõÁÊ`ÄÏtwJ̯òÁ •l˜Æ wål–ío¯Áõ\Çq„) ‰yTÙ¢`2B¤q7áï0mnió…üRù˜°,º3)öû?Ó¼=¸î´¿¹}éA‡-ê-wəԦuì7Pͺ<•ž»³È3úNúÈ»°sÁÀ¹“ÄU¾ÓcT;j̲¢Š ¡c$ºÇX£Ý'U6ÎZœ›x ¥‚ƒâ©ôÞ¶uýˆó&|°6N0ºo²ÝSª†ÍJøâôÚSšÆÐÊJ¥½9™Ï\Í ¢o…»ìÔÑÒàû‚{lÃ\bW¾•ñÄp´]åÈ ·2,*45þý”S.ˆ0Œû ðÑft´¯Lø®ú¿8ÑJeõ®#°ßB41 óœ>ÿðÉþ ¦Ò²b~'&GUŸhù«úÀVÛü+ F ÖÀÏÓí¡ï…làC<¡ÃbSé9‡ÖÔú^ øº:OSµ‰a'÷K| “7·Ù3Si8X?D²p_Ï©?pŒ¸Ûí¢ïc­ÈÖOäY~}Zu•J=ŒLÝ®| ùïFüÊpÉ7ÓYuãzГí$ò/óÑÀ"0 ÂMÈœÃlºl©]¯}öÕI#þþ ðt€Tõ ½[C«»±I õ`: ‘}Pˆ›%Ýezyj®yj p¿„sfJË™ ¿ˆh^c_Ãϔϒr æƒãä–éù¢h_2²pÈÂ犙j7Ú]Cåõ,£äÙÀ„»ìÚ?Ùîx`¦fœ@ÖÌr†>*%‡~vëžVÒ)žñJb· ®“#ßQŒž¢Û9_vP»~ye4Ô;°^kœsoK‰tËæ”X0™¯o¹ ·åD¯SÇ9Ì¡zºÏ/·}UK¶veàÎ_YÖdÑnrâMÖ—¥ øØ:uŒjdŠ•öŸi]¯Øß3ß‘¥t¾\4ã&J¨],'7I@=ZJ¼¯ñuÜä$¤¶¹ßý¬øÿÕÂõl‹p¬*ÉC±RO} ?ÿ¸w§oœW9ÿL¾´ÊFô× |hqÑ6¯ØÖrsy€t( $ŽFRñzðk#¡m„.‘J÷=Q¼!”X2YI5±•Ÿ¦aöP21Àxè p¡‡N\Kÿ»Ü„GÄÙpò±M¬/cTLË^·÷)ï -’aÁ›/+\0Îi–Yœ Î'&7„I{v†ðXP¯±þcXÊ#^bGÂËíÒo?4Savvu©©‹ÖtIÝ.Öé_Á*CÓ·å·F°»lçš_¨Êñ/r'pææéDöðÙh/ç·ÜK J9~‚Ï)#.±NçÑÌ·5£Ü ZS‹I“]@Ê3¿×iP 9³î1çL‹Ÿ^h`Džß®Iö0pÊ}ξº€ßÖ°ÚoÉuO²„”“Ä)÷·WõÚ^µ!/aVw&Ý7?HôNå¹ ÊÑAÀ:ÿÎÌÞ;úUÚ½AaÙ҇ϧüzä"*·Öçÿ,Ï´ \.2»Ýs¯ ¯ÄPBFŒŠ¦ã¯`R·¿zNèLÚTÿóÔ¤žO @0õ5ˆZ™7„!Ìú+º‹z$¶ÿHïÌP¡A×.Ä0Rÿä°+¡ä•/wé`ýpš¯ì̧Ø6Ì­ÑÛÕ§MZôH¹QÈn&nx4ÖµUŒð”‹rŸÏ”ÔÊ3¥ò€˜=äÙ»Ðñ!Òï E€Äd~ 0¾ ú |{È$›’èP²X ôÙ¯’?;’l´Ó0ÚùÌ”e oVÖ¨AF'o‡¶]W%^rERhë€uc,ŒÊsÿðzu:ó µk8¯E~Ûä6&N0f‰&x÷ëÃ( 4Éõÿ³õ™©ß2üû Aþwç<—Ò[ÓY »­-;JáDéùþ]:¨ÎÂFæŽ(IÐ ÙV÷p>!Ô Äò'WjÂÊSŽh1½â¼éq½ÈÛ¿•À›{x=Ò5¤¿Å|(¨FzX¦+Á*ÈîžHî:3Ls³HšöÛÛê>×<.A¢Ô0…E4>—zš×+ý)Öb”òÁh-IÁÁcÃ_ ½VÉ`J_~¼øß»ŸÎuJ¥ÖÖ<Õƒ¤Å(r0âý[FàD¥ÀOÐ]£i\u«VfM£™9 T(·E4D9L³²›gÐÜ…úU„,ÿ¼¼†OVPrââu'tË‹sX!©gþa$îe9²ê6ë/qÿÕöKI(2”û©Ëpð°CñÕG¦2\gmf]ïNËMb˜Y×k©Àù½Ý`ct)üaù(Ðä­°´ ±.UôàBÂFHZÈqtáG»,bvöøðd8åöýk6Ý*9÷±ÜH»¶ÿs^®˜™Ã£hÖB-<=›: ²×hé£Ås»”€¬Æ©¸ú}eÿ+b‹}T­.­aïµnIOáã)œ[êDáÕ?§b½S›=•òµdIQå$;üüNIÄÞ£œ“”ÇÐo†/ú;$ éÄz§‹Ûê=­Ç½ï [œEù^Ò;Õ¹]aÜÀ BØWCÖs¾½]3z”O¢ç“ 4BkáR í=²¹lÈ;ÎÆoâ±È.$’\g«)ÞJ‡X–ò m!.Ôö«æéïÞ–¢5;Ü~õÒô±Ó‰Ë™uŽ:gÕžy@æÅ±ÁM BÂÎï¨Ëq8Õ¦}2I§ìÔðÎJ7.ª¡…„ZA¹›/ŽðS2a½YŠÙñ)A-‰Áe¸"Ú§Uã%NÖp÷åcyxÀÐâoÚ*gpMòÌ'ÁrÓï"wÅí²v8³z~ÆÌˉA¿lÅ“SPnx´±-v:lÙ냉¨¶!þJ–ؕΗ¶«YQ)8‡n£Nð<ðÍ'Ós2g¾éR²P§þ›Œ²’òóŠ¿·f…nÄ~êâ“‹èƒÀ4;爪ǹr;Ä>p¡·Zh‰{jß{sIPûC~3cK©/„B_¹ÙÄb­Mêe¼Jº–ä'O؉FTË5É7¥ Ôˆ½Q~ØÆ´Ó‹mý"ÖºܾUàCZ‡1eø¾ 5{æâÈ8ÇÇqüÕ³‚³zœqvdßgR£â"b`gSG¡&çn½É gö³ NXfÈ.z¹7HÉ©9áPá‘f¶2„nà²W#¾¿Ì¤ä}: ×LW {LÕ×}‡:–ÌïÖ÷O0ÉtÐä%ÏŸ’+çÖ 0b £t)ºo(·²ƒU;(AÕ3féš\wå|Ä13«,¥È¨;jü¦žéu5yê‘nGíx‘5ú…1)¼]«Š™}û?_NU}a·;&i!tÿ½¾žšñ…žçë’«õ¡FûÚWܵëꜢNŠ @ =òh½òÙØCð´j-0ø7x»‰Ñ[©}£FÙçs¦Íàé üLW»eç/E°…r…ÏùV,¶Þüì‘6à»9>ŸŸ¼• ⳪ðùµ8Rìžù8~À²cb¨ —ÌÝgKDˆÝf(9„|6>‰< ŠB$E‚‰bï…¹š¸~]BX\v‚“ŽÔk" lb–d5ýHÇ!ÁJa3ÅåIÕ9±å‹S˜Ÿ´Í6Ù„Þtû“>Û%ÅŠŽÁ‹×öDüEñWñ>ÛÅ¢I­1sùEˆâ®œý$ÑÙæèee°ü U1¸SåLʰշ³!ãšæì:‡³§Ñ 4Öªä"”žúÅnEviï| vç,/…?ófŠÉ1ƑбáþåÎ9Ûÿ­¼´Ø™Uê0 =*¹º6³¯»n¯Ãº(ÂVxŠ)»ê~÷…þ…}Š·L›hUû]cÔH€ã}aÎ¥^GÊ/tZÀ×âKˆ¤Ô*å­6 ÿ€n ›¢d{ ¶+ÄöÖ[ŒÛ^#W’rÅTåó¹Y<¥=+ö†Xˆ÷lz„¿_§+ê“-n1n.æ~ß¡5›ñÿ&!žmeJgt5g ÜR;b~pCs»µzWŸ‘y}ß-žî©‘²êqH4h²·¡xZÿMóS†ÏÄçº.h9"ûN^iî '…¤F|ù–„E‹Dß-²ÃÀŠÖnÀ´.}Ù«g{=Šueò³îN ¶ØT]`¬Âî¬O¿vÜ¢‰EIÝG7Ë¢å+.Qöþ Q7ɬ‡îü]VPÆäËÑX»(vN1ÓæLáœ\… ð„a%.¹š¾~×çÀvõ€P.$]éÁÝ ë/ù‰Vm7 2hZYXÐ\ËË»ù#6²"8¼Ù\ZAé?"á·Sn1X Çd_úòÒYû÷Ñ‘æÇXœ³ªÔJÀ ¸êÓÁôz’&)CätaóW\ü ýg™Ñ~Ê­¶8NÔ¦Ñ LâÌhá~å²Ä+uO@ß"Šo:j³J\ͪ?  ¥²!ÑïÐí”ò¢A£›x~¦q'§‚)™R¼'"ˆºU)îD}cÉÈßg´ÇaLÓ)ú• LSָʼ*öAto]?ÊB¹º•®SõuèÂ![c vëÑ]òƶÃãL›ä =Ê‚ß H‘YtT”³DAÛ©!LD %_à78”Ño‡*ñø<éÏ=wÄgwýèÕ. ­…NÏ^ ‹Êóòˆbä}Cû—ìêü¦_÷ ×Iút âYãâ€ÐÕmZòxÓŽ ç[\:‰Y’ °V¦\Ktœ „¶ré?IêTOýø¯=U¥¢Ÿà4Р÷°ä¢$ 6kWŽæKÐØ-¿î2s býJ’µË¥ºeŸ˜*jµŽ›¸óøX£öOI¾;›Pֵïä>wLJÒ]0=ÚÏ/s D¿üÅU?Ë~“—S¾?Ák•#òÈIdÀwƒöàL7oØ™GáYFÏëN©š+0&ØÍ‚‹ë9„Y¹Ë;‡‹h „¬e'‘#˜„¹lS¶³·¯¾Dø£ÑIʇTçfy}X œÐKpniP °ª{«õ9C•)í¶ÌÑQàI.ÿ.jÙã:¥òéH•j¡¼r*7E (íÑ{™„?ˆ‡G»‚X”†Ø/y ¼¾OÙ#clzÍôè2‚¹Qá7ªýŒŠfÂØi+í÷ÇRK!Öš‚Õ‘’°ÓŠ´[VxÏá¾ ¹û4ñºhÉJPp¡³v¡‰=Ù$±¯H3@—øDÔ³úºVH÷?x…oŸc ÈÚÉÈáö¶iQÌ×#áÚF‘EþgE%¨3×ÕZ§ó¼ç!ÊIp¡P5´Þàä¼¶‹iX0;/Üyå={°J¾ò!†éÏäг™-3U1¹ ¬•·ËSuz=ÿ)ÿk¡b-÷»/r\Ní4K¸‹þäó\ŒÜߢ•QÃhJ¿F³ul¢úõ`ѽ’¹ÄÙž\BJLÚœCa]ë$øÂ9ÿð”}=_¨¥ÿ¯vÈðot9U¿ýžBù¬°ð¼2ˆíN £R ð×í‡&aÆÕ1»b×ÐCÅl>áÄ3/›‡üo!öYßE´±E2ʉex‰ý¹ßµçsÖÄá­Ca^Úù¦5.¾`ž©[Ö6Ü1©ÝŒoþ ™ÍÛª÷ë”— ¨¸)ïÉGžë™ ¬&pÖ‰~êšEÁa~KÊ(Iz;m÷N±jùˆËd­Ä-€‡br3H¶L·Öt„ý’ Pv=Bîá¸/æ+¦˜•Ô£ ày›+£>#̉|òê@©‹®Ù§F ¤l>¡Ñ©ŸnabÉüÀ¨tÎ)²ºzb¹Ãýž…v¹}gáêŒ=¼d(‘„‹o—“±¶,0§Tâ§ØBz¯k+ºýˆ«½I{(1<בßêó(D·ë~w§˜ž[ðü²×€¹–”(27œžº&ì¤2¶þ#6\û}bV3éݤÀ½ ˜Íž€¬” ý ñFC¹üš.•{?®Ó^ä‚có2,Ó§ºš¼êKLó|ÔI"¯Œ~{AÒxÒ¤§·ÁÓ°šZ-â¬mŽn,úH7‡Ö °™ÛnXßÊVžÜ#EÌ„5VO$ 2²uuy<„ëz©Ò»M õl'¢T¶ù¨!?åvÌknÚ:—¥F¹ˆ´ªÜ¿Ë€d²š~³cr(²ÊjÊÒ Ïz¦K´¶ôúK‘s¶§¼Ýí‡ø,…ëë„R”2ï/áJ¬¶¹ýØN(‡„WmPI[/Öï8Do E¾L)òö(È@-ŽyäWCøøŒa&$¨Ë þ+¥T­M,UÜ9ÖsÍn¥jæ,ƒ“:~÷ÃóPΤ«xfˆ!Åù£sCÇêMŽIlׯfþ¦¹× b½iWvT·®CÚsñÎ M êu;¼ä2ßNømU‚¾<„]²i áY–ü ñ êažÚ<æ)ž·ˆe#‚‘óRH ORÄmdÑó‰ñß‚ßÓÏâ+‰_zuãù&†nn?Ï~]›ò¬Ž¥ðâêÈŒ©nÏó÷Èá•Ù4Ä5àázoJ 3’\žG~jTEOGðZQ)¬Òt'ä‹$qÒu>$Hh¼à“-+>¥9Ô©”Ai*Íò ¦¤&8·>ÔúT·EÖòáË  >žŒ-Õ®Iͬ¤è£É>¨3ž3H)Ø>• ˆ2tFK íL««‚ øª4n/J2ô,þ¦|ü ÿØO‡2BJÖª]7Œ¢è9Î)ëzÁÕ÷á?Î Ÿ*³9^åûNdQv‹Y®èHªÇå iÇDíEO!-ƒE²ôf~º€ydbäòìÔ¯}ááŒtÞ8ËÑcÞ…8‰<Ül&œg”¦˜; ¤13ëA‰Ù'^H]v†°„{޼´£Í÷ª1®¾²ïœ’*¾°–|“ÏÒŽêÎÕUóÌ¿Ú=V!œ|2ÔtÓˆö4€çBî¤Øb[‡ÜåF0OC•_º¤ñR&tn ¤…‡ ¿a¤éÙÝ_ù£Ç{Ë‹­…å>&®Ä†XE%53 àÇXW·¦„þ'‘G›ž%‘mä•s|e©ÔW$äßêà•2i¾Xým`ÔC¨}¥%åçêajKaÐ\‘Êú‹mœÞ“¯ëóP*Š¡Ç8z§â]@,÷hYÄ;¸œsLQÀ Ãüü¶ê™†D¿l ý g§~ßá|®L’OKΉ¼@„„ýwÐzÊA$€ßÚ,ÚM>ÇK±¨B[‹ðx=”k6ê«“þ¡ F+¯Ñ¾µkXÔJõJÎOHóJŒµ¤¤ ]‰ÄÈÒ]wd;£©Pé¦R'ì3TëG8¶Wâ-Z7ÐÒÿü{ˆÔÊ_Ê_ 7#ö&gç§Ÿsýý8ÞÕ ˆ1ÆÈé É—$h~‡$ZX¶ïVÅŽ+#./jxLHÿ½=ß^°kT£°C˜ÓÔŸSmê_p(³žY:OMu™æ¶6+àj«45¡ÉJp¼áº¯d¶¨Æµ²N÷·W%átYêRÏíý%;¥òü–‡Ax„z«ª¸¥9ŸÆv—¯=qíÅ,<Èÿ²5” Wô]pÁ§ƒk²Ë±`ÑSÒrñl&Èzké¡sñ­S v"Çbm¦¶ó»ý‡ÎpÝJ%šÚë• ÏK‹²EeÃQ :Ö=eœñaçY¬ØÓ"L£¾+àýàùÖ¾Oî4¤þïëàN®º²ýtÄònØü&\ødÒè¬ #ç),‘4\uŠ ?G›;0ÏùF`ò8:-‡´º£Ð¹åö—é SýxÛú¸.`H¦TϹó1è[Åñ~”#äàê<Œ’Hép·xÙfåhž$Ë>½ßpÜ®Ýq5VVÿåFX»tÖþН³ìX¾É±o•ÕEÿŽùŽXÁdXlÛ&@+ LB¡Ú«=,wr‰vuz‹ÏÜÕ›m3ünïG7³ÆlŠCN‡/½'¯›½çù6¢Ô=+à|~´ $É2?wäc-“!äõ!æƒ_&L¤c§i†ûTélA>@‹ œ' °ú¼\2[­B¬™m4˜>¤Öî1|¡yüR¯ÎÐI²ä_ž¶øÑV­Dþ–2‘Í>~Kæöù²(EGÉ{gÞTú6ø”vVä¤h&Ïé]¤º¢ï_׿°j0ªtóÔ~¼t1³3Ü´MC°s?aušc¢Ñl²Žþtån^7²@É9À#<¢ ceZ«‰æ!Ÿ£‚ ì*Ä‹y~>:Œd‘¼tS5øh›F7[íù-º4WË–¥\îé‰þŽYÅ¢Ãw–öY£KFPÅËlÄ}~|Ô»¢HiOrÂ'íal…Iƒ?{f²ÕXù¡X=œ¢*ÇÐ0;Ú¼á¼ó€a}ÒЕþØÁÈMêV˜ž^š-’,ž”ÞÙwx­æUìÛPa±vL¨l[F¾†ØHq›Qr% "ju²öåüxlc@îÎÖäGcÂE’ˆ¶ „çtIê­(ѱ¶pð‡þ|y—ºµºK]¤€€3;Ã^H¶mH®§áŽGÂ7ïe;íì°æ¾›NíQg–@\{<ì8u‚†§Öïz©qÜ[ |ŒÈ»ÊãÚwîXˆú×ν0¢ ‚xCÆ|< ¾;r}ë8pÙÄ'憫@ŠÕÀ(ÂQ‹é}Õ§0t„Ô¤TCÐI@ÄÒHÃúãñðúY£{6{Ad©ÎìÓªz`k7½!X-€EÕ%ZÔdI~y$_pô[8ÓÍ¿΅´È… ‡^•«3©¥F J>9ñEX@JgGªn;óFF3IÀ?ƾWa:ãØñ„›Çusç «>½T¿ h0?SÀÔ)-íU¤ø%ZÒɘz“=t¯è_j¸‰—§Lê„îUÐL>=ÃÄ#w†cªŒÃ9£Ât½­Bþ=èÇ5ævŸ˜MÍsè&Ä6 ÿ9g +n²Ž$zë_Ü"En.bîSø}'ÔTÛb÷óÙMW‰"G`RÀ ŸÉŠv/eXh$^p|“ÿ¹4Íò+|Õâ0BÓŒ[:誟?Á A2Kv±JlêÖ<™àÎ5z?iw­àÅ:ÒÅDk騀åEÃú™ê›k#,öìÔ¶bó3HqüD]:kº¾Ìvõb}ç«ü벂·Ñot«câ ‘ãé\¸¹hc(KÅD%òí#€"‘wtŠS–ìÈ|œP8Š£8ðduHÎ9â{sf„Vw`jot‡@ïK•ñ…“ôåAåFÅ»QþRhp>ú+Õ„u1 érô ñáÒ„:®Ç¢jß„kÑ[å_?ˆ¦4a¸­Í¬tHÚ&:e é°Í±;·£ –?l`?4(ô”ŒY²ª*¢”;Cv×êù76ðpU©JQ‰Ñg]Dìæ÷6¹íbB³î/Ê’¬)Üù‚O]°½¬Œc“=I(ÐcYŠ˜Òì/¹*¦t™g¢Q‘Õ)°z¢UUäX'PVšb,e6ÊÙå®bc¤iDȺ­F9×í!y!k¸†¥B'‘Mì¼ò,ÈLK»1ܕċþ&Å‹õ6yK¨ùN ‚ḛíÄ´\‰”À¬ë »ÜE’¦Ñˆy“©ý¢ñ²ãSEïPù¹ÿbÓVPº³Ðyx:ÙÙ×4ù6mWž«ÊÙïM%>£“ jÒ‘>gô´2B›`nóð`X 4ƒhtî&¹–mžO@æT]%4N¸ÐN¢Dœj)ö³èÅj?ýŒ—68ÒiRÝ.%9<õëÐ)Ã(x7Jœã0C>ÐG ¡Oìá“v$6ù”5HìÞfDXg¸ët R$ˆ]„å#mg§“±JIœ¶Dnúq˧’Ïèa]•%w~L0Þˆ°Ýc¿ƒ§íÜ/àr1Ÿ}ÐÝt°'­ õDšZéEh'Ñ}Ö?‚YàÐK7îàvý11Ò6’Ur©”„ŠÇÔÉ÷¯ðH/·Sé±jŠ&ü÷#u#—¥½Ô‘²¸ z¶ï 4óK¬ìX:ŠÀCb(Ò:*ýXÉ^ÐH;¨Ž– Hd¼åÊ“wß ®Ó Ér[ÊõV7†È(ÚémDè]\=6–D $6gl€ŽLÙÆtã§NÖÙÿ}&YŸV!ûÿ%ßxÿ«¶MПÕdy=éøÊrä{‹T¦PÕÎ h5V^M«;.E7ªß\¤u`c+‚¥)ØdÆ[å}Âa À¹„2^ñþâý¤ˆ®!†Ñ¦h̤.r†%bï[\¿ýÓgàêÕHܸ/T03g:ø­ë_œ'‰•ñöL'ä)ßÙ†åÈú¼ 'FîÁY¾3N&²^FgaqÈ£#LX>«Æ`Æ‚ÍwmdM·×_&òã²jè=eñü<ÊšmHnlYd¨S¿Q¢;W‰Ì.ÊsMÆ-§Ê"ßÀ À¤ñ”H£ jzì ~vWËÛfü‰9F×øÿK}o°D©]`ò5.øÔBáTþ[ëØóYgë¼׎Ęü ‰3¦bLœì`ñfA$ƒbn5Î=±§·ª‘›ÒX¨Y²áÉ©—W•JÔ }Ý"·[8i…Òü@Ùz­V  ή½nÆÙC)Ýï¡õ¼xD!´í»Å®’eUd·e3–6&û5³ äë·ùË“Då[m‘­—]¤‘S_H ê`Jv”®xþ¦èÕH¸íZr4;7kUúN`é´ìÐÔ>MéàβRVà]cZ·Î&IÚe6…}Ý&ƒ„üFjÝjÒì.`?ó€¦=7Êf~Ð3£ÿUþwž[­ÃÖ+•ÿq˜=rÐ;<ÁL,ÏÁeåQÃËd¾|¦iÜ «áæµj¹NdÉ$Ó6ð93dUû¥ß0:b£dÁh ¢ê)k¥¼ä®ùÐÇ2b7Øw4ÎÕ§Ê N„õX@ï†â0œ‡i R3Ÿv„mYm%HE?#~r±ºà+ÇŠÆæÂþ#K*µnfÚ7hÝkºÏÞ;Ù)‰û+I{ßÅ©·ÒÑá´ª¹™ðª_®#'ÕºMm“ô—À‰  ®ª\†C R1\‡è ¬Ÿ§û¹D–-Š5÷]òFÌêä/l+áYVý‹¯Ã_&¶æ tVÅT)2†Ca(žëÞ/¬|иîÈþ }VOŸ¯«Æ¦¨³/úÁÖœïéí¦¦ÏÓþ3Ôâ·ÈÐ :#?üa¡µT<6óº(`¨-uT>Yÿ…>¼Ÿ{'üÜÖöQž¾Ü{Z«KdÃ61p¨e~. äUÆQ.æÀO}EÃè$MbÚ²´QáÁÛÈyÒ*{4æÃ/÷ ¤Ž 8jdùøû*JÓ3"4]È×ä/,áSªón.›—9aÒ-çrb K`Î4Í×` @€!b “)Î%Ž4³j(ɾ¬#‘…bLÔýØkѺöž~·XÙ^‡¤*I¦«J^z>;#î>-mìMެ;Å™”‹õ}öÒ§Õ7âP8¡ÁFºOÁnA®IØ¿uò¤’ñq‹PëãG ³-¸óöBÞkÓíÄ®Ù|Þu–…߯úØ´©ø¤uüø„ì=å†G/âoÏääçqÔÖŸ®I<߸¤×þÊGý÷ª„¡vHÀ=‘6ØñO“ŸÍ*2têÎs†cN0È–³Bò¨äLÓ¼Z–/å¨3ae½ ÷š£ßÛM)€à§ ]Y¬€ƒÈÏFr‡$ÃDgkÆ@Ò<#)Ts­O൤ȇ旧U çÞQªÊ™£ú¤î­DmhÃùÆÌ>‹AŸ;ñ ¬.«×ä­i ¡7 E‡]'&äT#¿;¦EÆË/Ê© wŽŸé‚ߊ7Œ½êá)îIÄj,’D¤¾†ÍX­óÏL(º#²í"/i6èýí¯«»úñ“Ö=¤_s«ˆè~ƒhuөǯ)bí|¯®™\þPjÂD­ÿ$¸qVþ]Îtø¿Gµ´â-ÝÊÙ˜·Í³;b–”ñjX¡¸ñ›÷NÝ2Pf“v€Ïëgï:ÔÔƒ¢±ÕSK"·÷Ù%¢Qˆ{L¡ÐòÍc¾†7IÖLNry$02a¿ =r¾Öü´xË^– ÒY»ÿvÍ0ü†åª³ žN\‰·9Uâmvcj¬äXÉ˵5ææ–º±ÂNk&$±CD ¨˜ìŠàúɹCŒ'¹!Ä^ßdéxGô¨<èÿmø[pç{b¯¡ï)ž5×tÛ£tììYEý6J8€aÐ`Æ®Z¦Ó#hÊ¥EŽ´TŸ’§i®dæ7QƒÔ lJXèèBò‡ÂF+ýüV’Wj+&"›Þ×LñrI¥}²Ž}˜Ñð]çq Cp+ŸŒóûÃU{¢®aãØ¹@œÐ>*vFO%t™uä EIL‰Ãö ¼¥u†ùUа¿³ZþɈKïsh¡oíéÒZêÇ»¶hØVˆÂ_ ¶[a5]‰«ƒF—HÍ ÐY[êêq—®`씂) ëÌÀÁ¡Ét†,#Ó¹ p&ÁðÕþž'Œiþ½‚æ4½L.gÅý\øém¼å5N·?¬Çå@öÍ ¦ó€Úßtßc®ZÇ}ºòz\¢HoÖ ¼¹ö«ð !ƒ_¯œšA‚ý—¼ic•ñá½in }š6³½ ¼lY¶#Óusåï/…ê{þéüN“⺀D‘Ïj—Ìt)Ò%ƒ€‘ÂUG9—jsô&°‘! vöÉÍ7¥™žêýµF–^¬÷ý .HXSäÇd s…Í &•’pV®ÕI½¿ §„,û–ŠDÈóª¢KÇ…£`Cñ~0wôAVb­„Šê}ôÙhKjÛ)´ƒÿ‡jîúÆb¯š}NôhOF‰™yn¼ß} ú´mË£x/&q;ŽÇöÃDF ˆ¿`2 פ–~\u(ˆô˜>­YX¡•11lÌÄÊÎà&eûÙªƒ¤ÿÞ‚™&m1«ã`RW79im«‚,¯êÆH¬]äYìi•û£¨ÓÁ»Ñ'Ö>Õ‡¾1jBÐÅ–:´×ÊØI"¾ÙFæ¬6‚×%[än9¢³øGúWº8]¹È:ˆ×\9\J©HfÃAÐ<Œkƒ-W_î#ôn3&5ÃLôÞÍã>kÀó¬º95'Z þúVô˜r[8±í\p¼fÂ7O[w!›=­íl\D„HÂbðâîK”OJDÞŠ¡À‰Ì}ö܃êÅ  ")Œ?‹¼õïž§l+ò*vHÛ·ŸZŸnŒ*•2¼O¼zõ˜± ¨CÇÜùÅ»H9t¶0·¬Ý·×éIEXª’O7£ùó¼üýÜœ?´µ›û~G­w€ý Ž æÌmŠËSéþ>ò½E$ÕÂŽºô§%–šíÂLŠé§X÷k¬ŸäÌ{ÃßTÎþèqg5¯vÄ67¨´Þ¸MÓA¹3lG»_¬Í0³Ã€Rd-µ)/é•w¢÷±G9g¨U±Î X´rÞŒ§“™¯®6O?“7L? ’¿àÝá¯.iŽêÂÞ#hƒÎ)ô‘Z%ÎþõH, çÎkU[OvLé gÀC1£Jr^ e)8­ZÍGÙcüÚÓâ~Þ·an?ú½ìr‘¸‹"ô¢aÐ⊉9ªDMâCŠʼúªõ-¹¬«Õ0ƒ++Þg5€ ¶‘û¹©M…¥Ø²|Ëy}éý´øæqM#Ôð‘ùtÄn÷ \èiŒK«:ƒIƒÃØ€ÇÑшt$®äIV"ö9‹IÓô'æ5ñÝÊÐ 3ýq)ºlO¤K›,ã=èòŒÑñHb˜7(‰Á8¥ß‡ÅþÅÅCôÖ$oÐLÔË`—P¯-¹ãƒ®…798• ¾@ÐŽ¨ø’z}ìNtОº-Ë ÂP,ú·½ZvŸÈ»];òW̆yN,¶Y¶óJ°b;«Ásdc,”aýÓŸÊÌóvw›£ö&Ýñ>ÞqS`#Ìç¸×¨žýI0Þ?mâoÈ_„/4&ã»R’ ŠIüûJw\Ïf1[Ñ­óœåuÜŸ¥Ö„)ÅÐû  êa7‡ÏôûZà ?J/FOª"êÀ¿ˆƒ/A{‡ŸM¨ÆT‚¶°—x›Ž™ÓgÙÖ0¡ððY¬Ç` ïÂ'唊irµX3èN«.öa%Í0"Ã{W¼HîóÉÂ4ÐäÝwC_m·–t䨂›f@‰gAlÿ•”þG }¬Ç$Öjc¡ìHШ>MÅ).$`Jþ>é‹™g4‰Ý:ò«„–‚m²·¥–êájÂðnÃs³ó¡çÚ«`²æ™¡MÉ>M0Ò8n"³1ã.=Á¨õŠO’Âø·W—¾üDT¶ ˆ3ïÅ; P„È”-øp ó‚§Å,ÎmƒÛ ¯c61ºPè?Ä;á*¿U¨Fžr3è¼CÜRœ\K¼ žç…›=mq:†Í\½»Áß'45Nþˆgô8§ < )Ÿd`ôÜ-žj® ƒþĵ(ÊqnÙˆÕÒ䫃€ZêïÁšn@¡Æ{œ<)Ûϋٓ;´*«`\%Ë’,W~i?FšB¤°ýô§J†–NjT^È:åÛQ½Œ ªga fѯï$[\ÎIi%ÄhàL”øÛC&;þK!//FÎÏš+è KøF±v‹cIÎ £dذž’Iáµþ¼øšQ‡!î[›~Ü‹Jª:tͪ'ÂÆ›.¶ƒf?BDìÇ×W‚’÷7PŇº÷„y¡lDîìj~Ù»ãÀ!D òÑîWY¢©C“ ѵYª½mˆ˜‘Då0¤G1_ð6±[¥¿Þ/ŒçÚT"%÷(7ŠYÛÃr²v°IèsÆ¿3©f—âˆÌRÈÒHñpunFN10Í^–}kÎõ ü€óRž£ÆHÿxµ÷-j9G™ßñÌ2å+ªé”¬sgìÙ–˜À¯9. ·[û0Nyݘ@SܶCy†l\IûÞ%ÔÑ; ¹Gü¸›É¦ „'úH“±§½V+RßڽϪÇj"èž:ægz_x^>Û;TÁ¿ÝOj÷QxÑà¡V<9:Ç¢”¹ê¸õ£cq¢U¬6ß;W³œ9éâûDÎï‹ýC {ç+%»½ý­ßU‹öŸAʼnö<º^(3Y¼/‹§ó yq9¼1Êß,‚Å8f1J¦÷)Yþîû4á_ ^íòYr6öÉé§rü«q®šK8àÆ Ù2Ù«¥¶ª5î”>Ê ý±ª¦] 4îÁ»{jò@ÀwJé«)œºBÈÏÃ)¨$pãÜüï¶qgSyh‰Æg&£ŠœËÂnE_¬kÛš¯¶·ƒ0„]wõÄO ŠI¼ò{ó”,Ò`³ùìpñÚë»aÀŒ~ÂY¹»(ZÓì¬ÙÈÉ•Vö‰œbøDüØ|¡ò•îŠhø~ ‡¼- ¶U­ì†‡ “]ºÝˈ¿¼¦æÜY"¡r#l½îé“ )5kDÍ£4Òüžõ\çr ŒÕÔ¾‹9<}äÆ&úèj0$8¡ˆH­ZôÍtW´1E,ð†°¬‡á¦†UËÅWž/Ú=”½­LýÂèˆÆ÷Å^Îhý.£"°„½A[1¿ÐÍFœÈ 1‘.¨<=_cF…̘Àà-.ðI$ÈË‚Kìl•øL[e p¥Óå5«’õ”Xxó•¦ÛþØ|§5 MFsÔ?Æ«F¸š75ŒãêF8K…bÇÊ žÒf]ûÞ‰S(i7ë8 ñïÞ6cs0TF#«ùó ’œjûã¨}ЇÖÔÖæS$q´­¼€?¼¬-næ[âdËFv·Qö¬ î$…ϋθøÇÌ Tnó¹ô?×Àž>Fù†:² ³Øiw·=XÄ6 ›Ê®9»RY^«lCÛŸW¿ôÊ8v!¾hDΖ—úÆr¤fÕ‹{‘<—#„w£+º W#þáFù¤Dr7|è·aÚäñbš(Xß+˜,à!’ô)uV/ (­à«ßˆªnK‰D¡Ð½Š¬Ø[ñ1'¶ÅÃGð¹Ñ¥váa„ôkQzìÞsDýn#Âéò%háQa1Èó·uΪf´#Ç ×V7´+N‹O¾RøÌQ6Vú“•=îC]j¹ (´¯[’XîÁ´?änë ^Û}7ôx n)áàⱈ:ºîÞÉŸl8ÙÑ`ÊЫ0À)Ϻˆigº˜Kw†°oõ3íµt YMëŽv¥>Õ#Ã:)Ê™æD(i“Òw(E³pãÚ³¼Þ±JÒIûš­òúò½u¨#þö±_@@ë$‹ER;º>¡rvú¾MÎÂb Ô2h§_ê9 £YV|Av•ï4òDO7Îc”вÅ<08øÒù?ù–YÂDõÜû+.ðý«äí¥rä É;ë¦zéö§%}ŒñBùŒ|û:Ëg~S ²cÛ8S+Sûõu^k ¢ÎeŒ-u:0ØËÂL ñ „gG~êœR›A7¢µ…V.rÔ«k„.廈åJ%êîIF¿Êšß²šœÚ^–®¸q¯iiº€v¯P¡DCVÁªk$ßž!™uVè~Ø}¼ãèÓß<"­?—ÉnÖ ›µò£Ý›«qsFyÎÙ¯“Û7ò‘ƒ“VïfH6Æ3QBMíÚù%©z÷åÓ\ÞQ9Yع©å&}¯Þ%ghT81õÌ6Å/ʯy`(hjVšˆ8Qf·y%ÉE¶tdÀ9xH¸] ºþgEá‚Vurfà)Þ­µ*_kÃÝÊÄ—E)(Ì3Q¡4ª¡Õsw˜úÛD†ò&Uu )N¤G`ßÉf›Ù"@ €Ö/,à ìºS ¸ŸñNø×áÈôRÞ€åÙbá—ñ©æØÖ¾ QµWl"ÏUìoóŬ~tMZªWc–U•xÝ0JyyÛÞÉËì¤ ´ˆô)T;Å7¥Q|êa1A}ñX¢æïܺ$C‡«óMähWÞžÐײÐûƒu†…_Ñ$gYßX9Ô-->¥®Ž¢ eˆ˜aÚŠQÀ–¹nüÝU Õ‡ïÓP6xÓùU4r^x&C¾õplëkO(±áv1ô´‹Î¸C[Ë”´«slayÑ™e‘f’ü²‘yqšK;ŸPK_&ÉöÇ‚·ƒë&“ ìÒÝUûYllO-O®©âÊû²KöÐqÍ#P¿úýÙñ¡!‚ o¤ ¤ïW뿉µU{…„œ­v Šo™¢ÕAÝÛ, ‚it#·_" ZFyœzÛ(.£éǤæ]v1#›±Àõ`- ždZ6³ÒP«93¦Vóc¶*zå75Õ!«»¯É—™M·Jjí‡I}•$ùY8jüE@ìI× ñ*¿»$”û™;S=‘…!¢|ú N^_픑ÀaÏ„9}øµW^À>°+`l–D2·hH…‹„]¦ Ý"à¯[Ë|¸š$Ѧ8Fˆ¾ìÿ€åX*r'ÕDˆ$ÙÂB][§ùhFì¦`—…&X+]Ÿ96¢ÑÚòÿ¯Ê/ßUŠŠHÜÈ©ÆlÞ^KÌ4¶íi·õÕ,<øµÆÎAPHG}èA (tYiñXÔ zrRºÿZ‘"ÂóÖ/µ§Sã(-$Àsаb×,ìâMdÌ=·‘_™çz©ë΄i+B«z#ó±lMÕøúm×tEWìhFç\æx¥§™±EæmSÑÿʉ5âÒ=¾e1³á.b“«Xu›áਇ8GŒU'ºçNVf¹zÅUö 6KMΫøÁT`,x¯³Ë’½ýÀ÷Måê2ì6±¤ÚŽmJêìnnQoˆ´Dô`ŒYŽžƒp :¼ `Zø,yî'•¤œˆéö÷‹i/£™ãn‰P¢´s_*ëp¬Rm‚5&ÈOPä]lŸ±X·&¤!æHµ\Èñ‡Q+5/t ï`Û-7} :Sžxì*‰ìEnl3+ 'ÖcñøaãžÆ`«j[˜'oCÖ³B:õ_c¡@Ž[Ô]ëVÿ¨!ÅÚ¨÷2üÆjÎÏËFûeÜÛëRίUó¸¾éÃ^’‚xä$gWé_ëJq¸õ…‘eókõû’ÒvÊ8•YŠVvä9r•8ø7˜9Šf"lÂÙ&Úx,«/¨1£m)“tÉm¢X¨›YÓGyò¬m¿^9po–L.˜©‹£µ¼6tŠ5±ÛJTaúŸ~TÏÓG$‚ùòßtl(Ë83÷E6`Eüü¨A¤ÛSÙ…Âù€'ÞTþ=‡êd{?¢¨¡`R®¥8:ÓlqIŽdÑU éóG§`§é„D¼nç%„iÕ;·ÉíŽØ?AúaPT¼&ìÀcEÑÉebªHw‘¾niçò> œð–ž‹åhiU¾ÝXÿžfVp‚¼ùÄöf‹Z§à¿ß¶—ÇEñã™áz¬é7ú Õ8½Œ«a–Á}´r·!¸¹ÒÀ¬FÆ=” ]ÿ2ÊA@¼Ô}›8*’øÑ5ZMÈ“‰DÛ\Wè`í‹é^ 7Ï>ê{Yx½^¤ Þ ÌCý˦»Iûúm=TÑzɲƒT¬Š.?S\…¶¹0Ì-u-Ú@[…¹‡à’¾ Ьñ¨¿“·šY›™Ð)Ó€¥­®†éÅP*ôÃÌ”žà…/Ý«5Œ<‹2ôÊ9rp‰¼®KDÇuZî2M¡'©Õ LnuƒOšŒb“o¡tšØ®fADÞ<5f/²á¼ÒMË%lT1/ü‰V2×´¯§/îÖ‚v“Š ¤n,|vw Á¹Uqþüg:]§1Ö¼ÅK^CÖtŒJ/WlgW\ñÅ—äufñà›r·„åqÎýŠ€¼Ë.çÝZ˜ªy‹DÒvïfV_b¾s¾·è±«\pBUÜ?2Ô‹%‚Ç2go¹`qí4Âö #d0µe¸‚„  1ZË?÷ÍíÄ–À"Ä~~ôõ—‡L*Õ9o«È¿®¡ pA”èwm·…r}çßñŠH¶°ð÷CAMVþ_o“'ÜÉŽ‚JE†r%c÷A+­ÆT…ý®åœøà•W¾tÞrç–•ô7]‚¹ïLïDÛ×Ë'»…â0c6 ÞkEÀ°Š|õrAš‘ò€÷7hp ŠôÇCþÎ(ç2šþAÙLOÜûU¡ÿTTS—µëP ¢û'Ù0•ôŸâ”R;{Æ}5ÓYý#õ£[$€O0Á3–QRáÚbŠ€ß`~úÁLÍìËËm:%#¸”×@ªJ³oP<£'Õ¡^ÿ½“:èU¹O²WBÖ²]„ ˆjÔ²c k%ÊÞ²LŠûùæ9n°vÖû€bûµF“”:=’º>Ðqš¤7ò˜\+cÕ0|W« w8í§Ô·38¥\¾ûo©HŸ=o‡ŒÈS(…†ëbUê0÷þA~•äü©Â7 R³`«, àôíÅ#@ÿ…W{–¯à úx­Ã´è‘üŠ»¾”<<®h)+$â×'—U Û k!íˆJwŒÖ%[¹£š-€ˆäÖ‘N—LÔn™ ¶“XÝÙÕ6Ï8˜úSœ{DHš1jâ)ÁÅj©ßà!Ôæ× 5¥>ž ~Gö“¢3 ¿e‘kå<ÁÙÕÄŽýáŠÑ'pÍÙ{ï1Øm‘1•Ü_är‚8²„ä®ñ#Ìíª2Í»ÎòáèÄ  yç ê´zƒLƒ=äYÑ-.ýù´¡õéb+k ¡ÖQÓÊ>'µ*"Wþb¡²¿tWÌz±Ÿ ôÝ%€:”äάzƒH—ì€×“©-g ñþÛì‚…ò @ú»ª#ìËÿÓ‹õË„¬CPmplȆBN3\F¢Ç«« pÛé¼ä §M]ˆ®(…Y£ ljF³fÌb½5Úr©^žc.5wHµÏ‹ò0 ‹YZrtracklayer/demo/0000755000175400017540000000000013556116552015060 5ustar00biocbuildbiocbuildrtracklayer/demo/00Index0000644000175400017540000000010513556116552016206 0ustar00biocbuildbiocbuildtargets Visualizing microRNA target sites in the UCSC Genome Browser rtracklayer/demo/targets.R0000644000175400017540000000251113556116552016653 0ustar00biocbuildbiocbuild################################################### ### chunk number 1: rtl-init ################################################### library(rtracklayer) data(targets) ################################################### ### chunk number 2: rtl-miRNA-track ################################################### targetTrack <- makeGRangesFromDataFrame(targets, keep.extra.columns=TRUE) ################################################### ### chunk number 3: rtl-export eval=FALSE ################################################### ## export(targetTrack, "targets.wig") ################################################### ### chunk number 4: rtl-ucsc-start ################################################### session <- browserSession() genome(session) <- "hg18" ################################################### ### chunk number 5: rtl-ucsc-lay ################################################### session$targets <- targetTrack ################################################### ### chunk number 6: rtl-ucsc-view eval=FALSE ################################################### top <- targetTrack$target == targets$target[1] range <- targetTrack[top,] * -10 view <- browserView(session, range, hide = c("refGene", "mgcFullMrna", "intronEst"), dense = "knownGene", squish = "cons44way") rtracklayer/inst/0000755000175400017540000000000013556147727015121 5ustar00biocbuildbiocbuildrtracklayer/inst/CITATION0000644000175400017540000000145013556116552016246 0ustar00biocbuildbiocbuildcitEntry(entry="article", title = paste("rtracklayer: an R package for interfacing with genome browsers" ), author = personList( as.person("Michael Lawrence"), as.person("Robert Gentleman"), as.person("Vincent Carey")), year = 2009, journal = "Bioinformatics", volume = "25", pages = "1841-1842", doi = "10.1093/bioinformatics/btp328", url = "http://bioinformatics.oxfordjournals.org/content/25/14/1841.abstract", textVersion = paste("M. Lawrence, R. Gentleman, V. Carey:", "\"rtracklayer: an {R} package for interfacing with", "genome browsers\".", "Bioinformatics 25:1841-1842.")) rtracklayer/inst/doc/0000755000175400017540000000000013556147727015666 5ustar00biocbuildbiocbuildrtracklayer/inst/doc/rtracklayer.R0000644000175400017540000002755513556147727020352 0ustar00biocbuildbiocbuild### R code from vignette source 'rtracklayer.Rnw' ################################################### ### code chunk number 1: initialize ################################################### options(width=70) ################################################### ### code chunk number 2: rtl-init ################################################### library("humanStemCell") data(fhesc) library("genefilter") filtFhesc <- nsFilter(fhesc)[[1]] library("limma") design <- model.matrix(~filtFhesc$Diff) hesclim <- lmFit(filtFhesc, design) hesceb <- eBayes(hesclim) tab <- topTable(hesceb, coef = 2, adjust.method = "BH", n = 7676) tab2 <- tab[(tab$logFC > 1) & (tab$adj.P.Val < 0.01),] affyIDs <- rownames(tab2) library("microRNA") data(hsTargets) library("hgu133plus2.db") entrezIDs <- mappedRkeys(hgu133plus2ENTREZID[affyIDs]) library("org.Hs.eg.db") mappedEntrezIDs <- entrezIDs[entrezIDs %in% mappedkeys(org.Hs.egENSEMBLTRANS)] ensemblIDs <- mappedRkeys(org.Hs.egENSEMBLTRANS[mappedEntrezIDs]) targetMatches <- match(ensemblIDs, hsTargets$target, 0) ## same as data(targets) targets <- hsTargets[targetMatches,] targets$chrom <- paste("chr", targets$chrom, sep = "") ################################################### ### code chunk number 3: rtl-miRNA-track ################################################### library(rtracklayer) library(GenomicRanges) ## call data(targets) if skipping first block head(targets) targetRanges <- IRanges(targets$start, targets$end) targetTrack <- with(targets, GRangesForUCSCGenome("hg18", chrom, targetRanges, strand, name, target)) ################################################### ### code chunk number 4: rtl-miRNA-track-seqinfo ################################################### genome(targetTrack) head(seqlengths(targetTrack)) ################################################### ### code chunk number 5: feature-data-accessors ################################################### head(seqnames(targetTrack)) head(start(targetTrack)) ################################################### ### code chunk number 6: sol-1 ################################################### head(strand(targetTrack)) head(width(targetTrack)) data.frame(chrom = as.factor(seqnames(targetTrack)), start = start(targetTrack), end = end(targetTrack), strand = as.factor(strand(targetTrack))) ################################################### ### code chunk number 7: subset-features ################################################### ## get the first 10 targets first10 <- targetTrack[1:10] ## get pos strand targets posTargets <- targetTrack[strand(targetTrack) == "+"] ## get the targets on chr1 chr1Targets <- targetTrack[seqnames(targetTrack) == "chr1"] ################################################### ### code chunk number 8: sol-2 ################################################### negChr2Targets <- targetTrack[strand(targetTrack) == "-" & seqnames(targetTrack) == "chr2"] ################################################### ### code chunk number 9: export (eval = FALSE) ################################################### ## export(targetTrack, "targets.bed") ################################################### ### code chunk number 10: import (eval = FALSE) ################################################### ## restoredTrack <- import("targets.bed") ################################################### ### code chunk number 11: sol-3 ################################################### export(targetTrack, "targets.gff") targetGff <- import("targets.gff") targetChar <- export(targetTrack, format = "gff1") ################################################### ### code chunk number 12: browserSession (eval = FALSE) ################################################### ## session <- browserSession("UCSC") ################################################### ### code chunk number 13: genomeBrowsers ################################################### genomeBrowsers() ################################################### ### code chunk number 14: layTrack (eval = FALSE) ################################################### ## track(session, "targets") <- targetTrack ################################################### ### code chunk number 15: sol-4 (eval = FALSE) ################################################### ## session$target100 <- targetTrack[1:100] ################################################### ### code chunk number 16: take-subset ################################################### subTargetTrack <- targetTrack[1] # get first feature ################################################### ### code chunk number 17: view-subset (eval = FALSE) ################################################### ## view <- browserView(session, subTargetTrack * -10, pack = "targets") ################################################### ### code chunk number 18: view-subset-multi (eval = FALSE) ################################################### ## view <- browserView(session, targetTrack[1:5] * -10, pack = "targets") ################################################### ### code chunk number 19: sol-6 (eval = FALSE) ################################################### ## viewOut <- browserView(session, range(view) * -2) ## viewFull <- browserView(session, full = "targets") ################################################### ### code chunk number 20: browseGenome (eval = FALSE) ################################################### ## browseGenome(targetTrack, range = subTargetTrack * -10) ################################################### ### code chunk number 21: browseGenome-simple (eval = FALSE) ################################################### ## browseGenome(subTargetTrack) ################################################### ### code chunk number 22: get-track-names (eval = FALSE) ################################################### ## loaded_tracks <- trackNames(session) ################################################### ### code chunk number 23: get-track-data (eval = FALSE) ################################################### ## subTargetTrack <- track(session, "targets") ################################################### ### code chunk number 24: get-track-segment (eval = FALSE) ################################################### ## chr1Targets <- track(session, "targets", chr1Targets) ################################################### ### code chunk number 25: sol-7 (eval = FALSE) ################################################### ## region <- range(subTargetTrack) + 500 ## targetSNP <- track(session, "snp130", region) ## as.data.frame(targetSNP) ## targetGene <- track(session, "knownGene", region) ## as.data.frame(targetGene) ################################################### ### code chunk number 26: genomeSegment-view (eval = FALSE) ################################################### ## segment <- range(view) ################################################### ### code chunk number 27: tracks-view (eval = FALSE) ################################################### ## visible_tracks <- trackNames(view) ## trackNames(view) <- visible_tracks ################################################### ### code chunk number 28: track-modes-view (eval = FALSE) ################################################### ## modes <- ucscTrackModes(view) ################################################### ### code chunk number 29: set-track-modes (eval = FALSE) ################################################### ## modes["targets"] ## modes["targets"] <- "full" ## ucscTrackModes(view) <- modes ################################################### ### code chunk number 30: browserViews (eval = FALSE) ################################################### ## views <- browserViews(session) ## length(views) ################################################### ### code chunk number 31: sol-8 (eval = FALSE) ################################################### ## viewTarget <- track(session, "targets", range(view)) ## trackNames(view) <- c("snp130", "knownGene", "targets") ## ucscTrackModes(view)["knownGene"] <- "hide" ################################################### ### code chunk number 32: load-snp ################################################### library(rtracklayer) data(cpneTrack) ################################################### ### code chunk number 33: datavals-accessor ################################################### head(score(cpneTrack)) ################################################### ### code chunk number 34: trackData ################################################### plot(start(cpneTrack), score(cpneTrack)) ################################################### ### code chunk number 35: layTrack-snp (eval = FALSE) ################################################### ## session <- browserSession() ## session$cpne <- cpneTrack ################################################### ### code chunk number 36: browserView-snp (eval = FALSE) ################################################### ## view <- browserView(session, range(cpneTrack[1:5,]), full = "cpne") ################################################### ### code chunk number 37: layTrack-snp2 (eval = FALSE) ################################################### ## track(session, "cpne2", autoScale = FALSE, yLineOnOff = TRUE, ## yLineMark = quantile(score(cpneTrack), .25)) <- cpneTrack ## view <- browserView(session, range(cpneTrack[1:5,]), full = "cpne2") ################################################### ### code chunk number 38: search-nrsf ################################################### library(BSgenome.Hsapiens.UCSC.hg19) nrsfHits <- matchPattern("TCAGCACCATGGACAG", Hsapiens[["chr1"]]) length(nrsfHits) # number of hits ################################################### ### code chunk number 39: track-nrsf ################################################### nrsfTrack <- GenomicData(ranges(nrsfHits), strand="+", chrom="chr1", genome = "hg19") ################################################### ### code chunk number 40: browserView-nrsf (eval = FALSE) ################################################### ## session <- browseGenome(nrsfTrack, range = range(nrsfTrack[1]) * -10) ################################################### ### code chunk number 41: rmsk.e2f3 (eval = FALSE) ################################################### ## library (rtracklayer) ## mySession = browserSession("UCSC") ## genome(mySession) <- "hg19" ## e2f3.tss.grange <- GRanges("chr6", IRanges(20400587, 20403336)) ## tbl.rmsk <- getTable( ## ucscTableQuery(mySession, track="rmsk", ## range=e2f3.tss.grange, table="rmsk")) ################################################### ### code chunk number 42: uwDgfEncodeExample (eval = FALSE) ################################################### ## track.name <- "wgEncodeUwDgf" ## table.name <- "wgEncodeUwDgfK562Hotspots" ## e2f3.grange <- GRanges("chr6", IRanges(20400587, 20403336)) ## mySession <- browserSession () ## tbl.k562.dgf.e2f3 <- getTable(ucscTableQuery (mySession, track=track.name, ## range=e2f3.grange, table=table.name)) ## tbl.k562.dgf.hg19 <- getTable(ucscTableQuery (mySession, track=track.name, ## table=table.name)) ################################################### ### code chunk number 43: trackAndTableNameDiscovery (eval = FALSE) ################################################### ## mySession <- browserSession () ## genome(mySession) <- "hg19" ## # 177 tracks in October 2012 ## track.names <- trackNames(ucscTableQuery(mySession)) ## # chose a few tracks at random from this set, and discover how ## # many tables they hold ## tracks <- track.names [c (99, 81, 150, 96, 90)] ## sapply(tracks, function(track) { ## length(tableNames(ucscTableQuery(mySession, track=track))) ## }) ################################################### ### code chunk number 44: session-info ################################################### sessionInfo() rtracklayer/inst/doc/rtracklayer.Rnw0000644000175400017540000006634313556116552020705 0ustar00biocbuildbiocbuild\documentclass{article} %\VignetteIndexEntry{rtracklayer} \usepackage[usenames,dvipsnames]{color} \usepackage[colorlinks=true, linkcolor=Blue, urlcolor=Blue, citecolor=Blue]{hyperref} \newcommand{\Rfunction}[1]{{\texttt{#1}}} \newcommand{\Robject}[1]{{\texttt{#1}}} \newcommand{\Rpackage}[1]{{\textit{#1}}} \newcommand{\Rmethod}[1]{{\texttt{#1}}} \newcommand{\Rfunarg}[1]{{\texttt{#1}}} \newcommand{\Rclass}[1]{{\textit{#1}}} \newcommand{\Rcode}[1]{{\texttt{#1}}} \newcommand{\software}[1]{\textsf{#1}} \newcommand{\R}{\software{R}} \newcommand{\IRanges}{\Rpackage{IRanges}} \title{The \textbf{rtracklayer} package} \author{Michael Lawrence} \begin{document} \maketitle <>= options(width=70) @ \tableofcontents \section{Introduction} The \textbf{rtracklayer} package is an interface (or \emph{layer}) between \textbf{R} and genome browsers. Its main purpose is the visualization of genomic annotation \emph{tracks}, whether generated through experimental data analysis performed in R or loaded from an external data source. The features of \textbf{rtracklayer} may be divided into two categories: 1) the import/export of track data and 2) the control and querying of external genome browser sessions and views. The basic track data structure in Bioconductor is the \Rclass{GRanges} class, defined in the \Rpackage{GenomicRanges} package. \textbf{rtracklayer} supports the import and export of tracks from and to files in various formats, see Section~\ref{sec:import-export}. All positions in a \Rclass{GRanges} should be 1-based, as in R itself. The \textbf{rtracklayer} package currently interfaces with the \textbf{UCSC} web-based genome browser. Other packages may provide drivers for other genome browsers through a plugin system. With \textbf{rtracklayer}, the user may start a genome browser session, create and manipulate genomic views, and import/export tracks and sequences to and from a browser. Please note that not all features are necessarily supported by every browser interface. The rest of this vignette will consist of a number of case studies. First, we consider an experiment investigating microRNA regulation of gene expression, where the microRNA target sites are the primary genomic features of interest. \section{Gene expression and microRNA target sites} This section will demonstrate the features of \textbf{rtracklayer} on a microarray dataset from a larger experiment investigating the regulation of human stem cell differentiation by microRNAs. The transcriptome of the cells was measured before and after differentiation by HG-U133plus2 Affymetrix GeneChip arrays. We begin our demonstration by constructing an annotation dataset from the experimental data, and then illustrate the use of the genome browser interface to display interesting genomic regions in the UCSC browser. \subsection{Creating a target site track} For the analysis of the stem cell microarray data, we are interested in the genomic regions corresponding to differentially expressed genes that are known to be targeted by a microRNA. We will represent this information as an annotation track, so that we may view it in the UCSC genome browser. \subsubsection{Constructing the \Rclass{GRanges}} In preparation for creating the microRNA target track, we first used \textbf{limma} to detect the differentially expressed genes in the microarray experiment. The locations of the microRNA target sites were obtained from MiRBase. The code below stores information about the target sites on differentially expressed genes in the \textit{data.frame} called \texttt{targets}, which can also be obtained by entering \texttt{data(targets)} when \textbf{rtracklayer} is loaded. % <>= library("humanStemCell") data(fhesc) library("genefilter") filtFhesc <- nsFilter(fhesc)[[1]] library("limma") design <- model.matrix(~filtFhesc$Diff) hesclim <- lmFit(filtFhesc, design) hesceb <- eBayes(hesclim) tab <- topTable(hesceb, coef = 2, adjust.method = "BH", n = 7676) tab2 <- tab[(tab$logFC > 1) & (tab$adj.P.Val < 0.01),] affyIDs <- rownames(tab2) library("microRNA") data(hsTargets) library("hgu133plus2.db") entrezIDs <- mappedRkeys(hgu133plus2ENTREZID[affyIDs]) library("org.Hs.eg.db") mappedEntrezIDs <- entrezIDs[entrezIDs %in% mappedkeys(org.Hs.egENSEMBLTRANS)] ensemblIDs <- mappedRkeys(org.Hs.egENSEMBLTRANS[mappedEntrezIDs]) targetMatches <- match(ensemblIDs, hsTargets$target, 0) ## same as data(targets) targets <- hsTargets[targetMatches,] targets$chrom <- paste("chr", targets$chrom, sep = "") @ % The following code creates the track from the \texttt{targets} dataset: % <>= library(rtracklayer) library(GenomicRanges) ## call data(targets) if skipping first block head(targets) targetRanges <- IRanges(targets$start, targets$end) targetTrack <- with(targets, GRangesForUCSCGenome("hg18", chrom, targetRanges, strand, name, target)) @ % The \Rfunction{GRangesForUCSCGenome} function constructs a \Rclass{GRanges} object for the named genome. The strand information, the name of the microRNA and the Ensembl ID of the targeted transcript are stored in the \Rclass{GRanges}. The chromosome for each site is passed as the \texttt{chrom} argument. The chromosome names and lengths for the genome are taken from the UCSC database and stored in the \Rclass{GRanges} along with the genome identifier. We can retrieve them as follows: <>= genome(targetTrack) head(seqlengths(targetTrack)) @ % While this extra information is not strictly needed to upload data to UCSC, calling \Rfunction{GRangesForUCSCGenome} is an easy way to formally associate interval data to a UCSC genome build. This ensures, for example, that the data will always be uploaded to the correct genome, regardless of browser state. It also immediately validates whether the intervals fall within the bounds of the genome. For cases where one is not interacting with the UCSC genome browser, and in particular when network access is unavailable, the \Rfunction{GRangesForBSGenome} function behaves the same, except it finds an installed \Rpackage{BSGenome} package and loads it to retrieve the chromosome information. \subsubsection{Accessing track information} The track information is now stored in the R session as a \Rclass{GRanges} object. It holds the chromosme, start, end and strand for each feature, along with any number of data columns. The primary feature attributes are the \texttt{start}, \texttt{end}, \texttt{seqnames} and \texttt{strand}. There are accessors for each of these, named accordingly. For example, the following code retrieves the chromosome names and then start positions for each feature in the track. % <>= head(seqnames(targetTrack)) head(start(targetTrack)) @ % \paragraph{Exercises} \begin{enumerate} \item Get the strand of each feature in the track \item Calculate the length of each feature \item Reconstruct (partially) the \texttt{targets} \Rclass{data.frame} \end{enumerate} <>= head(strand(targetTrack)) head(width(targetTrack)) data.frame(chrom = as.factor(seqnames(targetTrack)), start = start(targetTrack), end = end(targetTrack), strand = as.factor(strand(targetTrack))) @ \subsubsection{Subsetting a \textit{GRanges}} It is often helpful to extract subsets from \Rclass{GRanges} instances, especially when uploading to a genome browser. The data can be subset though a matrix-style syntax by feature and column. The conventional \texttt{[} method is employed for subsetting, where the first parameter, \textit{i}, indexes the features and \textit{j} indexes the data columns. Both \textit{i} and \textit{j} may contain numeric, logical and character indices, which behave as expected. % <>= ## get the first 10 targets first10 <- targetTrack[1:10] ## get pos strand targets posTargets <- targetTrack[strand(targetTrack) == "+"] ## get the targets on chr1 chr1Targets <- targetTrack[seqnames(targetTrack) == "chr1"] @ % \paragraph{Exercises} \begin{enumerate} \item Subset the track for all features on the negative strand of chromosome 2. \end{enumerate} <>= negChr2Targets <- targetTrack[strand(targetTrack) == "-" & seqnames(targetTrack) == "chr2"] @ \subsubsection{Exporting and importing tracks} \label{sec:import-export} Import and export of \Rclass{GRanges} instances is supported in the following formats: Browser Extended Display (BED), versions 1, 2 and 3 of the General Feature Format (GFF), and Wiggle (WIG). Support for additional formats may be provided by other packages through a plugin system. To save the microRNA target track created above in a format understood by other tools, we could export it as BED. This is done with the \texttt{export} function, which accepts a filename or any R connection object as its target. If a target is not given, the serialized string is returned. The desired format is derived, by default, from the extension of the filename. Use the \texttt{format} parameter to explicitly specify a format. <>= export(targetTrack, "targets.bed") @ To read the data back in a future session, we could use the \texttt{import} function. The source of the data may be given as a connection, a filename or a character vector containing the data. Like the \texttt{export} function, the format is determined from the filename, by default. <>= restoredTrack <- import("targets.bed") @ % The \Robject{restoredTrack} object is of class \Rclass{GRanges}. % \paragraph{Exercises} \begin{enumerate} \item Output the track to a file in the ``gff'' format. \item Read the track back into R. \item Export the track as a character vector. \end{enumerate} <>= export(targetTrack, "targets.gff") targetGff <- import("targets.gff") targetChar <- export(targetTrack, format = "gff1") @ \subsection{Viewing the targets in a genome browser} For the next step in our example, we will load the track into a genome browser for visualization with other genomic annotations. The \textbf{rtracklayer} package is capable of interfacing with any genome browser for which a driver exists. In this case, we will interact with the web-based \textbf{UCSC} browser, but the same code should work for any browser. \subsubsection{Starting a session} The first step towards interfacing with a browser is to start a browser session, represented in R as a \textit{BrowserSession} object. A \textit{BrowserSession} is primarily a container of tracks and genomic views. The following code creates a \textit{BrowserSession} for the \textbf{UCSC} browser: <>= session <- browserSession("UCSC") @ Note that the name of any other supported browser could have been given here instead of ``UCSC''. To see the names of supported browsers, enter: <>= genomeBrowsers() @ \subsubsection{Laying the track} Before a track can be viewed on the genome, it must be loaded into the session using the \texttt{track<-} function, as demonstrated below: <>= track(session, "targets") <- targetTrack @ The \textit{name} argument should be a character vector that will help identify the track within \texttt{session}. Note that the invocation of \texttt{track<-} above does not specify an upload format. Thus, the default, ``auto'', is used. Since the track does not contain any data values, the track is uploaded as BED. To make this explicit, we could pass ``bed'' as the \textit{format} parameter. \paragraph{Exercises} \begin{enumerate} \item Lay a track with the first 100 features of \texttt{targetTrack} \end{enumerate} Here we use the short-cut \texttt{\$} syntax for storing the track. <>= session$target100 <- targetTrack[1:100] @ \subsubsection{Viewing the track} For \textbf{UCSC}, a view roughly corresponds to one tab or window in the web browser. The target sites are distributed throughout the genome, so we will only be able to view a few features at a time. In this case, we will view only the first feature in the track. A convenient way to focus a view on a particular set of features is to subset the track and pass the range of the subtrack to the constructor of the view. Below we take a track subset that contains only the first feature. <>= subTargetTrack <- targetTrack[1] # get first feature @ Now we call the \texttt{browserView} function to construct the view and pass the subtrack, zoomed out by a factor of 10, as the segment to view. By passing the name of the targets track in the \textit{pack} parameter, we instruct the browser to use the ``pack'' mode for viewing the track. This results in the name of the microRNA appearing next to the target site glyph. <>= view <- browserView(session, subTargetTrack * -10, pack = "targets") @ If multiple ranges are provided, multiple views are launched: <>= view <- browserView(session, targetTrack[1:5] * -10, pack = "targets") @ \paragraph{Exercises} \begin{enumerate} \item Create a new view with the same region as \texttt{view}, except zoomed out 2X. \item Create a view with the ``targets'' track displayed in ``full'' mode, instead of ``packed''. \end{enumerate} <>= viewOut <- browserView(session, range(view) * -2) viewFull <- browserView(session, full = "targets") @ \subsubsection{A shortcut} There is also a shortcut to the above steps. The \texttt{browseGenome} function creates a session for a specified browser, loads one or more tracks into the session and creates a view of a given genome segment. In the following code, we create a new \textbf{UCSC} session, load the track and view the first two features, all in one call: <>= browseGenome(targetTrack, range = subTargetTrack * -10) @ It is even simpler to view the subtrack in \textbf{UCSC} by relying on parameter defaults: <>= browseGenome(subTargetTrack) @ \subsubsection{Downloading Tracks from your Web Browser} @ It is possible to query the browser to obtain the names of the loaded tracks and to download the tracks into R. To list the tracks loaded in the browser, enter the following: % <>= loaded_tracks <- trackNames(session) @ % One may download any of the tracks, such as the ``targets'' track that was loaded previously in this example. % <>= subTargetTrack <- track(session, "targets") @ % The returned object is a \Rclass{GRanges}, even if the data was originally uploaded as another object. By default, the segment of the track downloaded is the current default genome segment associated with the session. One may download track data for any genome segment, such as those on a particular chromosome. Note that this does not distinguish by strand; we are only indicating a position on the genome. % <>= chr1Targets <- track(session, "targets", chr1Targets) @ \paragraph{Exercises} \begin{enumerate} \item Get the SNP under the first target, displayed in \texttt{view}. \item Get the UCSC gene for the same target. \end{enumerate} <>= region <- range(subTargetTrack) + 500 targetSNP <- track(session, "snp130", region) as.data.frame(targetSNP) targetGene <- track(session, "knownGene", region) as.data.frame(targetGene) @ \subsubsection{Accessing view state} The \texttt{view} variable is an instance of \textit{BrowserView}, which provides an interface for getting and setting view attributes. Note that for the UCSC browser, changing the view state opens a new view, as a new page must be opened in the web browser. To programmatically query the segment displayed by a view, use the \texttt{range} method for a \textit{BrowserView}. % <>= segment <- range(view) @ % Similarly, one may get and set the names of the visible tracks in the view. <>= visible_tracks <- trackNames(view) trackNames(view) <- visible_tracks @ The visibility mode (hide, dense, pack, squish, full) of the tracks may be retrieved with the \texttt{ucscTrackModes} method. % <>= modes <- ucscTrackModes(view) @ % The returned value, \texttt{modes}, is of class \textit{UCSCTrackModes}. The modes may be accessed using the \texttt{[} function. Here, we set the mode of our ``targets'' track to ``full'' visibility. <>= modes["targets"] modes["targets"] <- "full" ucscTrackModes(view) <- modes @ Existing browser views for a session may be retrieved by calling the \texttt{browserViews} method on the \textit{browserSession} instance. % <>= views <- browserViews(session) length(views) @ % \paragraph{Exercises} \begin{enumerate} \item Retrieve target currently visible in the view. \item Limit the view to display only the SNP, UCSC gene and target track. \item Hide the UCSC gene track. \end{enumerate} <>= viewTarget <- track(session, "targets", range(view)) trackNames(view) <- c("snp130", "knownGene", "targets") ucscTrackModes(view)["knownGene"] <- "hide" @ \section{CPNE1 expression and HapMap SNPs} Included with the \textbf{rtracklayer} package is a track object (created by the \textbf{GGtools} package) with features from a subset of the SNPs on chromosome 20 from 60 HapMap founders in the CEU cohort. Each SNP has an associated data value indicating its association with the expression of the CPNE1 gene according to a Cochran-Armitage 1df test. The top 5000 scoring SNPs were selected for the track. We load the track presently. <>= library(rtracklayer) data(cpneTrack) @ \subsection{Loading and manipulating the track} The data values for a track are stored in the metadata columns of the \textit{GRanges} instance. Often, a track contains a single column of numeric values, conventionally known as the \textit{score}. The \texttt{score} function retrieves the metadata column named \textit{score} or, if one does not exist, the first metadata column in the \textit{GRanges}, as long as it is numeric. Otherwise, \texttt{NULL} is returned. <>= head(score(cpneTrack)) @ % Sometimes, it may be convenient to extract the track information as a % \textit{data.frame}. The \textit{trackData} function does this by % combining the \textit{featureData} matrix with the \textit{dataVals}. % It also adds a column named \textit{featMid}, which gives the % mid-points (the mean of the start and end positions) of each feature % in the track. Here is an example of using \textit{trackData} to plot % the test value for each SNP vs. its position. One use of extracting the data values is to plot the data. <>= plot(start(cpneTrack), score(cpneTrack)) @ \subsection{Browsing the SNPs} We now aim to view some of the SNPs in the UCSC browser. Unlike the microRNA target site example above, this track has quantitative information, which requires special consideration for visualization. \subsubsection{Laying a WIG track} To view the SNP locations as a track in a genome browser, we first need to upload the track to a fresh session. In the code below, we use the \texttt{[[<-} alias of \texttt{track<-}. <>= session <- browserSession() session$cpne <- cpneTrack @ % Note that because \texttt{cpneTrack} contains data values and its features do not overlap, it is uploaded to the browser in the WIG format. One limitation of the WIG format is that it is not possible to encode strand information. Thus, each strand needs to have its own track, and \textbf{rtracklayer} does this automatically, unless only one strand is represented in the track (as in this case). One could pass ``bed'' to the \textit{format} parameter of \texttt{track<-} to prevent the split, but tracks uploaded as BED are much more limited compared to WIG tracks in terms of visualization options. To form the labels for the WIG subtracks, `` p'' is concatenated onto the plus track and `` m'' onto the minus track. Features with missing track information are placed in a track named with the `` na'' postfix. It is important to note that the subtracks must be identified individually when, for example, downloading the track or changing track visibility. \subsubsection{Plotting the SNP track} To plot the data values for the SNP's in a track, we need to create a \textit{browserView}. We will view the region spanning the first 5 SNPs in the track, which will be displayed in the ``full'' mode. % <>= view <- browserView(session, range(cpneTrack[1:5,]), full = "cpne") @ % The UCSC browser will plot the data values as bars. There are several options available for tweaking the plot, as described in the help for the \textit{GraphTrackLine} class. These need to be specified laying the track, so we will lay a new track named ``cpne2''. First, we will turn the \textit{autoScale} option off, so that the bars will be scaled globally, rather than locally to the current view. Then we could turn on the \textit{yLineOnOff} option to add horizontal line that could represent some sort of cut-off. The position of the line is specified by \textit{yLineMark}. We set it arbitrarily to the 25\% quantile. % <>= track(session, "cpne2", autoScale = FALSE, yLineOnOff = TRUE, yLineMark = quantile(score(cpneTrack), .25)) <- cpneTrack view <- browserView(session, range(cpneTrack[1:5,]), full = "cpne2") @ % \section{Binding sites for NRSF} \label{sec:binding} Another common type of genomic feature is transcription factor binding sites. Here we will use the \textbf{Biostrings} package to search for matches to the binding motif for NRSF, convert the result to a track, and display a portion of it in the \textbf{UCSC} browser. \subsection{Creating the binding site track} We will use the \textbf{Biostrings} package to search human chromosome 1 for NRSF binding sites. The binding sequence motif is assumed to be \textit{TCAGCACCATGGACAG}, though in reality it is more variable. To perform the search, we run \textit{matchPattern} on the positive strand of chromosome 1. % <>= library(BSgenome.Hsapiens.UCSC.hg19) nrsfHits <- matchPattern("TCAGCACCATGGACAG", Hsapiens[["chr1"]]) length(nrsfHits) # number of hits @ % We then convert the hits, stored as a \textit{Views} object, to a \textit{GRanges} instance. % <>= nrsfTrack <- GenomicData(ranges(nrsfHits), strand="+", chrom="chr1", genome = "hg19") @ % \Rfunction{GenomicData} is a convenience function that constructs a \Rclass{GRanges} object. \subsection{Browsing the binding sites} Now that the NRSF binding sites are stored as a track, we can upload them to the UCSC browser and view them. Below, load the track and we view the region around the first hit in a single call to \texttt{browseGenome}. % <>= session <- browseGenome(nrsfTrack, range = range(nrsfTrack[1]) * -10) @ % We observe significant conservation across mammal species in the region of the motif. \section{Downloading tracks from UCSC} \Rclass{rtracklayer} can be used to download annotation tracks from the UCSC table browser, thus providing a convenient programmatic alternative to the web interface available at \url{http://genome.ucsc.edu/cgi-bin/hgTables}. \textbf{Note} that not all tables are output in parseable form, and that \textbf{UCSC will truncate responses} if they exceed certain limits (usually around 100,000 records). The safest (and most efficient) bet for large queries is to download the file via FTP and query it locally. \subsection{Example 1: the RepeatMasker Track} This simple example identifies repeat-masked regions in and around the transcription start site (TSS) of the human E2F3 gene, in hg19: <>= library (rtracklayer) mySession = browserSession("UCSC") genome(mySession) <- "hg19" e2f3.tss.grange <- GRanges("chr6", IRanges(20400587, 20403336)) tbl.rmsk <- getTable( ucscTableQuery(mySession, track="rmsk", range=e2f3.tss.grange, table="rmsk")) @ There are several important points to understand about this example: \begin{enumerate} \item The \Rcode{ucscTableQuery} used above is a proxy for, and provides communication with, the remote UCSC table browser (see \url{http://genome.ucsc.edu/cgi-bin/hgTables}). \item You must know the name of the track and table (or sub-track) that you want. The way to do this is explained in detail below, in section 5.3. \item If the track contains multiple tables (which is the case for many ENCODE tracks, for instance), then you must also specify that table name. \item When the track contains a single table only, you may omit the \Rcode{table} parameter, or reuse the track name (as we did above). \item If you omit the range parameter, the full track table is returned, covering the entire genome. \item The amount of time required to download a track is roughly a function of the number of features in the track, which is in turn a function of the density of those features, and the length of the genomic range you request. To download the entire RepeatMasker track, for all of h19, would take a very long time, and is a task poorly suited to rtracklayer. By contrast, one full-genome DNaseI track takes less than a minute (see below). \end{enumerate} \subsection{Example 2: DNaseI hypersensitivity regions in the K562 Cell Line} The ENCODE project (\url{http://encodeproject.org/ENCODE}) provides many hundreds of annotation tracks to the UCSC table browser. One of these describes DNaseI hypersensitivity for K562 cells (an immortalized erythroleukemia line) measured at the University of Washington using 'Digital Genome Footprinting' (see \url{http://www.ncbi.nlm.nih.gov/pubmed?term=19305407}). Obtain DNaseI hypersensitive regions near the E2F3 TSS, and for all of hg19: <>= track.name <- "wgEncodeUwDgf" table.name <- "wgEncodeUwDgfK562Hotspots" e2f3.grange <- GRanges("chr6", IRanges(20400587, 20403336)) mySession <- browserSession () tbl.k562.dgf.e2f3 <- getTable(ucscTableQuery (mySession, track=track.name, range=e2f3.grange, table=table.name)) tbl.k562.dgf.hg19 <- getTable(ucscTableQuery (mySession, track=track.name, table=table.name)) @ \subsection{Discovering Which Tracks and Tables are Available from UCSC} As the examples above demonstrate, you must know the exact UCSC-style name for the track and table you wish to download. You may browse these interactively at \url{http://genome.ucsc.edu/cgi-bin/hgTables?org=Human&db=hg19} or programmatically, as we demonstrate here. <>= mySession <- browserSession () genome(mySession) <- "hg19" # 177 tracks in October 2012 track.names <- trackNames(ucscTableQuery(mySession)) # chose a few tracks at random from this set, and discover how # many tables they hold tracks <- track.names [c (99, 81, 150, 96, 90)] sapply(tracks, function(track) { length(tableNames(ucscTableQuery(mySession, track=track))) }) @ \section{Conclusion} These case studies have demonstrated a few of the most important features of \textbf{rtracklayer}. Please see the package documentation for more details. The following is the session info that generated this vignette: <>= sessionInfo() @ \end{document} rtracklayer/inst/doc/rtracklayer.pdf0000644000175400017540000162125713556147727020722 0ustar00biocbuildbiocbuild%PDF-1.5 %ÐÔÅØ 140 0 obj << /Length 1533 /Filter /FlateDecode >> stream xÚÍYKsâ8¾çWøhW-ëeË{K˜$›L6•03‡©=0 •)pÂæßowKÛbȃ0²Ü’[Ÿº¿î–çÆ œÓƒ`ÍÿQçàˉ‹|Δt:‡3és­)_ÄÜéôßnÇcîmêýÛùÄ㢸྄ #7¹ /IÏ̽ƒÖ=Þy‚»ÏØ“ÂÝÔÎSzmúZ„ù<4ˆ¹=‡0‹nrãáhɇ1?VŠãÈ–~¨œ׾ޙÿ}hGî­)½÷Z‚+÷œî¹vç¨f:F9šÖá~ 4L#|)3Í?ø4ƒË¤ëµ@“tj&áÐÿ±lðcñé å¨Å"˜Wr_ëØÌÛžÀ€1â‘¥‹Ö Ç0‡sçä­o°EŠ9±‡<Ä9P–Ï"3óZ1èq6F ü h¸}h=Ò†æu8}¾ñÎoXOsPÝ[ïÑæ=ܼç”0KáZ¸éÐ~ =…¾\fCRßG J÷±ÍÝ4‡½©¸º€Ë¡y’%S³¿€ƒGód鬪5 ˜f´þr¢ PÁNÄRÂ.¹Øuø¸[ÌÄ…Û&ÅÜc|áøÞ.@kó‡Ý Jܤ¨à;³‚YjîQb ÆuWUUóÀõ½–ŒãŸ j:kÿHn;YË…ʼ·Ö8+ÈQ ‹(æP2‚Qg´€Ècî8*¸4çUÚ¨¼—±ÜÿOÑ><ès»([By›e ·ü¾˜×Iîˆk‹) `±ûÄ ·Èöz„_MK¶ÀtwÆ" ñú>-L{²B*à{°È:¬ÔËXë@¤k´¹.B”fÖ Ë½jt:.Æ®mmNù2Vcs'[7jn‹ J¯ÃXZŒ Ýc(œLkÜ;÷—F8Ú ˜çH›+ÏßÞAج±â6¨üÄÕ¦ózî3aÃFâþÒoKч'#n¡§‹?AgŸ£u¦Óêãïku;b¶²b¹^ÄÛ¬ÂtòîÙl-£ ¡ö\wŒ¿asî «ÀåâÔxÞÍÌô+@S´¯ Âc-´µ¸±ͯ˜V^R¼ª«¦+îH4rÙ,g ƒ½ÛÛŽ€5áji¸úhh˜·\øá.Ž5én0±ÑÚHÃWäÉJ=2;F[ÞŽeƒcÏʶvóÇýŠ\í)è:ærïÄS»ç|k'‘;pt7V€ÆLð®x]!ÿ8gG«¾“[hÑw”ñ¯*à6Ûl½¤œ5k^ýÌ43ÏÀœ0wd¤~`Ö„^Õ^Ñ\…B’W½æc‚*z%£«¶õ"ö'`'Wœë*µgiåðIFyzÖgû¦‹ú@®-ÞU]ªóÁÔ)¶v#Ut£zظ… Íá"™!gæÉ-ñü‘Ã0ô«)áÿÓâeNQìÆœå‡nã%öæ–o!77íôž4#Ásrár9RJv‡CX8pÁC\L¨å W@ˬ°Ç¯[Ûg¿s’~ëjÉB-K%ÝûÅ1·‘˜.8|òTè&Ã<ïvf`Ù>/L´kLHVk0‘Ëä›ðE¸¬‹¨æÁ³ˆûGZ³æ›§P9½Üp´ÏÂØøIYj_‹Ï¬Åǃÿû…; endstream endobj 154 0 obj << /Length 2979 /Filter /FlateDecode >> stream xÚZK“Û¸¾ûWèHUY4™›=;›TvS³ãÚÃn‰Ò¨¬Ç,)ÙžüúôEÎØëƒGØýüºél¶e³¯2ù}w÷êÍ{WÍLžº¼°³»ÍÌ8—.‹rVøejŸÝ­g¿'f¾0Æúä§¹IŽsg’3<´§ùÂeÉú²ÂÑîDïþ{÷Ï7ïËY•V…-p¿l¶°&-³’wº{²†É¼‰è€¨òȉ¬ªs[¯æÎ&Ÿö0¨ñÔ'6íø_¥6 ‹‘~5·ËäÓÜI½m拼´Éæ;~¬ýÔ)ÏÄ\jC‹eÅ™Ï`|’#}|¦±yº¬ŒJL>Ñcþ¬MmU()ìjp“ÜÏp6.:#_æ¶Lšæ8!ž¼L}åu‡ÛñÆ¥® "€û™dÍ—Ø688Hê *K­-g Q¸(øžõ‰n®Ϫ¹æ ‡2dÒ\•çCÅ©%ÚÂ'÷u'«Vyۇ҆ϻ×Á©’Òj7åÆ@”Ê!üqt#Têe«(Þ¡Ÿ:Åzp•I~ëµ9¡¾¼J+~Ô&^õº‡ØãMb,rD‘Š‘{ 'ìRŠnÏ\cÉÝ2c{È Òuö[…ÐÂÚœvmº.ÔÐZeTÇ„ˆŠèá@A©/šrÝ@…»¯èKGNèQ®¡Ü2ÎBC4xæÍ®! „¼ksu¢_²HÿDfÉ'‚ïúdþ‡q^Âq­0zlŒh6äÿƒ¢ °OÅ"¬ •\ÓõP£îÀ¬'y¨%9è©,ó‹†$a³nƒv¯îIUߨ#ãØõñ‹%eøAÞæâ@¨˜>7즌oåíuÈ i‰ˆeq7Tx6ß ñ u—A  B"h€U䃘HÇDj1Ûc#,Ÿ¦¤`»ßó`Å©“2ÞÀÊO6­yHÑûB’ìÚè| Yq<åA§ B©‘†;}/lµê‹¯qE¡Á™œo ŠG|®ìž Nü¥¢áQã#âR™ˆ‚ØYO¶¶¡QpÜ2%7ÈNo~˶r“íeÕ[ %,¯U>¯ E|«]§1b¿‰¬íÑŠt82(¯÷8`T¶U² Áßeü$:ÖCËTQzb¿=pŠ! ¢¥±Ó2|{Æo‘8 'Qr;ȯ¡…è8ÄáïCˆmÔ¼ž:3S ÊZ‹”ÜwÃM¡ºrÍï®ÏÅ%÷xD~eyf0Dæð2tʪOÕÇNI 6œ0-©ˆ£µ”QöÂpÇsfëNŽoHcÁ‘'û{í¹ìC´Q‰Ï›¾ÕG™èÖÏË—„$ ?ÿø€èü£qîq/I¤³Lö·|ÒÈ~Va|å·œ47(‡±8´ã.ÔRWWým^æ5¬ºïïÂ,6+áAz~#×öE°žñ™û:ÛЊ:`XõÔ²”Äu±ãmûN]'± g`ëº~º¾æÈçH¢!jS· jZñiÌÏ>ïUîM¿û‘)CØ»(Šˆ#R„.<_'ÀNŒ3²A¢ó檆Á™) å£àЗ– ¤ž+oNœ«ÖŠw÷Q1A³è£Ï ä·/%G9×Çɦ ?JáJƒidr&]Ds¦]¦åÒHΤî %Î<¹á¢Cû"Ä.åHøaàïÚ­êaì“¥TԛʦL])ç¿G¯ÁrÔA…_>¥¾Cà4©}L­—Qô¢±|ãA3¸ÎKô¾w ´Ø*WDÉ|´ý)ÏáBôá³ßÛfñ\ý>A¹LLf» 6S«SÛ¿UÚQ²¶Á3¬4“W/¤–}T§¹øµÓé2u¨¦ç‡ VR8Òɸz ŽvjâéùäÀ}†eCF‘„äŽ5Ñgˆ¨å…¡Xÿˆ©í×›Q j¢2êPÑ#F¤TÔ d†h%’äers †€Îik§¶ZÖø?øþíÒÒˆùávŽÅ$­œBÛ ¥–ŸP¦J‚Æëv„à=õÂða¥¶?¬ç¢>j;|?¬dE«_wXÅgCL 騷]¿(4ŸÖBwY–ýÇÅ=¥ÝC=ѵÌSS…/2½ïŠó´,üz³¿­,• ’a A/ÄÀ]Eòe!Q¤¯¶Äq)m;&Üù7`n ˆ*ÔQÆ÷ßõQÛA°ïݳfß0‹«3ùß~ø px­x% 1 frÎSZ8ãë¼í÷9Ýk‘|c,Ò…‚iþ-lݾcœwªŠì…;­øBkuf¯±u Nçœ$Om¨ì_u¸¢f,KMÝ3Oç^tİw‡þJBòÈ”¨¹<£ÿÂcŠ*uhÒ.KmâQLó÷»Wÿ^<Ð endstream endobj 159 0 obj << /Length 1535 /Filter /FlateDecode >> stream xÚµY[oÛ6~ϯ0Òv°·XI‰’†m@/I·a†ÔØÃ²<(¶’xMlÃrÑeûíãå£tdI–”f´Hé\¿sxx±?ºù£wG>ž¯gG/ÏâQâ%’ËÑìzÄ„ð"dy\„£Ùbt1¾ÉV6ÎòÉTøñx¹²Ïzw›M.g?¿< ©Œ0ð¤`J¾a^¤»ÔS¤×ªm'!§÷`¢<ê&¡ã™§wŠZ·lai#ŸóÈKÂÈk;R#œo4‹jú]^×"¤Ü1ž(?˜¾UÄËù„Çã[íY2žk‰+Û7–äk;¸šL¹T Ì`}e4/ÕÏÊZj`¹šðhü`û 7nÊ´u†ô¦Á¡)“‰Çx¨:L¹ØpÌ9ø§údX÷×°ºÛóX,œÛÆ_e™ £¸†* jÊIGIÉäÒIö&]^ó Ç>#ÇS§¼ÞyÏ:v²9>kCÎUûUµW_´ÝÂüYÝÁ—­N·ü hd›‘\@dßÜ¢ç*®ÿs0š®FoÐ2(Ô ~Äø¡^púÚŠØÌ Rÿ ]@}sêÙåïi2gMbê¡`äègäý´Û°;…î¸Y¨zÆ÷…Û+«öâ°­-1‹íôߣÿBâýŠÐ ]öÈßœl8ݲó¤9üøwA¶<ÃS¢W®·]Þ“š6¯¬ËmXQJ`Òüb‰íS0Ÿ8n”ëUG]}¦HžÙn^YpŠ•+?XÚwCJz?ÀëÀöãâ€1í!ì^¼w!pòÜŠYßo !'‡R<©²Ë®·`uI¶©íæŽ[á,ð’ ¨pg'sJÖ ÈÚœK×úAoP–+cšù<_O¦êõ¢dp»ˆ,ݹûu2ǽLÑ×Gx«JR(1þÜÛñ®ˆUÃ=‹¯b%sÏ’x±,o€4£áÎ3ýø¶éøÏCéER߀$^èÞ˜lIqJºòÒ¢> stream xÚÝZÝoÛ6ï_a {°±XI‘’†aÀÚ5El]Šv؆A±Ç‹me’Ótÿýx¤(Kvâl(’=(&Gò>~@{ËôM@ohÊ7¶9¥æ›½œbü[¬c^lh`ù’ChŸ–ÍM-y×9í&&¿Ÿý`M0"ÊõýÔ¯úÎ>/íó3ÿ¾4ž5÷Y /X>XNØ'cÛrÆÃu0ûä!ðÓœãê€m~@{)ã8E®"þЭ­wŸŸf®a,*§=Î.q"²¥qˆÿl”ÝolÃì3fù4h—½Óþ²}ô§É—™#]œäÿ¸+;Ò ù‘˜§kþø9âsÔqÎ2ÎYJDJÊר~€aÌæ¤˜“=`N~§Ó†¬ò„œ&ïFónt“;ÄðeÑ·§|À¥÷á‘Û¿ÿÙ8U&Ò‰ê~¿ñÇã%mº;æœeÉ×Å*ø¾\ ëæ_|cîýÔôgÿ§¦É®÷û45@Khz€föß’ßbRNÂ2mß´ÁªnHò°‚tÒ²¹ãìXâÀ‘Ò.z6áɺcŽTªe˘œñŠ)·ÿ õ±Ê±å;¼3þlµôȘ&2ñ X6ÐWãò“OÐÃ’tY¡u¦­ÝxCMLdl©íó¼.»…Mÿ¦M6%%I)S ”mEÓnàÐcþ§˜eîÂE+02ëñ;ÌÆ¿¬/Ì0‹´ba7‹Ȫ8Ȉ"@ûô˜Kª3Pð[ :·N*àXkh:G8ý˜§7ÀcCåÒ­¤Ar¢Ù²¸õlj6iÃáÀÆœ«Lm$ÜIËy@2üñ™Eè`ò{ã3¤Š’é7nsHÀ AùU¯>'1AôLÁq9IjzZC,Ö׸<ŽÈ-¶ÄÖ)ìª!h ëÄX{±º…ôY¸!Ú¹ý1ä;&~sê ’@+9'_µMÈJJLœs µöU£Û\%ˆŸf4¸(ê¹S«a£Ø Ê¿ç˜ÖÅÔ"öš–Â$-¹¬*Åø o‚ hX&ÐyIêy‹BÌÀq€”F%î†òŸ·hZŸ­9+ê .ÊŒ¯%(ß®$K‹ÕŠW +¨ËMfm×$‡TX-›³$ƒõÕ_DY¾$Ê“lû)$1ÝnãÈŒRà°.uY1ZÑW›’F–̱Ȇ„ÞY*\©nI‘4Ä~(±í¶YyÛ óض¸̇æ„B˜ yœ«§S: "§ê!+r]¸ê9†`Àðª¨iŒÊŒr®u†„î ³YÍ$öG×6o8ìá)²î¶Ò¹cVœwëárŽ”:Ò‰_p¾gÎM¤tÚ/ÃNùåVŠ(KU?äù­‘.D\¶JC ¡Á0ÙnCeJ<í„06+¹þ'û/ä†:…{'åõðb`®ÿ§ˆÕÊ×f ™¯k£¼uª=vÑPCös° ‡u¯+<¿‹Ò Cõ-Ûæ@ظ·-û’*²> ·í¡®¸ÈR†/% ¬cõ ;•7Wã].\„ _GðÜûz “GÊØ;LæÖ&É•tx^=ûS•Ò¢ endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 805 /Length 1979 /Filter /FlateDecode >> stream xÚµY]o·}ׯ˜Çö…ZrøY;Nƒ›†í{ÓÞÀkyk ‘µÆj8ÿ¾gV”+Å–´M%ÀÅ]òðÌœ!9äj*ÈäÉ:Jé‚´N¤™´³¤ññ01("gÈh2É Œ!Æ?ž³Gá‰ÑÒ$²¦ƒ´.3ÙÄÄ–ãa ‡8’KP“g?°†¼s2¼O(<B¨8rÖL±@a): Š E¤v^S²v)$ ¿<õ(ÑÖÃ"SŒ*PÂ*-cÀ,í…@Ú(#J65JoÑ Œxb# 4;Qbðð’q. `™Pˆa)Zé™RÒŽ Þb#¤q!wÝE<çY̆.…øÁŠ€KäKÉà ˆÄâšQÅw&’µ"³ƒ.Z„öb6k²šÂ_/ˆÃ˜œ°Ó"¿q ¡eÒÍžÐcIHxQG‚BDÖ€pÉŠ_ ~@ÑË@…çñC1°×ˆ-³¸ ÁâAh€6!x V¼…R|·,4$ñ>ȃH>ˆº±£  O‚´·áæ%¼zEÃs¾­/jÑO³jÔŽë©Ò?Ó¯¿~z7m›úú¡{öóÚÆfÞøm5­¨z¼oªÙ ©œ^ÓÝxÔÔg'Ô–ÍMÕÒlÜV³®žÀc6UÙŽ§7T.w¦¶)GŸ_FXy‚©§³¶ÕÞVôö¬œÞ¬#± ‘ ;Ä$é/ƒÓxúgÝÜ•kœò …ç(çò´ÍývÞýÍã}ÝÌ{ïã»E­£´Í¥Ùÿ«¯ 7Ì}:ƒ1 sSM뻊®šúë¬j¶³zé0Ù¤Ù\ö>3÷å·'6ýT5 g®XÒ·oöäÍná¼ÑCÛ§“›w:ª¿N'uy-ƒ^t.§?›ú޾Õ }¬®èußùïÃê ¬¡Y[¶ÕúI– ?<=y£¿Ÿe¿•÷Ê{:?9ݼí}¶¤›¢åt|ÿ0)Ûþ|ÂÉ vF/ú­~¥ç‡¹ú%}|÷¶Ÿ†üwèœNê¶]x-@=žvvwËaÓÉÙùñF[í³õH†¼Zêá0û¢Ã–Af빿íRþ÷ðüpãànaÁ›Çòî~R‘þ¥þ¬º‡EÊÙ窙Çô³ c~¡£“rV½£Ûo÷U3«¦0düeÜ~£¦ºA—nq‘‘þãÃV“ ½O«-£ä@?ÏFõ—ªs?ÞŽG·‹i'1{Q^M `ÙTtð¥O¤ºÑÝ?í £ÉË«Õ'IP :£áñ¸½”Ö¯^ †0†§åM5¢s[M±rj[HËÁð¬šaÀdî¶ñîчêz\¾®é“´ñÈuB2—@4èK’÷tí¦ÓPŸºtH†•lh^Ú\º\ú\†\Æ\¦yiŠ\ê\f<“ñLÆ3Ïd<“ñLÆ33g<Îxœñ8ãqÆãŒÇçx—ƒvö†Ø Û®Žxø<¾®›ëªé\U\¾~Ò]Eœ;j¡ B—})†IF‘€ºÂ+Ðì€6§2»eXáÉ%vw8É¡2Ál¤avHÃÖk庄X+lÀþèÂË4žgX»á ŒÌ9)I¹Ù ZµBÙ¬¥òRª¶S>À#€S‡!k£²6ôäcvÏ<<2t.€. öÊ&Ý“ïžf%G¶ØTŽ7Æ*Ǿ'»‡X†c‚•ƒ[¡"ލÜE½=–w¯ǤB”g¡’œÛ Ä2÷‹}Ì-AE,Ã&x%)Ǩ|Ð=ùìÁ?Þ©ˆ£ª‰@—C7xAž|vËìÀÇY23Eæ¼·˜ó=éØÝÓ±Z%ï»°1tœlU®'·{>\¨B˵¦|”)ǾoøøÝïž\DUt7g¢“#ÖQÅ´y÷äݯ8&!uàØùS´¼JaëîÉ;á .H tDZ㼊F¸9U³Ëîg7òÌjI* >bY¾ÏêÇ{YýŒ—i$Qƒ\î ‘s!YîÉÇì>| GdYÄŠFh…ÔG;»1|÷°aã' Û äâÐ ã1œ¶…ŒÝKøj‹ì +p *¹$÷é q³Ëäш['ö™VIJW0rt¿Q·{—h$‰3†—+xäèvk:ãö¡ŽöÈòqåŠ9$eÛÎeG›Y'y°ÜQÕƒ ï!N{™7…Än÷­C9»yZÙ —ï ~ÿãÿÔûH N@Ó‡Éär}[îÚz˜¯SìרaáÁé¥íq=m;ºÇò Àr¾ºà„ŠÍ#t\®ÈGrE>IÄÅ ©ÌÏþÀž6õ輂¿hxztLËê±ýþ0ÿý}ˆ³ÏîCœùÑû§wy`|(ŸhpÎI…éri-_Ú»ŠÕ?rî™÷×µíý_jÌXB/z56HÒe)îÕ©‡Š8|­ ­åhZ‰™å`Z Tä–ÿwÑ”žGSøGÑ´luì'ÔßF¯™Ãcù¢çõKÀr¯½ùWF{÷ÌhÏ?j´·Ûþ e«ù% endstream endobj 170 0 obj << /Length 1985 /Filter /FlateDecode >> stream xÚÅYëÓFÿÎ_ÁG½,Þ]?QA* ª~‚SUé@•/ñ%IœÚ w÷ßw^»~Ä ” õƒã}ÍìÌìÌìüœp²œ„“7By¿¼|ôôu¬'¹Ê“L.o&ÚZ•&Ù$‰Sel<¹\L®3ÕÒø™Î´Ž²à—ù¼l Ïí~–Ó™ÍL°¯¡]̧VŸy„foà©à©7Å)°½~¼üíé묳8™éLÙLóΗ+XV›4 Lx›”x§6¸%6À¾Â)á[mÛù†é·$ÞqßY Ï‚™‘"«UÉíw- +ÝÝ£ V'îêcâLéÔ"uÞÕ»i :l—²oslƒÈ¨,OMu=ÅQð Ï÷t³8I‚·{¤œÌl¨UhS°›Vy,'†f«Ö V>2l<±%vÉ„+1hµ©š Î]Àd” ..p2XnÙHH]tÚ,«»ƒtØ5·Kd+°Á Í¡îìZ¬Ù¤äH‘‰á˜à(Yn¢ƒ €ÉiöÕ…™,8lp¬e@ZØÜZT7ü^Ð~v,(ÆÁý7¸]£ˆ¥ŽTE}¾­ûeÁ®×Úix5-Y4‚¬¥ç¯Hs}²‘uËYü »Á˜FÊäÆy‚3u!Œ÷Ç®c¥COp1Â3QIdÝ‚R¢gqÌIÇ*Iô7sjÄÿŽ(ãæŒ‹Ç*¶>,ŠŽ }ä*ÓCõkaBp«•5^.%A…pªfìtå ¢ÄúC¡6z‰d8J {׆vßµv7œðÑÖ8Ïc6˦\ðÒbNnX/ÄCÈñ×Ó,ÂÏÀM_O3+[™ ¼'jøÙ­=OkvБ 9×kŸóü@9™6‡PIƒ*œ±Yˮϖ_0ªÐaqº›@ Û& …ªšj#3¢¦ù¬àX°ËQ¿›gh`G±[Qrm¹pÃwUMÄ‹ñ 2<ŒîADJ˜YëS»µ]e\·{³hvpF=¸š gÄÀ/ CVZ‰“¤§>„q(·âéxð˺áìn»ìø9Õg&Ñîu* ›è¬=~G¼wW/<3ºt°fíQƒŠngj®E„­ˆ#Ù§~Ýɱtfb~Õbñ­‹ø‰Ué¾[þ>ºÛä¿Î-o3è·ïÿC^‹lh’ øê0JÉî΋FÆ /ï¡Áóña=>qÂ9§ûy¯û¾Ñ^þœŸñ?‘Ùò’zMñó—ŒuÛhÃÝ©½Ú¥ý$Ìþµ9&ùóìòÑëzñ×c¬þø¸º’cþ(þ“Ë¡%2nä czHzCgÂC¡,ͤŸ¶–>µ,Î!ì§Ì]Ë\&k3ZOl´L§ÂÂzr~'"¸Û.•¹Xë|x бÊR±Ã+XvV­çTb—òX j £t÷Ó§V=‚ÉÜg9Èp QÍæëoh7>EoýÊ®ô0öFÊ1K¤åx:í÷äd{3*î¯T´ÎÌ´q‡¹“žÒ*eø‚j¤0iȆ÷ hÂŽ„e©}œ´p”26æ•«i®":ˆSдtÓÄœ‹u¿Ï-!i8šãè5&U±ÿ¼puìÐÒÞ6ÎõVxWù®¥ìT›G$È¢UMŠö™±©èѯÝ{æo«~rt8ˆiïO”Σ¨M­Ðþê¨æƒ >'6JÄàÝÅX $©ÊòÖçq¤ £¼Å¿À=eÑЯŽ–È3ü¸!Kð0GdÆ>~:"…d¯{Ùî.é Š;÷:T2 8ŽðdP´ëRDÕÁËŠ9Kšåpƒ'g¬•ª0Ôcx~Tž×·ý¤°)$FHbþ8E‚å Áj$U\.¸K¶ ÑTK\>‡` I™­ÀØ‚ qšs~¸ j2÷…÷ƨ$´}ß­Äw»õÈ5Å Ò®HŽR¾ê鳡hïêÞ}Žüvú–?áf{ûR·Sï`÷F¬}íì+ư%8y“Û‹S\u—åÏ:Ïr+Ê]ý¬S¾~ÿ_5ÂNà†€Áñ¯Hß­}Ëõ§ÿ¯–úûÑ ñzϹùš?ÁóøÈÊßéjûó¦àÿ#øöôÖCœýcý#>ÝŒ}¨•?€ÿ}½ÔB_ELsUµä4®DZßW}¶Ço‹óKþÿ¦Í’§‘zÂ&÷F[ š#°¸L0™EZ…ưâÞ’W—þͨ:¨ endstream endobj 180 0 obj << /Length 2442 /Filter /FlateDecode >> stream xÚ­YKÛȾûW9Q€Åe?ø ‚ë]Ûp°H[›69p$J£X"$åYç×§^ÝlRœØÃˆÍfuwUuÕWIVÇU²zÿ*‘ç›í«Þ¥jUÆe¦³Õö°RÆÄyV¬²4µIWÛýê·H¯U+ü?»Þ(e‹èíïðò°Þ˜$jaÔÁßpjà÷s…Ž*ïy|‚á% à'¤puµ[}†Q¿þÏöo?¼+¾’ÕF±)sôwÓYÔÒ±° Œý:jaNçIµÞ9 ·.Ó8OR8v~Ô×)°ÓaX/³culµvkP¼¦§cpÝ×õÌÔ‰ÖÓ ®Â²>Èþû‘´á!~¹§¯ôz€a{†Ÿs»‰Cí¹ÏÝÏð?#¿ /SÄJç0Pq™ÊU¾Amð.HZwxiôƨ²ùiöcðñgG*\ü•¿ü;I˜zo†xG3yÍ_¿¬uAût¸øÔ6¢ ø¤¤,À²èµjä(ø'z’jãÅÔ ó \œyöݺ°tF5\Å k?™ÊMtNI ÿ2sÌã¾ïÞM˜Ç¯Îšpü/dÿx<ókñÇ÷²0ÆOiô ùx˜š'.9À T{Ôï‰ü/£qˆ(¸JÖ–.ó訩îȰ…´¨®Ý, ýEÎÙ»Ë4ÖÂ¥àõµ¢_Ô}|`7„Í?¯SÐÁ‘Ì(‰L¥;Þ3y5®BÝ\΄aEÿùw&~‰‰?eãÒÚ)“ÛuaÀ"A"KFF‚~Y‹€¹ñF€ã ž°#F>þýG^DN‡SÇzWt(GrÐ -©I§õž§ª;¾¢ùq"î\ñcr)DsmœV;'eË`C¿{^'ªfg\|ª~q{Ùç,.‡~B.Ï "ÕŽ®á<G-Î{‹w'yVAÞQcžßÞø ÷Î.åÈÇ“€ÛýŸó$€F'q®­ÃÆ‘95Ɖ[@56Ns¨¨qÒñn&n^³.M’Æ`ù¢ÌŒ—<Þ %™/òY-òð08ðQd¶ú»²h¹yx¹—š?´Ð5ÎWŠbÍ툑¦žñÆëÀ¢RýW>Ò²JÎt ”׉ÍÒu¤E}8È"‰Š!Ñ‚{Ë…Y·[¢¹ /klcÓ$$˜ EOwbÐaÆþ'ø@Ÿ¹$a,ìœDŽ„4· ;IÃ×­?¨ #ª{9¢ Ž8‰^*bìNvÞ;lEØûKŸ‰îPÌ&†ýðP]…[+2£®½0™ƒ“Q:ljúàmb)úø"¼¢½œ]Bc!©3ÀÉ_û‘jxÒ/Rë1Ï8þÀø¾ìil¬w&Â箺¸;Àðí8mÙ9t‘Å©-§êªÒïÖ£=ž%ô?ÈzñóA> Ê3 ÊÅ¡è,¢š%ið¦åÔ¿‚Ukó(Cž ]®ç¶2W‘OsbøšwüÓ3ËzISï|£ˆž‚ôz=,#ÛÙ, A~Bf[íùÅ¢’»bཤã\ä$F`($qš Q¡Ï=9I "œ‡|$ٵκ…•k?®Æâ²8IÓ0K½|CÎñÇKHìºÏ\ ºöÚ1 S$£Ôž>µCÏwšÄ%a²ƒ}²cÞ|RÙ09‡¶Ü­|F汃Éùá}‰ø9tNöâH" \íÄã-d ­t =TJŒÀäP„zbÆ®²Qx‹ð%ÖäÑ/§Ï,àH÷Äíªm6ÿþ8kóüÅ8 ò'“*De!l£€ÛÄFŠ4‰ œø”pb2Ë|<0ûܲæñƾ¾Í[ÿ98Ê&pÔùªN n*?·_ÄZönx¸ìHÐþ8tšáéöIGOb›w©ß/àÍÁ¹ŠUá7¼ÉkŒöÉ"Ü y4Lí¨:ìû…;·q^–ßWb›2VcF(÷;éUl œÆ™‚ W§q‘LI¥,å8Å]a©oyÌð_ƒ éTÍ*ž,Xý¶±€Þÿ@WäÖ¯C`ºâ!FêŽ08švR/‰§We3n ûéPJ{j¨Šóì„&—âðÈìÌdô¢,ëjë{Óª gî&o'´QœÏŸmÏvm£°y3•üIMVý$! à™ò|—!‰òàt%æcÊÃ&ûq·¯s0å5¦°-¡”¶Ñ?ñnêGÝyÐ’1y9™ñ€ìAÙçî*ž9Ö :!…¬ »v <ºÌK½.i] &Oõ¯„´¿»‚ÏxŸ¯±Ù¦éÎè‰1˜D\]\.XÔÛ ¾4\ìQ·‰—œ[²X‹^º!íLY¢{Ë„?ŽéíE–ßÉriEq¼YÅÚ7&Ó¾Ñ_©x¡Ê…Ò0_„5Ç\©š©Y‘ Ž®iŠz= QVc ì¥0ƒ«Úò·¤­Š³4¡w@k„5Ÿ¹YfD-x]ºè´ˆ“$›$÷“æ swrø¸Â42Îé'*ÚU´òN Eg%A2>å>ŠÈÇçCµ r¤ k{|¯×i‚—#%HíE0 fînˆ8íî‰v¼ç*Îu{b—Pô <®5dæÉuSD÷lêCÃÄ⨋d®„^ÌÙ¹³)Å œ9—jA'5ø4is”jâl´“°|·Á>q¿` j°Ä‡®_ì§Oø³XÞe‰´äÝr)›dôé*~î8«yÜW—‘Ço!ík± &ªg6Óß»^ÞY" GX)hKýJ‚[ß1Ë~»›“iP¦ÿ hI~”üu2T·ÿ8ÀCYÝs瘮ì%œôuGf]ˆ•îLÍ 1s5³ë­ûž?M`ŒD<™¸ÜöȇLÌ%c¤Ëì2´ñ¾}x4ûÿtC°‰Yr3‚’¥±¾ØéXJiºôõ\¼q[ú8Cln¥Ò¬²è® ÿ%Éâ4)œ¥¾!¡R,ÌžˆüÉåÏ]$—騙%—ìö¥‰~\àÁ¦±5ÙσKfAô‡O—Ê;¾ŠÁ‹mÏjWðáež\P»aÑMßpå€À``ŠÂnöØ£n¬ *l¬ÊÎÂ#[‹ÏU°SìÚÑÊÕÏ;gÜ w§/èC Á/){3&¤ž´d¿å"L§jÚëæá-º›¬øF€MT¹°äûoÙ¬rÜ”y\‚o;K(0Âú±Ê+ß9dWšÕ‰#(>/TÜ“»LêHMÈšÕŠO•4\EY­µqš–Ì{6Yðvûêÿvˆ¦ endstream endobj 188 0 obj << /Length 2325 /Filter /FlateDecode >> stream xÚÅY[“Û¶~÷¯Ð¸} 2C/™¶3Ù4n“éä¡ÙäÅÎ%Q—±$îÔ®·¿¾çéÇm§ à8÷óJûE²øÛ«DÞw÷¯¾~[,ʸÌÒlq¿[(­ã<+™ÍãTÛÅývñ.ú©é—*ª—+­Ò?ðTý¸-Ã:K£Ùá:.Ë4ž¹A‹jøi™ªƒÏëü<,Wi5-廉-¯‘´Áž´nyMs…Öi #®ìj¦ZÚ9­V_˜l„Ò#ì·´éo÷?‚bVJÅ¥é‘ü‚[n¦Y´4)¢÷J›_¾ƒ‘Ÿ¿{½T©b¿_:jð[“€uÍý½Óô;])  Òu(ÙƒS‡ÛZv^cÇH0ÿ D WﺿAy¾~›«ÀÂ(´R‘î/Ë•Mu´•_hm¥}Gfâ¾'b”û[ù~ŸØ„_JöJÆ{¥ IUð^ï€RÁóï úŠ~‡´'ï׼нá8µq‘Ë*)ÅôOº[™"úGµÔ ÂtävR33nO{ÑB{vÎa©¡ŽØ'á©^Cðl–¨lý žÕT麌‹ÌÍÛa"@ÛmzQ\ƒ­7¼Õ±o‘ó3t~§Q€ø?q˜|"V…Ž]ÌÆÃœâë.:yŽªóì^f·ä‹<¥—)¯]È5«Æo;7é~Âάûrܦ²!¤M¼©.Õy ‘±U©#«ˆ¡ë™Ó(¥˜•ÑyÔá.ÍU’0öx·ÄF…¯8†‡Šƒ¦÷„Æ8;›7-O$_«d“§£äù·I²× l·[lÝs°ŽOì+›ÄI*nžÝøª‹fc5ïH™ƒ#iê𶈠mœz>íS‡Ïbk´›Å¢Hò¡ÀkF6l˰mÒ\CêÞ¹ I•dÊ´ÂhSæ ÂÔ¨8ÉJï œäš°Öâ¦ÛÆG^ÇÌ^@0Ò|šg1,5Ê0¸z-1ˆèMEíŒÉz8Ÿ)ÚAu™-)2>7Bü™t„ILb#òL.!†ž5-sªÞÔIÎÇ\Ö8Š0Ÿ–¦ì-›þì€( ÙVœ*häqimT¡¦Óº“œi‹¡¾X=S·¬vRâçHÝ’M­¤]xß}eÅcÛø>W8ŒýF^xFðú#E.GôÑÙ¾òü“[ ¾Ç:pbÕuˆ½ØzC²ß¾fDæê„È>Í€Êfq¦UXu¼_Mã*äT¡¥í[ΙeÅ3˜ DçdFÐUø‘’߆ôS“†<¿âi¬ ;Îê*MX¼[™²Dð#žbWCµnÿ‰^AÕ쥡~èû}¢ Nèp@—Jž·«)»\Å}êÎà™ Sš8)Ê0Ã|a9±U¬õXü¿×퀞C?‘ l”çàô ÷ºös|+ &w|ÿqÊ”Cí«f÷ÌIX‚ô#oŒÙ‰á{ï\j?  ÂñS~¤‹RÎ X þ•‘æ ÿ¾]…˜òÉJ_EÁ3|ŸŠóÄ‚#•¡ƒZ•‡Ø˜º[ õ=²{zæ® ©±uÅUÎC—-ç,\Dð-7—š?È$kG‹`ùþ…Òˆ;;1äW7ïP;zL*kA àˆ¥g±é™”cn´C^€?Ï‘÷×fR÷Gãµ­ùc{ô@ž5»«? ›À‹èPvÝ3þêy…°éÍÂXÀk S>¹ªíòë™tM8 ¢‹28Ü” èøä\«Œú†;C«¿vA}Sù¢”⎿HÜób2‰ÀqeWÙè)†2vpÅ ¦l**Ðo¸ø:ñp„Ñ㉷ì9éBÁ`Èé1›¦Ç,”Âç¤Ì¹“AO ñ@Ìàè[&”rïn$„A‡²q.‰3äøÌë`öÎãˆÍÕ]$ä\²èñ(ÎóÄÝtìÔçRÍfÞ¸R[µsŽÐÕ"<¸ÝSÀ[JƒWBÇÝTžSø¤kžµƒR²ÒPòÛ’=Õe˾ìßÎ!­^öuÈW1Ò=z=J¶žÁ?yÈßø¬p#ýf|Þ¼†]f¼s9¶z&9tamùVá$!¤òî* hªdSJÿ˜{ØuªÒ€Š& šÀÉNX¾ ÏÜÀÒ­ä3ÐàÖìñg_3u¢»µ€€Ï_~JV·wN_wõÜ܉™ZŸ}w-ëù|5\V&.™3wmêlœ—Zo:®ÉVçÅ©Ž`Inbk=êX¿p÷«s4›°—©X•ù‹÷,ž“F˜œõø_qrh޲ ̬.‚×aì¡ê$ÀÀÍi\Áq<+Ë›4ãÜ#L˜˜ÖMý‹W4¬‡x“Ƨ7øÆ+1N‘ø]ñð®Ú¸Ó]+vL Z•8f|AfÜÙþ\Wi4M4„ƒÜXùáäq'{K¶ØLXù$Vêàμ4’IÆp±4c$!s‚òKí+Pin/ìÆg ÌÄ&Ž5–t=‹ SêÅUÝ"HcšÁÖÔy¦r@ŠòX+¾QqZLUFÎi¢kçÜot?’š’…N%xÕÈ9¡ûlöž-MÓ‚ÖsÍ9šÌèÑúxU×¼Eë+›åŒö\ÁÂÖÀéR¬œa`Ç>Xx°}.¶Ïõ ÙøL•š²À?úV.F‡ÿNjr‘£Ãÿò¹ûáÔ×’zè®Ú}=@•©÷\-`§ÃpV™MùÙ(å?Ž2Óm*ÿüœö{î_ÿƒ2ó¿VR6’aч)ñŸçuïËeCLüƒü äoüO.K»[±ˆÇ>þÿ£*8?øÀr[¹hq87õˆG a1Y> stream xÚ½XYÛ6~ϯ0ò$‘"Rw/ I› }HŠÄA $EAÛ²×-¹’wí¯ï\¤)Û›uz=ؤx ‡3ß\ŒGËQÖð×ÍVðß×ýø×ÉŽÊãg¥OAGªÌF¡‚!-T4Ø0z¦U<í€Xmvø?“$ 7 Žì±¯ƒ›M«`Ïs{üÆ-WüÍ]G¡‡®ÙÈG'[—«¶aj†8ü¬ˆ=ŽuœD °3³7°ãp(-/«£²Tvñ#¦[„Å3ܱÝñÈŸÐoÇ¡.‚vSÏy¬½&Þ©¯9’I¨ué<JN_"9¥Ir*9ð¾çá´àÛ“–*Ëà½JR2Ho‰ìïP€ygpÂÌÆpHAsBÀþÖ8…3·c]tG8§Ü_õ|^¯eµÐÝ8ÑÌñH¡Êyc/ìÖFȵ ¼ÿH©(- ŠªLDƒä·{Ìž¢tD¬¹¸CDy®¡Í¢²(E°%¢?ø¥À¡JËà;8½d4]· äkÆ<E ¬•"Å4'$c†_¨«”.×s× $úV>¸éé>¶ÃaÆ6-Ì|ÅѾ)´9LÂÍoð¯æ= ¥ÒGã0Mbaå,ê«(w8žŠ®[½¢›£ržKÛÈÜæ@Í¿žEèGˆ‘ÒqÇl'xDûC¾ñvÒcì’5‚:Š |Æ‘zÑYÊŒà_oé$Y,Ú;Ú­Ú’<Ꙝ÷>V)3çåS¾Èiß[Í ì²’pÙšyÏ ÛFL hò õ«ùãØ&H­8Á¸‡1Qš]|%{d§ÇÓWö¦!Qñðî3ß¾ù°¼kY m†ÁDÓ%8»2¶C©I{äá“8YnjŸaKWÁ Ùá‡>*³% fâéHoÉÓ3±ddDšÆàtø|žz*bÓ¿pÎj²ZEZUXoaÙÓ7øw Á$‹ò4µ+‡â&m§JYm'Ö¦êC¿C¥–äè`Ä4²l o\jà ôgxÃ~gÉ=Ê©å…ûug‘,¼v‹´lÕp+ø#«Èò¨Ì“#`ëK¿“VG^È‹ߎÃL'ŸiÚh;Y,nØÈÖ¥LáØÄZ€8«|#<É7n à ž‹îs*D.#N[¿à&„¿˜¹Tçý°' –ÅÛc›Ó1l @ðâÛ5ûZ.&œVÅ@ù¸ÁóÃ8íît+SÖê)¢UUD‰*.‚tîCzŠŒß2„%dùÖ3Gœhåb[ éfc WcW ù]n€*2^´sC¡×÷ŸÂWþoàëïÁÁW|vÄEõâLTÏ$ªOœ@òµoÄŠ/3_9Ì‚‡Òp*J4 +?ô<¶èÜ-(3¸ÅÉV®ÐñšŸq_=å'ŸdÒÝ›4 X“XÛ\»[N ]ø›®ÅõÄÚÅ™8 þ@>(?¿=ÌY/û¢X ËC"-aØHþæ¨Èi i!- {ypáÕ­5ºWÅé Ð8—0îõL ° •¡’9vÚ"Ï]¦^|Jï8¡LmD.}š¯#Vßd 2¶'^+ ¤o‰—†Ôñ"×tgx;l'ÙŸI=*Ì«ãLàn 8Z´kY¤å {ypx§¬ƒ ÛßÄØŽ ­çm_C7äî¹U/å{ãr•…Û¡Þ&‚Â÷Eîû.ÆÌ6úRjÐÇÜ¥"ÃŽ›Æ[„èÄÖŠ‘úe’&tÁaàšF¯pÕ‰ƒ½*ɽbiiýSMRœVJn¯Ùñå–ªð\ß•þmm–LÅ/U=;{‚›WýZŸCTŠšCL‹.väÿ @ß’ !)ÄÃOd\š^ˆ‰µÁ,ãhér°ÆÚ-Ì´à­!Õÿ‡f;Îû­,aÚH ¼o¨8JUb£2F¹×ã ±·t×;äU¤ŠÄ4Èã v©»àöP4° 4,øÎ9³6Â\Û­èmC®dÖ"@äz;>‚ßG .•VQVæGê”®a¢µOmk9,*Ó8x"'¼Ü܉{ÓCG(èªe±àÖ][ú^2#ó“@`o¥§°#*T«w¤{ gLí$õ!9‘7íÆB(?Ë=HÆô=×?¶ð4;O܃ח,¨V )jI²¯šl˳Pð„À¡Phú®çLLe!„tÅå\Ç}ÓHJ‰~•Ÿ§ÅÂÔ5™6 ^ ž[«ñ¶"Téân赦³o¤Ÿ5¿>Ñ4;`JT6”ó38¼lw®0:% Õ_â-ªqÒëˆiÚL¾ \8½¦¡+^b3nì÷NÐTµ|Æ÷òö‚+L'Òçú–9Z5fW3kÌ®|Æ*“·x‰aƽu0¹{’ƒƒêT]œÌD[TU“;Ýîÿïâ}.‹÷Öåú”ýœ# iÃ×Ì›—?q±ÞÌ­k=Zå^ìó0‹X^e­åÁB‡YrïÞã«øœÄ¾Cyî)¤Z}Î#·¶‹O^ªÓ<‚’á’—ê»óVj^â™ñ+öÎA%^a1|Ù‡ ïÅúè\• µQ˜J%X¦˜<ø ‚ß2 endstream endobj 205 0 obj << /Length 2123 /Filter /FlateDecode >> stream xÚµY[Û6~ϯ0öIbV¤$JÚAšìbI÷!- Ù–íÙØÖT²ãäß÷ÜHQ²f’^öa,’::w~ç϶³xöòY,Ïïïž}óC¦g¥*­±³»ÍL'‰Êm1³Y®L’ÍîÖ³÷‘™ëHÑüÙùBë´ˆ¾[­êæøw„Ÿí|‘&úˆóúÂ|yªNõü—»óCŠg ]¨¤Ð,ân”B–Ç¡B¥²%Pñ&B]®yšD¥&ï‰3U-~R-áwO.L–އձ_:’ºðWW=q³aIY(JǹJcëd}äí<3QséD?üÓÊfVÖ3x²ò8ºìÄÂÕÜäÑŽx@n .8û×ÈvÊ€¹)È€¥oªÀŠMÓ¢³…Í“¢÷kUfám}Ó™ GSÈÅÁ8§`é¶ü‡åÂóÊ‘óÑ÷gY¨;5_¤I½iN¬Òã ‡ï`nIWÐ !zw“Ûž,½K.J2÷9¾*ç0ˆÛÞ4=Ú옧&‰>ö‚yu'V‡TÄ…æÜh£úÈ™ƒK?ŽÁg=P&M!ý§}¨¶Âû€Q;sîÑÂ’e]K®×¬.ì7zö&¤À¸ÔË)Kou.9êT•i:¤¾›IÔ€3¤ü5Û¶:ÀóP¹Ø¯ª½ì©ÏHšF¿a˜)ñeÁEµfV$y‹LjIS¢ZÓ^|^*ù™,Yóû%¯Ð¸â#Œx9ßœ)©S@’ÄFY›¹ ×’4—{Š™¦l<Ú*‡Zry×àž¥Í‘ÉYTh‘•*Oÿ>°Pb^Ü £UVä*KV¿/2È' =ÈøÈù†¯ÿ ïݢ£Ÿã,†Ç|iYOã:*Àòoñ”xOÑm}Ê)í×2í(9ãCŸäK„%vêQÜܱ÷iìÑÆGJOÄDâ¹ (zö΂–{÷‚éZ@KÈ»/1tÐgp©/SqÚ/þ÷‚åÙ—#ý`eEȯ£Œ2£ØLQ½‘¹‹j÷åxÑáÛ¿ûXã?g÷rJZ½lQ™ìï‰5ó³XÉf°#v¾˜^ç<>2œPEÁÅÉŒ~¥ûMjÚ=Z¶°ßœÅ¼=;3 råŸÈjŸp¤¤Kü« ÐÖäÑGJXëÐð£‡MHß˽C©q_#cnTYz`pøŒ8LëvòFÂÆ/b§»•á.Zq%檃A ›%6UÑÿjî¶hM aÕŠq|7Q\5Oçè.ß¾|é2=&ØÚOŠLeɨP\[Ç…<)ãáA æØ]Ô¤ëÙ5ˆÔérßA¨{àyÅÌóÒ9OÌ…{÷¸Obß¾yë˜ÅœN%ÝÑŽÙ6=„ÜÄX–G6žjv^Uháë 30-鋆:_jôÛŽ—Xeñ`Š{àÅ;#6»¦¯àuo™F/xWï˜Fƒ¸î*a_ o>©pE^Ñåý©Oo$X»d¨x>8[M” {ÞqîÚr|ÉmóèÞ÷Ô‹W](ÞI£Ž_"níÀÖ’¦ŸÜ½éhÿ[ë~Yß0€h¦ D<Ê+8ð/׃3ŽО°§®åáïÃ[ßÅwm_4ïTÄB½Þô HYë—fýΕ‹gq³¼ŽâÞ†Ž…U´\ÊÉI#Ÿá âÊý‡`ÍÔ”„mPë§.@F>y¯ý_¼t#PdS­¯+EX‚˜´%70†ÿ_á¯1G•Hg©J±Ó4¥* Áêr@óâîÙï¡Ïj\ endstream endobj 214 0 obj << /Length 1347 /Filter /FlateDecode >> stream xÚ­WKoÛF¾ëWðHæšûà’¼hÒ&h8m,£‡¦E›ˆH:zØi}çµÔR’. ƒæîpvvæÛovFyrŸäÉûI.ï7³Éõ»R'µª½ñÉlhkUé«Ä¥2¶HfËäÏô‡iV›n¦:màùÏž¹¼ÿ†çs^ä2ÝGŸð|…g#sT]ÉwX¢§Í~O2­U]Œw[Ê’½¼e´øO'–fv –¯ßÙ:aÓƒƒL©´“¬]=…ÍK?ôbdÙt÷ÓÌ–ŽfÝÇEÚÒ£M ° °ñáíÎʪ'ÈßɼC‡Vjš•Ú§a¼–/+tïjš9çç:°ð)Ü¢€:=±NŸdÙŽŽþÝoŽp mÄß‚hµ›‹£#¤pŵãöO¸Ž¼Î.¥Â^2®ïÈȆ2(3µ'šw=šxîX2ßñ[Îóü8êByÈi숤…A2ÁÿÕùI­Ü `;`ô,2^æ±2ä•/ÇÆÁoÁã’õZå>èãù…Å1bކHKgØgž0h&hð …qQ8$Š££#ê#Ø™.­²þ„jèÆ¼]-/Z+[—¯@Щʛ ßo™œ¦¬(D Žñ#eça¼ìñóHº~›®¾ 2»}0S†Ô#ÍϹvˆg ‰Ú^„ˆ}¸TÆ(‘ë‡/f³q^Y[¾.›-ÜuÅpÌW »u9Àmư#}­å"CÜó<ÈËZÃ(°TòØ > ¤ª³t/H0€Ê3/½« ìÕPíŠ#}o@ïžô\:V]×A9òf¸wÞwtå*Ù1®³P4Z¯¨nŽÒù,ñŒ7žÀC[ë!iš›;ùAKñ+UbÃ7§ÊRzÒ¬y’¨P±þ®©óiçQo§¥8‰öù!qôñSšZ@Ú´ y"—ÀŽ’$tL ü }2-ZÐ&„Ë2t±´~ø-E×´W¶Â³¢5tƒ ?ß^U%4ÐÉVUÅè|¤ù/‹® endstream endobj 211 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (/tmp/Rtmp6ZXbBX/Rbuild50b6357d8c37/rtracklayer/vignettes/rtracklayer-trackData.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 216 0 R /BBox [0 0 432 432] /Resources << /ProcSet [ /PDF /Text ] /Font << /F1 217 0 R/F2 218 0 R>> /ExtGState << >>/ColorSpace << /sRGB 219 0 R >>>> /Length 280002 /Filter /FlateDecode >> stream xœì½»Îeɲçï§(SrŠ3ï™. R¸‚€ÆÅyíÝZÜ~W¨}·ô—\w²T'ÌÅw‹=dØ/¸àƒe0TcyÉåia@#´zÁqo¼¹O˜€!™ÜWÀpØ'ŒdvŸßåy§{üäP ýn“Æf¬ÈªYl›\0þè÷ž}ð°cƒvrç¼èʤ°Ýà÷iG̃3å²’ë¯ó„ù Á^³'Œõx¦Ào=¤_p—Þ‡’{fØ=ž³è™bða/»ú•üÀuáy¨p¶¦Ú`È ‚³=3Þq0 —ÜÙ‹òGÀèmpÃÊ 5ìõMðø=‰ù’ù‘ÌJ†.9Ã9Õ¾3c¯Ió@«$;c¯Ù ÷;ì“‘üê!¨Ä´¹œ°“™0¾Ô4Ëxsð ¦A}ÜÙÉxÁïRUv0r`Y®ðó‚s’UŸï£ÿÃSUe|.vAWÛL÷¾vú)ôŽ}µî;ìî°ë /è×*tÈýúÝc)¢ú*¢ö/æÌ;á'9‡¾Û£ƒï ¡ ‹?ýA#ý‰»=ž)pà%±ZÍ‘/øºP“*^¨k¬ÕÄ­ó‚ó’¬xÊaêÛà g»e¾¹g$O™&ðhÈOÞ™iàNýymÇö¬œöÆñÑ|bØ(‚â”-U·_ŒçψŠPðf1 \3àÖá„ý˜i’÷ŽÜ²Ü8B…ïþ„3&÷T»dÆ{˜îíŠ]5¶ÅFI‚5-†ìîÊ&ì‡Ã’ß+ã°Ù~Á¥`7yˆnt‹ _²œøè¶4i†¢ÿð]øÎsd}ÁaÏPƒKæàå¬/¦‡² e‘ý>ÏŠ.ŒÎÉþú]mxíL•¨Ücðmø‚_ÉÐ*2xcp©%sZô ƒ‚;ue…áá{aØe’ç£;‹M÷T.t€wÄwé°k$ƒRÉ“úÇ^piƒšE³„Aó^pbw ½©÷ÁŸLÏ’YjYUP÷¿àR'õ¶O½Vè.«©ÕÊ¡[ØÀ( Uà׬𫕆 mÉéXfÑͮł§ºg$„Ïe*waÀS)p‡ºh†„Ñ)O?Ý$_O–ùÕaËö¦§ŠçÝŒS§\‚Ðóáa'&lQ_¹%çÀ|©*uFæ&L>T”åüS Ô`¸Ãœ_Í%7l¾î„—~ž$xÑè×R$°– õàFvKiáp–ÝÝìH®: –܉Ѐ\2âè°›EpØ=6 LEzÁaV0fÉt“ ¹K dy»7üfåSÒM2UêÆtØ’AÓà„Ù›O•¾¹ñoæÃv•2TC² à]å*e˜Ó³”&%o%@ P%·ØË³«R=àkòU~ßDlNItaÖG¿‹¾F·ö(ŒÏîi=ðM¸ ßlÆŽ«[˜ä#óFÃŒsNÁ5zŸµ"Tr¥Wå)‰'ÎQ„†*r*¡O-$wšéqä „%&§*ý ¾4\_ ÂǺÆg]Í—ºÅ…•ÉQ*Ì¿:J¹Ø|±pæ×1ÑÜdòBÂ\Ð#«ˆ°ë‰cxjÀR]ðB±ô÷_eLô6z3æG4Ëã¿èVQÚo ×¯ZžH[&袷4)tþ&N&ƒKëÈhßpÜEár¶­§8Ñß̪E ®ÏD¬@7Ý]*Ò Ç-mDê9¬°¶žÓÄ`$‘++ÀGeAl©ªCÃL“UE´á7WÙ‚äÊú&Î ƒË«ÇH€ ÐÊ[#Oâ >(ÁÅà0ªˆ;òŠÈ}qÁ¥¥Æý çG ›Ð$Titx|°hèñ¹à*¥ï°;òZ_ð@Q¨¥bðf2Uô‚µÒ\ôB)ŠC>½J¾uÁ=[_‘\ÛädªL’ß s‚®äEͱ¬Æff©–žIðÖH·ü¿ðT™h‚O¨OµsÁ,ÇÄà}¨ä¨Ã&Q“É­îf­Ïf»ušW`)¨=›h=à“´Í„Yrë·àR9€)ƒ¨ßjxÂtªàyŽ**ü2Ë#ªRQ©´ÑAžE‹àòá`æã°Œ)I °Œx2ŒUIW¢4 Uƒ%]†Ð[´]ð~ï*Œ$a‘¥€4 B½à!¢3¨‰ &^þëÆÎÈQhºð?Ô¯æò¯Á1ÛpØ- (ºðG2©—3ø0†Œ fäƒî™ K‡Â1¤ÈäƒÆºdØb‡_òAGd ßˆÆüî—R¨U4NfÎ\PÄ4‚‹k òž%1ìY) à04©¦òåàáHKNM·$øÐçÿì™ “ã$aX’Z³äúL+S„Ð"¸&ì)§s’ôì‹Ò †W×+‡Ð"/µ# =!ï ôÌ|5æí6XM*Ø¥‘Fóï'žX$ËàD$h«Êú«·ŽIŽ pµQÅvø–% ãî Ÿñ{fÀ¢|¤kuy.!zgÐçIÌ÷ypVf uג̵õÜÔ^8=5e™rLÜ?zeKõ_$›ÿ‚ù7ḭ̈9¸„S.®úf¢NHVy"I·»àÁ¼këØðâ]IʤW¹ HýÃ0ÉL781î‚ë° M¿º”Ä”™^>Æû¤È’$õcGŠ QÝå&Buv¤Ó`¨@?`R¶ôÔH̶. z26Ι0¸³4Ö"ffF;fð»ÃÐ3Þ’7{Þ•¡4œíƒSJ8ƒÙŽ[èÃB`BCÞ\ƒ÷fÉ–ܘùZ.7\¬*³¹­ËåàF΋<8âì\Õš™0ÛSpÂjæ›í€eÊ·*ªB·gÓ¡D¾ßâ|·CÕoU_;ä*8 *RE{E|6^Ñ&?¨(³Tè±ú8òÂZt‰¨]°^êCŸ:U­ùx€e# z1S<¬u¹è‡ùöDœ‘B›ø¥äüЛ¾…s•õ¹El›Iô¡NSúÕM=–QŸÐû Þ_ƒƒWN™ü¡ÐÐSBåEÉo¥œÚe‘ÀvPÛ‹ †ùå&íÁ뺋)ÞzÝI:l­Þà Û(Øe¥lvŒ ¯y‰D°ðg²MÒÕë%1äÁAµE ã–Ó’=ƒ±ÁÃFÙX–ÌúX$!ðÒè˜$ä‚ è üªè>îVbðX™±nnEKQ C‰Éx5@ôë¼e‡ø. ;sˆÅ Ú¿C)ð‘6Ä ØÜ°Åâ-‹a² ¶¹s`SVÀMÒ(CÁ¡öéŒÉ DéÖWôCßX—›ƒOaI¥–Ì8U.¸R{(4‚j ŠÓBaá‡XIÔbîo;èé˜~³mfòrèÆÒ'ЀJW>«ªN ¸ã"\ƒ±!8»ö Êz³V«\Ú^hØÌ¥ÓÃŽNU„~ªégeg·¼)FQ­M¼ô2D %^)á°Ê9‚ƒËm×Ùb-•·Ãë2r,Õ¡k:KηÂÓÐö6—"|Ò¯`™Ô”ü2ú0îó×”èo¢¥„áÉ|ÁÑËÍ­ÂVÒÅ`ZÙ/pðÁÀR ŸŽ˜7ïWc/Ä^˜æFå¼l¾o¹m ¾Í7'L‰{„†×àˆÀÙV™&´öÎ̶† ãž{g–êP*qƒÃ<Á’ùR'1Û¦8¥’M÷É&ÌŒÐ$3K)Œ®@Á´™ðº:=3Û¦UafÑ™r ÂΑZGÚ•Ô ¬\¬­6’ð‘vN|5¼q^0wž·S †I4›êÅC¼VȰ>ЯXo¶7J?®A÷I«„ ^lƒfÁg epÂzxC;œ0Á¡Ë®†:‡ÝW5\™ÚŸ7½ð ¦60í³Á“Þ–YÉ‘ú×yйƒ=»ˆ½`„ºëÁ_Ó60Å¡`0âÇøÖ8D—»´\+g‘Áé%‚ ¼a’ãLwI |h«Ö ÎH>:qÇ㊦FI¢iÏ'µR—û‚Møèò›CENµÐÔ‘(4ª‹ß_E¯LÐvð^Y0´ûƒw?Ú3Âõ2±üh¥ÐÁ<¡!'ôº¡{o> ÉóqX‰M÷¬¸[–ÀQ@®‡- ÏO7V‡¶ûTcu”[Ãú£/ÛeSMÂ`2Å”Yõèœòa@OBT´ÍBMÿùê„qh^W {£ÙlyÙë¡¦Æ ·heœF'FèM“•^X|7ÌV t}¨“0Ðå0v³‹† kª* Mpù$ô„,—¦q0~˜»½¼A–s à„U­4L³rÉ(4JWÍÜ›ËéL—®ÆÛ]±¹èé”…~ŸöP¹Î†“ãV8"<4¸ÑpÉ2E|½,µ/„†Êkª2ûa †Œ6Ýc¦¥×ÖpÀn²¡p tÁG576 —lpÂ.𣳒Wæ›+;8Ž%|\/“R¬W*ô?E“ FCükgŒ›í t¸ÔN‹€wµœˆdᎶµó¸¾´Ì?ú„=H¯¡'ÞO\*¤šÉ‹Þ…u˱äNo÷Ï‚Iä[¾Ð­kÉСl0ªjþ ^ò[v?L’Úªffÿ®‰ò´­4øfØ 3xÌ×Ù¯øªuŸ4Xb¶3FèV¦(L?±dD{]ÅZ2©MäÞpt¡•ëÉ%G \*u¬Žäm6{¸?Eµ«I¶ó[!XiFÐ ÚJ·„¯³­($ ›‚>†·ð¾Qäñö‰èjWF"úÃÜ“#ÊV˜:x%³ó|žÄRyØÐ–:EZžI¡ñý~jæ«u¿#V4ƒ­ÛÌ[j¾»Þf0¶s\·ŸÒÇ¥ Ð×/4¤1:º‚ÂÓ5Dî7©}E0ÉTèÍX·UOZø >îÚ?;¢ˆ›Q^t£ÞÐãô.(z)X KYµºÌ t;4p{TÒ ½©!ºVú@ N¢M-œ³d3G58ÐÂ1˜~s†Tè3z’q+ânTµ$ð† ÓZXýj;Cfû°!‘ Û¢d!1úì¥ö糑:Ї08T!òbxÆ+Ëâ¾sIÇ›zwæLø4–Þeɪ…éFD'|˜#÷¦æ*värúTV»oѲ¯Z4¬À̃ƒ?‚ö³ n¨&7P.z³×‡Ñáãƒ{T¾ÔOª¹“wa£LUý#ùí/úaÉ+_FoEª©RÙb€{Eþ#zë‰à u¨³ä‰OöÁ¥§?†Ý¼ÿHfJ¡(¨…xñóàPfè}›F«Èå$äÁPƒSV3ó]y§ŒAýSY¥™Á@[àÈ\aGºpr¡&z8ØtR`ʯiÉþÊ’a2šÀêÃTQˆ>x‹ Ì~(pð!>ýhäYmaÕ¨ò Ke8ÑÕZ˜Û³] BÍ8ªpàJ/œUð6Ší‹. œp¡U„ m¢²M’×jÛ5 ™<|Èý~E/F_et… ?íÞˆÜØBGÖ:¼9æ¦ï;ŽÛàÃ÷Ju¥tÓU×®¢È¯Ð_ØÙF"®Ñ”à‰òÀ>àÉÞ±í¶þÂè”è o÷ÜŒM\^*ði,c\I×2bÜYý³Á+1GñQâµE7š8Ñd¡þœMä¼8ÌÙdX 2#Ãú„ }pkäv9…¡o©?8åÚàCUI—1½qýÁ<Ê-℘ŠAèƒcvÞt‹Å¸Kae ‰@E2"O7ÓE½âZà+ú0ªÚo#u„‚‹­æ ¨l±ÅB… '¼«êN™õÐÃ%nTQ p'Á .¡aÙŒÐÁ] 'Ü¢á­Õ'æèmbôìÀؽÕ—¦:ÁT%0$>ŠŠ0ØÑzwöÞ"Ë’ +Þ¶äEφÁЈÊ)‚/ñ!r-èez¡ÁÜÑ3ï†âðÊJKî4ò5”GU %×øPî¬òJ«‡ùr6Œ(ìãÝlÏF£}cdv˜À°2É`˜ñö‚ß—!|%‘xb ÅŸ`¶Ü …è111A[öÂñP::'LÍ~a–ô?t˜,›*}Q_@‹Ý’é›oê)Ÿz‡C—ÞTPÚúSùOP{^0ÛžÓÃÙ‘¼ôàÐ[cfrDÍb0ì™%p\ÐìL†äŽÁ*šƒNúéÛ=†é«³'.«é<|>lŒ™æ¦‚;L·;4J¦Áí92ùððåÿ¢£ÉüèXé0í`*[¾2æÆ„\-ì‘ n€Ã>*õ ê@%k0ïu©ƒL‹Yª:ƒfI€!‡Ýi&¼èò­‚ZR ðŽ6364^—úfCš%ØHcãäè¥Ôðõ¾Ô?¦¶˜Ï:Ô~`Øt“$%üTXÒÜðàIÍæC’јNØÄ$û‡æ¦ªÄw4L‡\ŠÿÃÀYì=x®æ¢+`tNe׬I±¡Km?‰ ¢åhAÑ3áSÛ+3îX¼Ö0½Ï”›Ðƒ™–<¨ÕmšQ¸ÅΓ¶é'á&ÉIvü‡©îÓT£Áôçé™Ù™oª£gzèÌDõêY˜[à `dŠû¬DºîqÇV˜Vcn;ˆ>¢Á…£ò²»8â óBöK0‡TôŠÙb=œ—ôLæÁô‘"Ò®H©A gBÇtõr/TE$tpSÃq'ZðX4äEý0ì&–Ï$˜oï•‘¼”ZB.».)>ì­Úh5³hþÑŠã šµ.f¢°º‰)§Œ«ˆ¹AÑ%%º:žB®,q4$Þ¥¸–’ƒñ>) Í"ëBà×DžH€NÃ’e] `áHÆë,†ˆF­¢ª) "õË•€2>ÉàÊJÑ ž,úßãLÈW ðՒæX³äÉÒŸú­ ïpØ='9\zð¶¦ëþ8Ü&—œu•Á¬”I„ÂÿýS w÷Tþ?J£ïö:•~ÜXæªÀÆÕD÷àwN{g£•„&ŠRü¾¥¯pÂjæ›åÞ‚oÒÖmÂvV"ÛŸMÏä382n18Þ (#Ü¢s'v—øÁįþ)ñƒûda²°uLAaÂ$÷ŠI5”¿¡£½«žÖx|À(ÁÏàCFWV|Uv‘ä@ƒÊÅ<\ª“Õ-3êCà°¨DQe‹>,wË`˜ ¢ãÄŒÉ[ƒ¢ =~csÃaḭ̈wf¶Ò)á™<<œ­ï 7èamßQ0ÓM¿uW(«Q ?Ò˜ dû»¯†Ð¡ÆØ6ù"ØŽvI¶ÅfI(PçfC]ò>PÞ·jM­ÍuõQvH­ÜD>ß§&Vú¨|fu¢B ¡ó°_HæßÜRkÕ2{Lqh»Ç¸KÏÌ7¾åOÏÌwÇ<€jÎ"¸A]÷Ë%ó£1U§'LÌÛðÎ1e¦÷OŠ7œ0±‚">‘® oØVÃàNcXG7ôÁžƒOÕP†wcfÀï°QŒuÜôpä71x2~ q;i##rÜàè`(¢üê0ä¥ú&ÛsÜFÚ(wAœÛ»³{RàÈYã’'Óa–\`qÀµ’q€Ã?,Ê3VYdCéQF·XÇ­9?`Dçà’c¡é-;1Óù¸-âQ”Tì¥Ñpn1Å‚¨"R µ®RYØ:ŸqÖŒ[¥B¯ÙƒëzFìXh¶V…‡s n,fð ¯56¼¢Ý2žè"²1T–cp¥›»pŽ´q[oÓ¥âNƒùl«º¥·ŒOÓoöÎp]g™%P}ÞFçpyrᢰ6ŸÁr"-¹Ò7tQn!Õž"AAŒ5æ7jÚ=© èb7”¯6TøõÐ[²ÈÝ­ÏÛÇINè©fHá¥aß\M5†%X<ð6JS·/0•,{h®»C.Êë·\ º;jÃÙWoV6;ÜSøaaqû®¢"&ƒ!%ÒG24×ÝO nÔ 0¤ßÿH†þ¡*ÖĽ:TêÆ‡ÍY ÄL±a£›˜nOÞFÔàÆXÆ †%#2äD&?Z¯IhÛ€uãÖWãS•‡}ìî€ó­jJø"¬2K`D¢™8‹}t}*;å‹}sS^Wnôó‚µÐü£aþP-&dœ· ÕØÛI>ZUA$â<ñŽ“pÜÊ’ƒWNë‰xF™seêk8ݲˆ‹éP'~ʶ…»bMÆ ·ÄM"©hûNé6Qºô/5Ý9ˆ¦\àÒ`û?£ŸFYiXY#t0é³ ïOÂWÝuè©Ë$>[jzˆýÑoqS‡KÔHCÒK>ô]½ùíŽÍÂùæ † ok/,èøx#Mj¨a-•¾ˆ»jsà[Œ¾M$<B`:p–̰Kfºß¿í•‘~ލ8ŒÅ‚—N ù.› wÛ8LÏt`{ž*ù.?7òEÄ^÷£7Í^œCqhžLŹ`¨j*ß&²¨¹ì¢±Ô@'æ,“k:MM al{Áon¦Ïgšt«l ÚV&6ãà̸GâØ3§÷ŠKºö’ µÓÕ’aóÉ·(_¹äˆÔÀ÷Ö>¸É˜ÂSàà‚ƒzдhð+f3\ÎsÜy~uÓ…å´Ì„‹¨ –¶œž‘܇ã¼iX+ˆÍp†óQ@ ºÎà´”ÑÐDˆæÕ¸Lî(§¦¸™S æ’5ˆ„¯¥¬ä [¼¨£íÌÌlÏŒš èžn̬9)£èÈG9µŽpºÝ©N÷άo:Ä—ãhƒiû`ÎMH.l‡ÍKÛ‡^•W¦õ?`¤õçeÞC)N0*M˜nÏd” þ#ÃF$J0Òú¢; P¢õ?`Tk6/U!2¦ æÛ³f6IËHn¸ÇøG2*=æ9„¡ÞüwQª€³óRï¡j‹~_fÈ„Y`´]…¢GRôÌõœËODµIÜ/ï¼dp¨LÁ`>ì…Û«=c4?…ÃÞQh†9°.x°’¢)Ñl^ò_\žÌ-n‡Á©qG·nv4Ò’a9ù rÈÈ`CÝG„NŒ[4‹tÆÄщƒWŒ¨«à¸‡zS›*Õíð«§*QºŠxèJiBSÒ1åÈÑD(F—‡y¸„N9êïÀëåñè:=i‡ÞôåÈÑü‚F'>[Eá(Wò_>µ¥Ð=hÎQ)¼Àü««ËC¥RÕ/zjêekz8D9&°Òb™2|ÑòÉÁŠ¿N/?Ç|#oÿA¿?D/·Yû–iª5>ò£³…ÁÁ[]mUYµ(‰ÍàùhX®ôÃ=Ú^¾AZ£ëN 76IÅó†wY+ ¥ÐÌQÁU+ðº²ò]4LOš—deo[t…Í»Œæê¬5÷ªdŽ«Öq`_`îÇn<¥@ š)pbØ;#yãÆ ª ’d¸½ÍÏåQ3k¶?û“˜0ƒQEÁ…•&̰æ’÷·À£dÀ5 †ë%÷ïÃ^Y#£ Þ÷ø™Tñ“pÝ¿_{`Cãi‹£,z³û´è’y“ Y…3–©Ð©~½0Và‡¾–f×é€aƒ©$Mø¾œN…%Šv#.ú`ºÁÐu3îì4]WŒ}ºSÍÚPÒ¶Áø‰g0¼äõчæÜL÷`€úDÙ¥0#+9óÑSänÐ•ØØž›îއj{…~õ ÌÁS1õ¤o‹†ÉY¯*½Ðy [?@tÌÜ)+3áj¾Ž‹¦L~êÏá”)7–ªÑ££ £[QYܰãE¿% ËE}î`I½GƒR¦ÿUÜ[¨!¼Ì´ µÙ‹>°DVÙ‰¯90í¿;£ª8Z} s§y ŽH 3oÖÁ©æ³½ŸÄÑØOR2VÀ.£†Ý.aÜÀuÞ%3ìš1c·š…À“àÅX9︱m³[xào·ÌG§RA¶jéP‰•À´c±Ánªv¼ÂÞXB'>:'zböiH“ãæ«53û{e$«e'L^ÜJ»¡ªÿ| ëg²’K4îyÇ ×êkÓ}ž8¼’¨£b^4manɃUQç‡CÎ×dÔm^O”İyû5ƒ7 få†]sàÓX×8Kî´ÆÃF´'TàQ·$XZvjJ—´Œh=ÃÝÈ4cHfÜÑóZÞ§ãfKGZtIžžˆ åÀ#žñÐl?NýƒK½r5™1¡ï:êíùWŸÌé88Ës…&90èi0üæ¿.¸Äã…jŽ¥";ìFÊä«àšG=3òš¬LñùŒ|íùNƒÈ‡¨À¥ÊõÎnƒóƒ®[3Òi?’é„%Ár^|°*iÊ¥åÃæ`•R WÎú «Î¢;‹Ç©.ð@ë£Q{Uƒ'c2ÎJI0Ì@3¸1Ê‘¥}Àô@‹?›ÿÀ„%×Ñ& [_­`’ÈùRÍÌ„yØpÂ4läªù Õ/`tÆý¶.{JQTé\¤ˆÃ#¹1‡Ú0üf=ŽPÝŸÁ|‡eÀåI|s)˜:Ó`Øœç#¥ï~\“`|ªŠ™¹ÙÁ0˜[¦>òÏÀðrOsBb N.Uj¶áêôÌR‰ jÁo–)…ÚÔÀt¶u?£(£Á“¥ /ö^—Jõ^8‹^±EAF‡YAî웫ø¼á&©â°SUõ¢C9¤‡‡%§ÀŠH°“Q•íǪ ”‰o0¬]øH†Ž¼ê‡ÓúUo#èqÈg\©ýX'®­ùaú6jOâXµ’н.³†ïÁ6ÄÖªé<÷QS¾-¢¶Zªú],OmÅ‹_tØ.é"!€žùž Á¼`1ª°ùѰåÞ]¨ë5#ºFõ¸”B ‹†žýîð;Ê^a mÈ@°‚±‡ß9ÝYœˆ·ÇèG(»LgxÇw©ohštÙÝ02ÐW,ª x:¢k°þŠ+™?I‡âïÐòªèS6T”ƒ cñŠçüfÕŠ$ny¦‹ÆÄÄñ?n,3å#êß±’àÅjÆ ÆÞ}ƒéÞv#z¦‡ ü á=Ü‚~³j˜ ËG2ôúNeëÂó< .€Z·%;œ0K†Êà5]ƒ‰œƒ} ›ùžªï‚½«²’ß½ 9³& ö˜uyPÕÀºÍØ¡uÆø o0tM1Ï "¢¥VÕ‹ÕaÌ7‰ ´ÃÖ“•Õ°غ Ÿáûh)‘ú^ †IËõuPrÏH35tÁXr8n¡»%'z‹†•Ä}p.ãÓ1|Ƹû¡eŒÇ—” |f¸´:^ôÒØb«‡¶«K«é°õ"D¬HÀpØIpø;ØþŒ²ìº¨ýéîÖ=ðÈL·ª„QüRÁl§ÖÛ<#’ûšSQª‹#ð9ɳ4,•âMrDÖ»˜*9&ë…áª$Wóò{} ü^uÐWrœ×‡]èMç¶Ö sZ2þæø`ß¾[<'À|{&Á‰ ÉîL vYÑVå‰{5±Ð33ì)U‡­&yÐÕ|d4Ãðýᙺ[ub‹•6o•z=‡•d«?^Ô-&ê[nîÈçV6DËÁŽÒ%>›ð·š–žgpeiÕÃ&º0”À–Ül0—,k Q·î0ÿ Eï°Ô#Q£±é.ò¼"5&GI ¤~Õ\ý™ˆzѰüÐq.s¢™>)z©@}R6C>½<8>eå|D#À¾‰³P}«Ö`E…Í—úû²‘3sGÃyõSaDèÃâB‡¯ží•÷YyN˜á!v4«‘onßônÄ€âo^¬ù™Á°îÁÃ^,¥}ßÄrÔ.È`È9.°ÚaÁµ’hTš½ÃD Ü­GΘYzQîŸqÃݰ¯éóÑ(D»UÀg¬gÖªãj‘ŒÅ_¿ßŒúE¨·Q”AÁM22Ã΂ùÞNJÎhM7´LªÈWá/z^&T·rgMYœ÷Êhß…ËÙ6ÔŸîÆ ™Êwp%F‡$(y«=6—\Y¯ƒaã1÷ĆóΨ"Q«ÁwNN²“™à¡©Ší[ -ÐæFX(v÷ ¯ÊÍ5Q´-SèXj8áEp—åD× XA4Ë7Æ Æ6hSÊV6xS'WS¼åpmu,@,°¬"¦‹šhQS§<8aÍ5¿6àbuyk .Òƒáðag$XA»UMÚ°ä‘ùæ,xcEÄ3¥·šîBTišµÀA‹’'~ÍzM•zÐjù4~§æJPK¨Ê¯èUÿÂ ß î4¬Þdó?pØ"Þ±¦ÒF”¿?=’Ùí"À‚ ! ^Ôüíªf¢àšvýšä¦¸I”qSº,P”ŠúÓ ³dv$;ÏÝ5xÐh~9p´L`6dŸzÙAÍÝÝÚ.´–éB¯$¸ÐŒ¦œd9k`¸°;œÎ®Œ®ÔÉ`Hc*pdµÃûFIÚ(¿ñó͈¤BFob¶Ob¶Ç“ãa'1Û£$\c/8lnTݽ/gÌg3`mq&àpÌÈhî/‚õH w&\ ›[ \¨€KàRêUK‹~*Í„2åª5Ùá¯Èˆ6é"3‰BtbÂwL8LQIõÁ·ô؉§ðWÁ™;Itb©Oæ«3àùäÀ‘£Âö˜%CWäŒPРQ¨ ö˜xÜnOŒÁA´ÆvÉkC]å³Ú7g,‡n‰ö Þ‹f·¹—ýDškmF>n%ÖÃùº´ =#€‰¨SuM0p7g¢›Jº@Å™—‚c†SOKÄ”!þAÊ•&pTí±a/ äb1¸QG“ÁˆNuG-jâl,7Z‡¢{ÜOæŽÂÌ„dÅÞà­c0Ý%Ò%mî%j:è™[33aŠB¡bXKžŒÅ`œ¢„(üdìGh Ú2çàÀƒÔäÐøî.²Ûá³v—Äj·l8&0톢 2mˆgð¡§r‹œ‰.´“àl‹#ž.•>psË{A¿yE€n’,øPßÅÞßã:C3¢@»äJf7ÎÞe ¢g«Üb£‚Î5K†I*!g–3l²ÛÊ,0Ðl>ªþ‚Õ¿'£ôs`EáÞ>= æÃðÊ {cðù0NÃ`hÑ ýjÉ()G`lKÓlt{:479”ïÍnh¹Ô¢ÇQ¿ÃFo…ïKF½5ÏíK†ž²È•øSÉÎDVó¹Í5鸷ò‘µ/4íË$0evJû$Ñ|­Kq S¢B/–Y~ =ˆ„æëUZfθ«ý¨“àd>=ƒ3’3‹uÑp±LÛ‹^:ÏG=Sd¦d›~%»8 ²'Ñ[éϸéNÛÑ-žëºú$$Wùæà­¾Pî°`¨£êˆ5¢0G•Àûл>$óa÷Ìt81ì,¸3Ä1AgqÖüŒEZö²­³8 OD”HkÑ|±²`þÑ+#9 Žç<\h%‰ÃGž%# ƒ;cv:ª«‡„mó bÝ9—|… †™A "½ëŒ²YO„ ßí‰ ±>`T¬b0tôÿ€äïa>¿Á…žª/.•ýì<·’¶Àð•ÒÔžçVq¿5Kæß,ëuE1˜¯³^ñˆÆEàÁZ2llr>Ä ¬ 4t)6EF )ÕÔ> å~ÛšÎöÌ|³zF"ÞiÃ_KîÔÛ”OO÷¶ªÞPoƒO)¸²æ‹Š¼zÚ$QÎ/º£G0[ç®[1ÀŒ‡ÝW†’‹ó¯°èòÀġ߯F9¿?¬~ìÜòpT€`pgYGuÖ‹Q{œ[[ŽR• †œÒY°2¿ ævm9|(t]²ð)j0*f:*Lç›D÷$t"ºÍ;°¯‚![Ù¹}ک䯂Íšè¢Ë÷dzØ•[d%¯Ì„­Ì„eÁƒ&\¤Á|Ø; ¦vÅI‚ù“dT’sD!ãa›¼`±ûy\%p¤Áa—„e0JfÂJbo§ÁX{Ùúð)ê ƒ¯ÉQqݹLе4š²`LàUœ6=1Ññ¾AÌpBŸÃo>`è*b‚±`M ¢rƒc©8¾8aÊ„G…['rO7d\˜§DΗŕ…Ã&ïìP›Öbl¶gÍ ; ŽÖl§(~S`è8-óÍ*G§;¬ç$Üi2û”£CnjÄHwTN>XßÛW|ž·²ž çt*φ˦xv Ém01•m!®Û;c“ÓùÑÐGF ŒNUnAo³iàR¯'1áëÉH.Î>b3¶Kfêd¹‰,t$.Ct9¹¼k‡ÃWåÍ¢–;‘ôô6¨êV`n:/u*† r9°_ð›M#··âut¶Í 7‰{öÂM’°Ž•õ/=Ò·':—/渉ª¡ÒÅÚbȄϳ-ú+X©± &å8žúѢׄ!¤]“¢ƒÇ„[á>øXÙ2Üaæ©Át›ˆJf$¦ÁšÏ»cž_K^4|+bóÌŒÝr ·§2˜ u°Ý.Õ̬³Þ•Ð j*ªÅ²Ãæ`5™€ÖÁ^™#©HÌ.9Ew4L/95‰æ¹iÑßC« $]XЂ==5î‘D‡O< ޲Bøž>RGÐGvì#cçú¬ÌG‹Ùˆ¸>öA¤¸àé6:%ú{àÜGgÐUˆØ¡[Þ±3Q:Ò0yàœ˜ð”äžšïž=r`¹Cá”)£„Ô?¢ù”¥¾zþ5ÁKüÆÄktJôaAÀ„(è~ô»MHåC w棿>jOåIKþ8£ä‡ýë»öLtž™ ›”–é‚ù„)¥ž2xe¾YUüÄ[o0d¾’Ô)ó‚Yråw¬Õý€ø|hn¥ÁAÍÀU8âù0øÝÛPé›i° «E%Ãl©ª*õ¸äà«aÖA­´©H€uÅ’ ®Ô÷P›<Š$üh„s–Á‡Ø\ÉŒ°|+Çú1x M¨Dêü.ø hRzØS)ËpN¥ÅÓ]2Õ{†®ô}Ïbt¯ðL/õÝå‡$ioì4±Ud;VŽ üæ=ÏJü¢ß}BRã?肪ËýÍô Á“m²VR_EÝ¾à‚ØÊ>ã(=>Ð5‰Ž-^E5 χÈ»yšè2 ¤9¬õùj‡67ðâIƒ;¢YÛzš%ÀzˆÃ·´wè7'Á©aÇÁ€ºD± ªKRÃVñá„6øúNKæÛÓ`8a Š“<Ã+r‡Ñ‰µÚ´ÖóÞ™]ò=É'£‡NfØ' ( Ç¥©äÚ¯ýILXhuÑo”aþàNsQ‘¢ æÃV5+)n°ù à°]7IÍì016Ò½íîÊÐîí-t/|šuÒbÉ_·ªö˜Ã¦7Z(sÁ|Ÿ´„“ª÷̰UBFjß~Bò_\ñ¥ÑSG#;nÖ 3Àf$…»dd†ÏÔt+FJÒê/xSŸžiÇøG‡;ºQÃa«Fíºž)Ô0É‚3ÃŽl9j)Uš”÷l…„ßµ"ýå/xQ·Xw„•}óx236\ãscÆ“xd.°ƒe0ÌN%3lEwaÂ…ÉÃàz.@÷ÔPe&Ì–r7/øÍ¯ÝÝãO [j{·ÌJ‹º¡†R¨ŸôVrv)¬Å¼Ñ‘ù—z(²KÖ©„ °›ÁkzÈ@€9ðÊK=Ô×3tqÀÇÝ‹ †´‡2w©þ› }]þ06ì©Ä]˜ä7Kb¶gÍ Û™·„îòDmÜ=#ºË°¡›¬g–W)þ…Á35Ý‘œ3Q9«Ñ©§ÀgQ®ÈàÛp®ÔÉï$Ì› ªÀ{ÃlZ0OpÚtl?—M éõ$¾9 >ôƲd˜ÀµÊ ˜þæò]0<«&ÒÒ—â"0œ³Ü¡‚[Fr ¬Ì]èû]*c…n¦¼k¬ñÍaḭ̈ñ}“ö¤lØÞ¦¤†¢³èƒS˃lSý¹ÍoÏVzJîàJ ­,Z˜—žkƒºö‹´fk쥎Rð–µhx6öN‰ÞÊ]`¦E€7=W[ ¸ÐO”•œ™±#rR˜§èò .iôÉ$ö9TÙÔzªŠ>ØuK)Ñï'|ZÏó *EèC³Ú]qjÐ1¯ ¬³ t«ˆKü¢³6ÞïÆ¦Â™©‘ÏÔÈgF±œÔrÑ05þìÔwÛÀ¢Ç[eÀ0iúœÔ¤yÞ 7ì.QÝ/‰Z8®Òâ*ÐEÁ!Ò¯d«cqd$Åbð`e'èÎ-"‰‚ÅàÆêïʇæ ζZQ ´ƒ ˳,QfYpƒŠ2”~süNŠ®çÁ¹a–O[§ Û©:ÿhàxëA°ž\äâCöC2ò+™µ˜¾àA·giØm0¬ø+â°áà‘+W¥Pœ’ëÌ.ºÂC3YðÁrƒ¿#¹>I0¬£ý€‘7V`œeô3é…SåI@oËì&Ѧ7a§²*F‚¸Ž žTÖšúèöUtäÓÂ9sî»±ªj—éjõÔG«φ¢Gfܺ²ø°ßÃbCÉÐ(ªbCAÓ#ßC¹Ô(ðmVe‚Â|€+5ëʬsjØ;®,¸·Û“vÃíp¬þ™ˆŠÖànÉyÉRŸÐ(j*m‚* h×DÉucÁñr‹½Q6À–[2$#ø€ák!À¬m\€OfØîÏf»‹^1!–[r ‡ÝÝFƒñyî¶^QÝ^qýñ *ðV/Ch—CAý¢RÜIÍnדŽ`«s'nvºSl9£¾þìÆ }<á…jﮬiTVU\P;XHÅ¢7µø †&hWöÝ'#3ì,r”~uتj…×tWÂ5=”ªäEûŸaÃ0jŸY_Ú?ãæ¢sÍÁë/ žŒhÙàÆ2eD»ë 7ÉÎ|³h­Qª¢Á•e›d‡­¢kT6bpJòÀ6¨Ê½áË.-¹³¤½ò)?f6Z´yïóÙV±4 {-Y%ð`,Q Áã¥l3XJ’CÝ. >¬ä./¹ôAÓbVËL·;½Á]"0"åËJV‚2¼2 NIN€±¼%¸Lå†=“`üMK†\ßYýê°ð«Ã.4f•“¼þ²à‰¯É¿î7§Àü®Ê/ e¬•9©aï@°²Ø“”ÁÉѼ š"ãCµøE•¾ö“øæý$¾ù}FþUÁ…æç$×8Zê!2“¼èÄk sh«L–Ý~•±w‚%ovelÓñ3Ëu Xõ—0{ÏŒdE¿a¾ëVùÌ_ßÒ½0¤z” óÀ ;Eí¤¡ä’“/Q¶·»2Mrú·û Žô4¦ Ž Ð­\‰LWÊUV‚ÓbÕ2;ƒÍ J–å ÍÞ#¯>ô¦•(o;"sBŒáÅ<«¶ª"¤Ø,”Q#ºw ó¶Àq ‰ú¬‘^Ý‘Y#‡2. ,8e.=‚¢FA ”–„^£Î >E¡ÿ O¯Ñe²2ô‹~˜ò'FþÌøÃw¾;1ò×ö®‹½Œn(øÑ1]teÆÑýîÉše¤e+AÅv«82à˜q”Z¨”¯ò@Rqv8¼][XX6¹Úª¢çi ú Ëj”ÃsÉ*íÆD÷$:ñÙ]ôWpŸåDû€ ¦4£_•4ØÕ…å¹/–†pÑÁQé ¥Â`˜¸üŸ½¤TydVôÖV¡za§æì'Ð([Pè )ù’àöÄ=ÐŽsâ|úHFŽK^X²JaQ5«Á‹UfŠ"ÿ#’Œe |ðó§É¥‹hÌå9ŠÄcøÍê(Ïd4~ÇF¡ÖSÉG® 8aG­ò8ú[W– [?µÙ‘ì ³ 6ÕªJëÍ¢>›ÕFÖ[rŒÜ^ÕÕ΋¥éÔÛéî’Ûßê’î>O(!KÀs–ÏÌ&s#^”ÜiÑøÉr{éÂÅR6*³ø1D”Qï/ÔÝýdŽå½2TÞõELômî ÏÆ aIþç³Q Z~Îà’9—QyèÃvˆg1V5+…•ñõv:¥Ûäzn h9áQyQU‘ä¦öoÔ96 V¾â~¬ª6ÄoÚé3 M2¡ ÖÜKf¸OeÈW¦M †5ƒQ"G½}$¡U5u°èJ÷Ì6±/*ïißb™:‚Î|_½B…¦Íòs…­ôjߥkd>Ú®ATUob,Ê8óÕru¦‹Ôlâå:8Ôþûý۲«ŠÐMݦÙñp§ž÷8l28Ý)°žxð•¶Å‹ñæ‡z/ÜÔVàÄRÌlgÀï+üÖP‘ÙÞÐIMªž‡†WŽˆ©¡5xjb›8§ƒEgÈ6™ZT–Œ'´C˜|`ó»c‡è™™ ßj…=ßÑÛÍ.C·Ž¸#(£VS× ÎR¼šÿÀ}Ò”\–ÇþF1ަæ=pŸ4e¦MæÞ3²Ìgl§flãŒ:»;=n¾ÒGÉ]ˆ¢´…'õÀÂܦŽ2xÜ9pK¬tɬ2¾&y†Ãeq œ’lcô_~؉ë®E²%­.%xÊjIhÁZª(uhyS3…Ér– Ñ뵪5:BRXtä"°C™xŸ8=9ô$œbäuoãKÝVæ`öšEG‚+ÓG½GEgsæÄÀEa‰C漯Ä6ë “r7EÃøŒ Ññ ú¡véFáÍùúð«ý.Fl¥Ml¥x©MûÉÁÑrÅ\[ÄÃ1`|¨r4ñXVºZÓMz»±!hú%?—È’<³ÍæJ‰^W± ðVÀ—)…™yk™ùÚ 9°»#2}“íõ$†½žk, pùU_K•©3ÆÍvÉrÏ€l¢Dk¬Üª]n1:ßÊ…€jpͤä$^ó+ó´]2‚Q>B»”hðP®•ùæ•™ímÓŽ;£Æ ¦½Ådú8­tð¦,jα»$v÷ÎøØ‚s塺ےQQ‚%oÖ7©eØ^DíûJn™a‹•·Ëö‚"Ôç† { ~$£L`Kæ{{d¾y$”ØVÎ TbŽÃ¨Î‘7…ÆÛ¥ŠAŒ?–!‰ÀåF\)æ}´Ë3C¿Y-ÁP1„Jç"‹émƒQõ]»l/пu–²±ÓÖEWª¹–Ðs¥Â”•*pŒ©±ù(ƒF©æ]qØ,Eà°°äR:;Z]aõ÷«3š,×û +Î[*s×ô¶†B!.“ù•N=A`'P=ÚlÅÓý‚Ï`9OF&î§Ø¡ð›Ui*@ºâ¥‹¿=â_Ô¢¸<½g{D[7tZ œ8³-×1ÓÀÅ}!à‘>JF÷üG4ŠéX4Ÿïw²JïôÞ tÐò°Ï®vÍ!J yC6¢®Ðzg±»£ªt‘n ¼+ãêfsÀ[¼žÌrµçF@pÔ% §ÍG4œ³Ö2$Ð4½_hÚ­°;)æ]!ël§|¤Á¡´q¡çFà­7\®‘|ôpw@; ÑÑ‹þ=šˆ Uh×þ pÍ,u—UR×ñ@é]9‡ê£(š¨1Û# õhbêñ¼|§•‚HmXÜ#Ã>֊ݘcÜ”w6•4›í f =”lƒ d»ÚŸÂžì]))pe…70r‚tOVs)07« †ÚµÌpÂü͈%¸«ñ*tv|è1Û­]Gàž;[…)À©¦Fð9ï¾–(¨nɾ©Ý”n’ÅÈн7WF²tò}w¥ŒljM¹ß!|/,?U8xÐM²!fšd•›Q…ÀnÓÈôö»="•–éí¥€ç„³ÝCo£\Aƒ ;v¥çj“,Ÿ\2LH52 vå¹lj¸º1UÔµ³Š\uwܰ²UúþÓ3i0;[,þ¨«zw“žN©$¯…Qq>YðPŒ8ô¤ú9ÔžÚ~ÿ£€kWT’«üD¨‚ËuLíƒçv `Ûô=ÑbÃgëè³Ô»ÊüëÆß-bH”<'pÛBpËœÕùó·/ZV§§dÔ.ŸòœCwÑ™‰MˆN|öÔ&G|Ä]ÙåP‡ÑI)ceDÀï'e,7z”MG.+:(¯Ð¬x´D½) .OFyã‡äÐÁ÷Á]Ûù‚…[ ƒ33îÒM ºh.{&ѧ3רEׇ9bîÀa2Iú³Wf¯¬”h…¶Ðcw8c‰‹>—(€Í-§Ìô(ž7"書CJJ—&ÑòŠ ¤¥áþ9 å%ž9EÆðÒ.‹[äÉG;bŠͯ¾˜3iDñç«éNq“kv6«JiPßù0åU°Õ ŒæJ%‰N)´4úÀ–æã-^/¿@G=SIU±*x6kÊN©‰gãK mÞ`*:ñÙ9ôN©7KBjG¸þ#on«ŽÜëF?0µïÊÞÌÇpчQ¥g-e£EŽ?$-u@µpÎSª%‰Îˆ-eg}Ðpà;c_ ½XÔpn!ß,)tO9ÃzÂGotJvÿ0͉|«õ”™—G¿UU u`*“E/úa…ƒBµçAண”å±ÎÌ”+&ZŒ œøjw @Y ý0æ õ”Ìέœ~Tl)tbÎŽ:è1[)Z8ÕÆèĆ:!ñ9s¢3™-Ö3ËèÖXŸ¼Ð8†(¦ N®¡fÛ,:XÔkôÓéF‹ `>gN2‡öát=1Ê2¦QêThØ0Fè3è.-5i)u8wjÒRÞ*΄`ß}Ñ(YhD2@FöÔ=yê9“C–ߟEo‘±¡ŒKK{wµEOêÓŠv7”ÜaˆÒ²ò¨êeCê&3ãî™q;c“ M9,™nˆ÷¤Óo~ÁQu϶·Ó£  Ò£+ø‘¢Nn8ìv_úÜ‘†JÞßuF9þ‹¼ª(ÆûÓh¨M„†ùdÉU0a~8=é¡ù*Ç}`á}-ôÚƒ } /гbÊ‘9mô{áN²`óöAÕ©¾3ƒé`ƒ'‹’ ï.˜jys˜__`s"!pK-Ve ·ˆSÐKu*ÉæéÌO+t,5üè%•‚Ê+¦ò{¸èÍuáTó˜g°\è ²‘.œAh$i¶U„Æß]äPAiƒÓÙE\tæ€e,¢÷ù49¼ø¦[±`µPNB WX@½­XðZçÀ5³Qj¿í!˜ï²Ú3­w ²pæmÄB%¯Ìt7±a Ì;3¢½O …ÓZfàv}¡FVtf—5=|P»Ÿ©Pôf•”Óo°L££Þ‹áM¯D|(p“Õ>©Óq®Ç‚ãË®¼þ¤ÁÈó#’)¸(™í’^2’klŽJ8l9P ¦Á‹êÀˆ]?ï’Ž»kœ˜î‘8“>sÉûçí¡…ÊÉ?ÃFœáyÉ”€ä†¶E^m<ì™™°™9Ð3s0L%ǧ~¹è}ÃÇ\2òùÀˆ†Z§1±VI ®ø¶’äu¯¾e±$'l(¶ƒ’gXp\÷œ\é>ÀûÄàÂìä–KLX½á 曤e|=CLPLêh:ß-3ßnŧ,c}üª@T(9#ø—,0|Õq™! 8ñ šŸ”—iÈõ@uÊ¢KJ›·«(·Ù³¿2ßáD…·NÆ–r[@ÉÛ%÷~ÀôP \œ•¿S­5 æŸOf‹Í’Ø%ÓX0HúœgOh¢™¹igæ² pgc¦ùߪƒIÜ3å°ž)åmRøÆ2FÕg*Ø9U×#wnL7ÊÁ ^T!¬Ç ¸8šÏ·2‘SèûV*ò·Ô— *3s·rpd¢¡wñV‹ ŒÙU«cÿj³¥°8ÌÓ1é,bWŸ¢~…´IꀕÙd© àR°²gÃJTÂX­™Ù'óv¾á`è=Yb*G…,yɹ kŒT~ª›õaiß7–‡,ðÁþãµÙ.‘“‹À;3ì×<Ì,]¼þÒ’wÔ‚PÉûhØPûžœä=ñ‘<™Kã`Êoõžå;l‹Â¾ï²’Ãòf¶ŸD‚ÌVúêa¢ú¢=ñ7×ÄöÜ&$†›¤…AUïVÒ¢0;×¢í8ßa#3Û3^™í¹r’_›êí½3Ã΂±e°3×ÍÞ¸ÝT“w>ìG:Ž ›L•bGæyp“KÞôr7õˆ˜&¢ŸÔ<ŠKO¶¹Œ÷§;Û£2â)üHf»ûÔĉ>™«.À|ÕDÒÅ©¸ýÞTe*ö:¸2•ζ²»¡?ð¸M/b-¶hœ3Ö¨Çâˆ÷‘[î%Ô~Ê`¬ºÕ$á¡3‹¦šÈ5ÈðhhºaVбÐ0®¬"âJ3Ž#éGÏ„Ñ}R¾À³Ô×n29x=7¬Î X ¢E%ºz¼'^-Q´Á|Æš’1˜>ñ°¡ö^®f ÁÆÇ2*Â&5û—Jáš–A/•úÀJÏu³û¡×D´bÄ«Ö LPêËRŽ} Œþœds²ý¹®D[JoÔ~ݺ*a´xË‘ _†[UÌÐs~Ü"‡}óMÉeÐÉ–ð²:Ú$00tÜêå }ÕGŒä(­k)KÖ+>+oD;·nŠR[™B›½¥Ž— –¼aŽ’‡ÝØ3x0—âVŠÿæ–C"‡ïoJ´•/Ç=.‘ËmB 0¶u®Ð´5ÂV® _èuã ¼5Ýð›F]”öÍwAfóVCg9µÃ|u ¾e–íŠ _Ô tÃ2¸­0T z/¸e$;U†©’ªMB‡-o zC+ñÍu‹ÿòà) æKµqÝàŸa³on ÜYh«Ec ;Ò­_c¿Âaû]ÆÌ¡fO7»c-nÏ×~‹ªk8ÛI°}‰Œ²s Þ¬‹[ö›e ToƒaÚ²Àï°Q qßfô›·Š²àRḭ́Uû ¯Ç„’3à`âJ9>3F×*óѽ\çWõï’eˆÁ ë 'ô ]¶ßã·{ïÉ£"Ë­¬ƒB“}Ü,ž™ýþÆû†ÝV]nWèsp3ø‚¢íWÝP•æo%,læÛJXÀï›Á›å%ŸÅÜë As h"p öcKu“4˜ä©Â(´™•\n9.ãÙž"¼€ž¼Ù2Öo\g替Î ƒáMtÃ|“à hf…õ$&l¹Üší°¥n2ðH®rcº,ã¾cÍ? —jõ„§Ä›tØ+3ìÌöÜOây³õÄûÅÎwdøòÙÞ‘¿â¦%è“è„°/ªDW4—b_}\AËv·yŽ "Rè½°Ò–›/uDÏaÛÊ}‰`ètGS€NcG~`ÍÙ•½ÉÒ4 …k‰þL=ûW©°û„Ñ¥²B=¡7lqzEÃd³‹æ“®µ‡õ¯¼høD;â¢y ͨÑïw#ð‹Îü°õþ‡–~b©ufž]t‰<ˆŽ´5¢Žrsø&¯©å%#ŠåÆzÓ~$£€Ò¹ÙLèÍ”ýæ¦+ÓF'«åžûê‡ECpÏŒûË`då|Øÿ?øÿ 8s2”ÞˆJŠþº36ràÌt‹@*¢‘ÑbÉÞñfì|ÑŽØÝ(ûì¶I˜ûѨFæö ÏÔ>™9ÑßËU++º4æ:"ÅpÜ+N|ôÂ.Fƒ'ó –7¢&Q×¹ŽöpƶÂ,ÐBØšn>ìÊÊ2=ì+A eäŸ((ŠýÉÁ0ßàÉ‚ŸÎ‚—b=‹ c·t)°‹´Ù7QÃíYĹƒ’¢Žù'Ë~;b4\¬øLàèPÀ´X€æÈ=¢$œxº×íPˆÀ;¡ö †ð‚á.Q¢õ΂OfØ'¡>‹˜™èÁp×%¦>_pzÂà&ɀ냉™Žùa½‰EÃØ¥Á Î`¼VUtØ% F­$·6î’¢p-±¤è³ÿ®Á|¡ë×À“¯ÿuÁ#µÅ²è÷—žÊ¡løÑ´ßÞ‰€]|5´Ù«¸ƒÀQ¥ÛÚ B?¡#nWËéTéu ›Vâq7jsFa›±Voú+Ñ~´ÆRè ®ŒkÍà‡ñ¸Q¢VƧjð ï&% FÍ&tz4“2S°Í8êá„©T:šø·àµ‘ûf?gá°Åˆ˜\ Î ;%Y !èBU÷• ]Í/-8ðö/Êð´äJ=k.Ä…ÙLmã#ƒaCÞü„åÀ9ì³IPâôQ)-l#,0eÙXéâp¡Í¢…¨í<ð͘Å9ØcÝŸ„³§+Ë®twI›î®·4ôEvy¬¡U`HG-päB°Ú Àwe7I”<3ëx‚4¢£ƒÛ%KŽWèµ5^“Ë­±aˆÆõ@îÕÁW/Œ+,%Õ@K,Àø’]r¼Â§è™Ù–憆ŚN$‚36Ù+šj“é0œ³ õÏí}ÓÂ×Á='O$N)ÈÉÇv¢ûèݤN ñ›FÇÍçLú±µH‹‰4P¶Á·¬"è)ß~ÁÃa«D&H¿à¸ïà°F¤¦0°ýEð¬oÍG2,ñ>îçwn Šq ø¾:ra»ò(£^ñ§êÖ€Á”ÓRèDÏx¡ƒt’YÏg˜7NšÊ·èrM×-`ôÆ5&ÁXÑëÕÏ“k-hpÄ%À¹ p –P\0vO‚;â<Ïm“A‚<'J€gFr ¬ž°ø\Út ÆÃ.O\)qä7IƒåÇ$” ç$W¾à‚žHwجÉÐóMÒÂ#&Qz¶û%º£`.Ù ¨¤á£Ñ Ñ›ºz ~IìÿJÞ(à£w»Ý_p©,ß×èpê±{²ŽŽPJI|tUó.¨|«IhÙÑpÓ¹’ñlWù_‰ÃÄ$†\‹Õ–Y*E H+*ƒ)/ßuÉ€Éãê<·ÙyÁ¹ìÄÇEoäª¹àŽÆ¤m° ~ŸðÄyà˜îaý Þyé ŽÝMjðíLL ~ ªŠ¶ íóãø¡‰>X)dH¿̤‡uÁ6J3q#ñ‚^4_ë¦@)ÉS¾`–ðûàÌG—Ämå€J®ÔŒÚ˜Wù“À´Ñ‘ËâCUµ1ƒžé&><34øLT|`°H~àt÷ÔUn©‚281eªN„†Á\rDµ!x¥¦ûEWF5yÑÏFùÆÞrôo¨”Ÿ-è¦ä[Ö¾`Æ|žO1xãá°ö•¼ñÉÊ€#Ó«¶? ×q'9Fì_ëObv%bÁs`l}w“À SËtxÓvœ÷ë@z¸B9xÑ˲·Ì›¡»s9óqw3Ë1MÔÕ …w ì"V^‰ÈHü6úÒé;ánZ‘…²™ì‹~Lº×ôà¾àRYƒ{£#‡–íÏ7ë“|Á¬6<À¢3!iTç¹=òèt«õ$¼®†^tÂíÜ{%³Ž™& r÷'=¢,ZSÝ:9fw¬€8\«¢;&.…¤óqe2£{;°èR'ÍtY(Q:Ðó²'@°ì8ð%Ÿ3=\KñJ˜øûn’Ò JҾ肟âQœù`-¼šŠÈàF]-¡–cQðÙèö – £kbpÁX1¼øÄéŒËM3?–IÏa®ŒÐ Oøð.Åè÷>;–:¼ÂäÎϸáÙœ?€&EB?%›£S®Vפfð‚qxe­ÔGgÑÙ)›ð HJŽ,M¸E“’cº©ßB×â’מƒS¶3û{§ʶywYZ®‡š—‚,0°´ô¼¦&ŽÛÀ;”¨édjá蛡îÙþÖ7¨Šø†d]ìXngQ°µÚJ•„x+å°qp§B»$¼V»&R^pdUÁ\2¡ MfØ.Ÿ†aê­·¨û¿ ŽÜk8ݺ-ákå(ï…pø^0ß%-µÐ=f FŒO§´²™µš”Ûð¨áQBÉ+£_0kÆ`E ÆEÌŠ=бÃëꨨ æªÿŽ6(9҂ѨšâJѦ¤!‹.‹yÞ•0“xÏ¢#ïê|Dø‡Œ>%.¦>2¢GRt=3Û4 Ž×)ª©š¾Ô³’©üJF±ödÄcðaÕ¹åvRG¦‘¼°‘2%oѼB°ü{Èsó£0‡Áå• |öP*"m:¬®AàØÛl‡õ @!ÕkŠ)ÁâÛÙƒBXW&ð†nÆÞ‡%ˆ®¢Ö^¦ÉBnwƒ7ó"±>a…PÆ¥N€á„‰z U'\Ya¹]Üé™6*O(â^ª¨ïÒ?¬HUà(,C ZYt}xüÐèœìR˜o°Üáð¾¬ÊÛ¤’KÜ—ÐF0ÛÜ)µbh¹ŸQ†TmÔfåa7ÄÇ~йq j&dtb­²¢3hùû¡; *V upœøhÑÛ4ú¨nr‹>®©¯Î̤hQ¦ <¹*k-3ßãk`½åQ˜À¥6jÞ´‰éqUY‘X+÷TÇ’#o‚wf­xàÒàIßµ-¥ÝÄå#ŒgìÒQ°ë š×̰ÍãÉΤ%#*¡¢Þ£)p£>{K¦ÖiãÒ Þxo» šY]Œêˆ¡Üf­ÐqÒ3Ž[¦Ò¥²û7F‰6EÔ|ØË…ZLùv=äáÉOb— ÑA§âx2wFh@п.¸Þ0c_ÑHÝ£eD·ÌMJ>Ø×c0ô„ÜøÔà”äxÈ?ÇÁ|©†Ê.Q=ƒEøwVkhÔŒ¥žp‹ÙÕÃ%w| wf­vf‹ø…ÏÑqh{Ü+95l>azÖÁøYHæë|®}AÀóILØÔ“ZóIÉ÷Քm€Ø¹ŠZ|ê>5³TUŒÙ©Jïí)ôúŒöJ¤äW5Ê‹úÀj÷bFÈÐ-ô»MPùtùQ@ÓÔ“&ÈLÜ=ôˆ(%±Ôã`ÊõJu ûYÀS)ËÕ‚ üª1h–Ì“™0=„¡553í©[f¼-“I²ƒ±Jâ›s’kb©^ð™4OÏÄðH.gÁÂ…¶hG_zÖ¡bƒ;ë·òC ¸ô|n9\à{6~žCž%ƒ;Þc'#9óð zG®rh×X2zVª–ÿfƒ ¿Ù`¸Ã.²{W³nÆ,0eºþHFDI5*ê_0ýæšš±šY¬¬èï¡›ÚÀ¡DP¡,3Ws„¸åQŠu½¼ÈQo,ºñªë`aw^£ã«áÀݵ1O/< ŽÊ7á­·š‘¯]ѱNW•³òÅ> Ž C£Ûƒû¨¸žjñcë®¶CÛl±£°´Â¤¤ªM>iîÐ\# LÈg t¤WBÑòAC]ZL:üB[™óq#çÁõ³ª¾3.Û…eá<°‰¬ïÙBáCõI<ìC½KOa®²µsÔ"Þý]YÄàÁ b >¬öSt¶aA/zƒså |`ѪBÅJ÷vUŠ‘½á7§†½Õ#®3'[2¸²îhÃ*.ƒ«…UgÝÐúp¶yÆ^Í…ªÓ»ÃP¢ŒÀaÃBÉ H!Ò£›;Mîgh•´‚+Bޤ&.§¶WW£rÙŠ…!ª£z J¡eÑ&Ê«q3íΖì¦L‹N}õ{:Pé†Á•ÕxƵjšÌWxa5ΧhÉ/t lðÀ xcJÃõïø¶q²a½%Ï(•ÖàEͱÃ|—êbëJ_á]\^¨ÁàJ=]¬›ÐáÒ3&U($úW?wÚYà*ÁV>Üc]ñ”%p¸ûQQi×»;}Q0,í·¸nКñeZ4|1¸@UÚÔˆ´Ê]G7 T'ò¸ ZoO†Àƒ÷ò:îi8n'ЦÊ{Ñ€TŸÚàðyèÊ|úÕó&Í|ŽÀSý³©þ ú˜¦,þ¸Ð¼Ê÷K¶/šKUUÑ÷_5ú÷°›CÜ(‡úåfç T×”Xì$XÍBàb‹èúk$šï” xÆI´~*5­¦üz®õ”ä§êà àCºwÁιiÿ/ŒFMÙïôG& M7W„ûd)ø‡ÊѪ˜]}´Ìƒ©À¥pà½'›±œ\Ñ8ËÑd8\j…Õa–Í<‰Hí],6ÝKÝ€a ÄÊdüY2´—ãùpØê)CQK‰Š…m’¥Î\0b¹êíš Áq]Ò]ritáb©vFÕ—˜3`^ÒÊxßS®ƒÕüK|´Ð„^ ´ÂÒ¤Å[ L¹ †tÉU¬G\òJøëÓ’;õ`,5 wØp‡ œXªÁh]üÍ›úC×ÿÌ][òćN€'­[â÷Cd'ê—]+µKr²÷ƒÛj}|`sð*b-.YÔAð¢4¥ô{ØðIºåÏ„es[–|z ºeÉAwýÁU`x$kNrdGÂ¥2‰êjX/sŒ©_0œ1@@?Ñ–7>ÿ·{@|gØQÃßà[Žkå½`¸A»Þ8t›ôÌ”‰(šrÔ&Ê;¼-ôÖ ûuËu<àZÌG«_3Õc7[ò°a ƒùÑÐl#F®z©©êž¸…„Á–¶ ]5{ÉU%gȶžWðI¹õ…Ž1ƒa¡Ë»=B2œíƒûÝWÑubz¨8“¹v:&18Hò˜Þ>™2ØcN(Ù%p—š¨hKÁsu”3'ŽÔ4ƒKqà)STú¶Ž›ûu ÞeQ?†Á»²æ“YÉJ5AZL`ÿ"°½äP²®w”ø ðk»"µßD4÷0Ÿ…ÀA‹MT Á‹%\|$#Ÿ…Lа>á„ELøaé¤}˜ÉàÅhš[äÅ(=†hßö¡¨#7¥Á•%æ4ș÷…vЀË6$º¯>gHàÈ1A™]YE¾Á°ÇI ™|¥‹üˆµR`®MŠÝjpØJPD¾WÅÞ§»âª¢+ú0z¥v™QrºøH¢aó£!ÉèÞÂiñpØz„#;ÐàÎÞWyɪBà¢ahAàØb\2ÌvþÌÊóhñMln9P•umã¤fw9¸ ÞàÎòÍÔð£ e ¶Éøf¦ ^0f?:;nþ×u¡¦ïìÎI¢ÛWцTêvv.k8Ú5êeÙH ùœ¹¿54Mò‰øÃTàø."I¡uBòÆÝ‡ްʦ]¶LT–$p¬¼;,ú>|˜+´‰.³Ò·Ž‰:ᓸÉý‹˜ >Ì»ö‘Œs>`¸Kš¯<øÍ—dÁ5óÍU .ì¢6‘ž\èÁh&"€&^hhT5‘+Aw¤¨2±%Ù/QãÌÈîfÚ·ÍŒ:Hž@Q­E¿f¸Z.¸F ÍWëð2\¡Ìûm!àËÕÝ´J®iɹa3}Dq\r œÒ'½gvhÏœjƒé|¯„ Îwj¾­à3k<‰).°aNˆ/‚nüSÉv†²Ý=zÂ=3ì‘ëh bR~mmží`¬è“†ï¢,>4À¥Ú vnAgUÆaEËM¡Ö›(wlWÆ®gðdl«’•m•%ûµVQ¿ Ú±HàH8ÁàÄt«€ >Òn锬 ¿™WŸµOWf؈ž¤E=RBòÆ9õ-T/­nªíe™?†Å­'0Xº)€:–Œ ­›Ê6Ú æo _;æ^쥒hÃnUó£v§MY¡¬d,è<ó½å Mˆ$ÇñP“L)’…¦ø3eÀ+{•H6e9Nz¶\Y¥v»ŠJî·{2JÚ¸ôÃn£i7E5\é+æô[4¬1ïq¨" ©ÿ®ÔÐÁ,²îƃEðþˆ&êÈ¢+L4ï¡ùÆ¢ÀCLŽ]©wì6ä‚0{w§Þ –³Òoö²è †dò˜o:ì7õ.!™/´[0]ùo¥Š Åð›«òPA–x3h½ÑP@¿G‚Q¤/£W­Ð»3»Ê¢ŸÎL£©‘®HwÊ%0ÿ:T0[ìúdD×ç¾×¸¤D—ÌWwu°Gž›î”—Íf.š¶Ùѳü¢s² #ö0d¿‡Þ©ïÞ*t‚ËEÃÌ=g2²¿ˆvŸZhÝE×ÕÒ{§Ñ|Ÿ6Œ"·™Á•“ôÛÔ‘wöÛY’{g$gÁ^ÜàÊò1>ÃFÙ¹Ùo>™o>ò¸!^…hhv=|3À|Æœ‚¼Ñý¶c£’ÕV¶Ž(œmqþ#Ïj»(R Ø„ ½×D ”òØG¥ñAÛpþ ·‚yðP¾àR! ½XÜKƒUq"’P¿W8ází¡òÞ~;K <¾þª­‹ù$–úµ"ëû4‡O¦©*DÄÐÕé R·•Áô£SàÌÉŠ´†›u«%¥£8#š3atñ¸ sŠÎÌXrÜ9Ñôz½.šÊV- ß Ëš{D+ã^Ob±WÉÜZÁð ö ®ŒÊÍà%×ÔG«2Ŭ ^¬èTõÑšÎØHm²©ýÍΥɛ¡û߉;Ðþ^;3Ý;5cêâ>`z¦]! φj“QæN¿dÂpØ[M³`ÄyÅZ`|*Ð|¥=pÄ+Ñ5„ý’Û5¾›½¶Ò¡¡> Ñí¡Þ÷ÝY |œ~íì”-ºåX¤›´gΖYàbÍÌŒ¥LºHM{–T×ј²DpJm¨‹DݽÀ©aµHG%8–0ÚÃWô¦*õki$GV(|p^"Ãâ½ä¡5™Q¨+ó±±t{Ïd…0tÅž- H?Z'æFÆ&$Bî7ݹCEÒu`XG Þ»sÇ»’ln5…8]à]Yf®Á°ïö}Þdzh(/ ! Y”Ç%ƒCÖ”ÀA϶§™äPtDݺ#ß.U‹ ”[eðbéC„l°Ü_à¸c‰úHF©ÈC9xƒª¡,˜¶gŸÔA¸·ånAü2fˆ L)Õ†r¹ä$X¯ x ³ã†b †­^F|m”ÂÍ­WÝŸ'£õONrnØ‹¹n“’ë“Ó÷ÀQÉR'òãÎñæ®5#9 Î ;³V7;”ß± ˜Ÿèœä–ÃÚ¬œG8…=êjÏœ Þ¬e\ŠBú̜ͣqÙúPW]ƒñ°[F÷¶GÕ­ðÆÉ‰vŸB¶Ð­àp߸¤y“™bæ½KHæ`QøÀ¸ÀP’5l?.ã]çžÙa á ¼ƒÛ×ÀƒyȇRÚ£‡5ø°¢ÃTb‰¥1-Ь Û¥þ€dX;ý‘ M½—P0ã#z s¶q<Âà¤d” ­öZ†Cþ^”¿j0ÿæ$8èžñ°i"PrØ®™€^×®÷7ª\°düÍYÉ<(Ã>ú‡à(ì‡v…Ð¥9_4¶]s«UR/ 'y/·7÷Cß8g/ú°ø¦?ßwÉÏ®®î‡{¼J6t\7-¬5¿¢+ê´èN]Ýݲ¡|ÑtÎÔ`ººÞIô«UÒDuŠÀ ɰ0HàƒßÃ}äÀÜÙ’ ã™2fD ,â"¨g棵C™1CüÇ\òWÁo±-²>ώ߇¾ÑúN©±LäÍ`z6ŽÆ c•]¦?Js"º†åÒãÃ’ÍNåxt¦}²œÝ‰)û4LU¾èÆ·þÀÈwcŒM"ãå[\EÓ|ÎZÍç,²ÚqNÒÈ\¸Q6Íõ™Š®ùÀg˜ôlO±eô¡òNÄãfp¥÷uz8óͨÚÄ`¾É2–ÂX©=fº%ºÒ+ch w)ãèÄÍ·S“–F'NæI¼¢uÀ+,æ“Ø¦9p‰ u˜2=3I¼S¤Ùˆ]×’7ãL—Kîï,8ñÍn Šê,z±>g#j¸ãzP‚}âÁùí_w—þF5QB'ÆÝ£ •Ýܨ×ÊœP&J¹¦Gc‰Ê’ž ÅN¦EÓ*Ç!ö¾X~Y3spªd…ÎØI¸—èÉ¡Uµ¦—tVòî4T½ÜÔ“-•)/è°•b„h †MLwØJ‚Õb·Ù üfqB“è6›;,užn+6ìí€1 7 ý°òL¡C²;ú2^0ý¹Í§Ì:˜±¥‰`¨âІ·†Ð‡ÆÃ‚/£.VÒjtÁñým÷ |Ôny&Qg £œž–oH<ÌO2¨ ›wKŒûUfÐû]Í+Øö#bÙ!~’Êxš.µSO®Ð‹^ïžYë!7L"ÙŠUÃ7ÇvÏ[(Ù,òT¡¤DûÁ‹Õ_tÔ!Ãm¶tУ)O0jÇdщ£¹ãM ó=·Ì:ø@ÜçRžBp©…&pï“™²óà>•0Ìî:Îä胳íƒ&ŽýÍì›SS­G"4­ †~²ÓSã˜ÍW`ÜÿDèÄR}5´Fã«7uÒ…9­œ¡•àg9·Ê  %À‡^yAT©IxÄÐ cûç$*B,=ô¦ZBÉóöDŒ Éh?`ôè˜ê|øÚ’(m^èÝq¾ÊP(c´À¯I†4¨%óaw=ò(Ú-`‰i3£2B¡è)54:*Ûà„›Õ–ƒ7ž²•Ù'KN>.y3ËFe,”-ZàİUå…2ŘþA6lÓcQÉ#žqk ħ tL ünOäÊ—ÉâüV”P,4u7M¼t–åcp zo– U lbq®_‹ °³u®*©@ê~M»¼ÜXƒÁ‹QÌ`{ (¨dpav³À‰½=C jZƒ±ÖÒ†¯²&ÆcÄæmða1éùa¨‚›DÜX(¨P÷AJ¥o£^®…àPŸLqw=&QÆÂŒh@ ‹Ç Þ,´ùÓuþÄR 8h‡¡mÐå\‡à ˜,©ý~´„0 ›ìÌ>:ªãa¡ŸÁïÓ`æâņ»{è‚Òäf8=#Wmî¡Ú1¨Å†hJQBä¼…Út©’à Úc¶Á? åâÌ[å í¡áÔ¸ÃÔ¢jî[œ†:@ ž™& ÎöNDÞ‡|ˆto+ÕÌ0fß,Å Mš¡nZô›Oâ›]  qfIŒ)W Jë3xÓÛ}êŒ(;ç-B¥6’àMu˜%£ µdø,› A½=ÝqˆKæ³=þ´93¶“`¬Ãܨžgׯ»*Ênñl/?‚3Æ›de´çª¸K§Áx/˜í°Õ2ël×'vÏlÏ‘™°ŒÞ^2¥ [⚇Ñ—CÛs©€Õ¤ŒuØ~2`™ˆØzÞ’D¸··^7;óÆØ;¡=·”>Ê ŸŸ¾Î\YUø gû˜Àœm’ã¢ph­[4ô9J`ôûÔ ¸aâõa â¦{ìGøŒ=wž*Ø4•Ú=ŽQ„pÝ T¾c0,ý4¸2=´T£PY{E²?e÷YÊõ‡ZÝ”yô€þ€é7«nå$¯ÿ›½wË•,Ô•v»²Zp4¸Cÿ;v†ÃdíýüEJ¹§ÖÿR©ÒTÈ``| ߬wtö&x0sh)e~²¸¦ÀQÍ<Ÿ)ö.õà>̤YêG ‰nÖm)2À×ÍÖGåØGL`Sl…‡E=/ØRGSi|EkgH€"ð†F|V7¤ÝæÜcYô‰Òž– 3ðÙ]ääF±Mñ‡­úuTü®Z¥˜3fÈ%oîú`ÇþgØÈ"Rè&¸ÿ ä†ó{×-­@‰0¼à³»(ò.-UGLÖ2h)k~2?õR9ë_äïXJ†…Á|¿·Ç.V—­›) ¿ÉH¿ÄŸU&»"Ÿ…ÒËÞáænÝó9ˈ`T*+f„ »S$xѧŠú~5¬n%ÉU¶AGÒ¦". ¡÷¤FDOU^êÜõ@Râuó^©ÎŽÑó‘”élª%7t®Í̾bŸV›‚ ®Í[Ù+gÐðY ßg<¿ç2b¹]O)õP8;EÀ0ë’ÆQ☠Î&Ëì] —®›ïM²•FÿoÀëdN›5pÀPÛJ¢‚ÒL–ƒnëLÓCÊg§ .†Þ–Ê„á1¶’·”ü ¦ ÛqÀÀˆ ¦MÓ¿0l¾INCu1£ÃoN÷’àF}=ÙBz™¶z9AKpg5$¶ æÚ®Žd ÜÕp.Uwæ,‚ ÚœŽm)k2ú&xPçØ^ŽÂ–žgЦÙÛQ·ò·`\eoÂŒv¯Á­¡a3'¡÷d$‰ Æ›£8ie:ÃB¡ãàg΋£')ªƒ_J“®ôœÈßÉʸVUè<:¼©ºƒžæâ q8ëÌû…‹51¼À޾³Å<¿MÙËÙàKñevø¹¸Ptc‡Ë"ÒÉ¥õ#ûBàðÂ’ú…aC2÷-êýÊœ5‹|…ì’鯑ŠJvw‚áþLðaÞšÃm‚a@|«~ÏYÞv”JµUü°™Ÿ(Áа?ePa £+ç#™j{â ‚óc:{{b²Øs…ñûæΙSþïÛÎî̃†ûÖ¸ àVS‰ß€‹²o;Ú¾í, ¶m°5çF×¹Gr2 ;`h”µH@fg)0ì–èg17æVuÍfäâÞ£1$Ãy‹Þ [2°'f‚++18t—e† ò­ý8žµ)& ¤è ÉÿiUO\teDÎÿFí¢\/3üxà²ÅÃWkvQÑ5Ê:¿ ¹2¦Ç˜.ÕV 5¶uŒgàÇú6xEŠ~¸aunÆ WþP4^àÓ1ç¾½§ ÆrØp¥k‘a°"+l­j¹´Ì¼Y\[ìýYa»»Vœ™’+µ&«Üí(Q;Áøž~OÞëQw”Eg`”­'Æ0e®ÁºÕ³»Cm\«¢ì t‚­?°bP`GgG«²x…~íT”àÎB‡[±õa-ü¾€¦Í9‘×ô/~Av£&ŽŠí'^í¦¼ørr´$ºÀFõBïûD$¿ÌGÇe“'÷=M®ÖÉ0£-Àçz«w—<9O#.ÀƒúýÇÛ4ôÈŽuƒz¼!çóÀ|­²É)”¼-fàe¶P£G¿ìè¶²¬ø°-…qp’~À—Ôû¾Ôæuc°ã@èE-#¡+iÍâ(ÜWÌßyS©ðÍàEÝS† tDLÕ¯@WÙLRFèîš‘ 9OýÅ]ìèŸ2MàI6Óóf„†Ü*Y—é7é2<ºsßöŠ o‘ž_ég¢W5®¼•´MмtÁJ©ÕŒÅZÖ‡¹†£²ûÏ¥d>éL\‡s^Μ³§”¼­µr¾é¥òZèEXŽ-yùe`BÃ:κ“z:Áwöc£²‹³Ø»‹½«%ºO‚á÷±3akÒÎA˜áq´7¦9ÜÉÂ'­>tÐ>Ũe9Õ¨,>sV»`QöÁ<¥Ã›Åì¨#qÁƒ‚gâLûRB@cðlg“l¥b`°nù¸;ugoH:éã¨;}Uä48jïçœ`8çsK¢9ç6–DŸ•ê@ psÖð:ŸË'ÌöãPBœK€îÉsÐ')p˜‘(öxn¹?:öÆÁÃsëý‘ŸKfß&EÌ6ˆîÜž–¨¸à„Áís Ÿ,ÇkUÉB7e‚+KWWG‰yG\ðÁ„¾' ÖâÜb<!Npgœï(¼AÌ#‰ŽYc4õ4—VœàÅʾ y³làªÚ›å, lI.å0–ÃÍ5Öq„ãdáÃBãæ™_ó•V\eÙœOCM¸K–9ìÉø?>`xѦÂP1ÜQÑÆJ.Þ°=¤hCÄ Ý*ªÖ·lÅ—êk§¶w“‰€âËçÖÒ-.É(Á2Á\crࢆݾä0¸äÎÒƒNÔ\Ã6Áñ°ü…äíƒöîí­ƒ Å‚rÜ•#»“>xCÆÀ£ZOØ'!Áx­²Pe4lý°`å¹%“ÐÙÕ¼Z6½â4ñsK&©º“ ˆûY1 íH{ØܲU8\h ÁGé­Õ„ ­Žšðß“<J»’‡¡»¦;ÆXOÚTT埢!ýý¹µ±Ð’KÉð¥Ó£Ÿt`@… g›Lgw‹!Õn$¸ÑW|w Ðì=ͦ’s¸VI¦†*Oä+_r|ÀïÊ”¬º;¨²#9|#ݲXè!¶+8G*µÒÚH›öh·Š‚) ~‚!•Ä + 4á>I0Ìjj]ÏCq”bE€^®¡nFÐBzÅCÿÁÐYï?¬KÀV«‘†±Ã¶qY1ú¢\½ã°_Ö*B£è‚™Â¦Ú, RÚó)úcÞâÒgØ,¸uôÉ’¿Foé]Ë¡QÔüuêȜ妔Rp¥ï³YEÔÊѯ!IÇ]ÿSkÁû[mÂaLUÞfM©*0B1•ÍíƒÙ­=Úqqѹõ†Ðwãê:¸S:î–àBŸÓQ' IeDÅLÄÐo=“I&¬‡wšûaCôlô•¶ n î‘À%ºà|•¥œihd¬Œ˜B'ðJBèõ‰:ËΆŸðfH—}TìøP£.J÷ðFÙÊc@ý)ŠÐðqõo§ŠïL'`êÞê« oÌ­Ò$èõÙÕÑXs$§3ÎYÔ,‹}ÑôÛXhEÿàA¶“ºö%ºÁ&‰®52Ýaó£²?CåjÃ3G‘KÔOà(H`ËMÃù¤O;#ÛâÇ:Ë=*µÁýÀqç6GDh2/âñsÑŽÈa ‹/Dw|qe&tǺàPÌfôk…#ê¹sžÓwgµzRýÁÒ­¯+9É Êâf%RbBÎsÜ ÿà ߀WÞðVÐåý¿¤ãuŸ/œ%_^ZüÈY%¶ƒàYR>¡ÈõÁ…". ù[‰'ì¢Ùʦ¡Z˺B’BÑΆ)Íšx·¶Û ÷„»C7ô&ᤤý¢ÃÑA7«ÚÒB@¡ó„!.ä¹½pgÑ\´q<•iÉžrŒ‘î§x82é£$B÷ÿAÿLoŠò’ †‹¶Î§e=2qéŠ/ï|ÚÖÐ]´³_²í!•­Þ±ÄûAñUëîG>#ò$þÀÖs朵"ùÒà ËÑ•^¼¹‹µ/{u…»pGsÕ[75a$¾¯ïLÝY¶f¢-µ7oæ6Üœº#¼‡§–¤~ÐŒ6÷ƒf¼JeÖô|ž”äâ¢7k$t“¹Šj„ÿ?hF“,ô¶Ö{ÓÌôz£ôD¡“”šì·¦Ÿ~&ÇQ[{ÙMitÞY[O·‹=rGv±ÐÕZ±‡ },4¦©G Y×pkÖŠe<:rOv·dçHnz’ã½6õ¶¤ï»¶iÿ¿zbÃ)ªrì—hå1S¯]·Ž¦.N2ú"Ïž¢t«öÌFƒGSVöª¡U#Kcp‰&QϺ£Õ/Œ¼Yë­DÓ ¿Ð®¢êï“&X}E¶ƒ^ªV Z“³Å|Ð-rñÈ+¾ÀsäôUd¢u"ã“)ý”ôûšl]¬¤ Hèó&¹Å½7J$ù ¹Ö².†iG£-æ.Ú¸CG·ÐËš·ey$𾂳ÝõJã¼À_té ¥àüp’yôA/T¬ñQÛƒßT‰&s´±]~ˆž–™›Õ~„Œå+²ÿ.: t¸×¦åõø1ÚÙ-¿y:<×fue»Å–]ñmàËæ¢i™MuÞ¬óF.ú!ú„ž™dÅÑÆý=1‘ÏG¶¡sËÔœÃ:׆õ Kk9!VzZZ›Ön™Ö¼—¦.[¶³×ĘMº¶|ÐÜ‘<ÕYT_´³×6me÷¿FNwê±¾oëMôktÇðyœó|=QCˆ.öåøÈæ;u)žJoà, 'ÌšB[öù²,lS¶ei.ÅSñn©ÖÈ-kï÷hjŸÿ~äÝó|Y–æ1Ú¹ <Ùã×hê~_Éo ‘ÿ·¢­ä»%ÆNºÏVê4´gü§Zcý7…¶^ÿý´³Þ ÆÒPîRp¡V¬f%%ä¯dž[ûÙ´I¶¶õšûÓhc¯ýtäÖ;ÔFoÁ?-ÛA+š¦æìJ).ÚùßEoÖhâÿÂÈ7êWöó‘7ëLµ¼>šu‘ýÌ»ýÙy{ëÝq-üîN z«l´7½èhþ@¨áþ×І6¶ê ½Ä…ÎÆ€tÉ–%{Yó–ã28í#.@jzØè‚÷ûX:×Èi÷eP„ótGäÔ4×ÚÉŽºÐõïÏÛ@—Ÿ¢ƒš¹?yý-ºÄÉú3Ùø+ù¹ÖðÈÓp¡:oÖÈmtÅ MÇãA¡…Žî·tÅô„f¥±9rš÷÷Aã3uXgËàE‰îÐ@OtEý „VcU–s˜èéMÍúNþlVqðA3rªDèpù†Ö ôrÑ ºÈ„>¬GßÿŒüЪòs–ýþ™7¾¿•7€¿±ã¢ôÇ–¸ 1þ]¡ÿ=Ñ´9Ñ ÛE4*ì9W> åtäÕÙ©¥Ò–¥BËâbŽÅï ñzw}`Ĥ\²ê o¢¢ÛŸÑ,$Úйî1zžÛèóÀŠƒr‰®]t¢·…^øö¶hc§f«mìkH+Ÿz†î~4òÙ"†lê1)ÛúJd;° ðl¼×~ŽvtnX=úXóþ%?9EWËV´Ñ§cWÍîáðû®×B©ÏoÐýAûÜGoì_«ª>§gjMÛŽ|Z#—lêgòeÏ`aèeÉöÐÛúJâg£æÐ‚ë ͲMËöm¨MÅÌŒ™Rèhçg i«¬"‚æGÞäxèPçæ:o£µVœCµÇá’hÆDúASxÓ5Èzé•KkWL9 Ô‘² ¾LZµæÝ¬y+Û‚>Èš.ÔÛºãX ´1ï£+~Ö˜²‡µ×2ÄE¿’é¢~µd¦7QvT£ß·=ï?Š–Ã¥Ò[®lc·d+8ú•¸²ðZS&6ËX,⼯üüiÑåi¢ùP]Ù5=¹©l£k¢7ÎäÊ‘ãÝ¢È c€Q ÖypFSÏ’"ªóŒÎÑyËx Y_ÖnÙÖ÷½]ÙÆnÙŽ‹,e³–EMø¼ÇãœCŽ&VöAÓ3u^x§ ÏpP­YÆÃ¨ÖŠ5çlÍZïfŽÜøÆ¾1rú™#—£‰õSÑÖý=ÄÉEãC@ém0¬[0Z²7/Ä*ê§ÁÑ·Ç\ïiÈÁÖ?°í0•¹G÷y¢ésnVg½§u2s¼'ÛX±xØ^¥¥/kâÛ‘½Š‹æ¡àeù–ˆshºÅÊÖÐìY2=hêÞÊn{m=À“þ•~&ËŠ;,ÅXó÷riPYÑF‡Ó RMî:X–{e¯>h<$šÆÏM‡¥ŒêÕL 7z¶lLôi±­“)èÄœé‘ÔV4Us[Ïšm]Á»ñÞŒ%öIä БëT|èŠ Í:Ö±î®óÉÛR1ß4Ø¢ iä‰PÙBS×`²ÏГ@oœ¢zô…R­ËfJٞȧ8+v’lj­º²]ô #oJ®…OÉc¯' žw’r²õöÐÝšw7eŸß¡gXëýwÑÓB¯8‘©ƒ-hT6¤ý ±ì,w€7ÑQ~+µz^t0¹tjä$d¹ÔK¤ÂÞ5‰¦z³Ñ%Nt–oñctÕ³ŠÅ*FC¸‹Æ ¡Í‰;û¥{•yÀº¿ í 7f>¬%÷ÐÓùòÔpJ¯!ø{§0¿K›ÌÑÛûS¨ÁZ#šñ*ü½’JƒÄ`5Þƒ¯p–œh®·íè­Xû‹¶„WKo6º C7K¶‡îâ<¤wRò=0F¡_Óñ=$zCW|[„^&ºÔ C³)üàs¹ÈÖg^§D‹ê’¢÷oÚªâd m|'õáyÙ‰æÛ¥ÆÁXð3ã…O%<œMÏôªx8µ@^´5qù~XºŒÐå™°›ªúÇ–RaäHð÷©@¿Ò(Ì^0‚’hJœTUbÜa^¸ÐÎȯ~ÐÔP7ox,ô)ПèÓÂsäFRvxCgÍ •UÝôpRm4u¥lú¾ÉªnV —è†ÑM´j,–Ÿè›È } (Z±V©“èŽ÷ZSª.=[¢Âøgèæ¢þJšî`FE[£ÒÖ¸ šJNXÌKèà’§;U>'–ùQo•/K¾T©Š£µùþPÖÅú)Ô¥CWíµ[x¬Zd2ø¶¾mì¡©ÇÉGÓ|‰nøM—uŸ,N)ô1ΡYÛÂù„ù6){bKµé%̨l«ê]ÌõIt‡´ª‰æa„®ˆã£úðYÈ>ø5U´¯Þcê¤ëÅÒ¹Ú=PŸ®-;.º×2c†®·ÔÃèÊ¿PñðÐû¿+k…•&úà3µ']ï'2}‰fM9}KfM9½ÇºllzžßzvªµpT=|ÁΪ×[TΪ„á,©=áÏòà´#Ì…SDñªYðd⇦S¢©ùÒD .„žŽ*;>ºfYSG>TSÇj…ÍÍ—@S"@¡£Xê|¨õ!§•"àytzBGÇ(Š®¨c„—BGnõW½wpi¬C—) x ]h¬D+Ñ&í~dÓ³i(œÎhŒ>ZÃ+®x8KÃ:¢Êô.ª£VD^`£Á Óõ¡±Œ"‹Þ¤Yï )’¸> çÑl£w²d/UÆÿFöö¾ù(ñw²­¡ŸŸ¢ƒ| žŒS¾š…9å7¢ÆÏ”¿ ¼X²ëOÑÁ’ ¶™ñ2¸[¦z³ælBã&„2TO¤_@G2Ÿ!{@¶ÐW˜B7ðhšºEYâ£ÈÕÁ_ø´f.V]_µe¿Bú”ôÆÁºÁº© ¾°tnKoyÂ[Ø”¬Ðü˜ŠÑ7åÌJºd.:~B 7ŽF%ÜPÎc öÐïKáGzãèå”jUp#R¹ÄÁš•}Ðôd]Ù„:–ÊÌèɸ’ ~¥‰¦¶ÓJ+`pxp­Ò‰ç¡N'.Ÿ6}®£@ÍàÜz¡P—Wð­ð­ˆ½Q¶¢Ô͸e±ÒøÍr¨Ã¯lg­8<¶2´i¼pO'Ï9ÑÔþØÙ‚j-Ó}®‘ãóæ½xƒ÷>—SqÍÎV†Ö¹Ž&ú"MÙŒYà3oz›lÑSŸl> ×û(׈ÚG¡>ê‹?I*lŒ|Cn¾Ds[õ<œéí#›šø/ºÔÇ´O¦ ÁžÄBXmÅZ2ílÕjÉNkú«eµØräÔésddÓÈKP"QʳDoØ2,G¾#IŒ¡{|à:Òà 4¥ Í‘wË?CAªóa}%2šèsðD¢ÐƒÁjÔñþˆ>+ýèe‚Ô¦ÎU§Â©–t+šª‚Ÿ ×,Ñ”´ô}F£Y ß¶jiñ9ÔŸèßE-Yj(1aY íÆ t)“]G»PZ„Â-áSœ%,/¿]¶Vw£†Dº(5E ?èCe¿~ t¼´°{"”åÜŽ/•yñ˜É:Ñ Æ¥…> šœŠ šïœè½Â‰°¦ …ùpèCèhà§2yó¯Dwèikâý|Þ‰†—aQÊ.«!ù ûÏÐÒ㸲ëãè¼>ÜPoA9‚SvÕ!ÞDSFDzá7d)ü _Ƀ ˆš¯Bº]ôfÅ3B¿{ 7Q¥Ð×ðÍ"NºFÞ‘Ó#¹ŠƒŠ…ò…Þ•o]¢¬ê'eÓ @ÊžøYg¢§µb"ddAa¡ã¥Ï:{èŽÚ–H¤èvQY?‹ -µÑ‰/ T·%üüçv´âp.½½1mHqáÜÒnŠCÐ¥Õ‡Â]ῇ[sáQ?UWx÷àò¡à «³åõ·KøBM¿¦‡!ë2(t¸ éeÞ&ïýÒ.é µÖ›Þ•Ô_ íÜÄø2ðùØD6ÇÒGšÈGø)iSXxY-g‚+×@Ór¡ƒŒj-ÞS/i¢Y0¢]Bú$ô?h,[©JʲXæ‹à¬¤ÂÕa‰å¦}Mƒ´‰îØîŒ"wcäY"ÿÙ[=5ènÙ–ìcíµcmô[í O—èiMyß›ji~z¢ VÛ],=Ùnñ.µ†Ü¬×ÐÎÐUKc¼Y|ËÒú•¦Œ™ÏM†l´ê!©­:Wg¥Þâz{×›šÙ3›;ÿLöE·Ÿ¢÷`ÌnÉV=$ã&úŽlF*ÐTиqÆœÖȧÒêày>§5òް ªú ­Ù膟ÁóX:—ÅF½Ò‰¦ó^³×ÖãÌ;ëÃŒ‘Ç#Þ¡«X#6£öù‚lsä´©BSU!ÛEçù7dã¯Ä¹9ï‰s”~<òà÷å#74|—¬fíÙk,-¾…¥æÈN&&*{8ÙxK|}p¨leh—>%W’9ÒpüÊÈ0GïŠ]Ñkò Nõ/½Q/úZN¢‘+|kÇp´v ýTL¸øÇYöDÓ2íDóÔ“(•~(CŸ;ôý|œun¤˜èâ£é­`¢EÉHŒ?Ew½+ÎlÏÚx¼ÞÃZ1m}döй+|[ùa‰Æ#—Ó‡•Z·[˜ÏÅå¢ ­-KkËúD·%ÛFoÅß–»*мº-ÊúyÎEý ÙÆNUJ>}#x#?™Ð­¦¬güzBGI <™Žø¿©Kø(c„ÑW$ºâ´×£†sô+Éy³6ÙÔ~ä`¤Y:G®FO“èÆw‹Ð4 Ÿœ4K'Ù ¨#ý4Þu>ÑRû -‚¨ÎU­Ì8šêòÝ’™Q´¶, ó;úŒ‰ãCU웬}H¢ ®c<ÓÚª“s_5qtlz¼èøD)ZfMâ;ÊŒÂ[U®|°è»ÌDS¦´)ü»ÁdÕDèâKtÞIÕ»î é=`惜šq:Ðyë@gû<ÑÆniü+éq:{-û¦²iZu¢Ýy3Cµ‹=¢CêËD;uX»Ehv o`5ˆ8:ºC…v´6­Ý2yœ-ÑÆ>§‹é íÌ{Y:WÁÞkÞ œ®:ò̪†§b²œP—ÇÑyQßtö´Ht‡1|¡#€Ž\Ì5˜hÚ©_~[úо~™aX½î èg@W¬«ïz€w±³”øEoÊß/; ^o¡™k°‡¾œyëóÆû|pæ.FÊÜÅÍB‹d?hFÆ'´s:ðž¬2æÀ‰”Ö.êƈ§^„Ñ«~d­8 žhz™´â¼çZz’)º:oªD3îÆÕš®ÿEÑ=>p–(ÒE&cìTõÆ£ïš&Ï"5±“K¯ØâýŸ>h,[‡*õæ&¯˜^¢x¯Y'rSbKÖè—R…Êþšú÷ˆâ"\±®:tzýºÁT.¡ãD†whÒØÐ}~eÓy«*Š:=z6p ZšššÉ³ànÑæàPð¨œh¢_~V&ti6ÇMx8Ìðñ@îçId6¼ÀÄ&Á‡Uï´±^¿Ô&xÕE5^ágC/;ùF4èØxN9\ÃȆé¦ýò“t.;Z1ÒÐËLæH½p𚢠ay›]D”ÂPè÷ba•2~6Í•ý‡¦#ê~A_†NÍuu§Ùt‚GE=ûüJ<›xÓȲàÆn_Þ§ªLBj ½hç”Ùúx;ΆcOÖ z>®$xƒkö¢ý¶ª%¼éJ¥}‚ó‹e5Çpác¯>!sy§m. t)´Õî…wü­¬îí¸^!;Þ¿Áã-g%×E3ïB; uQ"¼ûFs¯•ð¯Ã—ß_ºØ¨k#x j‰Rßo|×Ûã|m;3àŽÛéP¢²«êPášíìøGs—vçl5B¿†Za^°ÄNhõü¥kÖe¿2~;ÈãE{Í׺ñ³#ZkÂïú›è†Ý*YÉJm‘¨Mäó6ÑÍD뵿ҀGGª7UéQ_ÖN-@Á+¤ËûèÞ‡'‰«#N÷Æ><ø´¶Üô„/K¸’hˆÅD^sþA;²én‘aȘ¡®Çtè_@óÝ&øûFe·Êˆïz,¸3óêͼYÂÕÙœÍ#›&h ¤ð /óD/Øûw܆ÍXmƒ?“mlÖdÍCÇÓÈvÍÆn›Öħ¥ôi®lœN4"±ÄRº wf¾" Æ¢×*JudoÑÅ–MËj†“˜P$´µà®p]kè/Ü~j¤c1tVåÀˬ ¦6ºò ÷¸ÍàYùø¸ÅŠÆÈ7}h¿ qKñ¼‰î?DkÅl´1òÉ“¸íÉ6æ-›U# i²—5oü³ä5¡ßkŒù™7K0ýÌ›%q[ÚŠu.ª!摾mÈ®j«Á‰î0EèxNBçGVYÒï»ZwhÝ+ñøú|:ÔŒÑK´ª]15ѽ`›ç冯©‰'®&Þ§pÚ­8ÑÖ®¨Úû«è©Lú•ÍôVqá‡VÖ$úg_Zp–<4T1hÌûÈ+Î’w&ž|ÿô&<ŠØÑk¸ÞôwDÅ¡³Õ§eÁ‚ÇáæŒ½Ã´ý¡¢CZ(ò]áuöû‘ct³¾”71÷~nl·Î«5‡*E)÷Þ¸u¦Xíªey??GŸƒMõ&æ]Æ!›#o8âÕ»Áë-¾$Fëèûçpªs´ó[vz¤+öÇÑŒáÊ•ÝÍ÷ÚOÑÙ1^‰ödÿ]¿€†;Õ—½pȨWNB#t4;€çy ¾×D®E=½Éîau–ãTSÇMO‚ x™˜h%_,:o%_Lº]Fljªú#÷Л‰ÆŸh¢¹ÎÙÓZ±¬F¦Œ>­/|Y[u[j;¼ AO†ì‘}¢¡ób¨˜‚Ú¹£é9ÈŠP7¾Ñ¡Ø*ã™:~s¿à‡ÒŠ&ºaW[’\`µ)¸Jã#ÓÊ,ÙÔ~ ÍR㘼AÕG¶3oÚÁvDÂéá®Õ¡23FU t„ê á3t&Ó ëa½Á}Ù‡GÇvn²ÌAt·¨dˆõ!5šÀÁõž ìÒW´‰Öû€¦?ÎfÊ6Vlª®ÞD³;{mkäilÂ/tN½ð <3A‰ÊÎFªô[Ö7¶9l¢ osäïã‚õBOÙ§7MYèxŸ«*Ý-ëqtþ‡Ñ•wC—„ø–Ñ"ò3rºÏ—m—D¢7¤W÷ã<_Ýš÷pÑÆ^›Ö¼—%ÛFSê»oȦ4f¶lõˆ¢ÑžeÝc+ï1x›²s ®cÊŽ]o[ö/Ñ WWJÁù=ûáœjnX÷I´Bµ¶«5òæXØÁ”bŒÜºƒmdAfn¡ËSaçÁcÁáñ°ucµ kɬçÜžŽñ°—õ™ÈÙCÝ’)›–VïíTm˱b‘uI©DGP¼ì{k 5qØö8Ùûn—Ó\Ù{ØNw¢àGŒ¾UhkÁ“a…†¢ÕBž¶¨¢XyhGrÁ£þËâw|³¥5<ÆÎ…ŸÎgn=V­Rø¶f¾½±oÑ:ÒËXpcÏüzê•§ê%@Ò4£×P·„KqBÓRFGö%žøÿø_žº7v]Œ/Upü©ým©í•ÍžY‰.0¾{—ÌØmîÐùµb¯YýO´ŒBpÜpkFBô(aY‚Ú)…Wʶ’ð2ùØ£·L‡á„×ÂïKwàñnhð¬ºakîÓ¼)]¶;þܲ–•4ŠS³,÷š‘€MJQŽA¡±ÿoÆóØ‘ý 4ÔyðIõ“A7†þ§Ñ8ejŠÊ­>í,•ä ²Õ2 ÞI/‡oV¹Ù§¸°Œ™ [B{²‡î?E;:7Õ¦Ø8ú½ûO‡éýBGÂÜç¦ìª·ËöÜÞ`ˆ_—`é4Z}á2ZÍxáFÒúFÅMoæË…;3ßÞ¢oKqÇA¿[ÅCGl…~ç)œª­UyÙ™§:áïã”%Óþƒ³º¯oIÿ<›ЫŅ>=ø¶áí&™ðv°CÆ…ŸÞ ¥Ù¼}Ìé!+á68ü¨'Æ‹žzcŒ"ßPû¡ïg\ ÆÌ_´3tÁù~ý†ô?;ø÷϶t¼p@¿psð¿… g³({u…[š»pzZøÒŸŠ}Z’>°ß¹7çv³Ñ–â¾1t.»´/ܹžššw>#ëšñ9 m _2+=¦—*YIè…?°©Õ ל#}]î ¾ùð [”ÏHÔ VQ›ð÷Ž*tð3}ËÐ$jAc¬6:ôN-c[‰.mBþ–N cf”…5ÊÚU'¼OX'!¸¡¸™9 4®þkᢰáÒÏÄßùTG3šç5EãÎHš¿#›&Ïj¢‘7çñ1E'Naßµr潬‘»²ôþ!ú˜èMÉ ?h¼S]ô»SiŒqåÙK6d‡#‘ç‹/5[\ð3Y:\Oâ¼<,­hêÌ–ðá Ÿ.Üû5&üÆWÖ$³.WêŽ>¸ß¶>4š²µ[ÛgAÃ/ëü7lITkªN¥f×V†;u¸ïlHeÇOÃV[ÀKÃgc–þSØÎÆÕüoìŒ!ë+Òëƒ ¨/°ü߇þn:Fš<#Ç«TJ»0ÃgjI/ÖºŸêIOV7øÅ¼gk´8‡×ÚQhËîÖȇ‰ŽÏàĪ)<Dðc Þ…wìžÐ¢m˜¸¼Â•¾'ÔYÖ¢/ÙíŒïú ‡Þ&ÚúV\á:šNÑ£u{'sºŠ¡í›§ÅÅ~~‹ÞØÓûë‘WìÑøõÈ'|ì¬ø¼ð}²T{OGžè ?p[vsÑjÉÇÐjÉ\‰žé!ÑÆ¼¿DËqhÌ4Ñ´I銌M~ Néßö!Zª{7–ü·h~~þ»™΃ø4§Y" 0´e÷|ìE+YùO¢7tÝ-Õ®;/zÕÒë°8nïÀt¾ÉÑdÊTs ʰ¹Ð‘Æz! ~¤jý ¼VŠºv±¢ÐgAÖð”m(]\ÌÌo–èÓT…¶¶zWók.üLHÕº‚± Z Ñ%“õFm˜" kÐY—k%ûå¼LP]a3Z >õÇ+‡ÁBM…/k¿ÍrÎþœj]a´bhmÀNŒ+²B#é‹«/ÜØoG{®™<x¿=èŠK6÷{•”]kÍjšô‘c?È/ÑŸµ8—aí$ãˆHô„<õKd.›UŒI¬+±ÐŽÖÒê×õÃHÏ…¶¶ú°„k¿ KëÞM\§)|/˜YñÙ‡ö™]Q¥phg‚D²·¥µ¼ˆYJˆàæÐ%;.ÚP›-Û9µ=ÙïËÆ°Ûãì–ÍW¬=î¼7öµ”¬­Xó.ÖÈ«‹ž°yÇ7dëÝx#i¡# C×»ñF³){Á¼ñÔTÎ^ëÏ:ÎCmXGÓ°6›etÙhgÁGdâÒë¿ÉÐ¥«6#iœÕ ílÕlÿÒ-­:~Å·e-ÙúéÄß“U㬈ǿ'Ë>I´1òméܲ›|>¬½L¢Ïïd¿oQ®ë‰ÞbÆè†ýÙ¾ì½.=ýl~&¾ÒÕ¿”}âo´[~/ÎNïòÒ1ýDós±k¯ê}ÀØx–èÖ ÙÊÃ:¯ÖWVãD§ˆœ7utue§Qs±7Kç–ÞÅqÍ „>´9Þº´SÊêØ@e«¢Õ7.ðgË /<Úômüð2?=Šf0+âsŽìêÄøFuVlÈsAó…‡ÎTÆù9+¥]áñx-UVΚè ù‚>hÆoü…‘¿·?5šR6}þû:ÿ£hÝcÔY4Ô—„fm„loä¿D_‰²|hÊ샎ñ€¬$ôª8$;¦¥¶åªC©2ÔÜFG¶DwX‰™hc»,k»Ø²'~¥l¼U½yo'm¨ M…K4 -þ}LtD îËÞØ1™hšjâ|>ÎÙb£ÅIÀ‡þ¾ÈhÂFòåÑø^ò¾hgÉ$›M/ZCÆÄ7.Ê›ÕÚ/ÍD;ÛÅE‡åB—Ì–m¬Øoµf¢ȬôÙ"⠮ ÆõüAÓwÑìœC,Ñ+üt†lZu;§Òú•MSæäì«Kœ”‡ë<täÛÒÚ¶F.Ï$ýÈ–â{4f²$£>ô¥¸ô@O4¹ÐÔ×dÊ®ºÿ=~ˆÞ?Dg·lk½wû!ÚÚ-;=“мu >ðùoŽÜÚ©/:ª‹à‰t”†lœÒ¿ùrÑ ×T™²·µÏ•ûϺY~6Tk_@3¶ûYÁÆŠÇù‹6òÐÎã¬Ø±,S-Ùºý­»„±2'Ú’íìµaÉž–ìÅeoñuèb¡+Ÿ÷Ž÷Œƒ–í0ЫæƒîÈÒL4×Úûn¶/ä1Ùâ6¡mÐ÷¥Ù`Q‰6Fn£7Ì—ÛŠ[lÚkB+¿¶pá†Ú¦µ]–%{¹²iëÁl–ú'ô9+ôó6t¾]´1òcÉÎ’úwä]e$3÷{¢ Ù–ñà£'tæî ˜pæmè‰æ_Iµ®Ýÿ2ÚÐù°dÿ}&,°eOKç–ÝR­øh–ò`˶îïDã‘[–G²Š07•=oËn©Þý}xÞ ;òfÝþ&Úz·âÊöд!äïGþ3´eqùè ³È]a±E¢¤vÿÈ6µíÔoèœÚÈ?Ý-r³ÄžD»²YÕÀ¾40§p4w‘56³â¹}éoX‚ËGç,-ç]øéà­·òH´'ûghëeÑ,hÊ>Tç#v*c‰Üâ1æ=­ÝòKÙ q±n‰6F.*ã úȦa¦f¤ |ÐŒ˜3Ñ´[V¢iýÚ¾$0ØòHô/eÓõVu $ñ¾mÙ\kýqFžô5tŸ'š“Ï»üYtuöùWÐtäÍE{Í“Ýyïî-B‘†¿ï>¬ykÞÓB«å$+Ú™·w*ZèaL# ï༇u¶ ëû"+¢iAÃúB‡ªöXÛá@ƒ éäQtF>EVHG¾Ôá ýð¾ûæRs/ÑôñŸ•µŒµç#›•qo•§Zès MÃþÔåÒyÞÝ–]Õ^‹îµ°ÔM5•ïˆ÷š\Áô Ùd:´GÞ‚…­QÙB³î7BÇó¢Å^C¹Yã‰wjgÕšL.ê2ÉúRN"i¦Ésï0tÞJÀ:%KlƒÐôtƒÔÖB—Òa)t ¯ÑúÙ˜8^ðߢ#5—/™á žò°Q™66º^EØ`‹ŸÆÕíd¿NŽ¥7½ÉŒ¡;{õXkvœ#}=a>0šÆ‡Ú¡2B:ÙûW±´æ¢ºª‰vVÌE;#o:6<ÒW³†Þ¬ïξºc}Ú˜w7ç9íÝé>_¼ÓB¢;ìæ®†^ŽÖ¶üŒïx‹(âÀ.0[d |è¦lª[T»„]°ßåd#¨ócÙÙG­š¡¹rTÙŠ³Ñœ”M]„Iqwª=òés¶2h³„šæÁþz,]EÔ%|’,.gZ²Weô·‰Vx”¢1¯g¢;$ö²µ¶þ2šgÁ§lƆ¾ã,‚J*{[óÞÖ>ßñƧÃáÍomÌûü'x½õþûNƒÉDOh%d³ËäÄÁ€Õ¦R ü™œxUØhöMt‡©‹‰n°XDèCû4pÞ;+f4ki£Äæš]Áçÿ+£µRœÝRÔoÐ@:O4»Èޏš4\mè\^tö?¡¯C½B… z¿Ÿ0ìKmð~._K9ÁüjƒY±—=aæƒÐ–Údø°¼/ܰ]„v…÷(#0†Î£wèÖU]øä§›­¸ˆ¥Ã±×ÇQû‹v†þsø{ÈP{·ªÐ‡®ùÿ…™3'ã‰cù½•¨ SÓe/†ÚLÙï§Â¨•·éÈîÖ‡fË®0Ý&Ñ4RwDÛdÌ{Xó6}_yÈþÍÈgÞgtèÓšø´>pÏ쬋÷¢ù Y|Tè÷Te™)›ö?—î áÛšwdPÒ˜•à{a§U{âYJÝ/Í «NÙòÙ¥ìy”n¶V¬%Kº,Ö^D¶Ñâ‹•X Á|Ž6…o•2tÚtÉ…¦öjSí £ÓûŽlGk†¥(RŒ‘ç=LG>¼Ïl87©=t-€^âmñFz‰ödoìyJvVç,ôkì²>Û'öÉû¸Á÷hÖµÓÏD±BjvµìÚLµvâÆ:?¼™Ý¹l,‹áˆ3cä×DSNù#Ö‹ Ûð%úàCµg0ÀÝ°ÍæÏÛXïÊK¬Ø>:,ú4löüi´ó}G7Zš–vá<– ø‚tç’ËàÍUÍ;•kD«/:’)¨ïÅ…/¾åñ¢ÇÛ±®=Åid<ÖăaÆ^ô¥2²Á 5 v =‘j?Ôr x¡”DJðrÔÞ>>? wÔÞ=Åukæ]æ6G›CÙÜ‚_êðoÃe›žðß—õ¹xh55 ™‰/ú 쟛WžˆábóDoØêŸlz3¸èpuRLpn=Ëén›AÀŸFË’èTkÙÆ>•R6=Xç=ÕácEpîüšº¨ ”üDÔ/gN/cÁ7Îò›ó?· 7…=ÝpËR»ønXMˆ-;ÛXst$ÚÓMW)M¨˜JdŒ”‰6´¦$=j¾,¥/ÓDû%‚Bz®ô½hž”°DG¯ÂÕyóo¡Ãè£+¦*=VÛxÄfQ±ûjŹøð‰+å¡;Ý.ªË d³pÐÜÒ^[J§ñ¯µyCço ;6WS6-øé¼åò£ŽˆD;²'68—ž¬—ÕG6£«ù ©›5éG0:o28ï-0j5íâ”Ò¤lÖÓé‰ÖÞØöxѧÇÑÊÐÍš·è¬è³lwKö°ÐY"/²DcÙ‹WÒžK^bÈ>”Õñ\òjcïãDæ·llÖi>ÑÜxHæ¶&<ׂ}äàLÎä.Á#/Î÷Ü%4ñ÷Tg·$ë žw³ÐŠñÒÛ?8Œõž*å {-ûhÑ‘+ÃŒ%¤l¼ÞÛÚ©Ë.Jüኚß]™åèäè1ГQøèþgÑzý£ÖEôh0@e/Wöd¥Eáš(»&_è?4ò™\´±bz >ä\»h®ó¢zdõ•ô½óFAº‹î̃~уeõZo"d#_ôa¹Ö©ˆØÃÝå*B®ƒ„Ӗމ>Ðhч!ƒ­‘pºUu4¡€K 7vzZO äŒ £üD)Z2\.z±Ç‘;Ó™·LìaȆ,Üÿd;ó†5¨ÿFŽ’¼­ÃÉ]Iÿ9ÚX1ÎÑÆNíÖNí–Ö83q 3ÎDç=1÷¸Î:¼¿kòžS/qÑ‘ëÄgËÆäÀ‰÷;¼ý«Ê¬P ùŽ|³°C O–~$zBgYQTu¤`è…iaвÃâ£#»só•Û ”å¼­Ð\_¡qýDQÑÊ»¥´p‰³™Ð”Ð&Ð÷|óÑ™Ei­/µs´X+Y觨™'䯽è «E;t6%zã“©ªŸ…Û} ©™è½ÊC­U½d™žè 3?#Ç:—yϲÒËí‹h Ãô ëíÊ>ÉØ—Ý3 ͞šGø€Y åvFÄ3OÒIz…G—¾çÁ„ïÀéMZõˆ§wBUÎ-Þ2²ùèÑmª·€WÈ'ü?Ò™;\pœÒ_TâLýýsYÐÝV¢~ãrëqx‡Ñº _¾BpÃÖÏj­·_ÖÈE³‡/[¶…ŽG±7̶!êøÇ‘=ÅÂICµïÅånpÁgu^f³Éæ£ÖÃTx«ÍC«PïP¥»èÈRƒg²Ú u|0ÚÂ7-ÂÑѰiaÉÆH•5¤ºÂ+¾Ë¦ÚÈS `êd¤6ÛT‘ «µO4l„‘è¨Ü†_Ù’N]f«¾ù‰3‡¢Æ+”ÆÐVöev)üÁ_itùéØè»hø¡d% ½ÖpB®ÑaÈYqoèòݰŒm¡ßoœC ] wï.q¯Ó„Ž%ê7jæ/¬“Ê~jÇw Ü#ªu™}ŒVZh9èÑê  «Uù´ê¡‹v¬üz/øq¶emS?ãV_ AÊ‚š …—í¢n…›5àσßv[n'z#í¤ûåhGv6c§ó–ÃŒÚËÙ! Ï[‰84½[ö@…'Ä~­§AûZ$¼w®¸Þ¬¦Mø„MX~xó~M >øé8eA±*EÁã2§Â³¨•`—(z‡ÏÑÀàý¾y?’’ELƒuj.âÕ*¥âÄÔìOEŸx!¼/Ød"áΚÙ´ÈâDÔÄŽœ€×…_æ¯Éé[ô”œGþÎ{'†3î̽z W={tIJ¢b¡­™woÏuwæ§SŸ÷r‰Ø#¹^ÈxýWS¤ßÓ¯ey«¶¼U[žæ¶÷µ¼§d{ð{-à½ák=àeC.AUŠkOt…UUBG{£Ëe{Ž1´ þnxæBLáïŽe•“ w¦^mø³`•PÂ[‡q-ð™ç€¾6¡#¾ÃÞŒ o4ßñÒ-ÛÄž‰Î™ªz[Jä,´5qnŽÝÙ¯wìtÕTçÌú@¦ðNI˜>;tdÞ©Ó >tD³*Î `v±àï·Ê<ÿÆÎжð©üµM^’X£Ä¼Ôƒs ¨5u¥Ã¦ëéFð¯tZ)^U_oX‚ÛZ¶0‚7ô‡Öð†ÞY|/ámÎ$øyà»­ÞBu%ª¸,˜ï>Ñü|«Y”Hí°€×ÃW¾”}á¡8x6»Â“ǃ£­U³…—Þh…™šÞ:crjQK¦*±ÃÓ5‡Ž¿Ô)+ŠQÉ„qô–¹ÊôpNó“ú.œeJ'¼.|'¾VDH§ÆDU„Z€õdL›î™Ì÷a1Â¾ßØr,Î&ø9Ð}-´±åšBêMç†Þ”ªM=R-?túN½%ãzs½YÆkÇ3Ë :>V6]oãBgèühW¡ýsµÊ@øàh‡'ˆÕðH„K†¥z«ZÛ†7|H¸puùbùiU½ð ¬»þ:Ò´àfÏ.~ô„É>|ô6î3}t»N,õ÷¾¾0øB)‹jVËs_Þà·÷¥'"ÛŨAç(Õ/´:¡ª…b…=„vô6еj" à[Î…W®dT–ó]ÃùÈ;Wùp±Ô"ôÁAÍ¡r=úàI4KdUxE¹yôkÉz=–ÞV?í éÇ2eÆaáy>³Fm‚;c_JÒâC÷d+:E?T{âÓ°ÔlähL\‘­NOGMy¾ ÛúÎv<3éKï½Ç£|‹]…±Ø’pe;j›O§îÇ™m+àÐgqÔ6½gžàN6ɱӛ<[žÒl;tךՅož!4›¥·æ|*3½‡tůڹ‹vL™žKÏ›IWIóD’é:«§g¼Ímé],ï4r>u-ÐÛt=©u8ñÙ—ðS‰>³?ëCö„ŒŸ‘S¥/µÎ`´d)»ñy‹bž&*/èQû':äòcy)¨C¿Ñ¥Œ$z>„ln÷ݑӫ¼áGçÔÁ¿TÌ*êm+L=žMwKt¦Œ‰U¤"{¹“…&°­a¢¥«“ ¬ŒÒ‘«Þ &S=$¸l™¼b¯Y²©`­¯Ð}¢,õÂߪ¡#Ï&qôp:rñ² êÌ"ðƒßøÎ÷£ß< /¸h;é`á¢íâ)î¦Ó±7OzSD…æÈî¬Ù¡cï²à#%˜œ¡^°!L ŽôáIW Ġ˶W _º2›é›|§kž¾‘¶œë4ä«ÊÏ|ó–ñ5yŒ%×Ó/ù‰/•&#záÝóðöåU< zNv ‡GÔÑÅB½0GMX/Ì*’Cm5¿3ø¥Þ`ÿsÁeò«¢9°ÐAS m°ÍOV±CZÏKï·Œø2v‰ ï8Áádÿ º_§s'éé}ÆÁNýG—1kAv‡N[×d¶X8+ú,N«Ô3Go*¤VûÑS‹†D‚’ÃQ[ö ¦CW»¬¶Ldg\¥ýЄÆ¿ÐÁOÆb—í²0“;‡>¡-Ñô¡”Ç瓌m|!  tèE–«l·}ÎÈ_ô¦R6Í`oâã4Fþ4=“ÅZ`ÑAgãC·B9‰fµ9-I%þF_¸3tÝ£¬¤)ÑëUÕÔ¨K´ÿ¡·ÍŒÐGpO¸ƒ>.ºÁžÇ%|À>Ë‚¼Jƒù´cÛé§èfí—fʾ%a…htèÝz6ØÃzs…ÿ]´¥¶a ·Ñ ¿lÙ‘Á\ Zîúo*ð¥Ú@óÎfŽÐ;| ‚+ Ÿ½pgè™Y` ;lÕÕ‚øTì«k–¹Û¶¥5­9ã(û ñgògÑýùh„ŽLºU/6½»LeÖÏNè[(JáQ] m Â9ÍàÕ®dyúî•WJ&ºÁ ªoÌ»á§UWhœ1|S><Õƒ8óöÞ'½YwÑQAÍÕÝAw]ø‚»²÷†Ô$ª$޽JÃV}XCÿ-úU£¬´eÏŸ¢#Ýi𨽢ûņŸŠ‹ˆº•´(DC_88‡Nߤ=S¨lQhX¼/Ë„XarÒ\Ô;rjqf72Ck†±¼¬õÞ&Ú2Ô·õlÑ«Rô±&.*FÕùAcKû¨6“n6QØàë(ÃV\k¯Î˜ÙÚí™B¯£‘¬²4d6TöN õ¡|qz.ŽÂ›’&š¢CdáÔÙ6гÙÍ“säô3zÖ1¦§뼪ñ0üÈlt<0è¼[ÈÆß˜Xôh®õhþȱքf{›:óžM8ºõ‘)lDC7Ca#ê£ÉJ¯ÑîLÜŠÝØ²Ý‰ó×Pñ4õoFoœÂÃC–ò¦[=óàݪF+´î*Z¥t\Å2ÔÕòÐ5Ëd#è÷™‰6´63c^ ¦ìâ£é'>«³[²ßFO}£xèr_0b­ŤÎmðh˜?”ä¢ð`Ù‰ /s»²=ôÀ§ò‹¶”îÝ~TÔIï³€¿Û•¦2|þgZŒìÝ•}¨ 4ßs«z3¯Ö²üáÅj«zzW>&u/G ž} 4Ž×"mçô ïµlÞA‹¿—èti8Âùp&mÉ> ŸíÙvk-KB)zy[U8-áÇB–\ã”Öcmk¿lOo[EïÔoý7 é‚ì÷{áÆ·²½û4p8ð¸;ìÙ"xÔ'PÅ5 ÝãN¢ÇÄV_%j‡zµ?ùÀfHΛº[ÕºãÁiS{XCÏÎø;U7+A{ÆAá]6:´N t.¼Òãq[‹vÆ¢æ¨F’²6îc©=éÁàqä ¢SœÍ=$Œ/åX-ºÛ|´7r¾ÓOËŠ}ºdÝ…;zëÖÌ•#H“übâ…{‚NæÊÁ£Q]CLwùs¸á¸ áÏÀwRvî 's¢©«ÛF‹¡ìG”¸´%@6 Áçºú‡Ñt7õ;á>þèÂ)ªŽ¼ìøxS{*t5  &³ÐA½ƒ”ž²©ñe£EAÃl¡ã…6ººûíÇ=`°»_^zÖBUè26$˜Há´eˆ>Î |DŸ¨Ð›ÒSˆ¨{ÓÆµýR³²`äcGvµÐê=Áž(=¸eåš·èë‘Éò.83 „v…O|@”é _.ü4˜¼ÕƒÍ™¹Ð ~ãe[K~L´£ôú8Â^°cZ¢Þ.UAOVl(ô¡³D/XOÜÅBgÌ»*E€ñ>§ðCw‰6”Þ¬‰7%1SÙÝ’=TNMˆªüJFLŸèÝjÀä ³y=Uz’[ÐóAôœ‡££,½¬~‹NR1ªµ@èÝí—TŒšéAÌ5abg¢iø(цÎõ.cY‚4£¸Ltůº`Öj°í¨î&:œ>tÞÝZïî< ÛpÑÆÈ•ˆƒ?hjd'¯÷´¾’)K•žŠBSK5Ѭ;ËwæÍ²_zxÙËÒšlê¥K´'£3òþ8²ƒê¨A7üG6Ý©½8»¥Ë3J}›Ý ÿ‚ìH¹¡:—Öx*ú²iò7´¶aÑùwæG^𥲫Ú%Ðo,r&~Rü}‰²È®Oª"jùôìA·L÷¤gXÖxóÂMéVõ(g ·‹R^8m†xá´EHŸ ˜ c—c˜ñÉwÕüÓÿ~ŒÐ1r¸c^tìV ÚãpÔÇï†/ÀË€©¤*£>|·æ½yЦW'rJ1ܼ’–è odú uŒ nŒÝ†Ÿƒg^ð½ð÷Ç¿{Ž5ùý·nxÙ§®FFÇ+øn°W®æ¬pô¤Ð•q$ºã€çXÖùžOªó^$–æö‘G~œwb–ÿã#FÔøp=î¼9z*„¾Õ’¸€Z"óá4ß@7X ô™7]ï)ëQ»'ºðyWk·(Ýœ7¨9Š£5ùyñÈj¡}žÅ0tÅf¼ì±ÖÒÇL÷ùŒ7FL’hCkÛB{§âqÞgËzŸ-U£P?P ùŠ-+Ú¹¬³eUkäVämuS¶³Þy®Á“)ÑÔêYIToÿ@Ó®2‰^cAèWç¬Ú–-Ž,êûY²îñnqe;û|Yû\¥ÔâZÇÒÚqFUãŸ-Q5^:ζ~áÆ’íÇ1š¢bݺuÙhgâ‘ F×½(«mLôÂAÇÝœâE;JÓ%¹u g¥>£tíªW7dOKçÓûÊäïa,B;'ã¶Ô&MÞÖû@Åî<)!ŠÝyË)NÇ~«ÝáV?ÊôÆCW»OšGÅË ¿ÂÏ´Ð*#¡u‰çpÙCµÚøCÕ}”—AÑ.g䓯ŒÈÃ6߈|ÈF_‰Ð›’ªŽ`’ß V\Ûè3„Þï5yð1Zµ¿x§käj»ÀrSö„5ÏC嘚‹‰¦™?#Ì­Sðå˜ËBÓ,ˆYÖÁÆê~Æ­idΪDx‘}dã‰ËdcƇª ;—½yJcÊ>Ðí"B‚¸ ìZ­™è,Å@.|e.Ý2tuœF‰<Ü©µ›²ÝRçÇ  ðhhÏŨãè¦lLÖëâƒÆ²÷Â'ÚžQ¸àMYÔÞ˺öVš‰‰>°‚eDn~b²7Á ¥÷Ç™x·”žÕX‚Ј}\ô†„ì4ýȆÒÌ;Ü-#;À£iXGÓÐ=È›†Úðð}>¬ƒ-e³çÿPŸ ™CMƒ“#ÒèâIŸÁCe,ÿPhìîIÙülÓúJ¦%{Y+¶yÉñøô±áèÓ°ñàÉžÉùo )³¡ÐïóŸ•î¤ìŠmì©“‰¹àE•¦&•=¬ÎNÍä"V,hJÆhcÞâöÃ{m97Ñ´,®)3—:ªææüŸBÕ-5š¢É3±Þ?KrDnS´¡aõY0+;áé7bp= 麽èÓaÕM›K'L§k>,Ù3ëÓè~–ðe¢qgù.Ñ]žŽ‘þÐi{³„¾æ¯2YÉ _z…ÄgCÑø6`l6áö·Pþ‚5øŸÃÛÆžiÁìÒ>2¢OK¥îÌ]ñ#êŒ8ïÕÖÕ™Ãþ^#¡ØçýÂX÷®p@Ài°4àÆ²|?\ººm±DR_x÷¦><éNiâˆÒîØáz¶7öý}ásáÔ”<ÎI%¿Óà1)4×ÜŒl kìYÀÍÌàÙ(<û0¤à›ºV|áSo/f—$¼NèÁœaB[ƒ7áJõc= g|¦Ö–=ÞØ§xoðåÉ(]ðŸ…'UÍIæ(ù7vºnÎxåf|§Ñ yµ`ÖàMxó6]³¶|ð¬¿ï?Öq~˜ÒYñÞ?83†?z‰>h–5c³í«¹„¶öÌ ÿ;+4MtÖàT>Õ€ÞŽ/ -µmKøŽðܢߩÂTŒQ&Ñ;ªº0zAÒ­©D2MƒB[ þKáõqNˆÚþS£<˜ë{®OšîéÃÇᇦ٠m)>CeðK$¾qà[YñÜòžQ,èsáW:㈛ñJv¤ÿ^¬-û{xì:äÒLøOUWƒ2 ~î-¬wš'%øî6~*}”ÒÌKÝN­ÀK€NewsÐ(Hêv|Px#<«n^êv¼b6Ú75@oª2•½!én‘÷šºÛ²Fþ¾8jÁn•̓ƛm[ŸÉ¶&~\´1o[6ÿL’?ÝAó‘wÕž2ÎÓyYÈ©Î{qGn +OøMôÂÇCWEKŒ›aóDŸxýw¥2Ò—FÊÆ;µqVžDÓì²½‘St·¾’nɶ.Ѿ¬¯d+<môž}†éWbÈCûœ18~ÐXvçý•íÉþZ¦&K‘™* lóòùbÙËš·¼´ôÛš÷qÐóùjÍGOkäºX誢p·ÌjÊ6G^p^Ê{$ÚE‡1òæxÕ}Ùg…˜² º¯DZëÖÈÇÑYZ­ž)›‰ºE—u2-ëd fZÊsš²̯MÙ»—ùÇêÏÑ‘ž ¿1•¼l¾àzQúRU“úèÎÕæÊ.–¦ÍËÌR ­¼Xh>¬L_¡+)Š•=ûaÒB|Â4›A…FRv¥ð…MŸK L÷›Ê”&=•;ƒO‘OÒ45Úôß¼=ŒÐÑþmI…L|A…ÌŽ¢°ì°¼i^fV碃H™2HÏdq.Xo?‡‡âøÔß½ÎJý¡¿~œŠ*kSú™ç*„4¤›ð&óúÓw³¾¶æ½G6)ã<™bs^8ˆ±¯/ó=óoOÞydŠQÙøT|GZ‚~ƒ¾œX¸Š¦ú(ÐHÜNµdçA_Õ!üTRB †%›^J‰¦±£“ñYºdÍ’ý4<îœÁÞM)´dj;óÞFá|¢/¬3¬otHét£gã2ú‰. ½9ZM©ù’ ¾)ßÊNùýÞS´YÕÓš¹ Ç»U9êQ¸ÆÎFÁqòi¢wü‡¢ãFá²ÃìcVãÊÒdšI!ø®°ûú°ô;CßðiœÂ;ôóÚCW‰QÅ$šú·Wt„Æ´í‰6<‹õðħêèñá:ÿs#Õ\ú‚„!nl×¥öJtùèðQÓ3by«¶¼n[vó÷ЗV›Á§¸ìÄšb/U’?´€êÂ;4Ú76ìû‘ýí‚óí^Ô •„ì™W ÝœO-дŠÐ¦·d³ö1K¼Ï„|‚;ïÎé¤Åúðf>¬™O gû o°¢$á­ñïTÑÏB·8¿Éú0P+*„ÓîyŸ‰ãCb{CߺÒXwN_úq¶{MFæõÜÐ{}¬™¼6ȸ"`ý[¸£9ìÆ!W« Ï}OáΆwÑ›R'zÀ0àŠHÖøf©-/U:ñæ-¹eÄIxƒEK=£:¤BMtÅÆHU9½Ï«¼*¬t.Ñ”VFèSâ? =c«³(⺭²ó®Ð‡ö/H4ÞV¼Y£-¡ã‘GýÍU´SÔ‹VÓò¥¯;v¼äéÎa9h‚ŸúCá6Ü0ƒ¶'ý ð3š‚ì_¡#ûåØ&¼<ÁÂàÇ“~2›žîM¥Ô~ *cìM•ôB6Oø¡”cW8ÿZšê>XªìޱhIVÌRTRxÃßyË'5'š*»XÂút6,ÌF}ʵé¢y@0h]žr' ~h!ອ7=Ù¬ï׺¤04ºÒ¶l¬u]ˆ4"—œ2ÔìnÇzQÿ¶lZ|º.1 +èúp·@Ÿ–Ö–…Þ–Îm´q¡é®Øx¤5ø…^4Ôù(çûWà¥@&#Á½©Ÿ†_¶lc³ŽjÉÛMªª«§ñˡŭBS ¯`õùÃW‘¨ÎhöðÏ:þJŽ5ïc­÷á\ë2ŽÒï;ÙN©3|‰Ræ@çÈé÷²i`w)ãËš¦!,y„éãbɵ9éz«t~c6v‹Jè±Î•%ÏøªuV¬[:ï–·5ïa\F­Ý²eG‘%¼K–<›4DhëÜÙkÓ:¦5r½¬Óa97°öæ^Uú•lKöV°‰~%Ç‘t¼ðhçt4í=¥–•\¤²“¥% [áAº[¶îoZÊ!ªMžû°å3¡Îè}/áõ¿å· Oè`Úì8|°‡s¸Ø²÷zl]à4øèJ·ê´´6-­ÙèÛÕç¼}|YÂWV¢ÒoÔî  düɉîCØF«õ>Ž¥5 }ÇLtÇÆÇQ”‹æÙždŒ¤Gv¥ã8ÅDo™<ÅZ²V- ÙÏ»:WY’ÓÂãäÆ:o–ÎUB@KêŽå5ù)z:†Ï™§ëQ¼†^&GͲI"]<ï¼Ái„î$ñõÁçØé«ìÈ@_FïK2R6ha2ÓT¸£Ô¨C9hdó¨4Œ¦„“)åTm'™ èG~¼í*‚%ÆÚ²E½\!•¿Ð‘ýˆF.4Ÿxî˜DSö»-Òè‡6y¹ðºG÷¥^Æj—ã‡eì$n®00…wïJt…¦z¢7|dÆ6:÷¥mf>ÊD˜'¼“qšvõIá´~3Ñ–ÆïàŒ~Ñ쉒hÚ«í#ÛynøÏn¯T¸º?àS]ÄLÌ"ÊM›ó ­ˆè‚¯Ÿ¢ã.¤óþíÈM4ÍžØbªöЛc2X'²ú¾1òÅoQwäÛ¸Á©µc¢‘»²ƒ?–^Eê×ÅÞ'[¤äú}ö¥4§óbïŠçý‡ÑÙß„åÿƒÓÇMQ"?slÑŠwèùIôyBBGuGGö$òž|Av”@Ò‹Ž›¥[Â3¦ /„ýàGYQDœ¹Ë¶ÈÔ¶ðKÆé+^pš€!ø«7jâ'¥8}«…®xö9£D¶Í¤²㤾¢T!–¼)´ú1ÃíöŠ}OFjÔÇQ[U˜’eíx îÏtÑyw>qÑ^ݶuº©ˆ¢§<ÜÔz›Ö…4ã`]x·ÍbM\¾˜‡½Zj˲øVñeZSf!^ðf3ÉvéЭeç¥0½ûhZÏ-ÿ:ÍÖ‘î£y{ÇêveóÞÞf 8úÒµÞb4ÑÜÁž<`Ôþô‚5ŠBJ‡¹Cj)”!a­T©Gè]x$ñ<Øo¸ú+}ã<ý5ä¹£–ßR½e½èÒöS'u Lº@ªA¡câðS{Ñj³I×|qÔ¼9ÑŒfn-E}GG±!#ŸMᔇ}Gb¥³hG§ k%—ðFYàw$/Å nöD3Zí«³hAX´ð¢mQ%>tâÕr–ßÑÁÆcw–¼yðéÁuºÒk)Q<á±_-4µ&4t^Ê´Ã~,°LÂ_Å1Ú‚p¬÷Œ-Ð\UÉ4þðZ`Ó&ÁOçËžÂiÉ¢9öàU1ánHzåð¢Á³†À;,¥ò â(1ˆe¿ÉÂÝãðš¹±ê&<^´KjÂé]Yøð©{ºýÔ¢ xÙ°ÁŽT¬h.CSÂϰöÜôô.ªÒÞ/AR¸~äß ^‚ ½xŸM¬¿ÜG8õ˜U°”Ñ#æˆ}R‰>0 îDà7xÒ(:{)³{Qð°äЊ ¯h³ÕÃOhÂ~}6$—9ªÅ7æ=­‘OKö²d{èmé|svZ¡½‘oš·xT£<á](´¡µò8ó6ÑÅÙ©%[OqôÙð2IÙ ÚÛ' }èï>*xm°Ë{¢+¬W9ªûl\m]%íð**É®‚'>•ØŒ?”õ 8«2Riu8}™«ýÂ-é{ðV /”Ù÷¨|³BG¿Ð¸*>Ñ´ äùžÂs½>¹äLið[ó…[ðâÂ#°·kÖ½z²<ÚÍT[] ¼Pkõ„ëj`)IBGDê-éè~Õmî=Ñ”åEèCóŠÏ-›Å;}êR`AÐ:žH’ˆv/t«*|‹?RµÈ£yͨ•?¬BJðà ý™ð›6Iá›ö‹OôÁ/}ôZ`aoÁφ¥]_þ„7¡£ÌÛØ1-‹6àvU©õÁ3oÅ9$|áÁÎ7Ü+5zˆÐEËJmFÖ"¸±]Mt·Ðã‡èi¢÷† ¡­¯Ôú²Ð[{•õ/õáÖÉœæ,µÅ•Ý•Dc)],–]|"Õç¯ & <ûmBOõ.šº;‘Ôké„|ätÙÛÔõ虎*…)óØÍÈ7„vvºú°”l=ëœí¢dI–w—è“ „Æ$7‰¦,šçV83úŠ£2a®óñ8»eK¶8Ïèzñޱ åo y+žÁøÖ=±_ü¢á-:šŽdz› y­]aŒÐÑ“*}H6Ý.ò·Q¯Uʦ/Ò¡Ø:=Ø¢º9 …±ðŠCCî:.<£‘^[oỡèy£§²ˆò©cz,'ü4ÒWH•¾b¿à‘ËÙÇÈÎ-)ÇÇKö…¢²´£ŽÂ¡R6|¬¦¿ /™ 'jv ñÍSÿì|µÍGO#ê±ÊB~VPõ:u9ÅÐ+%ÜÑzÝÒ‰ýÐípgæÅœ¹%¼*ç^¦AðÞ Ôé5­´È^¹ãHc_8fvOº,(ꀙYqJ‡>yHE`Þ+U† æ:V›JY¥Á¹åÙ¬®çÜÂršA¼" Óa‰²§×€¢ÁÖ¨ µN·›JË+N]ŠÚð(ˆ‚k¾2'‚¾ð¢´Ü‘®\=šû¢÷Ưò¥GµÍšS%Úy„Þœ¡SÆþ+œ²‰+QMaCx-EY»³]—+=^yTïùLã²=´‘½¬Ìóµ-­m©ã/m뀢ÎVsæÇÛnÇÛìÇûŸù~œoÅF›Cw'…†í¨]9ûþ‰9ÿ==µÏ_ —ÑO­í]‰?†oÁiÜõ éΗ¾­e‹Ÿ?:¶u©nefPnëcqÑÑV¯ûXJ?ò£QwõeP Þ¤c´ÊºÂ7~jÅÌiS—+üÁNãcô„úl¾ä’M½GÌBÔa¤‘¼Å'®ÄX WŽ%žy¶¥‡óQ£1MôÀwÊÉÒGZQeN¼ÅÛœ&*µ¤.ß3LÙás¥K6=¥«L„z$kuÙžì„cÉFùWõ¹œˆZ1Ñ´‡OUQNDë‰Ö]#†2ßíÌ[J|OôéŒZ%ÐÝD—ÚYqMU•ƒ3ñ­xzš^x,‘)àÇ›:ïvuÑÆªeÈê-Û¤£BþD;j+:`Pö„ó°L¢#,ƒ§”?D§“è ”®ìÆRr$Èô|-¼Tf7&<ò‰È+ÐÃnÂ'ç1 øráQäK °+Ü™ú¶–m»ÂCqô^|³÷ÂÿHÇË–. ”xø|Vˆa²¼¤¯À÷Âë&.Cxñ4çKátÙ]éõ×ðZâ´eðîIïÞºûpgðÃ:-oŒÉô‡• ŸJ@<9î >Û~Ñu[žðå o%‚ÑXøanÄ@ooÕ¶§¸ûè¤~‹*USV}g‘ÓF§®*1ä4ÿ4Õ[æÓy²‚NNT QŸË+` #žˆRÄ«8(6LLtiÐuðK–LÇÞ,Åu1[Ò%9`­ºÕ›ˆã¨õÞF!–D+¿nMÔ%ˆa¨ª¡¶^µ]4œwWÃWêßèòþ¢ Ø@«EjöqцÖ:®aý/—ý—Ñôyd †l5s¤¾×+›~ßöÈ-´H( „Ok£OùË©Ñy%çEÃÖUÞŽì‘I“(5¦*ð»7‹=_tgõm®˜xöÜCë"¤!±Ä!†lØÃòʆeæî¸ãÖEwl«ŽÌs@5V ¼=x¼ ¶Q{ÑGo|*g8^p1RÒL…¬§¾—!ÊT½pÑ<21²WÊŽM¸3tqbÓ÷äÈúTy…+.4¢ ~ÑÙ.žZN³bЪ¾5aµÁ×I >”§ò÷é7šhD]è;zZ²¿€ÆZ[Ö¼yÃ@ï?‹>֊ɳJƒWmŒœ¯÷R9ʾhCvqt¾Š£µU-tz›(ºç{’ªMXÔA¨ÎÝ•µµ¸ÂÎÊÈ¡ãýbÝ&K÷µ6÷‹‡V&3},ë.Zbï¢Þ‡lÔŽzÔ_ta˜Vî8©Fø`/~¶+ÇŸÉq ¾èºm EȈ×­â;8ñ€—…Öhù I°|´’×QMùEOßÊ,Å+®ç½ÌyçóN6ú<ø€ØòuÑ„)ÔUpç;ñ¥7HNpEv ´5ö®ã ÞHMÇa¢KرE¤I‹Šm }ÚC¬ÿn —'\+x·®l+ÁáŽÚÕe€&`g59µYU…ÿ0F¡ w͆ýù‚pÈõWm1’âϪuœ/´µ]åFÇ_AÃòà¯È†a_ôISZ”ôsø«8Ô³ç¢G¤zaôÁ§cÒ—‚1T‡¿ñµrôT¡YÉ_@m £ <ÔK7ÐÕ9"¢¿<ØŠI ®<—U‘ê-r1!•y£Ÿn˜ä¥¨£ð8%—Êž,PÀßù­0€†ËB@}–ÁBéa|½tÃÚ3:KºèStè+,0ê´±•À]‰Žî`èRZ1@ºfÊOd©öÄ›ŠÊé~U ûÆ} ÉK޼À`VÊž0pšè ˆTòå¡Ã覻¥óÄí¯bg䃇>Kð|P§D‡Ý‰Z5\ø3ø^F]ígꨓÍEÃŽpVn%ËWà9\öÖCߤ'e¨õòxðÂ3;J’Û ˜ÚY.= +BOtƒ±B«¢n™bÄ?…v´ÞB6µžJ¾ËYÝšè“vqÓ»uzcÏÆ$,æ]’bÅ~¸­Ä¹ú_‹>0[°AÉÍå/Ú“m ›ŽVöª<\¦ð„©ÓBo -*JjóFÑ?—ݽ±å˜hz2¶bü—hk§Úè×è¤oÚ?,»[èñ—Ñ´Z0ѾȚu¦þM­¦¶,Ù?FóF³nÁ¶ß—ý3ôqtÞ­û»ëf¤f%ˆLÂO]}])±Ôqô·ÑÜ)èc Ÿ‘;²$¨-Áª=¡Ï©‹bŸ…:ÍMlqS4XS[Ä.>#ú‰«öÜ$ \ök²1ÖÁ$À#½ËÃÉØ»KülÊÅ,´ZÓ‰K8^2QzPçl?ÖÄ-ôx~ŠŽ,9ÖÙ ˆŒdà§ì(ÖÐKºÙàn…³ùÚC¯>šF9ƒ¤Ažùc~œ¼èaÍÛCO ½,ô–¯ŠîÔ ;Aãexg“…žs¾è÷mƒš²_ÙÞÈ ´h= 4fuÖ{ZgKRrèp£Óy{²;îU•&¾)‰ŠÐïN¥ž™,ÙôE8gæ°Ò™gZË -â¶è\íBS÷ErÖÈõ‰ªs-É‘c­)@ òŽèjȦôï ìí—ú8Z«rT1’»¯çCÙ•kvsïîöÂiÃaÁ¢ÊVem«Ú±¿3g9‚;C_Ö¢mNôp‹"_J–›èÓÑ=`lR©ÑìªíE—Nk„k¶`º‰àïÌYíD¢ù†iÕÒ[ó&žŒÌWV£`Ô»:±Ð¼‰Ô…¶ôv¸óDYáÖ…Jïu®wÿYÕÓœ›Ë*$\xóf®&Œš&Ñü+×Ð)x c·”Sùªªâ|÷ ;Ñ™‹ø”>Ϻe…t¥n`Ùêö̸™õ Ý”O[èÃÏå(îÚ,-Ñ’ ­ž¨ÆÐ>—ûq–,ûTÓçYVg1†_Q/‡9ó¨WQ ËDëS9Û¡]`ê-4b “„C!œ’ ÅÆt¿¸²U Ï6µÿ-°T¹Þ+<ö£7þLïØá¥ 8å:Kx÷sé´uÐ…XØŸëF[F~Ve¸{&«Û¨ù5³p†57»ðl9voæTë?•]xÓH¡­>•˜Gý¼¾p猉±oüΙYîDg.ÖjíOÅæñwÖy!G¢)·ÐÁaõ¹œ7’‡^Õñ^­ §°Ä~ÁƒÜ@?ö=‡þð«x©€–ÚÌ™ÑÇš¸æ•%5½VÚn¬HUž8Ÿxö¤eíÜý`×¼zù¯¼Yzkžpê¬Þ*Ñü;ÛyDÐpL´ uf>dPWÊ+²ÿÆØ-c ó «ÁýÚú/áÊO Ï¤­À)µR6Þ1ÇùÎ3˜Ñx6/ÔùQßê6*ûÐÖy-bÄÎÈÿ8ša†ˆ.ltÅ8c6~¢iÅZ 7ÚnJô§<â‰îðy¡›ßX±Òy$â#›Ñí'ºBS·©“ØÀ{­èTd¯ÑDó}^¦‹îØZ,™oE÷yRqC+¹lKvVœC[ñÖV@­e}wU{ÊÊ•¾)§Ðá» Fr•O›¥D å0­""Vÿôt(n¶ª‡ +n*høŒÊ š.ÞTY]ÁéNW±µÐ³.ƒ9mš QG~û7Љ7UòÒ+¼‰9”›zy-˜©•è C$Ú˜÷´dOSv)3˜†4ô‚_ð¾l½þ{Ñ Û‹‰¦–êh6l‘ôáÿèc-øñeÿ]ñgÒU ˆÑUåfðD7ÑÍšws\=û@{1K‡èzÇÏCÓ-ŠANÅŸÉÈîó^ÂC&}Û …]¨Å7††Î2/üÄ (|˜^ö áq±ŒÁ k7ûõ°2¡cæ¬Ö­© ‡6ÕZi'\x¤K3ÚÛ¦RJ]#ôû±°~`íSO‰©jZ›jT@?ói´w:¾Ö«©oå`:J á’Ý4qŽVÖ0‡c¶Añ2xÀDÓžVñÓnæ¹OˆìVÄJÔ´ô Ó8/|ÃþÖ‚G?szD¨„™A沘e”GþN‡¾y9m‹ˆU©´b¾…µ\Ú†…Oí6ý¡Ôû‰•Ò µ…àï~£aÒ>¸Éð× a ¨-h–K)8î–}AhîÊÒ§Fú·é\ó]ÙQÐ&ìx”ð¾p¶RTtÚ—Tðˆ¥ÀEK{¬¸ú«¾nl×»žq;i=¨|‹Œ–eTÊŒ8æ£AlÙ8PÂic¹o »5rÚäëƒfiÖý6Æ¥½çŒveh±vz_ëMç<Û ÃK¸+¤Ž¿»ršÅNŸHz¡ß=,´Ü/¬… ÐbR‡×IWÀU” ýn6ìëû§èRöK÷c wјԳÇF‰»ó³0ÍÁj6Eý7£d¿p.<àÔ\ ƒ0jˆùtÆ5<’®ˆ£ÃNgÕyáN[&õCÅ:Ò A/bÁl ­zFgìÝš·nm˜¼‰é´ Þo\èC¹µR¶ñÝÓE|£Œeí½­‘oKµmO-oÿâ é¨Þ›®ø±ö˱Öì8öîT†j¶ùðNQ6Z‰·¬N]è³qðjz&Ĭ΂¿èxTBëgfY <âÓ²?²‹0U/IME=7ÁµøŠY×èÌF¾Ð[6­«lKöÌ.›t«NïœL뜤pÖh¢‹ É¾œ»pf»G:mÛÚ0™¿Jo±Ð2>/õ ˆæ=©†lÚ®!eóݲä”ð.»²‘ó„„D³êú.&1C?,9)ßË>ùn+28ñ†§u‰¯tîhJÇðAÓ”D󻓾®x*Э.â`š×· "¯.˜5ŽŽ¦ªÝã2Âû<ãñÐZ]F÷>Y=QUH¸:ÐÆZ™A§m'µ=eù¦¯Âu¬‰ûgÑû1ѱf” Âî KdpÐLï-<£€M´7r]­ï®¼_¢Ö/‰¦% »Z³ÖL´uL’Þ¾¬v¶d¥“n](>ú`ÇÍÎæƒt£ÏØlxÅÔzˆšé[• X¶H, Ù‡veÿ†lÍ«­Lôq^ÒbE<°QÄ…Ó†‘‚9T«G¯aê8òÅ3ÆZ±yLJÓZÐ$º£áS ਗ=­{ÑgàÔ|íÌZ·d+½œ&ô)eêA8ÓZ1qßSGÝko9³¦Ž&ô~_ï!ª9:r¡Ùå‡èª@Gé Kºð Cœ‚;k¦X»N†èÞ:ŸuC³KTgÈÆüÀ9òóÃÅŽãŒÎŠ%O˜Žb°Ü^œ%ªî¡6—-ÛAWçjÉ–õ@í½Ë1ö3´1k¿yÒtA…n¢‡…V¤ÈA{²i1׸D[Œ>ñ#ï|§ftŽê5oÅ–‹°bò²“F&šö;M´ñÝÛúîö=¾Cåõ`l—‰æ¯ÿ$cäìB[ʦžäùðõ²á^û=šææš²‹‹^]Ý2«5òfÉî.šk¦‹¦ßÝyŸµañ¢%ú‰,x†¯Y§²gDh&w ;y¶¦+¶Å&‡üý)ŽzÌ#–qš43Í>ÉðE]“K•Á4‡}Iµ±þÕ‰>X¥¯ªIgu¦‚¿w8«ÖLtïZÙ„‚ó³rôÆ¢¥‰¦I3/ºt~¡žÂI«†˜Ÿ N¢8zcÑHå©Îf ¬^ð-I«¨öktç{µ[²môèÈÏÄå:wä=¬ïžZ5øŸ½1×DZ®a{ÚœïVd›5ïÚÑèòNSoòÊyßMMƳ¬ï¶LŸmËj3?|[ .:>æý™1_¥UOÛ «…¯™7le9ÇÓŽQnÌKLÇ’§(ÖèQÚš·ÎyN¦øÝVTj3ôTý Ý­‹sê ­v%œ…rì4ê8™ÚøÓ··c¶uÒŽbžìq6㛣CË›—iU[ 6 GG¢8\óRxe¾ÐgÃpʼ,otÅ‹ªãY0æ²]4^oåÀ0ë+ÑÆÈ…fîåše’|¾›U¨ ͧ/ C+èsX§XýŒõþ1š2¥ }hí!3`îÐ{ÀàÕÍX}f¸>ö„z‡þM«ÄM“ „þÝœoKö±d»èà#‚·A}¦Ùû†7†^…`©ý‰>ʹ®"FÛ¥²[ã%¹Ë㘗܎š\uXß-÷(5TkFëàu´]xŸ{²#´á7U²~áír¬·Ñæ´l.6å°R3¹=ÎÐ_ô{²DÐÏÈ餷ÇÈÔšbK£Õ·ó2µáiûšº[±&=b»†@Zx~A¸þøºyCÝ}ž$ÚzÐ~^+vi'k} 'šm(!’5þ< €¨ð)×,˺I¸³ßðc^t3¾ü§Coد۬HBS0ã©Úš¶eM›‡ÎÜ_:mÛ;)Û›7ƒ*GèúP†!ÿÓÏ/áýñàŇS¶{1+S„¶ÆnÂÛOáÃ{[¾›{VD‡4ÂÞÕ¿•åmψ0Ÿá ƒ„nØñð.Ç3y’ø¤»ð &„ŽFæ\öéXÉŒ ²XX2c¶MtÁ‘…÷tÖš)ûðsä=S 50†µdÃúpɦ‘Þ@7.{Z >ù7dÿ£èðžÑ¾,ÙŠŸQ?±)[43v&Á—ÎØÖß¼Qád‡åC™A³œèÁ·Ëq¶Ë|Lô»Ù¨Ý3ÅŒAC½æÈËOÑâ†;5ÉŽhë̘%ó£W¼íÙšŽ¼;ÆC¢©w;ÐÆN?E‡n:5Ч,ÍÉ[r$š¿E§uýO¥ Ñ4uSö6Ñz[ÐiÛÖ¤‹)‘qöÏÈ'4>|Y—ÉOò‚—ÉJ¦cxÿxäZÎÆ}÷ASSÓ–mìó‹¦+Võ:`-šìiS® ]-ë4Ñ“s¸ ÎEêsYâíc•°‰ÞøY”hú_Öu²¶ct]Ï/Ñ6].Ñ4¾ñÝ´Rl[.üDÓ‘oëßÅ™µ êøa³ÕYÚC3J¬D/Hj¥Ò_gÖDºGý¹»Y{ÍFOl¹¤ìFç¼[#·®Á=,Ùñ÷‚—©òL©äe¢Ù#þ‡¯P1}øv™™`F…O=éhÊ–ÝÄx5mô²¶›…V'cÚNu>êÀlÉèy³.›KÅL4 @,J<´­àÎл7ëwáÝ.¸³hé]Eç4ÑÆ¢MkäS³Î‚Ÿ ¯Ó%. ã×õáŠI3'ĺLx«ïÐnŒ˜2Ñô2UQ£!»<Žì@Ój³u98˜çf%}H‹,œo çÊ©Tq3iÂ_û‰±¾|þn™ucRàíZÝyýD÷kóæ­ycÿÜ|Ô¬93÷»±wþ@³[ð÷yË85Twõ>oÙÃ\èR:L­ç¯#ÜC¯0Dð†SC<ÆL%´#ûÈÃjKo)òo«@ñwè;½ÃsRƒžòÉ/1lXŠ,4ö`­Èle³†zô€{µýÆú¥Šù†•®¯uJ¿pxøîàA©ÃÚ¬ÿ.ZíYñn[Ön[Z1¨ë¶6ÛVë¼]¶óá-ß*pÒÛã|xP<,È6°.Ë#Ø^—é`S´8ðýîÍò¥„>´!ßšîù˜ñni¡XÙz¢¾ÏïZ² ´œã‹®X·Ö[Ľ,•è ûé­Ë‘°èŠyß­ºÆ›·DyO¾aÂÔº<,§1ѶNÒ{®–¿\¯üáÊe.‰6.Bï=œÔShk»ýÞe°lDoHr ô»hÔr ôÁ6Àe  î“^¬i«&úL|w…©é•Ò›…ÖËŠ::ÍÏø‹Þ«eSvF¿6T¬/ܾ'äõZak¾KÆrÍ„ŽíBG®&¬¨B?¯ÍH_7]®:j;½?‡f%¬ðUEÙù‰õ¦ñíK‰*Ì÷Z—É‚¾ãGqt“6G~pÔ/e³dÒ”=pp|Ôû6º*Â@Wl6æ<ÌF³vK³¾ÛE;#ÏšJ:çÙH˜fCŒÅ3xWVè?üŒ¾?£`×8ŠÌÓÊÈà w[xä°ÀÛlˆ—z_¦ü£Îú,Ú æ\Q@¶ŠàÂí¬øo…OkÑ”J7ë\–ìm¡ƒ^:(Ô©½Âìã>qÁ'äy\*¦0m[èN¼K„VŒ÷eee§ñåU—5CVó¤>` •àq­P´rÖ©fuïˇ ß2‘,UÅZhkè&|Yk¾lá {=᥶¶óPZÛ¹Ô<Ù;Éø©Ïo‹«ˆ•¶ê5ÿ"Ôõµ›…î¼q¥Ð¦lcɆ…–~¡W’‰^ú¸h~ÀÏãÈN4eœbÉVY-k—±¢v,,Gj?E¸iÒÑÖ‡«2–*¶ìœMŸw&Ú:&GÏ”o“l?M ¯³­ïVD€±j,•ë5nêŸc ýD8‚ÉÞñ¸Á“n£åãÈ÷´UhH—LhgäÒll£ïÛs›­÷þ¼Qô²ÐÙ¹€î5p– @ά锰zÜ­Ú+.;›3¿ºÐÆŠÙ¹ô”q‘³lé­â%cÖš¡T}xwá΢ÙÂq-É7„[ðáÂ7-õK4u"ìOXºæY•DµTm¼kö¾/ïO¢+̇ط ƒe¢îx‚KKšÞQ[€[•oÕX³µÕ>rÀwІzŠâ€k„>/Y–°â¡ùñ€}û^ÒCÖŒÂu[¶Â•¬ªrßöxÖÔS„ù«M=N6ºòTó­ÂÊhšèe£Õ˜ƒÚŒ&zZ#W¯)›¢ÕŠZ]mY;u)¹ŽØï›"Om®H‘ÿ:3½éÜ¥TY|wg3º]Œ^`d<¿¼ÂTï}sûY½×¾ÙùxÍŠ‰Þ´A|Ê6ö‹Ø8H¢d‘Ý·0€%È lft¯5%©³Æ…Èi¾#ÝdžÓ*=Á£¾®yö"¦C×Ûˆù}ðêD¡1¯VÊ^ø*¢ˆB‹"îl˜e­øò„GøÐËŒ•/ïLÑ?0;oßúÖ4qßdsª¡†œ¤, Ñ_#¸±$áüýp´Á›-[}ZYÈð¨C‡±bÓDcr¬læ½8áŽ}Žžd?Gã ßoG^ÎÓ˜hO¶‡>•KèCKSö„Ͷ„· cZù}NC¥šhæ"<Ñ2—ïýšèT-Ö4ðéÈÅAzö‚a1£~,‹ÏÚ[¯÷Ðfcml.ü®‹£Î":7…šhzH§òÜ©‚§9k/+´„Qáò]ü½`Ca-ç$+.Hô³Ý`i¹eOô»}4_ï,÷béG<ÆÈ•H/BS¶\ø,ú ô^0b”h~6]eÔfû1ZÙJôI8u«¶Î[è$ú@fËqtQiQáù®‚o:½7ŒÙ|íŒ\¼mŒÎ"ÑÝDcͶxÒÌͺ{H6~_eÔljª’_ô61(D½ð¬õLð‚:¹+±ŸÞ&ÑѤØNEðW³ÑIïºFéÂ¥…ͦ(šêÁÖgÈ6FnÊæª©7 )œ,wUð8£P7õá WĈÙ[pÅjwN–-MØåÜ^.xèJ¯g‰çöSaÕ7‰¦õ3'~B½ÀwUW$ºNâç)0ùáÄUb8f»8©¨3<ÐÛyÌNGÝXøwgOºdYêE·êгŒ¦/d­UmY«EŸeC龬\<Ñ”%Ж-ÿ$ 0FØ„UG'Lä8à,E[þÿs°è†m¾@W|› ƒHã¨#Ê€-MÎ-õ¢ÑììÆ‚ÑÊ–¥NÝù8²§Ê0X½v¢ Ž(g‰ÝçYìä  d–ƒVî#£ð:j¬A3Ên6Vèß@ÓúÓ‘‹Tš^¢¿GãÝ¢SBŒQèdŒ<{‘@“Ë—ýðYód's ÍœÌ+C¸fµùÿFn ÏƉ¶ß›2eéÛbeKvzD»5òaÍš‹~_d4¡,dó¼‹5¬Y›ÖwgèÂ@/X n|™èè8HWL®&VÛd\•QôI•e|T¶ÊÑø‡¼ÐÎà‚ŸƒÃ²;KY­Œà‡¶OQƒ ³ñËf‹ý‹ñw(‡Tm[ F4E(Š;,°þ:œ.4b´åº Æj:£·>ôßÙÄŒí~cÞœ±o©Ô½·÷åJ®¢þè“/tËœÇØà)?Éã gýˆK“u½K4­¶A^¼Ì¨£î4g·žìUM—,Ëñh~ö‘^gÌBÇA£©a‚7\Ö–õºx¿){ƒæ~¼èÈb q„hÒT:+lZ¯¨{!«–èà" –À•=YŽõEV5{GW¼)þvLíÈ–Ï ñ®]tcÕ# ÕÓECÒµ¦å9µ&å†Ôún|¸L}g t·Žh¶a¥²/³ÑmW^;ÒŒmLº‡>&šZ ‰Æ6Än¨=YÂî‹.Öeô 4ªJô>ìQë\äï(¡ÿM7ú-“æ#ߛ喺:;5»¸-жîƒÒˆÿ2V¦5êÙZ-ÔP0ÿ¢=Ù°y ­K´lK;x²UÖ†Þ½𠜲ñœÛèɪ}þ¾E1^tMRgD~ð"7#ê‚öo–‰ðêI¯Éê7\”JCÞ‹æÛ5J~ ~I×e¡ã§2NÀ¦d<Ãöi¢q@ù@ÀùC£ÄöD«ÀÎz6ÎCqðÂ’´®ðÁòÃV•­îÚ(*ÑÐÉxѰÍRÕ½3ruÎCÎü¦[”6»èŽ-í& IÔûå+²†ÖzÛèÁh^–ýn]Fø”,ë»Õ­oµç–€âY;ÎÈûã¢ùN 4 %ÚØ-æwgźê}&ÔL6f­Z#¯Öœ»hgäYÃIcQÃiLºº¿aô´¶ªR¼¨ó£[j1ÐÆ¬mK¶xÞiŒÐG#?–lQ¢ü‰‹>¬ÄÚùnŽÎn{ÔU6G¹ÜN:rå þˆ‹æglÈ‘Ž¸ŒüïnΣhXÏš!‡2JNtœP:òL‡×ÿ°LìlYGdÃz K+Ž›íÚÓ- NR‡ÍFF¤Ý½XÕëEWœµ‘˜(E;цåñk4×LóqÖû¶G¤×Á´®ƒi©ä©Z#j¸Ly=hAmö&£¾üŽª .zc¨÷t6ú-ü¥²¥ØhĖŇš‡\´5rgÅ<ÙÛECF¤DGÚ+ýnœ&†EɰqÀ“IÚ\>º3‚œßܘó¨uæ²|œÔŸî£½‘»ßÝ ¿ì×#ÿ!:š"Q´²F©»*ÐûdU>þîÿGÿ“hZIpª%ÛC‹’˜ÆêŽB7ôL4ÖçÍýîƒ}&¾lÝ­‘wçmp†‹6F>­Y³ÑƒßD¶ìÉí5½¨ðŠ-käz ¢Þ–l­Ì Zžhæ .âúè0ï#Ñ zÐ…¦°¯ì ëtÄÉeTvÁŒãK Ë–¸ÿ¢T½ÞËe A¼WMLå‘kƒtªÐçl<){sÙËDGáµmÍšˆÎ ´';¸ñé^S"cã)¢Oàs^òŒ!*tÜ%ð»Kã~E1v¿+ÆìÔ^=ì!Kô†…áE}Ã-t4°‚ë]y·´@+G˜%¤}Ðô»«š†±ÄD7hå–°h‰‹¦ÆE-¬!'^¢ã”PÙ“û°U€½­ê¢d½|Ñ-û@ÝÒD‡Ã¢BÇ)öZÓ]ŠåFS;µ‰`žîµ¦\ –óYn™-½C[R†S´N j†èmíµ­l,öMá‹ñòZ× #8+·a){€'ºC&¿ò©^„Jµë˜ .ŽÍ¼g:<à=³ºáïÍY1SvwÑÆÈ=ÙÃ1÷úà¥2‰ÞØeÒUÅJFŠZ~6ü(ʶ›xäB³Ä¿š•]~gä­¼ õyßÖ)g$Kxø ±VL¾J:k‡3>|Ð,¤™#¯øQ”åÅÌþ‘í¬·qJŽse‰/ËM4×kãqfm(™š¥'zÀ*ÑEg,Ë‹©f–Ý2,›iTkÅ\t´I…·ÿÓƒ¹•UózKºéŠ5k·Ø#ɦ¨'ïÀÖýè¸]x v nª,eÇ+ö[´sJ²Ñ)]±cÉ–åqà>Ï–¼ÔºŸâ=b`Õ¾+æ£7¾¿½°F¾²ázODYæ}‰²b {_t…Á÷D78˜Õ¹ ¢‰rÇïïiÝDspÿDoHøhnyäÈé[pª{$ÞkÓùäÉ5åV%;#§uX®ì(´äïÐ[ä õÚ²^5ÑþÙøn]ñx飶b”§#ÿ1ºDQÒ/d·íì–fÍy·F®þÍÔï°¬Û ê‰a?ß@/Kö/Ñò¯áï‡?cJ(a±„>‡;uË¿F­½ýðþ%öhȆÖÞ­N¥ÑØ+œ~¸r-©y¿ ïŒV"GÓyµâÈÛhê&è }Y²“•~w&È@«)Kcé+x‹1€•açÈ­9wÐÛšóã¤rùhž¢zg§K'K±îìÔ3ÄçFdGÏ`zœa }ZK¦g0uЅ쎃Øg:—ð±Tr 7vqdÓ\ì³þ«T®“:e±Â=¡ß§¹>zàdl[¶sL~9kº‹¨Ý“MŸiBôÙÎ]”²ïödÿO¨H=hiŽ9rËö8²=°B·^“þÈé5Xo“n&;Ñ´ÉU¢ivÎÐ¥Pþ¹o ½Á—¬Ðq CVoÅ"¹¦é9¶l%%3ºg¡7MCû ‘ǧ³–²én1Òs>hV›hJâ&´uÀ¿°dÿ$ºñr‹DÓ,ÕDw˜UÃã´œ¬¶G}AωÄÉ¡[¸¤)»Mê§šÚM+Øk„SYËê;ºU]ÙæÈš>rä ÖK~gäÌ[¤Ð}Ðrr´¥–uLDhÂú¹¥ì‹5«hŒ%S Û¤›mkÒñu¢n2ŒQ<Ñ Ò×ÊÖÛºÑ= “ËG6µ“Í\t¶ìÂ[“$zBϦÐÚlj•.xq§mAïâM_á‰fÔ=Uü)[ŒªE¡Ï‚¹‡U¶Á«Qˆ)‹mÈù-ËšT‹+cäÕ¨rI4¥ :(lèÈõ.b%ð‰æ+V«5çºY#× eD0‰6F.ÚÖ°)Ñ´wO9¿Àë¶æÜCkÎE¶ÄHI¾ ûE7ËÜk–Fþ)º8ÎÅ–õðkªz`i‰îØv0Ñ·:J´'›v±K4íÂòùn–zP#¹ð%z)lè¬ Þë èòPæŸ*2–‚#]©‡Œü²†'+{øšÎ¹+;žÐäêYLwªº{Ò‡hïÖwwçY“hã»#hbÌÚƒ½\欉¯X2ksÙ‡6Jü¹'›÷OGþîz¾‡sw¹L¨¹ç¡“Ò„ž’@oíIBº[R6ãÞSÖ@85á^òÇvh¸$­}ZŒ Ã}þ{4=ß¾ìÃ5£[²¿€fä;BŸ†CdI BÝÐcð‚ ¡ÃÂ6dóä¿@ÈO#/|½õ(¢Áš¡BrVž“èÁIC6þnõ— ¶@ú|ñ„ê*"˜ŠÃ.Øé16ï/ñ9>c"ÀÁ+–LËÔò°GNÙ­¥UB#Ãïž–Õ3ÅÃN5rÒȰÂâ·ç)xÅfÔzRö¼/÷ÐÁÝÛL¯&•ÝÞiãN²9­¡«Ð”:Íú‰ ]ÊŒäfjÇa®€oÚ:ø\|­¢Tš¤*[ŒIªb Ý”½±Å¸”ÑÍÑM©Å„~¿›z>R¶ñݧàðà’žæÁ/%P͸DÆ>~…>k¶Ük‡îµìhBG®0VMÙa’êù¨§kY ü¶ìð.Ò9ï¿ES»lú¶±GnmA\4ãN hS¶ñÝzÃ3ê@¡Ï†eÍ)ûàüÜ59)y¢y:×’Þù©+{‚þ£hï»ö>¬mÉV97¡¯ìe_Óƒ_U»8µƒ»pÒƒDó9÷ÑûÁMÙI KW¬:û|WG+¦lçœîÑáÜÿÉJŠ—ÌFsÒ¢”Mß’/Z“M—c]Á º° Ý–í åZijf]£çX .Ù¬«˜ˆw^4ë×.3Û%ЛhÅ>h–Ðõ'›¢›Jƒèœ·S±d2¡#3‰mô/?4=Gd&¥ÐÄÁq™‹zþ;¤ß€Zcë _‚³‡Ù…W.ýý)Þ >a AÂßûuñiAÚäì9m­úáUßøð ß´ß™t O4ÍûLtƒ´lír]±ªO¡ÍM4Ÿó_£W<ÑðœÓœ°D7ø(:Ze°À®X-XM4MÆo—X% ¶ËmÆu=°r)ÅZðjmÕlÛD×Û“¼KtÅÂê\Øò+jÄǪ«š¨Ñh†ÒÍžWMÔhÆO½aÆJ±Z‘ÝDÈâÛ¢Æç½Y%_¢ ~=ˆ±j:ª`¤‡ÌE‡­Ë˜U›¸ð6Ùª®2–$,FÖH—^uQ#½J'³DŸDW|Dkå)Jí²øQF¢‘{²6UkuŽImFBÁáÝšt£µj ²©à³¡#·lÃöbU$žt •~Úh/ã~¬ïvÑÞwŸ»åȹ~hüŒôBxáœ¶+œïôö˜_nÌzÓ3œ%½|¦î—wº­i«ÎVo²ñé;¼5oè¢oÀÂGÍ8<Þtà kÖ“qÃݰ·Ë¹êNôv%š:ÔÛ´Fž¡FMó}ä[ ¶ú݇ç~dÓP£=òS àG65ò»ü“ÔË×ÅÁrfS6e¼TAcÎG^ã*c<‚BGºæç;X'ù^ëÙ²Š®XãÝôšØø&~_ôä€wIWcªâ'ú£ÑIßpb ù-pºZèö[t ñ}p"ÂÐCš®÷9+u  S¥ê£Yz•Ñþš×δMkÉT¥Üá]4Ôál@kq,± ±dcÁS¶­S–¡tx•%<9màe4ÔÀfûÌGá ¸U磜:mÁ÷5±ý0e/Òô°@ó%{ߎìp TlvMy…é3z*¾IwÛT÷%ªÚf³d÷œ6¨ï03Þ‡e!°2Áƒl„¢§µÙ—÷å6üÝqŒX·…‡0ÂÒðFš›÷¦úÝíxÅOîvx“ ÞphYp¾hK× ãÎzóLÈõ¨u†¿ÿ\ù–¼‡åLáQ‡}\Žíw±:”vi èe¾òf è®¼ª§]Ã?’Ì%Úúò s6FÞp>ÁRÊkÝDå4°dé>¤–Dʦyukè™C_æ‡Ë#OýÚÉi„eg7e¬Ö·%<ïC*|?Î!ÝÉkLÑÅ’]yŸøDsõ²«VœÞf[/F˜ú…¡»Í”Ý,ÙÃESÊS¡­jiåm)F­T„ÙrºÑ¨úžÖzOë»—c?ú@š¡1fʦDsíRpàY;ú¼JµtØÏAì¶‘ýZ ä©Ëï žž”#OšAr¦‰¶¾|eÖ1•ž¡7V¯®tåðQ3àdÊ4seˆ«†{¯^6,éQFpF€ÖÃSßβw¤':öjl:.¶¾C'N1v–0þs4?«=jxáÝõÛ,]ìO:Þ1=\Ŭ¦µÃ« YəХȯÀáÆ”Cƒûæ}¨)”èÍnY¥>°lLððrÓi[ Ó%·eS"µD“¾õ,§ ¾­í²;r æ#ÖÇúðc ýÈB‡^Þ 2Ñ´®´g ôƒï„""6FÛÓUM]HýS† µrPãI/ê/ÉÑ1éì•ØUÅlLzsŠê©[@pgÖ=töô¦¥»²|×÷xÐk¿ÐC:­¡okèÇAW‹YäPè˜6ÆA{á4N~á´ñŸà‘ÏYQ$U0QLÌUDã%ÏQp«×ìêÅÑQ¥@¿ÛC‹f’Þfµ¹²-ô»[è-²i*LÏBfãŒ6‘,À›4§ù;» ™ vÀÔxË/®]\áŽ~ðd/åð0OoW4mBßo]+£©V1n áVO4uaDiip‰6F^•1FµrÖH2ÛDžÝµàfk2¼¨­œhjü4Õ PÏvÖHÒGe¢©S¾‰ –¥ªõ[iH­–/yêäìóá]‰(,Ãï#›Åö[$‰G^œCÖen²œ«¥†òÑ%« ÐÃsÒ3 †EªSøÄ†W¯Öš¹î¬x•;ŸZ}½[JïÖ¼ukÞº÷åÖmÖu›± ¡ÏÅ%BG’µ¼ú´f}y³¾¼ý–%ðBëò¿°jG¡Å¬AUÌV—3vþBzõb© ›¼]\ ô… Ÿ÷w§¾ÏyVï˜èó§Mk-…>”ž+ÑVXü½+~W&š†Q†‚Œ`3Ñ´óB¢+NbÉæJw‹‡Nª¶@SŠl¡ ›uX·DãõNG#=%Íq,®&*»[ßÝ­9W»J¼[²­ºvG¾á%šhFÜc\ÔZ4‡c(ÛŸÐáŽÜØ©ÊÛ¦n£‘M©l5'Ç·ÁŠ˜&s&˶¸6ï¤#¢eç&Ó#uAÌÇ™ó™. Î0Su‚ôyè2'ºÂr\µ¹þ‡ÑÆœ»²ãYÄ:³ê mmÖi}ùNé´&nª™±ƒwQ%D:ï*‰Ác_Þ¢GjÁÙu_îÁeUKôÄ9GIA´3)ÙèšooÃí,œ§GuË[x £Ák®¬XQèΈ»(.h7B¥Ï:_þÂm’Ÿ†Ë.ËÜ2/úpwßåÇà#κpìêDîrÖ𜫘†Q« m-¸Ú8Rw@ Ýøp¹"hMG\²ã™D¸Ì^¼]²šê‡©‰nt½´Ùh,â…‘/Õ.Ëz0ÒSæÊÞM{Ý í,¸Êyé\³¿.+úJáÜti§‘ñɇ[|­ºhî*½ü–Tv³NÙû8ˆÔ@Æï0"cè½Oð—O ­¸µ]ÚÒ«ºPZcÑ¡'W#½‡Øfìù fQqÙ÷è#áÒvøé]®VzXz¾ é}Øó¬Ñ7í wÆ>÷xü”kbÕôÜÐì"$£iêqLn,¿@l$ÁÅFw\ÀßÁ³Œ³!®&Ϫ¯¤®„‘Þ}V ,xd?Ó¡¿ÂMy¿ð¦êÝO§Ì…ÃâL:æ†tBø†ìÉ)üÝîô¬Ž™€zFpãÓ‡BBÝ4Ó:l*ñÀ_>õåô•(¸±a_s¦Wìä“¡Ÿ¾tV© ðÑâr6ÆŽÝî~zÝ_äÎÈQFDËK§5 w¦n[ë¶­ËÉ•*–uz¹pÊ–ðw˱úÿ!Â/ãÓ_S®ìó ø ¬ ª¥ -ÇêàFÜçŽIð1±se6óè£ov};µ‚gçÕ#RpÞ¤ÖÛƒ~÷zôäca‚Ι$Ä¡ÆÐRé¶UœI_ÕšôL§‚ÇÔ”ÝÄxN )Á)‰´àΚum ]oúÖÌ¡ãEÖfUQ:½TÖä=}`^¶ÐçÁ–9žóim6…­Ïû/ ezz®V•ÌÎʲ?hÖeçMç|[+–%úÝ;|õÎÈyäxÅOwàÎ’É^¦™oÞX©n3’Ù6íÁiÛÉpO‡ž©äÔÚÝ—7 ­V¿tìiÐÔà­‚6z%lå`ÑýfÏÛ¦­ç?hÆó‘#¯Ña‘¡EæLS’wWª#½Q.ÝêÃZ²Z¦r'•ÍbßJ|£!©ûÝP-'MºÛ–£8m %MOøÓ¹ô͹:„vb˜[‰hÈ>ˆB^òóXóvD6Fí¨3zû² tön…"ùh]U¢ieT²Ð`ÐQ £å¬-ºÞÉZaÈ^X·’árxFÅÀÓ×.‚'Ü{Xútâäµ¢µG^+Æ<1.…-9-s¸pÌ?}…kÖ Ç=w¿¦BcÂ]dÎÈm4¯x8JiÆ›uZ§TŒ‹PèHnÀêéö¡+žŒ€tìr¹QSÿÈÝG´Gät,yÆköШ‰¦•²óò°8È@…ª3©h ÷Þa·›y«ñ™ã*Ñ´*iª(}AK]èøaï£N MRx16k‹ÍÊOóSO…wå¢0[_ð˜8º[3鹯}øÈ.AèN;ÇSx¸é†„½Í÷û{)µ½‚c¾Õ©è²)„Å|†óÂÀž SDÏ„ÞÒ„Ú`Ið÷Óñ~_á÷cÜ:Íd¿Wâ/ÏHýrÅÐX.ø¼ ŒŒz^ªdÍG^ÄJoäà!8ø”Ûèw½Yõe¢;ô@ͤ!Ø0\ð¨a¤C—?‚Ò"*'–Ú9/Ë+—pA¿P+ô@ÍK À*§h&| &ºÂd³)êJt…|Òrš…¯•.ÙŒ°{š*ö•MïƒàØ(_Ï„¨¦ß­` ½ÃCöû™Oñ èL˜âذ‚PhãŒÕâÌy­ÖÈÅaÀ_‰öFn ›…îÖw‹m–¥S̰Õvç+¶B·°ŒñDOš·”Ÿêó*Ê-j©¶Ì{¦Ê¥•l‚ gýÇp1 S[·)«¹ˆM³¦r䔓0ÑƉ?³æÈæïª&?c!˜áxÏ8u ´itÚ¶#¼?º›hœ6=o=:]ð> Ë`dEw²¡É×göò´„ãi[bî¤fz_Ö¬ÛhÚZæ}<ãáEÜ-§OߎbÊVö1KÐû YE³ú¯s>2þDmÆ¡üêÕNÖ é·aüO3© hÞõLö€_†£ó˜ù©ß§^mÁ¾SoØhJ  o-® ºjžpõ)dIzSÅІì­íŠ7œ+ÜDü6G>q*û8#Ÿ‹îø»§xÚèzÏÇÙªæw—í²Y-áÿ4zÁ²Ž<“*©ãp~™ùðȹ¢c\š¤—ðÒaº¼àΪm)‰aifwèzz~©—膳L·¹<áËy]¾èÓ¹–°^¶s{*ʲü~ŒŽêRVÞ!øÑ í™.úì»òd/ùYi.Eð¸Tœ±´THÍÚpíŒ\´È40¿ªãJBêg]òcÐÄÂ¥z`ê¤Í‘ãïzþmœ1}h{Ì)bÆw˲fm©]2=¡+v*㹟"ÅU@B+¶•B í­$š.è™m§˜ ¸F=ÄÆ›mg†G›Âßû€ž²miÕ(Ù·ÐÛØm–NN4M­Û"y¢wð¾‰âÐNÞ–jÛVÐΔ$ùôàý±Z{þ‘MVöÈÍïæÆj^qC5®Pkº(_‰¥k ŽK®–ÊyœöÛ]Qèfhæ’LŒv'…wXt¾nµëe%…îì˜-ªHzÌËQhœ™Û‚ãÜ%ŠoÊö¸nÕýðj]hUýYZ¡Ð‘ŠÊxt‡ÇA£{½æ­Z]F˜ôð÷Nc$¾+êŸø{^ðh«é7¾ü=¨õÞÁ S"»¸2ïöRé—¡›/X½6%nctu”LóNjëÜr…ÓÖg)œŸ•,;cM/–j˜ ~ãµÃcP+œË‘Ïe÷¢ë˜š`¦pQ,ÐïÍ’ÝÄ}øtþžFö”c`±ÐÁg 7kW%3+ÎX*™kÐù%4v-•ÌmèÆYª[ÿ%Ñ“o—³FŸݲ׻¨;Ôé‰f¥‚‰®°G?›–lÑM² ÷ŠhDX¼ôõ¯<‰v)ß<ú¡Ãýòî”ÃýW3›8QôÖ1¥šÙ‡ .ÐÆ~ïõ£`V*øž0X,ûÁØëËò­bÓe]iËzY.9q¨é¦Î||«¯¡yc†Ky™<µ¬ëp¥ ˆ¾þÐÌkÁqvŠìÈ F¥Nœm]ˆ[/SêÈôHj@í¬ßb-‰–šëð³ÅíA½~;MGú¶Üâ’£»u« ›º™Õ™‡ö€XJÜZ0ŸVèP1ÔØ‡w¡ZêXòPÊFÁÃm‡.á f}„ÓÍž]f:·j-ZvKÁC‘5CNó†Þ­¡ËÕÊÚÜ­ì82±ã.Ú8ÚYh}Ò¯ f?;IY¸ð8+Ì'±ÕÞˆ‰>°1âþ´C`_.¸3t…/ñÐ Ëu«#õ¥l¥Ä4ø¸gän啼OcÖLa+3dà/JßbŽ¡Ï€ZÊ®0j_¾lº]"#æ¡ýuvR^ÓTæ})¯Y ºÐΗgH„ê ÉÈèBÚz×K…½Ç|02¢ûE§Â‡5o"-`a …bbÖ¡n,jƒÀ|Hû¦!±0VÊ6öËRî=¤ùª¦ß­ÜuæËøÈtÖ”ËÌ"Õ‰Þñ0Gèš„¼,i‹õú@VÚ­ü©¦¾ mÜ…ÕRmÞ0•ù²'Ÿµ,`‡½µ1`•šj2ç,ø 1ݪ[  ø{1—ß¾IcøÃ Îm¡#¿*ˆ¦R ª^ÚÃóæw<ÞYcužBãòX¡K¯0í*áÆAiÕ1?šü¬xèÍÙ«‘0Æ/³@l´_w…ñŒ­t3cä¡^¬!±»!¼?ÎUØn’‰¦­¸…3}Ýګݺ‡m,YwNxïÖwGäîÀ¸¡à1t½ãŠÆ©ß‰¦MÄr‹,øÂèË:eKŽB|NTªI=?=]^,=q‡‡±”]£8fßH)œö$@fa¿Dsµ<¦³fc9b,çˆcÉ>*…6@¤‹m$N4ùM6ƒ»Å”my†gáÄEB÷蔕Ï:BÛ²«e¦ÏêxËfuÙ”g—ÞFA†ûªtF6õNuòì&Ú9'Ý:'Úôa|j¯²zÁ7MÜÞbt5öêv\ùÓr`dr ×ùhZ»on cïI´%;ÚúRÙ*¤¦Ñº팼É|€BÊfì‰>°|IèàT£.„€¿¯:Öú!Çnì6=ÄY¶Ó¾Ì¦ô)}9Yé¬ë:aEÿ‰æá“Ìße…[[ܤÆNŸÖœOo³Mmu¼ÛŒž_û2£âßÞ—omVx™íôÆÃEÛê°Bß'[Ž>–GšèŠ=»1ò‰Ù.¼]Y¢Žal1LÐø‰?rkÖÂZ¥hËxIÞ‡ÎZr=A£m{÷héâ%KáÔM¸û7àøÓMééW†æÏŽÐôÀŒ€—Â?}zŸžuÐt¿Ë`,6CÇ_¾¾ÇgÙÛ&Úº 7Æ~ÞÎQhÊ ´7r~›ÛhgäÅ:hÇ2%ŽL‰7›;ôfí—.:<*{XÇìLkèÓÚnžf.áí?½#ŠC½´Ç{¢ã˜®çÂØa¸sÒÇÛÕF‹0œÕ?[ÌâÈž°$÷\nYvLO$Ç’±§ñ‰jkÅ;·<¯ðï…Gü²­Â€Šà΢~­$šÞƉþÕÈ‹ÂÔt·…ÈYp?Ñ”<ñ¨¦ý÷g­Œ¸’KD¢+¤W¬¥lšÂ›²Œi(ÇlSòB¡£›½éŠY*¤æ8áˆ0n”š´ pÁ_t|8s€[–Á<)Geº‰½®x7Ð3Zu™1êÚõØ=ªN ±¿D7˜Ž¡ô—xÁcRuLXåÔQyÁ…çSÚ@÷š‹vfÍúî(Œà#osÆ¢¬¢Â²Šs™tYÜð¨4Ïy3ÈIÏå²eOÒ#.[ íì–̾¡ëí¡õgçÃáK÷ù±dkÅ\Ùa¡ÃSÒç”ôê|wÏÌ@zÀ/‹.zæÂíÒuDYU¦ÐΤOηx.-–m]ÿ*-h0‹UpÌYxâç]pú.rdz„†šnÕa$Sœ˜/ãŒ2ê*ͱ5_ëú}ØP—͇ƒ—N›ž²¬Å®¶£ŒvùÜâ:ëS¡£ïðiÝ'3c?ô»K¼è¨¯j¦S˜Ž¼Zs^­í2uÄ©«kf /T.ƒqdSt·&Ýzg’;ãUOôˆ\³_È–‘NÍ͹xÍT¢+dñPhÔY±Ã „6®Ñõ8²—ÈÁé³*Ó­©p©K,ë…x”8Ì×{-ÇlZËšµm­Ø¶v‹å.Zªj¤¾èuœYÛéð÷ØVd•êµ­r èJ4½wwvj¢©¿ÅƒAMôÝ}¾Ub¿(Z!–¥”èƒ÷ùžÖwEjB;gì8·à¶œÉÛºC·§[¬ï>s™è"NIjîƒSèHäèð.Â%»ôÎtÚô¦¢*ù¤ƒÊî–ìîĹ"¯ãøÞ±rMÝ!o‰ÚÐm˜£ÓŸOr“†”L‰wY±@'÷ih]ÿ(–èdåè×PE‘è+[¼ ½-ÙÚàVî"¨¡Ç$ÑÆÐ“#9ªíÈnJ\€‡,èf7#« ´ò|*{%¯3…ËðA-‹º8•ßIG†Ïš.Y&QÍ&ÖVØd=àY›GÑÍ9e‘àÃ÷Ëe/åèxÿÓÖw‹¸ ±Ü\ôdïƒ@/k½¹ñèmɶБ&3Ê»N—ñÝ—}ª‡fÝ™dCM¶lvˆbþFŽ>Ý,ÙÒ(èaí5iÔ&)ÐÙµ_éÚ(Ævéóá]fbdìÊ#4Y¸dIà‰^Uáu-|‘“-ÑgácÒ-µØEAÈ%ÚÙkÊØlt½c µ˜h”vÑ›U6¿è#ß$]±›¿ûTLæ|Ñ|Ns´âiÖw7G¯•lPWÕiÎ^3¿»cjßD{²)ßz ¥™ð^ÖœO }ø¬õ¤†¼ÝÝz¢ÏïД=õR ey°è`¢i´¨ÜvØl½?h–=P”èBµâÍôZ¢'KÉêÊ*Æo¢ry£d²?4Jÿ»è ÝÿE):Æù–%.Ñ5F:hãmP.ýîìŽz`uU î s&¾>xŸ›h¥à¡‚Í@·øn¨JôÂg¬H;0›©\â"ª‹:á½6­}>­ï^üeñA³zQ#lã„nK·ümì5ã%)r c§ÖÇy-–ìêì–j¼jMs&ËÍ$Ã#ïΫ´X08XÄ4µYïÏ‹†T—^ÖfKš *Ûp‰&zÁ\òrùš˜“ëh>çíqf­‰aƒ®X㬖‹Œ>%³õ8s,–Ë‘…W¬X³V¬õÎÔ`*;Ù Ù :±‹R¹vhÝBkÅ”:HŸÐ)›‹7éѹ7kÆ)™Öœokä[":çÛ1Лn"j¨&/ýînÝ]·sæ–›¥Êd‰®0»„‘n*¸S{µFn£7ãz¾èÉmì5ÕßQ7t¢©V 4MæN4ä°ý9µ°ûÀ|ËÿÐ4+9Ñ5°´‘ò˜èS„Þ4#º\ê?VÒôA#f¯‹6Ö[hÔœî¢+˜˜håÏ#J“‹nØÛÌÿDüªé›—}FN­ž‘ìyðŒ Ù-ô™lAeÌ:pÑ´f¡ˆéq`Í4ô¢¢ž¢‘MÞéœ+m€U•›|ÏÒcŠxëpèm͹҂ðz' œóÙí0•<7¨l­}Q%qó©p*õ;dR0ÝkS7=%¦ìýC´^±4t?+»Á„¦‰a+½¶tн¶äÛC¼?}𠼪Í fZzI">ô@‹Ñ„U°¥sþKtR-Â8è#rO4%C ô±ÖûàÞô}XW°oŒüœþ¶Gv¶½fŒEE}«ùNõÑ¿$MÙݱ’jÜÒkѸ¹X‡U¸6ŽI2Rgnf¿SÇÃÑLG~g³=D©£é'ÄuŒKT\¤”‰5Ñû0VÐ.³!Áȼ¯Vvl¢;¬òútÈŽU•»ù¬ žªQ#K”²':\àtÅxÛã®ÊRgÖ’ ®˜d†lgäÛDׇRïê©dùRK)P£ NÛÀ¼è› wzyÔÖùRø´ÐÆ%?^¡bÌ^¬Æ¤û%É©rÊ„h–ú—hc³kÖ2aò"Ø÷/Ñ‘9@W,“5é^ãýŽ®lZª‘hc·Tk·x#ç )®t½;&r÷G>,ÙùÂmÙÁëýÙ–ÁW8qÿŸìJÏØ s‘¸$úá:U1pÔ4ðO6žóeÍ9og’hOv<¨VT$™=¢kÜAÎwËn9֬ɯ‰í5£(XhqcÁ¡‹r¸Bï¢àdžcÏ"¯Ÿfê,IæÂ ^óèž#:ÊÐÕ¹Ëjsvk휪!Ñ –ÈÔÛ‹Z]Õº…«u ×éhÆD°Vc×[žã ýghËïR­‹´êgáä/ÈŽZnº]¶t}•¼žðR2ø{¥´‚ï³€— ¹½j\¥L˜9™ðJÓ6¯ôƒÝé§Ž*¸÷QWJƒ|Ñ‚GoshIø“VR8ìÚônlš´Xšq½Ìꌈ·Þâ*–Œ¯gVÔøçQ”–D¾Œtâî ¾QƒûíR}+=ëöÍÂðÒ± ð:`5Â…7¾ã{¨ ëÓùKïU¡æWIŸŽmÐ~:¿_†w\sì,ÛúΜ¡£cð‡s².e±Ö[ÙGM¢¦ö•øb û»aç ÇôöŸ¡3V^uÅq.u¥’b-!+ŸÓ,‰ J"m`¼ÕT+< 2 r~_ ïšQçc¢\³®À%5!»rp¨ùk~w1ÑÎ~ÉzLV+&4îûUo=&ݪ½ò:óõÁ+`¡©jëJ£aÝ….Ï„äâäuNxwôjÖÑd†¾V²E >áÛùûSÌÜQq¡ |‹w%Sã'ZÜð¡Çzô¸98Á0„—‡uŠxqvLtŠ1æ­yóÏZ:%¸¡al´3o]i_Ôm{›äp4n\úAãÞ†1áÓ»æ×ÂXò…`!_;µx‡î$šŒ3TöÍ’õ¿€v–l‡ZDzOšOtÚ1§®·a=¯†2ð‚ŸÈ¶£aãùÈ“@ÓRfÆÛéVŸÉ7ÌTÅ;õ¡ÌÆ g…Žyc´1)|âí&á<Ã2à¯À*SªJ¨±w^Æ\#ùʹ‘¦ZѨLT`sÌ\Ö‡/oÉNÃYsËÍ˨).üÁ/ã)60ú¦ŸÒ®4ó}ÝæpèË{é¬ÇZ¶,Äf•w5Ò ¬±WiHê‚ZJ Â˦wµßVs.ä×þ9Ü—²§õúðB•Ú•Ur×ÀÅŠÓTî¥ä\êø[ªå¢)&k{_nÃßU£1‘u6¦‘¨€Ú‡¥FG­w·ÓD²]RIÀ‰ á{‚vµVm«Ì…š¾»y›S%ó¢7á¶SGõîÞ‡KÃÑ'ÖµU³A³²·ìGúBÝ˹”¶g? n,ÚáüB;ÂÑyÀF'%+Ü0ÇSPG\Wô:>C©ƒ´¶ú(Ç€V»Ï”8i ÀKéle7ã5?¼S•ÐñÔb p- '"ñ ÄÃày³«áÂ'ŒyÿIg›¦E~±õíÍ[8•1°¬K¡cÙ™ï lbЂâ x'Ðé¡­UÛò…±¬ž„¿š=4[õX¼rá;È?(ü}$ÓO4UsÙ,[´©.ÀD®y-±hÌ (_9.Åú½ùe¢oÞnõ†®.ke¤ -G¶nX½•4e˜ÛX/ëEÒ;±¤ÝϺ8]醆Qrž÷T®,Àsá–δ¬Då‡%ê1‹È°8¼B´EAæ»áYÒr\£8ÐB3g¢ifsût[ódÓZ»õ݃Sh'ºÂªé¦šHêèOtÅ–k½L´ÈC©r³Ñ§Àp`Ên0èÿ ô€#íÓàŽÎšæß Ýuô|g“9ÖÚ§ÝfkÌYÜn›8z¾[qV¬çe™Þ¨vÈ:H¼Þ¶ìŠmÛàŽ®X³FÞ¬õîÖ)qÑ*º5†n1QáI–b›–r™Öv±Œ‡f]ÿÍÈÈ:OxÚ¬;8ªÉJïÂìí‡çm[ûÅ–m 7m™cJG/ü} 3n"¡½/7Ðý±>¼‹>”p´ÛΑù[ÖÑCf‡OÂ^-‘E|ÔÛ×›£a¢Í8*=Kê©ÿ¢n¯pcìF¿Ø/ O‡„õ¶l¹X"ÐïÈñI™ªÊbµIÊÃŽà>hÙaî—LŽ ‘?Á'Lhñ³+ìP˜èÁ•ĶæÍènü9>)®ìÃÝm};g|èF¢~å,_¤ß=ćMÃÄ£ZjyTÇì¢W¦Ç‘MßùÈ‘]é Þe8’ˆÕÉÈ‘¬·P­éMœ®$–2— ¥"mª! ZºlËÚí^èLÅt Öä ö>û”’alBó6‹£%^•~h+Ò–eY|¿MeÓßlÎ9Í’0<éÙKœŽn.÷°k·µ'Þq™¾ÃúȶOM¸c¶*Ó©Ùª¢¨‚ó1vqæ-Š¢ OLØYõɨ4f°ð±¡±oþé-üóôµ3ÿ›Õ/¦pÚLm¢£Xƒ&îîªè¢×þÀBº èØ§'<ù(©ðå ÏBˆ>õ¶>EÛꉓ:ަ±sÓL= 7>½æ~wàÆ§[gõxÁ±OkÙ–õå‹·ÖûÒ‘½3Fáj4 v’>ƒÔ¨.çГfõ>ü½×X*SÏr¶ ŸŠ‚ŸCÇßîŽ}BËÝþòÂ÷kÏ2>ã˶ S2=2×â¹vÐqI¸3ø¬Ad^<Á7%c¸Â±+…{ô,A<˽«ˆFäzðOèÕB§==qÈëÁÏæKrýƒãE_Þ¼¯P3ú@‡VÏâKcÕÒˆÕÔö&n|ùÞç">lÇÚ°G$Cð¬•Çúð(µ„¿F ³ÜÅÐcL[I¦úÝU±L¸Y£ò³>°JºGòhzàv+"¢ WjÖ—g{”_É%6Qh°ô¿DþáËÚêb±þ©ÜÄÒ·5vô¬QpÜ:=Ñ“o˜‘-j7ëJ©I&`  Ù–VB]C³VÇ×o½þݼï–ð_¢ÅEÀº .cÖRNŽaƒÔ¤U‚º­.Ñ*±àŽà§Â †ž-H;Œú ¾;d—¼Â/Ï;úI7>½=.šÒ*†Úíáãš‘ý Þâ¬ß H,»(ìGOÊ(Î’K8_ò,¤FÛ¨ÖÐ{Ö³ÑyëÖ†ÉSÖ¥«ƒã€LýÓ/ÚâMÎݰ»pG¶ÓžÍF—ÿP´ž³ÔÊŸÕÙ-³Z#o?DëEIcWSÖÔW—hcäZoBFûžhO¶Vxšuûì‘€lÈ^Ö^‹*¼‚ý.K-ÔìÚrˆ³Êêšå~wÕ5ìëÊ’(V)!t©VyôOŸ(¸d;7Œ§-`z8MÂr¡#oÖvš&#dA}ÕmQj«æÈñœ MŒ»[²»ãäÛéX5d[#?”X´Ù!›žïa|XgL ñ›±Þ¬8Xè` ¥²—5k˹ø—è¼5r9ùèS4Ñô»Ïã£éÈ}Ùü68ÙÉ–ºu‰&šuÙIôÁ΃c½çŽ‚º4k%»ÏQ‹í§²ec³*òD#÷кÀi M¶ì£Q›Ó­9ï–z°eËTfèá¼þÏ´F.òlšQ—²±^seÚl/Ñv÷þÂw‡v ²—õÝK¯º[Ô‰udÚÙ©K1]Û<û§hç»·µbÇÚ-e£AüsÜ¡[hgÒ ôPù1ùÈÊéùé¿Þ¢bˆEeMs„ÆZUÎl4^ðÎImGöíÐÈÓ„&ÚØ.Óz¦0ÞÁ/ŸJqv†^á«ìáüËÍ>Í5?ú¼Æen¬8  Õk7Hc"c1:€ÒYsÑœjéÂi¢¯B.8ÙVhkìªÌc¼d9ô3^ÿ>œO¶ó‡*Å'¬ßø:JOXèˆRñwÒY"a¢)!„ÐÁÉ5DŽœÕÆ u.ðA›è[}dÓ3ZÔ4Þ'EÆÓ¡ë6{‹ Âé´é=Ì*½…Þ”¼odscJÆ›Co0áƒf)³CUævR:Nù¶¾û˜èÝðUV”ÎÆbŒ#kó+ôB¤ðS¿€Ž`:<£Q¯^š> –uáüÆØiÜHhœu2²8ak¹G±Fi âlŒ.|ÍÒþ “®4B–„(tÔyÃCZE“ÃZÍ}FN­üÚœ«P„¦)ѧ«¤~Žv&={¾R[Yl {ûªxã¨ÁZ§´ š%¼T˜æ$BúÓ±ÂF;Çt‰á÷%|[úÉE‡Õ1ŒÛ5ŸÓmSËð»ô”Mçñ=®Î«tè—Â>ÇÛc)(Á¹Š Œ âC¨ø•sÉà9mÅÙì­˜nh˜äC`ËqÏcÙó@$ړݰrk-KX¡Ñš]ïñvÉ¡ÓÞ­I·ÑjhIÑÆuÖ†·dÃÚmÙ7ŒÝA/mø­Ú²–lyKæ}¸e<µ4û¨ZÝÞ‡«ë=õªûnMº‰6náDó9WGjcÉŒ?>[mG9(T1ºèÝ ×ËÏGn~÷þÑŠ]ÞŠ.ÿ0—ý$šÒgüø»“Iîµ®ªj>$úY  ä~ÿÈvfÍ@ ­- v¥1ÞŽD#_&Zí'éÐe²Q×IW…KÕÚùð­f€T¹M_6æÈ娫T¹è"£á®È4 ’'Qä|‰¦yÞBGC¸Þã±¾[„Ft½ÍÓW“‘ˆÆ8Gå=>hù 4í`="œœéz«²žj¦ÑyGàD»²éùtÃïØ‘¥uô|‹¦…F¥Ç°v‹‹ŽT:çÓšµi\™ÎŒn^èˆo²zF½ L¸óå:#NôŒïÕmL €qœí6G9Í'Ó¬¡fœï?שœ ®À ­†˜5ÛlÂE›ÍÙo³9i[ö°Uhg¯O])Ô„˜]ÁÕ ­€©›˜ÖbÌa¡§…^ê3‰OЧ™g¶!¡>ˆ¹]¸³Û'ÜSíóXêUNišK9­‹!èâ<ô‰¾²]êÀ÷U.=+«X+þÂݺªµ[_økÆPÃu5kÉ[öd…ºù}Ñ:‹Ö­YïQY@ß–K锓.™;rk¿ÈÇJ3Å_t0 Ò×¥à »ÖtªìÖ´¶[<”:ö“®m š±·³3mz'Ñþ~œ‘ïÇyʦ‰ÃÛÒê»Zßo*[hš±­—ÆN¯£@|JR6žóô|Qôà¢ãr ÒÐU¢±lËÖÞ–fÚŠƒP£oW¶¡[Ž£Ï·b0ÔÃ{,j¢Ë?‹®N†ùñ\GGÙT¹$;" U^–@¨Ž\G4“ÁDwkÉþi´\0 =¬Ý29­³ÐÁkE=IÕ‡§mf."Ým"v¾ÜŽi¶P£K¾¼¡/kÞViÐR÷DSÓ'óW&ß>¥Ûš5ÝïÇ´ñág`~wöê1ôÓŒ,Šèƒ†ôÓLƽ{j}„/dC\á´Íó¼t,sgÆŒíé~õ‚?Öj íÉŽ>ÍtÖÔ/˜”y‰ Y$AèpβZ÷)®ÁíÝ?4ôìKeyóYm ßPÁ$šæÇͤëÛ\C$Åc¾¿pÊá.øî?%…—/¥;ö“ä”ÀjÂã^ ªY—ù¢§ûkGÉf (SÄuà̈ŒÇ\äq4‡æ#œ*ö¢6Ì\ÿȦۥTÞ…öƒvdwØq`ŠþÍØ.-‡ì]›èŠYQÀ%Ñ&š–ÎHí W#ÝkSEöð2,Џá}>ÕTä `ÚD7lzQ×24‘J:§$ƒt§.kÎU Â!m|·èúX%ésœ‡^úd^Ö:–JúA3æY¡Ï‚¥SÌo¯wR·±œDWüÝ5©GèÈ+/™Ö¹,n%xx9é‡ë"céwè &¾L±ñ¼æ«žÑd@£–KUXVÏ™hîø©ÙC†î¶ÉëÔ]a5h¢g$30´îAæêK4­öþȦ«zxi¡Ð{Â$ΔÍíûªÛ„º/ªÁD®Ðì{‹RcSÊ #¢˜—’‰Þÿ)›žÐ¦WQ…{­5çŒ5õB¡÷p l÷$šz|ZwÎw¢YD+í̹‹Æ±S6·\.]o2Qk1GÎjwäÇ~×ÛAsÛÁGsc±éþ¦«'”ž’•¼ˆtÁ#®\°©z¥³J³yi°XnºÐ‡2QMqIyèÊ•ò¶6Œ=r}¬c&VÖ+ùƒfµZ9r>ç]ÌÔ¹h~Äûãìµþ8ª.ç5U{±Fn9’Ö·=rCvµdÛè͇@Ï`” è=°fêÍqlvÅñ飪ËÀgyÊ3º#½»…Þ‚/ÚYïa¡³ikï$¸sL²uUMºéK6~¢À‹Þ&êGo2 ¯|ÞÔ4oVÍ5øúæö‰nÿK-ŠœiÖ=:çÃG‘•ÎDÇ}à…Þ«åQÿ⨜øì#›úƒœ¨F–Eû²éwgžÎùý€w‹jWils¨-+M›"é)\öíBB?|ZK&4 â¿ze/0Ëq ¥–S+=Ч| ÕÅÑÏØÖvyÊÀ .ŽžƒÂ¯üœÍ¼ŽàÄM%³rã)z¡2°kVìDo×iÝGSÑj5ÎléEGÞDwOGAeZî4ÅÑÓ±¡?õF™ÖU3}Út͆æz¼¦ºTÓD¡)½N³Ë§2^éE>ÅÔOõºø}ŽiO5*¢‘„%SZ«8¾Š%[ÎÖ>÷ƒ¦O”%'½LWVSBÝ&”‚•úœ³Vè3akÍ”My‚=±R·¿[Õ'ôÃ¥ÚèÛlMkèŠ×:mËZ2å~RcûEŸ «!SvÃ5;þwSöuÑ8‘åuœPÀÊFϽ'ö½$±5»ò»‘s“o?Žì­€kb6?´@ÆÈ¶cä)·ÞF4¿Þ-ç3k4i5FÎssäTŸç^£%y[þMZ»‘hZ…°Õœ‘zG_tP¹ßgèôu±‹9éFÉˮִÙhC¹¤KšªÅ8©SÙF‡¿‹ntɦ ”[ŽgÎ Ù"ס‰ÂÉÔF-ô@;õ #gÝ4>h¼×šuÆ~+Û™óníÔaí–ñSÙά kÅ\ÙÎ:-ÙÓº3âDGžÏ9:òeÍÚ²Ö;ëá9Ú¹‡V #¾KŽS°U.CÝûX{Íè†5Élœ±DÓ„•ó8ß}Š…®&zÓnXß@w39MeðöO:Cúø?bÖ¥ùpIãH|§Y§D '4ð³F}àGE£”ö*©iföQÿZdDŒ ÇŽüï“ιˆhNy> G²OÖ»R´.pZÉwTþ@kÒŽÒ6°zPö#õÏ%¡ƒî|«J6>&ÇÉË:Ç©P>ò OªŽÆ>2šhÜá$çúîuÙYRW¢'ÌÑYÉ%Hx ß0¿y‰‘fò¯Ë©‡Ñ7fzO˜ç’²)%Mʦ¬v+¤:²Å¨Ç‚¹‰¦7Ù)Ýä#W_Gf5%zðݲ]tå#·eècüÇ询Ö5o¬(xÄ©àÐM-—µÍ‘aÂd‚¿'œ…s¯pcÞª5o?®7K§..QÚ=ðU¶. ƒ'ú@ƒ1Ñ “?#gÕU‰¦e+VúÐB¡E°J‡.g4^p]¤x³%A=KÑ<ô UnBãÝ–h:mÛÒâ`Oa%cEÉ 5•/œ%£]øÃo${ð‡r¬-‘ê |T^t¬9yUjÔ‚:¢æÃŽå_ø“„>_Ní§*†êÖ¤2¤Ê±kֽ͔è¬)¥œÞgµ$‹2|Êç‡3ÇðŠôgɪ7ôêXO5M^|RôåÌcv…s«³6Nv*´5í×)åÐ7WÌÍ·ch·æÜåU‡ÄÍú Ê-¼iÿ ¡Ãp¤ÛE¾#ê3 ÙÆÄmÙSNq:çS)Îtä"KcýC…Ž.½ø"Îú ªX—5éËSËËS+tõªÚXr=4ð!UÝ #‘Jôtd;ß½ãˆcóg{ nãò„Ýœ7 §”*˜cÉÎÆ­ÔØ>œ„Jèày¡æKËÂ|Vã-xTÍÀ+¥eÌîÕöX[݇ãþ©+\ ‡r–]Ö†ùJ w¾\¥ô¬4=k;¼‹¿0ôŠ#wÍ{ä\>hzV*'“\btnøiÙ”èEMï+ê 4Ï hjM€•£ÞvŒÙx‰‹ÚøîìÐc +׬].;ºS{н1ò/õ>= ’g|m|÷äùNë²I3š˜u9™i4£©+¾Å—5òeí–Åú¿!›ViÛ#ßN`¿mkŲBœÎÚqÎXx&æºÔÂÔ Ñ ç‚L´ñÝV.EôÒ×p/ÎNíFDÓyB‡Ã‹®·,<ò$É¥#W‚:uõôhè†-ô¤¦š©ËNeY¿Ë¢úÐî‰æwhó›ÈD˱Kƒ/æW7ˆ ¿€Ýkžcö…¿O*VK¡gÁmôÀ޶®üÖz$Ñ”FI?Žr9Þ‚{vÏq²!»ü“xÁÕƒ~÷xœÄº¤¡¦~ ÝñÅñØèP.–lz‹ù÷¨Õ4’_†îµÊYù–x¤+ÎIlT²5iÂÍ{ºŒ$ñѥبFrhq½Óýc§µ˜N‹ëóÓyhWÂÅ¡ÁàC3ÇØ³|¸*IèM<ä®Â‹>Ý¡ kg¹â€õŒíä _Ô>T‘É8î¾€¶Nª'\u0´d')pˆ–> _\igŸü=*TÁ%õ9c=:š¯Â/ŸrÖ±vÚBG‚>Íùyáõ…3ö‘üòƒÍ7±Ýól§/À™“íI#ÛîØk6E@B³WÄÔo|øÍ¿5àΪœÖê/ñåG_M:øf݉SfÔ~"£VØTŒ·P´¼~Ôw6e·c%£dPú>ÃÉF˜*bÆ»-k¯èw/uÔ`”þ@žàÌ ç`ç‹.’·&Üùô­cÊš¸¬Û#Û©† õB¿ÑGÀËŽ$ 7l‘•̳ЊZq-M|¯¬ìC‡®.ô©”²é¥ò¢Õ9‡}s?u VKܳô¤,]ITG¬h}ËiV³>¼©Q5–BpÝEGœžÒaM[2ŠÐ‘wÒ+N]Ú¶¡UôJœG² >]ôÁ¹ kz‹6­E›Z´F5³º™àíº¼/_®ð‡?Í—B§x·¾?•?Žþ1ô}»d¹ÒŒR{«³µ5ù_tXØ 8¯ºÛaý}ÙÓ³Co‡"· gjù¾èÒ(‰ÂãF§ŸntŒ¸Â6 ƒÎž›Î‰ÆG­éj™tÕ\á†~Ý* ÁëDÓhÞºXhýÛÞnÍX"Öí“7N4'ò‰¡ Iúò35’ÌߘöÈo¥²—¶ Mh 6Oxøºéޱá{Ó^–n–åÍZâ©@ø\ÊN4ÕsŸdsà´YØ…/\wíøSÏCGC€Ùˆ…6¨NÏãŽÜBûT0' WšôðÚp–Ç ß¼rPÂ9KÈ„_~-W:öjyÚ³ e8éí6„Ë©Bw¬²ž^_j»žô¼Bõxz6ºè]Ù`´XF} ¸G(9òñq9ÑZrÅ;²=tã 2ù6èn͵h»íËrÏbZ‰î0n.ô{§±Ûø÷èÃ#;ŒF¼×¾€Ó‘=þ4ø´ÞÑZà4èJ4åÄ:Þ—Œ/5…Óë0ÑT+'zÁ¤¡ƒ<ŠnV•O² §šu&Jtá[ÝFWÚ9¤ÝB=áe$ô{JX1цzQt‚O‰=kÚ9c ãªH?£}øÆœÓ®†ÿôŠMë”8ŽÒ}[®°÷E¢i›ªš`(.|À§ÕWÆn_>œVû îì×mí×mÝ(Æ“òmŒœË|á»cÅŒ‘SÆ”M O?h¬Õ%ÛxÆïˆùáH¡1‹³Ð¹c•Q9ô+nÿ„äz¹ðC)9ö*Š¡UcÃê»…V‡Z&ÂÛ²à•6“Hø:ÖÌ9ƒ¯œ2tߎVÔî,r$P‹Y-©&öCdS):üuðJ*¢©g©ŠB—^ñ}Xd33§¼ÐAÄD§-™æ©‚RPôVÑûŒU©¤lÊ0#tìU|!NKøt®ò2þF‚;+¾LtÄp¨³ð §³¾žg¡³™ñDæÀöVíH:¼ 7V½Ê£ÏòìiE}_5-0–Prá”ûÂ; ˜îÛ㈞–èÕS6œ«¨j¨ñY•+ÈHׄŽÚÍ j]juXCòGàEª.§Æ@4Pq&w¾pÓZö%õNÝÙÇ„>Xj2SÙræ°dAå`oÚyFèH¢ï•ª{‰†Ù«jU Ù0¦³ž5¨ðD7xRš2,#xßnԔȑ³Ìýlz)µÇ¹O›\2öŠ­– ¦ïì‡q`]»àFÄ·çaCoÜõ¨/ß*æYÜŒDB<ÁGE·k £U]>é‡7åR*;‰àik<§wß^ ŒÆ+?| XË–ð¶!é'yä#ÓEK õ67ƒ¥&e/œùõ¢Ë¢‰©û¶"¡þ·@óxTN:¾’4m4èÓV ,Q]8nÖ¸£Ê"ªm‰ë¾íDŽ.µã‡ùk9‰F‹ÎûÖ¼ÓìЖaDªbNl™µcvÖ`d}‰æ;&;L`ÙÅÚì¦på)2:¨D|%õfMº2 i¢ ¬æR3Õ¨ƒÇ¤‹v—¥½ ï3êïJ÷£a•ží):!4¯¤ß„ºäêô€7kö˜¢h] T¯¾?ΆQZ µY}`lŽœ'ü}Wló~òòÑFÍ@óï\­T§ƒõö p4É…—ÿ‡ÿ n¶Q=á6ܸ†˜öhÅÃP ÍWM*ë'·? þôZòáQSJCE—¬cdÝ›¸èÄM°1¬¡kÚ†¸# 4ePUǦ ݥך2ši(i¨U&ž51n°Ö¨‰ž8Tý ÷XŽLC§ú+Z2cñþê‰>|âvöÉ §tóˆûÓ¸€‘ ýÁ+ݯ'ƒ pæ¦[è–™êD#a³8‡%8ð+i*˜Eß§³Zî©l&‰uýùðh²Fç=…3RÌïÀ Ö°³+‰‘L nX^±¢˜– 6‡7ï>¼L\c-éOüô?½=§ö›4ÿ.zPú±±°H ¢é/ÜQðÇ9-Ë UÚÉáÏ×ì¶ ö¯àgb}¹Â­»e)©j™í]-Ûš8mí8Ï|¶L÷• è±õ­ô ꔊ.|èûq¶›-Û9)¦p…õhp+Ð<”l£‡Ü­¼(j9G€(ɤ³žpê‡ÜÙôŒnåt9hÎþðªÍÛÆ©.æØ›R÷é1Y.Üùò$þbáÁφO„sÅY¬ï|XÜé!•Ÿeaq‚/˜"x.©7{¥ìé·œ1¼\ø­Õ §}èÄpp¯ü½RðØ“`†î˜ãx9É÷;°Rô¼a­„O2öÒ(Â…S~?ÁÃóC¿|Šq~ùÒDG¾3wœ WI>ÕÌ!Ü9ij°ÁœœG|½eìLÁ/?ÞY9–Ž©ŠÀÐ/¯E±F–üè¾Âkü……<í!¼è{¢A»ð)IÖV¼ÞrµRwgó,€äÊe죉6ŽI·\W}µi}÷´¾;39éŸÖŸÖœ/ ½-•¼ Ö„¿öVmÛ:¤;kè!Í|mµáýñá´ç¦/½Xê±GMôÂSüOkâšsÚºC4w._.uvëZé Ò€o¢i<§OKöTÖ¶Ò¾¬%[Þ~Qi*u%zÁ,œ?›vÆM´1éžìcÉ>Î)Š=R{{¨3ÝèÃzWš#/<­2Ñ<$ÑtŸ¼OX>éõ¨á€Í»ž ÔØOöN¼fÝÑM9rzFÍÊü}ð{| K¶Ð®Ø°®>y¡­s6½±ë&źQ)Dø”.'xf˶Ñxη5çÛ[ðÍ“åOÐ¨àž‰G¼¡ |>Îȧ÷²›*¢–×lÖÐú†sù#i¾Z¢i®œ?r=D§G_(b8¸>U9N@/z/|&šz¾mL[$@³f¡÷¥~‰®°‘›H¨Ï†%މ~b -7+uñU¨1çF­¾ÐïÈ©Çk*—Fü¦ÊBs¢ Ý”4KtÅâ¥ißóX³:5ó%œ‡§— ú:²ÑÁi×l¥[›fÄÐùÓl)4Î(Tލ];V«‰¦aÃ>¼N`yFßÊÄDhôÚØn’W\n'Æsy’Ø•6T<Ú²Ó5«¼_a¢;.jY¢Ib-›O2t>ØtZbY¢5s&:ëÞñŠ« ŠÞÄ+óüeàQØ ' ߎpç6½pFn!ø»ÛOåÏÊRq7®,£«¶DBG7œZ·0zªDo~T”@à +í'Z»b=QO2M>°×£àïšÑý"á´Œ[-Ià ¡_®H ã;JôÆþá¤Ø¤ÆÛ®–l/¬¿ÕÀ—V`ë ±_tR¯zŽÜ@;#WŽ]‡OËÝ­ i+Íï6+Ó}kÚ¬øÓ–÷‡FZ÷”r¢¶~2=R#`/oÅ—µfKïZZŠm wô‹uo/ pgÑBÂÂ'\L4·`ö1¨`N”"œî·ì`pÞÎuâpx(v8íÉØˆe×ð2†Î„n²õ¡z<ê=A cO2SÛM¼h‡°ÎHn2¨&\¸nšA„QŒòéO6ÝpËD[Ó¶Ôæ‘>t.ÙÕ1_ûïàŠÈЋÅFËío–£p-uLô¶Ä9–ì$~¦ß¡(>ò÷aŒˆ€‡(*‚l›èÖD0ÑO=Ùn tÑ•†ztà‹Q?'<Úl“ƒ’hz+ø²åÜG‰0‰>°‰ì•½X¸øÊÞÌ€úûn<ç¿E[;]N{ÑW„o9È(4ð³˜áø‡F‘Ë;ô:™Áþ¸7v½aÓýðYW! d]teγDèsL´µ×‡5tuÉCá_¶²¯Qq¢£•Þ/7þú‚pe!£î4‰v¶[p!Zº¡¶ØÁN—|{ó¦1(üw…‡çŽ^ˆÛ;§s&\ôàÔQ5Þ¦iMôí+þFŽgÍEkÁéU,_-òEÜ¡Wöªý ÝЭGŽ;DXþö°½·ðŽ)¦OtÇÂEûöÞ$ç™XGÚÝÊYA!ÕKûߨMå·îø >ê¨.)ŠM°<Ö²—’þR:ó"âj€Óê»k(˜õƒ÷¥þª/2|ñ¶«üŽ~«¥{ ×#öŠòJ.–}aèjEAmö@¬Ë²d/Õ˜àUߘÔ.ÑÁçL}1EyLxËôÔ‚« PœyÍ‚p¸iõ±–½L,“è:E'Û<ì"üœ,rð&8¢T¾ðR±S"I;éXÕ™>“nOœ³nþ¡Qè5ÑáüÃZ×eŽ*¥I†ðÚ°Õá(¹6àQ¼8‚Ù†Â#_Ñ@Wlw›h]Çø3ÿ)­ðUŸ¸½‚?ôõ[4,HOtÎî¬Û´†>MÙŠ¢Òó¶,áË[õ¥ µ¾rìxÙU[F]}[ë¶­»xc2î;rã#?ÖªË^îÇÚpÍ—m<ŽìDÓÖÌÎtËì‘ïÅ:ü¡ivï(Î=>äG¡ÌèÖªYWá°n£‘©žtÕ’«o¸Aüó×ÙÏáÞ¶…pšÒ3ò*åhí:¼ÇGÖòÑ$‹¡ ê°™h£¼*XŠ+Ý¥¹¢ž® é˾!;è4éu(ÙXÉÈ‹Bkù†u‘;óÆÖöÔ…F-·àv6Ûà¡›éÂÇ ™Ù˜~¦³br¡DGvxÕ©SxÓ‰Þ ³YËž½pÕÈÌ6 tÞÙGÞÅ¿F;Ö¬½9,ÙBSGëT?šã胃!sYg-ƒ!½q‹†D¿·Y¡gÍòümù!f2Á[ºÅ•æE󑯇*}Cx°ìß|Ñ-ûae(~dK½‡«!»àà×*˜Üæ¢6ò“e˜^d6ú@þ¬@7Å"P7Ù„Gëbz\z o™ŠL£ÐEó—øâ-&/’¶zˆ¦—î˜ÐômÁ° ÊEÃÆ²iÞ9òeíØ²F.4ågYª¬¦Yïk[ç\uÇ›²µæª“¥¯èDãÓb£½yóÓ²‡‡(Ðüm‘²éÛb?¸ËEÃ^É#Çk^œŒ÷f|‰îâŽÜXó,]ƒÛ7ÔL[Íߨï`WkÞÍÑL‰¦<¦lY{ô¾ÕüÖ…ì$¤¡k>Ö©¤’¦¾ÁDÓ,©@[«æìØtÑ•µ²Ht¬÷T·ª×&æ~Ï{7ž4«ô¸d Œ~àra•|þSZÇ1Ÿàb.®~?ÅûáM­†|TŽìæ­› ÷ÆnÎÜÙò Ñ/í4ÜE~¨Ì/žFЄkgÓlxtS§»f4¤ø[8JYCÇÞЇ·ìw€ûŠð_N}þæ]ø_ýÇ+›ƒ~Gø`= þwèôn‘ìmÀDÓÚRsäÙÆíβýhz/mKöÐxÃ÷Oçœô´lïVÙ{ø7Üš¸\Ä4ß;à¡‹y“Åx‹Hú©ì/ £ܯd›hz~gäL7ýÔòia­‹« -ÞKcèÆÄ•ÌÀò0…¶†î ÿºò¼›r› °2àDÈíPÄr? Ùg¢OTQ4¿ŒR8}‘'ÚØpqá1Á"~~Cv÷¾²xÓHm¹ûø°:Ïù¾a@$ÑÔ “èÃ)‰°úçî}‘ Ž‹‡ì¡gÁë^RncÆR…wh° þn9Ë€)j‹ð­ ‹  Ín¨~1X„^ –¤VĶ~`¬ÐçÁ6gyxMŽœ¶¤Û«^¨_”»ËÒŽݰb¼õô¬æÐe‹ '<é¥*ij¶@wüƒÇ-Ѻµm¬Z³>2 {sÿÉf½ÄDù7T5)Æ‘m¨¦i­ùoÑïu@VÁèoì÷²F¾¬Ó’Ì+ô Ýi/r¸3ôc-ÛQh(Wuza©BGÙ³!û`?_ Kö*· #e°ÑŹ6Ö¼˜ó6Ñ4 µ-À™üœWkä.ÚÙïߎÜð|T[Q—O¶¬`då6`åRåÓøÕäü¥®hüPaòo¹m#ði“ÑÅj9Sö€©â_@ãªÄDoldW‘ SoS Ì:ŠÔ¡K9u”‡ò²^’‰.0óø#ôÁ3^ÊmPÂ*ÅŠÚ|<+Ü„Ñz^¬ÇIUªu WTâã2-Ý4÷âE[#Çèe¢#t‚/q½é°b\b± ‹. Æ}Ÿh¨Ùö”F8_ø«ÚèmÔ’ ¢À´e{9ª_\xU­ÑÚeâïTM6*þXÔ+‚oÚ¬¡d¯‡‰ãM¦+êHôÂFˆš5GfxË>Ä>Ë:5{(‡îÌ}m‚w>—Q3šÐ–%{Yç5)¦9Ã…Ó³/ŒÝAËUÉ ymÉŽ‡1M|ÂÊó¯ŒÝ~,¸Fвڄ ßwðÆå`£ËCkþKL9¸4ØÚ›·îrư‚Á’hCn1SŸö]oF§ZÔ ò8T_Þ²ç§ÎØ\‹ØìZ’rá\úx,é#IM ’Ö·:<53çÈb™€'Ö—¾i{¾ïšõâÕD[ËV½M³¥G7#ŠîÞÇò¸1u>²³6|r$8áÂ_šzv†r‰é“iLQŒÒy¯ð*1úÂbõøÈ¦µ A o¬ÚV €®š|qø¨_6^5yÊ%ħz=Xá7VNMG^œU3ÑÕÉåÕ”í¡#Šæ¥p쟷33üÊfåÄ쉮W¥Äãî<8þ:»HœÉÊB]÷ Ͱ˜Óš·¯hØ”^¤ùö3ŸwôM†r:ô¥ÎŸÔðYE‰çÔ²ªWí=0AÝl¬‚[c#û,á·³¯•[†ðR±³ÒÞ¥3Wýõ³¯¡Tš€¶’U®Û´&¾|4MWLe¬%¶uÚd6Ò˜}rËR; Ùai /9V©%YRéÓl+U’±?1Wvœ«¬™4.²•”ƒÑïY+ø+ÙbûfŒxBÚ^.eo¬™öÎ5ݲc ýXŸÉÑÄégb¡Ïã|&çqVíH5ÑHP2nbÙÅZµj\¯#ª’mÙñ°Ã›µè.zsåéÖ†÷H(¦¹­gX²‡£\‚õ‘§@éX./úð¢Þd±£ï ‡A¯\O5WŒ‰kèj:øpô+›úÙ.Õ « Ë¡&„»lΞuÅ“©¢?ÎqëJ.f Ýõ’ÜÐEï–Ý–«†eËëC3]ºe@ôæ<¥}Ù”»6eœ›dŽ\ñdêôé"J¦ÆK·Ì®®X6͈‘Ø»Fè¨ØÀŸIDWFXÅÅ´pø¢g34šÕÕlщO1í1ÞÝ;ö†sFºø Y×Á”8Á(De/kÓ–·iKõ®ÎÌv3vEÓ©³®+'ëÆ f+¤êç\¯‡³ñkü…‡ßŠ*¸ ,[²}ÖøEÆ9ôƒ³ÒDÆWý‡ÁÏÜnÁ‹uÜGqŽŒX˼±ÿŽË}jr«"Ž4‘òÂéÇ:šµëÍnè8 7ÖÝ»Lgš4ÎÈC6ß±ùæ­òêãžÅZµb}à¶ð¨q‡/ói½&:‰ò jšžÉ{á¬;JÔ¡÷¸ÑŠŽÙœ,Ü)/7}*$É_£{&& FXEH«TQ>ïì’-Ö‹¦gu‰¦†Î[ÌÔv™JV£Öò«õÏ¿hç´οUÿg=ÎYóѼîiç¤.åUºjy›À³f¢«â ð¤®dçgí2*Òý.zãÚJ®¨“Ó|ZkîÊ6G^ðý½ÄqC½Ók© } /‘ÜQÂÚÖ–kÙ’Z€ªEKöV0£¡úPŠßD[#7Ñ|¿w¾ªàG¶‹µjÅšwQcø‰îj¡›Þƒô]´›5ñ,£¡Cï®lþ'ï(Í©ÜÃù°Ôƒ<Ò4ïÈ”mÝdÛºÁ÷äÌ€_@;ó^.ºãúþ½¬y M­dsÞ;Ø^¨“í2äÒyë+9ÖE&4Í;Ö~gäG× µTu]ÿ´èêè-I÷ûdóh$ÛèxÇò‘cÎR-˃z=NóeÓü´d×¥…¬G9ËÔf:ÊžÀ_I ê -Ù‘ÃJ¯.kÑ@›ÂÃð¡ §ä Z¡²MSæ0ë ö·l4î|Ì¥Ã:ëÊÝÅ7á´îQY]¬›•ÞJy¦+AÐ{0¹àI~~„nA±ÉÞì3kv`t“ÊòÀ÷p¢ /&zÃPxKî€ç%Ñ‹¯yU†óÚ\ø„ñÅ„JÃÙ"3Ê:oC@vÀNÉOïÖ¡É[…½Rø1«^ t·Ý±Ó¦¿NË:îàØž»EBÜ¡Å4B[_[À'ÌàøŽtãÀOÏÌ(¤ÌTš>³âw¾V…ÎXiÆÍŠyÝaCvI¹YÁ_»„àÌÁ|·lÆ?_–!µxsÍ/È>ÚüB['}y7º·n›¿P…ŽŒg–z“ÂMÛŠA±¬!yRázrPS휷R,áÕž¶7ËïoÁÌU*mEŸðÖaƒ«oÀí%t´l†Zâ3o–ôo[ÅV˜àkØ’mx™›?áïíÀjRÔi"«ô‘_d|wh˼èRô†µX2~(_f¢™‡%u ¿]ðM CRx{ )L‹‡š5öÅ»áµËJ—}kæÌØ.=;KSLáκÞOèÃßjn‘¥AÑ¡c¨)e=žØÔ»Pnk{7Û{MþGú­T•2Q_ž„W¼p!œ6*û¬5"ëÃë[¼Vœ=sÑŽ1P‹s/„ð6aLï‡3öÈ féÌ-̯ðaRè ãJûk„åýÔZº¹ôCÓ¡›HÇ'¶“²œÞ ‰f‘ØDÈ/'t0ãÁ'GUøoxZÝÔcž[†«Z)²$•&¾tCöð&n§ wNŒ®\³/Kö²¶Ü•mmÙ¶–m[CO¦W:òJ«åd ¥n´z¬‰»è׆Á÷ø±ÎªFN!íqdÛè°õ¡é–Lñ?C«Ó <.¦ðhúÆ t…Œ,‰¦…ÅŸ‘{óþ?ˆn.š+6_¶VÆ$£zO´1ï¡8þL¦5ñiiUÙl,§º‰!AN¡E·L—@üª»”åô…Ñäï£ÉHÛz Çr\F4½¢[wøå,‡&_Wµu™õâʦ=°_´jM¨ЭK¸«Ì•Q.µË¶Nôä‰gÕA‰¦µ&‰¦)ôB¿“ÎeGŒŸ6µKOsJºJ.ðaëÖ»ÊèªK¶‡ža~0º‡vÙÖi˜×Gs§´(Çö¨ nœ¶·8^õeí¸øAè%ž<ñ4:~œeÛ²°fåc‡Êm<ÖØ°I àqŸA¯v/<üÒ~Óuw§®Ð+húP¶Œ&îjgáš7ó„³f‚Ÿ‰³Ö‚ÚB‡½M'>œŒ¹@óèúH¾,zÜŒ–·‰îq³²iä+ÑX;ލN¢Á€1ÃÞ¦¯³1]Ùr”}G6VNâ(Á«¶L´3oÙ Ôþ±GŽ9i?hÖN»]®n¬åûa 'íÒeÓŠÓ 8ÂFožèõ 4­ðÂëõù|œ»dVåPÙÕ•½°sªÂ˜¾o¦NŒyŸ Ù²>²iÖLÎ{h^Ð3“›j仿|äG ;¦ê êE˜ªªÆ#oœ¨#GÎ jfœÐøÌªèI¿ðîJÇ©?GÇU Ÿy‹:èW:,áp¢?ë®lë°Ú߸êÎÞ²Ýp¦·6œ6Pø|Ó–-¼=á(¤5ÉS%ì´ô:- ¾2öË—|á¿„/ę̈(ÖP‰¦{¾¬M[Þ²my©½½câô5>3œ@ÓÔ§²!e¨ÐΪç´e jx®÷%QzÑŽá˜ý'è²ÝÞЩò~"κUkÏô¬¥gu5kÑ»¥!VVЖ%Z?ª×5$ ³2n+s˜úûv&LQ.œ­:?êºÚsbvQi'ë:ö_o4GÉÖ4ê–-¨ŠùÂÄ+NÉÜŠÓ¾l¸%w ÷OÔvÒ;µT0Ö­9k»'‘Ô®;KÎ臚ôt”1kK7OºìÖ+m+`IùräxÙ²-]µ ר8©`ç qÒuû-\t_´)ÛP^‘hp°‹|gò´À^“õ=­´fW¶‡æ;vžŸ¢ã+…k~ËÓ{gÑý¡×‰p§XC—DÉZ³1õYžbå©ÑwŠ)[Wê4< ¡Ñ %iþñ~ëmIÓ­ŽÒÝñÈ»µæÝúÈ„îô´ K¶¯©ýqį…wLÅS4›3ÉêibA yiÅYÖ9_ÖŽmíŒÜ•m¢;שéàÅ×+‡Ïv²wαæ­nVÔD·e«ú‰êu¥®Âì„A ·ì‰Úv=ѼP/7œ}dâêÆóîQàÉ^hä]­,,oì·ûÈMµjWKú4é1ãmì˜6F>Mt©ô*wñ”—µl.:zŸ"§òæ}t‡§ìÎÑ[Ζäþ xTSå´³fŠ.{R°§ð…O ø“δ^a$ApœÄÛENoìz©˜à‡RT^á|á\xóVN|,k\賡ÙÙƒe<Ëè¥ ´3rÉf™ ‰.БÐEpîìøðv|(hÇÒÎ/œk™`¸õüê´z¢7Ì Í¡— ÃGýV3Öæ.êc.»Þ–3Ñf$zÞЇ²[(2Ç…££‘Ö€ ªfý6µ£j¶px –x¤àÀÃþÂw•©ÂY¶Z¿ÔŬÈò.ܳú¥ÑÚX7²Ñû´vîjý ºèJi`•P‰î°j>ÑÒ¹&ÚXóé}¥6Ü9mËîÃ_+ˆ>Õêâ¤$‰¶§òö0:µnô6V:«)îb„5ÐÅÚò`é|ðª·Æ»v±UvlûµL6cµ¹Né¦÷fî o7Qx¶a ŸŠŠx¥Ü{*gÖšGöËnØzlËû¶à½ü?8…×lÌ o‡¤½¤Q¥ž†7ãNü}e²”ÚDó–H,Õ<ø¡†M4uõwËèïy9Ðw¢à”<éNßç=®‡ cÇ w? ÎPÁß§5ĺj³+´_{v‹¦gF~0ê„KòKê«ÿä‚1ûeĪe¸ÇÐ ­ºìúyvÜv¥YTøNí'[YqáñÜbÜ4 / $Gu¶-¸áJó¤Í^7`¿bÃkLÝíÁe¸!?ÍŸpVÙÔ/"Ka:ì(VøN“T$|@òÌ!\ÝÉtê3,]wÿY®èM½ciæ4®6¶wÜ·uÜ¥eŽuà”‰FMç”íÌ»âG¶·jI3GWíEÚÊ´GžFÜiT½½ðW8ÍЙrfјڴ.Ä@‹ÞœÃ5ÆÈÅ:JõêTñb¡hƒ&Ei¢ÎÈw|¢¬ˆ.ÑÆš+ŸŒvÑ}på23)‰ZO3Ó¢©ãt=2ØéMº¤ÛèCÇDgE;Ü´ áfU½ÊYY¸àÑ“œNÜE[ÆiBráÆÂ)Â÷¼9±•¤éPAWIé8?e©´Š¾Lô¶ÐÇz®c b¸ã[¶ݲ­„$ú$ß2`hªÂV~õÖî$/-tâbN¥ªuë#¥!¥ÝÜe{pzñVn uÏout ñîÖš‹g„¾h÷ðŽËp¾ð}9  ­n wÐÓ:«S«N[Þuú´ÛK=gh–DÀëƒS©öâÕÙ=¸>ï|À±gù&îÍ|wت‡¿ÌC;Ë&Ö ^ vù¤[ƒ÷‚ÈFøs§^œ#sŠ7ö’æ>ÔÎIÚA?–“l”t×T@ÊØK…¶Ö­9¶ãižðþ/Ç wNܰ¾µá}è&\žCúØ ÚÊ‹ý‘×ͳ&Îá[®6´Ñê)™¡JqC¶‡Îº8æí½pú¡%oÚˆ·¤w®_Õ’ÝY÷éÍ\=ÍXúÛ¸¥êÌWè£ CUÓÆ²9I5‚;˶¸hO|Ç–áy«¡=‹ª@ÞD?AtD*¹!»$DZæ;V6È’hÊ’'´3òª5‡z±ÈuÇŒýD#W±3KMô†N$UÛ:²m´±jÊïdOñàj¡Ã5²){Y²·%{ÿZ6ãs*Ð6d«Í$sÁŒ«–hùútèš*Ðæ«ö¢US­E[ø¦t+Ùô¯ÕB7oÙšµlÝBoèÙÕ‚¢Õ#Š›uY_š8+´Há[]wèTöGýPÔ:˜>S6ë’è–$}ÐxÕÎOÑj\C'n½`§‘';뛆æ„#RIáÿ2zsÏG«JôgžÝñ)Iÿ7Ñ{` ¢©¥½G[³FÞô,ƒ*Ý–í¡ãÅÞMt >¾ ÜÐŒÝy™è!o4úÄž`L\Ö®ƒ>؟݆µãFöÏHæã;K8£^Üx›59~XrâG6}$´äâ²ß󢜟‘ãó"—«¦ù YÎøMÝ£æÈ•}ÌjSG²|߉h…CN}ÂÞæWx…ÍzÆÿôÇY÷@˜(´³ìÝó™õjÍ\|±,öƒ¦®ÆîY_¶p ¾YÜ!ÖƒŽ­õ¾¬÷ÐÛY¶‘/jêÆ".eÔ~BÇË’žõ!ÞSV›*ôX9Žj})ÃûÐFóv­©S4Þ‚ò .%wvÍCë[É4 *;9ÿ©lu ¢/é݇·ýßDÝ–¦ýoÕãÀC;Ÿ¸-üP.ÆD7¾e’Íú¢Ë€ç]½EWö cDaºX©Ì'VÚ:"ÉÊY7ËjMI†¸ ÙÃÚði­ÚŒÛˆõvqÊ^ë‡z"æ²æ­P)+èbjØ|ÕŽ³ßI80àÈ—ÊéÈ×µÔ¡zXÊH¤¦Ï²®“%S/›+ÛQéK5@­FnÔƒ²¼ÛhUÇØ]ÕÚ3sè–+`y¯£îÌÜnœ_8/,È¡S³/Ø1h±Ý¸Ü¬]éJÎÈGÿ0&º$QÖ–Më°&['͸^Ûû~œ¨À.Ù& :¶œG¬ú}»F§G&X&:N÷Úê§Áš©¬ûp Ï w„ç£~ý- #—Q¾þª7Z¯¶UƒŒ'[-|ñQWâ4ýÈ£ðÞÙ2UÑg©êî;Öoç1…{è°ýàY=Å’í¢ ít”óMßãæÈ›uVìzl-ß)'yÚñI—f¤ÑŒDã·t[¶Dz ´ú0DGv^ÄküËÌhQ~gE,gà‚Ø•Ên¼˜FèXuŽ>R©-î´(ôé0]=Ñ4ßË–="”wl¸²=´qRmÙÆŽMë+Y–ìeÍÛà³úw²e­2ßòÏÚá®FwäQ®ÎOK | mèTµ§dnÊO;”°QèÈ@Ÿ¨‰N/'+wÈ~àÔg²;ÌM›â'¨°–u^vj±UåyS㡊B ïwæ®#7ö{[²·µj[M£è÷}¬“z¬‘µ‹ Æƒ:!R]Kú2Š.arÑ/´çûŽŠïQ†n–ìl ÌòêÕ$ªôáE–èA·LI”,D8UȺ`ÃÑ™-È7vd,ýÊš¥“mô»lø´-Þ©kÞªH, ‘- éu4Òtb…¤3ª;aÈtbI¦ú G=Jv~ŒüÆ ôŽ 'C/kä‹ÎO9ä¯Ð‡6ŒJ4Wm·1|ÑÆ-zÐõ íT/Îp8UÊç%…‡éf¶«ö ÙŒ}ÞbHêôÄÚaZÉMS¡Qêü˜F—Ïy )ék6ª8Ÿ §^ð%ü¢ß{dy…ÓeS%%«Û:âÑÔ½)ø€ÅqŸ±ÓàÉL €:•§œéÔÙæ Æô°§ñB7MÙUX5ª—V0Ó9ÏœòÅoú•*W—&ÛdÝï†æÇÜ.Ú8kÛÚ±méU™]4/L-ÖÙ]Jí¢Î¶¥´2Vè=oùë€[µ·ïÄY¯ï¾`?Ü©VZ‡0oå.½IC6m0UýÚqTYÒ;¾Ol᯺$}dS'ãjN®ÎR8f~,%gSå´”âLëv0¦Ë¦ììM7<« i"ÁÒEJMÎ¥KœûL´B?¬ê7ÑÆW¦Ôpjì®mÉÞœK<Ñ›ß'æEzœ ß%|«˜^(»xÂS§®›-" ª_¢Tºð×øVnýÎvR¸²'6@Þ[ðð°•Žó‚[³]uNŒŒAhC=ínUEh劉œ¿K\ÿΪé*¤>„½­£j]G¾ìŸ9–ݹNÞ"á¤'ÕùqÐ'©¤à¼Ïã¸WO¦XÃçlÖ¦S­x*gŽzO|1eË¥M=NGõº4Ã:‹ê‘;èOBš¼Uñ²ní¬Ú¶dokÞÇú¾)Û¨¡Ì‘SßèI­ˆæ½Â;ìÑ7&4ön¦ìCuK-è{dÆa4ýBí|ä“ü a$³OTðm,[µ])qÌ«+´³eܬK߀ºˆfÙCVh±vñ¡GC –¥"£mu=˜0Ñæ@®KÁÀBmÙÌð±ÑJ$d h]¡‰þ‘ͪ?…6çMÓu—¨'‹ðªy²‹®°êE)Ÿ†ì¢&CÔçE£½J4Í®Jt®‡%Æ…OjQL˜µÊY¢­(0â³âÛ ÛƒÊÖ3˜e•%zÂáMï’Ò¬sÞÃLÆßX祄‰®0{REá‡v–üš•¥­ËõÏš,®FwL!]ú¶(r³š¡ƒB‰êT55`‰6‰¦.¶%¦ã´(ŸŸ–åØçe«‚’lUÞFÏ"ô¦=¼Ö¥ ¡7G^œ-Kªzšö´½IÔ~Ò‘ËqÁ²²„çE+5›•H'šR¬&Z) -×>©Ù4mB¿Gnà\w -¦ìùëÒu0—ìG6 D/ÑuЪöšÚ=uZ«¦×?˪º<Ô.¸s\'AZ—#…ºØjv¢îÊÞÆœõ}6º.šî·‹.Ï JW¸_£ ±ª2µÞz_UŒAq‰$Å@Wy. njJfd¡B«@.z §€ÖœÓè ë„ÞÜ™ÜÔåo¸r‹¨viÝ:.9ud·ÁÙþutƒ4K¬6Æ~‹åŒÚÉ-sÉè¼5ò ïà– bhôà ð‡R•­KÉÃr£×%b4t÷hSIZ7Дû!Ñ´Gï Ë!˜+éqË|tºæ›7tL4÷FçÈi ©i<¾Ê„¦©.ME„ƒ¯š#ûȯJekä™àG66›’Øžžs%FQ7[þSêÀîè®lSêÔí Ò‚ø¾˜Ò-xԳщ+5ŠUÄÐô¼tQ82£œ÷‚éäKLe<ð¢ß¯Œ¥º¦ìŽÍ‡®Ø&M ìY«B×<“ÙXÙçœqåÌï$ 7$íNø£vJ~hÉ+œvÞ¸ðƒýÂæØåÒ¦ÏáÞ9]ÈJZ¾ k.œ6‘²Ç>ÞóJ;Ü\8Ï x —ÑÊȯV¤^èQœ©¡˜ Øè=±jŠMtܤ­.34´<7/ÏJôÆ^§”Móñ§õ®\õS®b /Ά¯ÊIõšz[¸èK~iZNâ Z:²’¶Ó]qjÙÒQ¥ÒhV־冠wp²?0ÖÏD?ÁPÃÐÅD;ßh°?ÔÒ!ŠI(’nèª7kÏltÅÏ›¤1pÐ âAßÀ­Í=¬U›z{gõXÂÅ.C3Ûöq>Òó87á±T[v‹§ñS-ÙÍšw·Ö\‰m4%ÿä#ž¦ìñÑ8ÆÉ-G¿ËFµË1º9 ]jÅNÒ“/iúF8jèLƒòG•m´ä¨Y ½ÎRé*uždYOi]ù‡’tëtÃUG}»'f|ÍC¿ÐyËéÈÖþÐTAˆ(žå‡mqP±UVO)îw2tø¼ÙªÊ§=8•:Š{lÕI˜ÿ¡{ Ž}k•YmúVÍîà#—;›=†…Æñê4Ðtä2ù˜Áø'޼¨h‡=¥M ö­Ù¥ó.ʺe [•¯c%ƒðœEÅYbüV³xZ Š]¡‡Qh\øã‘m|¡²Ñ©V,ª]a&—Ї¦*dã[Zì´,=|«_;ß±ìþÍìû};pÓ5¯Õ¹Ð,áwß¾åtÇ|4å§W®­³æÍyòP´´"½³À‹=¢÷m‚Íœl4½k6Þ ;6õ fÞ¦ýéDM·LéŸì«ó†l],´<|,À¨FŠ{s´žTÔÌ Ž_ÿûS=¯¢[=?ð[ÁAeO‘ ÑýžÎUÔ²ŸK´Ùj©l_Êë¢Ê©Éø ÏƒÁ‹ S«R8­¢¸Â'6u_ÝP í>.øž°t+Å{ÂÄW¡1‹£>ï°ùàªwñ01/~Ênø¬gnº3ï ­sÞºÿæMOKq¾{Þá7¡'Õ“]­yWW¶…>4ƒ e_hUf:u/v9„©™éÙfË ½©?Ñ4Ü”è ËË„³]±Ñ^e}ZCO߇!û@*¥Ïš³`¨KmùÔ1„~(êG0éij±5ó»Úó1f¾ŸÈ»ê,9;Ñ4°šhþ™ê¢ùiËnñ¬8^·˜·cß^óÔòª™aÕ}Sùém4D!Á2}¿#›z»F·>ÑaÝc¸hZ*ôi8$<²11K3Ρ;>#VÆ …>hj@Œéy¨Ïid‚ôû˜²×oÑg? `²´°”MK¾1rJ­v„ŽìÍ{ë%ÚØïóStäÓ³œöõUgaÍ6õf¿[õU;vg–ìÒ(ÂTz5 YÍî˜>S‰áŒ›GhkÇ]áZîtÖøC7¨#;¹é†Û²y¦Ž/ÛBG¬Ž:nf*Ó£ªŒUê Ÿù”¦×QVä Š>j‰DWÝh‘›hʟ膳'gúà}²gän8ÌU‰/… h0É™N­¶%‡6£4Úª¡Ü8bU±~°Œ¾pÔ(‡nL<ª…éYG }Q®Æ;p'ºã$†%§2}Q.9´©Í·d81Ê]ÎiIëƒÎ[]¨°ìiÍÛF:9)0¡…Ê4¶šh¾Þ‰Zè¨<¡·YTi·§Pl‘ÅчÝNBh‡xã.Òî¬{—¹lÍ(\tÔŒ"8Ñü‰³›“)µ›•¦µ³Tí1tcÇ›|…P9Û²­£ÞeòÒÀxöSrãDóWÊÎLL¨Ù5ñ#¼9t¼iCª«· §{nKúzºç¦ðì¿B…ÿ½Lt© §rÚÂÍ¡7nu¼4HϬÞ+¯v¥…¤[ÄÒÔä!¯r¥ÇXùÄewÓmËt¥†ó: ˆìícöÑÔi”z+w˜fƒšÂÏóSxI Uø©¼yè³!Ñ´Â2È_®¢"Åc /üÉs²£}*žLÆ¡I b)‘ Mágcô(+…ú&.ñ uhõ&¡~À£j$|d¶êZèqU±b§²E…ÆØo(\è†'úMNÔ~‡ˆ¾³FÌÞ0?SèW6«>·Ñªef™ç‰¦™ÄBoÊa.ï »Q„w=©JÆaµGœ;ÞG‰¦M:¿¶F ‘tÍ•Óʘ-l´xŽXŠc¢5O–$ºjÓœ÷Yðil|Y#7zª%zÁþ^ÙxÕ¶L>|‘‰¹Ž…Ò¾ƒfžâœøs C@m*¡uð¡ß¨‹öFnΛR[mnÙæ×è%#ƒJ¹<βÙhgÙrâT;%Ÿs– ýÚM¬ *eS²c¡kyàcøˆ z+…®ÏÂöfi¼§›Ðò¹ÑÓ8³æ¹Dl,ý*Ѳ% “ÖNDR¢2…~¥2_°vZÖQ—{šy/¾€ŽÆ‹,t‚[«Tš`™ð×üÁÒ•ÝÀb¶ç²k±†r'¦|¬kzH¡z²Ñá;Ÿ™){šèðp2—º«‘EUcUДeädul.·ì4e i—+­jFpm£·~Ðô:jê B¯„¤4c©zê¹ÔuÓ2› '#]¶®¾‡TCÄÐ=“ßË–¿ŒÞI憵‹´2KQ<¢c[Øw“hüf6]µŒ×Q;¿)mž>Bx¡,Õw씦úˆÆnáJS-5#sOÙÖí§lÚ£ËFoë¨#Äznt¬åwbeXBEyôg7&ÞS8n?ø Ù+uSvɆ,P¿$“µM£ É¿G_fÉ¿GÝèÊú‘cÙY¦;¦š?Æí%´sT«9oœ{}>mé-8eØ<Ùœý·pcîÍÒná¨ì87.½{Ò³»;½T„Æ×afÐ=we+Ù ZÌ]>Z–ìt.ç#vöγ¼Ž(öª÷d£ªyX N%²4é§ß”FºeŠÌ³ü´DX) tt…áh\¬õŠDÐÚî›ç&zó;!Y.èqI† (;¹*©OÝD§Å õâ(œ4écb$þÂÓ2d{Ñì—¤.d9öß@7¬“ÐUÓ$zâ§üH.|Š‹ £%9á1 Nw({ê+¡¾¾@OX”hJærÄçöà\†_£'ŽÌÊ»á}:ì›hcÞz×±"EÅuÙ6zÖӶìní˜J°éK|f|–žµaÍ{ðV:'î gÕ¦5òi­Ú¶d‹Ú!»ã|㩲LÆ#§ûÏÙ±ã|¡ëqÖ|=Ž>7eç¬-KŸš2ª~CöÄU7«rŠm¥¤•Ö±©ù£ڭeKb ºe¶l- kèÅ7\²ñAÿ‚ljÞ/ë ^ºþ©lMkÞ3N*M¯²Ñ¢ƒoè5­|iËà þZz{Cî>¡›ì8/“ 3£íƒl´:t0þÜ#: ¾æû„ì~¢¯R N.(û<ÎÈm´ó‘ë}Š5ô8uŠ&šÕ¶Ÿ rØ 6²9br EÚBãÎ){áRç“)ÒtÕtS•|Ôž9à§øNJ=ì Ÿ*ݹ…Þ=øé ›| Þ™K8áæZá&”D™hÞãð­|>d=%|CÎÁðÁ20>ðÎÒ0~4u”Nxá&æ_xäaÂ…/I«ŠrH~`{ùDïÍìõ@§+nzá b_‘í¡K”úŠìæìX8`èY+ÉLOº7ñL”Â3—û‡ê·’¥^ð^(rçSíVš;r]ÙSãeC½ZÎZ ´([kù¢¡Íœè÷†¬ý+Òl_Ù•Ÿ5{ä‡$|cÞ´-L •!…UÓ'(Õª#ím -Þ’røt3‰vöÌE;«¾²t‡ ?ÖÐÎòž2T#» *å*±p:é–QÀ/à “¢\©rç°}àÄ›\v¨ØÛGw Z÷Y£¹,E‹Õ ¥IO5ë*V]‹è|n©JؽhØží¢»#;¨_Q*bÀÓ½l +Kð²Ñ½8[–Å3T7u‘¢o¢£ —#§«¦V£Ôbì©ÙàEØ3Ùˆ££ ‘¢é¤@Wê)>©JU¢·hÏV_ÆÈaÄ@/L®èìD Õâ(μ_´ñ…ÝÿÔ£?’Ó^dCûM×|>8µü¢7¾Kf’wPÙ"Ê¥ñL¹¥zmV Ý1Õm n‰è©V ¨Ì)à ×y_ôÁÆÃTÍ ŠM'ú]tÔfôÊÞ,ŸÿO6µ÷f’hAÙÑõ¼ejîZXfÜ|nƒUºg Dô5d+Ošª¶Õ­Ïle¿(ú$Ì®—(-/цcv©k6b tVôÑ‘K¿ NU²QBÁEëEØ $ÐÛ’­'õD×ɧ±"­©|¯b¥Úi+k‡†œvÅí .ºà{x«x…ª¶èkV¹±ûÂ)f¢ƒòžÕhrµðhcä[ÁxÔ&=ຈ©bÜ*ËCíþlz^^Ù—ó8_Ùyœ“~š%»›hgäâ|¥ç±>Ñ3­‘¯L:ýlKxf¿ÒeS¢M8ÇÒ'›±m.ý½ÅésøEÈ(pÑ4ݦ„[´ÔÎRµ/¼ÀöÍ8ݵ;øÉˆ[§2­ƒ:}¨åÓõ†½á د ̪K4µX‹:îÐ,P¡ßK¥­$šÆnrä%©zX;&ª”âhù0˜sV£}X¯ï©¾ á†«–™eT9ñž±¤8Å_íÀ ¯¢´H®èdÏ «¶¬5ÏÚ]t—%ÚØ±i ­š%ÔáñE×ìˆe׊™r¿‚öF^¡Õö‘ÍB”ELû %UÁU<ïæœÔÚ¬U“nA%¬¾ìn5mÌÛ–ýËUkøö¯Ãù´F¾¬¯$oºß[ó†7QÕ=F­ž”GžM©¨^š%”`€À9ˆ‰†\õ>Ú²ö²—…#ÛC7óùÌ›~¡&:9¤àI}Ñ¥ FÍs…OVàþ‡Æ[f™\­YYseÃâú@wë#ã !=å˦«æ¡­‹¬É1ʪmÊ'íÓ@ó>:xê Þï®ë€èAþMsŒ~®0¯|ò6 4ÿB{·d ½-ôµÇép‰سC/F'Ë%æeÕêÉŽIx^^t¤âèÎúäºX²•sJ5úÑÅ2'ÍŸƒCyÔ<¤Ù¨~È\d«%Ψa&fsÉnP=Œ¬x…ÖCŽŸµtDÓkÖImÖiɆôœwžm£³éE«ÿ —K@Íòm´‚ð,w!Ñ|ÍçãœóÌHÇèê¢ùšOY‹¬œÍ–½8OH¹iÝx¿ó´@:³¢ lSAMêZ\&j»hØhå¢ù¼3-›%«&ú@&"¡#Ùƒ%m ~ ¾DWõ„ûðçáƒo¼/Ñ [›Ki.ÔÚ\ÙŒ‰¾Ê–u‰¿ï1kÓLøt᎖HÞRü¡« (+‚ÚÚtîœ9!hìåE;ÊYIÊø3?œ‚¡QHäÊÀ57ÑÊÓéðCÙÕÉÚÍYóݬy+“ï˜*…X’òš~{aÂÖDŸ‚³›~Œ~/–_”ʰ‹ñ<¸)ôíÔ>Œ‘9Ð5t*uAœªÄnc–"÷Á­ž¤¥wÐÆšoç&êÒ¬„ ª¨«ã·A–„±™D˜^oQãE:ÚÀyǹ\ɬ+Í7Ð4«IhÎäk½*NE·L]¬;üLFzàé†7kÞM>tê¡‹%JìZ#<ÔðtâÓDÇ ­¦[æeg™½gÁMÏJ©0‹sLëÕ¹§¾QFG'´³èY· ‰¦ÆælœÄïO6Ô‹SÆ&k¼-ô)|Õº;rJäû9þJ2®ÉºÚU5hY0w°Þö.Œ)³Æåí|àÓúÈ„¦Ö‡=ò]q4øUJÑJˆ£°¡ðûœ íÜǹ×ãlY ùÈWu´Ë‹~לf\®nÍÛ:èËúD}Ù R£VE²­gt”T«vÔ‰¾'·õ™l5¦cÝ6Ädc|à;e†lʼø9õƒoEÁiŒm[‘‹­¶•4ÍuËGG_U{ðŠ5r’â*¢²g›ŒJOåä¯lj=lÝàŒ°ªª®iáïû(1™fÁù¢éE–¥EŒ®ªÂ¦á;²¹h›Æ#oJ¡7ÐûM;¨ÏDD^‰N4Eg­Ýî,)*Ñ4æòA;ó6Ð"âaž*¡Õ@‘.Û´–M¡ –ö˜hcÙ¶FÐæ—ɦÙáJU<á©‚ó.ÅYµRåRD@Ì’ƒ„>zÑÅs)Õè*j·ÍÞ1Éf&¶Ðñ‰.d{ØÂÛJiÐ,¸'×sµ[{€OzãÉBÚi<ý)ÐúÈ¡wèÊnY6Q`-šà‘”M×­[ú¥{ë–L<­B8f¥ ­U§ë6³­Lkè.Ú0vËtŒ¾,aŽU9=Jë‘I€áÎaU!=sã·[:Á ŒšUx‘hã÷ÐÇ:«Ç¹Qê㣩¥mÊ.Ž^‹5ò¢Ï„ÞfÙ»‰nxµÞÒÕz‘Öå˜NuYó^Ö¼·c,×ã\eõ8kތܪ¦<ü•½aŸO¡%9e4®ÃÚ¸Â[òFÒWak–ð´7¡njÝÑl­{Wv5ÚPeú® á[nÌ|Y3ßNß7m›Âô±ÎÛía_0Ä)´7qÇÔ~Ïi0…2R_Áƒ.{/ÖaïÕ¹l´±i=»0A«±käò Ó·U¢ ÙΪ¥9ã£näµ·Ûê„z@œÌôv“¤©õ4ª– =îbÚ§…Ý·)5;Ç”Š`ü®ê¢-fàqÛþOÃ7¶ý8_Û´¾¶ùð–i-³ÄùºÍâØì³zÂOÕÚî̼Yçm6ë¼ÙÂãÚCÅј2¦ÌRû§úUÂuK Žö…ãM«kúP •‰½h¼ã“Wÿ m-úú—áÞ…©îƧfÅæ¶t³‹6WݺqÚåxàÛzz&Ôzœó’}†h¬Ú©hª(0¡4ÑÜ´Ôé‘Õ7Õ²{(fXò)Ь­%z‚F÷»;Q°D³Z·}zvÅÙ²’}tÅ–[¢ñI•ºµOw"ºß“Óh%ÚÐ-VVæZ.Ú˜÷²æ½¬ÓbÏ›ËÞE¾y¯ÝÅQ. ?Ñm=æ·•°Å|V©ìj­ZuúíèÍžDãÃæ\‰‘¬ ´©viÁ&¤ßAoxlñÒ+x«M0µ±ú¨S1–m¨ѦҼĭg0#'ÚQ.‡÷»ÿ÷Ѭ´ñ²¬øn*«ä#Ï¢LzZ²U=ç§ðÖí¶ªsdW¬™^ôy`ññÑêÈD“gl´7òSð+XÍi/ŠœøÄèÓœ’Û~¢C•­+˜¦×£{h¢'ì-ø‘Í*ü›šäm®Tgáü ñIšÑä´(R{O*VzBfƒDSþïD7ü<ê¢A“)ïªQÙ™½‹ ÿÕØûíÉÈÔKÇœ%¼ò™ }(Ûmʦ°mtó–­YÂ?`޲D/˜T(ô)|ó™•->ë„Ù/?ËMt‡¯¡UKbCx©´ËO¿Y2¦Ð‘oÃ|‚Ÿ ƒ=ÒvK9Эۃ›á5û˜µ,ô®ðEš²¼Lûí1Èü6BÊ®ÜÃèzWBãdÄDón?DwÝ s´ßƒÌìë·æÜFO| —¼èªe|’žóLvaNá~Ëp©ðš±2¸lµJ¥³šˆ®BZcèz*¶Ê⛂ïŽÍ¶ªÜ|ªÒk¶œ§‹.RJVšè“e”¢³;VNÙG„޼s°â®V †ðélYW ‚ñÆtàð‘'šŽ<ÑÔÚÅBWkÞÊ¥c,C‰°8ð#§­~úí Á¢=;CèKáÆÄ…f• wè\?d?–|ñ7tŽ6ììÑx¶lW3cË\ôû–f ¿3rü•uë´H6Ö.Ã:-IÖ Í¦1¬yÇ¿iʶîÿŸ¢Â`”ÖB‡Ì¨\ø”„× Ó«í©+þÂZ‰|Ь šÐÖÄE¶C}'Ãz"Øh•lÓ=“£Žq‰ ;S¥ì‰Ý£ãXÊ- Xˆµ‡×åð|fº.Ô¬S}-¨cw¦¥ o³=aÿd{èÐË, Â^ô®ô,<9@à'% ;OTûj¬›+x|u|J@¬-Ç-e𶉷oY¾á ÙvItçÙ §,³Ø†{—ɶ潭³ewh¡Û#Ïh:ù±´Ã±VM ÁØ[V5·¥TXjý x¼…ážÑ_0F¢ñiåJeÞx/ew¾g•/Æ-Ùaþ‡E7‡Ô&zñ‘å0÷d §ÙáCU7Vq -ï=«;N Ó%záû¤¦Ç‰¾Êª¢›,[XèR)Él §ùYBG&\õª 0½Í®l>òÈyaµNªšu„{h?Ìe$t)¦–è½§G4û²ñ>n' Ô Žhwˆ?83¿í÷èл'\-ðèË® ÞŒ>цìl Uk›:0,#¸á«s…/çSi‘j=`E o0‡bÜæ}øCÓ3…IG¶þ3¾”æº/\C¥v¥Æc³´k;ÞyõnõïãSROÈ‹6ÎFGÌzˆ»Ô¬DodãB¾ç]9C,Ú™Â+ÍHLáÚ§ðB¹ÀFx*KyðÓºßþVPÉueÑ;õýJMŒ‹Žo…®ºLQÛµ«°’šÝY¯Î +…Ž{å¡g½«ðŠ…,¿;#óªÕwæþ[ø´áÎÊë¥X©ð×,GUºÁw(ôûµ±úm¡­uÛÞ®¥?ˆê×ת´H á%+<Òü¡ðñ˜èÈã…zbÈ×M÷lëÄN©–äÌqÆæÀÀ6à%Z€&¹XòH¢cÙ›óÐÝÑ1û‡zdѯ|È×Îj;F6#¦ÙF6#.°ª7á…;¼]xÜj”åj|jØñ®/9ŽékÏ•¾½¥ónÕ¡ÎÔè ÿ5|áì·qœëa>N£‚/¿”Þiªæø£ÃC§µr˜o¨öè@ðóÄÖcô ¯CWoè6ÜÙóWx=ØúýÔvDnG¸¼+TA‡pç[ëÞØ;'­:*Ê¨Ž’lê=žªÃ£nÌi´bJô„d#2ªâ¼ÐúbÕèkonë¬nWvƒTcB‡ë+ödŸæè0Ýeלq()ê=n4ms)U…ðµïŸŠKü,‹Ž¼‡åKstÖ°F>BAPÇDʦ¯Ôw½ÙˉÐ,9áh„emkÞ[ñaÙŠÒ|Õ‹†Ë¶UäC}"[Fôu»en;²ùaÛÊ¥9|jÎ;`ï¡B~þ…ïÆÙ'G¶À|ðQϪr,|[ßruÓL~¬±»hkÓŽ³iQXÎ3ÏcÉ.ÖÄ£×Ü$Òã¶è£™Ý'IÚXÅëÈÂt~ZÜÍ4w:o±“hcݺó¥œá-Û´&žÞ^êŠxyâ‹apCÅLõûº¨:¬jD}üÈg¶ðjð=.¸3qã¬O«V¢©bžªc4Fî¡—ñ ]r,4^ô4ŸèaÛ‘¶ÈêÚÿdÓy§ ÂR„gThQ ýJKÍü;ä{áà*¨b}åÙÔ‰µnŸ‘my*ä§Z ÞTø–necÁƒ#†nZúÝÔû†>b57,UÝ[¼>Ùž¸j]Ç~ Câ¿&¿3uÚãÈ^÷òŸáz:ótJ0gí¼ÝÀ&G‹ƒœ=Ê`Ñ[iFÄ6:×Á[µf?s/¿pcæùD…j¦*½š•ÁÎ,E5>µîÃ…ëºèÔóJ—}x3W6+„¸Â)÷êwàÖÔ )æVM0o!-–=ã¼aå<ã3g¥öS]ÿ~tÔ•ù{Ô˜XÖ²miWJ»pã´nï´þê+|@µ 7ô£åªÇHpþŠðfwî|©Ç:2í±v­yÖïk¸§'\÷&‡7+™·fAgäJzèwËùíTÁ{ƒžúDOX™hJ~+Š$ÕÁÒe +u¤µäae‰j…ò^‰,­Fh^‹:oÙ8KõTž%n8=Ul¡‰[5¼3KQ &útAÛ!+²éŸD8#¯ÎŽEyLï8ü8›5ñλs%ºÁ„¿y|R'´>“‹†×à´úR6 Å,uÐaÕPSå |Õ–¥’Mô°Fn)tSv2îѳÌÜDã‘[úV€eäΛwO}³Û2\vå•4ÍF1G®JMºß‰¦ÁõDãy7wÞ´gò—dÃ[pË)LÍûÝy¯¥DóveG2®µj4Ý쎜žÅ–'´[¶îš{³‡uÖ¬[Ж}ø3öµÔB6ÕLFG²ï÷²ÖÜFOÈ7&œó0É0<ôä„¡¾pz8|OŽÖë€æž$š†u=ôÑœ1Y íÈή P?å$¸æ§:û}*ï›è_ƒÇJh<ÍEol-žfíXw¾±#æy,[íÐhÈäd˜Š£1ƒäTsÌ•êQ?3F˜èIïgdÉD ·¦íï„vvÌù»j4Ë<ÑX¶:{Ó¤£š ê—ŒE:ò¥"C =Ði±e~ÖltU(}ßB;ónÖÈ•8Àš+íÈž×íÌÉJ½`’޲bÇYPWð3 Iy¢tãd³Ç°=ò%‚úƨêaËü“‰îÐ7úA³ÚÛuë³è»®Ȩ̂y¦m¬–Ûãl¸¦)Ýò59ó®ÿGÑÍ1Íší}Cvƒ~ºuËéXŠoʞпTgÌ»‡¿Š騲 î‹¦ø«yýÈ6FµM, `©íîÄ–rKW4›Ô7·G©¾øw2“ø÷_†³Äu{-³’ÛD~¦•ZœmY›®°õ¿š²R-•­vþî,¤C7áÇy«a0-$°á=Ëò¼W\xQÞ ýÖ.œ¥Y ^;øµHxÁîÁi ¨àÁ®¿¶DÓZWà­Ñ‰Wž—²~Þõtá°Œ¡?8«ºüˆ0£Õ¿£+$[\·é/5»ÊnXµ±Ð‡ÒD~AvD~3ït|Ñot8‘·ŸÊ~M úpõ2Ť@ÄTSEêŠNÃÎØUåEß:}[3ßzn°¤ã /žR?‘> Í? Ÿ09?œMÏFÅô¡&8­büк£¥>ÇüC†NãÜ#í/¸n·Ñ1 ŽÂé)¯pÚ#.ᯞ Q žn,:õæ ïïǶq,ëä©g@­Ž Ž-hìö,˱j R‡ïmmL<ZðfÒºñŒÙƒ­µíÈ•;|ÝÇûµTþµ ïÀ)húLÃúئ7vr4§f(‚IýjÍm()%2ѧÚXÖ,þ7m²!©n¨%M’ Ù”) eÓê픽!QbÊ~ ;à g䪠Âöß±ÎÚ‰Œ¦óŽÃy®×¥_¡gmªö‹&ME¬u[¢ùš« :÷ÒG/oÑW:sUžÑìD³æ£ëòÎPÍ6›“<>ñf}•…vÎKw.ÂDS“5»QÓ{pÊñG­¾© šT;‡uÖñ¦:ùE;k®è%ÕÉ3©¡½8Å$Oã®sšóÞÖ¼¥é†ON’ð7tz\&§9øÆ–èe}dË:.+Œ.Ffž#ç/y½­yoï okÃõº`ÄØ"ùV:Tvé鼓A~àÊͤïh_öÁéó8Ÿèzœ‘zCÖ¡ã n ùm²DîHÃ¥9rºcæ_IŽœ:»–*³®xBË_d¶Š½|öÐßEgdA+ü¢Î–oÙŠõê=H§4ô'ɼz3ÿ œÆŸ^ø™8Û% G/ÊÕ¼]S 6¾Rš·ê }á[!gNã+ høÌ ×K¢ñ‡š•sô]¸oлÄÃÚ!‹Ð¢Ö¢CW& }Ùzó‰ë}„úrŠ‘–\ùxÞÉÔ`Ȧ=„ެ+ŠNw:ùQ¨‘.ú–O›Æ¶lVšX¹euÒdØ-Žhš€è‚ãûq¶,д¶.¼‰K¢'¾Å·,7úFÙ*@§ï‹ÏîÏVÍCóÎT¶èPhv`rcÙÝš÷°d‹L…±À-±¡.eÜ"SÁú|q潚Ú=Á†Z¸½å£¤ ñ™ñÚŠÆS‡xP±.Øl‰‘ÔТr¡42ɆŠ5º8è×bŽœ“[œôÕÁ¯ÌGóºy]g|²ÀÒOô§ û(ù–>âÞdÔR=VTù i6ú‘im¸.ú‰žimÙ²>Ѥ¥‹¾Åv¶£ØÎ¶æí¢÷Ä©>ïƒèðº„ã©d£*U> |‰&zÃ'™Ð8ó3Ñ Û¶(I74tM¹Øí¼AÝjå#¯ÖÈm4ýJ>²™¡ºEkŒ¼ÙG¸3tª’ÅæáL\mwY¶”Ýa¨Nè(&`öN›¢ïøÀ¢ðšªÕ‘ÄZô¬K8s»$zò-¢X`9q)|CrÏ»nÆžçØYã…OèÏÞI¹¼¡_÷Âi;· ?°sÑŽ,gßÞŸB )tb଩oÛŽ¢^,yÖ–^žwßtè'Ü|I>|¨æÊãl›;ôâ-\±Æ^¬u«&ZJŽ]9ôµRš-|`õ^šµgêaȲûw<ÙzXçe¦jçð÷]ÎʽvÍñV‚ÖD±®Äù»¬kU _0¬/ô»lŒƒpÇ^‡rc% $ìÞ":7¤×$ºbì¾`Béç6mù±/[8  í¤*—5„…/üάÕ[v%º± ¡/5†^¤ÁÙIn,» ã7ýÒ«j¯ð¦é­Çœ¦BGÄÞÆuòHu¢7v¹VEª!ÜŽ«ÐAýÞ Œèj[¬Ù4Þ±Ã)/wDîŒUKæjzZZsÑf&|CöĦ[‰K©L´±ßw+ÿ Yúo¢ DíËÁLýŽM:•1Èsµö×¶íè–¤feÙ?‰^äi‹d³c[;Ñ4$›Ö}Ðô9h<ïúœ:PºL6V”è†Ã–— “Ž\™¾ä“j’Õ5$šöY·§ý[œsh¯uõ:§:µ«|™¥c(?-ô=çâéÁ§åX'õÄšãš:åGfkÃïm¿Åù×!gL¢i¦çç&šÖ]Ê50ʆ0üÁX6ÖlCQnêªË¡³ÒJ¡ ͦ‰«žä)PA$O"½„“k51H4Í4ÛŽF–ý»/g]§_épòR6£â::PÓEÿÂÈij@Žœ•\}aÞžì­÷ÍÖÜ@OkÞ²›èKvd‹YªUZÀhðÝ ‘é¾<øOnEºæÛÚo{äZMbé†Û·ÐÎQ•{>NFšÙô"±7u.ŽãλÁR’-‚Cþ„ŸóŒN4Í‚Êft¹‰Þøa”´¬u€†µHwÌÊ<žVþõú‚lÙšðþŸzÐÔãi%;Œ”9òÓ½S6þLºuл p bKÙÆÈߌz].—&]soÕ†¥šDcAóÔ}ð58Gö¤÷@Ó¼‹9œWôT Fzƒ'&M˜ÉžÍd}hWϼñ .ÙÔ½8³º~dËÚïí¢gü¡hG¡oëßN@wÊÎ¥.Ý$…ĺEáAš¨2oš-´ã\L^Güç3I¢>ê¹XVyß² ü ùë8!,hþ:ÎÈZŠ]Ðü% ¤¡ì Œ3†®~‘¬‹òŸlø¬l“N[öÿ£«¦g|T³·dÓ§ÉRÂ+ÐWØo:rÝàÔæZ²¹è]´,§êšI5GK¶­¦ž¥¼rêM¶8Z’é£i¼-¾7'[rŒÒ þÚœ.÷ƒ¦~2ôa½xTIód—².ižÍÊ®3†l㸨,'·\›T½$Ç%HÙô#Kv@š³ùcÙ‘HOïp{èÞqyuuœlƒhGúžµl5Ô eoeñQƒqWNº’(gkÝøH“OÞ¹è4ád7ç5û¢y7ç6Ú·Ëy~ØräT¥+€÷»[û­ÄK¼jÝÚoõ¥¶KÎ+—|г¦Î/Ô‰¿ÅÁEӲŋÈÙC’›ëE¡©÷bËf£•; èËê-1¶¨î*~ÍEViúb¢­²ÐQíKmÝ£œSêB8UdÖ´êôH+S ‰côJÞqL#¥ŒÊ–ï„ù‰¦‰¾Gd·Ô²yáÆNˆñ¨½O’‘f]nCºcÛqHŸíâOÒÍhcͧ'>âÙ£-T=`¾Ê¹ ¬®ûƒf;v.ÇK_L´±j*`AŸs¹îØY:î`¤™Rö†o²D/Hz¡[[bsÄÍKÄ\t¿•¦Ëžðjú_ Ò©‰ž|Ç”¦Ë²º>#Ç_¨dãýÞòŒâ,•*ºDÝø–gËÊçm|dE,Ü¬Âø3rzØJqÖ¼N¤¦oA^JG.çäûm©Å¢@Ö<í\Þ*?8bžjмOô€€š½©]±ñhgÞ4ý3o¬[R6Õ-ö¼=ôà;– „ð6(z 2î¤D7ºø YŽÏÍR£>h|ÍÊU?;Æ*m¿3rü…KŸOK#OkÞ2sYÞD¢ ÿÆ4rdû¬}Bߑӳ&— «áû YiÓgÕXèá#›>‚¿fi—Gü‰´å¹Ä‘Ì›ûß ›%edSÇCYÖM´d·X²é¼(Á‡¥$š†š„>´Š>ÑvdJt‡.ðϪ±tÑϼ™#ùÄ^îì)zûc­˜Î\¨™êc¢qÚä¹£,ñ@hOv¤¹P….vÓ‚ý5IÊ2ÙN²›VXtâ9u6V«/z/H¬–²Ì\Pôý§hÚÙè|¨Méië¼ ÷µi‡!xÕçDž¾ªR|CH¢ùÛ$†ÞùUh½ô=]uôG_÷y®ôŠo´€7îþ¨ç…Ó&¤‚GáÝ·ã}.ª cY鉮øRjsÞ[‰z<–Ù%´1ïÍÕD i¡ÐqÚ¨ç§5kÑŨ{àYµÑÑe‡‘æð“»í¡w¼ ‚h]7Ô¿ðwݨS;àÆ½Ò†.ê°kêæEâ!PG1eG0´FqNêP¢:5ÜFq4ú¨œê\¦}êÀ2e+§’6~ÐxÍ›¥‡êµ¨é4:ç|ý ©É—]a[É?Ùô#K®{ê²*Â¥7Ù–NN)Jʦïé;rzTEOD£ÕcrBˆ#öò…3Õ‡J—©£v,µ„¤O«€Úì$‡øâ—x6(¤›vx3­syiktw¶ìò[4¥W²~FN?”™1,cÞš¶ :—K›¦ÒLUÙQcu*#„¦eNY4N=Óô¡ÆË” ÀHÀ„6rü“SšFcä‡&Ù׆fÙÓã"ûÆö§2Æih&Qkûr¢5’¾éaSj%Þp9h=i2ÖÒðÑR‘M)]ºÉh¢ý‡ »­Ì €« ¤—|­æ$â.¥P#}5§úx)„A]>K-&GG‰Ÿ±æÆªe^#ù9<µ2ú™M„´2MÇXª)¡ñ‹ n­A,EÑÖ¢/'ìô 4uä¯å”(¬ä§²·5òmPZŸKŸJëY—ÈÛi¶ýú‚è×0EçÓ.úÖㆮÚ} uµíêʶÐ:ltÙlx\†ºã…]­óÒ\4JÛ²ƒýŒZù»[»&mF_öÏЙAA“·šýÐòŠ=졟ø°>qmNÜøPÌu›>Ü|:¨Íº‰`´u_@ïÊmsÙÕ) ›0Ëþà4TW¸ÊSY#6¡÷áêÑè´$tİv•½M+©%¼áÔº ¾=8% Èk+OÚ~ŸGΉù|â³àœ-)àï¡¡f·¤oì¡v—®(õ™†îçeð‚/|h/{/}l%?SÏá1}šÙxâY¡KÏ{–Õ°‚ wNÜàmºÏåÐ¥,™GI¸4ë;Ð W ø²7Nèxѧá\ù³¬‘ËûÆ8²ø{)%»ÐQCô¶pŠ^χz˜lY¢ñįðÁ¾Ñÿ:ÑhTTâË.>Ñ%:êÐñ¢ÌÒuÑÆYý²9èÁÜ~-ˆ »“ü/ºÿÒ‰òÃ̈ o³A¾`›±¥(V”¢,à wÿ8tL|GzÙ̆úüÝ8äNúH‡q¥|1Ó7à]¯d”èpáÎÒ©`=S?c_,jþ•±‡ª[|ðÁI¥?vçÐ OúÐ=;¾ }Š"y`d'ô̽ÂËÃø».¼=¬Ôgêƒy"ïÔaî@¯({XÔ.YØø'Ûyر詺D w#J;øQx ®[E 5&Ë£® Ô&)"%BÄ®iÁO­(Ž¢±VµåJKŽºnó2'úð›¥XWrQâñ\âô‰Ž³tÑ®â{ÑõÁ¬íÖ›~¤µà\ô¥ËÄ™wµæÝ-ÙI¬ÏZ+¢j´DÇ'ŠÊÙ¯pcâ"¼@ù{WvcI“Þ*f£²…¦ôªOUø$ZüUð+kó¶Ç^œó,wžpn¨ˆV1…ùE[²­‰[šµ%O0õX¼<Ø hÍZ¸æ-\ÂQqwÂuïÖ̳ç xצ¡Êò€KEYwÒ%¹Ã[þÃiŠóEW¾ç"BB%ù^ÖžÿËhgÍm4,˜ ô¶d«vƒ>°|Ù†vÚy'½¡ü&n¼;ÅEWì팑Ãô¿+¦ô|cÕöa)lwä|ÓG[ž„稇c­Ú±vÌ|`YCïsÐûãʆ=.z³JÀ%ÿ¦3oÕHS¯z·8‰¦~íÞ¥š ™Þ-KÙFG…j—®ÖÔ£o´O̱rÑ_'}:ž€‹¦ç%©NéYUµ.Ö²ÙhÔ­«Þåb':HRèaódŸðS"f»£ÇãÌÛDkä·Ý»èƒcf)›¦û¥lªTGÁì.V™1Må53xèÐuRÓP˜“*¶Ñ0‰A •´OŸ†¢?4”ðšñª¢èéØÉ‰F ЉŽb2zØä.ÂørbÃâ"œ\?,•ƒ!≀oåýÐÈÕHï=0G9 ¨Ü6áA'D‡žh8ôùXC¼ã\±ù8Ë>3…ÚŒ³èÀÒlæ€G'4?UTw…;ÛVmøûÆAüoÖ®·X8Tušh#ëhvÎÇœðHŸ¡è¥!>2Òî4wGÂùënê­€g.íL ‘dçÃ?ⱦ#?Žì%¯Uí«YèiÜ›·‹Ž ò 7¿!»4ú¬-ñÆp„ÛèSì‹Ø½ž#v‚Gr r íL¼ó›4Ñžl$D÷žpgâÆ[á hkâ3âf:r_XÚtù41ÒÍ„? z#?“‘†: ¿ã´‚ïWB UP›ûÕ,"­tä™ãÑÁŒÕá«ZhÂ-KáŒE.Ñ åE‰öŒÍLèð£@íV2+µ€M¸3ñ Û°„¨ˆ̘ysŽz2‚±¼m¡•xM·\ÍŽY…b J0kËÅòÄâ~åò‘±,Ö{ùR,3PðppS1­UŸJœfœbELlº¾ä2³>´£~bô*/ºTPÙDʾè_¦%(¬°¤DŠ>.z/‘¹‡¸Zœãê ÍÞ¢6†Ã)ß…|üÎà xðGÈØžpgéoûOXD^ˆFEôc¯ÃùØ“ÅZ¯u©Î“Ê^¦lsäæ ¦ìÁO«7òýS´cEµÇúL›¥Üƒ λêyèiJ a©<9ôWC°¨HI:8cæÝ92mòZO¡7%-¢ÈÚñ£in‡Ðá3-Ðîá´<ÑüqÝ,ý”Y¬È´$?—±ã–3&—è=Þ³D•Uÿ—Ë<Är®ðáŒýì4•ðƒMÏ^2»ƒN½È¯ÀœUÐÝÔ Ö¯;*™ž¬ TGõK-KŸm[X×— oøbéͼ'Ý«ZƒµÿÚg–¾¶¾!Ý€Ë—Æø:D9¥>GРèßÁªJÎ4–Ë¥þF–pq•²„¦DO>ôq1w#ùq–}$i:ãŽ|ÓÄÇþ^ÌÔ8dÐ0îÈ0 TR#³D¸ì}`-½-[•xÃóR¥º=™”h02†ÎýCY"Ô*ܤÏó@?q4Ñ&Ï ô•tÍ3¿…%-¦ð…_ç9q–t˜²,ijљ[CW­ÇªQ#btsä¿DÊU.mÖlIÛEÏÚ²æ-Ÿ)ž·Ê6ûÐïIe)Í)»s•œì•Ô|8ÖiÉN7\ö¦Õl‰Þü<ÖY³Ð3³Dái™Ê¡Y/:FÃ+xŠA’¦)ÄÈ'¶ÑgÞtͻȶ Ùâkœñ‰›èdÖ…ï¢U­Ïl5kèº[èáM<;+Ò×ÉšÖØg>6ºåSC§çR)&_–n\ËZ6­,ºêÛš¸¥YMôqrȃ ð¡ %ÙüìcÜ·¡%—þ~ô‰’Ôr´àag_i¸iITFÍ€$I£—é–±MMõKE¿³=Êèô¼LWxdåÒu[žpY~ÔØ'3# x)X¿$íÜð´µ#½+èG¿µ€ûd'|ßNÞæ4û?¢Ù£¦qÌûTÈfu×[ÎtœÐÁ–]š5²ØÙÕu(Þ ¤¦.ÜnÐÄÔO #˧ùgåMê0G†Š•n§‡¬WÁãSEŽ DÁÉ}´S‡/j߯¨„Ž‹¶&¼Ð*bûp6-àµÀ÷Žà§@'XU9^k•¡ðWÅa´ZL³q¹=™“ü#›êæ@ÓÈzËéØu¬ÆqÑ ’ÎÛF/hÕp®GB2·*Ò t˜¾tëÌ;T cèQFÓr?h<òªÆXtäMVcÜY¶_¢ûÿQ´È¬©íèówj$¸Ú¥¦N†7Y–‚±‚ÕëU_Ó‰E‹Ç®˜D/H‹øAÓçY¢éËòFq,¡Ü!Xö‚y,b¥ 3Z/üÐ"Y%jËÆ€ëÖªõ‘öâ¼ì2 —%ºUå&C¸óÔ‚ŠøÒUŸÕúôf>³ê‘Ú/‘R2aO1kì&|þ¾<¸z°ÑçüÌ™,ºFÀÛ» ÏÂúÎYÞ¾-oßÖ¶à»xðîÁ½nçÜY³*¸bH?%»Áæx+ï½KB¥9ïþL˜!{¥›ƒ7àÞ™wáÞ'ãÂ=]wôæÃ§fY—Ìe&ÇðãM=éX_SHK÷á%b‚,eUhK¸Š«Ø»±‰Dמî8Vùq¥Óì–d´ÆàM¸ó±·$eåðâYîÙâ\¯pFСŠâWø½ç†<èMÑ0Ñ4ḉ|Ðzèø ë@Zh Gº ÷ŽlõeU}KgÚîi*¾ujXµØ…Ò»äÂù‘oÞ™mžž ¸q;»Ò½/¦ÍäCn‡ âKð]aÄnLÝ3 \¸÷ÅôìÏ\÷´tÏÏBv w¤{'¾+@ÌBíÃÈXZðßXc÷N¼ »µ»yà=øx83]K"C¸÷¹ ·³¢e·YÂM¸w䯲¦nž™lgÏ»)Ü  ]8¿ \鞊ž¢&au¡Oi-C‡ÆÐ 7¬+ö׼؟àÁ@@7Ýî}¬ËSðËûÚ–wh\¸·òË[ùíÝÌVä±E& (3ÞW¤ÿî].Ü;óÿîÁùÊ—5BÐÛá ÷ÿ§ážiâ½+n{¾Õ/ÀÚÚ¯eí0—n¥xüî]2߀S:üŸÞS•?†Hœe S-³[ø wÒ#¿¨ôìGmÊ#‡ £æj™c¬ûæ„lj®0NhÕÚCÓÀ~Faò‚;ëf£­‰cÙò zh~XûíFθoz¦ôÐfæ‚G£c:ô®*Xd|Ð )˜DWÈì¥ú•W6«§ÚZtE+Wd¿½©ñÐÕˆ%î%ºÁTeјè K®{rBð-+YöļŠp–”/Õ"éðC+Õƒ§ŠaŽð.Šj fÕ‘€U°~+IOÊ8€ß^Æ]¥ö´áZ¢'¾“ʶFž¬ÍPvU« zf>³ZûmýŠe—XsV—ùAÓûÆÈY.Ã7F^a/žDwH!ÒÃ|xW•« ¬\¬¶‡BTxÖn-ºæLUëÖª6у¯¹hºYEf¢¶9ë´d§éEWmYŸÉ¶N‹Š1±ZÜÞGæ ýü}¤PKÙÆ†oÑ=xSNâàhcæ6Z¬yðþ‚pkÕw…^âï¬:ë½çeÁjïo,ú| íògèÌGÛ#åûE3æâ7Q0š2^‡žyËÏ<à~š©52¿‹›8Œ×A8¹ÖéÔ·ªXBàÿJ‡†c$Œ×ëVoóNWî86oSKÆ6øAcÞ¿B÷L:†kÞWöoÑÞ¦QÚðàWŠ9r‘îQH/¦ìRUþÇàõÇpgêÁfÚ±fíÍàˆìYÓÑaeyŸ‹×wVî5:íÇÜC£¿ß½{¾Œ¡!Ò—·ìËZ·å­ÛRÀ–€]ݨ·³gµ$cG·áª…ñàÏ„UD‚¿ zÁ•7¹þ`óó¿`ðÿ2¼uH¶Ù?ŠYKê çÏlÁ;vŽf”Šúð-¹Ù…ŒÑ@¾'Lë"o\8ö›Í~ Ùz™èè@A×|Åõ@RC,éŒò2Ñ gÕÝ&eKé·Ñ0>-ÇIeÊFÃX»I6µÃFºêáŽM¹Y»¡“:ÓåLób¦ì V"™h¾èæ²縼h5×ù!¼á¬–×Ýr±(SÇë,ކ0G^‹6æ]½óR-õ¤ƒÊnÖ7®î¯Ô…è“öf2tЬ[hµ@¥Á‘@²3Ï’ž–ãìX¶9Æh5Ó¤n¤%nE\XÖiù)Zé8T·¬î|cK<òiíw’zБ« :}Κh…ƒ¨ïj[vÓ®¼¡¢ÐTû½»5ò¡F½ðQ¶ó¬hK¶3ï^^ÖÒFokäÛ”›#÷º;ä„ëQˆdÌûEÇÈá h¾jï˜=´3ïêèó@#W:-# Ú‘=¬y'š®ùŒw0+2U CÃ^;ê‚DŸ±‰¦ŽcÙ©GÚµúðô¡søi*Vì0}Gè÷c÷·¬†Ítê÷ù†uD#´©³j.z7˜ÎñA3Íd£eÝ3—¬Ðï=Ƭܔ} vPŠô)CÚ!Ñö2·<Ÿ– { ë>Ñ Z=ß@Ó&ˆêP1u¤S?h¼c)›êyLðŽmeptFYhRpÜP"‡Nͽq»•wt &š&%Mlx\Š2ìXt¢lÈkË–‰M?ð"/6s'zãƒè Ó´F8¿m4K”Y] ìÂiÅ›Œ5gìÝZ·¡¸ËŽüýH™gRhgâJ*¤wY‘¿‡e«ÈÞ²–͆‡z¢cßF~WÂnå nL}[Gf«¤…¾oʽÉéwžµôÀZèªÝÚXõècly ÇWĉšêRÿ•ª‘¹„á¿‚‹›ÑzŒÈúÕÂÁ/íÇð)8«2ÜÆíS¿µ_¢ß[­5˜©$øVg_Œ6=‹ïùÄMÙºšÿ9>åóT5«õ7}'Õ,nàhsä¿l«e…˜èc¡©³±Ê%/ÓãÌ»U3³žmjþ»;dmQJýNœ¾¢ûéø¬úð(Ý‚›öã±O`鉛¡#¨Ð¶ciu#J_4õÄdõ;õ¼ùè ;ñmÎ{âû¨)å‡:3šè\ÔËM¹ñ4Œ•Ð:©Åàš÷j}¢/ÜøÈ$¼@R“Þ 5H¢d´½CçÖroÞ²n >BÎÔÍ•³à‡²ä(â6Ñ&þ~ýjGš–Яÿ ©¦Ë¢¶¾‰ž¡ahØ2ªÇŸ ÍÆ­|Ç˶cè,ów„á]ºàAÅYôQœye’0~‹—‰ƒ^2Xéª-ÞwSè¸K±pÕ%Ò°ÀHï6DÏÇ‘=‹‰V6êkœÍî¡ûJ}p¤zvS¸ƒ?E‰(ý1d MïÑ™e ÐbM4Kcý†ì_W/ÚYóœ7—m¯9+KPª–1ïõ8#O4=-Ku¤ÞE+“ÜᎭâŽÜCÓF¢»9”·y¨Ô‹¦k(˜zM6¼æÇE—°@z?Žì­tDzh |FØŠ%¹løV ñP÷gáñ)ŽÏꤑÎÑÁß×Í”Ý-ô°Ð:môa”h,{q¹D7œC{äUfÝ<Mç=Uñ3t±Ðõ§èè!€Nª óâ>@]ÅÎÎȉ¼`ZhGö²ÐÞ7öï¢Ï¿Š.-\UŒ²DG¶‡6î±y“o™Ñ4Ã1èÈ>¼£Þ¼©ìMô†å;ófB2'™Ð§Á8¾HqbY¢)ëT“cͳÏzÓ#šMÙŠg¸¨‚“ˆÊn<·ÞŒ,[‰,»~*qýÙAi¾¡y?/:ù¥S‡§¥K¶:¬2ó~*ŒoÈþ%ZÏX<ïfµfí·¥BöŽ€4C«‚–¥@Έ©:#Ϧ(,v |U\9T5Ð]ËÆÑÐ…[6¯Á²‡5òÌæ‡Çe$1÷²Ð;9‘éÐwÍT¥‹>«³e3 QáG6«³èSº‰%Ù̘Äó¶[†±ìmÉ>¿C¯æœµd×£.—¥|æzÓêÛDóÞ–líí÷q¾Ð™IpÕvqFn¢›‹æ§eg=‹¡ n¨¦m©ä %¤4sóÒ â‘Ëö`ÑÁ)j?cÞúXÇÅúDO2¦S ÿ<–pËrñц5Õ×ÜxUëypºó™œaí˜Üƒ,íQhgäz‹â‘[σ“Ö·eïã_bÈk°îúpÜ¡[ LÒs.ÎôZ¢©wPMhKjºcߢqzW­ ­˜hC¶Ñ!ühcÇ,t‡±¸E¢ùš_Ùp¿“ú‹~¡ÅÒI¿…çÝ8Wk¢ý$kJ”èk&„Ž Ë‚ûgYl_Þ`QÕR¼Á‡+©¿¨™,¸sÔ§u`&w›,Eð¹Z-†á³DfÄ?ñŒà3k¡ã¤ÃU«–éRoÑ%üNêP]]¶ÉÓ¢–h+h÷Ù• |âMÆK‡iKj¸lÑHÞúqö,¢Ñ¿DS6èuãè,aä #w¶,Âð†ðâ|(Ýp ,Ué#ŸÖÈ…f9>Kå•ÓûãÌ[hj¼tÃÇ·"íÕQ-K4s¬~Ðê‡Ñœ-y‘Rn ïzX‹n}áÙ%×@;#W5dZªŒî0ctݺjjã{²§.Bú¬›Õy6÷céIKewù ïæúT|ÂÛdeÛ{èh‹êC>ïÕ\t CŸ¡3Ç—¢õ¥Vö:¼G¢'Ö[mIÇRtòļ+Þ¡ZQºƒoÑ(Âëø)|º'ÜZ·³2/ Ú.¯Rã,ÔÿðRåûÒO¡š°à[a« ¿t¡-áÅ`J»pSº•CúyÇ]ß+]<|´tÛÔ݉}ë‰>З°od¡²»5òñŸRiMþVØ­Âät½¦÷€IZ4£$ºÔI¶¢W –—ípjã>Éîð‘”èÃç]9_ؾq7CvÐyëeá„D7Hç,ôÿÇÞ›åÈëȶS9CpõÒü'öœFÅ>÷÷- *Qõ“‰DÂ@J®†bc ò dznEŸz¸ÎzÈÁ^*‚¿Ë…Uî8Ô,á¢åc½‚÷- euußPÝ‚/kÚ—'\ŒïÌSšhã£mKõú¸ð³ Ù›h>oµxª›pÕîvŽŽ6ìtÞš³bª·Ó^¸óÑ”úKo•Íwyv¤À²3îf-u]L´³\Lá*¨dY ‰æû¤5½é´BZ÷àjAÇÒžvö'0„[v„6îÉ^ںțWXžº-û8s®è<_l™–@U¿\÷›”µV7G¸Â>,áù €±ñ¾ôáXõå©®¸%«|J47Aú¶nôâH4ÿd£Yè\mŒ„s+ÌÍ'}Xk5 Àÿ"zªQ5õ¢ÌúCt³ÐÝDŸ¬¦ìa}o­s–7ýA{²1zñ†VûVø;²g¸"ÚÛ¡Ö‘œ4Ø],tý³h= YòO¢=Ù¿Eh(ÿTóî<LôPÈ ZkX²­·¬‰V£>qÛºýéM´ bC¡£z~±mh>-ôâ-·È ÙÇ‘}Š…®Î;²+’Ðá`„Ö^ÖØãq-%•J‰³µ20D†ÁЃŸ‰¦ßûÑÛð{'ºBnÁsÉ ´¡ù²fm[š{è㌻4Í5¿e°t¡—ìÌ\M‚Gš:Ü£E½ß7 ¼•ƒÒòá#:è ml5™‰²8éU¬©,E>Ñê0ÈÐÕÒ¼š²9÷Ð7l9YDË·I5*ÝÝ!e[¢äÿ:âà6–‹ž&,ê"´5éÃZ«²²YVœ¯ú´æmZßlYÓf£=Í]¶¬ãeñ¡=nõÿb¤L‰6Æ}¼…nÑ«zˆÅªN$¼8ª·Çùäíq>Z+&ÚÑ\͉¨íÓªóÁ[µ>¸e´fÍÚ°4Ï×,ÕÜ2šüM¬ÈþÄîX; Á=á:œøÈm“²i§[[ó-îø,kbéa܉64Oô·‰wµl… _¦ðþ8óÖõ¤d.F¡Ï†ÕæB[ÏöFð>éY#¿YOæ63:¢]1>™xßXƒaµ÷sÐKµqtÖgÃüÈö4ÿZÔʬå{¢¹ìñXèj¡ENÀ2'ŽˆO ^-c[š{sþCô|8!D¢ Ù²²YV¢ ÙŠ±´ËD{² tžçô‹ Kö/Ѻ‰èý=­yz{ÌB/kE^mê`˶¾÷OÑ"aÔ§G][ ÙÊ}`T5'âû`;ÑÔ¼ßZk¬<*eol+¦æŒ~â¨cÌás^-Í=tû!zZh‘*²\U¡=Ù6ï’_j®’ Ʋr>]W ìS~fýŽú¦l˜ñy”WE™u;ãþ»hk'ºýJvä&ÿpÜ¿D3¦u©u¾˜tÈ^ÛÏ%ý*dºdä¸-®g,*W½høÉͯÿ­L2gÚ&^.ûù´|¡šÿ]ôÁN®]ø%ê£k˜{Èžhjrº[š«1Ò&ƒ‹žì`ó5·ÖZÙÖZÛ¦l-Ös”wÑžl •_t­Î‰l¢ÅZŽœ¹¶Öy$ѕù ÷„ÿ­œ‰A<.^?DoÝ ­ 6ÊE¿hO¶‡>ømªMzàÞT‡¢’n–ìeÉÞ&ú@R^[v—ÙƒhêÝ,Ùª‹BdïÿÐ(+z«w·‡vƽ¬÷ܰ¶É°¶htï(ñ§hS¶1î¼á±8¬>’Æ~ï©F·tÎgØ\ÔRËÙ¢cYš/Ñó7º\¬}lkàÊõ@ݤ&:¼ƒÇ±6Ùq4Ÿ<õ/ÑÆœÏbÉÖ¡Š*}&#¶t³4÷Ð<óÏG[×Á\&:ZäÀë`ê ŽJ‹í¬óãÌyðØpÙ&Ú2=Ͼû‡ÆšOKó¥\xž/ë ^ÖZ[·Ü¸hØp«›²!;s=0š· ´µÎM´õ ÞÖ]b£Íum¸Î·Š¢éí¿eÞÓ÷ûyœqŸâŒûT\*šhGsyPYQ ­Õr–D­»¶¶ßg bF´X ±lËf:ËZ-7©Mô»ÖèËâ¨=‘õ&:ÇÔË.ÊèЛ[Ô2«³jË‹¦ãÚ·‡6N¦¢ŽYwI¹éø{wKóþCÍ•?×}^.Ó·Þ¡ƒjîÊvÐÛDc×àÍ^ïE).†æÙÝ‚‰†íA^tIÿš†ú.ÿkÑçaÌ_Ѽ³ˆCK ú ±æ:ísô¢Jô‚1Ír“±ð¬ukÜ q±7Q¢qK6{Å~C¶7k®lü½e;°8²º²¾²™ß!ѱÀ\4MÆ*J#ã_¬Z7Q¢é3e'_"œµD³T좶_ï‰æ³Ö¬ó¼ÉÏ„˜–Ý,ÙMÑTx¦¶æØkMž"–l™hã‹ug­5ЍÂ4ÐÓúÞJx`‰û‰6fmb‚ËD¿/ –±`kžITó|‡RͶ$z1曋ž03·Üì9–TœhcÜ’úUú˜èS°…è§:BG »?Š.ºþ]áé`Ên?Dwg÷|ÍÁÓÁ”m½ÇMO‡Ì­ÅšOKö/ÑË·‹ö|DÚçÃGPÈÒÌ^Áäi ´Žjð %ß!šDǼÑ}æÂƒœ»ÆÛŒÁ§'ý]3µa‹s>–ò³ð$:¡£,«ÈüТÉ^küÅàÞ¢™Êœ /ZWxSƒs–QæÃG8ãYåD¹ #é)5õ¨eI¾B¿ õF ´XôŒ›z¦P§ÕÜ–æÛšsKóõþ»LÆ”‘pcà!ÜØg+SÊáñ¶ª5oïQ ¶{Suø.δmåAÐãiWKvu˜×u ØÂO¦²4Ô–îÜXé™ÏOέ^¡t‹ïfM[·îñ­¦™,ÑYè˜uz®ï|ÓÓàÙ5,þäê·AƒH;{ A›u« ">`”X‡ˆ'Ã`”ÿŠZOçq4?µKr;Ü)'_)Î[ ND~чǣüdÁ2Œß£õ¢ƒ•†rMSÌNsRP|´±Ð­ä™$h¥i ¾l ýš«^FGeuÕ7·^~ŠœÀ)Ñ–x•KçKÛg¸ãnütíhŒ}´,¼RUªL#PZ-í£½+šóD/X –h:kÙθ|H'š®ÔªÒ¶ wè¿XÁÍ—.Ú÷9Ыüqÿ ]]4%ü†ìÓ_>hf;üxÜ 0GYàCy¨¿Ið ¥Û¤+—µ†ýÀ|^x‡î‡ªbÈËÛ„Ž·,»Ä«ª!kTzуõûH¶È€¥šg«ÑßÈ–ùÁøe¾æã.ÏÑÅ™ó¬oÃè®àË„[”fí ²M4íÿð{Í,ôª<´ ±~¨é©æ’ÍÈÊê%¶gñÁ/hî «5î*Hº¿«µC›5n¥ÐGxkÖ÷öÐ'!&Ú˜5í|ïþÃYÎ-…»Æ¸§5粸X)BUù«1çËšµlÐBgmã¶•m̹>سÙïöUoÙ/Ö\ÖKì®*žmøDî3k]V£2¬/‰x\©]¶õytëöïùþ¦š7N#ô)ØÿŸ²ñûËèÓanPUÉqÞÁÞ-ÍåÛc=U ²†ÞáÙdèc}1¡iŒÍ–>Mú½9kº<´¾½†×ß>g±Çùd6ÚÓ<˜Vø¬a&†æô*ÅúÞÅ15G±¾˜àÔá2²Ö—ŽÛºŠF³ÖZwÑ V'%vH¿èŠSª†¤:4زÑ}ˆšèå¢qËô ѱ]ôÁ.2};fÁY›3ç>ÚмºèÊç¼Zãn¿E·¨øÀhcέ§äíFeíh¾°ƒÍÔ|X«EeÙ4<­»dZ·àœÎy>ÏOÑ‘}Gc¹žðõXÂ×c ·ÑÔ•¼Š%»ýÝ]tÅîÜDÓ„(_öƧê7ÆÑÃBÏ¢—ò’]…àŽðýSô)8î6A„²·jƒßUý4Aä²tùÃèSpÆ„-ÛÙdI6A “’±‹‚±¡bìVÁM‰ÚwüH4eˆOôÁþžÝy¹f°Á)¸ÜbKó¡B4®y$%Ó9Ÿ¼û£Ž{paÃgoípêѽDô‹[èóüïhx.šèa¡µÚ&Üeödÿ ½~‹¦Ý+Ôy‘í¡ÅÆN‡vû}²$¸DW÷ø†ì¿‹n0ˆÞnU,û—h±[Sîå" -› k®7x3ÐÆ¸§…Þ<2ÙTmiȶÐÅÚc&ZO²…,DÓXrS¥§¡yµ4¯Î:/ɵÞ,Õ=´\tŒ•ìƒöd;èÙ=þɦ_,ÑèùßTUlŒÛCOKó)ªIôžû'›j¾¾€¦ãš±ÚšoGój.|ª-šÚáz‹Dš{èî¢'L‚“yl&Ú2\þ.º=.zB濦šECv W2‹¸ØèúCtÿ-º@ŽÊõsŽìl|I×ÚÿVôþ)ZÄ¿(Ì%±gC ÛDªÿ/E÷Ìׄ_,‹÷°ìògÑÕEoìÍõe?ؼïY9@ewõvc!¶/÷CÙ’=ðËävBdx-~9ß,UÖO<ÍïÛ„%]6ªpÕ‡µX£ÔÄ@w mÝÂCíÆYÂF»å¬Qº-;W:Ëi‘Á*,\üzÓÞGMÝØa,Ño²”ÍŠÁ›j$ckÙ»±Â~ ßS&š–­i_¸öéiI_\z÷¦®{cZÕ©./|;ð`Ã…—ùÞÌMu¡7½y7ájðÆR¤„¶„g›³Ihþ~6F%p…WHßܲ¢@Š•–;ù!8%IüмºÂégûÀ¡ó'˪žòÙÙ˜†K£ùgtP§Ò»h  Eó¢K}ð›'àÎÌu£™v‹’Kúôà+ ß.¨lÕøVÏ4F·n£¯1m’ÿpÚéæÂ'l»ò?bì¼ûð¹¸^DÿÆàï1Yh‰„àg:‰.eãàÒVsj°÷NsÞïÀ+~½ìi ÿÓ賿ÞÛÔ‘ýctÇ=CïpL1rˆDš§Û›µ~ýüÕÛïc³LüØ ¸£û 7*u'Jø€Œ^)Üøè:ÚÞÓ.xÕŠ ¯#Ì ÷†~¬0MtÁÑŽohŽÑ%®bV¦Ùn¯aF÷ Ùºšèè‹Iç\éë¬ û4ÿ«èf­ó¿‹î&:˜­áM²/æ¢÷Æy÷æ¬)óÏÚH—+½­·U 7N)N4k²œ_ÓÔ{åÎÛ´¬¾€—ƒ_ľôwâ+ýlÓ9GøÒš)½Ã„ 9Q&:ž´œàáÆ Uèi¡ ÙA¿‡¬Ýïü¶ûzÁ°ùG6³W»J{´ú„vÆ­™Ž6ø7dÿ ]Õ •Ž{X²³ E/K¶‹§ú¡Üþ~2G¶±ÁíIß0dÛp˜%zÁË¤ß xf,Asü@éQÃiTÌÃ*øøƒë&+ÖM–²YÒ¢èçÍ‹õÉlÙ|“™²•¾Ïr"„vd‹ÊmÒï݈~_uíéØ=JÁ¯£³>Õ/‰ OZ2Æwá4ÐÙãn¡»èðå³ì¥pÖqéóf}ôcMÜoÑÖ¼ùÂ5ëõ±–k}LáGVÝøh¾êZM|è½ò¢­>`b@>ÎjáçÀ¬%ÝL´5íÝZ2ÝR½Ûª[ÂÍèiiž6«ˆ»ð=‚Gi=\=.„—f Hî Bgz²{hÏ©âA`ŒÛBãißPÝ„ãúrEá-³¨s=à½â÷q+žtϸa?¶Â êþènluW÷׌ª¼Éˆcì]ÿàïÄãEÓ¬Ïf´¡ü‚lsÚ<ÕKy°5Òdvº\»+D€Ê*<º8% ,NI´![ ç=rŸ¥¡ùÔz‹uLk½ŒeMÛŠÓÜБzáFÇx’J2櫞ü€›NS­Å^¿_ƒuXê|úš/4£dzÇÓ¼ÇÜh¯Ã¿ÓNý„KM­èb_j FkV6Ĥ²ß3¢6Ø9¶ÉÙ»Uh2òRÌ”†š£¹óÄþÍ]ÿSŠªÁ1¼ü¬t¥7Ozöûƒ .¨“jÖ§›Nœº,Ó'ÖÎBSÆöÐ#ó=Ž(j{³J98üÂéSg+G€RG‘jú0>Õ’-žfíɞ؎9Ùæ ~ð£žàŒ_-Ñžl í¼²n“g:p}3¿à½’-ᇶZ´eo í.G‰=Ô3˜Êþ1ºüáeF =¢>W^t`ÒÆEðB;#Ÿ&úP Ä–½ô͘XpO¸îè"*5Ð篢ËógÑi0rtðð KxÜÕÌã7nµ'w‹5sàÈû4ÐÌáÕôÃ\ C›Žpµßa…1‰>ÐM›hã“oeñÂCÙG7å·!;*Ð 7ÛR8tSõb¡7•= sÁPçàŸ'?F ­H-KbµÑ+âúôL¯Û’½9ßÃG6sÕ[Pƒ5?Ö÷veÿ}`ÒðG6+Êq¢šG—ê…_M¼&Ìy1”¤>`³›š}Ь4 Ñ[›-Û °dŠq[Eã.ƒ^Á!{À"ðqP©½— Çx¹½è'se;³¦g4£àI´±M–5îåŽÛ½]t7e³ÈÉPò«¡¹…îz„32–q“@éZû?4B+uöXhG6M_··7K¬‘¦sJúx‡vÝÀXöáGoÚ4l(uvÂl!¡Í]´óŦõÅŒ(Û÷ØVÐ…µ|Ó>#ÓO+Ì‹û§“®«Œšªã±„»ðâÂ#A ~¶Q=á6ѯ± ²ä›oÌ%Á˜"¹Ù0ÛjÞ&íÌCšèŠ_t>š¯–$÷¡ß;ÑôMU+ÏÔÚwz]à ¾6çU{÷Ù?Rx‹üBõþC´ŠŽðñ`”ÿÎàDŠ×^mËøŠ$–ò4oswú:È&åô\·5îííñ`RÓ¥*A=êQn¨~¬å¦†ÑR·O5Œ6”oÞñÖºóÙÚð„«')} gWQVjöÕy›ÎNmÞñØ–Ü£ô„kÞ9‘¤3ôˆs…gÉt%œSÇp,Õûã\,]>N,»X ®oäʵgE%‰æ[-{6Ò@D¢hr_4×Üšôê\ȶêºy‹Õ²Ø»es÷dÜ£Þ£/7æÍ»O¿g¥%ÿàÆØã­D/†aÝÇî̉`|ºÂ­¡gÁ 4¼³Ëi¡§³õÈìž ÖoÌ6õËùh–7gÖ‡x`QÂL²$ÊmñÕƒ~Núß‘UY¨¦ÖѼZ‹5ÈŽŒ§pVy¯ÃÁ¹e Œæ©Þ-Õ»5ëÝS}¸ðÓp.ÉÐÓœõŠHÙÆ¼ UC±Lâ©–¾Æ'OîAøDËD;š‹†UbÙ²·‰¶ÎFU[Ò´ˆi]HSF—4“fjágùe©¢ó6­ËtZ×á¬aƒÐ”Ði]H³)sÏzsŽÆi݆¦fdJÐ\}L´5o§ÄóRÒÑgùz,ÝWýãpã¤|áÛ!à›¯ûƒ \VÓ¢cê?›«‹Ù–ÊîÖ¥ð˜8:ï"¢îêuÝÕtè#oVx?,õ¨a}îçåˆcìüBc¾”ý@¶ò”Ý#ÌÐKìüÔ–Zé “®”(Æõ ÙüV\;k!t¤ÀsÙ¿CŸŸ¢K9øºŽu.û N Z–·gÖmtÜĬÝêüP1³m?Ö´g½ìò[Ù<–•”´|‹ß–Z>ºã<öD³†Š‰.ø™³³‡ýbö¬ñ'Ö–3¥ÒYÖ.Qš'M|Û QÎ…­'9ÍøK~9jézâ0{¢)[Ä‘‹›ÚÉ/úPzÛ”ÝqÊÝQ>3}NŸÉ{Äí¬õþ¢®V_¶^?E;«Å“½­ý½ÅWN5Ïþ4tyçÚ¶æüïÊ>Ö÷>¼•³Ðžæ‡;ÕÏákMM»ñ¬­M£<ø‚p­†©¬$úƒ6d‡‹™=)»CÆË%Š-CóúSÙÁ´N¿˜§y’\¡ãa]š*–oµÂqZô]"kªÐÄNô„©¬ëEUt°Ùè$©@WQ¢ ÙâKb^Ñuù’¡Ú âÜw#Ñ RW'ºÀøu¹šXÈ'Ñ4S^±žè»ï±äjb„ ë²Láï­3•å2$zÂÂŒu©š)I¢i3B‘¸„ÛîÐK¶dȦ þ+ÜzgA‚+¡Ó½ˆÑ´QêG6#¤M4%%Y±N΄äKä;ºkÖ‡6ˆjþgÑUu©ÔF~ÑÖd©Jëò©ŠÖ‘Ì8M>h]—O…%· GÜ੹7k­¸Øwè>IhÝ&ÛúàÇD;³¦” ú€¯‡§ØüvÜí1цæMÉJÑ*ŠdÑžD?qHhgÖÅf,+ø†œ9·®A=8WãúPÑ9_‹æ ýž©,ò² Í­Û ©Èž¥É~dS×Cʦö} ÿbËy´í˜IЄw‰u‡6Ý߬Õ–mÝcÉ,…5·eS6µ¸šlÖœö3k¬/È×ÀvKWóiz¶tËwhZ¡õ‘MO‡^µÖå ¦/ðÞœ°E÷^àA4ñ³¦wkÒ-³§ëËÚ mÊæ×/[”ª m.}9ã³Z’å†~ïa=kFq|ÃzZŒjÍy³æ¼Y³¦æôQ†lËìI4+j’Ë!¢šPöÌh.übóqVê´"ÓZçS1Qꈞٖjn­s[¶ñ0I4KB_QÑ >’‹knÝþS®ê ž*Z¤ô¨§Ÿ¿¦JÿX6¶Ð†}µü2æ.•´»ð†³Á¢¦Ý¾¬—‘ʺ áUy2ð\ö…ÿü7ðö—áý×ðgbCè÷Ê;ð¡²6zZèuJ]_kzª¿¿êÆÙˆkó))ÜÑ=»?ÑiW¯0M ÷¥: FÑ#t©Öô§ðiXSx«8"‘åå4¥pyÍ9Ÿ·ß©¾=cʇ98z¯_ƒ©9ËýhNƒM5ЯlºMÖïÐýùÃèw­ÑÚ‹%[¡`VŽúÙt¥v+p𢭜ڷ$”šØ>°þ(ÑÆœ«)cÙÚ·þÙ¸¾œ‰^00ÑÆ¬ kkÖ†«9Mÿñ¸­;´OKs¡Yº­­ù²Îó¼ýác°ËÁ6éÛJõ ñ–ÞéRÝæÀ]Õ½YŸ[¬¥Ñ”FT»’ÿX+Íš.Ö,W§²£\}áÅ:ªóÉFu>Y”Œ?°üChgÖ~‰îÖœ eK¶®QÆá¥®BáǦ+uZšÍò½ }¸-{Y²…f}‰ö4ß°¥âŽ3¿Ž{êiBMŸ¢“f®–D³N’BG”‹~±i¢£§2ÜcsY²]ôÞ0—{‡­åÈ>aõ°æÙ4t`kî¬Te[6h;¬l=g-ѬïèЇG5—zAÒ8Õq £l:’ïájI4]©ß@wkÜXvžçtÖ”ëÁšÅ$ÚøbÓ÷rÑ 6è٢谥ÒV…1mþ¥ž‚˜£çƒžð‹ej4Ñ 3ú…D\s°'/ RÅ_-äEÜx’ Ã}og“íci.âêKNÙtÎß °tJu'ø9°ëéŽ ×R¾Âßã¸< []§Zº‹h1åî¨Ö,¥CÞ¶ 7&®»ðMÛ®î[ý‡'n©œnT¾½Ý²½y— ¢Ñ›<)ð|ý¨ÊÖ@g\—Z îl2ç:9‘ðùÚ?ªnÊQ);a~¢| ]ZHÿ ø¦5Â:ÍÅÄC'®ð¶GÝzù&/-–[¥¿-7 …«µóˉnÐðÚÔœŸn9n–Pwn«`fô[kË õ£zW~“ÚXèË:–ÞŒ ¾ô©Cwã>ÓÈiÏžo7¿š (шà±`é!±x£%¹*ií ÑZŽŒuj^Οè ËâNlïCI턤ÃÕ&xÃ_ü º[ÂW­©z1ÑŽæ’Í|GÝ­ ÙÕûdžp=Èé.Usln» >¡·RÖ®5qÝZo²7E+ÿ…•¿µ‰öÐÆ¸§µÜlÙòÓ~d³¼Ÿ£öØÅ¸‘Âú*°TKð÷‹³ìºD?ØI[·ê~©På…añŒs›s³ú%íFq=4×ëñþKáíá¤B¿·Â‚ æE—òÀ(y ?ø.–pcÞªn4V#"O,ÌuŽ6¶J–ìþ¼`¦%{jÁÐGùmºL…/kÒ³Þ‹N[Li<äMÃ÷ÇZê]' }[†ðÒ`~@ ï0ßì¨ðÙ˜·;…zö}ÙºZ³VcÜÔ‰Ò•²p…¶6ŠwªGbãNéÍÚ)Íz·„EDh®Oçlíq: êÖÁÞ·µW,£7e3â•£ªNã‹{vg §÷a¤»Iá|Ö‡u¡ ëF²e;ßlÈÚgý—OÓZÂu'ÑÚðî…¡TbVëTN[#œEÑqºQ htëJ ¸óÕºµÚ‡µÚUkÀ²¨=`ƒÐ¥>8Æ?†5mÓš6ë.~Ñå¡é‘'ò¦¬å¶8­¥ÐG{¡·¢Aøx<–êÊ¢NÇM; ­TøÉgF¢è´Oå0ÑŒ¹lÏÚç%zá3b*‰U Úè¢ûe¾'¼ ØkèpgèjMEÜ/úÐÒù”mi¾VÑ”pç›{¹_s|Ž•ÖÄ'»ýè3GN¨é<]‡¬%Ù‰´³,¥è†Ñ°ñÌÄ\x/MݨôŰÔsÕÐ í |Kuo£GUõœ*‰ž°ï¨N–á5½vf}«Ê¤QÝ}éÎWÛÖ’Ùæ¼GccÞ¼—Úq2¶:~?8·ä·pµ6à-ãi¼VtßáZ åü‚c ¤+|ãü”€Ç¢ãº«f–JAÈK={8Ù1!»á˜ý+ÕHØÊë¡áß-VzJeïfz¸gyø„sŒ tQ³M¨yô?6dO =/àZK´'£ßïM+”íɆèè…–+ ß&üÝ¢(è}ÑÑ»ZdBè…yѰUw å±EO•l@>0t6}à“ÝF_YÎF•W骬J´)<œˆuó+ðl(ŒÑ™OVÕr%ÚÑ\cÔ€ù¿²éjµe[èòtæGJV¼Xë(<ágÀh>ò/¨þKáÎSä´¥­TO÷ìa¡±êÝúhÝxw¨2¼O>¬‘Ï_£‘3$ÑQúOælµŠ5Wõ$¢‚¢ç¹hcÖš<½ð>5eg:÷{2WX¢pë©Ñúh¾M¢D¨-|6fOJÔþ<ѯ2‰’æE7øÉzÏÃÎÛp\­QUfÄê\L½¨ îEÉì:ð2Œº,gàJ榛üEG¢&—]:lSðíœwwú º²ü­dÍpd[è¬BÉ,íÉþ»èΚs,gkHzýzÒkèèb}2%tÐèÛ‹>°‘É• »yeÜ›¥=ý ­—D£B‘@«ƒ: Õ; Æ±mŒ»b:ë‹n,íþŸl¼C«µÖ*Nÿ9Ê„ êth<š[Ê ß©9^kBÓ0ÊÈdVš‡22%“Z|.<Ë[PëÙ£öLF&ÉÐæÀŒLÊ„ãÉ/õ˜hqò Z®D¿ÖÇ¢ûlYšoÎaêÒá ¿¬¢R•OÛk:œƒ—Y-ÙÕÚ£‚w ù­îy¶ÒfÊÙGˆ[xHs9f÷†>¼Ï6âd¦7¢æq?Ýð—¿ ç´4wÑÖjÓeJs·Suú̘Ë[é˱õM]¬‰¦Yç¦ìÛc_4·Öíhþèÿßè̦¿y\á´·gÂd†yÑK>/TŽhÑ!b´ŒNêP_štjé/õ s¾”§O ·~Fh:m”PÊV¶×„§ê.΋潋Qú%ڑݬqw =\4$à ´îAÔº%ÑNšÙÎ"$Ô™êÂGÁ¡J®: J¿šjRè£6ÑôàÉ>&F9*[/ýàLŠh<ìÁCwx.Ÿêäðž$ð†û4ú×sÔŽú[bá];…®·“…óº î|sµò u’gxóþÂä øô¤Ëè¥GÔ‘Ãt24ßê¨A;š‹zÿ˜ÏPÔ½—ÎZQ\-‚ f¬—[ŒeOKö´æ|òÕRTÌŒorÁñBúUQ']ô€•÷4»‘Ê­dfoœDè9²e«š˜¥‰%ÚXèç??Ç·Öêqæ-šØ‹Ê«ÈEÓ·B¹-pé&-ŠF šDoØó/ùäÂläè° P[Ñ€‹6ˆy"mLº®#¬ù´&]׋E|d3›±ÜF°Ìa£7¦°Nt™ƒ/r‹³¢Šr’"öÅhæTWïµwÚXI¢iýP¢+$ÀI4_.õqæ<ÊR Ù:SÜà÷®†«±Da(íJ~JÖfnè©Ü8£²s@¯xª>' Ò¦ê'^g ­7#k*·?$^/S#ãXHáÆ7›Þ¬ËÅËj+½a)J¢)íÏG6þâªA|‹ÞÖ'sY•Û ‘‘þ$šÏšŽ†æp—E!®±Ð[q–jë?D'™µšw@´i-7ë€ô„ü}‰®ØáÕÒÚe´߀;ó¶­‘™ ô\n¼‘׋ÎzVDýèbÉ®ÎÃ.JJ×kY^ ,‡-·[ù¥-Þ>ÿSßCŸvÝ; ºRÝ©“´ëxcå E©Üè:ÞXÞôdwq·ìŸ.O+ë:*ñjÓÉŠúèl°HžA3:éÇÚeQ™9¹à¦t þþd•_EµzÖf~Ðt“9Õ´€†ûŒeªD ’¦Î£1Ì74ÇèùgÑçwèùüYtS7KyúŸp¥OÕOS£1Ч6Ìﻪó@k ·¦V¼ÙóV9 ŠÐžì=°3 5Ç“®û„>ΦuýÝ-´uŸLeðRëcªµ FÌŒðÂGÂT-.µMËË­có%ê‚“£ã\¤f¾à »¦§H’X:åFž½ ;úÀ™ÊH¤Þ›@ÓDP¡ã=ÌîLúŽã…æÖÍ㸠§"ÔMhZ(WÔ±âËh½ÿ<áHð‰ÜþÀ®ÖGä¹vŸOt6@Åh¾XM}7«…ÓŠÞG/zSY¡K_ØP_Ùü€ÞÄ+[ãQ³o©‰%š -_éVW"£:æ&È­á8*}ô„0ÿÎêÆsÖ?"–Bއ !*Íz^ºLi”š® ‰þ›ÜY1.Ú™õ4à¬GßÑRpjákìþ^]¸1ï[º4³‡§ú°„OOx2A7vê¶BX6:Šö©õèÂOd}³ºZ¡£ÆÞ ûXËy¬o~Š w”/Ögó•7Vl”Ö–†“þnu oÞЛ÷Ý|é¼{ðaéË‚– D³à…Ÿ.2,ÜØ0Ó›wîÝÇJ-9Þãá˜W„\R4üxæÿÉ69¬®f«å ‰í^¸sCøð*Š{Ôý7¥ÿnÔ m wnÁã¹ý;á æõ¤ðç@zõ4(esÝ ïÐN¯ÆpCwN¯V_ºq3'zÁo[v^̃]o]¼>o¤ìƒšÿ4GÞ¥ªÎæzX„Ž_dÔˆœÖ ×Ûo™«*¬ tÏ–œµ@X¿PU#Ýaœ§F•sT °¶TUpgÔå#t4¡øƒGÜZñVó•×jö‘e1Mi«y%PÕÓÁ@W«š¹Ò*‚;C·Ñ´o½ÕÆì‰\³ÚøÁ”àÆ¬wkÞ†‰Þo5 ˜“>eÙ”w£ÞF°,¯JèwÚð>ËBix×ìÿÆÚÉ ~:L ·ÑrøãO¶-Ù'b¹,z/ÃÓ´Ô[³Ë’U…Žòx¶5ÃeýA³Ä¡/æ£9ÏÎ,’ëÃÛOáý§ðlqÀÑÉÅÉÐËDÇSÚÛYhM-¿¨”ŽòvºÜ•õÀ¢™5k˜ÛToï^ú¤î£zÈ>ØöêÅ’]¬qoÒ‹2£¨UÞ†îÕš7ñÔ±„‰z&³^ õVˆ³Œ°šåfKji´k àÑQ®—dšãèÒ¸«³Ë…òøªªÓ_mËZéÙ Í’ÍŠ„~o³Îùm ÷IÔkõ ðr`M^½â§Â(žîï¿{Å;MÒùNbŒc-|áÕn£Ÿõæ}sƒ;¾F:|œPtÒ»T§f«àòPTuètVŒ¢‡›~sïBÍö ŒõDè(?öþ0Z¹ ]Úâ'ÜüÏáþN ·f]ItÐ-ðʃ‡ùÍ©ýwÑt¯Íø…”YÊt«,ï£--¸ãÀMé<üPô«e%*«•u@noè_€O–QG]šðú åq«¡¥u¨Qý= ¨æ5¦\PδMÑ5¸Üƒ‘¢ ì–pá2i¢ÁTë#FQPo'bzʤæŒÈ£†Î¯éÌÊ*=qÖlÖ¬%O4]m_M¨œsÖ/¡™FPRÐqwë{Û膯„ â0¾Xvï>ìLmè÷–½O½PsY³¶ÈDrBÐ'Ú<¼É„ÐθŬ@sz£­ëÀÙ™K]¨Çs=θ—â1Œ"Ñ´Rý3kŒªF0$Hຊ5k.Ú1\–ez$—-˜Xª½¥_¢iJÈÊ¢4z>,ÝàÔÞ[F»ÉÏÀiZj¢iÞÖåÑ0àÁ¡J§M ø6Ýâê5IC"IáAŸ6ÉdA3C×pÌÅ%.OCóÃÖkæáD—KÚMt¹ˆFЂ£à:…¥hê£]ê°Im¶­#ºåMtÒÆÁ9ߪ ¡çâÖ÷¦ïƒ-0Ør»0r£h(û(èH£8Ù8™:«N³d{èþC´ZØQ'Ý™¼½ÄïÑ ÇöÏtâGoQšÍz”Ó@whö[Æš{èäé£k-{С¹…WkÞâ{of° _t)»CvÃóå¡7-¡ÿ Y¿åö©¯Dû;Ñ´ìLä~T7ÐZ{M¥~ý·[(ˆ5W_qæ¹hñtwÐËB«%)3ïmÈÖ¹ÆÎóo ¬N:¨áj‰"É ÍO‡D;š7XÊÛTàX [hGsUù1ޘƜwKs½aÂM¢)=D»íLYÛ—¦ A~"G[ΧÂ<Φ斓/t£DÛ Ó27/²³h ^-¹‰áÁhÊ‹§d:\Ù²îic«©ÉŸ;áéÒ¯Ò:Üš/—Îã=‰n0oá#›nÑ&§(FËæb¾Á5CïOz²5YlŒ`«©;$mg‘èUÝùœg[Ìn¨>ñEØÆŸL§æCœië£y7’ú[LEܪ½qWSSÁÔá²3ÒDÑ™[o².×"=T»Ü{,ÊÕT64`át»%KŒ9¼Ý†šx­¥l:çÙ«˜~ï,Õ¢s®§(½Àû±,OøxœÅ6”±Áüš‰¶4ê:,¼Xš:]†]ô}hcÚ<´º, þtd„3z̦J)ZíÝTl´aÆfSõ?VÇtŽÕ¬¢æÃÐeIJªMI~¾¡ùà³f]eYoC-ü±³ilž轪Cf2>TOìЇŽÛºç㬵ù8«eÊ'Ë$Úm]/ºÔ P4¥Á\œ™‘EeOÇ)›hFC‘hZÖ”ÐmÈ^Ο:¨›,ú–«Úí´GãƒÙiï²#¾:<òãÌúz,á¯_ nœpÞ—œ,›½entÅ&D&ùÒ+%ºå˜XÕ>mÛè7Ÿ&:¸DY®Œà›ѧêOØ_ }þ“,M§m‹unÂqïìÑB};{CÿM´5ðî8_vw…GóWh¨{ØŒ­Îá”â©}ØCë|¸:³‚º–ÍÇŒ¡/O÷mÃå}éü=žéóò3ÇSH>ÒM8UþNß·Ž•x‡¥7ÿ•îŒÖb\xÃ/Å£4%šÞCwáåoÃIZï?×Ý9¥Õ±Ïƒ??›?ÞtXÐ@ÿm¹G³Jέ1„¥à ² ~xTJ û¸›Apž¯'8-ÿŠôRqZLhÐgc”Xlì‘;›3œ¶°Gê;oŒLð÷݈w‹RS˜#SÜT¢ÜFÂ{ô18´™S¿%là‰¦«­gï² ³°/|AGÃ…OX´ßÕÀ+ Cª‡G+úÑ¡§wˆÙ±=ܘÑõ$‰Ô?|ÈpÍ”G_Õ#÷¸’œy¼A¾£NûØlT÷ê ½åáMi®tgè¦ðn ïÞÄ©þž•Øm ¿[JŸ²BéAS¦5ï.ÚZ2KǬÿàÌŽK8f?ìŸöoxì§cá*y(,éé*`Ùô_×zt»º×cœ+ð÷ffø…OøÞþ†ôs åÖ7&>zø_½VXœö•ESh«€~;&²"Žš…Ìú-Gd‰RB¿+†!ôÛë‘UJ}4ÇU5^®õAN–ãýùbxÖTãÅÜR‰®øZ tá›4[Ç@S&Ñ,NØoé+£úÚx+Ö,m£_Ì ‡IÙ”Ðçƒfiªbt4ï–æ¿EŸÉ” 9yt‡fû·ß •ªÌ:ôÛÕïÐéjNÉý»ê¤ ÙÙfˆÞcžìm¡“eîïö8sÞTøÂê?¾!û‡hãli"Ý`É£‰^x¥¶â¬µ¨èwÇç\ ÞôþnÍ’¤:ðÎâr<çÖm­D¶°Cö€ m_ÐÜA[7QÓ-Èæ=`}÷7d/ü‚nË’-:?¼¿—ª¤9ÚԼà íDÓ-]ä6õ—Ô%š»¹LÙç·è ³ûåo ²ûãìÐd`Iô„»$¸#ŒqÛhJ4šhcþñ¸£=òo4¯áWd•e‰.øíß«©yÜDÚ“í¡~üZsã\Û k÷L0¤ÑÙ®Šê®éÝZè.:®>nÃ]ÓÅçGÃ{Ýz˜ôa]àËZª‹ó/Û²7çv:x'è—¡JÉ]<4SªkÖŽ³ÇÆã¢X'!4NcU˜æÝ¡ôT”4dOH‰Óoojî …YÕg¿”84ãcXfÞ ÒÒõKÇÃØºݱÉ5²"Üߣó–WBJýÐ/Öš³@ðÍ/|ÐìdQ­ï±o ;t ÿ“VêG6«ø‡¦«ÅÖœòLd³ôŽ7Gó£´SÝ!ûÿGsÖòéŸlúÅ·Moàï±L ëܓݹµ—èE#vvìP:îeÛCokÖ6o}œèÊwÉáì1‰6ö˜aq%Ú˜smÜ‚>G>¡1çÎgÜ,å0Ñ vŽ8MµVWö5?”ˆîšwlõ˜ã.ÉÄF…ëúgνDSGS¢)ÕЧÃhlʦåL‰¦Íž¾!Û@7ž·ÿ tãkM¦&}εțL$KÔ¼^Ö‡²î ¾äÁ‘é EÞà&Kö8êq©ÅÑ<ÑŒÛb\Æ>º\¾¡¹‰†Kõ+hCó¹&ï‹UK¶’穵X•”Ôé¬UsÜ54÷dhõ‘Ãë\¾–d:.c½LªuTÖVhçÚ²MÍ8k†¡jÊÖ¸U M=.‰64wn`[¶ñņužÛ_ÌÒ¸¢¹ŒÜb\fKj55Ë£Ú¶u<ëT•½GýÐ)Ïš<ÉÔîyoþ×Ö¤9Á.É¿XÍͯé5nË/Ù‹³Ö‚'qãïÝ-Ÿh—w¾©ºuýwë î÷)MtÃfORö±*°qióð¸g¬sú~ïÖ+¸/³F¿Ørî±®Û€¾Lºrïiþ\·î±n½ß»xŽYûu?×FÞðʇ¦'Óx¬PðxœM6çH¾œ}p¡÷豘Œ¬L$Ñî¸éBÑ‘žCU¡:Ïý‚ê”…õÂ¥ž >e‡¢¢¬vOhkä guI‚;§›eµ%Í#£°¹7>¹ÒM¦Fú4Mû”:}†åüHšHšù0’NjnY}C>šù$“•ŸnË’­ÚAêQ›÷hT–*&wX4‘BCvÿÏá‰sèB î‹9¬ÿ]ôä,t#pB “¾Î;$ty&dþ½ð»«£—%݆~¯4ž¨kWpC÷ºÓhÝJz1>ò$òchu°¥U¾K>/ZµÒúȺéÑt£ÞªYèR du¹ð…¬^¹ ³föcçðÍKfV:üèr}U¯ ×_¾»¤”ƒCW+ɶ輽Â+IwÚqBœÍ˜NOèdh¥èÒxMý’ÍM-פ¥5Z9p|>&O •}œÂ—•õŸðVÙÅÉ^IÂLº\^tô“…ß{wÞjc³š±Ö’ ÞäûÈô¤<à…¤‹€Ø‘~ŠSŽ˜Tcôd=*( Æ[¢=ÙÔ’DeXó.3‚>uN·„‹í“Ú뉦¥gXš/Ö}d%m+¬Ÿ±¿Jðušð÷™ÃLîba>1ÿ¸àï­Àz?¦ð×ÞgÝ€f„RâmÌH»W9ýnM‹æÐ±7ÕßСÇ11`?À3x»f+czK¸³àCú+QÕ¢%Lvö¸Nx©0¢#xpÍЙÛüJÚ™÷Òlø»hºØdp›ð8¢ÑŸè†Ï™¢¨ ³^¿ yžtX6Í*ÑÁÖ\ëEv7sh=‰é¬©åkü)´óÅ”ÉÃj+Ý,ÙzB^ãñVg­W¶ñÅ\ÍZç‹Õ‡ó‡MUÊWè ™—bRÙÙ:0Y­NïðZ­/¦Fqì}—hCóÌH¥³¦[e¤NÕ£Ò&”4óËfÁíy]a.í¼Õ¬¬QÜŒ÷Að À›¨êc®q¡KoÐ2ƒd~˜%(t¦o3ôqÞ”,OMÍfM™OôXôeóMÖ’ŒÎ¹ø¤X½ÚTÅ™¡ù°fmðBœ”Mó Õò l¨¶¥ˆ'Ë/œª_âÓÖ›óɺ– xV…4*»;[ÏÂLh5%šjÕêÜ™ó¡<\x4%{Zš[èñ8šg•ã°ekÜbðfy°SÙ¤ÜRŠÙÑ üf²Â“i¨–ž-/º4î[ÍTVjs%·0}Ñ™Âß_Ïù‚ŸÉK }<á|Šr–>ÃMtQŒÌ_¸1r%SGÛT£I´1oZ´qô)ý¢káÑŸÙ\Õ ~bÌdꇧcdOÓÆÈBG¼¬™ºMF¶ê{À˜y;¾Ó·•‰ž: h„xNÇRá“»ËæR «ÎXÃÚ6ч×%ú@Æž©Œw®ùR_G–A<3á½àÃÍV÷NOô·Y&}cÍ«Šy(ZbVv6•ÿ{`*¨ÐΚ?k…Cœº´×²4—±Í²¦E¾™ÔI¹ÄØGóvÖq¾‹³\²õ:–ݲþ N[ÀKÙ/»{Ò3 NÑS+KÁs‰‰žnÙXšúw·*¨¹œ w©ìßœ:xOu<8GUØô›¥lVt7•ÈÊwÚQ~=˜}Ù´K¢º9³¦ú)ês;bå¦ÆÏ‘×ŒžNGlÅx¥*ÁÀíÌšå[>âxfìµ3üáÁù oÒ£Ò)|°­ÿ$Y‚¦93Ùq—u­³zMu¥•B;³&ö:V‘ñ‘Ms N¾ ѸWdŠãµ&t¼ÄY CpüÁWßkå‰'ºÂôM·#ÛCÍRO¾ƒÆš/ë‹-Kö–?9ÖíÇ"0+âe›s¨ZÝx±–j±>x™?D/=Œ˜ƒs)‘‘ ¯"Baôwë&—aÙÓÙeÕÚeºå‹B;²u›0#;цìaÉ^ÎÜŸ¤ã€Â»˜ŽXÀl]þZ:ð.çh…¦Ko–l½Et×pæû°J÷u¹TYÏÞhºØ¶³MúQKÑZ—’”ì,5òå2¬Å–i3,!´aº ëDÖbKú8­¥>9 ÄßåuNôŽ?0ºÃÌË-ί³·˜³øÑæ¡ë㬖ZM4æqü‚lmµ;FWí–lÃe³Efd ˆVðR=¼;ÃÏ¢a'·GÕŸ,#}+Q‡fìK†Dg½5kÖ_ø9°²}‹‘hÃ4áDó£­e½/ôi­—ômB{3‹ã~’ž™¡D~{Eó­oKöæ!„­t—j¡)CÝ¿ ÷P/xVsò‘Íœ6ûÓ›n²!+Éßb¨y`A›8”m«%ô¦Ý1wT²9&þ|œOy³YÃí<C¶Ú§°À7dW½°e«…Ùô‹uKó.¦wÆÄ¼ã5gœÉ毲l—ˆ?¸jÒ&<“3©Œžè3ÛqÑYSRµU§âÔß4EÀâðû¦”áï-뚪SÎM"zÓþ·)ÛØ% ²¼îý!û€³–,'Ts]]4 f۲ܨDš7e…3†¹o¨> ‘-Ûà·Ýbw1d‰ôÂF—“K·•f G29Bø«uòô»° Æ-Ê š±*´1oÇò0%ò± ¡1GýŽW,góáÙ‰†¬ŽC•¦ MÐœÐøjÀg…åá[uñtÍœ0ñß×4󽜛Á.4Ÿö¹ÎÀ•åÄ8yN¼FÅD…G¸n°Չ-ž…} ;¬˜ñ¨×3ø¼«Z‰µŠ>Ÿ<º\×’O‰¡·q©ˆiÇ6g¹«'2é¥8›¥ÖÀ‰W†³Ï°ÛQÛ—xÇ Ú}½7ìŠþ Ù”hîdzֽŦ1uÍZ´¢gÔ킟ÉGžM%è&5(WäýhŽ#ò•h>îf¤B|ÐŒ|K´[ÎJÿëpã›7Ý(ìµpn¯Ö³øX]Šltó&½É­ÏxWODæ£mõn\q}Æz×7VÛ´,·fPåÊ ²~¡õ\êð“uo¹õÍ›$YÔ…oò¡ê_–h.Ã©Ô CÜJ¥ŒçmË!@ÌɦètµžîÁ‡ 7&îL,¿Œ óÂ+tzUá@éõQ¤7оÁ^ºáå.øÆý¯Õ}\©Ó|æJxÚn‚kì%)-àÐãa^'ê”ðº×–ù‘pÕT¼×…Æ{]襑ÓvÿAɼB7 'ŽÿN¬Áß¾dƼ«§q»^tys/Jk%)5xôÐ[½{Û¥«éÝ«ýýlm£7àI@òC?ðÊh¦Wq,ñú^tô÷€Û%îWgâäœ ÅΈtÖ³‡!é7uÑ£ )¢‚«Í8éÚtÑÎ^ xÙ¨u’àj°JO™Ñ<Ý›µà†òßÉ“Mè™I¦¾‹¾ÐËûjÛújÞ>xmÈû*ø±lØù®÷ÊZÄÿƒš|xÒ·cŠM±“L4qEì‚Rð…ŽSjÃg“ª¹‚*ƒ ï2"Ѥ3^×z¢l2¡Å^Dº…Þʶ ~¡€g!ýâuè‹“Äè r4¸Xkö" £øÃ:Û¼9æ«àq5@Ý[µ>úûæ‰N…»è¨ÜD`‘ÛÛ˜6±Œ±¶Ð‡µ·zYš«ËZƒÛ4ÊÙÞÂÌÁ Õ“xš¤á]td„šÍ÷BÔOío]=ÙM^ôTâ³>t¡E¡O¤Wq>´èu¨·cܼ»pgÖÓÝO×[Ðf³z¡w,7ö¶.q8$‰4BGóîŸ*E¥]*¯â6o45¼Èçvt_Eɇ¤ò£p~ò•ä2pàKÁP’ÛóA7Tä$t6õƒËmé©€g­[ãÖ¯–Éo%Ê7u³‘OWèjNôB¾†V>ç&Z¾Z:kÁ÷iÈÖ#}æ?²ôœ•pz9›Z¥réG”ßô>º†I¡Ñ=±+AœÆ¼mI‘òÏ 7NˆK}i莃·WxÁÖ6gάîÐó ŒM¡Ó»Ï®Áñ…T?ô•hÖë% d Fh¼Mÿɦ“®ÀóCÔKÄH—K0†UDg,´ªŒH'§@G°½1k·ˆ’?Ì6²ZнlV>*t6z!ã.jµò~oäè|Ñëqd¯‡Ö ]œY sÕÐ\^+Bvzѧ îºBk!£ï¢';™Jv;ÌavÑ|Ö^tP9Ã/¶³Ü—OžíNà6ÙÕYª»:‡Ën–ì¦ã~²N›!}Ð ± üò—J¶í0fMnÂâ,ôN#ŸÂ•KBØí/:„£œ¼3×ðÕ}°$œDGNº`Ž³ÍŽb( ’èòtTïú-¸ :^1Ǻ‡}Ùü>:…fïAvuVúiÞïÖ'[ÖFñÐÛšt[û}Ð0fV„S4…W®z¢¢ü é¤«^ªŸVXöäKõÓÊee^´§ù†×‰ÚHðÓ%»PLÔáƒ6.êMB—.ô±dk‡wøÁ‹s‡ÿƒc麆‘“ñ¢'|%šo³¢~ïì"Í6Œ¥z߬9Ë-ºX<¬`ô  ‡W¢ùuTNw¿hC¶u,›è´œÐChk­J8ò —ìbÑP‰¯Ð2¼ãéÑøƒ+@K8j]Õ ~²j8!Ä”Z²öÁ%e£ì¨P¡ï&;*ðOÖ o[v0d/Kö²dk¡£ôüEs‘ï?x·¬ü®RTµV²3L¥¼hCón«)œtºÚzÞ¼6­j¸èÁrŠr7Í—áeLá øÖß”,#Б¿Ú±µ;åÇÓ›ôvƒ€ó–©·¨,ö¢'¸á«ÛY'ØY‰dÂ=áÁeH?Yuî„ÔœšmÙÀƒP«m½OM(×?èÉ5÷®„,ÍĪ«ª»´Ú2Ósu(Å­½ñ©<²·1Õ\ìIÔþÖe–š³ˆ|v‹1¶¨b^tÜóq쮩UÒ1]s>ùAyù‰>=Ìm†–Ë U?_tÃŒ);›^³Yß»;î‹)Cå†]t…i J¨7öØÌêªyRÒÁÂÌL#úŶs‰.#Wh+» ù':œÂp—˜²-ÃeY»d çôÁ¯ƒ,£ 'Ó’ë•§]´±Rf ´TÞVFÝŽaãþÞ–‘¼u—Ðsm7gµDz}DžPe¤3E­Öh‘U¢ÏÃÊ ®lšÛ•²iþeö )Œ8¥¨uGì1¸Ö^tdãÓ9Oûœ¢3¤Œ4Ïöƒ‘¸%zCæ½¢þ¯l–òªVgÂ0[vàã6ÑÍE3R{¡UŠÈre„ÞŒþ#»0ŽÉ@/kÖv¼‰µã «µZjµÐÖZ«ò;0«' ñY;ªxçZ ôæ&zBOò?B|Š.j;g-‚‹4É')åùj Žþ½oËsd3‰=jÒÐí.G *¹-â6wfm9·`Û>knË.°^FMœµÖgÜÝ:ÏMt£Üß½9_¬')#•=­q[{¬[+uä™ e›è&&$8çc¸è ßcçÆK¨µ—hæË=ŠYè?¢± FvÀW=ÑôÌ ¸/Û@ㆥBWk·…Æ­Mþ‹Æ²·…>:ÝÐ,ë@•®ŽìæÌy8±=4$¹ý'›õbfº„^ÿÉ& ½Å@N5—S“^ÁYšÍrE…þ¥ìH-†³¶Õˆ™9±Ï­ëFìMVm5"¬¸èÅØx=,Í•ÌdG$FI4ËàÓ7ºyÂ[<HoØïÌx¬†ê mG½]™÷ÿö{2>~ ŸÖÄ Í‚ªÙlŠïS±f=0VuáÆ¼mkÉ<ëõ¹¯hÞês»~£³5ÐC|_hÚÎ?¹ÞÖ¤»hGóƒ[¢ñJOx7!:‚]|ÚLtu¦-êŸÎeÎo¤D;߬(%Œîñb\hçWJ¢ÕW n•’mÉPD»f+;gèüV¨·ë(87{«ºÁ½ÏDžhKõLbà蕉*iD"ðí<+!ºe§RÉø/œ~ô–Uu(Ëù_¨‹´à …ЭýDš[k­‹x˜9¬JÚ£äùmŠâìïФ¡eY¦EÑÞ=N%"¥¯¹I¯Á11SE Õ5Êï„YU,2{á{lŠ—Œ%Í›Nè8Iô‚‘ÖDu+—_“š\S· ⸠´|£,¥(NjÈ–« •E':¾´ÐW:òé6YI-·É‹¾Q&ö¨tÁhn°%顇fÎð¢W]Лð Ýu§-9éÐwu&n/Ìhe¸ÏÔd´°zô€×÷›sk5J'ëÀ×Y’²¤+‘è„î,„QTG÷êN¤GeUˆ8ÐGtvpɼèR¶½N2}0ÝkœÊ¥5xJx…dºµfÏMCùªc†=,k¡“Ï‚å¬$š‹g:WðQùKòï: $»ËÛÓXSæ@ËXdNÑ~½:œÉ,íù#œ9ªºÚªÃÙžÂ;4|>h–Ž×?Þ"¸V“£«3é…·›O´'ÛØe‰f±Í~§cÍ=ô´4·Ñ=ž7 ½”òJeëgE~‰¦1º®´SŽ®ºM+T¢iae—W”’êwñ* hc'ºÁ¤þ®> «wy¹ìö8ã¾Ù—tÒ[šÈlÒ ØQ]&:3²=¡¹Ø?ÝèmÒ¬=Ú¶3mýáeú‰æš÷ê¬ô 70dgW#¸\ººf`Í;/N´1kºÁY±”ÞîÎZÛÖ¸=ÙÇEsîÊŽÌ(x'¡ót&Óq ±°G?ЇµK†H<Ø ¾[ú]”¦”÷K@OÅ)º\æ[Lô‚Õæ=ùë L5¹ð_USÆG§èL¦§ßl9çC’B°wBšÝÜEÜO›ù¨ånD”hÊ !´:¾Âi[ÉL½t¯Ü(l±)¥v϶¢ÜÃð2ñ!±TçÄܺ]4" ò#uñÏW¼àVÆ„á‘AmhnËæ×x¢©ëd+’N54M•Qÿpc΃6¿li‹÷þt; o¾S"A¹Xãݪk°>ëO{X_mXšËMHù[J¬ô£÷Ç»SX°­ßP 2 ýʦ³f¢ƒþcã•ðþàóIÒÌ <ü6+8ƒ«˜~X._O¦ Šrv¸\‡øjáïK£/H7,ø¡Ý Ç¥¯7Лv7NÙ´¹ñ74§TÅ#ª]pÆíšœÓ¡?_EÎçÆº¨@7epÊ‘æè$YÆè"N*róáU¼LŒÃm\–f<ô_¢oc4dŒK*€…{hoµf (ÜgmóÚס²þ[ÌŽˆ¢¼V ›%šv,‘þžmÌ{¤îatrtÐ,ÒYëZ\¬öTè0Õ!z<ÎZ{×IkÑ>ç5}˜Fð]¹êêLÆB8‰6d«b>¯z³>øà¼4]èÁ?kh¾¸³Qé}ŽæÇúÞÇ‘É,]-Ñ´t~Fr`Ô_Á‹,Ѭ(Ñ4Gýs`¸Pèx޲ŠÞ©üÄ °„>üM†Zµï¬KÔŒÈOÔ³À ù‰ öQIÙ{ gí(ýüpê%ªG«I8m‰fOó6ö¢'ÛLê|x¢O½‹XÀ/ÑF`¾!»âwQäU–…ͦÙ9Wr¢ Õ³Œ…ÆšO¹éèR••ÍøHíiÞ±k4’ %ÜùàÛDŸË#ç¥RÁ“®â'j«N]e,aè ³æŒ[wË¿M4?#£°oìã[Jó§×è’ï‚ÑC%Ì,ÑJùÎq¼À›0Ð;V—Ü.4±’zž.K…<4h胶• •t­ª ¨RÙÛq(/%ГÇ¢ƒR«cÙG‰6ô9xTˆKs£Ž®ê]<Å9ÐM´²Uè%zª³ÖN³ÐÊB¤†êzZšk‡R/úÍ×¥+5›þÑï}8UàŠ×óiðù¿>ɾìX\—ÂŒ‘Ý$º@×CüÀÐÅRCñ óÖmGÎrÝø¬•xKzãf¤s‰¦®¥Æ\ºÃÜîšeŒ~Í.“uÛ™áÕ¢Ìfr%zCÏäG63Tm̹^àÌÓô‘¿˜rMØõ¿T`Œ[—(3’mŒ[&6#[JfŸ0k"Ñô_·÷Þ%ª·aµa4‹%§æêôŒÑ¾ÀE‘q 8îD³à`¢)Çq¢ôK®ˆžŸ kâM½÷BGš ýb5ºYËßDW˜ &t¤dÓÃ%„ø Ú0=²ú€¹š>h–öhÊ÷7+ÌúhÎj°Ø º—:Dró>{[²ò¢¥ŠšÞ³wh(Yè=ñÓ¢Lž'žº0¨æFÇ@¡EgD®ûŸy¢MI[×mÉâ’ß@óû¿K¶ž0/ÑÖØ,Õ÷t|¸$š9&•DflѪ×Ë,Z"ânø`‹ê ²ñ£ª=ª&£h™MÔY¤ž ´?Ã…?°ºh©Ê¦Ã’®D/üoM¼†Ôo"øÄ–“à4Xµ>%BT÷îéžpjï6Qý²Œ‘J¢£„‡ŒàÆÐ•O_´®ð$äFkSD›Q½]á†îË…;ó®6xø 0UßÞ9³]éáL [5j 6>¥úó—áŠÑR·[O>x/v…2h0"j åy^ñÒˆK_/LO_QQ_íÐyo¶tžmJé{)à¦tNã­}xÒMx:àe³,éãñàò.xX Ï”êXÅÊI]`ÑÕRu¡V®]¯.çy©û¡yúthDhG¸‰^zyÀµz)ª©kd)u™åÑ$ºaClugà«óÆ ‰æŸlYku¥ ÎÚ~œä„]8Á£LîW6+&Yq˜wk$øÙ8fk±±Ú„uó¦i¬{'îšyÓ%ß½-ÙFËq¡MÙ £¦ì‚ý1[œ•ª¥ì…ƒ:çqfíM,]j¥gú0=’ kÞ­Y“±IßgY²m´±ÇÔF†±Í­ËsÌòŶò`é¸÷ÍEew¨Ð8¤³#ÇÍѼò–´2¶Ù¿Dw~*nµ~`•üV†ß‚•j‰¦5Óûf2Ks+ÓmGdÂASÍUþà ô}3Yõï¾™n]œqíPv n¥Q©ÐñgYW)ܘ6½cÙu ´#[!~–³%t¤²ÒYSö _ }Þ&ÉUËrô„Æ}PRö„[ʦ=šRöƒ¶*ã%áÞTû¦±ôaÅ»¢–”¢“’jžEp‡ÖÎ+¶vªÉ&\èUTut±Um2–£·£Œ42Ÿ)úð”ÎD|<4q®1ÏÃVêR…Ѳ/ q=ˆì%Þý Y|öš~ïL¦è¤ãèC{>'šÆkvHÅL3‰®ø"kò¨R“«ΰ£÷÷úgEò‰î0VèÈb VSf``ÕuÓ£©«¢ƒ¥d&šò9ìL€¨þcÇtcbƒ9ÎÀm´±Ve¢³*»ÆZ´…÷ßÖÝÊ0àg@ o"ƶéÈ:í@áÁF=!ÈŽ{èЪŒ}3>0Zf6}” =£©í †æÓÈ €ýèta ò¢È;”JhLᙲi.›²sŒÓe[çâ±öɱ.£àUÚ0ì¨Ç ós½ÑLó#ÿ"í/ \Ï@Ãq·¤tD_ìèA9ð¬õÇB¸X¦ë‘ÁÇ¿÷|œ9Ïö,¼xDÒÏ¿ØÖ¸'¿MN¤Ï²—H<سê\’]:kÛÚcIÙÊò\Nd®y¦M ›¨=",";ÐUäcT¶HvQŒ.Ñ”! )ÖAY²Ö.®–ý¾¾é.Iô^Ì¥ènÉîirÁi+ê¢N'½Èù€²ª^tUo”'èã ›®AºÉš.2äÚ t±4ç†ê•½™~Ñ0@øqY Õ\Ï`z$gÅ4=ØÂhâ²;ç¢nâþ jbbæZùA(â“è÷t èñ8ãÕB7¥PÍÂG}òm¬–±,ôVÍ÷_ âkÏmè„Â&>zb>È&ŽzG¶˜îµÑ‹^#{%}\-KYt¨ 뢹©Ý^‹ZO*ÔŸ'Ð÷Á~Ñ;ÛäÂï8Ѓ¬©>ÖXç[™ 4gø¹èÁÒÁšÂg2Æ“@oÌõò¢ÏãŒûp‚ž@gœŠ£ƒ E¼[ª«k*ýdgZ“®ºf‘ ôÆ >Mô04E§•[4Á–j¹ÞÌX,¢ƒ†MÏ­¥ÊÖšªÈ÷Ñ"ßAaÞû@kMR) v Õ˜=©„ŽçEëŽgMëÛB—{÷9ôèMÙ0aóŸæÈ‹heE;è/“åºZ²åÝCÙà‰6vIQá!»Ç„S“ÎÚ²Ð*¨f“¢ú᠃ȮÔZ-Ù6ºA×ÐΜ7Kv–ç•Zå¶@¥¢M]â}˜üCÓqë)‰Ò\/&Á:{AÓY›¸©áE|¥æ(¾öO6J  ´ìT vѰ©±V<¯T9T™ë (äÁ57ÑÙO™¢+®j t³4ï?D -·$žµíœýÁ-¬ÍKÿ/¶Àú‡ÆšWç‹uÞøû»™h±ÿYÂñÀMewkàÖïò¨Ò‡hW·uÄèa[NúøïËÚàÚºÀÇɹ=Ò“ ¿÷ãbÈHô¦Y‰®0jQËíŒ_㢣çÿ'¥æ:dTv·ÆÝ­qg»U]±¹7Ÿ'Ú˜µajÏwºZ<ͧõ½³EÕ\hêXœ"ý¿húÅŽ‹øùžùTö|œïíË®8Ô3‹%Ûº fue7ÆÅ–èR`ã€7kà͸-ûj®‹Œš=™V„ÊŠ½,Í—u<ìÌ*†wð<ŽðÌi¢_:]¨{WöÀ–Ëš–ìm¡Ì¥oè%– Ôw¬)”j¬–m™OEoðý„hÄe[&ÛÖœúÐ÷ŠTÏN.ïà‚›,h¢«|ÑÇ:Nåé–EyEÇ©Îtn“#C—n²ÌJ¢OÑcè5ªrhSÃ@g\»*3ÈÐÜx’Ùhãt‹Ê‘ýs4«äqŽ#[h–)RoÓrvÕ›ÓD¿wQ„lõV°!ž‡‹æs^²RÓ@³6\tƒa‹zs{°ìãÌy­ü.©·Í,–Ý0“k¢£ î±jÍyPTn.{q#9ÑÆœç{Žyàë­Ô¤xÕ±¸à¤7ÃÏUü7ÐW×|Ðô“5ã5XoÛI–0Y¾o¬5×E²‹…6ÂØõFs±l£aQÀ­û¿Gõa}²ìAÇœ5Âq6!æ¿„oØ[ö¢+ôèVUÒ¼N¶ðAôzÙ‹ùèÉSÁ=X—‰²Y [•í@ßb¢'LÈrÑYuˆÑÕBËdcY.‰6d+G†Õ VUÒè½5‹Ìý/vÉHj†'Ó)z9s~G7ØPÍEèåÈÞ–ìã ‹ñ½…Æ©ÿí:謕fiÞ-ôú!ÚZ-·¼~±j­=!g-Û:ªµRkº¹ÝÒn‘ cCij®Q˜¾×ÔÃøRZt º²›q‘µxzh\µ *lG¶Ì\VÉÝ"÷ÿЧESÓÈ•øctV°ŠÇ¦ úÅÑW+2GT^ôƒ—>-ô¶ÐÇA;~ ¡=ÙñŃΖuÁp­MÑ[±DrUBšOk­Mk­M=L­•º¬q/Köqd‡KUÕdM©Ô»:š{èΉAzÜ"Æ5ÑÓEÈ1©.èGŽt5÷ÐÛZ-'nê®9I—o¢#ÆajŸsþ‚Uhýrßc´õÅ•l Sq\W2;‘‡¸ï7dQ£ê *ZTónÉ.ÚøbÓB«^¢¡µ6”nÉÇ]Œ{l(qË®ÙᎻZ+µvYؽ,Ùçwèl›ÇJØ”Å=áþnÉO ¿w“•K¿X:sY¡‡ö&®ÕtÑ]¹{ jžNM:î¾,ÙÖœw…c;\-™ÅR\‡²±&,I—b’Ž{8 ´ãöìêëaB—t,âOg±l=OgÍ:\†µMƱfí8ß{>Žæ/º”9] ^,áÕ¸ò©YÛÜDóO6­}6KvwΦi-ô©¢C–­1ÔÿŸèéIf¬A‰æãN_0Ö¼Y²‡…žÎÛÖU”ô*Ê”Gæi·½$½‚÷¶nðmèÇZªÇ:زÇ#F7ÞéxÜ&Xö/ÑÃD‡‹){:›“42Hó):´ k÷>h–œrØÐ=6Uáºa Ih¼C§Ü=zñµ&4^k4³ï§U†ç¦ZÀÑë`Fµ‚1kÕØ¡ó6·ÂèºwI]Ö¬mGóöümdß%šrŠLzš+_’•‰ÎÇ•í¡­³¥ykM…ž=%§8¦¸ìnÝ:L´õÅ|4?™ºµZºÑløƒf¥¹SnM.{ÉXóSàJÑÍÒÜp‚ÏÛ½£E­I­Üaí±±¸}>o²%]káÜ+0=V~\ìüŸr‘†žá" 7æ;ütH­¥蘠2Ñ” UèC{ÏOõˆ ÔÔJlWYœª¦¦…\Bï ãÐ3ü’å0YSpCõ¥8Fw8ã.°¦m:{\Â)‹í¼ áxÖ­£ñ,ë›}A6KÂÚúâz[ár<áò­Òçð1̾%N–=‰¦V@¢é¸Wxð‡îÖ¸U0Âèà–ÚTÑ{8Ñt~ÐxÖ&'lL´%ÛÙ%Y¤ƒÞëÿcïÜr&Ùq½•³„ðÝÞÿÆ&D9kæu>&:»ÐçéG¡@ÈéðE–(JmªŒ‘oë‹g˺:ÕŒH¿nŸI.~lÓß]ÇgÍ=–¶;ä>,i#¯Ò¹¢¶›õ½»5òa\ƒ‚c¯Kèw±Ñc±hƒ3yïOºã¬®X)\ÂGÊ`†íä»Ðsµ5gÖšÊU±mïpjÎËȆwï„èuªØ‰è´b1¯?Ö™šŽo½s)¡KéמƩnԒ̘óսߕ¼¢ÇŒŒÓÎî+rf1öÉá[‡Õ_iÜAo¬zÂŽbÙþ-Úùà‚?Øy4ÇžâSp“ÞdŒŒÿÀWuò¼#mo(M'´ÓÆOÅ~ñý[ax·Â…3bÀ Ž›?>¼ÂÖxëRì|a¹íŒ€³DÐÛ8¼=¯ ¸ ý‡®8]žt7o–ñd6ÒOî¤L—˜ Rx…Ž´%]oSí3àN1ÑËyêPÁË8k¦©í÷‰ã «µ\VuާÕ=ãÓI­e¢­¡»ÆYßz?Ú[n[%Œ?$työ<“oFÃ!YêŽçM¶©ãyå áñ´EêdL9¡Ë3a¼u¹nxÚ,ïÉCk£ˆò5ðj¼á¥nñ®–jå+ì&!ô¡ÅDwÌ.ˆÞD†mI§ÐWõÙZ5,±%H[Qnuø©ð‰³ÕcgA2ìV–½…œ&E‡\ Ú&[yòsh;¼M`EãÒ5|Ÿ ìPß7ÛÌ!ûfMÙ™¾o+jF/PÐj7XÁ$9cÖªt8Ùñ°oê‘Öe5š*³<˜àÑ.¶Ò”ÐFOxí›5e‘ÎåYð}´•6x‹'šÕËí«Ê<ˆ´=ð.k¹O íVœßÝô¢íðB0m7 ÖPÛI/„§j»®2\l-kRàñú>­­6ÁÉÚZ¡jÜ…S¶ÛŽÖBgÂ[ÉÞ>ðepÓzT¦Òß•HRywüÙ´k¼Ðñgõ< ¯ŸpïEZê†Õ©‚Ÿs ×8ÿê#E9Ys¨„?;ÍÊ\Zð÷…ƵBcªâŽ$NH¡ÃƒæE[_­é˜c ÞüX‘æ°ñÕ¿zè¼gD€Îûð~ù” H}ß±¼‰ÛÞ¢‰“¢ã‰LÖ{ÀÓG‡t26ÌY ¾$s }øWŸ åÐc&Ô&8z=ÖG[Y•¿Y¤tã&¼9ž`d„Œåú>P­±Ožkï;ÖÌ£¦[uüªlåeŠî 7&nWËw­7^˜2ßȲ¬{+~/Þ®C¾ó¡Ê4B—Úðµ,x…³[bïv£îÿö®åã]ÇÐÙÊî8Æ39DŸmÇ[ð/-þ0¸wÄåBi80ª´Ûíä’eä꣖c´µÞÍ.7¡Ã‡fé©åÊ¥Ñ~nõ+Ó[M4ͽ Íœ:gE”‚©_8½Yš)uÂwÛ…së¯÷]:íØr";÷¾õ™ÖüQ5ç^°|÷(St`(÷D¡•eüDd½yð÷€Ç"b‚¿N8 h¦ñ9¢˜ÁßE3)ÅûD¦Ëš¹ßÂߣæÐºÌ„;Öߣf—ЖÀð±!ÇûÄ£Í|+ Ⳃàµln ¾zð.HxÃ4ï”~áÖÌMÏú´Nº–Þ$KŒ‰’o|7÷,†ۭ{+¶{K®K´‘ŽÒ…X¯ù|Ò…Œ¿’pç§ž°;Ê:ƧuCÈzƒ©Î£úLgðÞýô[x$üjÅ/Çá]o‘6[RìfðwÉŸ7Ümw }á1,ôü§Ž kcÏí–I¿íº öe§5o/ºÎCT'dÊëCcéçö0d!ÙD7ÖáÆ^s­ÿaø¶áƇ۳[•u{°C™§E9H ŸLª‡„e}È:ãR'¼Óý‰Xp45<¤w,º§î<ÿ\ƒ‘2*¼[=@ x߰ljKÙ™ù€— Î'õŨ'µS½àe X(s¢Ž¿öµú}¸R_ô ÑµOÖì¬öéÏí»‹×̱Öëûz¢ ^x)¸Ä*Ñδ‡ê.<ž]ǃ§½´Z‡¬ì„›Ök¯x½<šÑÒ©‹Á–lMxTöÃC®¨\ õZ4ge':*­áµXÆ?-ÒìtÖ‡·["ýð6ßõ^ñî—sÈÚ8(¶eÛ»ZJÞkpŽ—±c¼>μUïtáΊ Édcìª[FÍD[¿¼)¢‰â; 7Ök÷ÆþCã–ë-éyu¨º|[C/{³7¾o|J8˜Qü}ÑÆÈÕ€‘ííœÖ­Ò ]œßݪõR{}¯,t¸Ç[((HqáŠá|ˆ•‹¸©]Â'Ægëê½DŸ ݺûûÑƒŽ ×L×}Šø'ö–L·î¤Þ=ãÝšvÛ¸ãCõéYŸïš©Œ„~­—­[NϾð”éòÚ‘(F¢­¯¶­#®oÌ&îÒêqΉQ­opcæ†wÎ k«×\S?‰þ<¶úÄ¡ã€7îiÈY56ܸœÆòͱÍù§ƒÓàÛ³þžTe1MÝ 7nö€ƒ_qR5ÖZ©«{F+<ô¾¼í¶<Ÿj½NÑs­5à‘ô€ßüXð÷n±àÞÔí`XV|PnÅ3éõø.—5ðzŒrýŽù±§ZÓ~ªf9ºÜPQ »ÜpzМaQ_‚4ô<øŒ>ÎfS!£ŸÊi3&C زîÁ‹øV,/4_ðiœîÕ"EhX­Ÿè:`/€Q k_ðý"¸gÜZ1F¶*ÑôŒºVcèï1S;|û$|̈Ð1øö¬okÞ×¾ÐÖУRÖ´½ð Ö«‘½(J©;Æ«µÙ"/]`CÞ„›Öcæà)õ^*ÖÌueûPTÂo¢#¢ eÔ/¼Áf>+$… Þl1p#­þc´ŽHT0ðmØŽ²Ý÷y{œ#®ž’‚Ôõ/øwŒ{èÜå(ã$t¥M"ÞÊajŸÖ'·vJËç½Ú²¦}Å£i|z{Í„!2p‰¯í,™nm– b<Æ?ÆQÉp—ŠxôتБéÖr¿hø¾›Àøh˃«Õ —Xçí™Øq5vþ¾ð©2AÂ53ÞÝ2¼`GÓC—1qKø~Î1* ¶™øP‚“%w¯ïgg—´þð¸Ð°îÕ±¼‰_ÿ”³˜¦]—þâ;vT¹胥šíüòiy°/Ú5ηú¬žñú~óÊt¡»ÚF…4 e¥Ÿ>U0@Ÿ-Ó»§·Ù¦¹b=øò.·UBÊúÐ˺Û"1ë ½yçÝm«;M 7öß;ô! V¿(¸õÑúänü=hΆ´£„;¿="÷ƒé×üˆrE§îõ¾ÁïHJëýEáQà¿ÛnX1Ðã½ “ÒKxÈT!Ú€/ùà~õ€›Öø±àGj͘hgæNõÆîÀk(XpcæjlòZ¦ð÷œÃŒ«*- Z{ ´eüXðòè‚a©®„;Ö£~tCF±˜VÁ#g”©ªéûÛY”'áu Fð2&k†Ú%”z ÄU¯W‚ž±žªÊW+e±×È7Yp•úн:è­ÇÊcðêÁ{|5vÂ׈ƒ‡Ê,µ­.Xl-áÆ/iäJK¾/Fá«„™]ø†¹áÞ»5w|Ñãq–\4R5æ]ýDa‡“^3¢jXÖ’GÍò GqAu ¤èج þòùX7½¯pcÞ_¸±b#²Ñ¸]æ°Œ/=“éš™‘&-PÝ«FhÍû’²Ø„+fYŸÜDØæ,Åj£C°bvu<†“¾­¾­I7ÑÕD;Ûl[>ܶNˆè(Y*$ÍW ã¾3‹È5µÈk,:ná¸o/Æ7oq‹‡ð;+9Nx-ÜpüÙš½ó^ÞE“=ÆüxÖïMÞÅ]Áç«ôt±‡èÏ‚=Yw…µ§-Æ9m8mñдÐñÍXÚ¡]’]ím…h#Ó¥mz#?\h¦dÜ"Ç·9K5 n ½k½Ðó1ÈZT -Ñ”ѤÝrð‘Ê/Œ4®.ðÑqîÑ9ôÁY~Mý[JYxìá°7ø¶Nã­áãIT ô=%`McY™B‹dxP,_ÐÂõ;´ÔVèRLL¶ðùc£Rãñb8°â4áõq…¸€ÓqGXbÀ̤à‡jA4=ø¼G+’6I¸c¼{ó6â Xtè+<0FÞÚºêCXŽ¥EU ˜'zÀ¼^‹·–±XO±FÞ"Ãt¯½ñ[ç kä.ú½ÍYB϶­ìz³æó^ÖÈwŒœ•t·Pˆh ºÚ!°¤”^•ø‡«ÆAW Ý~ˆüxH4=mt¸/ ú}=¸¶l ô‰w sö…‡™±Ó8m Ñ%1X¿ÈDÓfÚ.úÝ£‡õã½èÅ·‡î&zwXÌ‘hz~Ð,ÒÚoáî)=‡Ûay~>ðJUµËZ~ОmŒ^1k¢Þ³ô2ªâÙ²€]—^Á†ÑáDwÈîñçè&†0Ý¢M— £Põ¯c!y½ˆÞßÍTº¥Ù«N@q¸Àã!¥_Yœ²g¬°Aκ‹?üµz('B­ŸÎ+y…~ÏÔ ôEïÇYèp2&}Ëù`„Š®Q)¬õî çè‚7¡–i,VŠ®ï¼ÍX³ ®«]Ã’ÔvŒÕx±·Ñ¸Ý£XlwDÖêP¿‚dίr¼XŒqHK¥Ð0À¯6âÒpâšÁÿOtƒ.ˆÐ‡v¨qǼ16óˆ‹0V zÈCtø¾Á»?ŽCÄÒ¹ûB……•‡x©}KJ+ºËË5¤6ºÅѤè`³êá;ô<0Ó;n%'“‘rF„2zK”ƒ9êÉW ìêݧ"RÑaèÉ30jî‹ez¥_‚­þì4“wµá>b>…R*:d¦ät‚æd«uªÊ“A¦˜KïÄ5øËë¶àR'3à͆Gá°c½ÂòÏà™àÔ…N‹žg(eaÆ™úøh8ò ?ÕϺà†,§”®ÞK‘ù2S]¿&|e }& iLyaj²AÑá8¶+|àÚè%Ç™^©]ª=ì™èÃ×zVüÂ>T*Á8g3Jªvƒõ¼¾yW .ÕDÓÛx,kÖär3BëT9Õ3°4‹3é³ñ€©Ð‘v¤»,Ë¡˜ÊÒŒr M;ÎØ‡Òˆ…6öÉÔ]Èõ3R){žÐr÷á'̘¶g8a{ÀÇ¥m»Yh=lYF5£ÃMf2¥úâŒïñu>k&:»¶ÃëdwQÖá¬íîÌùVlžÅÝ„~G΂(3•»ÁlL¢ùË,¸  "ö¶F.‡Ñ§ˆ¤²Ý…~7dš"’N‰æJ‡oΓ¼e¸ØNuÂ^GGýd'«[Ñ´-%À$ЬX¤Q`ÀêV†½h_¨ué;ì)½D‚é°ºaE +ªÖÐ7[ê%@Uí•$6FY >kY­ÇŽtÅG‘WkäY­Ç<€wa<3PÌX— BmlQƒÜl¡Ï„ù€uu®Ù}"©bÇö²fm;èYœ >§e{rosé1J{…Èê;rö^âß X<´¤;KE@M£“Ko² 9‘K/› ‰f6z;¿;yGôwš±ýðláiÉøÝÕy³ÐÓB/=` óÒë°­à${¯Û|•‘†ݰïp²™$y±Fn­µÓR& n“¨4›0|è¹>Œ6&] ªGyÖexÝJ3Ö§aé=Hÿ=ø¬kÖtý³Õ²/•“\\8\ÐÈw|i¬Dè Ù‰î±Q‘SÛï}•ŽXüc›]à‰®0j²C¿ÙùÝÝZkŠz°@×ç˜JÖH›ÓùÝÆ™º¥= ”o¢—i£SÑEglz:dI#«åÜ·¤Ñ9‹ nÑÛidqßrJcÒí˜íÝa A¢챰Ŭ2~·ªhc?Ží]þfôrûß°ÝñC~g®µä£QŸkËO¦Ï‹Ý”rô‰êØåÚŠ ã/&~1cÊnñðŒÕ¢¢Öú|«Êg…·ËЪòðK&M ßæß­B¦Z¶ÃêÞxÖŽTS©£Òå–>ìp¶B–‡¦Ú¤>NáG à>MÎmZÎÄG½aÃt¡ãÍ.žø³à‡ Õ%z@à‘ö9ÍÍ Í]Ý4¾`˜ðÄǶVk·V«‹Ž(!;ÞÒ8-¾8’}?#Êkr~¹!;v>ô,:m'“<%¦±—è ³ Gºa^ÅG¼Z u®ˆ'E×GìƉ#=˜åŒ#ðFóâ'gÂ’Û#D…E³'¸‘aâ©‚ŸÆ‡®Æì‘r®7½Ðj 8ÀR³=<{'ü]®Œu{"¹}h ;¡£Á&£YŸÔ™kûz2Å<à;GðH>ÁyoŠ[±€]¢ÌDä¯ ÊåÖ ”+It‡¿ssëìq™èÕG¥Î”ŸèÍ›„~™. Ðá9âõ¢žƒô­ÑT9K/´&Åzº5ùnŒ‚z¢ÄÊ™t•+1¦–Ðñ:4l?ØoLÛô{wƒ žhÏöoÑô=ß%úEßvAYØUOüÅÄE`y­X#_?jE¾®ýG®rD&:’|R`~WpÜqùˆºÒ pƹ ”za·)õ+±ía¡W:«tèÙY:Sœ:|3[ÑÃÜDWgÒ§µØBý²ÐDȉälð^è'Ö´‰èÄxBG֤ۜKìþG¶—‹6æ\\FVþr®^)ùqЗ±WêRÜ]Ö]ô 4Kð~~7KÙlaO;[‰~‰ÉF4ž6qO𷶨v–ª}ÔWÍæ'ضµÁ÷ãl[¹iFnÚ¹!ãp®Ê+¶í¡-gs[×à¶vI¢ÁûD´%²Œ˜ðÁC|GWõÑOq®ðÓœy;ƒ·—<¥Šx2µ=y‡Ç£ÖJ¸Ë¢àÆát”`¥ïèsðšBAºQ¢ƒ^F~w Õµeˆ²“‘¤D ù ºeý="G,àI Ÿü¢7KkºËmCNÀWà6:¼ÆËf.HÀ®)H´õ˧˜(otáŽõõSøváïÕ€š~Ÿª€á’-e=Ärk.žhÓ¸ §õbãIsø 7–\Éë=¿2ö÷µƒ_0Þ¬û[´6úÏ~xåë­[¶¿€FËÿŠ‘{hTƒœèˆë£î5ƒ Vq’gN´Ðú‚qãtr›C¯…ÕË|ZÆgTH IÎoض~ø²Œ¯_ß?E;?¼*„È ‰Ž`|ëԪѾ_ø•@çëÚ@ŽñÑ=þñWŽÜC¼û3kë7³–ѺÖD‚Å#ï1rÔ~ö¢]¢‹”^â—¥8×øf¢`=˜ŠÉEËE#§Ž—‰žR*‚Îr•ºlSç%Е‰<^ôæ7™z©£Òñ?#G…4FލÃÍCÔ‰Fí‚þ ip=d9/¶0/ñÚ^øUWÕ ©%ÚùÝÉý¡ß[¶Q1î4 !ø¿ûgè#¥ ºC%@3XUä_ê,FÍÿb‰¦³fÛñ7Ôºæ?,Õû1{S^ãüLþé7+ÎJO4*À¹h~²©À¶+H¸‘i©ÐÈÑåÙØÛ4¿YuN§VMÛÖ7Sw¤Ãzу½YÛ¬9nvkŽûÑôŽFz^VY$>Úº5k ¦#ý—?#ÇGº7r©âY›Öïž™ ?ÜzW™h•d¢2¹@o‘Pð©œ|¼Q$BOƒÂ‰Æó®°_ ïu,w5zD¹ãIéu†N[Áºšhkèy!Aï)Œ?°hüq$ë覇dÁ®J}}éÝš·¬ó‡gL—ê/*O´¤ŽèÐ(¤OÞÙ>Jñ x™˜nÕ•3£¯»ñ8mäù†ˆßwZíx›¿ðsp€v4oì"ŽÓZ¢‘ŒI¢½þSôÆéÐ7‹Ýº‹¶–z—ëI—¿þå,ñ‘3zÛÆ¿TLÛÓº–¦ U'ܺ‡VE/Ò¶Jt)ßuÙmjüX÷Ù¬†Y (Úó >tf6o‚Îß´Öúάω{ùZ‹)eÑô±>ø‘\#\lQ†Í¿X 7>^–å5.1o( 5û&Pÿe¥j3´½Å·FBjÚ¡Ð}ÙzÜÑsq/ç&ÌÊXTòè㬵Ð6ç³–Úæ¨@¢#ùäÓŽ²¥Ní£ 4ÿâ§©j²†N·†>¬¡OÜx2ÐÛyú>HPÕ…—¨NÅóVT¢Y˜p_ ¥CËÖËÍ¥‰^ðˆ_…%¬ÆzAçK‘Rõ„\­r;ËÓß]  ¨/=Ý'EF~ʧŸŠ«#±„€/Iز+¥ˆŸ_ ¬F.êO/¤’ýá7Sk|áõqŒ‡@¸1qQàÀÛáÎÌ ËxËÂPä€ ½aÃkûÔ¡KÄSÄlà³Þ²ônÙþ%zü]Z…‰œ4¾øJ™p…×Rþr¼^¦5o.Ú:_<ãë×hF…úPe"¡l íünm-Ë…ù«ÑgÇé7FÞ`)ÍÛð{ÿ§Âó ß4ˆòAÓiëžËÚ‹e\Z$¨ßh¢KkLbü·†nÍ[åù„šêÝòm4u:œeM°‡_œ‰Â¥ñÍ:V:+Ciì*àõ@˜¢NÆÄ©›2>ÞÂs«‘Æ;_"b”Jó‚;¿|›èøä¨“ÐPôÆðݲº.cVc)´ ®[£"0>b·3xq&îhºÖG;’Qö‹8‚ﳘ•Ÿ'ܸŽG³&ÎE; Á ëÝÉK\º#ú]¸ñÕ aÜL¡Mã¥XÃ^D½2¾ÚôÖŒ ÷Æî ·7t~Drd6%ÒAAl¥+væÕÄØ8_±,Iè»Ï¢”o|H:ähàVŸÕY±³yÓ®©Lï¬Ôã èCK\lô4Ñï[¾¯§:ŸÑËT ‰ÌEMК'¦•Á• ìÅ A}¸•ÅÍLîê ë=U¬éoïJz³òÅ„˜(lB<ÿ/µÕbÅêl†®ÀÁ¯œy ß–õ±Û†Øl¡Bã2; ÓáŠßêöKšh¡r ŵÕ3$fá‚Ûj¨mOëwKøÛVH‡Q{Óvżœó¨ñ,\èGµXåe¹TM¦U.U“^¨G})éœçÈ ¹ª])—)yžøw ݨmÑÈ)WòLëwˉaíB{¶ßÕB©sG­Àè«þÉÚPÛ*Õ`aöªž5° éEÓK4ѰAR xdêDo˜øý ñœ‹wƪ=…Ž3•ÎZÒß©myŒÊ“è[ }`3®@wNBJ´ñ»å3áï=¹FI›z=U-K¼«xØ ¾]!‹»†Ç²)—Yç¡c»;gj™–íÅ•j°Cí…Ms‡ÛøwK¯“®µ*Y:ÆD˜q„<»a['2KGÔˆhãF£^aZz°ÕláEO—šE«ønÁ¡7˜˜—¬˜…qª6kµ™h5Peº¶Uòl|¹$Ïùß‹žzYhɬ¦Ð§Àø`½\\<òã¢Tfsm'3ÓAwXT,ô)Pžµ^Z'yû!Zç#$ˆ~²)×,ÑîW1ÕøyÞ )—z ~xÎ=ôŽh.Ë9 íØ><h~ûëtÖM4}×¼hã6ª—£¯ƒ!aFî«W ±n͹‡<ª™höÎú´)Æ ß±C¹–_«R‰jP²º}À˜µ©x,«>W„*â±p¥ÎâÜc³Z¿[5û¬´¡FÎÀ±í¡­:­[pÅOê¤cØ^Ö÷^Öœ/+›hI^Êí1FÚÇ6=×–µÖ–už/­Tš1I4½¿¯¸5ùÈ4F¶AgRhŠ¥_â'è]|˶²5;•kàjI4¶=ÿEôú ÐÒ¥ïÐ}Ûçù›ÑêyÙ¶‹…Vñ1c Í)“Þ ¨§Xô¥<ü§wqÊapð̤ºÂ;ü(¯9é/_ÒÕ‚>ÛѧQÑs²=+õrdŒ Ö‚\ŸœÍ[ žKôB¿¼]ž “GH44Mtƒ]e¤xhYa¢‘çÛ†£=Û&zÁÂl«„=nšÄ'ÿàC}YØ;ü½±/~B kÚ‡µX§÷ÃåÃC7“…Þ”8aÛO–ùœí*s2' E‰‘3rmünå]Xf´I‘´Aúši} Þ%E™l»‰»¿XIáx.–fÍšX—,[•èk?…>´u¤2M!Ÿo ¬J´1çCÙh”9iÁ<j ßÛ@wèãçȬoë2ѲèÅÅ0š­½iÜDUçË }*¬±IôR½ñy^å¨2^t¢'ÿÝÊ}P¯§Ê_czu´g›åÙ¾¦\Ó½­ßý—£ß¶-!O–ÃOtƒ¹.¡ß™úLÉçfò[M­¾¾C³a6}—dÃlç ´1ò¬4…'rˆ+7*¯"¸ñ†ÙÆWB™^E9rF P9•ó»·…–@=’oÃjh;Ð J$zàÇAŽœ•è4Ñ¢‘Wm¬óDÓÈb·ŽÅDÓ‹Ì´-#ú¤ÊV×Ôíé“KV5i‡R5›pƒð&ñÏÿî‘%xpä#{RÀª.´Êð´Ëte¼I­&‘ôx°ÑÆý?–õÁ=´4X»Ã–švf¾ðƒÏä°J×&4ªÝ>­Xá±:³õ/ M†ÆÙÆËÍGótòýÿn‘i úÀ6|¦OÝ4L67'”ËSŒ@6¹ŠtÓ¦‰½°°äm21è¦.²ÜO^Íy¯&©Rz>d [ú–]RlbýµmŒ¼óÞÞírÂ+Ü¢Kg2}N.E˜ÞS»|ôNG>´\ðZÍ—I›$ºARW)œJ%Ú˜¶i}²”m¤l“¥\}Ô-)Ù±–‰Þø:Y©mbئBõ‰|¹½ýž.Lu!mOØœ[«,‚pίJ&¹.BÊ=ØÍš5ñi>xë6¡<—ÝÕR>nþTü<Ùz!0½Èv[Á³êÇš±Ê?hêfÍ$³….½`O9DY _nùÃ©í©˜]..Ú™ô|ÌÒãÖ}‚Oˆe­¶%Ö¶øá¿f³`†f?¶Þ£x‹+ìCÙªû至úÉ4NU|?hÊ@8ò èMzT“Ncm‰¦!éDÓY;âéÐÂGS•m‘>†vb¢'öÚòwS?;GNù§Y_LñšæKÛÔo:âÙRæ¤ù»;ïv—hÚ]1Ñ´c\¢ypótLjr¸‚ƒG|4¼ÇŒ~Þ-Kñžøƒ‹Ö…¶ìnH/²­b:Öõ¡]¥m2RBøPÅÉÉuAC4Ÿ¶i:\ÒG‘y¡kmð¨nWIX‡®K¢wä†)Ú9š¦Ž&vö¨ËÚT]íh>mW¡]e‰žø`3ÑÒOªÈûø Û4½)?3ªà6)Š/2í&éE¾hz‘)…°PWWÍÚô[+ÃBô_,ÑŒ:‘hÚðc›½Mº*m¨Âx¿Úê­^W¬ÎVèÈ”ÁZ‡BUô`«)‰½¦ª(#Ó÷Kä§¶›x,ØÔãj|²”ug-áz\€1rú»›5kÍùÏÐÃúÝòñœkäÓù? îï–üºK¶õ»U†ÏRý2ñ©íDwxù¶+>‘{¶Œ #OÒ'üÞ]W½SÞœ:è/ÚùEÝý ”³cµ\:4åÒãó»]´ñ»£WúC)£Z(¸Â¸'3›æ²û@¦+ý]gÎÐ-Wuï‡Ëø¶Œ/kÖß4ÊÂáù²,e3=¸Ô“z‰më“1Fz¿ìG–¬êA†‹¢Sø»·õŶJñYbTbQ»A)`Í—3òí Ïc´êê)9pàHNÆUO夰®D›1obùЇôI…2ú˜=ÞÉxT»A_³!<Ù6ÔÓQ_Ö3a¬LlUþË¿?æfGj ƇÁWYŽQ‰®0.<¤°fÌ›³Ú‡Ú¨`׈ó!v*s¸ÇíÙIç­dwYøÃ¥2¡K­0©=ÂÿˆŒ:»F(!K`Î6¼æNe>÷…WØ÷ëÂx9ò•ÎØ­Ÿ~(bd|¹â#.BãT(&;kFá Vÿb£ÕÕ/˜É5 ‡‚úÆÈ×Om[Ü„oë—K³”=Ó†’!Tõ|\=&FÔZ…æÞžã1EϸԤX˸‰ V¾3n"ˆ½…v¶J)Œ€,ã¦D˜…ЮqZÎñA?ð©•?œQ`>hV|ºòãÉFoÈNô„QÒ470®r›ƒ6F^¸¬ó¸M¥™ÖžÐx£Ž×¨ÖW„›.—ûÃé'›œÿ;¤9GÕnFÐ vÅ>ߨ֬ëw×6_-³XKuÊedÙâ¡öÊ‹]evô&3Ñ*³ëtÖ†iûoEÏ¢—D¥©0—iüwè-4gࣵ ®Õ7¥2hü™)Þ Ë n•úðZ{‰YÚZJhÏ6.›É‘¨—+RסòЉ^ðI,4ŽŸñ>1Ñ †ã=¹m1»è&3ÑÓPò˜·‘~ðVœIoFGŒN!¯ï²Ö¹†é¼B,²,ôüwg[mx¨¦Ü‹ΨatF~¬9?ñ½Y"mÓ‚¼yº¨4‚#O±>ú»Ã6ŸóþðÈð /×ñøzuN¶®Û„Þd¡õGÛ¿J¯Î™¶É{ÌøshG¬ßê½ÿYæHä‡Ò*,<‚ùðƒ¹M,?+õr,˜;£=A á'˾â_0™¡K™xŸ ®2š’ЧóI—Ý£Y@mŸ,…GÛ8\¬E\›`ž@`êqÂuBñÕYÓY…Ó6E¡dbòî£)Üf³é)ÌØB3vw)v"™©ÈI¥fDJm|æâ šR‚§Ž]G cí$šrÛ>hžêÑÀÚKN1Û;NÚ-Ý¥t£%šiýÙ#× Cßu)ÿÊ:ß%ºã€ÕeôÃ×ð*œ?ÅðžP êƒf=9ç®e,ëDO¼ÇÖä-šæ‡ùJWª*8©¿º”úakæíâNw°0ä íØ^:Od:kÛùÝÉ£¤ßûX_ìXs~ÔzŽ:ù6f­›è÷T¤‰å3,Ûz¹èѤŒÕ"¿…éX.u¦,F?ÇÓ¶Ät2ÐOÛºb¹,Í·‚€¥ è ^â0TÈ‹[ñ~œ6‹ÛÞ"ò±%äí¡OË­d¯b:m™™E÷ÐÎȧ5k˲½,ÛÛDŸcé_°í •;a¯`ÑÏÀüö܃#¯Å™óZ]´ê~Ú:[ª„+˜¯©ž5ŽíiÍš¡Ûžhú]Rç5lKËe”—n9ÿ!º=Î÷nê®ÀÊf–²ø²›>hü»­šY|ÖUb)‹oØöГ+O}ÐØö²Öšuû‡mZ-¼"›$@ê%÷Ê»ý¬+VJ¦®g0 ±-e³>’Í“ëv®Ã³¶x¯¡#ïÁÒt+2²Ájgy /°RÚ.‘íb½ëW8{"_À>TiÍ"‰®0*»®" õu‡u¬>}ÅtŸyBB‡m:çB3.ž2ƹ<†5rÑeXÉðg䌲²"ºçüneð:W FpþÆÈ/&’žóe¢ã*¤³&ãC÷ÎÚxºToòA³„ÑJÖH¹ì^ShÄÀ«4X#´“ê4¹ƒ–ÛF¯DãYS{Iz.ÎÌœÐß%/,E¸®Þ(#)¯ Œ8èm¡O¸.LGhÓ6ÿdA^ Mmtý!ºK,^'+[ŸÑ(ß’¶_üÅè©ë„ŒA~h8±gg ý^øƒo.Ô¶D¼ ’…ŽÖ·Ã#zoáý8Cß-ÛëÀyÛ·e <S?‹I9HOÓO˜½¬‰‘î3Óv·³ÚÁ=ã:”â «?üáOÒ}ãÑ»ôðþÜhBÿtH1À}&å± YÒ+¨BÎÐ_4­|µmçéF£m§[Æo«;è}%YˆÆ–yŒ!QBÜ3Eèøá,¸¼%MT!Wxg[pzÂléwèÙÙTÜúà«uK¨fÁj§J3ú~i|âysèBB‡h+üâÙœå">húɲÑήÞÆ9÷åIá>­¡­4…æ—ÂQŠú ûÒð?Ö ‘œ:ôª6\ì´/k‡eM+~vö"ç_<)CôN¨ù g5fNKA÷§!8ûò&nY+æxÆmxlTx¡U#±³³5zË&¨LyM‰ˆP3ºÖŽ0ˆqÈ4縥Ê@5MõúMë­¶TÞc‚‰¶ªL?2^#ðÇÔ¬vöì-0J-ø¡2ê;<Î'5€5pQêÐô‰nø‹_*<"F*iQ´*¾YLhÃÿRÒ¢në$·c{Àæ1[˜Š—¡@-u™ÇäòDWì˜¶å‚Ѓ- 4Š2”M¡NÀT‹³ÛJRS ÒD|*FGÍã^BÇ»”F¢1¥1t¥×é6™ÓúLýx¬^8ëàºSbC)OÁ·$Í)ú‹ÝÐdúpoyF*gÁö5û aàis‰‰2]ʃ/â$tàvâ‹SÛ+9ãô.]Iâ¥méPà6¿h¸Þ’N‚ç­ê„b<»}%%èj]’†dŒõ­Æ}|¹-݇Œ?´“ËÂöeÝI+ÅóY ²àgbŸ5ÐGæ×òæmy»|YÓ®kÉÆ$zÀ„íV:cäFù{Äùf©aBã7Ùž»8ÇÓ.Þ¯©æ˜­ÃÑ0î »…žúá¬a£à{a¯u+KNcG[…k¬¬D—pä¨m9­toN¬¡J¢“ ÇBï…Ït-І Á£hŽ?§bNº¬L^ò ƱÙNúQÅÞ¶ W´‘ z|Ð4º|$ƒF½íYÚø\ý)zˆûMßÔGþ2½®qFi|XK”C·æÍÙg©'J 'CÄ­‡uxmLÛR‰z¼gY³¾¼µ¾²òž0¦õíÂ#÷FOæ ¼qôžØo<ò€X¹b¢)wÇŶ:VèÂ×úцj¢iƒsÛ¶šé²gé ïáP…ë#ºeÿÎí¢Ç^';RÇí¨ ß„±m|²ò˜¶ù©zá ¦I%æß¬*‰Å8±çvdoòDói«N8á\46îoµZ³î¡›úºÐo&æK íLúߌŽeècÛîa¥½Gœù­' ûüF¨Få$ãÞØ£3®#F÷Úº",#ñA;¶iƒoØ6ÐÞ;%»m²ŽÐïÁÈRP_ºq#˜Æ%ÊÂh‚_@›CwàíqŽˆf¹?íqfÓv±~·ª×´ñ»=§±YžW³žÔ­Z“î9¬1tZ©y¤#lüðfýpíŒ\®Kõ íŒ|XhËùibÝ>…v6™ÈLIïÜþÍØ¶’¬÷ãQecγR£ñô›Dó‘wïLX–øƒÆC÷NÕnMÝ‹Öùpgì“«Tœž~p˜³/'HúSôv®ánp®Ž@[è¨S¤èbÙ.Ör–ÇC§´€DÓN¡ç–XbÛ5ÚX.Õ[.Ízã}³…6‡îwöI÷†.S&Ö™Æ ík+xôüæÆcÏ›óÉ»ùÉ=ô^üh쎣?†7éÃúâVH>•éñȧiÛš6׸óÅÕ0”5ÎZâ?Ðßž¿pçt³Þãc[m[«5#útÖ“SIŸÔŽÇ~¬3âˆÊŠ˜Òx‡ZÄç¶B  fZîö,¦í½£ÓìÏFN—Ë´žSm ñ÷®\{çd#¾O|øÇîùnÓóZ§!™t¤°a,8}h9ŽÐq6ÒðôT6S¢Itá“î9Ó»’¦Äðð¼Þ çÚ^JwÒ`e ùb]ïh£u§P·sYwÊRÊ>ŠWã}b„>ö8’yh° đ҂…vfMU4²’}Cç|G„ÒX—ª¨éûÊD½¥ïE«B¶öP:<úÁ·º°Â­Z!OAmWkÒÕ‰ä¶ú–³Žg'®0cƒïfÍy·l‹OÉÊÝ„98è<ìeüçhãw;snt\?·Ç þÝÙȉîÐjGt“kÒõÃ-t(4pþl œ¿Â]œ¥šh<òjÙVSb깜欵£N#´Äð(uTà. 4mR{$À½Å£æ¼´"õ,®«•裛'&ê¹dÉ9S”¿Ægüëÿ>ŸÛÑU’$ú]«ÈñItÈ3 ÚÄk|°Çh ÓÕEï‹„‡n Y­Ý™»èjͺ‡nÖÈõŽF±D;kµ›èØãè: ¸Ât¨Ñl¢¡Ooè™2ãh©ßÑmöÂkaÒ5wìÆÄyhiðâµþCtJ$ ž]‰6ΗbÝG¦íbÙ–/b ù¶k6†ÛDðÎ4sîürn¨PºõŇ5ëÞÁZă@Í2.Úº‡Vm"j9èN@%!Ê?hô4Kôû»é>©õÁ«¼>ĸhÈHLônL@7ÐU18é©/€jü­Âº\ªv8ŠzŠ·BçÜC/ë‹míÌùÖÓ )¯üXC—ú zM¿è&ilóÑ*¢nW+®mwät¹¼hc›´j\9'$Tø Ûï:G­¶Ýpo“D‡P¡ÞØ]TÁÆè6WÒ qNþ é]ÔôGBÏÐô%Ýò> ¶åðQ·)ÑÎÈYÓ+|ü)é„(m–»ˆ×š…îÊÜ eî@m2¤’ð U4ýžªˆè|mWFaôíóß“]ÕVxÖU z†ûèé¢;Sô ô’е-4Êú¶õ”­ðd³ÑÖRýíÐcÒ£m{‡“ª–QËn,CzÑÃùf¬Ó©,¾3ò£YSÈÇ@Ku<ŽíaÝá6zo¦¥yÑü{ÇùÞ#9ÊÐù0G^þEÿÇÑUax Fq~al›oØ6G¾ð‹n(@3£©*€¿ØÑ‡lÒ6¢Ëº[#ïÉw¡Ÿ,›ÊÓÝúïÐã·èÊTÀÿ Fn 3ÐE¯ài‹ËùÑ5´¿èÁÑz‘¡Úô‹6~÷ÆåQ]˜Ê] $¬èn=k†ž¨/û‹žs¶Dqøa²ëÝ?ÐI7¡‰Á7S ¸(ˆH3ÑÖØMx·¾šªuhàc¦@Ý*s8oº,±F­k®m(-xm/üB˜’Ç¡ñ‡œ:qá3b4I8§µX'o)wV,ü1Þð¥2— ªö•BšôxL8þlË JO91HEëÿ™wNÇaiØí7Î× ŠÓ°×…¿ÝÙn'¥èšSž÷cýõ) 3mÓwÒ›Jè“ë„¢jÃ/—€?:K‡_8-·.¡â`YoÖIQ§ 7öK ¶°âÕRK®iÉ¡FCæÍÜÝRÿ Îz“²"}îzB1)U Ÿ‡õ7´ê1Y²®\eü»…¦‹­‰öŒG.Ò ]l]ÔcêJ™à@Öt¹ÚŒ%¯2ñƒ€“ÞµËès'” ʉiü ù¢Öà-hß }{{Ã¥ÞÕ„1Ý‹ºsW)$Rx(bÓ¦‚Ñ?„Ž(ËÑùð£J98o#{Á_=²¡«Å6Tûxõ¬«} ÉDÓdǸŠåð/0b‡aó 7Æ.ž>K8¤ñç@å©Y‚½î±¼_BÅ´b®Ü¨n +ßè’HbÅåöDÅßLhÆ"(·j 5»ŸÌùâò¡P·ƒDGmô¡¢k«Pö¶¨òl@a*¡OÚ±B— ››_x)8Á4%©ÁÄÄ}`É}Î:­¹+ªØ[‘ަhÓvÑœY¬Õ&Ÿ:/ºTî÷ÎôbœY÷~ùä³î¹@oŽ(D™d›ñ‡Â·ÎL0|¬DÛ+îÊ-ð¤‘=¬å6¬Y›Ö›–çu_u¢܄? Špøá3·ä±3ŠÑýíŽÆ¨l¬àAÔ?‹æÄFŸ 33tÑ,Ceª¨°ƒŠ5 V&Yâq©¦/xÈ÷ÂƽúcxÓ3>í—™ôq½'gêE]„ŽD%¯×)®9+.Ü1¾LtøA¬ëBQiÖª(ŸÒºS·¬3—]m™<™ÐqF¡¾ö³di_q¯GÑ¢©.¿vwÎ×­øÓWS–R8/q8…ÂýážÆyÓ!Cý Ó¶ºO²þ(‰î°`Qè(¥¡¶³W«=+ªèx(<ëYB3j·¦Â¿Ë•ÆŽuºqÄ)c6ÛúÒçÖI†9“½*YL2â_þpzüÉÀSlHøÃéd>·B¸Æ¾¢–…6+·fѯ¦4mRXnµe]KgyŸ´f%ÇÃáIÖeñÓ ç;½¥±U °ë}¢KYxÅ•¤”±‡ê…/>ïCƒgî·àÆv)ÓÙé/:Ê!¨íe­yq앜hãwoï‹ç>W5Âlݪjê·Ðô›E÷Õ¹¾UÝW˜û ™¸Ð!ÎLm1EðÐS^…EµGâ›ÁåV§5ë˺O}x”eÒ_¾­#"ܤßL2”,ó_Õü•’Ã…–× xvže$ç,Ëxɾð€º}o)ºò>¨‰¦Ý‚….Òª.\Zxìñ„>LeVU 9¿¼‰ó@öè ûZßÐsmÃ[¯)‹MWÜòfn+±Åòbõ¶Ce©†4Þvù[6˜œÍ7àïÝÀ"aõör¥EOÿN{œòE;Mð…—Œk½(I=¡€7š£©·Ð±?Ý`î>‡^^íYªÆ¨ÊBM†>ô¸1o û2c¢ ä­ªgqi4-'ÑýC+®½`™\¢ $ÓÕÛ{˜±…¿a›6,Pɱ‘èIô¡˜õÁÌ¡‹²` •…¥kuZëeòšÌºáÙCwÐ˺¨pô±Ó×/‡¾½õ湞=“°42ˆ±rx_¡ÅЦ×BÆ=ùÐ÷аŠñÃiØ3ÚOì°$÷ÐÇuÀëÆOL•?÷Ë0¸œÆ:*9:BIÆÈy>Ðrœ= àhUgØÊ×K³~·4Pè}ø¢_‡™1sm|où¬T]Ù7­üÚùbɈgBE5«Í;ßá‹kÇÔ¬U§ýÉê-|¦$‰Dw¸`f*ëÂM:Õ?‡Qeë§~þî¬ß¥Ë-kAiZdVmŒÓºfµæ\-Ò™”Y¢ ÛÝEWœ™:”ýÝÝZ-öïnØßL4}gù,×e‹R¦ÿQ³Ïçä?üª?Ã}NÏzvúdEö5ëg ë[ÍÁ ´±Ø·÷˯ö3t"\x²öh¦þ–ßÒp¥à;!«Z3¯._鶆Ã?=ÉÍL¶çÖOÅ´Å%Z7>æ’M“a·5†kâÔí—ð`àÁ¿›u9¾ð=¡¼Wý4–ÿÜ(âµÑyJ1០¯˜EçÃwÅa~}¨ìcBÚMU…ölGY!üÝQÉÊmg=%%§˜èö×¢»µMÎðàSc§_\í¬9V˜ˆA±¸• ”ßq¶õÉûò×Îñ¦í¤÷G—›c½©—-\¶Ñ%®ÐƒCðM;9}¨ãÚ²úÖ˜õʵ>hsnÙFŽ>p[–þ>PÏ­Å™-µè¼½O~`¥| 3ÔΡñòÄÑÌ^i-»-(º£>“»B·µeS«lUl\“ÏÐÃ3>”QƒgL™.ºòO.ÛÓ@wŽ^\·úƒf‹¦¾L4G"ti²TO‡]G¡ƒL¯¤Zx;…Dóµm™*åðÁ¸ƒ®_@Ã/^ÅE¢‹µê‰Åž ß@ŠøýȆNíeºKškÛXk²M¯*²õ}j·lwÅiYf¡(Z†Pã¢QQo¹*ïMUþ£I~Ðx±MäØö½”%¢wŒoC§žv{\¸1v]œ×QSë1êú´ Ù±ŠÙˆ0}å¦:Æ“6N© û«/ü‡ÆÕ—‡ñ ?hí]MÉiØ+GN_(‰f¤Á¦*¼ƒ£^=õ˜˜–ªz8;%Ê¢ŒO¶x¢XLæ½øBßQ)Ëòó_°mD@²¶‡õa’üÁ¦åÉBÚ¾TqãwGw?ãB‰ªJÍmÙ²ì@ÚZSÓ1}‰¦cµAR°Î$7Êd|S›zÅñÙì—Æ*[öKÛ8Äš­Þèb·‡Ë ÞfÑ<‹*® î7TL:ÞÄô‡Wë‡7NIZÑp£8ä¡ßoF㔳[«m¸è ù…~7=ÕÍ‘OÍ9µ­J|z¬ÎiÍÚ4÷ïÐËúÝËÚcËÚc‹еOŽG^XÒ-øn؃ÈVeÔYžÇùâKq'Ƹ:¢Ãôi¶ŒšI­˜4¾»ŠiÛØf¶mÍ·x4—öÓÕ›îÀÞÂ_שfŸoÎJáÿ éW«’(aä„ãÎM ï…Ï»ëÔXzR³âB‡LyHvÑÛêNÀnIŒ}ê“Ó´ßÏz Q´04RèÉ7yŠqÓ²¥êÇúÚµxˆ?|‹(Fs­»™¶OƒÊxi›ÇŽv·F>­YÛú<ÎÈO±ÐÖZ;Ö=›WÃwñž7¤¡Úhé"32fWßÃvW+?t¶ô¤ÓâV™u†î¡—…Þ\×®ßÎ9ØöqÐ¥lï.î.í¡’è w¸äßÎjûmæÁòÃRþv&ýðFK‰¦9”ÏÈéï®ÖÉf¢‹³É’¹kØþ[ÑÕúÞ)hgÙÆ#·n²D³`ÛÍžÂßùÐý‡èa}1¡ñJµœ‡ª†XŒ¨ýAcÛ–ãò·£ñ¹–‰àìQ,îª`aôݬ+8ÚôÐf5ýòO±í£9W=}жfÙn\›þ;¶1ºóÒãÚ±m¬="šÌrñBï ³„=žúмMÚ¦íF= €ˆŠGœ‘+£Í¨:6Zr´,aÔƒ¶i¥ÑEцӖTcl¼YènM› º–fz¤ B*‡}8+½§x <“û¶lN5zw,â?°4™Ð!0¿w ù¬bÙVkêÉmï>¶Y¦~µô;µí¢±~—?íÛ*´s¸„qã‡ÛèŽ/BÓvˆ,«ßHtƒM˜„Žk”±«ºÕ{AââÎ.³NôdÔSÛÉ gItÕIoJÓéWRž.6QœùŸÖJŸŠb´<Fæï— ?ÙpÑ |¦¶ ÓzW¼E§zž²bB%c ×e)ðÁtbÍŸtK²¬\¹'­Á²¸4^a}{ŸŒx}Ð~ð•[”޼[#O1j[èÞ‰¦¾ê²¢k[_,µ Û:tg·Œ`»–þ@±;Á‰›œä<Ä 7lgßp–îû†ñú„Oñ£±[ðóÃCL܃Ÿ½ÏøûßcBq$ßz“Ð +—<”0ù tåóÖ-Û=29Ìwÿ‚m­Í2XB;³&ÕÆIHÛF G$#BŒu¨üÔ øQtT°Ð.éêˆØ¶ÃñŇ“g|ý½ÅRƒ“^¥ÃE×jþðž*ê¬Ê|¨œâ`¿³J•£Å#eîã*z³¤c¢õÕ Û%¤ýõžlLteD9E´úd "C™þð©Ô>þfKðÏUI[OþÓUÕÀøZCù‰Ÿ¶­Z¿<)öŒ8DT?ØelÝB¿/ÛòÀ¸§àqFÐió¼€&/€^)mZóæ¡—÷÷š\Á]Þ¶kÜ;Œ’å6Œw%/YÈu„›î½yðîÂÓ€/.¥Bz-õÍó*±ÊùxÛ#UTárK¡eÆ…þ2¹èjt©ët—Õñ°úÄþjôsc‰ú‰Ogè.“§Ý`Ïì¹1éÇAO¥?éïN™dºTgqf-д©Ù=éï!…I ÛèfÜE{#g<L´–ôt¸hnûÐni›6³:¢ÚŒßÆŽSúÆ]øû@b¹æ!Þ÷ÀùÚ©Ä!´úc›®Vш×>Ñ´y`¢;$! ñÝ,aN´ñ»·e{óÇq¹öL™1ÑÜöR)ï¿Ø*?DKcˆ¾ä³J€†–šƒ²®?‰~øóЩPDç<#^ð&LÁ[gä ?érä¬vJά)IJo¢¥B=Ê€¹…0Ö#ßP¸åhcµ •³ÐÕ2ÂOƳ–Ïh:rÝ‚ô]ä£އ/ƒ‚lÛÞ3ºÂÆ C)TÏj¨¬Ã@ר¤ï¢­Â+úšÜÛA£UôíëyÐY îÓ±óàÂå¡ÓwMxKÁ™Â“mEáUô_Çøq8´GmTX —)egšñú ‘Á¶]¸ŸœèËJ¦­',åItƒT„)Ú2e'ºÀ×d¢Ü&ó®YØdÆ·ÂúçSbÚTá(ÑÆï-Žé€þ9G¿‹]GSLqcÒ§ú$ð ÑYŸÖ鲬]– 'æäOé§(íèÁN©¯7(óÍm[‹Õ†ßÇ@óRgÞÊí ×z_Ðk¼Æ©lý;þýh¬[pã&N4+è7)¥Ã6´ (™RðÝñb—qª/™Ægüƒ¡›÷˳xÞ 2ÎO‰’J(tµwkŸ'‡‚ÚÖVÙ¿—~³)&' ÿõ?tì–+ð…¡Ó,kÝøhöз”E0ºqô²¾™úÁһܷM ?Su {Že[Ëe[¿Û³}¬Y‹êĩނã ímü𸠩TõÞc¥ o‡p¢ÿé{…=ìÒxÇ_­ŠåE£0Õò;kq6ZŒœo•jùUB²ôM^«·Úªjé´5ë“5kÒ]ÛÎïO›ÕM íüîžúÃ;ï3Õ‡ò0Më1¦ª®:̬'ºÂ®î‰8„ó¢£XžÙ9ˆ.ÕÈą̂k pcÒÛÃÕÜflÒ@]!¥`F¹W4’ƒKµuùN4.ÿÂ=ãï.cLŒ©Z³(ÞËíÂéÛ,|0Y4¡£†Û> ™äÈd %zÇNÇh•@3tÊÁÑ‘g-ºÍ–;òó´ÑÐÅØe‹?Ï[`‡¿·‹væÜF_L-t“cª Ž1òc]eÇùݯ›Ü: M÷wœYë*Í£®nvÿa5G3î`jÑßm£YkÖ¬ÉGgb°Â½w(ãõýAø«VœqãÍoà®;”ò²éõ<ú σÕõ)e´UˆJÑX8%mÈ0K4mÀ—èŽoƒnÝD]U ¬Ъ§KõðV²‰°5¸Ðq™ÐI?ªÓ¢Ñ‡ñˆIñÙ%‹†F£N|â,åˆÄvÅQ›ì\D#/ZÓ—ë ®·Ñ­YïÉ€åpÏø»Ë™‚ÙTyþÄ/á1¬‘-7Ó‰ŽŽPWÚ€ap‰áŪwÍÝ Ý¥4ø1"ï´±Ã:ôÄèð“¿ÔºÞfu}³ê„¡÷ÂÌžð£E¡{ÁùD3Õº©ÊãÊ÷iÔ‹ós}ÇšÉÀ…‹5Ñt§Ìl OÖ™x8×sªÇV4n¦s.")þÞòYéûèE¿¯+ºMÖ£´}Ú-ù^ôAÆ]¶JŠÕpß:½ÐVõàÍûnÍún¡Ëp0vuï§ï»Ùð=±åŸ6üx&˜ü¸;xÎ]+™ßôœ\¼‰t¢yžy-^]šè‰s–KÙz7­mÙ¶ÑÆ¬í\.ôƒnœÖOßµÍwñáT-IÌÄx«Ñ8ØnÖÄÜ8âvC‘ÖÞmï€ øÃéOÙ¼ŒfVvüPÝGûÆ»_x¨Ð_.4ÓzÊ¡—†_ªçI_ ®Øóðîçiü¡ Š/œ¯÷h¾¶ð›í®'7#£äïéx&ŽŒQh0ì(G=بÿ7F®+>ÒÏæ#_*¢§¶—p=0Y¿¢$Ϛи·Ðkg€ëV“³<äRû-ã‡Oí|ðÅYïK¬ðùàÃ5o.ÚØ¤ª‘mðÁ!8hkè˜:¶T-¹á5¾Ôé@ºÞº]˜ðïÖï®m=-ôr¶Iöäao´u{ò° ÿRY…‘¡#ŸÅm‡»ËxL ”eù3vøÅ«Zx2‘ša­¬ëðqçÃUÅÎw6:û˜ÓyëºPèMš•1Ôwªj1Ç`6zr–åŠ~B{À¬³‹ngÝ-õâ³Ö¤˜@7ik–mqCëNè°^ÃÐtä¹Öà¡yB%nÑhŠãÁà  ¿\Þ.=Úúc =èÈ|èê‰C[Å.q‚{„š:»)²¾€+¨µqªWÇšvúsdÞë5tõŸZô£kè9ÇëMaRÅÈŽ<¬3`¢ùŽè‚<Û¶.ºÍ†!Î&ôá~ÛT<½¦ê<µ­túȘSWüâ3`*b%!gà…¾ŠóÁ—|'F YIix¥‹Ò²a­Æºúîô³R´‰1kåvE7húË“Ú@Ÿ¥V¶X5Á!Ê—ÌV;"ÖgMÍϳ®Œe…jÂ+rŽgÂÎYB;moç4?ÞÌ‘烟DZ}²øŸÚÖ…DÝ—£³‘Q¡Õ¤ÞøÞg;[4“nÔé;RÆgµûû&ÝX-ؾº×ì`Û–þ³Ðq(³¾•ñ£…A;ňéɦB.¼^v<ʰë%´óÍß';è#ºI:þî2yåa¢•`hå*™ç´• Ú®û†ÔéZ«•;Nûjl± Âf!€lÅ¥'¤Îlw+tù¶%$´±Mêæb.B;Ü:ª¿Ø±NÞã¡Ã…h>ò@?Õ¨’½Csêûö™g1Êm5k:ž6t›d—zV½3°\ø/ß\|yÇ5dì“”5¡{´©Í =VC˜äDˆ•¡«óÉÞ½íØ<Þµ%÷ÀwY7¢F[±ÕKç¶ÊÐ;ù0¤Evv ëx«o7Ÿ¶è~=‚Ú‡Ñ;3»òÀOv;oÓßÝœã!ª[ù&Ë^Êt±Mid1šøŽ­m|1Uü¼ËߨS^ÖÛæ§èÆÙ‰¦*¼ûv¥+]•ŠÞ¤·%<—¬Œ!¶3 Ýqä%ê¾ø5¼ ¢¶ÐÆ ±$£ÃXB+=Cétµmk—mk¥'šÑêvÔþ„ª \kN,|+} ZB¢ Líî,`¡É:ÁÐÉ‘óÒùÐ ®Nå5öÍ0ÃÚ«óÃ‹Þ êdíOþ‚¢›µØ$œLχ´G®P:«Î:žáô‹éqC_GuŽ¢4¢|¬Àɺo:kVïlkÖR7‘lÇ:™?Nd»åKWϹÐx—¤m89*­£ë<Ñô&:ŸÂ<:rñYÖæ(ÏFÏóceÊΧ“!ò±šÚUè5 }6ôØŽ²t’bhã6ø …ñ¨X‰žÈB‡J6º‰TÕÿzɬäçÜü"{‘ H¸KÊæÕBªÃ!4¯ÍOã.åX“~’ÐF¿¸wºÑ˜»˜Æ{\¦MŸ tÓéÉXu:±”ÑQ±R9ø¯ƒS O¶”¡ZøG‰]Jþ:¤ X¹Ò‰üh8}p½µj¢ßÕÊÄД³94l#t©”«#…oÇøø§4Z°¤œpˆÙ²BˆsëvèjÜ®gÜ„‡¯Ïf×ø‘Ž/kÀ¤¨î»Ü™øÈ‰²aÎU>ªxÚ0×x>OŒñ{â6ÜFµÕCAh϶㠘Æå<Ò‹¡§ †Wk.vz! ¾ wVð³`ñNhå$¡¢¥ñ?}(¼ÌÔ÷Òx+0­¢f*Ž8:ñJ I Šn)K?º W¹;u'†!4ô 49ÙÀš¶¸R¡ÿ–͸!r$ô¦y^%¾ÛW•žY†K/Ô‘…Kø„RW:›A_ÅÆ´šÜDg©Ï¢v4$øƒƒ3ûoÁK%Ð Çg¶za¬È”«8Þ¨ë: ÁÀ?ÆéÙõ° ©µà1ioSi,<é;W+<Ÿ¦!•(M‰P¯£M„PúÉT„üàGÞ²G],¯7àÆ{akìJ„at³>¹uÀDí¶3ëRÝ¡ûL…ãüu»º5oÝhÂuDÓ3áχ(~-Øý»…çØº ?”8~‚ªÉv¸Þ¯J9ëJ™ðwÞéáðöÀ.=¾õj}6Ál–#xt.áÆCƒúpWÿòì×ÇJç´ŒõçÈüîüôá"yR'Ò·îþôÁWìt|PÉs<8: –Ÿr[Ÿµl9)Ë?¡à¹*ÔÚF_qÉÂ†Ž <`OQ™ k(v$“10=çX§ûQW+J‘9yº³rð#–jÁ™Ø3´Øið45ýiHè¨Øƒi›i Ë&ß³%«;—íIˆsðR_O°=ÃBƾ'óÜ­}¶É¤'zæ;_4Ô.XJšÓb‰) :òõD—z¸óç‰ÆŽ€/þ@OxT“(ÐÛ»èäxŤ”ýá)ÌBOˆD“£1ÑÎ7+³UM§-Ћ56÷ÑÊ® -‹†A¸@WÝï1ÑQãK¿w³æ\¡K”1O´3òžš—ôƒó„ûEÓ6xð/áÎMéFT:ñCY‰“|Ò÷QY–í¬Ë¢¶%ÁŒˆ\/ºfVñÙ—º ¿CG”ò@ë€A%'îŽûS‡ã5Öå\…M…:(hãw'«šn²Æßòn–ÛÖš5é–¯m¢yÂ;ÐÇ:Ôûc«/°‹UÀUàŒZX\4Ÿön½+»”PÏÛ¥¶¥Žm=cäˆqцmëdì¢W 1Ÿ@«Æ1b.º1Qš‹æ³6¬§Uô20ÐêõFŸâC¤eÀ9¹â¢¹§ܯ5JÞ-ãC¤¹ݶ9c¹ÑÃi.kè++¢@-9ÉÑ®„ÚΪúŸÙ$oÃy[jTGǾÒ@ Ñ„SúûÇxÁ!³¥ ˆè÷¿[ÇO;éÃñ3&:lV·”¤Ýܺ$f®ÉþB þ|t÷Ñ(Gè«T.ºó]:p;ëoØvæ|êJA" ß°`öåÆ/z²úì@/ -é¬ Mã?E‹ˆĉ‘Vx¨¦ F«ou¾¦›(~§ž¶ÚÅRçg+9Xm|²f¡»æá©èÍjùíŒ|¸hc±M½oÿd‰á }ËgC²KTÐ÷:¡Îîö'Ëöy,tqF~Še»Yh%ìèÙt¬]–J†xäÃE#_r›¨méG¡ª¿@«] •diè/ Ó†–KKë°"ƒDӦ̖ØR¾ ôÀ’ßNâ0Ò|Høë?°õRDøép¥ ´æ­@LïÚè,Eš øäp¬¨©@¢Õj££jïW¶waÚ:_óR.‰‚žŒÞL!ÎGËçC‰vvÙ²Öù’“OG¾­‘_F üàUDÔ³ô¢+¤'š_áÊ÷>g'<Ù²WÝáUé-^³/±†ú•w䆳K°fÞOFïÑšº&Œ6Sn‹;ß:.¸ÍÒ6j;êÛVEË5©ƒÊ™–³Ë(EJ†P°à¢‘«Q jqwÑ4@YÔ^6%Lô)ømÔ¦5ç²MÕw¶ßc‘%µ…~m³Ê´]Y·ÕDC‹úM¦ñm¢#ÁI=€à¦= ¦ó‹Èe†u®À0õÛzuŽˆ@/ì¾ôÆ3ê4þÝÃD;³–!+ú½—…Þâ!P×)b3é#SœÔ¶tÃÿ¢H›ŒÆ(½ M[h‰ÃÒ¡Wëx™êUÊM;äZ¬Y)F‰”²óÍ<ô´F>½O6ÓÉGW&,èeM›º0²œ.ÚÎášÆ?Öãüîõ8_L’j {¬«XÆ%,†?Y•ü<]VM= ¸ËþÞ¤Œæ]²ƒç Ùq v1ðJYÙ¸ îÒÛÁo1¼hdI´‘ºœË zõíQ.†ÑüFI4c½~g×TÆàZJr¾)YºÄîŽÜZ%Í 3U5"éç‹ænߺnà&ÝÖ†CßrYJI5³†Ï—-QØ—[¢i¤Q’\ÆÐ•¦ÛtË{¢Ê½ò™Á[¿<Ãft½‰‰‰×úm[ByFè“Zpž: x=|¹É;M:u'9φuó·›ð2ñcåd êªS1ü…Sg$hr°sÊ5^†3sïåÂjyËGO\ÑŠgJ( ¯?—ï°êþöƒ_ ߘº+¨®õÁg^Áf¦û#t<±¡˜òø£óæP‰ŽFC….=±‘„u ›ã„†î!'füíh|<º¶c—ÑSªEbãÊv#ÍÄ?¶©+,dZµVn?uüɆ“]0ÑÊ´ã ®\9 $¥m$lú‘Kõ‡^fjCO_'Ó¡oÜŒõ¢yRå(JŽo“ìzÇó ŠwfýX¿üðZ ¾}pRÑFQÿîDoø¼ýŽmFh©W‘•ù›Ò >°ëp¢ƒ6În£/Ǒ檉7ÙÐÎïVô‘+ÅÂ}— ‹õ åzUpÙ !Ñ †Qê-jadÚ´M½š ¼´ºBðHáÑ¡OsèÎ&“ s}„ölÿ½±4ùEx ÍéßÖjñЇ?/„¦í—Þþ8Ü&ô;rÆó¯QËòîoVcP%KµÍwhiÜ[¬Ÿú':kzF£þ$N\¸R‹ñ®Ò¿­° gÂ͘Ö[|Å2Xõ£üK€¢Û„å¿„vÖª²g¬kB½•_øw/k½,ÕãÒµjÛ®ø6)¢T°ÄY Bå†ÍE}hqE¢Y³n²"1¾ÉD‰`ò-i»@2‡û»«Z#³ÂñDÒM´5òÈÑÀÇëfFŽ㌎!8í[z‡ÎïƒZ¬YúÀs±¦*(Ý(Uoø‡ÛÆ#­N¯ª‚Õ¸ «Ôi¨Ì¶­´6=#”sb‰áÏÐéMZ;'ÙÕ,‚~øFŸ” ƒ ÆñÉ|Å…ˆO.Ìë~Ò±Wï§ÿÞtRЛ-à­á«m6'@0›³Ug–ÄÐõ>x“;¡ÏÆœ”èÏשh„tFƒ8F7‹nPéTè PQÆüL%D<öm}ò¿}|4Þ¤_°MÑËrÁ–ŠÈéÃ~©"—®ÔõžÊï“•]¼iì3Ô›ZÁ>ÐGü ºKu’ŽñÎ=‰PªVˆ&Ü8 çyç%ª#^4ùØ¢ð•z4ËðÊýÇu¸ˆSw>›šÝѵ~¹±äÄÄÇÔk¼óì’9qûÑz§ü¹€¿oúÛ>yÌ{ÇT³¾Š·ËÎÀ/îî~}4mRƒ©‰{z× ¨îЉÉ;•×á>ßËyFÒhda+.A‰ƒaÜȰ„ñ'r÷v‚"/úœƒÞ› }ý®k—zÔƒ“¸[t*Ê—öTÁá[Ê‚Ôo?WòÕW¨ã#øûb¡Žˆ¤§&&diìTÿüÏO§ÅÑß°nÀK&Àéà‹±Ô9Å©Ý<’ú¥‡TŠ?á¯Vµ`éŠk©– o†`¢-½qÀû¼/ÅÊS‚ïDZì#ëü…ðw¹Ò[ñ(#IYg¢Úiœ6°©WNˆ2Ž*òif*DyBQÓûhªƒ¤Oµ³”ÎìôÉè-\ iœ¶ø½˜Ê:ô¥Ú8Üõ>áÍœðJ¼e/Û «Ä[üæ ݲϞðB%¢E‘Æ!Ôv{á²çV ™˜ åÓ‘7ýp–ciRz906 ´Ä Ñ9“Æ›5tÚï©EH!¨Ìÿm· 0;eZê­P?ªÅ]{…QÌ›ä;hѳХRÚBo|¯(QÂnä?hnû½‘™t©Ð¥P/Iw½ï{úÃK–ÿ6¸\K’•Y7½ §êc߀Õ&ülì¾ÔD86:K1 þž¯Œ¸Úâu{z)=öXõªHpL¢+Ÿõ¤š°wª4~w£JdækÒ?éTé'ážuÜú EäÔ2þkø®0òܤ$¯䲕TdïÜ„;kæHPœ=ZnZ7à!Œa|õÔô {½ªçõS„•š´)Lë5 4L˜(:ÞèôÉ“ÊxÒ›5m͵ý3tòMàS;O¬ mŽUZéK-$<Û‹Ÿ.CyúVªÃúàYËÑñ´§sÖçÑËšôe­ÕÅ5št)Œß½Õš~ï-Ž |6‰C¨ ûÝanæ·#OY‹ÑÿQt1ÑÎmrùh HÒf¤µútìÝš¸‘ÅöðJiŠ‚Ã(-/3Ý b¡ÐïUȨªµ‰è¼ŽL´ºkÐpiSA%uúÒ6“fPM](Ò¥ª3±Ò6_©!ˆ± Kè uÃ=Öäeªíê2ü]]´1kͲݜµöcô©ø2‰}ÚðHè`ámÒ­Oæ¡Ç_‹žÖrñÐËù²6øúíÈ ô¶Ðç_ôÐÒ1ƒÞb?\§¹] ºÐ‡å= +0Š5òÊ›%|Ð4 ?Ä™bl³´Í¶°Ý «4Ñ´ œ4Ža[="hZ|XWÑPp’² †uì•}®)±=ÖZ«Åëù4ÌLœÍùÝSì>l;Uµ©ín¼[_lX¶‰VVW“höÅ"˜ÖŠzÐ8Ñ4v¬S‚Îâ#F|ž¯âÌù’Ä2]k‰f}5räŠ_%š“ÃVuÑÆ“–õz–Z‚²ŠAÅõpý~‹äœ³Ö¦µÇT•ÁêÆͽû•œa:kYã ÏÔ¨ž/&Êl¹÷4«º­Ãe[‡Ë¯Ñ Öœµ8VÛ-– ÏmešÜ&»[#÷ÐÃÚ&Óúbê Ad;eÀ!ú¨ÓåEu Œ3œ'tÔÙN.W±Ù‰êR/8Ï%x`ð£yG§²dd6íÒÔã'G›%4r¡ƒVÏÊy¿aüi0 áTµ¾g7öï³þiæŽg®{¿½«¾‘q^»êÍž ÓF]cÎà×?¥¨‡-ø©ü»¥ÖìäcßTVº«ÞŒæú„qúÑô&fÚG]õf]Rf‚…Ì"l8éEš‚t­ÔéjËz/öÌé*™2Ð ‰3µªþiuM¿Xã @B‡3€?YÍùA9ö>èÕÞ;¼Gx¼$šy®]¶XÈ+ôë‡0)˜DW¨ûÞU«Õ`ùt¿•^¬æçƒf­»*µœÅ–ݪéÐÉ`̲þéÚLøV“:rÙfL®:«÷>ÁßL—«çìá©oJŠë·ÌŠ…IÓö±Ð>’ºŠ´Œ‘«ü·èjï¢åºcG?Ñ,`¼I î’ÚyOÔšlYáE_U­‚˜^º=rÝÁ,b׳Щãs1;ð2öG¿eRŒ3£2£Òìž’ð`ìÐ_ž:M|ì›Ê>*ku*?Úvv#£pQ´Yİß¾ô¯€fÔônË¡1·DSy©D¼K³ô…ÅxMÅ£{T¾„l!tùZåe˜BGÄ> zdtÖ[–öâéYG£…aü¡ÍlÓøÄGkËýæ®í3‚¤ÎÐݲ”!ºS¦bÛLq&áQhÅ­ŸÍwšˆy,{ÖU®TøF‘0Þ(ºQ)0Ñ<°Ü’õ‹˜LÝÁÅÚói'½+ÌHGÞuÑÐM—úƂ׸ºØvn¼ÆJ§¹³,X¢>„.ø}Ô³«)ì·æˆf1z澘ð]oØ{êYæh¥íø/?”Xpó7±Ê­(Ô?ÕZLÓ_Tkg½œ ¡ÏÁ˜è•Z°tèË ¹ºA–»Ð!Mm'Ë.—íP[¸ô2Mã4ªÞåF°f)ýVÿP¿ñhênw)x0ižES%zü¾Å®ü úðèÑýáôJ©UMÞñX—ÊP…õKú=bèÑ:Ô·¼z?ܻˇbë4Ú92œÀxß_0î¿ßMæšÆ¢XŽûöÈã‹31® ð[et^fðoF©j^|Ú†u'½ðpbèRW¿büÃg¼Ê©1D¨ iÇ1óJâð×e¦ŒÖøáGöÕK~cÒÔ¿Žq"˜Â‘Т=Áå6u›2ÄùθÉáÉ:ÚaŒ­ç-E_ ®—)¦eÉzáÅ–µt±ÍÎû* ýî2w›ƒ‹ -É]:éÚ6U­ÓDNTÔ6+MÛ4–0Õ “òµf2Í ·<Å\¦éŒ©$5«°ÚxO½‰Y­`¢i“:yèð´iº5;±ÓiË¡ÓÊ7ÐΤ÷èÅÐÅÙ&Y·æ÷ÿ*ÞbóŒg 5ôj}ðÊ%Ø…–25ôÙVu.„U­õ"Û4¸œ“î|2ãljÖÈ-o5£ÍnÝødÍÚ'ÝDMžN›\]JåX<¡©ùeÔ"wÉ$G›¡=/ô1Îyé4ƒ†íiíQ‰K¶C&&¨í¡ïûºõ²=]–à X)Ù}ü¥¦ïL=^è ÷á}²Å À fG¤Î@GScýxqjmFgΆ!‚þô£ŽE¬9ï7à›¶NïÁ¡5(ã?F¿Ë•æìvÉt%üä!s0áÜDWõÿ¦y ÁŸöæÂrKê‰í1ôZð6÷áÎ>U§)š]7Ñý§èèüÈÔ9?ÆñNÖ3äÁc}'óšÒXÞ›°Ìå·Tð¼mk©oah]ëV=M8î£MNÉç‘GS­‚sJê‘ÐM9¥Îh è(uF×Û‹Ž¨>E' †V) Ó:Ë“: 4G}º˜•ô‹»èÃù…g¨èŸúÜGùqúÈ;V¥‰¦ÇÛQ‰&îβ6©‡ÞÖ­p²Ý(Ûš6=Ñ6Ýâ'‹öм«Ÿ«ß…Y …Þ$éy¢é‚z7Çö%ƒ¡«÷ͲÊíñš9o#  Û¿E¿×8KíÿxäWõ&úý?¶‘˜ø†mzLïRpÓ8¾Ì…Øôx±ÇîŸ\ýoH¾¯Ã(ó¸Êƒø‡/ÞpH¾Æ…Žø8‹í_x‡ª /? ÏÐIð=øåBcµ–‡KçЩ*ZÚ.ÐéÒ¤i¬oc§”Ê+D…vœ§”ÿcý—„vNfnx¼!ù¸°«_ôgÝå…vŒ’ìø›ewy¼`Wé{qŽÖ2­y[ÞV¹²Ùô€’ +íHô‚êm¼bŽ(!¡N$Rñ[¿$tè’Ài«•ë&©ÒÏ8`jVþ3ñ…{c0º=¤)7¡‚ñ¦\ƒf¡˜§ó&+þ‘M8´Ùy¢)³sÄÉ‚Õé…Æ¥­ã#gÇÈv#ÈGïz¡¾[•¸*þàùÒ “~¼žp|F(Ƹz#ÞfïùD-uÆáUœjx4`ØD¿f­ùÆU¤cÒ‹‰¦â‰ÛŒ?ýAwÄKÚØ'-içÐ} %>ËvPΨ’C§WaŠÒS98Ëó&ÚØ&a~¤`…uŠCjvrh„–ÚÝâÝZnF w¢iök„ïàL›zÜQW» sä&zñï ºOÄa¦AÖ¦ÊušókYåH¿˜ÐŒÐ0Ró±â\HŸô.+€‰7ˆÔ‘ÆPŒ|¸ÿ ¨:c- 'ã£~†Î #zñ)“þðŸ _^T½‰¨Æj¨FäwcU!y¦î5$•ÙpÄ,Å. ÛÁg ¶KDOè>éÙ~1Ó¶T¨ëÓ³‹m]".tŸ„ôàÄŽvÏö.tÒm4m¸úAÓ°Ï5x¸tÕ!Q ‹&Fsn]WkÀd|s½ÆDwü*KÛÔ_ì }P*Åxœ‘'šµwû†í†yC,/ºÖíØ¦.#rgAâ¯ÐAv¢¿;‰¿Ômªe¡žnj™Qd¢n²¡î.¬óƒÐÎȧ‰Ž¼‚%öðÓÅ5'=]–eÛEñ…æW‡õ*ºi‚tHö˜&n†êÐáH¾Vm}³í}³mͺ‡>ÞÐiÜ9kÛùá7éoGþÓYÛÚYèóq†þ 4=<òÝqvÔ9?ÒsäL`û #/eâÜÉ|wuÝñ+þEˉRÓB”_6Z-ùàËlªŸÍÜÌ*qLžÕúå¶q^ öûìŸþKth¸ÐÊ…ÓxŒ}Âv©÷›oÌGLý]&¶$´uȘðn½Ë8}bM2(»-Œ?<¨>­(Êÿ,zü‹F踙:—àŽó'*Þe ÙQ¶Ò̸=—Õ° _)Êy¶™àâýNµÎ¤ESKÉeš&]Ã]¹¶¡ßèü‡è-:EG.‚¾ cèßáæ—ô }®âl²¿MyÖÒ¹®í?ØYÅf,U½h9h¢'¹Ðô>H4kl"´Q£¶¦ÆãwS‚×Ê._4G›BÕ´†$D²'®âXJmãû Ÿ„¬‡O_°¿ìgÚðuÑδID„¾e¯:8óá¢ÿÞò“™$¨$ƒ7íï:®ˆ,-Û¹2°”…¹½{t+^Fù!äÍôà´_=R¸X·Ú'Òcyël£¤ß¶‡Þ|ÖTK#Ã[RºI·ât´px«t†Þ„[µ»ô.Ûâábª;E«–Þá/úðZï­Ò]J» ØhA'ÝúöŒoë—ïô^è&Ý’ÞtÅHæÖrîã씣 1KN4WEHùXú"=ªü¥çË)?DK*‡u´ÑÝúbÙ̆£˜QŽœõ0)=Ë™˜Ç#ržéxN¡àj¬¶ÍÛ&Ú³ÍcŒ¦m ÝPïåk—ÙhºÒUºb£Ùùè{ÐlµLÉÖÒ9O´a»Zs®â|ö¶m7ïƒ/ ßYcoÙ/-ó*Çâ•Ú¹Ç&´ó»Ý‘GÀɘµýÜ<çwÞ ÷ hîzÌ+üÊ*ó„v¦Mhö"Ì‘WÑ´–ªJHX¡–Ðά-ëHþýŸGoÍB|Bc½µïŒüwèÂ]Í­Ç=™„fuù3N•ˆtá#ùXžªžüH6^ES’Ò…öܸMŠõ¸xÑ!) ]¶"þ½ESš1ñ>¶YntJÎÚ˜5=‹+ÌF7ñ|¹jJ–yÁá”2r-åmLúT³FÆjÜ3þ·¢×_Œ~ýz—™¶·ã'—mÙ>ÖuR©*3 ‹„{ÖŸ^Ei£Óî£'ŒÊ 3eiû‡³f,uª§ø‡ë&e…JBÇùB÷‰¨L¥nFéÄ®8d ÞTI2Ñ}ªúÈè1Ú#W7UºÚ¦ãìÖ̔ѥºþ)›öKÿ­þ¹Ôá¬ÛµÍÑMEæLžçƒölctqÑ‹ÿnÛ6?US šî±P¢‘¡›Þ£p7%»¨ÓÕ²%:󿛉ͫ‰Ì¨2ó£Ï;¡“ðúØ;·\Yv\×ve7!ü¶ûß±¢œ³¾ï`Y§~VbbíðC–)êÁON!T[6ž)÷:p,>à…Vî¡xêÂ+£œqÇmœ‘7÷z—ã­b'¤?ÖÈu©A°¡-㙀B¿Zó¾ZóÚn»;øîMøn7Þí»Ñø¡K=)Jxå1®ô_Æ:ä(p×¥=Koy=k¶öGúâJæ3~â®äÀ -J/8.Û3Cù6ô›ùԡ鮣!‰®w(&Vü×q¸ÃLœfùCóªö²2B;MÏ׸E È~²Qx ¼OË\'Cz^ôTxWçYxޤçÁ©:*Odù´œÞ1GÍ2•tºÅ’|ãM¥ÿ`k4«éM„-Ê×{¤k¼ÅÖH#A#Ë%1éÁcƒ¡MïÖtí¼n³jLâ´o¡mY¡bV*ò¶1OV%Ý%omgÁ#ºAÈ[Ƈ™tš™ôþ¼ ÓLBh-Q£éT ZèÈ•§Ÿl9l’”õÆ»ò²–‰‘D“è‚ã0#ëáó$KsÐÝEôBÊE»Ã§‘F2ǽ›Ñq“Ô2eIjyáàY¨DWç¾Æ)½1àæÀQå¸ìù−aið*%‹é|›ª¨2a¿SªÙhù®˜ ;“Ÿ§ú¥ƒîn&ºjƒ¡!·TQ¥‡ÂlÖtÉb0ô©{v˸‡¼p¡Ð‡Jyض%í@£œ©KIý—¹Ä)¥—yîŒºÞø©³=Ó  ·+Á˜|áÆÀÅÉ|ãÇëºØþôª°Ç2ÑMüJJe,ÃøtΤµœµ²² -Üc^ti&†˜M?*2çê²üí%‡™¾F¬“uá!|ËodÚ¹B;[Dçû.Ž´3Áƒ›"Ä4’hâý†íÿ¡ÿo¡YÑÈ·¼ùhúx•š}4qmënFÓbmôæ©©»ÉÝm|пny>ÔØ]±FJÅØÃ;Gƒ@Sðõl+¦?¡§¾S(6=8’34÷r^æ÷g‹ÍŽ´o¨.Ç©V´ðtÁihý…×B•¦~µÛv«ëGí.œ&æH­áË¡àgr]ë4/Yzl]Âé~R-‚NÙ|Àtä–7é2ŒÄ$ég‰­åº5𼫚Á%¬F#ô'olàW¨›ÅÈ1ëpvÃMø{´²­Sf윽n¨Zû¦_]h=BÒï–é.h½¬«yÅ(šKÊQ æm,É/-š= ٶ׿=áIhV‹èƒžpgº±¬š%â9MÐM´1×t²èþº”yVæÓoz!WaÑÎDS͉D7_Ò;«°rᾩ|n5þõ ýÛ7¾­Ï¶]ãü|Ψ8ß±ÎçÜ̈ z¹ð"23Gó{+‰µFÛMøÍ £7áÚ+è‰>—7ðw«gÛå:Ò®¯á†[Õ’Ê#J½$¸®O½[èÍ,)ìÑËqÖ/¥Žÿ³èn¡‡ˆ ô{[÷Ó•µ  ·”ºÈ^m?h–´â(Ü >w'Úµa}&›¾D/-´¶áRÁÚÍ;¾‹óÁ·!þ¹. ë_‰V8‚%ÿ­Ká¢Ûö¶¦mdðÃö¿=¬U2¸L›Ðgà°[VÊe• UY8äV¡Û³­0­^8ägÛŽº†tw°Žÿ¨“Ûð!º·Õr¡ñ®˜ôÆô[ArÜT[h ër²òüfIR¤ÎÇ7l3á%Û¶R=©×t†e[û ÓžÅ[¾ƒ-Ì4Ñ-ic†ÕŠ•ÉÙ—+Å8C[U'|$ÞbZh=8²œ[l'ö a±Ç+¡#hÃb>NŸÎ¶ŠYÕÒI÷­ÊÄ^„Ž£ö<*#Ñ×ñD/mÚª/ÆÎaÁ±÷’ÆßÃÞÓø€iJª9%F£+ùú9Zc ã´ „d]Eߥ³uXÓMµ,˜âûm:­'a7ݸ%ýNz*ø¶7|(Nô„º/´\’.è@K$à,›úÂ|ý<^Ø¡ûT2µoŽ*KI}·"Ù¦‡ŽÛïz¦Ùû4{§Ý·–ëªVð°U)Ó²ÐÐ¥<øTH0FW—àl«he×ñDþÍB%¾ã)ê#ÕÓQä眽×%¼,IøsðR«)|IGnYKM*ŠôRèq]±Ï[õöDÏ”zÛíÉóN·¦+c|Ðì%c«LQ…úûS䮓¦ZŒì¶#Nó¤M¯Î: ãÆÏòNLzòEwg‘¶”8tܺ×óaõ\¤RFÅÝñºûúÌì7Ñ´ˆëÎM<†Ó–µÈú³Ê/ˆX])™Lâv¬¦»è +ÁOÖÝLá2 4-F–è (Ÿ–3Ò¹ÐÚ Œ¦[ÇÕHõà÷g,ÙoÇYò^èÙ³¾ÐqÓA—ˆžlÍYá½9ÛjoÖyÒU¬¾)˜MWrËæz/(è3 >¶q¿u†Sÿ£ë g¯¼JŠ7´ßzCÂÛƒ¤iñ]€¦ó|å•”vü…×É7ˆ™©t™m¯ñ›+¤mUÁª°”ÔV)©Š]¬abhDbEmømvçUavNàÕå&˜K½~‘˜Ci”TqáŒá—ð2!ÅoKo*œí«ÖÎR >hƒ‰dg¶æµ­5RLøÛxêzF&V‘ܸ]¦n8}IZâÊÓhçRÞ}ÓX%× œ2«X—3t…ZiÜm)XÊÒýÝ!%u+ûibOÂF‡à9ýb*B_¡V> QÛ¢ùÓWË%& ½“¯$£°š‚;M7êüeÓ+-ݶCöP7j])ô•.3½¬Q_á°º½,·å;­;KÇèrõ÷U×§ÁÝ]tÇ35³ (e+¨Ï—vp¶# û}gÔLtÑîB 'ßýhç(ãÉ$šªgoå è¡ÚÐÙ=ô½9ÇïäYF?ø´Zþ/GÓ+éQœu@—ï,mô[ç ËôÛqÝT~ØFרlÿ}”Éc •¹Í"^4«%t” F+ô(‹ˆ~ïi åÙ°„…àQ!›"¤ŒPp”Âd ‡…Ã¥Éj„|àT\š'[©–íS•=užÌê µ™xö-þ0Ð,²+ôÞð&|>4{ÆÜéø6ÑÎ7«Š02þʉÐÁY0ö!´ŠÀž×”e·ø#ýáÅh½a˜OŠ8n“hÏ6eО¤‹oxÜ4Þ¨(Ö ¶ø»µ23Ñ>Ì‘¦;>"MÓº B—Jk˜'ü¡å¸¸Ç'ȬM³‰e5Þ­ ö|¸Œ!ø90r>ìaöþ"¥C"lô2Ñ›¦–~Áv|qÆz:¢à–…7 Ávö›œ^êü›4ÞxátíEm§{T—ÓÌ’¸•;e¬´žb‰´åÊ0 þWÚfBG¾u$z&vÐügˆ–½ñfשvô‰ýá,(¯ù‡¦Ï,nV¡0Óâ‰6æz$Ün|ë¢ÄÄ=Ç2çÃ/„¶‡ööØ)tH\°·uÁ÷Æ{«8~v†¸é™6†‰¶Æmx=wÛ¾d~Ÿ`«[MW8„=©¬ÈÆ8•uÜôå}sÛú{Å4º¾—Õt¯çÎtÝÞ¸e o;Ë¿B×w¨4{¯UN‹5îG*>´çºœ³ä¡ƒrO?Z¦ÝÁ–O%¯Ñ§‰©Úò°=±ÿ6þpy$è?ñ13$§ê”r#c6žx>‹t"Úr‰\ÐgÚf™û‰¦u?þlý®xs™† à_ËéLõ¾·² éípŠ“‰G­YsMÅé+Ø”¼£{%8tü$23FÍR‰Ò8%]'šjmž›Ù'›röéúDÀîP¿#Ž>GÓ=JÏSxa¨ç³¤*Ûá!ú1­Õ!8& YúçRŸ±í©$OŽ>›q]h˜v‰6…§‹nvto[[tzňÒÆJÙÅõ]œqÛ%El ›¾å2²ÜÖ®fÜ­pÛ•×ÁyŽŠ? ˜úu$TÞ¨|àÆm<Œ÷%ÚoÛin¬ ?zÒ`r 'øÏQÙÜéïÀÑœ·“¥´Ž#û'Ó‚éÕðlCž^ðC“cE8?œ hÏ6•0ü†m·åˆ"°ŸØÙÎb.P¢cw$£håë!wý¢á¨%¯“€K= %Ú61¿P$Ð=ZŽrOÍ>°°ìEwFy»hc¾ˆäˆ®X‰.e°'…­³ÄhzÉäR²­Z\=DItÆQMë/À³&X ¸=4^ -e$^tÑ•ÝÐ=%YIîDǵ¹O¾ñxŒ6–ð×8]¦2„.qWÄÖÛ"Ú½«ïxÑ©¯Jmÿ­ÌXtQ¸èÉÔrvÔvµúÍ̉Žu‚"ÌáqË£˜OÙl”Æð)í!:ì\ u?W£r¥Î£4@oq‰Qp=á{sôQÈ£c•Ò~” ‡­«°Ðq—2>âl]4óžYÿpw²ÑÎþÒ›ŠÔ@§³ë ‰D$:BOôZ,¿ú°xã…?‡¥ &ü:Ý>ºNÄ‘£Âü½Ëãô;¹b4Ö8+¦TZÑ:æS;ôŠrу¯oËÞU'—t^¥c. â¡zY_l[-·VÉ7ÆWÇ”©D+R—èNH>)0ô“] E'㚢õ®D.^ôÖ“¢šº`5·-aÏÒ¹³úÂ=ãFl×±ÛúÔ&Úh¹Ðøƒ{¶‹nø&½3ÑOzÙp¦žª–St³Z®à*}î;Éq£hã{q tVÀD7›D7¸©~l3oQ¢ñZg –ëG‰ëÖ˜oÍs´¾Ëՙ¶¹´øÚ°½aÕ‰‹–F'nù†·¢´ ³Î¯íoÁå*ƒÑ1/Åé÷ë±¼-GÖ@w =-ôrÖXÙzà¤_l[-wÑûÀ'£’Ê^ †ÉÒxãSÕZ¢E‹Œ1ÓŠjXWV-ÂG4)ÒCã£V›…îAkco„EÂ\“)ÚÚl4~J/—éƒò!¶¸NË“èóÛÖÆV³±Ukoi³BÛã´<Ø2;ÉY‹˜±£Š¸6° J Uű]íÙ†‰Ã[Ú÷Î÷*RÁè ‚‡¯É›N3ÜnÇ+^¢M2°íÜ’i¿Uþ™…Ëe¡‚ ‰Žª¶½±äK¢ ÛQQ·áEv+ê–w=ŠÒïm¢ÏÀ(YÕ¶²ô¶€K}Ÿ=ÿ'–1þCÓkQVXer«»âA_ª HûI¨ô~¢ÂlzPUxÓƒlòl¦ãzC…Æ@ëQI·ZUI7éƒF•ƒ=œ-=iHç9к°@vq¡A‚OqÁè÷/Ñç_ŒVA6|˜c|¬™â£«3UçU±€'a”Ãý÷Âûá‘er×øðà3¨›ì/ѯµ´MÇmZkmñ·ÕÚ³ý?ôÿ'ZªÎµ#–Ë~Mx…"/|=Jd`%ÁãqF­d|c×/Ä•jÃ^«ªÈ +¡m%âé&±š×ø.ëôé*à¥3-û/XŸ^ßMøræì~,ãûNy8k^6·^$ÑÍÈ”‚;#WMtH 0ŽYŸJ3$¼Wþ٪Ćè{kð ÊZ.‘žGË~&Úêúzá‹)L}à”‚+ø†uê¯ñöਫ$¦Jz Ë›:jPqÛ‘ùD=¢c¹çq—2ñû„Š O˜ü$xÄÂฅÚQ¥“@WËôÁZp£çJ½¢o¯&ºIîˆrβ¬26Þ­O>u¤SžÀ‘&=½|œ,ºÁrî‹ø°“q²è+ËÆ­bÓÖH¹£èãG{„Âì‘IÑ-Ë!¡/þø{ßdzZ$ñDB?š*̰eZ¯¼ÛÅÛ*¥Â¹.ø9ðÆ¤´ïІÃVмW¶Ðj¤}ÅÓKª©RUñB-AenPÂëÃt>ÞÕwÆWI >¥íJGnzÆ—OA•NÅoÀõ•.›ó„ß4 ¼Š&Js©…Ž#KxhÈÍ´­c´ÓQÓ1ÊH²‰î˜×2õÜLŸÐ¦4ä6åзÇ%Åz¡]Ú·WâvÆ*Yƒ€_l¥&üb«Zýþ%Zû9çO4ß–tfð\S-tzü/ÝeñlÖ¨M«å_@SßÁ·½¡ÔK•‚uã_Lç=C×¶ú}œ0ßÖÕ„îL&ºX-·Ñ_.¶vEzß¹+ÂàÁ–><­±>6¬ÿ4•שÊÍá›-ÛV°ˆrJ¯ô6Ü[M N®PØò#Ú;+žQ•ÂUGO'”À‘™1ô4Áòóë•;§žG¢Yõ,¡74’ª®r'´óÅ\Û!à×·Ýr\ I™’‡•NÞé÷Þ\÷«f6-6›ÆiÖ_½Ù@,_èCóÙ?¶iLõñ”Ø|i7‰Ý„Žô1æ²µOMt ´xásÍ·çPxøh® }hõЖiPÆGS]–v'ôyàcx³R°²åº|‰>0ßâU2ª1Ñ1ŸÒÀ¤-ŸÖ2[Ö:IQC´3 ý~1¦’’hšË’hª£ôi9sœ„V­X´-§q* õA㉞µ^é°m‘Ø…RðMY‰6¾ø–«L?Ùá.cû$xâíEq–ýÞnñÆCLÛ+8î†íJ“,jDiÒ^à#¾´1ÞC˜ùʉ¦U Ú-×Âb|B‡š uœŠJ*Sÿ¡Hjžéò }&ö›Jõ:Þx¡Mãø‘¯E"r(ÐÉ*“:»%yõ¸ãÃ4މ:Û,þ‘èVŒ>Pl«eöv Ðÿ~xHÝþhä–Âì:/xD–élû¢ÃÓ´,kÜ–ŠYCŸ5†ÍÙ·5l›W»ÿ ‹1Ñ »n&Z‚Ô,föAãér¬1OÛpÌ«\7z(T¹nL̯Ýl}öҮν‡Æ%¥}ZÎBˉîx®U¥Ý<´ßÕ²ýKtãB¿ßÏ–fµü&ÀÒEÖMãçÁ—Œ*¶c&ºâ°Sí¼~IKYî»Ôau|ü“ÖøCÓ9|ëåŸMå¨ZJPÁ¼4>¡VŒ”Ët(Áíí…¿ ^sRYO×”£¢®ã”ËLßü½qä,šîÌ7Ååé£ß- ŠÇMÇ)} A‡Ç+'ÌÔ2¥S}jÐiË…fõŒ²å¿•NE˜©’ÒL­¸]q&lè 5Ù›äÌ'IôÁ´U­–+A¯Ô+µ‰xË3Õž¡Sb>̯ŒcÀ%º2„ú^K g47!6Ž”®‘ múäy¸B¿‡}z[ËkúezÑaÏ)Ôÿ¹ÇSÆ„o^Hè˜qÐYÛ¹/ÝLip}‰oES+–Xj…n1*ªH ëXýNÅ^ê6®ãv¼ât·u«ñÀ­y+qœ%P'š?öFÉÛû»»ðTÿDóOæÛæÏg[‰ÔÿÙ©sl ©ú7ZnØnq!¦9†»9Y‚)aBÙ}[©þ4·!P¨Þ­ÐA¸¦¶õ„Ç\½ôÝË´m$(nƒô6|T‡öûˆû»à)z¤JGŒJtJa)<)AFûÝ­–{èa¡uE œ‚³¹,”²äñ]ÚF mD„Ž/†vÅ.… w¦D-ïVˇÕò¡·4SmÛó‡èe}1 y1FcÚöZî¡©.sW®»aÛCk•då´Ÿ -nýàG İé‘w½ óÐ?9ßðƒ—â|²RŒ |/xÓ•µ} %1цíf¡å5±7£Ü Ƕ²1Ø ¼«ø³a{¹è _}ºr~Ëcc2B;ýÎÌt;BcûHÎ ¢«åkVk…Vk•d î·µJª5[ªA(ìŸJ®ð‹5íç,A®+#fz}иåúÞì,âi†á íŠjR½+L[žeë¨óЫÕï긽r™~‰Q¾h&Ûžh£åÍóΫݨ~Íþ ©·×óE˜Žš¤Óµ$ÆÓ™š§í·8¯L«ß„¦>ÖEmÿz[èãìŠYI‹Úbé0‰´ÝCA£+>¿Í~Í2¾a»ã5fÚ®¼˜Ðï埕“êÊ‚¨0MªÇêzmÓ›…ž ËbHã´Ð°ÐÎ"S.zÚ¶ñ¯mùÔƒî}¦P—ë–ºƒs-Óh|n&qï `Ô¶.ÁŒPõAÓƒl*£¥ô[»ŒÎó}6LRê¢øˆÎ `Lc¦_’.«â‘èÓe”7sÚ®Ê{…sÍ´­c%/$zâàž¦•4º*€£¦04£$zAÙ.zp…d.~o‡4ú/ ­f¡+èæAì¬ÆHÕ]ôÚÝÜ•J¬t©à›òL³é4ë4mìz„í9͉¦Éº=i¦?ç&=— ÷=—1&û¥ç2u¡ƒG}g$}bÛR¦ûê–”50[Áz†oèBIj0õ]ݰ·™¤fÏ6£c'ºÀTßÞÚ©x‰ïiP´CðÐ3¢¯Z'ŒÈ–ð2ñ‹O2“ñdU »ø`ô½hgÒ(õ~ö°š>Š–¤í¸¸MxkL=fÝ!_h¥ Óq˃[—ú=KmŒzæøÐ£Ô²}Rc†%! äG8èI¬¦÷„£GB5:нÐÇð#Ò'=N¨¦/¨É,øéøå& öUþðó¸Óõ€Ó †¡Ús¯+À®X#³Ò©#"ùÏP2@“Fhe:Ó®ÊÌC4å_Fà b¯â#øY\lE2ܘî3$>pÏk ²¬—a1´FhGÄŒaêe#¥À¶~Ô‰"ˆñùZ—×tñ(™Ï>"TYªþBðöpé×!É[*:BÃÓjúÔÙ0‘–ðZ`¨wHuÀ»Òø°ÒÞ¼׋o©9÷çžArj¼§:5\«¡©¹ ó¡É&tŒšlS¢Iôý\èCÓªÄ*Úš\GvIT€Ý`ºh¢+|g˜ûËT<Œ6lë;ÑÜvÈšÐHÐáA0ÿ…iWI?^ãöÂ|_™Y§þ¬*éTÅy·å’å;WvÞâáŒk2õ„Ì›^S^θ* ó_mØžªo?ø-LŒ. SÀ”e2%0Rù÷–H7K¥ŸWÜ„úU*]ôL¨Ç±ÝÄDc÷y¡cg…3µ‰Θh3ëëx%VbÖ]Ú7ÎX3üž DÑ/®05mb Lìöµep’¦m(qŒm"WΖf™WL‡…!$Uµöžzsö¶va™ŸóŠ«Ð™Þ³ªîø´š¾¸vò¼:!¿A§Ú{T˜Ò y-W:/èy5ƒŽ]*•›ñΟ v|*Cš1j槸\áïDÉXFwX$D%:"BJmgEd¸Læà¥£„V@Ÿv|(ÌÈÞÄ…q¾øü'ùÅ ­ºÄì9àƒ¦‘Ÿ¹­–og®®Ç±½ç‹¥z B¬âŒù*V¿­½É´- –Í/ô9Øg[Ýñ6—ªµÓ5¶¬õm¢—…Þ¼bº>ÎË ç]ÕÌ2f™Ý3Óe ¾ÔmÂ4l³•WE²D³éÏâê8…WÑÏY†Í…Ö›‚³ô2ïê JvL½ï( ??o…¸ç|…«ZM [JgsàÍk|÷Ù6#x¨Ë;ÆLö<_‚ 4‹,½»ÑWœš½}%ºÂÊÒ«a[$;Ó„ŽæH,ÕŸ(z1‚Z†I*kñªG½T+\á+céÍDW˜p ô¡ïò¶íaZ–xƒ3½èmœ–T¦Ôi¹Y¶ÑÇA×Â_õ?hv3\™§K+½/=UN¾Y÷©£—…Þ\¬DzþáøÑ5šï…¸éâ]S¢zsÕmù¡lõ¥"´hg¢yË[5Ñá}ÀEÖ$fΆ¯H-8/ð–š„ô‹é4a Û¶˜¦p¢+¤è‹ë§mù±l.I¸î ë{K¶œzøi›¥Ü-½Ï|³é:EcÝÂLÎpÝ4rzþ'šÑËV\¡OÇß»gÎÝ{fá0…Û•oˆuž÷#†Î¼/ÆQ¿p£íÛ…T×{ÓÿFÓÎþàxº¢«L-” ¼ó½-·§´á˜´<ø:™ú\´éãq>ÙPAzúä5TH€zÉCŠ,™XhcK*{Ì^‡ýÀ2òx‚6=—DÓãÀD+lBcMÙ´Zn¤ }xhuˆ&Ƹ[BrG¦ö&ZôAÓ/6%Öĸ¶(´ýTsÁcØ(zYOmtx’Í|€[ÓÔIFúÒ6]dÁ íЦñùýûòoéõ Оm·åô¶é+x¢ñLî¨ß[¢ä”W胪N’¡ßr–µBósK²—h=ijåXeøŽ”Pqí!Áñ2Iô„ŽêQýàçê²JU_°²tÔ4ÑÙm0Ñ>àÛèÍ“sk²¼ßo 7¤\œ[9ÚiÚ.Óï›þ·Å›` ©‹}¤Ë7ô’oèpW,_¡mÛãhŠÆ³Å³­7t&#‘hc®IBžq&>-Çý^>š1>hü½¯|n¶ þbËrØÊv—IÆWž0cƒ'ÚødbÁS×£ç“U1.Ù­è ¿w}œïý¢åŠ SÓ7²šåÚŠìô;Ó£á<¯º‘1æÁQ‚¨&Úè·¤Dé3m«”½erÝ™ª;ø·£'¾§m&z›è_%r¢øñ_­s,”ã'¾€·‡Gs…i?8j&:S6-4ã[ɯ-‘œºØ­Y-ïVËmô„U’N¤‚ó-]!ïPè8é3bÿv˧‹n0½WhœÑ}bGsæÚ+žDíX¶]4.å~”WD¥tŽdø‹¼¢z ¡:O¨…˜ÆK…ï5'^ý%†?Zï?‡ìw]ëŒ/*xþ£Vn:ï<)Ùß!_ô|R]è°²\5Fw†Ž× éU£:ôX¿àgàÛp¤Ê˜µá¢ßSøwè‹&ú@NW¢­J®~aG 矃ïf‘åCKº)Æó¹:¤YJŸ»Âvƒ¢£'¥ò¤VØ=5žò(,QWðs°Ï;r[gT¼ìùæ“}HÍ‡ÞæïÀQ?FRý 2}/¼àó4S¤ð:W šN§Ì4T”¾¯|¾güˆî.:DR˜÷‰@D©û1ïLý%¼h¤/o43”»8—"Ô*MP½Æ/Ïúr­¿g#½³Ì,ÕÅQÓxòÈÿ=÷¾šoœÆçvb€/úýh,WhkÜŽBˆ°é«X3Fð?¾Gª1p*kb´]-l¼©@} ¸ñÑ?|cg,Jº8ÖWWÀ}@—`eIz[]ÞÁåh^'Oo‡]ÛaPïðžÜøèÛ[êÛsgîXŸA”`Õ'ÂQˆR[£²Šê$µãGƒ¨NâX/ΤQi”‚9E¦ñêõÜ„ëîAãÇG‘s&Žq²@HÁ«åäb£odGÒät‡=!ük/µàKÖF¡ñÈ£º Lñ(ÑÎ :›—•>Ÿª.èh å<é¢ùèw¾µÆÔ‚‰´éyaCé\ }!ôý1ÞØ©˜p:[ÿšŽÝÞò¾‘.zƒ8ÁÑ¡°A?yÖ "T,P‰Á")¹‹nL%ÑNËuœ¢¸û7Ъ\ºZ¶%‹îç¶Qè9·óxGFlò„oÈéºÆŸƒw§~&“=<Ï-®‚Ñ ›½-™èÎ^}ôÂÙE‰>P<Ñá6¢šxøÃž‚oÏK^´\/$²™èR i\øó°`NÀ7p ?"î@²>Úá2ͼ gÌ‹>ðE1k£½ÿâ~ËöÄõû2¢\|YMÏ|6¸Rj3:v½ê±áïínÒùæYoÏ¿nLšVœc)r ÛÖ.a£iÙÎß·ÜA·Ÿ¢C껓0JÂýí§GyËÇ Ä¬JøÙغÆi(£ÉåFª8Î3 %§}à Þ +|õµÆÓPŠQÊ(ÐÛûê[,:a%´‚"ž>Ys:ŸýqVK ãy$ZìO¸Zº‚)èA*ÑQŸ‰ã_¸1Û#¤wV&7áTéo°FÀÅV¦A‰>âÆrŽ‚ëÎBíïõºñ-.àÁ– ðÜeÐ{VŠ¥ëÑŸÎØ„Óû–à°bí¾ñ‡‹Ò%ÆÈ«òI‰ƒcNZ·ñ%ßíáÈß´ úÝ?YôÃUiíÓ—’::ŽÜXï£y}7áÝ9š‡^ô3ТèÓ­fHbéÐ~ç.‹8”×0},Ç2>¥6@=Á ©—ÆDw®q(Vèâ„@'Jø:üH”•û¥¦Ó *>6Ì*®Üݾƣ&4Ý!¾a£›žéþñv¸¯N=&¢œ±D§j?¶íŽõA¦nˆ”hÝé KŽ¥Ê]4wm ºÞŒCöŸA§±¨©[" ÎaílÃ6 +4|Ãv²Ø°íƒps:Þj¢i$(ÐÆ\»)tw™ÖÆ8­î¡—‰Þ¿0ض‡V¨˜^êf’céTÝnË ¾WÍm-2»å¿Do¦z“aÒwcÃnò±Z~Ä«¥DÉ4ŽÏ¡Q&£ÝñõX_ùªA?Ú*¡$Ò8:”’áI‰ŒßN|t‹?:•µ(©eYîæRm‹ Ïð÷,éÚñéMÖéGîü›-kØ<´tÿðM²!<üÀ9‘{åK }FZ:ShÈi©®}HÙ"JÒ¶-úÕ~œ~ÿíÌ—o4Þ­öã¬Ru|â#%ge‘ÿô‹—Ûáðw¡P§skw¼`f„r¤o^½ÆW=Ó·V×zóz“m{³fló®Yû„×ôîÄäw÷¾Y·:®è2ucvw‡ J~†ÍX)WË–·Ý´þ~4<×Ýa·æ›Â´H¹/ÐIÒÄã6Ûi/°XfÀ­ Ö®õLnBZîl®GßœûqÆíX v†íÈ…CZ¸ö¼¨SMâ¢iÓ«5êž ð÷v‹e¿Òö6…Ë<ëŒSÖT¢‘Vʆ½yÓµYÜñÎã£Í< ©gä¬èŸo<à” ~†µË(´åõ|9¾D½(Êê8Éä¦ÂRŠ|䎮Èô~áìžXTø»ÂÏ&4Ÿ°^a¸»Ü¢ål¾§qüÕ%%¥ ÑŒo3BûMÇ­{Ƨ±QªtØMãÛ™pÅq`W*»ë•[Éšm°_@+ل»¦+Ú^%‘h:l—øMt)ô}%óQ¯ÚY†O¹ÅKYãÍ’ÊJ(IE^?/5ÅúX4Ipck®Ãê¹g{Z¶ÅC¢šß°ýÎUÆ+A×·>¸ä?˜Ù;.q£n -Û!çé 6¾Mtð$ÃTåâe–r ´é!IÐ+3˜pϸÓq¥dªqE9ýFË]´jvMoL‡ô””#˜«çpªðsá°Ö…·Ž¯hQ™rð)“ÜT¤ð§ù{å£ÅÀ4óŠôʃ½É)ðÏÞUøžîí=sœéþêv½z]oɨ‚¾kÈ8OgUYüÀi¢N‰Áá>)xÇ îcÝÃòs¿É¾pŸ xy WWðsø¬9Š °×п®ã¿¥Ñõé´=JRAôÈ( ‹\1:p߀O«·L0SWbç¬bhô$ê‡àÁʯU!1zn-´©8)“zÐxGNýâ+K7Ó¶b‘3Žvo“ÏVÝæíRAJç›m¼id*%™éšÔ[Pƒ½ZV±‰jã-£ ôT8Nˆ7šÞ©(3`@5Áš*µ)¯|ž¯ñ &ì-YeŽÖF¿Z¿¨¬r3Áƒã÷Ú*µW㫇^«1r‚w¨ SS½óà Ò¹,"¸Ü.œÞOã%"ÍïxAËxŽ>Á…ðh©xw?I€pŸLÑc äÒ}Wv#º!5þîÑŒŒ#´qºœéMX¾ x“˜"½m5ñ#è°K‰0ÞÐ|másoJ®úý䬊ïÇ6sfÒ6MŠLÛ ¦|ж\NKtjW’m®Bs5/wSøÉBûrÀcAh¹€èZÖêdiN5ë^(OAð÷@eyÍ÷˜þÜ|Çv{¬akÅiº¨gÜgnJ4Ÿp²·šŠÐkyQ¡èn}4o®·e_ÎþÖ–³ÎRô”%Š$šÆ-9Á,ÔRv”ŸÆW{“…ÿZ¸úá¿ÁS¥Ë`Ä–v dŒn(t\é ô‚Ú“Ÿ–ãQ?ƒ‘ï[j~.)·›®«ô¬VN ÎQj¬Ðï|¡»zïÖ°uk®ö8Î Ü_Þ õ;Ûè¥<Ñx®zèé(}Z³eZß{ºýîP¨SmvZ¾­1ßÑr–åѤoê¡]õLd¹\Ÿ¦ãîv\ohЪ–ÃªË }xxz(äG¾!ïƒú#†4d7šÕqÕ}fÉʼnnP&_è žÁãdè(£¡Ê@ì*„ô h(TÉXkBŸƒß¾$Ñx £¥E¼ëð°| +¾Þ ‘ýhÄmËvJ…ÓQ;bí3þy [ Õ¤jtª M½¶¡ÐKki …Øò™åãÊ›$š»/©JI¯:"¼aÌ⬳©"ºôH˜ÕZ).\w+ú4•òHoG³{Mש@ß,gë{M(ø™y¿sà°Ó̸FÓ;Ô›ø³M;¾¼ešlº?e5è5Ε¡S=˵0úy»™ô‚¤ÿŠ]·™•˜V™à›Š7é Ü/9@4Z—é ô‚¶ ¾e„r*-&1™]ñ¥ôEÇîÄ’š8ÿï/KOÔÔÕ_:‰)‘$•OéO4%%dÂ}¤%Hy‘[”:Ýdü¹X ôXËáGôCFñ`wË `j¯-p›ï¬‘¦q ¹Å+eðÜà Ÿ¼fÐ=â½×‰úÉ¥ÂÑ›f·´d¬W|#?ª„Š¿™TéuþHò“^çæGGìɰ½`}a“ÈÁG£öA³–Ç6»%t‰ Òœ˜Dw¨0¢bŒN¿›‰vZnÛ6Æ\Œ#Æ7ïÁ Ò¶æý.ODÅÙThœ%Ú#’ïØ ƒ±OlÛÍBw«åªªÍn7Ú=ô;SÙs_—l¤a[ï7Œ»ÛÅöîü‹I³€¥êõàŠÇsÜ[ªÎvAèÁÖ6Ƽvõ9lBoZ›8màrþ¢åJŠ`¡2¡M©HÛ¾B­ŠfFÇ' ~|:n Û¦1åmヿ“E…%«áØžÿäñ/l/Ý íEè˜k´ßºZ°„†O¿ÙÓ°=jÛškÊédýfC0­'BïÌ.ÁBG¸ˆ‘G^|²Ó¤ôŠL¢;ÔéìJöÒ? Äܘ0­ðäš…ªÝñ9šé/,´)tü ik\^ýƒfñž®Üï:Ô ø;ÙèU6t› ð©“Ö 5nTV¥©¢MO<¸1¾px«´åÛš«²ÍH»B›ý¦RKÒaKÁm†Vá Vp£K<™ªÐ©†hdBÀQëŠ&³Ì¼?q”Á½gqCöß/C|ÂAy à ÂÖjîAÞôЯŸÍtÝ̓£ç!mº^]Ø[W¢iHWIwÃöÒã&ž/[·:lIõa:¼i¼ÁÊ]|ã‚ýÍ¡8=†J}Ð~ÏŒÓÁíe>NËS+›žeQѼÀ¼åUñ‡ezH±<ŠlÓžç£õH²Fw¡ÆµI2‚íø0‹ðj;œž#´3ꇋ†fÙú¦7]ÓÁf$/Éhz²ƒé¸åG÷˜& %ö?>$™Ê›pc¥µÜÛYø|_"¤e¨ña}såV³PâHz1ê6Ü™p’ÙgY:ßhú¡*m‰®ü“ßZ=¼çÁ?¤;Ô²¾ÙöF]×-&`©'ð¸i2ÊÈ»É0^8`\]`zžvmŽ4ŠØ§Õïiù½Žd鸅å™Vüˆ§ãÒ†¡.óH©4ºEŒ¼âÒm(jͲÆ­JÏ43+Ï’‘m [u[Þá{ær§a»ÿm|±álŒöl{hcÔä4Ò8Θ–íÍÕŸ´/¾'KrÇc*ƒK<ŠiNŒ”#4ŒwžUx©³>'O¸·¨úx³$dL½žµyý‹!F±ÑïÃ}p¬)mÓyKè«Ã–§º+ «îÇYߦíâ¢9yÇ·m¡#% žD[ÁÊ?ùq¿7Õ–ÿŽm–>¤lØ–—Kïþ;ÅôŒ–[¶CU†®±_¢›¢ƒt%ï›’ó¶øÇL]-›^1‡7$³ëÄžKHfSšÆÁwF&ñ–>”hÀ²àþZ§F×:Ó8’Ì6Æ]Ï›Øÿ˜ÿ”qøö¶R·šZ_VÏ2LÛ'Èy ´mú€±·ô‰D.Ãø‘jeÛ¿èØd(=-òÀꃷ¸~&¦*…ñ(0lç_MÆ©¼L‹a]ý”xR‹€N¸,ŽL‰+Nφ¨§•GÁú(ñ ‰¦aʳ´P™¤àNÓµÁQžÔ‘Î eAœ”2ZÎÊÖœP6T¥KS £©ÓÈLѽnÁiÏgð¼Ï‚~ÈÌDSÏx…žD¢éŒ™‘¥X´JMe^tSŽòšgfȃ®ŠN,ì–èRã„Ö‰D¿™Ø+ìe{†¨_HYPÿÂõ…¿mgiSyÉO‡¿àq¨Ð¦o…u›þ@iÁ §D/~¸ZˆÐ‘XÁ\Ï4Þà…áƒfõ§*aP§yÞJŒ<3#m ×ÚzÓꉞð1æ-§"S5< tý„!m:j¢Cà~+pH·õÒ¬Q}–]lÓöâ«Äë·žæÙÝPèðxél‘% íÐÔ‡°ÑΘg/ú½åP§±(Ÿ•†ž’z¨O èM»f t¨ñ/­ÖxO¡èúÏ¡±ù©¢-T_cªŽFe_ç_ö4\£uñ´¡1Mlª°B‡Ò©â#G3ÓŸaK]dü™Ê¦Õ•§dö7äÎßt:~³€Ù»å¼™LTuO‚­EÑÉ¡Wð‡1hÒöÁ÷‹þpí™™‰>¦LåN¨g"\”»[coº>´çÍùâ]¥YŒõ6½àã¬wžŽ!´³È3¥“åà$z`—³gg}Û|hÊTVå†ÒÈófèÑ é¨N¿G*¸Ðu¨„Y‡Ã6¦ñÎ|áï0cšmç˰½ñ¡ Žm¹ðMå'zBa[¡8g y&“€é9ži¼ô$6m+±ï›å¦*CÄ}NÕ%=2:]VÞ,é2[’ò ëdI1ç¶ tuÑT,ü‚m âÒév£Gp ^ñ ké†>u.•§÷Ò¥§º¹­dP³ôkíçAb§áÒ®N)0K»:ê/jÆ\ýÆsÝëwž pW_Ë´‹DÏ›ì‡GmóZêó¦)½p¤r‰BŸa–Þ(bIÑÏsqéM>Ò)TèPìƒ-¿[hÔ+rèÓøÎ\Úô1yʯÛËëøv|€-¦-o…9©×Å^øŽ~jÞÌàqšÔ¡à Q)X&ò ªúûÉè³~¢éKFÝ~Ÿ>"CÐÉv¤c†§Ë´lÏ, gºm|üÔyR‹RÌŽ” hàèÈý ÄOÑÚ鮜hÇöÂ.À¡ÓÝ% °ô"äwÑ磣çiJ¸>I`¥¯n™A}e6,üÔ)8¸¥"XuÀhÝŠ ÞÕw6ð*éSZ‡kMðMß2–ˆò½ÂGæ„Wªg&øëô2š\¢½ž;Ã.–‹M ]Ú„ž ï4)Eøe ˜â™pgÎü¾ Ým‰,Ïçœvfl”œëÒnZ¯Ôë<žcàNá¶½ÙpgÊ5k»ï†Êøܘñãm{ƒ$Ëfqa¡¦[‡S”¬s¾ù  Ã^ë4þZçÇKQ_¼M™Æãhœ¼ë¼>N×mô¡m?nyqÑ ÞU¿a»Â'‚ïØþúÿºCæØÍ JºsZ^£4ÊYNX`OèóÀdÉo  ä|Ç6£Ã|ÃvƒO¾ A9®SíVÓ•çÉòlÛÃEX­÷¶ˆŽû Þ]F„èÕîV|eìΙ±›²Y„ŽGö,#z€àt-ß:Í÷­ï¬ÚJG^ÌÜv½10£/ íq3àÇ…'c¡ÛÃßGVˆŒao…ë0®ˆ2ǰ±¼|§ãíŸ|ghé±±/ £ \ãmè!‘¨‘çZ°¿ÝN&lÂo©ªµâðQOMex G¶è€/îK¥( WöÔm M_2ÎHšiüÁò¾­Q×Ó3#í ý.4ú~h>YÇëô&z@e¹¥*˜´ÂŽÐ{B&ôºy®ô>hš“ýA3òÙRL>[F“´}mB–Üoùˆ÷Þ° â[ß ?YîûðÚþ¸ÑøùSøòú¾¬í5r™ÒRRc¹í8ŽésloÜþåpç£oo¯í|>.|SžíŸqF7]"/¥ÁŠ`߀‹uJù’¹¾Ðóz`îF¶–¿Yª8ÜöÜ^iQ±„¿NS5üÐÚ=×x|Ù ¯ø#ÛNç³™è6¤èî[:’4èíZOUGx,Ï韱TñŒÉúÚt¥.«ã.Ú6) âc-Ó¬˜.ôºõ¹iÜ6Œ÷‚½‘™î3 êLëi„`^OŠ~µc?ÖÖ.Û,Í;Ѭõ~{è“fê§.ãƒÌFºÆ)_RB ;Q+£aÍÅßÓøÄDZo\`ЃœÏ™U¹4d¢i±‚uk«³¤çDsÇwUï£eÎ4¿®Ť‘ÕŒÄåkÝXé"EÑÀõRº8KÐûk:=ÎC„Jk i;M§a»é‡*ýØö°lowœÎkC ©ôÛºµåé]eMkÐm4• Ot‡É +ÈÖ_VÇ]t ô^îö|[mÏŒFº-o·éÚYé™âöüwètÙñæx¬ý) U4î¹åô1-Ž„—UŠÛ­a¼ò8ÿŽxsÇT]œÐãVå"§é…rVaXÇøuà »«³ÖÂx˜×UÏã›Ó¶KÈ~ÁNÆû œ^7vÒâi×£d;àÜèº •îtÝ3n¬Õ(Ù~0Ëy'eo‘Ãlû9°‚ãR½øåŽÖ­šŽm/ICPB›àÆZ[¢¦ÓOn9Ï{s%¸7¼Ø^¡ûº³ˆœâ4ýtÏx¾æÑ¬£8æL.H¿>ê\4rKßí¯Ö¥«ŒõƒŸv$yD Ž %Vñ­rÌT#<цíb¡Ó‡cç„—]À÷ÓÐÑEœîzÄRa‘K¡c‡Âm*[‹½%~ Î^ôvÖ’nð–{áFãwÞÖè„ݶõ¨N‡.%éXÝ1ÁwÇèK*´îû7àA¶†«ÕF—FS3%˜ónЬ¾ŸÐ:×8Üé¹R*è.§¦ŸÜ·juÜEG=¸ÊÚriO³æ¾%¡ÛfÁìÔå2©QI;ÑjêÚÃÖ½UÖMãÎÕ#*{ãØR3s:>¬Ž{h=è±HлFRE[Ã&‘ËIôúYÓ§'zsïiyÛ“mÜ·IÀtà2õïŽV`²‚‡Ò]¨YrÐÏ– Ôt±œ˜¯,ð¹%w`ÜSèЀ-Û&Ÿ¤íâF¿™JÁ§åŒtù±ÍžM«~Fïv\I¥ÛC‡M^'KÓÚW‘lÐaSAHêETé#Ð }Uõ-þª)‰A[ž¾5UÃf€[:M3ü7ŠV„®ðÌ>¦çQ5•Ž”ª„FÆÚ±«íÅ?š¦Ðwœb{§…šîŒMQ ¦<œèÏ“¦·(F:LôÄ›“i»F¿é‰Ðª3[Z¾ÁÑHg˽vÜ4®Ò@úM$<Û¦!…–Æv!Ú²:žYiÜvø°ß=Œá ÷’)¿œ~³®Í™vöÂ8#(î œö–ˆøAÓ¦K•ž =‹¦Á}9Eµ˜ ›m[;êröîÚ>8Žð ÛŒ•¡l‰MkFÅâhËUï•ÆBÆlòíA5WÃvÁÄ‹vö,yrÇÏ®ØKïRõdü#é.ëz¥¥q›@/¨.¹Ãáz¯³ŒGh*j¾%ß6p n(m»è`’Ð1Ï„Q8׆XÐ4F8RXœ¶<ÑFËù®˜ý¦O¬!zW©è–v› /TçðZ¯8t3ò¥_Mgx¡;Ĉ»õÙÆà%„6Îð1•˜Mg«Nê³…„·ý¢£À/œ«)ßÅ„Lw¬Ïx©„ß{V^Jæ èC³Ñ·¤zH\3tw<€¶á 5ÑÃsíµü ˜a·|r‘’D˜EµC6 Â]q=¼jç–ÆeÊïHÝTW³Œë¤.þR‰ êò-ÕÈxà_º2¥âDý>iæ¢ ÛT’Phc¶dj-F«¢=ÀwqFm[KÔF{-Qƒs-R[”Ý…;úÍÊ¥Ã&ÛÔÏÝÕt%3Ó¸‰i[÷IÊ“ÞÍ´½'ÎÿÙºQ®ÍÖ½†Òf·òÍðl™zhcY‚‚¿ÃF¯¢{Y÷ÐYc¢Ï­L±I5)ßÙlt¼/Ò~ÿ²åÕESu‹žžc;•ÑXf㌡éÐWüàH×Q¤ /³nMõa›®øu22XàsdžÅ&©m½»Prù‹Æ¦Ýã†Ó·üpq†ùYQâ ­’DwHÉOô´ ¡å(Ûh½£3µ$©xDÜ]£½à^Ù§Xtñdú.•78áóDJ 5žF8U‹™òô ^S{f“|ȦU$έ¹L·ä¨š\¨"Ù¹älúÉ‚œ=à+Û¿yã=jèöàê0ô5›=/ î4ýèYöqÚNƒáG5I;¬I*´t ã²FŽ ¢:=Wõ;ÆY=*+jŒ›ž”YگЇ:}GTßw¾1¸#ºíÀ³õÒmé'S&%‹w%ºa¤mmëð(mÛjù±>Y½Š¥Å¤ox3;—éKâ`@.xO4R­ðXéEðÏ·®¹Î˜Òÿ5Æm(‘½±Ú&ž/CŠì6}²F#}†øƒ36à‰©²©–­6ôPÂ…Ëtê±ÞíMãñç–àÂ-ïÁ4¦>ÄÔQÊdpJñ–/ÍU&CqRÿÙõ'u—+öž¤ÜñínËo¤Óí Æ Lý†q ^¥Fï;ã pºo•£>oꂲ$õl9ÍžUò‡aûHˆ‹ÑN¼Âlªí~ô”ñÀ w¡7­ t"ÌAÐo–ßR›ƒÇiæz“0ãE;MŸzJ oã½¾ÓNo¾Nékâ¢ÆB{f=ùA*RpKA ‚§ê \¨«:Ÿ\UÓ+>O×°†}‰c_á:]éü‘ì£ñŠÃ…·’5µñWKW~´ííP»8gb<•òQßÕkzµŒ7ño¨ëºuÙ–z¢—Ò¿¦ã֜ɾ»ãÀo¶ë“g¶uŽ7[¿§'ªà‡îN³ÆÝE·×÷rlOÇõTíHã“ï,¼Žü˜{:·^”‡Dw ¡C/Ø@³ É‹ŽqcÇqÑû^´âð†Ô’4FˆÛ‚O*üwÑÁ­¤ÓM »˜&ú mïz"é¾/ õÄ‚vE©Š»}]º¿ìY!ÑÕŠºZ¶%9Àx‰öZn SÿÎÔ¨Íqð½°kg£«$вŸ‹rK¹›ß¥½Gw¦®0u>º¼.öä)4, +´H~D-ñ¢K¸\÷:’ì×R¹&¸,t‰¦Š,¶ãu\$Az’õÌK…ßl<ΰeegLÛŒÞXT„)T}Ðûl™CÇ\Ï(ô 5K¦W$Aó4½!ä°|¡u”Ñ5š¥AØË¾ÖQF£F#%ìé"SR )ÐùAoìà‘a·­lj\ÆË:^P —=t7¡§ð˜Öþ $C¼À•dHC³C¡|z« Û#¸¼=‘|~K‘ß _tPžHÕÁÅ·"Ì4M‡ù éd›*õ@9>h~œŠ7Ñé2¥LÝì©€ãŸm¼RÎ*9zÎ丱ì+Á÷Æ'a/ß CÉäàpÕ”¶'ËÎL4«D÷AwÏž:Xze 6èæÎËÔ¾J7§©Ä/q¼ wÔvæeÛ™ ìE#6½Èíf®@¢-ÛudAz«±[Ú7Œ n »7pï±ÆD£jäÜ>ªÔ̦™¦ÇÆ ’× Ð8ã&^u&JKM}Úñ„oä^8åe&¼Ð»ýµ¾âÚ‚Þølʧgbéê9žq]Þ‹{&Ü™4ÃK.”i0 ÑjüѧU 9®¸ôT¼‚¡´é†ÜWÍì³…×Z}ÿ»6È©<ØÀp­Õf¡%fH·¸&þ6#½}}˜×R%é¡>–š¤?Sèü„žDkÖ˜«ßx¶h¦²`NÚ>ðÕ¸ÞL$Ææ­7‰‰§m¼«·ÜK¯Òì<0†U¯â'c1l³'¡1dêízmrñ ¡±¼l¢ù)Ú–>kËôÅ“¿„>¬àülÓ€i³\—_£))DhX¥Eèc¢q>NÚn|ÔŽ‚,Ã¢Þ’ŠŒ`P¯0ËzÚØÑ»ˆÔkêM!;¡öáçqÚ~¸ÏÖu›¦gxï^Ç;—HýuÓ-~Ñ!””P¯vš>­¦OkÔ•f‰·'%¾ýB.o¹;è´ƒÝôå5}Ѳ„BoÏøV^ ])"Лøxt˜Òýi¨ˆ=LGá)AUºÛF¼lHŒFhGءæXõ"F–k£/1¾é°oñè'ßÿVø]h•b"¡ã~ÅRØ?Æ{*¿{Ä4z~ðTÔ>x‡™¢²=õjÄÓWî™OžpO•¹¡/HS\=º³ÎÄ5l7Xµ$Ñ_î2“ ïTwœ)ñfúè†c^YÍÛ– +‚%•…’n/…Ç9LÑJI¦¼«iùÚSÁ>wš’6¥éꀔ3•¿˜‹6\mÓö¶ÆüÇèSD…ŽQzÛ¶iÁVÑâ0¡¶O¬oìצj‹MÆd ´LkÐIxy yõZ§ì°–)f /ó’k…¥\¸ÑøÍóå…Ž¶³·€–IfŠS´OŽKnŸk,8ܲÀZú5"ðlÔv3äØ]%Ñ Þ“ft&|¦ç±¨z‹×ºR¨âu Ü™ØôÂÛ{mŠ*'¦qªåß>EÒ¨?P§mœ¦²¶¸šb¹K¡¹€N¯š÷gœÅy[$÷Å”ét©mk—H5öØj7½„Þ ۷ȸrfL³ö榌¦yÔ”AÜ`ÚV»9¡t²ª@œ1lSùKp¶e®ô¬FDч‡þÚ-VÆhòí+£-O4{ÓhÕwl+ÜʰÊT‹4^x¢ôtù™ÚQË´ŠÙ;í“•ÁEš2#êƒo }KmœÆºQ¹);ÁèºÊ!QOË"3ÇFFd˜\SS¥šS¢{}¸¬:B쥯Vjgt‰†ÿÁÙ[ÚÏáï׉ϖ¨‚ÑøûÝ CJ…=‘´¤!ó)?§s¬Îåá¾ç]øÁ—½€wªˆ¢ŠNVßßõZLþoñPPê†z ϲ.œßñ³ ݪ=!»Å¶Ý{†K}ew¸Ã'‹‹ÞÖ.ïŽ~pU­Ãý?µ}(7æýî8´´5ãÙ¢€õŸ×ŠÛ9“*mbRó\/4tW_JÅ»ƒýéq¸¡~{²¸XV¢iíw¡/–õváÛóŽñ…a'û~ï]xÑ–Dsïe§@*·ý;tSÎ5Ý`E¡UhZúÓrê°Ùýþå˜ÿt¶p®€o{bÿ~7ËöÑÆlÉz–ð.}+YÁ3ÔDw«ßYnŽŽ¹îô½w«Î>Õoz ßÝñ×LÛ’K¢O1{X§ÿ°f˰Î1¡ñlQ)n,Û’¢X;•šèî°2áŸ.p7QºÊlôÁïó{q"õÐ^¿#8ÊçKˆSÐÝå—ýÞV¿7§Ýö1j¿µíÌE°ícÍ–ãìQ‘‘ùI&“ü4üRz”¼F9SÑô²1gÿöœ2¸e}aZ©¬Ìbùü@Q‘ün Ø|ã«c¥†ö)ĉ{.ù>ê‚zB-ÜÛôG bm”üžh–vøô°Òƶ9 ÙtšjqÑt“OŽò!~ŠN4Í Ê’±†qg™e±\zE:-¥ºétkY‰ˆ.•f œ‹v†½ñBoŸ–ãuv (t¶6ïLùå7“‚M<Ý!GžnÍ—î zF éw›þžgLM&[^1‡Ø6§ãã_Œ–Ž.]fÃu»íŸ!þzØO¤ðýÆø®˜tãÛ‚º ÷‹?øUþLËø´:>yqã/ØÆ,…¶üÆåž«eNû¶-´ÒÇh,BDZˆÍeá„¶š¾yAé&}”‡r®»dB¨q¡Ã8»Ñë¥Ô†S%Á ?ð†&8ž3]B#Z ,![èv éW§„¹@B—ýÆÆ2îW¦„Q‡º”B:|jNô„A¿DoèÃô î¼»#H4 úõ+Âd„‰u:jªØÁ‚ëÙò…ˆ„Žä3Æ[êáåGà9û="›ª ëôw9xs+ŸfÙñåYz,°HI†ß¬d1gÚò¢éFÑÒ½¢Gi©V¿+O”ü³ ·t¿ån¿ñ2irMNð Ùqã¡÷¶¢*ÖìÁ6mÃÖ­éb9/‰fÁÆšžáÅÝ:N#£ãz$§›“¢ÓFÛã,ãó%²J™êÀÇ8ãª'šfþ¦: êßo¶¡²®èù¯ßFo†%Ýè¡”^PÒ6v?äi³TµD7ìô…ÀZ¡:í=Ò*õÅå+ÿŒ3%DÁCš—NVUbo)‰^-ÆË«:úMw'I³çÒ´]ñÅ.ûÍÞZ¿€cÔ~ÖrC¡¾KНP!À„?´æ©àqÇ€=Ñ¡7 g[Uész•WÇy £ŠïE=T0´é.Z¯ð@ªÊod4¹o ï¾Ê~‰¦‚B{-7ÑÆtQ潓ÖTª2ÐTí)Ñ´”ÃǼ9uimvȾYHÛ¿>#nC7zʃ’¤ôÀ¡GlÛ¨ºÛÃK~7u&D+tLè· ùmôénˆÃKoG/Úè÷•Þ­^/Ùè÷l:¹êpÔfåüàsZk4à¦õ×y¢Üéi­”)ÑeÊNœÖl]ÞÖ¸ôÞJãKÅîèt]5Cx¯\zì¥ÇÙ’$,užV mè“æºää ôàRö]ÒæŸ«J“dò¤Bî‹i;%áàæ”’î”4eÚÞ.zãwÔ“Çc~Ä7§sÍ(r'tÔRbºlÆáAì. ¿ì¤lQNgÀß«åÿ¼˜WÛ%^x׋å}ÑqœÑ¥¶k&Ir¸ÓöŸ£iØk·¬üJ§kÀ ¦Û¿pg¾ukÜ\´5n÷a›‹–|ãÏzîÂßêíôßàÝvO׸¤'i×§¾ Îo+QÂ8ç£{M_ÖjÙÞ>±½žo.à˜Æý…àj-˜:¬³!ÐÜ u>]Cåõdh@ãd=$tiPAÄwØØsñÑRen»ÐÁfqæ„Gr/ IŽi_i»¯¿†?T†HpgÒ(’ÄŽD¡£ç,Õ#Sɇ4þŽÓ÷ÛÞ­aï™6Éá!F¿ÚàÞ€ÐQ@ŒnC-§ßÌEÇk9 Œ ÒDZ6oÜiûT´ù7¶—×ñ%éäÆŒ+Äž¤ÆÄa¹ªÒ­ÜT]a²ÇÇ6ÝSL‡ö»(y ù+ó<þÐêiÿðxvæ#·tºpµšþk8æ¶&š;`iO÷ªwgV5á¯'À ÏŽ”äy þ‚à˜Z;®$£+ ý:ô\H¥ôMtÇ®cè”à@’¤Y‚MD›®<>Æ.Ú6½ý2nìldzélK·•Îô ù2a{ܦµP¦i{ókNjËÐ{ŠßroÌ7|;þoh9cw|¾v`4SIóý~ ÀʸJBØöÑÒ·=¸óò[´uèVŠ¸îœšÃv  ÎÇ6ca) -î¦ÿý:ùŒi8¤å³qt;4iø÷– ÎÀÏ!µ˜M[º­š=¯VÓ›‰>Üů ÐÒc´*=…Uåzw(µ>$Õ1‚ÎÌÐJÕĶ“¨H'ºg[4Ç Ý¦º]Û4=vD"ôéøzºLèT’•‘O×÷{;Ò·…6ÆÂMÛÍD;_L/}ÞhWOÅlÚôn5ýÿ0š{›k:äÏ]B”„6]w—Φ³Ìó!!˜õÕ?hz£]¢)QÖJŠÐPgs©‚Áqšè‰™B[Ÿ gËNUUx‚_1Úr½ Ð/¶ —Ù8g(ÑtCßz•fÙî‰æÑÕ­r­4j´³h)ýÞÃZ%¹%ÓQS̈I$zàKôV¢<ÝwÊ‹Ó1Wn må§ÑÌ‘@óQ;Te‚fBÇ<‡³åHçšž¡&Z’ƒ”msª5æòsé}îäÛ.þdéàSã]‡(\d&ZtúÂy¤4Dß?^tà ôÁÙGDaz-:")SWóªÐ~/ç™0´KžƒYˆ·ãFÓ©8ø”Íæ› 6ê¶qCd—ªDSzÖŒ°âîÔf£‡ñjsá  ~¨B÷” ‚Óöi \>w±'€)aÃøözî?TØqÞ¢›ôXéRõf‚ ‰Þ8ˆ‰f ¦-Ûè¬z@#(=‹~ÉE7#ê7·¾\ø8°Þ·g܆Ÿå\Uø<.x$FÒ®0+{J4Õ6º§Jó&|ÑQZ©U <*ŽÂSad9A8n£8ûú¨ÎB©ÊxC>}SÓš2¿E¿Ç1 Ÿ*íkØ^¼0ßÌD·ŽƒŽvÓ£¾.Eg³æOP¾mcºlo*ãŠþ|ãÎ|¹„èþb¶]ÉGø<<ÖŒÉ@ }w´oš»äÚž3aæó[ÛfÙ©Üh„ç9ÚéwáŠZ‰^ØyšÕjyu”Ù-ÛÝÙÔMÛ×mƒãô¼¾9¬u"…EM¸…êY½ çîO&œÓw¬0^ŽùMÕ±fâ3sÆ[Ö*_ÖZIR©aÜšíÛÚc¶7ìùžÓ錓ïÇ2¯ñÉStêxΣRÔ,‹)á­|)øž0QáßPdjFpÜ™°KT=ÚöHàæ ýE[=oéðà pcÎd5¸n¡ÇOÑÖ°ýÏøoÐ8³f*ºZh£år¢(År)pGã7‰›¶\Ñ/ê¿Ù¶Cö[g1õBþÝè Ù?h–f·üÈ6t;3iŸÚΤ}½ñúömO¨…&tȸAõ£FçZ¢)É1Å pË%”@ß™w±ú]¬/VÊüVZ žçÕjyµF­Y¶ÿ½ènÍóᢠ¦Óîaõ{Äl¡ôÂì7}c¦¦¦è„NÓžÖ'›z¡ƒ>­Oæµ\äB¼%+Ö÷о• Dû½¥³@[~¸~ŒÐA¡KT>LŽeÜÇ™k'³·àÕâ¤Fµm¹Ç:þ(ã¬FƼz"ÔA?ªþËJ¢Î`FfœçG1T'átgC¿‚ ô‹I„’‡µ§¾ès0[ü$ –nªa¼:ÆOÃQ®“Òut{Ø–íËš%zÁÛ ¾ÕÛrŒVUçX‘U€“;%ù_ê‚". èl[A(¥Á½Mð8è°gmr4Y”Ü“·|Z-ŸÞ°Ý\A:eRRœÉþ š¢´íË›p˹m}6É‚³"+#«çbj±j4B¿[K5\Rá\y¬Ž‡ È‚ÂàÙô3ÈÿÓt¸TüžÇÉ€œQ0,ãEL &Lº"Ú²Þ¬ÏÖ¬]¢Hà/–®8KLx¡þë ª0rámûIš+(Átãèøjtw.JßgÉ<+âéqI£kÍCKÌŽqoÖ­kÏ.J* k´bK§n[ˆc< ª² nx?}ZŸ¼Ø†Ðqˆ³—œq§ãÚÐ&[Wım¡àRfD/Á£ž0’Áû‹ötêîÞŽ3JCÂG ò0‚‡ªGáW%承ÚÈZ‚p¶)³÷ù•ÊLy“¢}©|kNxÜÏ~h½á ÝèÞЙðá vz´¸Æ%£Ì w­Ä{4–¨í?ƒ¢qí-=S£:³è›1å¢?8®³˜m7‚HSrxŒùA³ÄŒD{-7F-sï髼ŠôŠÅíô;«1Á3Ͷý»–Ké“1˜mÌ£Â]¢iø§å”^`·ÜùbÃD;_LôN>ó §Q·©—7¼©Šª‡Ï¢ZÀóe*‰™ºë¡7ot•.oÜ—5á–5á2d/*®Pq2ÑTí -W 6=*ÍÈ$^1`1[Yý®¥¼RÃxŠ‹Qô‘x!½ÙîâßÍ3že û³“Ï ÷·,ºJïG‘b Û²®vÛš0™k@;ž•O™ü󊘾Óñc±zó’šÎOÿ§Ôë– ´-8׳§ƒžx¥mú°pÄè nÀIyyüÉ·ÞÀÐtÛ¢¾ÓCAhìDÍÏ3%`á Fh¾È¿ÇûúVÎ@T0†nÖ¸¹h•R ðnÖ E†·2Œ–‹ä‡mk®–ÇizÉæh_ÞI¡æ[DÔ“Ü0R™h£ãZ¤ìÍuê*¢ƒx_þ4ãEì ;ýVUFÆ!þ=šòìrÔ*>I‹Qöã÷£öC´µ=hKÇÛƒÐL™Uh…žè „‰cɪ³Â=ô~ï&c'üá>gÔNåþnÙÖl=j:Ó×Üöš®:<‡ëã¸NQ˜‘zí–íiõ{Y¶=ô¶6·ª0)E·æ|²Ö§¯YÜG7ÈÞ¢NÓ¤¹Eîøÿ1|zp-º56k¡%÷šiÉlñaùJéV  [s=¹¸Œå—h~wk‡èÝ #ôiO¹'j[•q¡5ÑFË—’È9úl|%MB*]&âUò>ª3l>Úè¸8Œ˜(´(4ûmyÊAŒnõÛ»U능Œ _¤Y¾ 3åòÐHÖä¡Ã6­sÔD9X’¤àï¾Z ã¿O­qúÅg³æzÒµáj‹2e|4ƒÏ°?äê;ݪô@ "ÈÆvË Ðî¬ÜÀŸná:c¢írž„6¾ù²â+¤96Ô4Ù‘‘â÷®W.ÜZjË:—å8îÔàaµý/Üš·u(m‡îµÃw2â?ÛòÞ¶Á}ÞAÔ EVQp§éÖTß"c0Ú¶Ð%µ(Üðý¶n aZ~¢½‡Qäo1òàÆG;w€ÞŸàû)¯Àâªm Ä_M/`ØößËäF?2¿}ã*Í̤®Ž˜Ktºž¤¨?}"–p ãßÈCtºI³Ž5¸$to>Áç0Æ-Þ<TÓ“P•‰>0gîij£a;Ÿ<™BÇ‹.&ºÔ £ÄGÚh†q)«±»©â›–’Lt…)¹ªüé|ð¸¡ÑB-'|¢½7”-Pññ×6ËE:®²)ÍzU½‡°ç³^~É‹=…G±:YÓ8Ój?zb?|gÅWævž+§G]éá ˜¦yá^tÇb¢éZãDbƦŽÔôøjz8jø ãÆîØš5nÝEóã0í°mù}Œ$˜¶–‹5Ξ%N Ú ÈPb§¸çËëùq–ê|þ{ç–#K¬ãÚ©ôÂo{þ»!ÊYý}ÈÞ8ç«(r8¶,Q”³Ú§T?™Ì|¢7lGqD Ô„Ž^`ô¹…fºxBGÿtº¿ÍÛžçb)ðå6-×5…|èÖ{¶$gÍÌŽ8zxCÞk›|{¯-Ëð˜ä¼m=Rîeác15VMè«ÐHÿñ^ûñ.Ég1‚o˜-O ~À±'üvMMô>Ì ´(¾HÌ;Ñ!!EVL ëOÑ!ÕF¶@7˶Ð(ÇhªpÑ•m­]8-Efä¼^´1çzZ³¶¬YSarÁ½a"ð¶c[D˜×ø±¦ †ß½ÿ‹hu«F¡˜‹>ì²hoä¿D›³f|àÖÈK ¡×”úK¨kÍE[#ÿWÑ©£wÅR,ÛÕG#*Зlhã MÑ*t§ ´ä—¨{Ÿ2DèJç£Ç¿Œæ.vvÍÅïÛEGÌ ?øŒÎ!ˆ^p‡Þ;Ðr÷*]èj¸‚·Å/€®Gɉt¹Øhï¹ ÛÛš5UÏ!¶ÛE{#ßL•K–m½1ï¹$>8:2tw{ò?wä·¶&$èi|:ÙXÖœ/o¹¬”qƒ®ËàBlVõ1^«·˜M´5oÉs1аÅý‹žºN"¡¡‹®8 œ¶)9xJ®‡†Ñ¥ÁËá)U¬Ý}6¾ÊšèfÜCw]²ZžÁ‡e\!aÊE›)‰thÿ†>ã°4àSpTóüó#eNë­EXÁŒ©0Í­FÛr¨—蕆®í޳y¬I·ÑóÖãØöÑÞÈÞÜ~ýܺ8Ù(Ü­ÞX£jxã¤òRH¤y\Ô¹àTÁPùêÂÙ²%%2êr®“åÒ0°å5Ò¸Q–Ò‚•]‘ì…ËÙnñ)RL¸mtOO±gŠ>íJ—d…­ ºêG-³è!~ò+…ßÙ‘ËJ¯´Gí«© p²þÍyQñd…Ç‘.?Dw,C–jPúA{z¹íÊYÞèc›­óòivNgÍCO¹>t¥N×öÏF¾¬Õ¢ˆŒTþ±WKRV ´gÛEã9߸—M órB÷–sÎ2^‰î|QT™õÀ H¢ô÷ʧÎ@èá ½)°¨¦ÌxîÂKŒË•ŸG2yE á‚èKW‹¼dv¹Htcrm‰>’éĺ É4¸·5|B¨=ùj±mW"LtáßX„ø(Bð`•9Æ$ë~¾ä8—xf˸.ñô<)â°ÀKÚžø$¬òðéz«ªÝD:èE!Õ½ð­*ˆåÜHvö€»S]qÑ!Ð=bm<·ÊéèJ­*b…B‰¶mÃ/4HÊoŒ­¨É ]j³p¡7UŽÐžÚñŒäôA£>ŸM)qå£òj=w“‚…¦_Éè\¶4Ñ”¾Qƒµ‹9ÞUÚÂz[s.N?ÝS‡úó5j[©˜L‘[z›è÷ße㟺KÒ@•‰Îû<‚gµl7e‹èiòÂÏÆWÑD3EÃ*¾2•õ©ýK:ò£Òx¸Ø–ØÔöÊ<>|c«X/ü‡AÕ%‚ú6ÐÆƒ7ç;YFÛ³?4µ½Õ‘™‰g ¾+Ž&¯”\‡kuçÁ÷t²;™]t䪼¡ùžm½ðDÓ»èiŽí#º/õÙÍcðæÈ3‘Mg­s*ž’ïÎȇõ£ô¦^$eÊœÀ†ŸÉ7Ð,tÑ.m.íRÒXXTè(G`w›&NÚ†÷‹aèÏB_x¢äÃ5q ´’lŒºÐ‚Výé+;ÖÈ-tÊ:hZÖÿ±Í’‹í ûá‘+Í®tíÊ2/ûh¾R} ÇÖ.ñÿÝ ®‰Š¶ çÒ‚LVžCÙ‚‡ËÆ;C—â é¶Â<‹ŠJnØE¸‰Ød u §s^»e;{ÅÀ9¯rÙèÖäÐdšZ2ó•Z³‰Ö€Æ›vtFt:œ.¸?dGgê{4î²"§D7XLØnOæ†Üd¡q—™v)Ô[l¹±Á¬I€qðÚmªŒgMù oW|×9+àl"]T¼55u §h6ÙeÜ¡C2>wäà,¡l·Á/ËU ­*mxþ`ÂȦ6ú`·Ûe—Þ&_ô.°ß{¢'>LºÂd¬öÀ¶}T±AŸ[gp‡s>‹¦ }T._ÕÂo8‹\Çó!ª Ý’‡(,mÒ>RJÔöÒJgmÅ…Ž^ƒ‡V* E·œ<þ³w(½™$šÎÚÌ|µ]y}³Ð§â»äl–mÝ­YÓM” 0´+ã„mÞƒ»]5#zµ˜"±"™´MåeÚÕ#¢³¶²*Š¢›³ÎW³Fn­Ô•]œàžº†e{9_èy€õÎnWü…n£ÓJK!¤ ™‹ò‰Ï„½×”à[ÙAVÔ”‰æ/<ÐÆ¤¹¹ðÝZª,·¨£;b&ÐyعÐáœÝiÔÃD§:=ÜÎà-%Ëd›”U&LŠªJÔA«(Še]áå Ç»:r‹] o!Ѭ îW#?wrÉÑe0Ñ^…Þ}ßÛšµl»‰ö–~E2èûN¹¶§v%{¨ÌXâÌïíJ™PyyÙAÎKê™¶(ÐïIã;îቇ…7—¦:ýDÛÃ{8%ºA‰÷®¤Ç„™ÅDÓ@t¿ v ö[Ýˈ‡Ût{hê¬Çn¢4‹¸$Úx$ÜT›Ê=˜dÂM7Õ–}3 4íùiϚīY·ò®ºdc¥n^;Е¦¢C¥ —A8罚èÝ “¼º¬Àc0úÃ#Öȇ³ÖM÷µÌRѯäFïp±Y \èpéZ“mÖtù<.Æ Ú°=¤3Åš•&zÀÌ Hÿ§Á ‡Â[Îs‹òÀ„2ûÍíá‘Iÿ1J”à墯u f6¡ƒHF'}óv¡BÚ•·«^óàã`^—è‚/E‰¦wIï¹§ê±éepj{`z ‰ž06˜è"|†m–ôP©„fÑû~ûâ0öÝÐq ¦èÌZÐ7V­•ª¸$kU¢’ CkšÔ“öPYöDoLhÆŸ“cïÌZæz8Ú¶WªR¢x¥Îߢ'Tçø‚mçååú-þshÅ¡iìfV’Îù2G6†íÅO`]%´±§fçiº+nßto ÁáIÏšì{üà8×µN/„3kàù£ŸÊçýˆÝ.Ýáí¡‹×4aÁE¢©­Ð‡¶—MôÚà6:ËTàR_…³š?hºE$š.Õ•ÚÿpSOmš-ZÕ²­¸ Md¯É¥þÐô}¯ÐþR— z• ôÀn×£¯5…ÔiKþ^§Ï}xŸôü½Ó`yޏµ‡¶:vd²Ùú¾úÜ*,¢Ý­¨*«q±Ñ¢sU¸Zv¶£w:þºØ¸}‘”9p‡~ûéÑá©?´B4p¥§„¹Š=éîbÚîªî¡³æ¡n.]”K¬ ‚ûÃÑe–Ò¢Îâ5‰Þ8 :Øv¦M ßs¶Ã51mM«÷]`Åä7Fî>7^-Já=Õ¨ÖLô¬‰Õwä,É&ô¦ÎÓöw&¥¸6õ5ÇmÚÈÎÐDS_s|Z]R´N&;è+dG0ØÞoŒºíÙþ!úõïëQ· \—hcäÓB+œÌZÙ }: 'Ûå’Õþ ] ½Œ[;À²èCµö(OôŠº*Œž&#tDdYLUpoÚ\ãf«¾a¼Dçhþ'éæ•ìC-] í] 8.?W=®öhûÅÿ<Â|pÞŠ!?0®v!ã |ÐxÖ‹7m6Ü{U®Éø• ¯8ã6…eäleâcâ˜hdÂ˂ᗠ§*‚;¯í5^ ˆT®ˆôsÙbâoukæXõÈÊ„GVˆ®¹E²²YÁwƒÕeBkæ3t¸`Ãx‡ã6fuñ#ÛWX14nC_ÖPèò,—@ K+ºé +LvޏÐǃSÿ5 P¾-UebXÆqd‹WbÜ1¾pHÝ\½b|JgéÈ×p·„”)~ŽO‹WË6 žµ Ñ‘Wç}g(KÌlÓpgC¼ÖšÂ_ÔßoJ¼õߌ\Z¥Œ)ô°cØÇ6 µì“N×Ú”ê6þÈÔ’:ûm™è=pÌñv¦ËÅyT‰Ñ墜!u·Í9cÞ|gÖ0z›è(û~O;Ö“ðËÛ 5BÞºBý‰!1⊷ŋ¦#¯.š‡ž²1$š®²ºÏ$Úxî¼\Ðçš5Lô†yùq[8Ó\JVõ3ίР½À#Xð‰ƒÓ]…»Ô}è*BaJÈBGJÑÇíM•9tšêºÊ21…DÓ÷DÓNãÊn㥾²y¶mÉ¢ßÙQ€Þ„‡Ê!X¥÷¸¨M샦±²ñðæ6C‚”à.t¤™óGpgÒÅ"¥aáQµ±Ò¥ð÷ÉixtHÒzÚ‰¦·º‘íNèÈ›7oj Äš)­437®ž¥½ŒX‚;+&o8ô†©û5³,>x¢)¯aª`‹µþÚøÐ®ªµj¢_ï‰t$ºpts–ªÆ" ¨˜nn‚«MMϨ³>—ƒ:¶uš[Ï2}™bé15ªq»"”³”¶ùþ#g¼¡cvÞXãGÙl‡Çˆ_YÓWÆn–S5!zêS͆øQWŸW“ÁCi¨B—B/äÊnG925ž…óð¯òuY¶UB"á…/< öLlŠgNUØg0ÅcK‡i+œ½;o Ö×r^Þ1£|Ð,Û)ô¡š¿‘õÖä0ÒunŽ\U,Œ»3/cšÕ-)±ÏÔvê,ÓçNºÜT_ôéPL©gäjÄrÛSí‚ ´è˜L„M·÷C;öÍK,¤{j×J¥7›®~¬è]èP§†ghWì‚Qž§¸yTàq~¸ytÎ'¯:šj´øZ[¼ŽdÆŸÃ};yµDSéÇ6^©ªp£®f?–íc½ïËP$¶\øÆ¢çN……Ç‰îø ÉA…olHr\ž&“ Ú¹…ž‰>flÛ)ÿ WK²¤èÞ’hV"¯Î/ÑÈ ®µ©^Áto™Íšsƒ ™è‰÷µÙÍ‘GŸ¾±nÍù°FþO£u>]ô"j´ÞT´eZÝDæíèWjØ œhê§-­B£ÐQªEߘ|E–SMt״͈„óvQauý4^çÇZ©'â-t¥.ÉÌлÁmj×ÚªÎs/ëüN:õ°—J´1rq}izn‰&ÃÊnæmKA½½eô–J´1òÅÒ‰æ{ê}nj[eÞL…J÷vÃö%³Á7¶•X¤‘¢­Jš–Ìæz@u›mVœ¦"Μ ­X.+ŒzSé­eÒ§Ãbéy›3`ÛYßX2ªh¬ç¨„ICÏÛ(€úL)˜O#Á'¤z‰QEßX¢<×ófs¾®$6Ë®-Q¢Ì2}ÐL!9Ñæ‰T(sÌ—¬$sQ÷~]: r}Ьâ%Ñ?øql—d<еZ2 ¿Ñ"?— ­Tï|`­OŸ y®êå©ÒS´©ŽåãWÒ\¼Ž&ü¡Üæ%–L‡ô ¡ÃO‡;T-ÜÓ^W¾“i9®ÐåÛÔûY‡>*tÖt7êðµ‡Ëg¬ð{΄-{Öe‹`twæ<ÐF/–%/: 'è©Ðt"1Ú„Ðδep“.—Ń|öso Mw©ðlÏ੸Æz™ -%lj¿<Üyt¹TÔK}Îhä7àÇ…æ¶áÏ‚r+¨.¼óÓR)=!V¸´FrI#ë]sŒ¬¸D âk.4²Ú„*› wY–þöáÃr î¼·é ÞÚ+B¢ËyoÛ{tóc?žu_ÆÔ nX÷6 étѾ±ο˜íyâ»[Ë&àÎÔ…K÷àT×Z6¬¢,á©7ÏàÙ”±ñ}[úÞ¦tÇ©k°ã{¥ÿKBaƪ9ÍÙg·dOú“L„@ôh]À cr¼òcÍI…o;…¯h㘈X³Œü*uÝÒè”í ®Dœ‹ܶèR´8}Kê@A€mÑéšÛ©Eù' w^Ûáû;í“”ð:ðK/õ¹E“í÷xcìÁ1+RõÆÆ¼—¡—Μš?8~rõg±ÍýÁ)GOð±„+®ˆúÃØ;Yr&‰ß%xÀ%±Óv…§r¢i¶r'½R€/ܘõ#*¸Z«¸Ï¬ ÇF^ù¤šÆ‰²˜f£))<ÕªXß,Ïë=sL 8ážõCó¼‰ÞP:UèMlK0 ·#Q«å° ?Ó:xîc‡çg½²¼p±ÜÇR§ /¶²ßAd-•öbÙâ”.¨8·Å)­ØË~ѬG÷¾©Óßò4†+¦«79ýÈ{5ÑÁ‚a¥ãtkî¢}³Ž$öƒ7ÞN>ч?·Ê3XªI„§  ³¦!õŸlt”ÛÃ9¦‰ ÏÚx¸ü™Ð{`fÞ\k«{-ÞN4Œ¦9çè8‡éûV_–L:¤×èÈ !¯DSZãgM_(½Ž'-ÛÞœ›è ‹ŸlôqÐ3Ki ó0³ø ®–°M{cm Z#— ÓÎfŽüЄPŽÜ˜ón½ï‘ ät±e“mzÍÛ›nŒWŠNûvÑTeK­‡¿òlAGm¯Çšôey>«F€îéKrô.½ª÷àÚ"èmtis£ÙŒ¥-‚•}l3šC¢;¾”eï<ê¤N«<ß"Ö œþºhúJÔä_ô¡Š;i{ÃòH¡#ìBƒ1tžëŽTÎKè=qH|¥ÇH—‹|>&à²%ÐĽÕì6H7¶Mᬅ¼Ÿµ],t5Ñgà,¥¥˜„Ú–¼S…ÂBãνû#-OÑ­vŒ¾%LeŒ<‹ìàq°¯~Nô†âoÂ…h-5C®/mS³-ÂXÅñ¢¤›áçžP¥Ïýèž*±?Vö!ô¡•F;æ ·úp77ÐT#)Ñä™ ;ÊãüžÓF¯&‰ÆGQ¶§ÏåâÔöqBºAé|xº)Äyøáõá«ï,­ŸMã<~†§7º£,Ó9üØvFÎÉiæ$‚9ýÂ}4í`¶ã]E‹C:kø€G٩ξ˜¶ tÜ¢éZ«RX†{SövfzX‰n8raÚî±±ÑkðéaåˆÉ:$ ;tRÇ”Éì|ЬïÛ– *±+xpÔᯖìÍD¿1ÿLˆáhcÎ]Û‡êí§mú)ϺhVÃs®f.»Ø¨»Á»;°0בêm‡ñÜï ñœ'õ’àêÊŒ›Ð{¸G¢.4# &š~à‰6º¢EÓ@‹MÏÍ"6‰^ÐÝ;h6zd„)wñ7ÙYlzY¾¬IwmG8àçJK³ávxhçy¶Õ“¿oñ\XìáHíŸÖj íŒÜµ\6–ƒ?·Í ](0è|dWæ‹ÃYÖ¬O‡õÒ‹Æô$,ÓúHÝ·Ñ,„ŸÏýÀ&jG•ÊÆÈÿ]ôæeõ‰6Ž“-Jc¦qïÁÅv,ÛÇš6¡Y]{¢ù–^gs©"„1úÁ¹õÙôÝÎ/tä…ñýœÎ¹ÈhŒ(sne8ŒVVÑ›Mm¼ãÍM½‡ªâ&–£:êéáÎT¤£ÁÉ´Í8ºç•ãolž‘týàÀh–¤3bÔ úýk›qŽº HÂúÈ“ù³MŸ;#>ô+É]kÊ6Ñ8YËÒ(8ò÷înŒ¼-gÖš:¨32ÚQ%¼a[]k툲 ¿’–êUš?wWv‘ÙœO‹!¸R»u~wËoé:é~Þ•e9xQ{ÛY÷ÔÀ¶³‹9<¿£ÁNÉP?Ѳÿ>¶Y ÿ¹âŽmÚQS}cw «EUQ4:Ø—õƶõ}ok¥në}aäÔoéÇšóãŒ|<ÎZK¡ :òaD£X¶%Cos‰¦¶Ñ¬‘wkÖ2Nßw<½ ÝÇèW2t'¢ä¡â )Ù›®–DÓ7fÛæQ‹!¦)õ[l´óÜ:©Ï4~§7ª¡04žs©Lú•ˆ·À8ðÒZØ–Š$Úy¢éœ«L…dKÐåD‘¨1çó1msz{¶m]¸&í¹-ÚèZ›•·ï´m‹åÊ ‹mØV‘+=C§îct?ŸyQôT3kúƦ*&ài0%˜ÀTÖOäô¢æFL¦x‡tG~wSÝ¡–­Ð›Jª%šßýçæpGÚ?ÓLR9hÂ÷ýîä‘m¶×ã¼o­Ü~îòCÛÕY-ÿ±èf¢#gA×¹kû§h¾§®nÙþ§ÑƬ kwÖJM¿žcÙx|Z³¶¬ç^Öû^NTrIÚƒÞÇÌ‘ÕbCÛ[Š®–º41¸Eif%®GšE¶ù8áš@ß"¸Ð«….µc¾D  xÜ^)X4‹{6ö²çäÿÔ±Á·³ç4]pGpJ%»ª(pc>"ÿÑ—ª(uáz°#98=YÙL\ÜA¥;ªT¡ÛÛ{€FÊN¶.0l{hÎ:Ͳ-Þáo̶½¡îQ¢ùtº5ç뢶­¢>ãIÅgêD„ñiQ6:6ešMã4·yÓ€tJ›Ðp×QIJM>Ëúþ¼Òoe;L:GaädÓÖÎ4#ê“}OáÄ%<äôÉþ–èyÙUR´QXEfýn9 µ“­3íÌõ¹¢=­çNõ#Š^X $ЪñA;k ®gp­•W7×çÖ'£8Äš~¡YY<΋žŒ‡ÿ7rt¹ªª ]'ñs+4‰d¶-g•®Ô¡s ñ«|ÛÚ×èµj Ëa‹úÇÁ¸2ÖÆF¦amlcz¾pSØ‹6†.Û(!\ÕÍzðã|âQOW×&Ð׬Z}|è]xfÏ 8k3;ýƶ\tOžê!D3ø3Û>Ò7–ÜOz†O ”ÑûA¢‘ ½íeò>@½pœn*>àA:·¸YtgÌ’:üÆO´¬®p¹­ÇñV—Ò”v‘hšõÑ'?–Êu+\l«áÎ.‰~·š:Y¼ðEC>ÿû^ôâ³&‘z/Å.èpIl‹Ò‹–|]š¶YÚÑi?GNo„KbÔuYS!þÀS=‘})XE—‹ÐH;9ÑÖƒ/gOÞ·vI´3ôkÜ@ó7žeRôeK{ú™íŽ;'Úšô!ÿî«Ño{aú¢JtÚ¶\>šàŒ*§¥R ¥ïÈ7¦ùdsJ¼ÜgE%þœËÓ¥¾ªºN?˜ksg±…ñg3±‘?ãô^uiP$í3ôJWïgÔá¢7vÓ£²Lõ³ …³tÚªµ^R‹nÊ'zf.L:ªùÅnå”m´JWéjK8=ˆOw(Χë;£©¾¬lëÔx:úÔvjúqÛçð}Y~>=nçjú•N\Ÿèò4̸-»)zË8Ry xv‡¡Æ•¦d×é¢>Ê^p>hl»qžr¢iʬáı)3j;C»ì…ÿ/})‚;ó¦ÔÛ_J„/J¥ôÑrŽ2Ö‹Bé´¥Ï‹ŽÆ™&*…Ž"JÔAò§É€?8Ë•xèRÜÞŠÚ!ªßDÇ ‹ÛöÐï‘ÄÒ E¥/zé†Å’´ wVÌRñ ýV\t$€ðrSÕ=ÑŠ“Ü.*½9°Rh×8­Ì+ªžéøSÉNo¬^9ÑüUÝŠYø¨ÜÊVÇ™èéNåö‰cá¢ê ™/ú@:cQíÍ„AV¡Ïïvi›Rg=øjñž»Ç悺ó\´1k]±#ýÀ¤|¹îðÎÔ±¦ÑESZ~¢i ²¨ÃÝŠÚ!†žznº;¨-0»Nõ¨kü4XœBZÔeÎ8‰Ž3k-ÏPø•´ÇYçÍ:CÍ‘«~•¥AÝâCWç}7E–YL¼Üž„Hí=Ð]uj[%,¸+t\¥é¬IQi–Z½7©‘Ï÷ZEk~Ò8MMaèÑP‰¢3; ¢¦ F^Ú²žÛE¿—"Ô†*ÐÒßd,«D/þ™(·LÃ|íˆ} ?2R˜¢2Ì…œ]šÔϵѨc5 E 4¨•öô{œ0†X‰ü¦õÆm¸3öÎE…„ޤ:µ­TcÝ”[HÝì>¸ÔZ¹Uÿ$zýM/e¾mÊ\ùØÆ_è¶ž[g Ue-%žµÃ Eµ”Ê¥íl‹Cgͽâ9°°¯„«XJ‡5¨E…}†qùÙ¬hHèóà\ÝH±Õ}xýk¢iu|Qaù|8Y9ÑïSÍI'šÞgI OºKªp ›h+4q2“jý¦97}J†Ê@‡Ä}îe¢ßû( O5^a+ù¸ïÈiÿæÑ„öT^¯UmNxÚŽõàBÓS8J ©*a¹ýæh :ÆÁ.}®–m AÐÀjJ…³¢!Áý!ÐÆƒ[»K¢ Œ?DWá‡xtÃâÆè õà‹ôROFÁü‚mÃýXÛDGîªëüOÉ= •NW›ZaÓ´îmF_øá•œ9mÏäÛ‹e<;˜Ñ0_¢Yy| îA´c >_ÀË€‚k}ç;ÛŠIÓ³0Š1W|³Ãíi‹6ÂjHŠz· &Ã4¸ÝלyÖØjoÊ‚yèŠ øÁ1Œ€WØ%±Š~¨0¢ÐÖØ·s·ËªHJÁØÛZ1[,oŽŽÂDJ|Í‚N¼\õàwž¿èÙ€Û:M³Q õüŽušÞn{šÎZÖDÒ ç©Î'zª¶Fê¬g]"ž6ç­jüÀ^UºeXp¶ÜŽyÔoL4eÕÝŽy4¾û~`Æ}üdä‰&YHùlSWâèLÈɯ·Bn£—°@(a  fëµ ÛŸÕ¨Ø‰ÓŒ±•?ãõv0cŒB¡1ù¥ª™a›÷ô–þ»¦ÔO 3ô• }h{¥DÓÈ•¼NáJ:?ð…—üHágV÷«jÌŒ‚T5Hâ›ÓmíDG¾´½°Zˆ‰£àÆs´ú¸Cxц‰¦C¡ƒbÆËU5CTZŠ¢Ú .˜*Q.¬ªÛiP`Yè „[[Öí°ÈSUýJ….çÍ*Žê­!alé´-ú C«…¥xÕ2‚¬ÌaüÝÛðƒOy/Ìϯ·z?yntW¯É–¢O¾eœz^5ëgé¼I°ŸU%Ø®L+Þ¡;[o‹'ÖFMèP@ƒË-Ð|klÉQÃÆE€¡GiÔßÓÖôΘ¦ƒ4ãN会¥mÈ  ®›àü#oÃzòùSt\Ãü§#W‚›•šI:í<°5ÑÒgä.FÓ?ºÖT‰Â˜Ã‰n|o;Îë)Pg­«M#+çú}cLŠ«ª2€Ÿ‰fuKõÖ4PÇ«‹»Ë8¬Šu–Ž|ÇZcD/¡±dnÚ^P¤0ÑÊJÖ˯§Ò.%Qú}g¯":rñëƒRĤ·£!íI‡^y¥ùÍê*•ŠI‡ =%á‘g€ÎZnÉ-Á~d™½º%-˜î»p~é/²¦ÁUõ”ë­SlW컌Š´‰æ9±x‹éªjŽŠc”YÍA¯Ò3ÓâpµeEMbd›%ºZMOBUT<°…K½LvVè÷<¡±“©O,ËYÕ¥‰JÕ¬©8sMž&T¨<ˆBVD#x,7ÍOÒ™-Eégæ4ÏS÷—ÍýÕ¯ éRï/ÞÈEcµ¨õVÿ0¢”6úÔ[ÆBm¯ôÓáþ°ç­'ƒ]ÔxVÑÂŶªµ3þŸ€3ê°o=‹xiȇK½•†–W:Ì4[©Bœ帪ŠB*fb¬íý ðïh‚Sñ]K­‰?b{Al©J‘:ݪåé˜I¢Ú þäª Y°tìÂù¢ øûìt£ú<.×pÍ©S×À´]ôŒ71½pzAÎÒšèÞÍP[ºpãÑ›óµ†ñÒp&Ju5¯Ø¤13}oÀƒÎK·Š¼õ°2‰„·ÉWìTš#œGœ·„ hp/}0A3Ër(7C è€pýôì¢Æ¥ŒF¯&zÄ+3Ð!V [¶¢7¾£˜/eÅžT²¡hÅ>iïdu/“tiÁÙ—hZmíRþÙØ[’ö7ÜÝ%^:ô¯Gë­e½Á‚„šö)WÀcïòžYSðHö£Ï<ÑÒK1:†Î £›U¾^gR7ñöÌí­utµ{ð¢Â í§ÅʃL÷Ç,x`Ùãtàðè.!8ÿVJ6Âfwìv+&èz-Ë3.2ã·&ú‰÷<øÒnÉzÍë9]¯õ=ê¹oÁÏS‚‰^°;q½ÐÑæÞ™~+Ù9?ø{ ÖYdíÓ®„: ¨/P'稴Ûý‚‘….­Â{VûÔÐS©fЉ®7 |êˆd÷ :ëiÛ¹óÎZ¦IXTÀ‡ëŽÉ’ïÊžchÊ>;Ó¾y“_¡º¤C—ÞÝ»µÖ{¶ƒ4à‡ªåÐ',†Ktƒñù†Õ"ê£]zÇÌ®.uŒ&›ÆŸ y²‚‡|&G¿oœ…ÙïЩh©˜¢%£* .lz õf­7Ñlë!ÑÆ¬«q½ vùO¬Ð7ÑV$º@2XSýÀ柙ÔyY¿µ°zŸ›16›xô´e½Ð›GRº$˜èý,hôª… £ÔÛÔ*?dºí ì³úæ&2z…Dx¡ßµÆJÒÕ¯äwhù|¬£‚Ðá¼ÐÓd\U>ºÒ—²¶øCI"(:bÍ46§^:½c Þ`Û…¯mÊ›¢1´h38zyߪ OIKÆNWuÜëC3[»MEè}mÉ#:pä?F;Ëõׯã~ÏßÙ¦ì»zé°!JïP_H»Ã¡Jʼnn8µ¤µGæ«òÆbBGðžæÑÂfà°çR葵cm‘Es›1Yaa˲Á[:Ëñ Nº=m3ý¦¾AƤKk2UìÄ)d+%è_*=6ÐJµÛ>§@ôV*Œ±è¿€ÆÝ–ÒöÆ;ÛV=&àeÅ ½$eÍM.l%t(Ë3mÓ]5Ð<’h¼ZRgñïÛ§û ŸtãÞ~Å“ÞågS´Øû4hª2*ÂÑn󌞼}¯ÐÒ5 Æ¥f…«º’Ñxï)Žm]Æ h}eLe烦¨#χòíΰl‹nG–Gšo4¹p¶“}<‡Ûîª39pgÚ³}ÌðÛ¶u!dk-ÑT)ÑT[Ú€ŽmmŒüÊÑ.2/ 8õ¨oypv?úT¨ù¦­<.FtÚ¦5éËE7X“.]â³a]·úÎ#/ŠÙ°¼ßÚú™å°màìî·®†nè·*9›B;³¦hÝЋ$_YÞªgEÏ=‰<ð6ú_¸O 4]îÇ5®–bÈsë·˜Š•Ù~gì òÎlëï)¾©ËÛ³”Ë0®ûõýjå½Õ»Š©*l4ÙU‘T ›÷ƒ¦T$5ȸzÓFn=k©ö³Ÿõýj¶$£CϾEŒE“è=‰¨é‰Ú;øÆ?m5à‘½)*•—î‘ú)uÀ àá¹Rôv6öl”@Wk;Î=§kÚz¦§éŠ xY0»-x¸¾ðSëúXX‘¬šY÷þ»=Pͨ«¼¥|üàQÅ5Ƴ'×~éÙ_ƒé;vuÈX0Ö*ô{UcÏ´} ÛMÜwãCïï‰:̾õø³,3ÚZ0›3º*d6$à]Æë÷ºUð½=Udb„Âq5×gèôHÌ&zBQJõÙ”x$´3ò× ê 6MÜøÈǰ†>EØbù7Áw‡Bô=NBcoŒ2•ϳá9A·y}òYPshèÓ.BçYJèw8ëÉýfú*ýò§éýRüiã• kÚTÊÆ¨ ‰>ø$÷š§dær¶§™ NY“Ž4>!Õ­¸Óø•{.ŒkýØðB•m®õÅ>úe@Ó=IÈô[[wo†O¾ªe¼Zë}Uçcs7'Û¾,7&$üßÛ-Íí¬n­öeÝÒ–uK[ÖÁr»àWn§7íÓÚ`—Êzk®‹ÐÛùjWø1‘ÍmoiÛP—‡ˆÔÀ·Û€1Ûý8ó¶ Wê’Ïï›úAãw¦š K:1¶­”=ã½u1['¤wqSß‚no/<¶tÚ"¿PaÍc¿ÄX¼VUnÀêKú•`Ç#÷lo‘rY YZmlËôë‡%šÏÛy¬y;Ń'¥®ÖÓ¼ioÞØ»?…Og½›hëC?Ë{põ<íÐù;Þ.sÔ‰ÞO¹Ë>í#ÛÐ'¯˜4^ ddþ7Æþ[xõàÎ&'¸óÞÒ8k :$ýü?¹@q#±S"§ÅH‚;·c茜3Do6l{û„³IÙðbøBÒù õ}¦Œ-8>Z†ØÕ´¥Ìˆä©5oÖg^ºÜ1.¹>¦Ž3>ìlúÆ O&ÑÆs[¹‡Vǃ 3°‚ïoç#X²Æg[ãÁmÛ|±Ù#wЕGc>hüÜâ5³bÝ‘=&¬ýA‹v¦­ÙÆyëY:B«HÙô@ 4•pÚùÌDgG‡zL” ëÔÍygZµáÔÛn3éÑæá]m¬*NpãÁ› W¯YhçÁ«÷àYw/)ÍÚ!Z÷†ÞMãqÅ¡î½ÃÌÆˆ³Èypí,Ö×¶å¨û蕯mlN¿}në#[–ñõ[ã¿C[>ÀÑíìlžíó;tvbš„Žná¬ätܲ(ÖIndã¾?të.Þ­m¯Îjëí§hkÒåì2θEMôz“hüà]…¾¬«X°ºÚºåµE¿¢ù$#vǶå½ôåø]Ý:û‘e¶ÑÛûF·HÔx[>žõ¤pÓˆ™o}wœòÞ‰4 .̈¤U„­èÞ:¦ß.#Ç Ý}îЧoÌhô-´3r ½­„c¢=Û?B«£, ¢¼hgOÞÕ:¶çîºpå YsT¡-ãê­Š_ú¶¼'ÕˆpÏw;šwÊ…="ƒ°R.¡­¡§ŠÝeTêÀ?—£Ã˜•”• PG`f¹¸™¤w ~œök|ypwì-Ø)Æ=ÞfԈ̻ÂÜ,$0E÷wŒ;ßêßÿ߆oÈyó­_Í]t:]ø‚b¢óV;°»ýŒŠ0ÎZ‹]ø†§ÓŸuúè/TL>áµÀÂÓ¯ Þy^Ô?“JÌÙ½6ƒ\jÍÜà­a…ÞvBž)Ho ýŸ†{Uõ¾^²6|ï‚Öë0¼E"šIíÍE­.|AE®?¸óèòfV0Æ¥®Î‚‘‰nPÒ~F@-\"&2?lúÿ¼¸pãµÿÃè”acu”óSg½ùð¸ Þ=ëÝšøÎ9'SÝœ×6cèn‘—ŽçmZó6½'—H'ãó%Úº’øŒS'4ÎTÍ8LKÙ±Ébx´m¥c?zitÅtI}Ó˜d ¤g ô,8o=½ïNü ð9}óò•i<´«7#“á˜Ù„Êâ§ñëw?hêzGˆÿTô€•Ã3)æöÓ¶‡ÞˆžJ¸ÐO|Z›[*^/j\½¤ÕFè“…;ëоÌ48„V3(7vF§ù=Á£ï¬óäÌi/QúCcQ#Ï„ ûHE-F¢”ªÔAá‰4Fv¢Ë}¨e/¹ôØYásÂkʼnÁ·¾<ëòÙé&ÆËÀÇ’òÜytÓúqáÆÄÏÇzôySdp£šÏ/Ç^¼±ûpgðÕZ4÷¬;ï-OšSžÍ…;co:_ã)á΢éÞ[ïjøÇZ{Î[’BÃ2ßûOgÎYs].Y¿ÁoXwV|†o§uªCSÅ Ž™:Ì4˜]’6f!¨KR‰1Pøž8–7u_e­=g2EEGïÉ?5¡»1òÝÿiy¡Yþ…ßwÖ•@÷{nÞÁMèèKç|[³¶UÅD]‰ï›ÆÛïÈ)Z¡zÑê(Êú‘~Д[v;1ÙÆ©^\öè™·“¶õxC/¢êÃs|©)mœÙF¬Ã‚œùéBf<¹e½ZW½±Õ÷_ºóΫ;ë§‘¼Õ¼iïÖ£Ëodý׿§ÞdÒó£GÚRö›µoûºòwöã‘ÿ ½ø¥^gÀ#ð ¨%Ç‘2üŸ|ÿÃèøH)ÃeI˜„ÞÉ×±†žaSÃvÇwœ¨­]Ay hggŒn}Æw¶=÷-Ò—¶ûÑx±Vû…ÖqW÷DìÅD«ÂžfÖ%.ï5Nã¥`ò¢?vî ¾i—¢K¦G‡‰[CX›îDSE¡ßåJ÷ö-ý"Ê3‰“ÏÒKCç“nÏO|4L‹ó øŽ‚CWØ‘Im-â&]qKÙ î¼7Ûº3sÛ3¾Mãú„öõâ¢-©³d޾tm=¸õ¥ÞJ=º\­'?%5Zz>díGf$ÁNÃi•£V;4v’è µ“ž­;Õ6cèÒQ¤¡èäZÌp|à8ýIJådýÛðåÂÏÄ÷h%[ 7¾½±›ðcÀWös5àÕ…ïw÷•)l¨º®DJE_«Ð‡* §í kž¾0roÒMÛ?{[º\†5t߸õäÎÐUÏ°Ñæº‚¥Árú\9úàÛZêWL]qWìKÆ;+g\@…ÚY­ÅÚÖçM ÓOÚšukƒ²ÑÎQ\†÷äÖ•h¼`2ý;©ñiwÑ`)ÿ¥¾ÅÆW¾¬w¶¼cmÍ&ú˜hѺé¼y§JµN•úXûŒÈþSLÀxkUIY8&mO(i¼z Ɔï…0×x ¢+«µ_©˜ôDQ+…‡7}ò8ŽlU)1½}ð¹PÅ*bzK‰Þ°Þ'ÑÖœKœS-„>ïm£=Ûz»èŽÞªÃ”ñ,–šU/(s+ô™P®?mîMt…áÚºÃM½é@aaî ç]ð®®'¹þ0šÁRãâ‰w‡6,ÛrÕ©ï“2EL/'ÑÆÈe›:N)‘Ä´ ä29#7ÚqضƒîÅEOXM¶ÔfÒ°í¡‡ÎP¸Öº ÙX‰N¢;d‘/5k\8ÌÙu†Rg±‹\€G®þ¬äócÏùñÑ4 Òõ…²é%á“…÷–¡»,+UM4ŸµQ\4ÿ¾Gúð %÷i8H €Uè&šF ;Q¬«byÆD/|ôѯ–_ un|Z¶uÐ[lôAåè)Q%F‡Õ|…ü|cYÁOýTUðóËÁ̶#tÚä¸`´V!²n/QÆZZVÓuuð ŸÞ+[–q·xšÌí=ø‰õBã{¦ºBG >¸Ê¢ùƒGMvÁq•ÆK|gLt}Jdi¤KpcìÕû^ø‚±še;ÑtÚ  «qå—ƒ= ÐúTÓ#%ªTI7dY„¶ÖêòàÞÞz;¡ÂÝ1Мq¤¡?PŽÜ6~¼y³á¿ûÎS‰ß­[íI¿ÔÝ¿˜ëÊzKãÑMxî'vv¶9d…`þ`ɵÎÈ×ß²ŽŸ½ýËðîM]—, ìá ~pÝ0ßørá"§+Þ4¾=xt§:®ñ¨ ‡'óyB†.½@ì¥R²  }8‰&*ª~ˆ.£ð7Þ¬ikqÏ¥.o{àíí¤€) œžn½³_¢Ç?Œ.vGYjŽnŸê5MwuÁåæ}ým=¸g\I_êôÛè’yŠÁm„¹Tñœyt¦H|ôО;¸…j›Åážqœ>µmWm1Œ¹uáÆKk’äÆÓž]žYÒ[ðMõiÒx(©Ó™³Ç.Y ºh¦ÔF˜ÁVýžóì^c\¤DS¾ßVù z'ºGþÛ@³XX¢iVmG<7T”Hñ¦­ ?èþ3t‡ ,¤×ßgÅwBÇ:7ÐÆÈ•tg\¤D{¶çölËö°Öš–5ß*9¬ø(-‹“,>hüÜËúJ–õƼ‘';ôghã¹eÛFW˜vþŽm¦¬Å6¬¡kÚfä Y¶.Ñžm Rm½pé °î%‰^Ñq›¡—µØ<ôÉ'<…dè5¾ðhê ï³] 3Vw¿#Wth ¡O|$?Í@[¶íåhZl£‹¦ÞÇPŸVô÷…‘;[Û€q¶Ý 2‡^:¾ÜŒ`|ìiNû:}ÃzDPèKo¼…m¢=ÛÚš6Dù‰ï´£[Ó®Šjz—rÖýR{|çÔoYž€7™!-ýÐn3x:öŽ“HôÃc53 Éᱸ¤ŠÞ1køLrц»= !šDŸßÙŽ63tkSWsšzáéXIžCï°3ÐÆÊ‹¦ûÃ|œIŸø¯4fæÃφ-Amtq>ÒY¬Y÷|Þk^ §ÒËôJ=UÿCã»S büÜÒÓÇŸ™m{a*¢?òêØö²¦[>´éY¢9—|ëÞ%´÷ÜÎë–mÅHé…:Ttœ=YzÍ”e=—õÂW<8室m¼5mkGO}OzI©2•Í‘gÎWEp¡/ÉÉS§-ehèuôEG*>·šû1ÍÅyŬ›÷ ˆžØtÎ3„@ƒV«K·ˆVÏ,UÒˆz '÷lËö°ÞøPÍÍ=­i}f"i:t¥éÅj‰(ÍÚ&„ð7¾¥Ä‚g]7R¦â÷[tHÐÎãܺ‘ÒüÏ.âZÑ¡«[ë±¥ÁR,•Oxã±a×ú»±·–N þú}L÷y‡Õ½p…ÚVh˜úœ{X¶‡õÜZõæÔÑÖñ…'y÷t‡¾ðÝl/ëÁ—\Ùº'<Ôxê£sô{¥¥ùév©Ë»3 Ïâ}¬ÏL‘eê0_4]«Ù6¢ÂŒ”ˆqg¥ŸÇùÊŽUø{gοƳVœüTkäŠÕÑCø4kä*æ ‘Ý“1+ø}Ë8ºØÑHˆ =ü‚“Ž_x7']ÊwôÉG1(¿-”~®+ðZp QÖuZyñúé¸6àÈwbò¤i»aÒsŽœ"4mÆ;—ãFã}GÝŸhÅö‘B;¡H!é`o9àÎb_Ö‡º"e‡«|NÊþMy&<ò”0¦œn”Ëk<*Ú¦·ñ#o™-Ö#i':éB+p…¹Ô¡o|YƳ¤„Û¶†.á=&,ô¡¢Ãi»Â*É´MJŸq+eAýÙ#-µÌPŒ>ô}¤Ä¶ð®\E§;c­Þ´‰+ϤTsè ûœÕ¨úÐ<ó‘D•…vž{¨ZŽ.UwäzZÏ=MÛgÊÖD7X?)ìE;«|áÁ£™~¢¢e²†B¿û"½!„,—1éÛÛÙ¶Ô­èWv¬I—DK%šJØIÏ˘ô&J'Ý›Âö¤§“3rÑI™›Ð[R² ]yÃz¡ãRw¶¦¿tÅßXkâ<ÁíEoZB$´¸Ë|è{C]ï|pÚzýDT7ªˆ©íÎ[ù%záÀp“ãÈfBGŽeÃZ«ÙU„U…Én(,!t´0„ײ¦j9yijýHÏð¶8}æcoN²·ômÙ–Ä$u7›jí}÷„Û±©Ê‘N#÷6{*DÁ9ïªw£Œ‚ÞLtôýÁÓ–·Qúʺø+p¹„Ò"å’ ”¸«v¥X[êH+Ѱ=UÈKߨ´Þ˜Z-U¸%wµy¢Œ€ñ8Qº!®8kX$tllð8âLSÅÈB^¸ÎMS'/úÐjØDó”öPˆ©+ ‘-ÌÿÝšµ³ÆZ5œ¹âdŒÎ(tì©ô}kWdlméA8Ïmí©cr‘€jZQõMcÙCy—I—K‹ÑIWêcÑIWÇ"¦üv®(½šL…lXùñ‘¾¿ÏâÌÚL>"¶)R NÎÆÛk$ºãØEê¾Ð½iÆExBºó‰ïëÐÆîBãîyi»Çã3ô¥ŽúMSwš1šúÄiTvå¥ ®¶õˆkCoe«8þ 4uù–ºPöÄR^–æ]Ÿ»Z/\Û ³- bÑ‹ÑêÖBW¥; Ë.ñ]XÿÛsLè–¾ÄÛ`}„iŠÎþ7”¶º¤J÷ŵ­ÏDhê´­cm.Çùñ&ýÄ9Ê ì>hü*ÁH£Ñ[eÓ”žº-”M·N϶áBÏç¦Ëe•DRšà´ôù_‡+þ_zÕwÊÊü/œ¶&ϱO(”ÆžXÞJ‘Ò=&Ð{O»ÿOi '9^4ÃÏ;½§ìÉ»e&zÃbVýÞ‘zû€×ÆßÚÖØéz=’w€á€­"J>Ù:Qé´¥„ ÝbÞ»ø‹¦.ÔQ † ï¥íŠÏÄc(T&zá;Ò©NNý¨Š£›¸LJDpÏø{"Ñ#åèH¡Tgä<Ïy²;ýL\ô¦€=±Ë|º5çj+BY·Grš?ÃÚ\”™¦ÇÁW™†P޶::Âiö(d<,´AàHÛx­)‰‚ÁmíLÊÈãµv¬µ– "3¶G2°AE¢7ôñ¯íÉvÅ?Û(òÛPüþÚ.,jh!þÆÝ‹-¾/b¦ÿ¡‘“|Ѱ6í¢asõDGK3”ØxÃ<Æ&õŒeÀ‚½è*ð!¦3¢Íþ/!?ð‡±•>¥dŠŠ­/¼Á¨ü…?‡•<|©1o¾ß›üfça“Và»»âUsœ%[kâJŠ‚Â5ÆËa¼€ o›±Ô®Œ%ýÚ^t”Š¡Z„SIõ‹ægb©\tø|ÅUMŠš%<.hô­UkÚ›B•ˆ“ðÈýÁSµtŸ¾ðVYKšj·|Áú¬j¶þ/ìÏ{1'|ÆÛ t6B2tþ~m¨<2à+Usèà—>Äx»ðþ°:À‡¸úÁW¦€?Ü•õÅT­¨é{ßCy‘€+ç*4ç:uæ¤Ñð^ãé] Ó-@`þ ÆVüXŸ,ñÝTày#':Þ:=\kÓk£{Eí’óEÊf ß_]ã©_ˆW¬"¿ôÞWÕ÷Õj\ôaõ‰6œ9©5 |cMãôtÅ„ÁŠ5-•x OÍ=âÊŒÑ<ÊPî|ú¢[ÞVé‚iÅz5†Æ¥Íý°”ÀÓVµ=ÑlTà? _ø²üÏznÌtÖÕãž)6ë´ž[28¨ðà¢a‚&ÐKN õ=[2Sð—bm0§¦|ÛJl¡¤y¢‘gR£ ÛQǾñM§?ξÚ3³í,Õ.b =I§ÍC«ð€Æ¢¢ß™¶–tÞºµX§7ö ‡‡BOÑHz"}Žø¹ߪêB5åÞx<¦‹±ˆ}[Ÿ‹·?ªj”¦9ÆãØÅyî@Ãê…@W\-è† .ºãÇhNâH÷‰~eQ¿˜,\ Û t^ éZ“÷„8ð¶i.qJ°‚Ú6ÑÍBsyÔ‹ž¬QÌEÖÌ;ÐSYnœj_xöŒ¥ù°)ùeú•Íô9D½è‚É9¶í ZÐLÜT ºX—bëÔYWmõƒÏ2^”Ë¢AZÁ-ëï¼S¶ÁªÞØ›eÜE¿«&á–Rît[Ú[ñ+“0 ½glÝ©i¼pëVL#· ®–Ý]tÙþ½,Û?Fœ7üõÈ9;"ú§¶]tf|ä/‘ÿ}œ‘ŸÇDGâŒÆ­¢S ¢Îº.¤ nÉ&Zä±—Ë‘1ªjºhî+«)uÁiÚ3,ãÓšô™´dî<¹y‘~S¢MãîØ+' ôÁ=…ZɆµÞÊ%ñ³ RQ3Éë.J6“„Òø âEäíuƒl|Tn?F1+"Á?é'|^`'†¦®©¶¬ýC³óPè÷V‹W«7òãͺ ,}gÙ‹κ*j” Qø†š‰Ž‡{D¢Y§¨n¡A7¤¨7 a{„ÃîÓE­â¼Û ó ô¦Ï|-V TÔo­Á„@ Vâ™°ê4ÑfzMĉ†í®Ö¤W‰/0ïIèMäEMË6¼'öoj_í3èÈG*½ÒwvOáW*øÂgBÍÈN?ín¬Ì9៾ôÉuN›2&zÃwèïvM*·ãu¸k6l¡~¹jtè[µpŒ7®]ùл­ÐqÉ¢î׻Σº†¨Ëí¤Åâ8‰nø¡5ÔËá[¡µÁÀ¾ª¡bͰ´gÂÁ¿ÛÌø†™Í•èe%úB&¦t‡î<¹6)<í ÷n»h(†é£ÕøžKídôcMÛñ«ˆSÔåZ*_¬&º:o¼7 Ý­‘¬š„ÞgW.‰z1‰¦ÇB²ôX­×- Шã™4•Úõ4F¿²*®·%'†ñx½!í¾„úçáî×R] b-5a9D¡„ÐS¿± $š[ªêaB/ÛŒCT"z7¸Z‚4˜¸aS÷ÖàúÃ9ßgœKRošó-WÏùTã<¸+&‡Ú>ÖU¾hØÔûMw‡DÓéh¥ÒŒÈi¼FTè}ðJ=jœÇ8ÌåJŸÒlqÈN|«<é¹ÐŒÈÙ<ÔhgSÆ1¾pôÎ$g0ZmUþ}.¡ßý] ¥g0ÚÑ…Þ4P•*¦^S½*ul­Vå[ùû.)ÃÍѦm>çïIp ”¢I4e Wå™;¬~ú<0û&'8_èMôAõ¯síxΗ5çËšóe­sÙFàY¾tX•ZSh«C%—z™,ØVcKÃY¡ƒ_ÈîÁ¢ýP™þD¿Cgá®´=àM¶^‰¯_Y*Xm¨ÐïùÏ<—»qô̓_YÍz¸\ªZD3*HÚ^0M[?Œ:kªrDÝK.šFM¤5yy¸»T±IY^^è¨P #Ÿ\V¬Þ´¼ƒ^¬%Ä7ÐÑ´…ÎÚR!º¯)BÇÈ7UÒ\f$ºa/9Ñxg:ÖÈÏÿÔ2ð oª ¡¯¬©ÔŽ^èR’Œ…Éjð ¿ézÀ‰nPï½JÖ˹èuxä=Þ É&ºÃˆ9­®I¡1›*öF…ÊDomªWÏŒ~ámJy†º‹m§X;]0ÛZ¬ê•ÇêÝ`¹¾Ðq†ÓçNêu^º:·ÐpSWv¤ë7çí*šÁ7ªb¥Ab^½Ê^Ô]íUOÎXÓpþ<øÎ÷xÔ×Ð7´ÑÒnLñ3©O'¸ñâ¦÷ìÓ›ù/<»O5jFöKøëá/néĈ-wð•oVéLzBfV+œpgÕ‰0Hýª¡¾vtÑ¡ùÁ—î 4.øÀçÛ¬²N}º ǃ¯ê…HWìl‚3~ÂkÅû¤à”Ìu[Q¬/œÆxWP—ÁûáÆÇÆgçïí×nÁo÷úìÊmΩÆïôs:`èÙ`:±© JZŠÁxØF&Ñ Þ/¤¡þž‚ŒyÚ‚Y¼\ô‰²`e¢)_$Ñô8úuÓm Ip·ÀH¥ÐŠx¡ÓÄ6~$šA¿²äŠ°Ê•¦*Ê ¯ñR:T96Ñ^)[X=oÊ/zÓ|HS f—ÂD/üÂKW>‚ù‹  ¼!¾©>s §GÆáöTÖf´Ù&¹ßA)â‚¿×vEú}笟TâHL¢™ë¤Ú‘Ò B$aD²›&=….ãÀÐQ»ÏøÉS^ºn¦ªeMÕ=~Pt,7ºA…qþ‘‡8õ‚ÂBGƒ:ëUÁaÖÕ5Ñ+‚ Ý5ë¬â¹ÝBPÆ Iã­3O㕯u‡,€òypÆ I4 ï*«o\°RÏšêgY*â #wÐRc`Y…vf-¹ã_îjö\¢ˆ0Þa†¸Ýºc|šéfÉÒG‰®|k“Š=Å›²Ëô,4ÑE”jêýN{s4Áò¯TRâ –o´”¸~*tìJW²ŠŸDw¼Ö³ˆÏzÏÂ:ôžEø•gñ1Kë ý~+4v¥ÞÒ‘¿1ô¹‰.ØgmÝZêCA"ÎÚel|ZkÝC/ QèQœú물KèCÅ Û-]f’/-”§ápcT½?ÎÎÆkÃŽ@?R Dz-"f‡öNL´1o5¶'zOÁ~V0è5ÄMÓúMÍø‘hÏ6Og›‡è–Ò»eí ¡ñ—DÓüU—b=ÝÒ»å˜Ï=L´È»tkÖæ’]a;ûTY šuÉBºÔ§:SÐÛ]§ê-²GA<¦¾¬ëU¶ÁG¡šË3¹¼¦f$¿ñ£.,4›Ñõ¥Iuž©h$ºñóHÚÌôv5ÒwZpÚ†$ïYSŠ4n|g#i°ô¥ >°ç6¤‰I¦1qÞÐ݉›P¹¶ýÆ8‡²gôŠ4Š5o?Fó­õ×#ÿZÅ,xƒ©ò"hh\ð†}Þ®x*ß`šs,Œ¼hЉ‹Â\Úñ'/H?–.‘‰žØéM4SåLôÆôÄ¡Ì#/M{Sµ*YP­»ÿPåºDCWLJ7"uÒ$óÈ.çtkÜ:Å)ákˆ¹D cóÎÏê,õ~eô;™ò~ðe;û¨Á}qŠCù¤Sñ:zµ›÷2Që_gÖT CÓã3õÄ¡ç4¡§É¼…ð#› ¹áåÒöò†É϶Y¨PðìÂ>ަ3&ãºJgÞ’÷uCÁÓ>½iŸ"‹Q~`j[à庬=";\1žv{s²&tÆi )d9xN`æIL·˜m†;c(ôÁ¯BáÇ»žLÇEèØ¡èíl=¢¬Cã«8ŸÊRõMhØh˜áƾªe¼ZÓfùO¦íæ¬ô@S­¨oضÐÖré.Ü»|^Êið‡®Žt½Éu¤9¨Õ­¯txO®v²Ô4UAü i¼Ð}ðdâÒýi:÷œDSf)ˆBóók9ÅÌÙ£›–•$ši¡´ÛáïËÙ£›º[U%tµÉë²Ö&‚Ó¶gÚ¶Â?ÔíÛÅyÑ´Ñ,NÀ»5öP¡è*É"zÏØªê¥ FÆ©*H߸¤x]ŸZЭâ$¦™Þ€—†31©°E¯äÙžýÂöä‹ÝµSzkÖiKûöQ&£ÆÿetL%ûÆŸÅ¿S×x” Òï¬Kôœ†Qv÷¶Ú±¡ÂšÛÚ9]Ê€^ï¼o¨.øáTâÏ›‰^8[¼§eû_Fk­ÒÅ–Í\»”UsÄáb,iWÚ?\èàH }U­×^ŸUÓK.7òJôO„ÜTýDS½0íåÑV 9ÿ4zp|¢t}zŸ^·‹’?hV^óô»ÎY:)mÓÖF‰>OÓÃß ¿‰ p G:„…v¶„x{ØÖ W!=s„ÆözhGŒi1÷PÚz_‹ß}¨0ïÍ.Ã]Zñ¶5JôÓPýêÔ3Î[—VüÀÞCiÖÈ›5窯e²áösw5.¡ÏW:ü™tNSLãµÀaO…ýEñþàô$-:èæh*”èåÖ?#§ç°9òÅ[+ +ÆmHã¯õìŇ¾iKômꦗæ¥ ]¶™"MWC†³WBGO'ºT=ôqÑ4ŸhÚÔºÛ>¨¡pW]Ã;|îªrn¦9¥ò gäRf¬õß ŸeMßXªâÂo¬4žó£ä(éòÎ9Ó7K´1òa}%6ÚùtÑ´÷X¢'TžNôÀ—²:­ÝaYkÍFolYolÇŽÌ2Œ4+OtÃq“´Íˆ‰8]·õÆŽµ;×vÃ'p“ßB/áM‰x² t… £oØ6Ðj`ÅÔ5„Þ´åGÚ¦ <»_«¥:{K«ÎWÒŒ"l¡wåï;ÅÜ,Ûtgʦxµ 5i¡ol(DOƒ6¹¿-h,ºÉë¡wà–m˜èjYÚèÓéÏ8>‰ž8Þ’#h˜*m3ÙŸÏs³"fµ~:´9p¢·­ô?+C: Ÿ;IðàÉÐ¥ª„^ljÖ·d\X)o`Éi8œ}¨£Ú: aIÉÂS)8ÁwƒEȉ®P¦ÀFOÍH6ß±ÑËDGž¦“»®d…N›ÐÔuù)úü=øÓ¾H³‹]WQVD‘hZqô9%]ôäÁAôx~‹PªÑ¶]|4+®K4_kCdvê6}ã¹ t(T²ÖM_:Ü\†ZVQßc$‰^8–œhFNî©cßq(ڇݣÕ5“~㙤ІÎú&t)ðópò¿ØQ޶–óuÉÿw̹™“¥/<[¤Ñ•n¼Á&ñB‡.«Wé¡qè ý—è™#/#ãUt½¨èŸ¤º"°6B‡=ýÊŽ‡r´™NtWóî½$š^f~Â/|¦üÈMãð3sð}§mV‚Øãûˆ}ß*3Ð ³øç°ÖššR_wŠù@¯'3Ké:Ÿ¼+ŠºÆ£+UÌJžÛ ê&šV§røx¥&s‘Ú>Ê^Еª€õ¹w‡cíkÇú¾uŽuºŸkΙÎñç¹Y#š¹`#[µgÖ–x”³±Ä Âe‚ß@S–ìÒU”f'ß;I->L–îd”6yÑÔvÿ-šd.¸n)¡Lc›KÇ =ÈvR›àsom.ôL4S•ùŒœ êtÉ Ï-G•ÉÔýŸ@C§i‹\L €[JÔ½ßr Ü’M]®Ð ›ØÕ tǤ¬m]¡·\ZñyôÑ}-ÑÔiJ úÆNuÞØ©Î;ÍY©Gá=ú…ž,{ ³¦/”Iõ«eC«lÏrÖy*Âà÷½}í(ÿO“M'ûÑÓ‘‹U…¿’Ã)|Cš, RtE€4Z-‰¦!²šE±Mª*2Á$›Dwø•&ù4$Sá½F‘šMe‰…ç9‹iÛXª²ÍH6ÛŒl¢«XðØž,¸³Úl4”Re¡Êhºî/ðBZ\4$ŒB¥Þ©":ò ï¡“LAÅàÉÀO´Èߣo¬(ÔÄÎ`•b‡âÜ“‹‘p:¤*辘ÆYLõè¹*㊓ài3‚E#¢ŠŽír¸ø•M¾¬±{èã «6V¥“èŠý¦*Á(V4¤\@ÛöŽ«{@÷¦šWYm¼±n¡%¤ÇjøÆ­E§GÙEÓYû%z9{r]ÖjÙ–íãØnÒŒf.¡£õýÈZ•Γäª7­°ÆWè Œ21šD²Rd ŽC'#œÅCCÕŠF ­©§iTžld)äQN&‡>ú ÇÎú§ñR  žÔ¢ G¿^'aöxçt±÷ìÜÁ(ˆ#¾Þvä©n”n\2côN<–óÚ†÷Ún<ù|²/´>«¬7¸hfÿ)|xðéÁE›eõÊB—Nî¥×’£ðLý7mðÐéwáUÝfüZ“ÀB÷)¯øpZ-/¸Ôº´¿Y¥¸Ðñ­Ó{ƒà|‡ø³!©a'0¾6Fbý9\úáxâk¦óZÞÐ¥é@S:îüS=ÞÐ}x™8ÿ¸^\ø¡²/¾ñêÂqÿ;ßxóàÝùV³u4ã7ª8ØSpäÇ[¯‚|aÍ^dtÞ¢˜c<u&k5Ô›Ê.ðA3 •žÙ”ë¿ðÿÂÿ?á¥ðfyÖ—®,¸5ƒgÁ­ûðæÁ»è¬æaж@óL3ˆÖØ ?Š‚³«×üÐàÌ•¢®,0ÕÛ„².=¡*‹ºžc$Sh’m*%K›&Ì+EOûë…³VE|`d´Wl5 …ÓV•±a9øDO˜-úCÓik*t‹-uðñ¤M:sAg¤ß:ÓXÙEÂß±3FÙ ³Îغ>ÁãøµjØVn³âÕÚŒ:¼)=[ÚŒ÷ƒf’0B¿ÓF×zëÖ¤ëH`r4SZº2mmtú½x­F$î"@ ÷¬¿Î*/}ãÛ‚+%Ìg.àO‡’Y3˜¼…ž˵Ìp@m¹)t0Ëáw¶‘[Î[ÏoI]øÆ;»àoq]ݧé]£K6›e ¾0íï+§C_&:âô¢ÒEZÁ«5ÅF Ûj%švYW6“„Žo.ÕŸdñC¡Ïƒï)’¤BeŸ¡3 f}9C?¦Bg8œ‡Ÿ¥!Eø¨ö•ÆþĽaö\hck3ÑMÓF€ÕßÙH$<ŽÆ°f}êvȪ8wŒ/ ½­/eë‚F̶FžñF¦ð&¸g|OXQø Û¦@çÕä£÷»qœå2Ÿ t1FÖL"^ƒ•Ö :,ëOxåGñïÀ‹ ¯”O&¸±Ü§Šo=>mÓ.Ôi›êg¤mîF̪Öô8•ëã ýN«·žñÈq”ÓåÒ´ÚX!ÉgÕpCR‘©SÛzPS\0šA›:“¨³ŸhF¶:&NÛRE£Ð m ÝD:S\ÙX«Ô¸å¯¯j=¸î)4“´¤±Oãa»C!ªo 'ÞÛÌ9o*ï§ï»©þ„ÞRÂøÁ×Ú}:$šæÐÚ§þ3t_ÊÑ]ÙDwïÁ“QÎÔb¿§!þžŸ)Cü^ú±H9…•á ­‚RúÚD†§¡õe…·×ôf݆NãY™‚£Œ”%ò^1jÅÍDf”1Ã@SÉY¡£»"=”„fÃ9ò‹I?ÏMûþœŸøñÛ‘|£ÑNÁiù±ô…Œ„ë:Ö?É$7ŒÓžT)¥dIâ‡jäAg=jmÚÁy¨€¿Û: ÝJÖã`ªØæõC(ûJµ: 4 …p“ÙBâC“1rª,1U&ôÎú†>P*4ÓÓôEG⓽¥ãJ's ºª¢mPÒ8ßSš†ýÒ6½žn]OYöûÎ(78UVpÔo÷¼Óy øÁû‚³rm«Ñî®·¥t}ç[Y~x"n©ß2%’©‚ºöà»FÔÑ-& êÚÂû£C…ÒÎNqf=Šùœ¡WÓ¸;ôНQ‡X9÷>àvs¿ð Uf8_–õßÃ>¿ï˜Ê$xãL×{§Qþ“gÍa~cê*ôŸ¡gÇ»ìà 0Þ©žþü”-Ó½JHZ›¥¡7œ§xï×ÎÐÕÑŽ:S¾íŧm:õQþsÓéS  ÛF '‰Æ³fœ¶þØÆ¤ÐxwY±Î™XÐç¹YßÇmüeïEzZ MÕæmõm+ü‡Û¶‡æÌ’DãïûX+U]#™’nHACûšÐ{ÂHõR“’ “õ‰î˜»nƒ,5Ó1æ|[³&4 œ$zBbƒ6üµDo¸ËöCeœò²)ñ ŒÏ…SáAVÏ(tY´ÝtÂß±3¦éwà܉H)2ê4¦˜ ~„‚ÛSð• n¬ÂìƒfÕæß°= Hd¢iéDNú»KPnSÀ;ÕÈNx]8ǨC%š–ÔëÊÄî[ÀëÁ'ÓTDÖvâ_sz½`o"àï§JSfo´ÑÉJñ½Í/þ%ãú^ã‡ëMÀ4üôytºj>`CÑ oqO5&žÆí¢MxÔ^SŸ`XÆ£ÙÝ‚ZKÞ"HÎáÆFõ…ÁÿÎúŸoÛ³~lx0ès­Ó­ê¨Ÿ*åL¯Çzv^¾§Ë&àÆ“òt—ÅÍTåÃÆlOÕKz:.…n™u¢+¬U[ÕK¸Ã/µW¤îØJa¦£ü x4ª¡O®€9Þ%~ŒnÖs ¦ðWÖqÆÛ4.‚#uþW·&ý hZ hª"óaÖþÝ7F9)KM)ie§cXÃ2>bwÁ§‘g{Z;útm1_+FŽÑª†ÁK5Ñôm' —‰xä™býRVj>>°ËÞºj—”W²Ž3mûq²;˜“º­¸kJ.Òû‰–¶*Œãl‰¨Ÿzô ßÊ8#·¦-š¼PÛ1tWkäºÛÐèÕ–¾;½Û¤d"%¼ïtt¡›œ#§È6>ðþk4ÞØ<ÛúŒ¾pÇøT{èáÚ³ýK4•‰\QëØ^ÖÖ´$Ž@·¦åd[zTt©&‰>øVe'}ðÍÛ gì'+˜á¬½è3ñ%ü¨¥HyTõå§d-GΗWÜÆ]ÛÚ™5í|¢ËúJ¶‰>T/ÿç¶±ÃöçÞ0¼c•9¶OÁ¬´sTß íÒ,´\l–‰ÞW Û^‘™dLïDó7VR‘>·‡>ê?HýžrãõQT”¯†¾á–ØNÜ F/(¶³¯Ð«F:̨ËV•¢cú)ûªíУ¬VÞÎíM§-%¥á'^³›}îùVYº¯f »M¦mZÜ™èK)rä´È–^΀ez‰>¹(ôž0$›h*ëœèU ½`¼Gý}BM‹¾o‘ªðÞ’Õút¥êgÙ´Ý-ÛÆW¢+›úµÍ’ƒ;ªÓœ‘ÿM«mìîȃTͪ—w,ñð{àƒ·G«ùüÐ*©ú„|ðì\5ˆîC+΂iF/ ¡i«ÞƒK^™•«léRïlšhgä®í¨=¦Ûr[ª§Ñ춸`~¯´©éŽ-Ö£/ì«èUés¬·–m†à¼õÇYoÿÙhê;Ù¶ÕèÃWK±Fþõ¾«MÛÞÈi Î¶;:E[gø2ºà#Ü´-bÖ6Nh϶sþ÷a¹>]"¬@Ihçɇå*÷ù?õ¡MR·ð8«§åU;¼½«a݆.¼bµ{ë…So»‹`Mò],'&A§Æ’{áõ>ÅX½Ž„™Ê»Þi f4ÁiP=àeÀn*þà íÈÊW:ñ3W5¾RøÆ€FˆžTHÿüÍÁ¶Ôû~/†àdÂ_ëŒ?{­|À~ðÉ<«¬Sv@À™o’c£ÛlkmHšNãσ÷š©";&úxw|4O¥Ñ˜øs¢·e»ã]Òùá ¡9,ÛjôeØŽB7n;ä|'Ýc†CšÓš6‘ô˜ÂèŸmèNÌiMºXöôÖ’hf<·~â®ÄÐ3xé´é< àDãI_Öþ`&kÉÕ¥I‘ Ç;£ w¾Òí­…¾5I+ѬéV) älkWO4ÝXÍ”•öGå§PãÅqdüºo;*ݜ嶥ÆI¿Ó«µCŸ¼ëŽAùr;¯(”}}á¦uêò ¾1gî;ÏN ™¾cÝ€ïUsv0%' w÷=½±K»†fä\ãëÇðS°+*.z¶®itŸ:‰~÷H꽞Üa¡ÏŸhl»ý³h• ÐàUèrx¶ ŽÚlÐ /ÖgX#ÿwÑóŸE¯_£Y¬ïئ1ýßÏÚÐÛDN»÷mg¨kûwèÃÛó%º@…¨}eXhøè¨À¿±cÎÚ¦ºÚß°MÑÒ8ijö´7ò=ÑœǶ7ç,möã‘«} #¬%šî‰6ÖšáŸÛèÔÍCçX¢7 4&ÚùÏІ‡-ô1v×öOÑ2R?¶Ùéoܸ—ü_@3 Æwlã7öóY3ÐJ™ÑMÕ3n\Š„Æ•Ð_°ý_ôÿ?Ú¸R í¼oýËçÞ‹EÇûÀU"€‡îÝ© ©ƒ{.öÈ+T?RBã¶‹’ùôµÑï½fÀµ–¶éB/ÒX`ÕWB{¶ÿUt•ÐüJJµæ<›¸¢¼¢T¢ï Šr ýÚÞð^ÔtñF„vÞ˜D1å%Ñ …N”0„Þ?µ-9pVEq¤6Xñj Ý;n;5÷è®XÕu—¾ïÚ¬‘ ½xQ鑸G7+ÂÖŒ ø ÙšmÅŠšyhÖe°N[=!§¼*Vcu¢(nÓ¢ÄD/HL4Ÿ¶ÐÓ(ø8Èç¦[¨R,X‚+´Èhpo¼ÃzÄ?8+U:WÞO»8ù4sñ ÛŒY”hã•«š€FÙBZâ™°ÝÐ…HÂ˱÷(ôbèá—&(ënñ ㇲê¿aÜ‚OU-3µÅÿ ð2pž0”)¢fšn°K :öÅ[ƒI»Æzò#jFLø³°çêÞð†T2é…~Hj’œ”ô :iÜxpÛxTø1éã‚ ÎØ›µb|¸7v­?V|®Ž ¶­2;ÖmgLoµªj›ú¾C;û·ae3Æö|{Ÿ©•KÒ}¦·Äq¬YWJi«lÓ`é8\Ë.móõ2­dˆVK†VB‚ÕE íÙŽ~vð#“ÐÐÀ7Ì §Ç‘à<‹ô ëÿ2üé° Â7¬‡Ëo,Y*;}RªÃ6J =~ÊŠœ×yt_pnÞHý`ª÷Ö3ŒGoz÷Ùé%u¦Šà¤;]ó–MŠk±²­kݘùæmÓMá4Ê ™Š².V’¬ 7•ËýÁYýúI•+ªþ“pgÕÌŒNÐÍfzϾ¼Á¯xí‹£¥AHWMDVhéZÂ×~¬5»ëkÿ=|6œ_“~Òƒ·é¥Žy”o±¬›†¾0ÉeU¾©¦ô‘ Îû½PÏ@z:³EÖñ^ºù¹yû~¤SKóƒxì}§Ð,ݤC[Æ|1¤i.¼Ã2¾;xª~­¥ÙÕ[6ÕZ´[ÁTJrÚWhÖ0ÎVÛbžØèXï4Öòø»âè&½³oëÉváÆŠÞ³}딸­ úÎX²?Óv¶Ö<õÖŽ·ÍÜxé!/Óqfø´4Îá‡êˆK_&móëÇiÞKm˜É8œ+Óé´-ËvJ@Áƒ%å íþ¨äÞv¢>ä…Z’@(Dò‡Æ¶‡5kS}€ÉjIô U-ö}eb@¢³OÒ2Y«‰ÑYúÆe;e?ˆ‘è‰ï, øZ5ÑÅDïÉ£oØvÐÕB·øÂÑ/Ñžm…%ÈAx‡Î·¶ÂQmmÊE-¾C>Ñ”÷Ûm6F^­…¸h0tµfÍZ©ÕrLô°ž[R­Ôé ÛÆÈ§…N±Sê|ÔäøPãçÿ±wf¹²ì6³žŠGp‘ê¥ùOì&ƒªå×_P>°_vaa#@uIQl‚ÖÐuƒ£§M²Ãya½©¾Õü‘¢‰7ë"lªCÉM ûÚ:«m:Ú¥-ìí»hzôv´KÛÖ¼S6ݱÓðm=e›¥²á4JUtqv,¼jÝ26»z·!þé+Û˜·e-&úÀ'Y·îsäÖ Þ—µæ.Ú™·÷…ºhçQ•U'ôýkVàG6 §êáEŸÁÚ#Ú2†Ô½þGstÃRMÃRcY‡mXßè°¬‡Lâ§÷Á°¾Ñ×Ú:‡¥c\´![)á(M³+‰ÃЋÑM¶ ô«ܱLX£²×ãÈ^ê`ŠZ\_4äÏèâÜÞ]ç*µ-®êŠ^'¾Tcþ¢ß,&ú7ê‘|Ñ¿%wq¾1mÙ{[œDôM•èIÑÙ-—î÷í@‡-;·²Tí‰K|}`’Ô•½øiI4]s¡©fÚ ³'ÚÙïeÔ0¹K¾ßA[ÎÐ;³‡éØ·rΩ»HpÈB™ð[Ç_4O ðgþ×J÷Ür7í“…=tè'Ù'¸ô ï„›­»^?G=’QªüEQ޶a“u¹ t6û…¯øÌ¢Ò‘‘OM§@W–/衤¼e#”£!|ËÔ☦ÃåªaÙòÛP›3R¿Nt•¡Î#h¼c_ÍV­ÄzaÙBó8ZóD7¨“} ÿâhcär¥³˜Q¢£(ùC³›ìƒfùB™? ]­“ZÃz`wp¢ôåÈ+¼ J©ªÞ CoÖ²u½¡Z´Ñã‡è¬˜¡ŸI¦ÒÏÄp9%zò£:es1cSQ“YÓ9BT'»²£\†½«rè¾£Sø»êìAyá••X}à2ëßpcÛ¢áPe·^´¨¨ð/¬7áçÀ Ùnì›Þ(ÌqTn»ÄÓû:ä-½CïÜ`VÓØNOŒž8XO¤»,GçÕüüNë±®TOxy’n[t½©XMH¸1öÔïô­R¤&ÝX¢1|Àï¶Á/½>ŠüAýZE³KßYUY,/ Ñ4Ù*Ñ4«ð³j̇“èÊx\.úÁ_Š¿cZÌxˆÃ<Ñ‘ƒB×¼db?¼“jVšSDU§?ñ@?ü¤Wë;©ÖwR½Uoq¡Qªª¹VŒMGËŽÛq^á°wý7Ðz£'=HDh‚½à’Q\ô䋞1Œ™ÇmFõ“Ôd®r¦°,7¡câXµª1âÁHôî0™¤„›5½Ðî«SÏê«Í;VæVâa¢¹rpXIèèäF7<½!,iº„§4<ˆú<á‘‹Ju£/œ†È…~¿3ú.ÖУ.¼ÂinÀnÜ ÉA7MÕ¨rÈý¡±ñu,ƒù¨a=«'nbêxk3ï¦à}â$šÚ}þÈ7L,*æ'õ¶Š4d»h¼cö¼'vÞ|C6FWkÕ°AðWO²°­ÚYs÷áÎÒUOzÂñ±©Ö¡ýÎà1¼g6==u]_£GШãÌÓ;ª{·soçVñ³©ëÙÄ*Ö…V¼`ûÑ Éâý‚îIëâ+¦”M-‹˜x1TÅQ› FDŸð6 £FMF šÐ•ðr [ýãó€+/øÂ’+ºç7jò¢Séz~±ö(5"ÇÖØ³íã:¨bõ8øý5†7öløÎJ¾2vkáÄýC§>­±O=ºéºÉÉr^k²©4l¤p¼åÙ@”$/ï¹»i²c9üT®`—÷¥*Ëš†,½a­š?ôýÇjb;ÆÔ8ò®áOõxcÏöР˜Õ™ùìI3‡>;ïáù á›»·‚Ån—W^ãhKø±àK Yá”Ðïq§áƒ¥–Œ¬"e7ìáX ]з拎ytä™= õ[ ÎQŽ‘/übY*i¥6ØêÖªu™Ý,¡¿^r Æ´®pÇ®\ö×ñG mM\ 4^³&¯ Ú‰â nÌ|qÖÊzé!¨ïz["*q¶Þ¶õí¡œTö°Fîõ=÷åVUn/Ú™x&Ë@í´­T›í}e1qã´ÍdÄûÍÌ—7sÏltj€…v–Ý•mmš:®ÐÇÞÞ¦mkæ¶p9S ñf=ºIÂëp‹hžñ}¶œ¾¿°å×®ìc-z¶èŸéyÙ>záWŠ-ûH¹ÿóV­ü“Ñ §9_ÙP±ù#çßw¢éEúëûÙÈëoÑÜodÊVB>M9*&d´Z‰64r·ÐÃ:kÃúB‡µc¶ì…¦w½œU›ÖY[ÖW²¬‘{hË^;›Ÿsq•œ Í\¡_Ù,à˜hZÅ˜è “¯MOËgälÇÄðrhÇõDèØýk&5îÄNŸDw~ZÔéµv댙}žhcÕ†5o[öJŒ¦ŒD¿_5oä†ìi¢­Îþ¹lG3-käË’­û›9¹”¢õžsÆWÖ¢Î8l&¨™Š"³,}£©XwÂ2c¡#Y 9“[è…ˆãóVdåºjù6€Z±H;°¡ßy³¬ï¦åévÝaR`¢7츕hcÇ’u‚Î{Gž£#ú=ç¬ø±ÅÛ9h,éÄ«zw͇^[øß©‘\åx z½ùÖtèÿhøðàúNY@¢',4Nô‚Ì4BGa9•½¬‘/oÑE2ÌzÉ|aè‘÷ s;ÂÐL¯Û•½bü }"F‡K*f–Q§ìÉwÃYÿ¡ƒµŸUŠ^ø9Ð[”IFý½Ê}ø¡q›?áÔˆqÇ.ÏãY:¶ñOˆæ$ŠöàyorƳ̶DOl‡$\uôì³c¬Éç…?Ô/,¬%ä1ËÞUZ˪p>(VkG›Ø™Ð”ÔGÓ-Ÿ‡ô¬ßÒ+zàÔÈšš6&þ[´³èË’-4¾’1k˜#µNJýqf~¹èØ_økr3ê/5ÏqtDW *KmÑÒ-LOŠÞÞзHXx Ÿ›<@K à¯r¥ê½Qê+ÚÝCn$Vî¦|åS`2eS¥÷IŒíŒ|FùûŒdR ? `W8Ksoªó3fž†+2»ð渊g³–½{Ë>\¸qÚç´ÐËZ·¥.c•iYch¬Ûñ¤§k€ø_x|k\xÜÈð´¯ç_õ9øfXV^Ä*Öw¾ŠsâV5ÑÎóáβ7ù4è‹ã…;ÖÀJë—ÚÞj×:°º«Š¿àÊ©û¥!<›g2bËöé~IŸÈÙ’š,=£±ßíÝk·‚ ¯û²fî¡7ó/À¤PjÙnãW‹“·n£-YÐ ›¿êŽÆ7íxZæ$y/sœ´`iôû8¶«Y–g‰\^ !wátãÔuɆKç˜$n Þùd|øà¯]¡­©î‘¬5ó•ü‚È$¹pcê†E訆²Kò:²Ø\W&Ý„qA¡Ã”cÎÈ®†\Ôò,/[è0à™MñÎÞ]B‡ ]ë]I„úÀjø~ÓéYÏT<ÆÚÕ#ÈâÈöÐÖ7þ¢ùc³G6ŽÆêûÚÔwIZt.\sP?E‡šeܳOJÅ›V»sbjö¦ŸŠ’é:lAuáÆºìß5”àÆÜ§ ß”\hìó‡¾yž´Ð56~«Çžüx,0ùáŽzn w¦¹]<Ø~áÊEfØ€yB[ g›·pÙk×nœØ¦*qÖLhká² (¼V›JAX§Þ~[ QÛ·‰dq‡ýɆ—b¢éÍÐ’ Š~hKV#øiŽðè_J·L‰ÔŒj›·ú=ªŒZ:Ñ –‚ôH¯ÂŒÜ‰0*ôæODµR*ú´‡X\ô”hJáÞ³ЃgÞÅÍÓéÐÕ’u”Ô£ÚC‡ÑËÑá„¢Žœ®’JVZ˜èÓ“>²©ùÓ{d-PåÔ•dÍJ–M“á>²yÇš#ç÷¨9rù¯¨·µ«Ø›……Ž\:ïiÍÛyvh û¿Ú•Í*µ„6W­ÂÔð?ÎÈ‹~¬ì‘ÖÃñÑÔi6gÞãá´‰îð#çk>DˆDuê‘+ÜýÈÆó.þ¼1=òj­yõewh+¾ëå|¡Íšw·æÝEsOçioô¬ käÃ:çùC=q"Ì·ˆåõ~ÐxÕ–uÖä¸ÀúܺCC6w\ ëž“0-<åH§¯XSvjExRguÞ¡¦ 8¾1òKézø ÙIK÷û ²©¿%{€Ñ;tvkÞß@ÃÛà÷#ÇûýKô°æ=|Ù?Bg$Ÿ~c* §~虵øÔ©©Fy g|^(!ò•^qXö…¿ Ïrýý©oþ^¥4&Âu·ÇΛç~CúktÒÓNmuwìY8IÍQî2}ãDÝ¥Hz=Ö‘‹Î’;(ÚøÒý¡{ÂwùÇwèô©𨦂Ç56­@ÚØ~ÛbnŽ:òŒîÒ|ÐU­/-*u7ä¾Pcïݱ† ô†„¹BG…y·FÞÕ|^‰ÿhô6¾Ñ\szЇÂù4»,àFv™¤/œ æÂ§ÖýTfæŒÓ•_¼ ™ÐÖØ“¼‚zÇ— oê{[ªÎ`Eá3§Éuk{ —púD•Àâ7CFé­t8•úG6Öí‡7þúµ¨Ñm££\‘‘ó¤pÚFîÎwè4}f«ˆç÷ã8w‘nfEÙ=¬Æèî ?³]ü™”'®–¬)HO cÙDCJ!¼òŠ–hrͽÛª¡JÙ.›òëh)N¢iŽü.ºã|«=-ÙÓZ5å¸á£:­ý9Í3Û²~×o¢+Ÿ·FN}Ñvר±DS½(4cñì·×1}gDË_ž0½•žO3³io…–Ï)òÓe xÝØÍ¤2_õÛZ“ÚùÇ`5ìq 9#ï¦lgLJ|nTöP³Dж*Zªž¨—õX¤"GÙ»4'òèEJ‹žŽÁ#ù‘íÌ»bë7Ð4žðÞ€@h$„­‰vìƒfaÇoȦkþ‘ÍÎÚ¸ I›ß¸XñÈkÞÐ%|á 6j·©(k¾'t<«èª÷÷îðBb[°}M¢ió›‘lIÆW*ÝÆ,åñáZ2Ð:êÝ`Øm¨a¢…>´¥iÊÞ°L?Ñ52ñÈ,=VÅónð}1"gUqBGA&•=tÂ+²6åÐÆ9/i«ÒýÖÈÙ›n„^À¶ËÍœt#¬sgäÛÙ±ú8ó®b#£g­ÊOFí¦Úy}^ÊÞØz†¦Bkì‡HŽ¢Ôè5ܬtiü<ÑÁOµ_aÔ L Czá—aP4ØŠã+S/4Ä{WnÃèöÈv:G0DE¤’EÍFM˜W0>íÿè¶7½sX|zd»MÇ&gV3Ää¡;~¢Ùè÷[c¼)››ÙÃËî¼Kh브oÀ©v÷áή KEE;ž¹ë,%uˆnˆöÝ`RÁù ­»K4åþÓM¾U{ÏÐú̧—– HßYÉ&B?”®¯yƈá]Ü“ ÚÝÉd‚G.Ù,|•hcÞÉ&BGž®/:Kxi0b9.Ÿ}åõ,‘€j¹o^w/´5ñ­ÔzX·¼Ä¬À"…Óöì¾ðcÍ\n?–ïþ[ÙCYjÔ-d(täC% Ô¡1ªuÔ/¿üÆ_tpkþhèÍZõfMÜF˜9.5KczÓJO¡£êŽúÆPæ2K“{:Œm¼pKŽCx­0a+á˜UüàA°Î’*^)Þ–ŒÃ}PC¹Ï Î|*âK/´)W#EªdoØu73æJÞ('/øF›‹£UwH÷$ò<ã¡1ÅË>†ª E_bUa9–ÓþaüÕAݸDÈ’Ÿ„ŽÜ:óT묋m}a×W }qÙªä¡ùK;ë¬ïwàÛûN ×-ß=®»pæÅq«R¨kËïF#˜Ûà}JôÁID>Ú˜·lª"v³¾³Æ™ø>²ywüVˆB xò‰¿÷Mûrj˜ݰ±}Ñô¨º²ÅÕ@÷¬;ùONQ¢‰ïB™–p¡©ƒzgÂ<=/ËyÚ/ø—ñÄø5Äøì ]hê™Wgž8vN‰—h>ñSÿUí§3²Q2¾¹ðìæ^9ÜY9Sx¦!Ñ|”#-AÓbQ´'4ï^šÂeßÖÄ·wàŽ±çSµ Fè§j%èºÍlmm ½p/µ/¼»öÇÒ³—<ûZÔHÝÙ¶á=áŒ0kÞ¾Ú,‹Ièàtaí¡îìú o+/¼VŽ‘.ÌO• sšÎðℌyà.ÜXø#é,)f†õ¾Õ˜¯zfKr¾mN§îãõT4Å0§º‚ó»©Mq“(žE…;–ØŒDG ž¥Upê5Éái¯O»Kô€1¥©þÖæ¨Îp€½_9+žHt!‚DwY™Q5¹þijä„ùs„>ßæÕ 0Oô1Ѭâ4çýÀ¨ÌG6Ë‘˜Q­²$_šj轡'Ih\$<#$±iñã }„6tä¢k®¨/sþ%zB²­© ºDZ sÍl§ý@oŒ¸l Ó)Ûi³”–DOX–è ëí‘·¢g̛ŧšsÃ%ZwXÝ ë“ÃŒLv³§ÆÔ²¼+“¢ÊØ_4{i®Oþ3^¶£bSú¡© 6fw¡¥ìSÝ–ò'¶„ŠxÀ ´ûKáLÞBŸ³®Rv…ÅÅ6º*†Ž¼f'Qx#EÞu¥®fÁƒžš¾7é/\Œê\øÁyI2 Æ>uç~â/-‰º¢ô“± Q Dá¶¥CÏ’"–›!8î=“Â[‡)±^az…"YeÒLÄ7Z8™ðnhšó¯2¨rÅ•TÆû™¬[&Á˜>hFšÿ‡†ßZL|m|© >¡v…ñ欛‡i=õ(ÕjÉO ë®%t,:}&þ>&~& ¾°’ж&¯–aA½ o|ã^x£Ý‡/¼ÃXêRW”þà[¹æ­ ¿ô¦ÊCºî-K6á·Ú²-²½‘c´è”XÒÀº5¨°©_+åÿÈfIÉ)û4š+ÒCL4Í:Kô½Ñ¬C32s>hj?µéo‰ödS×ß7FŽeá>å…<ººRôQo2 xéü&4úM¦ðÚ°®ƒ+ÇNK“W™»Ö³;ݵžÑkª×UeÓ°û°W9%¨ðQðc¥¿&w£Ê ¯›ÃÓF¯†žéÅtå¦ µ÷»&aáBS£·«„‘†¤†²Ñé³~<νd¢K„[†ŒåÈ„*jˆö•>‘†\íTGŒä bå“9tšÌ¾Ôbbá$“lPG."rjˆäÈñq]õ5!ÙšŽ\hYɪ,Æ#”hcÞjOm½â¬Ñ‡ÆP¸›ÃM¯Ñ±ÌyÇEFÕ¢A—‘hZÿAºc9+VY*颼íK%]Ï;ú˜<ØÖ¾²9ú•Í eĺYLÔAð²ñ;AÒ¬•Yñ½Ï3j¬FEYDZÇ}¬œLÙ“ÖÈ\ã Sž+jä²QSwŠ~ /ú‘ÝðÁÛÈ ­þVô¨O}hÔršÓ»Ú”Óx«-ÛA'µ1Ýñ^ujäÏee¢OeÌá _¼-ªòÑïL„]ÚÎÍŸ}xÔnÊiFSB¢?U´Ú†—Â*™Q g¾ ïV¤¼Ð3°«s¥ÏŒÚê‚ÓVÙK•Æ”_Nh^Zvá<лD8Æ8}Røk±þ{wì gݭιR…>”¤Eè Põº2ß5,’#`/œÏÕ*lÎ¥–`á&¥/<ÁüH¼á´·µBÁÒ„’,P§Qr5d{ ‹÷…F»Íä¸ð¸‘)ú8¹¹ë¤é M¸¥ þP³‚”1Q¦ðß:¯b Òyú_VøbtÑò­œd:sѽQ«}_¯üÌ_8ŸzË-Àè] æÊ&[›€;¯%Z )ø„-q^Î ÞzÓ¤àdš®'øâ»¾¼»”xm™­K‘VlƒµEèC›z¬Ûä‹F.·b®ÔMžM¾èm¾õÊÄÚÕF¼æÙ_ŒªæS8k|¢'.1?¢¬¥ï…#79Õ¬G¯cÖûæ3oÊ*]Ù*|ÓÜ„“-J¡Ùz”bIMnuU8¶qôD¤æW { =t—ÒËð(E“Öçº`7y 9qyMéW>œLšW+:3ÿ-:zDQ'Ö‘§›ZûGñjš².{‡zb$d6:{[a½®òlü‡JàÞÅx_v!æýÚìBèß ?®R æ7z/h©§ì K¾€Þ”El'IÎÍ‚¿ß8óú <\ö^¿áO6=ê¶lÚüyGÌ‘ý[´"YèB¹ðÆ÷,ýô—sž=]`>ŒÐÊ1 Ëžµ5õ-tâSV#³!¶(^h£ó/쾜Â7L§ÙjY+ß´£eçƒë¢KšP?µqa¹_@é{'ü¡Ì:²7÷Â;^.É {U–K›üLIJáκg´Ú0%£Ý¬»EÂCKÐm³áa ÐóÞåB¢Ö_Q©+‹ùîd˜é0j›ðÈ€7Kѽ4è²ëUNuûkœÃ?ô­X9-Y+þÎm´’bøÐMøïf^]ûö²¥'æÒ¤@W“?–e2¥ðö*rq¼ê][¸ƒÖsƒÅþmÈÎk§{¦Ê"jt×i=š.pÙál¥FP]oí…WXÞ¼£A¨3õííùö¾´“m'á‹£*=—¥%zÁ ¬DoŒN®£‘ðký1ý ï058á…‹oµÔ5¦Þ”‚Å2¸^¸ípãmßšõ±µ¼ÖX¦gÂMé…²ÑCú¡$Ï[7ζûpçÔȇˆ§>“Ú‘~ìS|ê—iªöa™¦B¿Ï-¬§²ê–Ê^Êû£*v9—²vì/G¾cäÔåÜŽ5o½`ºàþðãPgP8üþc×ú¥[–LšýqN[Ïò,j¶›/z›³LÁ=á¿D+ *õžÆ'½QzåEq4>o–á›hª{ó4Œ+ÜÑO¢ëeŒwâ4—i«gzÃ>þÞ­ïÖiS#Iš¡ÑÓG?³Ö:Vn.:Ô:KQõáË…;{n£)–Ї¶ßñcdåtP f¨³ ÊzÃJç/ ÃY }!£|ßo x)°Ôd‹°ÍƒGõ4#F–ñ‚;vJŒ$ø«]é•–3§¡ßѲ!"‡¿Â©jdæ¼ÒlôY8l¤×’1¯›o£«c,+TO:WzÚGê :x‘üЇy§nÁ7Žkå¿™ÒíHS|ÇÊäCzâNKÔ/|áL¶±“€„^[¼·Œ€Dð¸èÂoÞ¼þ ²cÓi>×8Ò4¬s_Æ?šq ã%^²"óM»à›²ÑÐgâ·Þ|4tÖ 2á…rc^é´s©ìÇàÝ£ÂÅWLSÃgÉê|ø±Ìú 8µHfK:÷¤ ƒoÞÜG<6Y{¢;VRSá8šy9—%;i h¾ÄÌD¬¤”nA/¦™ P¿®GÉpäK¾zês¾DlôS¹„b4l¿²äÈ@óÇRÙµ¢–²ŒYEc¢¹` ­è ´D–ºùLz܆h0èiˉó‘;he²^ÚBk2=èËÚðí\(É*Å(8mœɦɃëXûýOFŸ…ÏÚNÊŽ6ÎZÈØê³ÑAT¿±ý8ç|?ÖŽ)fM½ [D54…*Xã m¨—ÂöâÄÄiÛöD?ØâÛÕ¹‹ŠCºe¶lã¨~aÕSLŽÜøDÅ»Ûé¼E)@ý/»[JÕEoîwÚÖ[ö§hµs¡¦Ç‹v¾’e\¨41#ÐË>º?´Ð*ž„vO §j1Ñ4ðx”­G­äcYMwÙ¨Ó^ ~F»ð"—>­TÜ”þ;xU{2ú±$_/´ÛNFù©ëÅî­›'ÜCŸ³Osч2ÎÍ5¤;ÞT–EŸÉëHs޲,Ý\¢'W16Ú7#¤LtÇoŽœÆZOv< YD*NzÚ”œJã7!¼lìμ…ÃÁ‡óFJ4º`Ë3YDiÔ‘µOKšNa²)·³=ï©ð8=«S¡Jl3Oï¬Ê­ÍºŒ m +‚Q¿ ~xÞ9NÅçÉLéj©“ß'bgñÆþPšº  ÍÉ Å”ýÈ8"zM*üðvå)¼T˜T©Žh‡6:¢â ® xâ|ø{™2÷wÆN³§¿"§©]é´¡]Â+ííñ'½|éUu,(ø¡Õd)¼Ó„;§&ÇN?ö*6'Fw÷± N¿öÌ Æg.)ô¡†/Ùã–Î<ÕYa’:‡+˜n›ý°¦xo§Vø®¬psÍŠ8sñ òû%ÉD±ðluA'žA>rÜ—åˆKÔ˜·ú?Rål£w†_¹)¼[[–ù×tÑ=ÙÃDÇ£…•8 î,º7ô©–0tä™CGnËæ> ÑlUÑGPÃùEŸƒo³Ë ÊzäЭusWýµw'jyá¿E«Ý;½ O‹=¡—"pKßö¿‡GóI¸r-™îXXæ[s·6®bG}ðæ:ƒÏ× c¹IøCãÖ^°'Opcéïñ&ô{;àuOÒ:òn© 1aQWZp·>4_ó„ä,ÛÖ“ªØ¦ZSKZI:ôÿ¡ÿqèòCtõÑŒâ列‘R¶äFäŸh¿!T:sl~ÐŒ %Ñ»{{’9ÑywkÞ]:q¤¤pn½åзáINÉŽC‘]9`ô•Ö§Ñïô?îìÚá´úæ…t‰¦}ŸÝ!ñX¢œ'ÑómL} =ù€¨{¿«Äˆæ€õdB¢N¨®>ÖÔ6ž¬73OFLê… ZÈq°z xkøÌ¸ðjÅÝîHWJ(‰Ù‘¶ÆKøØ8Õc(F#J£Ë{H×­‡Û”*© WtìÈ@•þÞKBžxG]¸­#Ãê„NÒ½5lŠªîÁÎr±žqé¢ãs¸#½çý¿¶9¾§ÙI‚ó<À©|8ÆÝq£bø¹¾ð>ðnœËÉŸœ*% *6ˆËxthª'M7FNù7N$”ç ·ÐÔ‚ 4íæ-t§:ÌÍé’.Øx¶Ñïs‰Õ ŸÈ6iøÆ 4y°ÜQÒ2¡=Ù&zbÏÀOG^~‹®­Å–-ŽZF°TãÝá%¼T³Bï`[vTAòUÛÜ“óf š'j£Á.wõ48“…ŸµìVOegÉ ·ZøàýîŽÙsçm yÄÕGØëóˆ>sCI¡‘y¯èÃ,…cµ(öMú$ÕÐ+ÎØ3…gú4t—¸ hÂ^Ê6FîèEWvt‹bdPçržbáËzË®e­›‡Þ&Ú¨y]Û[¶miˆãÔ'íÇñ\N.[I¹P;%'Ýñ­(;cQZ':t%aáÝšxvݦ¾í%·tâI1C=/I«HËk$¼ãʤ-û‡fœía }X«nÝgÁéhŒ\Ý h‚À–j¤ÖòVÛÊñ¢_åF=mAmX±Ñ˜hZà}y ½"Ô‚“uOå›ðwÓPÍé„'; ž]¸)Ý…Ãû4à[ÒQìn(§4ìb°¿èò8»^ªµp¥ZCW½+бºáÌŠ‹6–­yË–!ˆjOt˜è©òø»px˧¥D='Úº ßðnôJ ¨ /9 ¾EÛFÌ@+ƒ\ ‰Ž¡£Ìû+zî^t}œ¡G…2lq?ž,Xå¯Þ|áÈ øõŠ¢­žÞؽû¼n¾!ï틾…QTø7àÜ”¹uUXzÍO—Nuñˆ é#Üû/á†%å ÷Ì™6<¸>7ªdm´£$[f(@s¦ç·ŠrÑ¿"oì(oí cW´QÝŒçÖ Ño­Woèíçpþ©ºÒ'=¿6(|<ήÙ‘¨F>ÑÎć§Þ@ ]9ïÀ~N¯‡HH`3Ã!.‰}X‘z •dЇ®R%Dpôo44ä¢íúbM;_t¶ÿF´ªÎL.x³LÝ,#S¤RˆÏ!Ðò‡¡lÉDG¦&ÔŽS±-é´aQà>Ñáñ‡_¸ Tõð™Nºg G1Á„;S_Y”GáÛ[9ù³P`.Ññ^Ù%d]Ùܯ2å CÜÉÝqŒæ¢©ZÚùu/z©S+ýÌVRÀU[j9JŸYKM$QÊÁEWgÈ[ú²ÎVë~ßKêô¬­t–ã¡K¹ äœ‹†…Ö>ÖÄÕ,õyÑJ+*ŒYò pµË@9V>7"4çý::7Ðyóìà‹®ŒLÿ+è†#°™ÐDíÕÔtÇ’ñf"5ÐÎa¦Ž³=-ÙJï¥á­$WYت®¦*ÝFÓæ*ΚI*[Ö&jEè£O”î÷±F~ÂùWMMðYcµUý‘ó5ϾÀ:z„Ày‡l>ïó8k~”…ò‚¿±j¯lê7e«Qœâh‡#uê*;*‚£Þ‡£‰î0¿»d÷¸‡Ñë¿ðfT¿ ‰§mL¼‰„‡ùu]a$^èH¾¤N ü,k* N£Û<Í~¸ûã¶^C|ÙoÖ®5oæ6ü|·Æ=â%Œ6µ˜¤J¢‡ÅKµ£/ÜÑ]_*>pʱ§½ë´³(ë…7üV¸Ýþø®Žß¥úÁN/ÄÖ(ÿù¼ðmQÅ…Ã.Ýÿ†Sû±%å(K·œöˆò-9U‘Ó[89 <4 ‡Ü¡Ój®Kýùʺ›¶ô­Ñ'Ç ?܃Õd·£GŸ¡ë¶ìu3„g‹sêP¹Uÿ¬’¸Üf®XÇlk׎‰Ž+™>3»XK™b¢ãZ£†TO^@8óþàçwâ ¦|•Û•š€½8Z¢YN¹Ý\ñÈ«‰Ž—=-µ„ú¥7Kv¢é¼…fé?B;§¥9VsïÖš|U,+³Ü~ª4dê£ÄÄkaͤîª;n½“rÇé-ÞUÃ’¶K¤±ÆÛ>’ºâÔÃ~Ûïâ AÖ6M&QÜÂø”¾ÄíKW=Ë—éij˜…[§^¤Ë>C]ÍÙɯ› ˜i.Šøc¸ÃvÈKNßÔI}C?ò”M•[t}ßóÔ3dÐó&â›ë#ô(Œ  üÊGRjÀã6¤ÖYî´êmÀÑj@}ÄEÎꀅŽH=mé·cœ9ô K¿K|Ý›r -—#‡ïKCÍÃ"Ce¥46äa4B÷’‡›~(ò#Pk{ä]J·ì5ÞÏŒÚ?3iB©V®"žÏè‚?Ò©Ô2Ѓ³j Ú jÆà*j“ïø«!*­æüÝ3úMÔÐ{<¨ŠêÁÏùàû­_ô2hËmæImˆ¥ÚRF©Q.ï ½ÇWãdªµ κjCi¥†lnd×:¼æJä¡Oâ¥4b𲶦“Ú¹2ˆ/ñ¥G)9úhm]‹³$}dcíàÍ›÷Óþ ÚXµ£ÇtÕ’Ÿ~c‡W`ÿ¡éª)mœz)³c]‡÷Ø.:kpÍ·Âô¤¦lô ôÀ;¶ †…"Z*cäÍD¿FMgMb)Zв§“ã—hš°,Eëó­êkš5¾—ª¯iÞ÷Þò81b*Áåw,b½i°ˆ¹\þšArŠ…K"uJŸ&ߣ‡,Il[ Ž’4;R×1¼p;; ö+úÊã ?–£>ô%~¶rô›I ¯°U¢¶•B Ô~9i¿ ‘ËÖ ÇÏDŸ¹àï²1—¸Ð¸’é}A+¢ªvzgë­ºg.ˆz«îYæL¢t½äÈinUù÷ïÚ•ë´5â…S"×û!béÔHã Co™¹®žYçHÃýÞÆŒ%²Þ2l,{X{&ß ó—¥ì ”=axYæGÄoè¼§hèÈ·‰þ;:rÐà/ÜFS.öDo¾QšTØêúoœz ©ém[ ¸Õ[îȦü3Ÿ‘3O€‚>ïŽá5o¼Ý–Ð{áÛ (ÑŠùf«ª°Ó¢6æT;d ·!ÛDwXF]Õ¶”zÛ>hsª·_+w•Ÿj¦D³çlUéúÁ§¥Ê‹À2HëmöJí–@(gèj­y–¥â O•L…7妱 /ÁqÉU¢¬ÿNôïp[vë•þÔä*˜°fêÂù‹òÓ™ª§zëJéàõB 7iü²ËUKÇ/ù:9ՂИ01es{µf¢]õ%6¬\ÓÑHÏk4E.´7šàᵂ ®Y†¾¸¸ÿ¥éFd>Òú!z`!Á 3ä3s Wùu5~ˆèžg'?ø±´Êëhê¥×`UWwâû!ZÒ¡7ÝjxÝšn5–œ—ðWK° T½DÔ¼uïôVkƒó²^á}ªë¾L´Qh‹'ç‰Z,ÌGª#„f¹Ã‰6VmóªÐú©¦«v¬‘‹óô” ͯ”ͺœVÕÒ.È?\o5,Ë‘OôÀ@wX;]³g8í–%ø¦mFUàw(^½uÔæ t…Ylj¦¹»‰Vù6CV5¥P\â÷ ô‚$¾õV‹QõeOVøÕhð*úHŠÁP›m*®N#WSy…,o¨ª]7Í:¸4àªÍnÍ[º…>æpbOsòÌ_åÝÚ0[èÍŸâS9Ë,ÓªÞŽÕÔo”hú0ŠîÉ´Yf¢ö¥ljîeçfVÉ!4njŸhÚ¯ò ²#zDWM±ÆŽ$´ºMÀë „^M´zFÑ¡«£5ðsèT7-™èŒ)ÑŸQ£ÓLŽŸtYM4+o©R:.V8ó_ôõ¯òþ°ˆõÖÀ`áÙxÎ\ú \IÚŒL†Æ¡ h:ôÍ:¡Ñ¶ÕÀˆ&Æe! =ê[hÐìEGa«©QKiæÔà¼YÒžÀ²/ɬj¸}ð‡¶õ0c,¶‰æWÊ»3ÄLÝ>;i“© "»ÃSßêû…–ÎÃ7;ýáÔ ±3ÄLóÌç¡î¯-@oTå¢3_8ãJÜÓúàÆ×¶ôµQ7©ÊÖhëÍ+}àÃÎ"$ª#—u£ooÝ/-½•méηz2•…ꙓestÓL¡Q}¬MwÑŠRÃ=?s+ŸÇÙò“¼Ô‡Âi•æ7ÐÆÄ•WJÆ6Fn£+ÖÌ9oFïY#IÎYóê\ǧZŸ‰Â¥záÈ)»ý×¢Óâ¡ÕžÕÍ ]’; _,…ãÖÀ¾°ꤹO}gXëž}Nè5~2ãŠFÿ¾!ݸ‰MéI÷H=¾__JÓúX½—Ò™Žíw¦»îŽŠ4…/kÙ³Ó }ß^¸1vnœ­>îÞ#ïloê_€ƒ?Ö™SºMS< 0g½î´MÓ3½à¼…>”-+e˜—òA³Ü9­VHÙÚ_@¿#gfØÍx›rä”[­]v|R•+À¾ï”Ýù~Wyº±ðäggÉ‚%-2}…Þò£¥lJ£ó9–¼ô¢˜af@O…1òÅÙšx*ª….°ä1ÑkôlÛÅbi‚¿ÂYTEÑ8I2Ñ´üÿƒf„¶BGJ5r¼jrÛá‘NI›èiB?hVYœèýBê¡ùMÄ$ F]Mk$>h¼jêùEU“^ðEÛÂ@ÅF_z\”õΉ”=½)]¢iÎ|»Ì$Ìë–hZ ”è=G4‹G|æ×\í6X ÓgÕ°ZÜjõAUÓæ±?4y&ëÑ;Öš)ºjÇÙ±š/Y¸æ5_Ñð¤V½dY:Eû°à@­èéA…ŽÚ/ºæ®l]9S‚Л¿çª2ÇY 'ÑÞ¼-ô>ØHNâ!|Z4r–ëoÏ»ñrÜv™ƒ Ù˜a+ÑÆIuGî •J‹5r6:¥ßw·NªFθƒ?hVÓÚ¢âÌù°vl8V){&G•/¦^ ¾)[R¢+×lÓ\·£Y2Âd;ßɲd[oª*"ú*ªÛºM޵j'¼àØæÒÛ‚q©}Ð,ÿ4Ñ\'7½-è]”œ^XvU- õ%·ê¶_£)¹·Ð8U©‰ËCsõèÛ“´0·‚S‹eÎ&¼ð°jrjQߤÆN+öW ï®>€Œj(ÑÜœ²yòDRÙò‹2^S¡qä&*±yk„ŽyÃMÊf¼y)›û‹’B1² 7>l›Ód $Iô•[—í„“ÛæíÝ?hú Oî8|ØÔ°6«Z>šÒÑ5—ÉÇZ.|dãK£Í@/X-õ¹·æÝ†2Üï.•¿[¶¹jûú#¥J3£z² ÁÖh¼l¿E›ËZÕXô‚ÓÉü¡«Õ•µìT¯v+lÓåÆgnB3}ÞÎïá®Ì cìþà²Ã oqM¼cK;…hSø¦”A)ü¡”ß» ¯Þ×bÁÃ/MU\õT\sáŽ)!' +ÒKÙ+È&õJ÷L˜©áÙÓ…B¯ÐЄ¼žÅ‰¬R>‡^±#¢«¨“:bè…ûPîžñu‹.HtÏFv» CWQK´1ñ¡ M›|â0LÏú:ü¥)æ·¨†É²F|'Nk×&§G¸CߨÏêÎ|©‘3ýXV6ú S_Þ]Öײ½ußÙ†‰ê×_|ðÞÔ#Ånº¹pVè°+¡߉B³~ÊÊêtL¨ÇãŒ|$ •Ý\Ù`/:ÞÖtÍ{x¡¨É=d P“ytkÕºìtÇdѤ'ä W‚¤lêK1G>UfFW-yhˆü…o44™‡òo[ÐúƒóR8õÖñ2PÃÏ\6QÚãy«$Ï;Ûòaå´ݧaË÷œN= š:’Ù€±t¶xÆ+‹:f´$,°?°à§áˆïOÑ%‡8÷¾ùÒÝ©óCwìõçpJòyá2@·È/à- w¶=½`ÔžÈV/TÇNÝMÔ7•ÔBëçÊ+žw»Ò,è¹=á[þ?ºçëqB;¦Ír[6Á¨Øó¹Í£YËr¯a¢£à¾òVòÁQûu ‡mè.ºÜwôY¿ä·lP=­Éé ]q拎ÖÊÆ¼+¦IXÊ’¤éÄKÝ´©b]Y/@ç½äR kž\h|Þ›R'Û²·Âƪt#cá‡÷W§Öh÷ËVƒê¨ÝÍYôÝ?©áöÂïäÕÆ§aç|  Ù2¼(¥ÇV[ã µê^N¹ÁVB/­ÚJª¥©©—Ÿ¾éEiÿàÚ÷-¢$Z—“húº{Ñ‘»5c ¶ެUê IB{ú…Ÿ¬}‡êåHµÑ7BrŒÓƒà»®ØÉ|²,‡Ž\! šôv²²žµ“¼9P³a<àèª-Ù‹tÞù¥#ÏbzÖŽµjÇ:kªñd]û‡W¼‹_’6þê—“ÝÁ‰¦_Éd{«UTèý¬9 Hè5†K4úåÅdº¥‹Ù’~¡B;«&!«:RXQ¯¨¡ÞK”]B‡û€.z×ЙÕô§4ü¹rÆ€zä[Y›>¬mÞÂ-kæÛzXùZù]Äž\xQÏxæŽú,X’”²‘'c±ödOè[:V®yvu†6DiÖÈ3mÉ@/˜Ü#úà¡#Â*T/¼Á‡¼à‘bGOÛ«ÛjƒUÅ f·tì™ÏÊÜñ‚c·Ó¾¡çHðèN×}ªU.Ÿø¦ŒKw⋯۲&¾Õñ•Zû‚Èsqá ø îMÝA«œü„?'|¡%?(ë.ÒÅÑÙðM^þ"ïbÙ¤åÿBã&DßM»vq6zhcÞ¿”Ý,Ùº[èlsÖ᳸.K¸œ…,¢_r2*»)…ƒ^-{.ÀK¼Yxÿ? 苜û4˜%&ônÐIÚïÜt⪔d5žB¿Ç…Åo>²YöÈM}nMM× 4>š2WXiE[Ô„|ð‰î0#tD*é'ªn2Xvvec!·.>˜“Óº˜MìYžèË» ÐiÍ™²­£…üÀ³ž˜º‡£F²aõгí$÷â]Íê}sýDW˜ð“hcÞÙ² ~cC眞µ‘A¨’‡îAÎO4W‹£º#§•Äߘ÷/Ñ?‹R6ÕY‰GÞ¬ýn<é¥ßÚHú€I±IG.4 ±ªô‰_d·ü‡%ˆw•C8ðfuU$ÐÅ¡ÁÊÊ*xTÄ@“³u{šmŒÑþÂv,Ï#/#ྱS}fŠœúz2Ö >jÊ„©Z²VKãsÀÊ¡ÜÇPê¡”(©øcõ…G ]÷¡#GýœQA{n åëðrYÊ‘c ŒýÖst.›×Bw•EP¦…šú`2EŸÍËüR8¥ ·Ñû‹>‘"¡fY㉞w²Go[5¡ Â‹ãfá•'Ee@Óãþ¢u»Úª¨#?õ¯GyEáCwÑ›¶DîÁBÇñª%|ÓIÁ-ïNRÄÙÖaµÑ+Çs¬oü;>"«RÔ.ÿ‹’'š®ú/>m# u¼$WYnXE %@;C?¦pcÕË“ epÝ"w›˜4ÚØ²¢{œ½Ñ>h“ td3qÙᚠ˾Ó>^é*4n0"çÏ9ìC_Z‡>]5tÆŒ#¸³gÙh’îY3RUÇmÜÆí—Ãêð~Œí&k'þæ`J¥²WȦwùP­ ëô3bÆïËï·òkYž¦ÐAÃlÈæju¦jƒ7©Æ‹Ý`™ÐòÅ@Ëoè:’<ág2“˜.›*Ê©ï.Ð3ìÞßÈÞ 2G}cäZú&ŸÊfÆ'U)w¬ájƒ£—=TMÑ‚Â@o½ îÊ‘% DzV9-ÔMKõhÔk·*'qV ÔÍ_'&ZÝרõ`¢—µcª”e©zCiØ;!¶Â)ÔöØJm ‘î‘ BÛãéÜù´÷àVˆŸf'Ürj»ìDÓÓ–éãø´‰è‹¾öLçÔÊɬ…/ë¼X â§è-–vzÒ¥ÚX2ú“Ž\É•Ô[µÓ¹K•SRãÓE?-œk§c™G𑯾Ž"HŒ4b\f}l=ÍZµl4GÝ›‘?}°r:z"0.c½ÀÏÀ:ý%A#Êèíä)tÄÍ á»ãe ¶û¡QÃÀ‡u…s”:²%Í1 ô>#q>De £Hø³¡¥~¥?ÐÁ9Åq`ŠãÍ ‚¦Ræ+äÛJ4e‡û¦ÈÒi×2¡K£4ÎSÙþíÜ ¾øÔ_ Õ´Y/œv·žqÔJ¥z¾h6I utúð´ÿ,xç_«'½¨<šÕâϬÔÐógì› Nc:õ¢2f€^ø„–·àu¤S/bƒfÎZµ&ˆ•cÕ® -¼íUó¤+×g–àü0·³Žʼñ;]ù, —DÉLK ˜ŸŽŽÏ•ùºçeÇß‹¼ôxÓOLœ½ðçeâfY3ÓØ;$çIá [±!¼6XT/Ƹ]¨ŽŒ|ê_›S¤Ô´]’Úq„Šlð¼)§yB.+ÁqlåO8½Ôý±ëÝEÏLØ‚ö’|S²æ3v#&úpÙj@ŸÁçí¡'lÈšhÚ®qF:±êuáyizo²\pµ=´#û¼¬ØômÊ–Wˆ¾uÛæá8¡wÇ6På.ãPÿŒœZM3ô•œhz6Õ[0/àŒˆ1ï@7ÈT'ôž°‘Û¼tÞ,¿r*…{âG^dŸÓPÊæç¼«.Q:þÉæ#7´C®9}Ö÷ê\ƒ]ÔÒÔóÙ3ê–^øeå13b2q“±>‚ocÏÔÇžñÜÍH!:”Âsf¡eLKáF´¾"ܘyö‡ šQf>Þ³©»ŒÊჶKOÚ|zVog9’‰6Fn¡‡ÌlÖàaÞúz‡§lú˜ŽêÚ{&ÑÜÇm®šXÞèstTž—*©›¶Jœ"Ÿ?°6$цìa5ÕjâS>.^sü⳦'Œºš–ªBèÓ$›h-z\D±Îªaf˜×.¢>Õ5”¥÷½EW²ñâÏlÆž±zÜ^~½›}hgJ‘N¿oxFÀ2UÝp¶É‹æò¦ê˜=ø¦TåSuÌŸÖ>>CöÄ‘ôg-[À$+ŸŸ n*\~:š–²iUçL» ¾)SöN)a?…ÏÜ`Ê–©ÿj8ö6Mô„)jb=|?4æ Y*›®|ÃwÒ“Ó-ÛÎУ•îY¨W½ž¤–è Ÿ—K5¬v­Xô; †þ½!C€ÐŠˆ ÷F ?ø´5i'æO:ú챘†à‡¦‚&zB¢îDSõ ½ ´ð3kÕ¨¾Iá r&úÀú™ÏÄYêÐøݼë6ÀÂÂÏS[*<¦ÝW×íÅŠ`Åoµ)§[¢yOkäËD;#_Öªy#?º'/|âÜÂc¨Ò{qÖ<ËXéšw…q˜Óo…•»ù#KYºÖòê)?Cgi+h?8cõRIäÄo„.Jê H4½Êrä,ä¸Ô´ªaÛ¥oëÝÉI¯“÷ÇYt9jYYèˆgÀK8dXCóAÓ'eÔcèaNô„‘˜uûŒ±¨ÀÊ>cú§ kr¶TR¹aHBhñÒUÏ$;.<.ø•EìŠÏêÈ$;ø•zâ¯lè)MõÃHÂ<úDpᙩFw|g_d*|[›&Âh–ð•èéò„Þ<1åÁŸ‰xG+ÊL‹| Ô0Ewʯ֧^ŽñǦðŽŸgY/ǸÛÖíOÇ>h|V¯#ZÙÝnà›t=¼èƒ¦§mé*¤¬%ÊV´–è†ß8+ó®á-œ=é]¶2Už£Õ°¾Vò§qt¼íèqi<ã+G¾±~X %àoT™ò4Lº²E]µ.—ݱnt5 ¦ž€,;£ÞDã5j~iÈ6”ª¨·ÎD/Ç[·Ô#+ô­>­ÔòYº„Yu¦êž"¾K?]ጤ8eÓ*žuoÒk–»ÑD«ýX·I9ðæÂ÷Ä›¶³ÿ5üÆwã=Ç?hVÎ’hÚ’%çM‰ç—*¯Œ5ÖªLëƒ"‹#è5¼·ƒ> dPg6b¤1ÚlÄHsLú$ÙQaÁ‡ªXýõŽº^hÖ´jÅÔm¹2t+àÀüV²zÙXÅöΉ®Õ6ÀA«2“åÈ óû6Á¡ö_´siø±a¢‹…V¨”z2†8¦XÐ/Ñ4YJè(Œ`aýAõÍ:‰¦fïPÎ+/Htƒ\K"¥ˆŽ tÑ—<_,ܹ•CK‰pmt¶¢¡ßÉ1eGq]tÅ+YÔo«‘M‡Q¿D¬¦Ê*¨Å#gq”­ä[îâUò-íç¦\„Èo£Co&ÚYôi¡“ÂꦩvÑ,±Ã Ê©µ=ó}‡¾P`¡Ò-btóÛÊó*4©`‡ÑSÊÂ÷ðR<‚ÕElÑtG’;TnKD“ô6[ɰIÝúI8M5ëZÖÐm4Žo‘6—…;­7} lÑqÐGÂe>¦3|`_ëkm:3W+}Ïp§EgöÐßu{ Ûõדi#õ2óa‹?0šR³ïHBÝ–úíäߣOúÆ¢ƒu~Ev@PâÃoå,Þ_UŒ¬¸ÁVfEåйz£ž «Ô‰¯ìOÌù0à1¿™^•‡ö)Mô†·J¢+¤x8á²zu+»„Žl¤m¬šŬ¢ö(B`4爹oâ“^Š‰Ž bºèEuŒVUèC™P„Ž¡3æDz@ÜtÏDu4é² = çJ¡ï¼YÚv¢iuƒHÐâ;Ú¥ˆŒ„%tÇ…9:U±µ7äÕ:€à–U5cïÚ¾üðð²·¡à˜rð(!„¶HùúÀ`±J΄¥B;«¦ä#ædUÁøÙü°­˜7ýFkrñìê‰ÁÊü„ºè—c’Z/‚{Ò+­ >É2iH× ‰UqnèÁ9âý3ÐÃùø¡lq²ÐÎȳÑ=lË’í¢ã ÓWeKâaæÅHx¡í7´cKÞú8kâÎ)ºðs¬/å$….º)¼Ð´ói(¥UlüÐÜÎ §ýNœTn,|¯ÎÇÒUlÈ‚9'"P{AbDOüveƒ°¬w¡­-›œ°è\²I¼áÓúÌsè, %÷®%|;3ÙúžVÁùžjM]ð‰ß—£Y+§rGÖóLhkÝ›·îÞ§:&ïP|DfgŸyäXŽâK÷î%¾'~©Íì+ÄrN˜žñj€'6XÝœ™OnÜèsódA¡­¡{&¨’j:,'Sç L¤L  òc99‚¿ÂYyš(”ZñÂ%ÿu»ª{½!Ü„>­MŸÞ¦»Â£ý+•O|V²*¸3ôímšŽ|¨'¶¥'”–ÃǾ•AÏr\O67fnÄq¬T˜$t„û©odwÎʧƒ‘ ?µlWŒ'¾³rjgÚ _ˆàSƒÏŽh†Ê“ ÎóSô¡é½çæB±ìÞ¹P‡‹$šV9qÓTœ-pD’OÄézã²Â–G­ ºÐŒÕï\RV#}â¡ñn8ËÔ<—V‡~àGì¶ø¨žP«¨ÜvŠoCV¿)}\fèmðß ºO.fc_tcÉŽnâ2BO¼„ïÍ|AWøÓÙMú›&¾Sd<ùèn…QD-Ѳ~èªOLnsÑ›õ|¹CV{D?ùCWf.2Ü.Û‰¦Dm>˜BÊFG¶#äjM´1ï¢ÆmÈàLt6”Xó'å€ÍçÓ¥˜££À¥*øÂ»Æ{6¬³*Ë õ»K´R ¸ðóà»°(¶@U[™Ö²MkÃmÍêβn,œSó}„CÞ‡€')6†žþP¹ÅßÐQ£á‹†íß§ˆ2"½=ÎÎÝVS†Ë梪è“jˆ¤Þ¢[VWRÃЉoçm§<щ§ªòjTh2Ÿ¤RZøSUi‚â݉>žåEgxMé¯\±ÈñVí‘ð &„§µ%‹GǧBMÞ¦<(ä-Lt(Ñ-WëT+;Õ)’3P½Çé£þ-Ú¼­[{>\4äºÿŠlX=èRl2gF5 !]´1q ¥½ÙÈEolùå¼ñGº¬‘'Ë.Õ/;FŽZ&ú@BÅ)jgäÇ:-2!ðMzpyÐE–K2•Ûi|c]×𤲯g› W3Nh t†ˆá–õ‰›S_ôÀOâÛ@/]êqìz[#ßQ{H=G·<´¢‡»'»EöBÇYµì¢Íç#GâùdÿøQF†üP´2á´\!Ð5¼â¨*)ÑÖЛµì"iC4­=qØÌyÇÞk'}Èì Be'i'ýÌ”‡‹×\4R åÀ@µƒ‰jT©páåÁÒ§(·¨s8аn1ÑæJ]4ì:h+è&ɉjXxaì(ŽäåƒÃ3[¿Òukz #ªü øcf2"$¼S/ŒOç#|[ðR°b×ÂÃ. Ó ïžp5¦ÂO’ ´BŽÔÇ:“Æš¢•ÈÚéªeh­Ïysàv“^8þΗ<㨼ùßsG={þ=xú²é„¡ÂEFMS.|5¹—ižÝ”UßM•÷nØA.Ðw ´%QÕ¼²<*‰lôŒ ÷®ìŽc!Qópc`eªj_ðå<—\!Ôþ3ÑÊÓ§ÞÊ-r<ÄŠ“è ':v‘¼Ê£¯ò-o'}!îŠ ê.zcq6™¦öS4[~XIJ eá5ïrâгšeD4ç|g‰ÕO[a?ú.O4µn †‹$¼Îö´&¾äQ 1¨è¯Í·;é„蕲“I T'<’§é—vDžÕÆwí`^A{èçÁý/z0NËæÊÑGF©h51¡ÒQCU¼jÅš·†¼Ä‰Ž šM—­ZC— AC'9ih"É©¸›ëÔKÞQ¬GZr”±EIªsl|æÝyQŸa}¥ÉX@—mzÏ&ô¸-Å%¨ çˆU™>ŠOv… ¸€WYŸ\zÅ@'¹ µÿZN–𤔡1¼€‡ß+[MT°žÈ¹ãm7ò‹z;tè€*Y]»Yý|À3ê‹–½Ä7¾t—–è ±iùšÐá2ÐJ'ÑqØ™ÿªÜS,<ùd¨ì(fˆÙÌ»/xœ6ô•æÐ'|c•x¢àrêDÃ6‰ŽÀþPvœV^ò:3ÅA9Ltä·ß}ÑE)Ž,ªðA³0¢7|-$ºAWFQeîÁ_x)®lêæµÑªeèBz‡«VðB\DDÈLÞDwh5 }ø0:­ô/Ó’\tƒ)HåVõ²Pqʆ͚=qÿÜ@ë&£cÉ>½­UK?)Þp±S»©²,jû§$úP÷rÊú<0QÔ³fÁÌ)]-´øŒéý_OIú}^P^3„šlÙ8†ªô*Ÿjôl;Cß“Uù°ìn£UfÀŠR>hú6ÉRdúº¨Rlƒ\)Wô¸¸Â7ìxÑëŬÁ¦ÖfÔ`ó-S‡#Ø àÅùF} O=Ñ&pï¸(ú•M]Y¿Mõbvf²em"¦ò@OK¶Èµð~ÏLžwY“;Ÿ1\áÕY·×@]š/š&‘Õãv>rݬ‚ªdg§‚Íô¦} 7ÏË—ëFÍt_¸×눅ֿ0K­d3¯†-Ö¦›˜¹$ºó+åx{æÁ»ìú.ìÅ1Y{áô9BŸ»0zá%àEä?pnù9<«]DQŽì=½:6goÎuÖ¬cWbõŠ{šœ= < t…$S‰6vŒSÊ':’¦éŽe")Õ-"%c}¡Ãì{ Rî²wiȪ«—(ºèªYZ`¢€t%4ÒËd(èÄêA¾€ê?xÐŒ6vlè5LM塊\š…peÓÓbËž«H} ΃_¤£ZûÝL´³j6šg0Œ hC;L뤊|†¾é†X"©“0¨Zd'ø)Øy2K éë൮•Xo²©¬aÆ$[²t{ãÏlɳåS7NÝFªü6Æ®à.Í$˜×r‚ß©à»îM=üTÁEÝ:ÏÁð }ìîÔyüèçc·qd§ŠB¨ðl¹A¿¶eÉN–ršŠ1UÎKcg3“ áЗHpX‰c‰ÀÕ»è¬çJØ r”%ÆÁJÖ}ó·MÖ}ÓÈWOJ~|á<ö¥Ò튟VÙd–^(G¬^ŒúOmVU0oÀƒ"~jGõoŸ›iõ›à<â,ñ¡q´q¡%\QûçÈ?î öì§l|Ü”6D/´“½èY=J¡ûìÉhÕê-Úf–ºÐ‘r„¾²DÃŽéßù]ê]ô:B§EèðÐSº{b|Ð,õ™7^5±¸1ϰÐÛ8çÉ)OÏZF,Ñ=šhC¶|ÌaUUdo|cFÿ£ª‚íujd£ „`Ì1õVMÓ‰gÝ3]ô¬{f€zëžYmUKááý¡UóÐúÀ™3½Þò_€(ºæ&ã-V§Ú)‹ÕYBžÐ§Ãk¢iqŸºák½½£© ¥Ç‰£ã¤³*·z+i½•ÇôIÙë´uëuÔE)5ágÖ•€AOz/¼žCèC¹rÍOz=3þ{ÞÕBëuBo#§ø·Þ\Ö9¨Þâ_V+Vo -õ@tõ‘Áknt–úloö|ÓÑsž”ôœ%–QÝ"¾–w*ô»c,k%Ñf1æÈÌ­·A;ÖÈ‹¹d³€?‘@OêÓ ý¾·:ïÐs®÷$^5¡±^ÛÊÚ wèÎt.<\ŒX7;½ƒÇ“ýØàq hÓ·ð°â|#û×À£>² <ê£ê¨ÿCÑ-þ5Ð4qc4K¶Œ–æ#tDËèiéÖI•K˜uÔZ5Vô#s‡Y#Pµe¥:u?ÄÄ£€ê&NŒ„+ÑB . ­ÜMzÔeoÒçP? Fª$K°#Ò³*—õ)ì7DW-½6ô¤Kv¥ª-­UŽv.áÉÙr•…'NzÒ•lKÍÕD³”Õ;ô Y?<®S¹›¬vDè×äÃ'UZ•U$ºòU›Ž3{NNzRãI„ ½±‰?“sžj&ñ¦bÙÇñÂOå…QëaÞ¢è÷è…„ëqVmeó\xΗÑꃦ6×zœ”Õ¥x‘?wÞ¡P#ÿ=ð›j)ÊÆZ+$Ú8©š7}׬⼩–¬êGÏU£þdä;eW22R´XY©q¢>òj­šìTšg“œ:øœWáiJúª–z+Öý¢ǃÌXtoÞÞq1d7ë"Ë>ô"kŽ‘¼šc$ÿT¶žs4œœ4F4G'ÑÆÈM´±æ]]ߨfú'ÏÛÑb\Ç׿> t¤.ÐykÞr¡ÓD—½¢„¡­ÇÿšÖY³Ü÷krö¦Ï¼±Éõ…U3æm¯M]XSEÂ4̵–uËÓD½{Ér†}¢ó¡yQ[ùžÔJN4Ýð]£šhK¶ec¶ÏDó³¶“C^&Û ‘N4e³ú ÌÛ°ˆf½¤ªˆÆx `¢é;ö’œY²ihp+&J/ð”M«l¶ômU„Ñ Ý­€*ãP®—XŽfÉîe–唪ì-ÍD¿PeMbº­y{è#šD¿Å˜I ³%œgÑïìAÓªwVÁëäX/úp ‚“|8ï#¶p=Êš¤VöI‡.G^pz²L¶c½Á¼Ô\<êzF½dGïšasd6Q‡îÙ‘®A“\Îæù{r¾G™ ’hKö©P« Š /ÖЉÎÔdtT›ØÑÌ‘i—%ŒYÙ‰®0ÓäƒfÔKMcM4ccÇJáìîM”S*t¡1—ÞG6ž·‘ZÜDûÄÑÉÄ’ÉeêáwQ‹ÕnðÝÄÊbÌÛZóo ©BOfö>ø ¨×jÖdAíð¢ÍS„³æºYx¢Ù«ê;²1:‹¢àŽ5UdSÝÒº5òÎók•QìÈžÿªÏ…*í’M`á–›hV.Ú.ç–m¡»¬döÇ{šŠè‘wçíÖQ5цKöƒ¦&W·¾½8ІÙ3tÖèÃd( ÎÊ{…6Vmˆ¤‹Ñ67•™P~Òv‹5Xú½ÐgÃRtQsà2­œ æÈN4ßï,˜À;6­‘‹¸€µÛÚYó­&#ÔÆžÖA|ìÝ{‰>0RÕn¶'sà«6fS>—v;ÃQ¯Gö´£ÖâR|:—:°lÕ b´bM¬ø¿©ÅYƒ‰¦‰ž0ù¯Ýg,ž›hþ Þ⊢«¶•M¿’Ì™`u¢ÙÞȇ¦Ý lÙÍEÓÌâ©vd{èñCô´Ð‹w8Ú“QpêæòáÞØ8óíÁ•>À²MÚ'wÁ~¸¥œÙ¬„^ªåP¢ŠvãÿÔpÊ(:‹d'ºcoÓÿÓy«J†^¤¯Áuhar»|êmÊF€xÞ™MNeg†/>lÒêŒ*ûO8UO/NÌGô°.Ά¯öªÁØ@Œ*Ùñ¦eÜ}f]é Öªvõ([P+÷Û½¬º2*tô›?À*|{(Ôà›DG5Ñ fÊöÈNŽÆ•®)»À Aü7˜Vèàš¢gM½6 Ýï.#|Γ<ˆ¥„÷xÈFî#kг·Û€æ²à‡¶8½Â»3ö×|aU‰¦žº?ÙpâE>æçKôÆ«V”xÙàª%¼þ—¢›µßÍ”mŽ|cÍXº¬6|غµlÊ8e‰xß]a¼«ß>„ô.Fì%eÓÆ.ý¦³9² ô´ÐËEÏÈ`èÍ;föÛH•ù|M‹áz$ Æ[Î;éŽU%(QCÙDWÞŸ$Ñ_ÿÑM¶@Nôæ#k3K ûȦ&~¦ŒÒ']ç3ÕçUÔǬbäƒÆßØÐû€%G îL|ÄaÃ[6¬ã’´Ëtǹè6šE Õy(ÚmÓU3:môÛEË>ñ†7ÐñŽîðAWåÅg «úíÅdz…`xTS6u»´¤„ƒ«–IÂôýßLgžô”}`ºKW#?î¹hÕ”ý®9£ÊøŽlªš²!yseóþ±lwä¬Bø ;ÍÙývçí5Œî.Ú˜÷?m|cÃZóaüÇhoÕ~)ûŸ»c f]$z[hcÍ•5ò´vLüb,ñò#{Skoú«æÌûg²'“ïQÓõ¾,Xâ‚Бö@ç½­UsÑöªQÿ{ÓK’µÚ™÷áÜÃýv>Æ:5“ºá+6ªð&älLô‚õd4]ó.Fù”hÚÂ·ßæÃxäÅyYt›ÓHÑmÙÌÑÑ œ~àÙ飫£\zåµ.)›{s{>È8Ú9ªÖ¼ËùOÍž@/ž3çÝ]´qÖÆOÑ¥6Øð¡«i³!ühˆ6Žªe©þ×¢-Kõ§h£Í•Ю¡÷ÁxáÞ8ª9’~&þÈiwÐoÈþºüý?ôÿ]E|Èh¶Ô.18(Úò‚'Ïcºì·É6õ÷$ššÉÃ2U³Ç6õŽáø†å‘¶Ç†ì©|ê>Pëa îŒ}é"¤{æÉÞq…³¦‹‰ž°f³_6|^~ˆžò6±2¸DóU›/dKÙgØ‹OÅ~Ñ)wÍö ÙÆª¹hsä•ïXUu1•]ÈŬ֪UkÕªuR%›&ÿMQe¨ÍUkÖ¼»µæÉMNµ¢d3¾š:tÍyùÁñq–ðùF;Gõ—#_¼P¿]ѱì¬y„ŸÉzÙK~Zô°¬kð¿­«ˆÆ\|tÇÌ·{0TÉþÈ$/ìb£MUúåÑÃ#WyŽ7òÿV4å©È¾ôþŽÖ¤ÆÈ…vd_¨ey$š.u£ :Ùk’š{k%]´Ð—bMôM”Røw5º4d++Šæš,|1"½oŒüÁ¯ƒ9k*Bcä·=(EÞDGhgäªqéð+ÙJ5ÙP%¿hÑÁÑ¡7kâVð`Kö´ÐrçÒ˶ÛÞœÐ-Ñ«d½) ^ý߯Ÿè‘r¡¹d/º”ÑOqJdr™œ‡”=/BÁiÁíøø7vÊz”Ô‡X¸£¬Ï¦Ð¡Xñ²7wèÚZu]H”dët =¤#8Z}]©’@ƒ1>‘>«þÂËÄÊGÕ.4ÒÐg%x¾hÜm«_ÆI¬\·´#c8í·W'u€e´Ñ*þ“mtÇ“ ‡.›x€)‰à9NîÑ…Õ᫇¯‰¦«öA3í4DóiÈV|“UGKPÊÌå¡¥‹¯yãgMèP«,ñá»Á|„ÇߤB]%«QJá:̽á£tˆØ•²|ŒÛV¶èyº†ha;4>hv i„xÑ3µ‹¹ sì†^ýÂØ'|çØ)ùÒ¸ˆñgšd¾täÛZõí­úÖª³RÂû½ Cœ¶”Ä(Ѷ¦ÿÈfôlß9ßò`ãí0YXèÒ|!Û6›µÆI4%¦:ÜGð¨›èj¢1MY¢¤Ä"Ô0ëu$¡î u/|À ¯q¹a©þ°˜e…Ž—=«3WôF)é‡Z9yi©R.±½-{ñÐñB¥l¢w¦ÅÓã²ÅÖÌoýâ­ÁGwx^]áåÇpòÔ'n ×eN¯•j)úCo À9ðÖ±+¥vïkëžtµ¹aÜþB;Û–]´ ~¾¤Æðj›³qd¦·iÓ»l¼nËúöÎÛQ$ K÷.eÞ z#¡#¿ Ö' ©뱩€‰Ø&?K#"ÃìøF¿$tÑ'ﯜèEÐ]ƒƒ¡·4`tÞ›¤ÑŸ©½#FÓ¦B¿×! \Q=°ȸäi,'dˆì4ÜãR1BÊš~ß] L,%uˆÇ˘w³ÐÝDߘ){˜hC+v…±XÑFî  úÒDÓ~Ú‰¦I4ãÒY1êÔ”=tôÆ·AŸ¼?àˆÛ3ÚIÁÛÀGXJ+tœTªåô£.˜¾e¤ã‹,»pÑ¡gäZŽ Ã ×:ù #›:j{·BôxÙãq=Ù°è >Š%[A$šÀ3T%HƒH/:Ú¾ÓyW먦pFö%á,é\ošÓùª7ë¤7G· Ñлl$)¼’š‰Þ„/“ˆ|C6­Íaµ¼«F}cZ²E­D“¦FÏèª)“ƒ¾lÆÑŽÕªš€Mh8c-›…ž¢…¤ù}óál9Ùxäz„³rZ¡Ã` þÀgqŽjʦ¹…S,Ôø˜EÆ* aÌêÂuóÐÍBwë´Éý@¯ÑÙ­ïæ¼Ï GC+“ƒ>&Z%ެ~:Ñ ;¦FÔ蚇b ‘¯ðB’qзìjN~ÜÊíÐDtÅy ‰¦–êNí÷{«z¨Ã¯$Ñô+Ù*à¡öýV'mÖBèh*Áh_þPš!z……S½· q©^ÜzFÓP×VÎ Mq7ÑÊÁ'Ý«cÙÛZt5+T9mÞ.oDDÕ¸N¶|º4 Ñô §€º>ŽUz2˜MѪ§ ™Þ/Ú8l'_„4N'¸±êÕúÎŽ˜çhiÀ‘g•šÊG¾Qj€œá¢W8Ž0ZæCOkäžb=""¥wB¢©¥}ô&döªøƒ[ iˆŸ£%Íû†ì+igT»ÇÈ t OEG˜}¢Sç:òY^—à΢w½;Œvͬ•¯ð6RݱsVoÐ$t(ÆM?³¡R3Žö&î츞Œ$à3rÆw3o¡>sÔ Qa:r¡™µ;Unn¬¹ruXvÕŒ½rFžï¸c¥ðìB¿¦2k5”²ÌäK4mD>UzÌ÷»ÈõÂ\Ê3 ¦÷=Ê7zR9²»µjÃ’-× >kÙZ Þdeò"ù©Ú môDÓê‡DSŠ¡D|ÿ—e­Z’€Ñ‘oë¬I§²`¸øOwǶí¤dÑ®Î'^ŹK[UJ:KM48‰Š*½éÈeöÐ×dU’ýÀUG)1õ Â)'3jâÂÙE·l‹ ‹¾éêæ1Ư§´”WøÂFzG!þÆå’f©]‰¦ŒT‰n\¶2»X@è=`ÁG¶1r[6‹%zC?[¢iA±ŒUK4}Ú´ÇùJ¾1r½Œ1Î8'ÆY‹‚W®Um[­¡ïÿ׸pgë£Ñ›Þt,ä$©q‰³ÒÏ ßØVn"†¬P¥·ðÓSW> ÎÈn s—š^-u,`6£„1²^©~š‘ @]Nmò^ÉB‡ëÅ@ÓØ‹ÐÖñ„/묯ì N×-(XêÊŒ‡•”+=­²—Yá‹ÐÑ-™~hÛûÐÜ¡ÛÇ÷ÂöNŒ ?ÿ*eÀd§„¿Òéë0Y¨zÌÚzêŠèÅ:pA*°°ë* ûY\|ÞÂ~¼lÙ÷×ÞDKGŽ›ÑÌK+€«ZÙ1–¥PXÏx×T2MÝÓ]á'ê@êrÓ2þ|¡Kå ª§‡z^h ÌŸtêdv¥™Q¬/\ÂMéõÁAê~xÞô ¡œ(\pZµ•ðR± å˵Db…ʪ~…?°RªùÄèóÖ/S§çPì‘U¬Ï8¨Ž‚¸³iSiðS[)ë4fè[£¡Ï¬ ¥.™™ß }­Í¬Qd½|¾g53ê:Já»Å~<;"Šý:ö‹L•oÑæ¼+Ñ;»§bíÔxž*ë­° `F™âÆ©™3cν²I,<-+Ø zZÅYóU-Ùâg¤i~Ùåf?%šz%V³V­Y#W3=©&Z9‚T¯­Æ+ýÚYµe¡g–LôÆÙn[ýIè-º+gû³Ñ²W©C!ËY¹}Ê>8Ó.PÓ¼ÌèM[n }x0jwkÕºµjC(Tö°N‹'{ZèÅ«ímì˜'{;²£TobÆ­w3àÁ¯@‡^³¥îÊ#5}HøÄ¦ê)¼Ë©®ÀÈê€ÀI³‰®zUâM)ÉÞ×ô=j¹Iï²h ]ŸySn&EwkÕ³bŸ.zec…¡Ÿ‘ãÓ6œ²,¯Ä²³ !4ù¢ŸïoÐ+®1Ü?Qè`ä@ŸIʦ§åoätÞŹ‹.…&ËùðW¯šŒ»n3bFU´T¥HSa„ÆMå–*Þh•ÂRÝ ž-u~|*|J¯xÐ…{“Y ‚ëM 7V%kCÙ“Tð÷.d¹¢Aw>•ì ‡×-;Ã1¹>¡kVhÌÓ´ÔœÍY7 ΊþÂpãc©¢¸f1ö¥º~d¢M—ñ±Téf X*¬¡Á붺Âÿ%zzçÅÓ1߀SV‘ÿˆÁ[pgÛ—¶åüÁYÈПúœ^ÊnJÿ|Ó²É?á,Jþ¥±c ýu§'þ×»®zâM“䈀®œÒ:˜7Éz´ôûGûه‡=UE3èå„v.öæ9 ZáDHßníÚÏáæÜ}8£XQpÆw’ðgBZ ?éxå³Ã2£cø<Ë0¹pš›íKo?…w>`ÝΟtV÷üÁÛsÇgþ?að럹ò™'Lß/çÖ“2%<^¼TUäÒ1êt}¥Î¾¥G”ñä%¼ðïoH7¾õ¯Ì¯üvëÈN’>Ü»ÁYC76}‹0…¦ìlA3­R8]·@Ÿ ÔÂC7>Õ­DLJ"¶KÒ#B ðh7E.ß>4ÀüÂ]+Ö§öÞ*᤻VeÐší±¯×0¿š¶ˆ%©vþÿÕK¯vIRçý+jØ- {ç=sj–l à <@m&6`›Fòß÷޵ò=U Œ¨'Žô‰AWéôÛ«ó²ó±b…Û¦n½­¢ßÔû¢K§%?וhÆß¬é­L¥'¶ÙT2O­wœJ²»²¶¨ð°Biç%'J}S[•1ð½$9QV:H§K„gé’q•0¼Í_x£• ïܽ²§¡&ºà¸µÑ5ă)z/~LXëæùícBÝm'"ËxäŽ[`C,ÕøyRhq ©û”Ìr“09ÿfG îòS3äïSS“^§mË£’ ÇåÃiFl4žxW`) úôT×U³ÚüGäDjÅœ%9w:n¡©Óü¨^Þâ’ ¥†ë‹> ¨ŽR$©Ê_ ~«œÄ‘®Ê á4Fã6š Ño “S|¡_k=êÝv‡×¨jï½=Ç㮜×ft‡Ì´Œn\ SèC½ì[j쉞«ˆ3³7®öé9s9½#1–¡G]¡ÓO2ï¹ÆNd£³&!BÛ^©µ&4³Tw(bg¾˜hÞx‡Ê±Ï¬E¡s^O£i `£ùœÍ‰õø?üd*¾‘¾Cùýµ4™€¢Ð™q÷ŒÝRFjÖ†r)˜{XðÄñ`4^ª35pg°ÐqgÑÁžƒ&—+L°D¡3_ì¤æü¨0)=ØTo‰‹õÉŒ»ª/Ëw2zBŠìw´ýÃÆ]³èDÏk˜¹î±* }ÖÔ–·ÐÌé±c•EEuÜõžêzϼkO}²\ÏSYÕë€%Ñè¹+.Ó9—üJçmgÐ+‰Î|±%î 5‰˜Ð ¼ªº  }6¾‚k"Úä¶' ç»mJŒtÛÜB¯'‰æúê‚'ž.b§í¤>xªçíÉ,—4:l.¸E›žàtÖZÉ,¶&õ5úý޶ñœÛMç\9E‰qãz…;ækÓˆ¬Ñ3þ èpþ'z>ai]—è‹~W 5{šÊ[R'xS2ÐL )Íg[¿Á‘‚Ÿ ü$zšÕSú½ŠX~Kˆ<…>ûT˜µ•êy}¨<òïùLg¥±g¾w­äZ:ðïè:Ÿ¶Ì'Ëõü¤z~2m÷'ÓöEó¶ÅÈ‚æbw±4¦+xâ‹wù&iˆîEÇMHÍÍ >ïº%ö;!-Jè×ì¢çj ì«êÍT[ºÞäfc9~BG }Ôu§ófö]n#µX—Leh¦K3±KO¦ñ!?<Ë«ÜW“åâºíŽÇ=ôªc™^îùÀÇËwô¼Óž×0ÛXòµÐ{óq‹f›hûÐR¹nûÄjÇm?ø" ñUšÅjôÄqÕ!z1Þß=u:ôp¤³ On›j$§{>\:’.t¿féRÕmÂ(ÝûJÆRûaH¢€¥) 9\ÌM†æÃØ©¶wêH>©žŸÌ>URƒ:7§ØI ®–© œ^ÿ³&Ñ™žgÛN÷œ^E³¥ÆÝR=Ï¢ÃÆ†{l:k–ª?xà?}ëÉÒYï©×Eˆ´¦ú~hf}ºm¥ûÒPzˆ¤¦ÚŽŠ{ô€H·]paŽÜr™©®§ÑÕTד𞃋WÏÌͯèR¹½ð ù_pL8qrÑPÃKÏéI·™© ¥*X"‚x_Sð9Ç"˜§†+~Á¬eÁqmB£)ãYèxŽÃÝvÞÓ_ ’¡‘S©dx¦óCg/ /ðI/xfÍLÑ,#8~*´´uÏéÁg¤JÙ°g¹»1KºÑW0x'ýä?=aÜðHÛhAs¡•ÕI¿¸áÌëç¾O~§jäx±êÑÀ Éœ«(ż@FS±»#E©K4œ«fÅ4Üö„ÞN·ÝaøÌè³¾U\—l:˜KpšJÝ~Ðìim4-p‰’i»Ä…@O‡h›¦mºAßø‰€¡bóp¡×šêzM-6½4ð&SÏñb«±Á©§¶ÔBoŽwÒ•®Æ=Ÿ‰9ø‰QE§o⪇!Þ¢=µEÅ=¦.ÇŒž]çWWuÏi¤Uh‘µè¹˜žô“Ý=mf„¨Nã¡e8ÎUdivG*ÊÇèTÛïcùâFOH!qÏkÄD0ºAÇÍ"oF'U{ðB_g] +¬j*ôÞ q®¬#uê[Ö‘±Î•ÄKULq|ªž”Õ¤—,õ5©ŸÐ|ï"øÅ’m+pGCŽit¨xC{¯© KÈ0zჭ)ÓliôÛsÆ ZÕÍáÑÔzªëª^ÂD[ŒøH¾mü™¦Pœ;PÚèÄOè2Mi}Fó§h“½ÇKF'Vª¥iÛ¢¯Ò§h[K5ç«EU@Yqìc/~¸téÕS{¯×Ì]ÔU"šÆºÔG¨_´TÛB³”¡ƒiM?¸ãºÔ\ìʾ¡—pŸZ«tàz“Q£ëEï‚î95U»)á7šš‹]A6&ë tQ¿Gß©žŸ$:¬xŸœÌÙ4.ñc4-´wÂ+± ^´ åxšmüÇÂcÞá‚Ë6îGm¼óÚ«B§º.o8=˜CM«Ñz{‚‡t]¯òŽRnš•¼h¼+ÝvjÚ¦ÂeÔÚR¦¦Ü4£ñ÷v½ü( xHÑÖ—r)Ý|ÈÏH=fNÎ6C2`ÍÝ# 5šO"´¸eð‰5\Ä…ŽÜE9é¬ç.¾Ë«4ú`Ïò‹~ïCÊkéÙÖò¡z¿FÓôD¡u‘O?ªéãÒ#O5~°Óm:3“w=‡NMû5|ájŸ–õ†ÇÛ§qÞ÷Ìĕ܂«ix¥Õš¾Z§”«üG¹˜o>žoëxê’ð‘‡7ì;œq'/쨞;×yiÈ5ÐJ÷œaeº¾ŠsÀhëÒ¥dõUÓSm07žØ¬«çún<§~0:9o™ÆGêº_kô^ xâxÿ8-z®`Þk3·YVþTœ¼nýì+÷ÝÒc? [àkçúþÂ'Ïè¹­7è x/Pì\ðÈ §÷êûâlœ µœXCG~R§äQ8ö|[.¸íbë𥽕¦A¹ŽItM¡E}§ÉLyôÂDêݲãî8,Ú.˜­Âp•ª¤þlìµÞ=Ù÷Ðú€çCºí( L׋ÉïôFz¿V<µè‚z&Ò8Ç ß´Ð¬»ž˜õ©åFI‚Ó2·ç#c/Ã}hå‘SS])‰’±Boà͋Πüø„ëÍ¢z4íðˆâÊ4}….mâkAðæ gR«‚¿ß<1q¤Ñ‚€—‚/óÓL5¡­7/9:ñ‘øÈ¯Ô#K„:oKqó¶C*žN{ÿ7‹¶ÖGŸƒŸÆG >¼ØÄÁ£D‘@?8@sÄ.¦¯»³ ¡wÒA˜UŒû ©s$¿M O£éƒ>¤ù“~’è³± )Žýb|ÜK®Ÿ(6CŽ£smÿÈžÓ/vѰ0ÀEWö°\Ï•bD¢M˜5.äø…F§C e°âY«©µÖ°TÅECS;Ð=®At\4Ì’½èDÏ•{0‰•~Ñfjt'¤³æú½MXäm¨ïqÑ‹}˸«Eºhè4:ÜNHÖÿ6¾™­yщ-*4RMøê9FïTÏåzé tb¹¨çø{ïÔœo\ÄêkÜ(rÑ…ñÀ.Ogþ®€ŸÔ'syŽV‘<:rÑSéZ• pgÒ€—\±'” ѹýùˆ¼žŒ<ê‹®kûP¸cvpŸV'œÂõV[ªmeÒãqgÑ8ˆ²äî‰]ÎÑÔmsÛ>Li+ФAŒ€/4rnšÇ!–Ê¥…­ OÖöˆ?ƒreoãPJ'ÐE9£ tÃÏ›&áFDÃ^m¦Ê‹FÇ•€rF~ìp£4 œ¡†Ñáǧ]×Ã3é]!¡‹îøLoB±—/4=ÛR®Šy-ùd_³‘ m§¾u®Ò® Á(Y5ÐÊ+BÚ‹æFcS>Ê#»mCYúÝU;Œ>pº4§è§«P Xݶù¡Ü]ý‹¶-4Ê2¸èŽ/Â|Ï+Þ%]†2½LB…ŸÖVA¢òF‡ˆ`ªmz™tÇâ©K:9m·hýf+»\ôfÔO× ?^º¸ïòJS[¹Ûxáè°´©µ›PĹhXQ:ÐS¢ö-š:u"t•‹EYH·íųnÛP¬ó¢;?Ü4kHnÉã›”Ò=Wç«çHg#Ð'®BÄ96zC1ÿ‹N̹œˆmó¢‡ÂéÔu2žŒ±ê¶é¸‡ÊmÐ=6d0"–Q åA@y© …€¿ÐÔá4dúP£-Љ/Ö¥pFÛVÁw$Îzч¯ó÷ î•/ô(u6±_7„ Õù¢aAè/4JÖ ôt™x(Eµñ6“\' ö Å¥iu=WɆšéCQm”pѰ‚’Ñ¡¿HÉÑ8Ô‰øBSïèàj~ÝðûbH >¥gÁÒÑ_hT<Ð)'À”=§øÕ(—!ÐÝÞp:p¿(éñ2{jÖ‡ƒ»´ñ‘a¦Í‘êúTשÓiŠèDßeST%j¿LêÔÁ9}¡ÀËLÓVùrsÊ7žõ…ówÞüBš+µÜ–¬FúÍVa ´ÕeiÏwªçé¶¶8Ý6µó¿MͶtÛ©M¦Ø ’¼hþ,|q‘¸L™Nódæm=ItøféS~=jœ»NmKjÀ,Äè]¸Lt¢ÔU2qhD½Sb~:ïU‰Ô/‘(þ²Üg’Gý [òX4)a+܈dÅ–ŽUY@ð«meDÐÎèI»nihúm=¨bÊáØ*˜‚ôn.záf+/U®(»më…DÝÉY“05¾ŒÆk-ÛvH~ÃÛp‹(…j| ºâ0ˆÛFÒJKŠü™j4¼ŒöNµmíg:kÖ¢ 7Ëhà®ÿp4õ¾W˜^pÚŽªµS¢öu–zä_t¤ÀpthúÓT« ò¼F‡ÕF] ÇÕ3¨äÈî¢/$éðð´%4¨Ñ'ýއ¯ö^9QüXÆŒ~µ®‰£¦×‘¢åR%áÒ«øt,÷mtœP‰žs;ß=§ž«Ó3‘”Ó±˜ÄR>ÂkPüXÄŒŽ[æ.ÍörÏñ¹<,-OúP}`>é zÛQî2eŸ™qðºmÊH<Ê¢ùVº¡¾LVvÜ…›mé¶+~K ðJUÊ6þbWðüê9¾À]ˆžL&bÒµf™bz¶,Æ¹Š´…:+ºpÑ †9…ÆJ%nO¹ÓÑ'<¢Ã¼ñ}2]?‡•‰»m>î*=´M„Þ4¹Îhʬ/WšˆèªyµékThl<M9ÃF¨=âq/˜‚RbĴ̚љqw.á5¢_\áv!É*Qj‰ §£ü”«ŒÄFn<Ò†èéärˆ´ñ%MfA¸qÊ:3oùa©;BG|–¹ã³®õ­×,Þ*›ŽŠg]—íÄ^7åêôÐë¬(ƒ© ~:zFäá‘E ç­È£Î(ÏBS5p£ƒA„KlP¹G9<^tÖe>1ÆíúÃJ‡þÞÆxÁˆõÌ8îúûјcøÂþÍ­!Âܳ> UpÌß5šÆ`TxÇü>hæ6ºAòJ±žÖÁX±é™˜¶ ý7FÓä%ü= èû®È¯g}¤®´,úýdŒ¾ò==géê4“ÃøÁh×3¡§º($,,/tÆ m‡¾ÈK‚pdtjÎO„XŠ‘rt¦çÒPeÂ-%(uXJÃhî;**Ïâ” óÅZ£«Å¼júœdÏCͶ]%oDý7FÓ ¼ºð8µÙ¢ñƒ[}8S¹¿ïBg¬>£¹O½Ê9L]ËUïjèV¥URFÕó„^&·çðhª-5kitâ{·Ì\]¼o2Žiã’¼eTi¡õާ»,\¬T›úÂÔÓºðI%’@bìôBª‹³ŽÝxMlÔ›ø­œ/ê¾Që_§j}áWÆk¤Æ~\Èv¾=rÚÁ#2„T}oïvm;×Ûä*öBÇ~aŒJ‰KÝ8f*xƒº‚‡Jd¢ñBÉÏE’¤{ýÚN’-wT4Bà‹!Û÷Ø«TM^ðHΠKæ¤l/JZ£¯ã^Sgl¿ÄoÚùšZ4Ö&¥áò;têæÎö½e\`½§Ð&ãÂåz‰ÍÖ]HˆNÛL ÜÚƒ´íÜBx‰åæJ!4:ÐOæbJŦ±…¡"½ÐCOަ°—°a‚&ï•@l|Ô#ù}؇Rm;‡¼ÒM}hcëB£L¢l}xŸÍ«e¸í‚_¹Cf=•Ç1Ã’NÛIäH”àÆùݳ$Ñ|¤¯•h¼cûiV¥˜²LlUÌŽºÛ”¿5íW¡GŒ$Ÿ$ …õàV“`ÔÀì±i·JŽ 0½©žØ¡ñ^ =Ï¢ƒº†—»­úX±˜ ½CT…PË%JíXÍdG:r1{é^YbgÐ}º$lOö¥œCJ•\#7m2÷鸶˜HôB^›«(MÓŠ>m3-b£;~c-ÆIŒ› '‰Öº9Ï`Yå”~oµM­}£YbP‰€TX!ðFÙŽÞžï's[. ·­:ŽLÐNh,hç¶'f_¹mz'Ñ-HÜô…µ¥’NϵdÛ¢ÛÑ•­/4p¼uR³{Ž×ÚHÍšd®è¹¶•Àž@¿ãƳ–wÅñh»àT UÑh»ÑôµXeúí)³‡‚¶žu”¼µWj©®Ô'[©-ª¢8¸íÃ…>T5Àmoü<8–餖ËQr Mê9©<Ð+Þ7 -¶>õj‡ðÏÄñýÐI´-J˜?~Ò/62Ç3R_Ì|yÚóÉËf ½¹[Úb*”Ïá¶i’ÂY™·E ~‚Õ‡¥o‹N¾‰#nG· Þ¢rRgÕÑœ*=E1hŠÃ9¼@›ÐoÛÔÈ>~£žWiTPå£7o»¤ÚV˜’èFSÖ‘Ñ´ì•Ñ´Âk•ÐÂ~½‚­‚ß,­Dè0Ñé¸/©”vÝ2¸ÈîÑË Õ¸²ßYÀLèØ'èt©7ÿ¼£ë¤*ÿ|Âè®ÐáðãŽ,lz.Šû|è}PoZ*c­ÐÌ:h/Ld»*¹3Ѹò¯èÑV/‹+tXºtÜbc2a0¡3³¶3Û¤èx`~Ñzs¿ðËöëcÍ €rx~…Ñ”+$ô)ÐÊ®7Š®5å~=0ØoHk“k0¼‹ªhm¸çU®MÚs>èÑäL"&3eô„õlŒ>ð _oþ#¼ÔÈÊô\— s' ·Õ5éjYœô‘n[Ç"s6 Ù™ô‹m½Áé.±½-6£éEVgºí}n{B‡xxï.a4£^-ÍE³)ºÄ‰L×Zó î±D@j%·Â©£FwÈf“ ë¦ê B¿œMÍUèoÁŸ[®|£X¬p“¶žqÚ4ŲéÞ:”Õ` gÐ+5î•y¸m«:˜Mt¥›NƼÑÕYfÛøÍêªZLmÑo˜iUãIÏ2øÑºÔ!¨·ªË'Ìø®J«K¢©°huf_§oèz¸Váréª&ÂáF/¼T4zâÇMW®=ºÔ“®FTôTlt)èRÛ§«Ü758»ÕÀè:—25´ûÔ¥Ž—>yâp½/ †Øt¡sÎXüBGªõ~Œ™¸ÊÚSK9Ðï²±¸ê¯rMÞg½F‡ª¢P‹oXð†ÊÊœmø9ëÌY&ñT¿Òv9s”Üu‚ø†®SõZ£7¸î#|£ œ^¥/üÐ2㟮3{£O¦ç‰0ÂÔ“’n”iFxÀ¼è˜søÁç£l–atá—¸>_fôŸŒ3µGgæ> 1ƒò`7‚´6ݧR‡·ó Ç.œ%ßÎS-…ú%Å@[_®”‘€¿Úûj½c_¥à‰'‘nú´ ŠÁG¾s‹F*Ý4æh4õ³NåyWz/ MCó’À˜P­ÆXùò6Þð£~Š”@#wëÑÈ©´¢ÑùÛ8ˉü޾'˜æËêHp±?š¨¬£Ñ K jø¾è(úM{®¼ü½³è¨.GWºÒ™ô‡Ñüp[§k}ÐÔog4½Í–¥ õg‘ÊÎ7š‰ ViÜpúÍ’Ÿ–¾É—R"©ý±T†¥È×p¼»„>5–òÌYj•2P˜môHÞf-ÑY·Ã‘)Í| üµ·™ž}¥vxi³Åiß Ÿt£…ÐðÉ|¤m@×û±V2l|ÛwGÝ/§Œí'5ñÛL{8s¦©öFÓÚtB+Äw«#Qý–0&=ävÍi·|žô}·UE›&ËYk‡†¯z Ý(ÓQ4úÉ&ý5šŠ¹W©§¾GuÅÇSºí…™0[^|2n½íhÛ;ó2ÜJµ£n½Ss® )u»%ÛNÔr®’œáVëQ†o5ºã¢S2»“:Ш4˜c©j­õe¢R‚GÌ”Nºë(Ó>º^«-Q1¬Jè§ó¶»èGt—)D }KõÐHóÑ›˜†kˆSÔâ;ŽP3ÿ©ésÎ`z»†×Æ»KoÒm*öÍ<÷iHG.J*>ZíXǧ£ï3d°ÊCz*ÜiB‡÷‰£KeØ®äsV~š²x<é´ð÷Í¢†íÊ1&ŒÛ^MÛ$÷Sù÷.©¥*3Ô?hv´½ ]Þã¦õøŒžÐälWZŠ= ?_Œy D&=4³Ch¬[/t¸^X<Á]§ùÛîúä]·®=Øš.#Æn”ë"œmtJ4o¢[XèøfL.¸I[ªòƒÑ”„DÛ‡oqÙ>Œ‚l4—lÒµÚg'tüàñRfo £'|؉u‚ÞpÜ¡Èõà=j4ãÚ·0ï#Y~ïÐóâßû=V2ãVv££Ý vœ®¡$ºB¦½¢œ›ª¿I{eÓà‹Ñô5ܤ¸CëO·«×Ó¡`"Üsù˜ÓHèðoÂZ¥SH¿w“‡’ùu›9*$ ­ÊÓð“…¤FÍ¡­›h¿YS²ó¦ß®(|ߤÈ1øÀA@Óh›ÑÌb:²·yÏ7­²nô^£)[]šõ±Ié·&7s‰‰Qó¡é¦¡5Tðœ«L^©ê9õ›4;鬥mgÌd·MýáµH„>´äŸr‡°æ¾ÐXöÖhšÂl4¿ŠŒ¦¯h«¯°‚MµÅŸ¥@ÔéX‚Û䇢•ìÆ"7íÊÐWU©žOž7Þ®÷Ìö|`gS·Ã§Cë¡KÄ„ñ0Û¡.¾®l–¥g4»XH„Z‹C!êø¯è!4N hªÏ݃#‘Ž tØš‰žs ýV±§ã–»ˆZ.ÃRÃ-ñx–°$tìºÎ9M¿XOÍZOí±‘j[hjs™jÛä úÅÔ6£»|ÐŒ÷Ù$ü²`†˜Ð§BeI·˜óG³d„ohûìà31ÉiQ{œÔ:·z =™ÔsF”1šŸÈóÉô|–Ìj1š®–YS=—‚½‰^ôÙØÃ6åþ§ìÙTƒÎšÒ ™ZБ1C6SÙˆtƒçÅ\>o¥òˆe[¨«j*›‘šÉ–¡Ž)É;>°x ËMK÷\EµèƒÎò#,A´¤Èæèä¦KU d4²9嚤ÎÅ)á6Œ>©µ–FS®«Ðb ÃOvõ(¿Èš”–µä¦n“õp)-¡kyð™¾^ڢűÙxЂX¢|0föÍÄZD©”I¿¸‚6¸qÕÕnðl[Ö¸¡ëE!¬ºù¸ëÖz¡O«ýðbB'F¾ŸŒGy玧mÆ*G§fÝD_:ë5ÃJ¢Å¥;e‹çCÉÕûHÒ€vý¸Ž å…hḮÜäÇE"iÛGNÔvWöÅ{>±·à‡FOnã †´û­—Ìb”ý’ùÙ³´èø‰¶´ü„æK½‹XNåë…>2^úåã³R£© ç§m¦6×o™iv¨wêiåÁÃt£ë¥+BÊ´óǹ#n¼Lôrã‰fäÑŒ€ÑUŸûÙP{ÿ;à›ÖïûŽÆ3Ó>sÇ› ^ÍíNÁßkw}çFî@ ýh–$‡Û¼<™+äÀõØôcÎÃë­Þ®\ˆÄț֓±ËÍg4šÿÚ|±šzÌâw]DVªÔgt…Q £ v–Žžy“”¹lB'}ã {à÷6©’)R¦Ñ+‹NŒûdÚž'ºuÝxÏ]´‰q‡º84[s¥Ð.ãOóXw¨‹0 ¥ßêLæ×è ? ‹.}ÆM-¾U2k-¦5“>hjm{^Ss.:èN´½  SWšíÕo­jy˜G‚÷·N&êîºõè¬Ô¸/ù(tÈ9ÑÓáÇö<œ6tÒß r¸Ñ´ðèá®I,£ß[è̸ån¢a³=x>¦„^â`£m‹€ËOݺí&tôpLf>¸ÈéÀ×7t‰Í¸ë´ÚdÿˆˆÓ•.ƒ ÷ÎMÛv\žö]Å@p㌅ÆË>œ²Ô%aNÉæB«Z6\0Gv6=žNêUvJjà%s,¿èR7æ¿„”w¢q¬Œþ+ô»Kixø¸6)þfÓ‘Bh,G ©D¥ ùIT÷:\³tÞ¶´tà¯éÖ+Ì<– G—ÖàjW]™É§ }heÒ!ÍÚ^  táÔ‰aø3á gx{`ÕøˆÞÒy—ô;…ŽHËüL˜o7.E/Þ”â¶+-?ËrýT;/ÓsÓà÷îrœ1ÆÐM{Þu‹2’ýÞ¬ªØÂåbW&ã2BÍ4èÖð ï5³Mzj“MM¶žº„»ÒRÃh~<ð–š67N]]«q}ËêTôÌu}ý`xfè+õÍ}DÀËl?©ïÔ.ß2viØj^Wt\‘&Ú:îa:é©M¾­IÛž¼ð߸Ü>ê*Û)—QˆS*-xEÃO–a,MËLÝ +qçhÓâ½#üš ã–Š,˱—r„Ñ;Èu,WKè %ÒqËd¤ÛQfF¿Û¤R…lÁqb h.ÈwÀ3‹õð"¶S|£:ø·¨çn›–‚–2ÐПWÃI:ýZNì2›·(:+;8%'v ¿KèÓ¡Àè2GæBcöæÉŠn¡ß/Æ &Ϋ¢Æ ªMV3f›Ÿ.‚[›.ô4ºÀä@]¡ø*œVÄj0uJ•ªA«ÍèMe9éö€4Îy+‹Ó=ZT¯™eMM3ìÓè–DŸõbÄZÍ¡£Ê5óŽ]5’yPÚ˜8Ñ…?PÕé;à›&ÑLѳ$ÝadXè÷YG¯BÉYm|B˜Y–@g¾YU-:zÅ]™#a}jœ² u‰º`$Bè= ƒuÉ`¦z^BoZQNèÌ’Ùk¸ d¸Uƒ»c»c4UƒXJìPww]«µÃ¶%Ù7àƒÚðZaš›à‡ê½,qX+d ¬Ë€¥[<ÿèIè˜u/\W¬IL»ñÒaˆøöý±õOßéz*wMóÅ„~ ö¸\÷™ÄôL•†º;Œà½áÃVèH›†æÛi¼¼ÅgÜx‹÷8XkYèÐ;¦sÞS=Wq.æ%]¶× tºñ ¹»F7~#$ª¡,ål˜é.tÔ¢\^FÛqÏsî*0¼ç¹YÛúû¾aÎ3³¦\ú. Õw“1Ð…S¡æ /ü6R* +JòA3FÀíúÉt½TÊÔºð ·%êÒ+ô«ÙÃŒ&nÇ£Njm³‚cƶÑ^‡FSJ¤Ñ~ñ}sQXlÝm?PÌÓè =0Ÿ¶Ù#ãóÅX”ØhzB|zÎ\ ßÐvØ/tÖêû4ÛðY)x¦ëÿ–ÑJW§§KºëÌ´ß§®‰Åjcß(‹å=Ø]¸%5Ü`‚¡ÐqB$ÐòÔ³è"F‹Õn‰— ßò‚ª¤¾•ÄÓ!¥AèdÛ”uü=ðá¶™‹U:=©®83Wø–Æ+> Š| ̽k4õ;½!©áÚŽ+®Õ!Ÿ:µ8ËHêÏ,¥P{×h&R°•ç7ø¼MÈ Ÿšv–£ø­GŸî´™ZíKF+Sä<’ ¡P\ù‘£3Ú²ˆ~³lã8»òÚΠw} O_ô¼¨]Dý‘K)n¼ÑÒœqÆ/|ã}‘j #“Üyß0iìÓ8ã|K×i.q¶ñH´N˜ªNª²œ¸w¥F%j6ßäÐÏÇÈl0¨±ož! jt;¸Ñ«´ÁYùé­LÁ…ïò›!I¿¸+¥2Á¢ ?ø•wߧΙcÔq·Xm?]· ’KSÔÛJ÷Øpª!}^º$ w“†L¦íŽï³f* \èFSe3…«-Aß‘õph~¦Ð¸ºýV=—Z‰çL¢a+»³âCµ©Üãëï[ÏÛÅ" 4 šDlé]Ö”2Ǹ¬û–d¡,—daÁýí’, ûÆ»âtµ¹¨ cE¤ÑÒ £gSo©qgÛ.*¼MºëÔÍš·xÓ-¶e4Dœ3°…Ž,GúÅÄ×Âß{*ÎKwhnÜzR2âѾulUè8Ò…>dø0²ØŽg‰´žáZ÷¦¯ÙÑ¥æNçMuï1ô¨—sH%º ‡®Ñ{>õÁ©0ýÅว2ÇhØnÊÚdÌD¡C%’¶¨d»o9WWwNüäK‘V<íSY%t)–tÒ§5áùU2&öÈ/©sÒóeYšéKµX¢Þþd8Ro—E9¨À56h×·Ô5)f—Z"¶Ô£™™ü“m] xÎ[¶íÎgíff“q»¢,Üe[¥Ñ¨å´Ã‡ÐñE¼wjŸìÔjSIYJ<>"¢R³í^Ÿt+×­cÿ…E(§Ñyvôaæ<;&A붨Vè¶ifÂþEØ>ô}©r ïQ£)oÇI~ô}rR§éÑ •†äCô@¨^£ . Þ·¬ ‹@H^ϹєÊitƒ ÄçdÁã.\ÜòƒÆã.¼l£ÑÙq³œÎ“Ê9ªj’h»¦æ¼réÛ£Š*ÆNôÜÕÐÙ"%‹3az Ð¸ü°Ñ f„V^$ýdWV•¥·©*·Ð¯Í…U1V˜½wÂ¥‰ ´í™m»C§®Ð©î*›´ë+õÉ~0:qƒ¯Ü¤ïT×sè“êzT¢ªÿçÖ-¢]/%‰7#¯¦×5ÌŒÕ4ºñ B—òࢸª¼ŠL1ÿk#óÉÏî;ÎB¡iKÇé‰]š:•Ð@+ªœ`ü&¯OjäµfÖ›jè<Ð[¦ÚÌÈ%bϨF˜NœQ1ŠšËñ±Lý:q7=‡é©Þt!1†•x¾gÃðɹ$HúÅ.•ÎyçÎ2£iɃ#*a…Ù4£ói)¼#*!¥Ì ½'¾PL‚ij–Fwì¸JºZç@ g í¹n2Fî2ú]©pwÅ/˜˜Ð›Š+¹íÉ:ç–ö`qÝOϩӨëúgiVFÓÂG4D¡´ Ô)¼ŸTÛ2ñ©¹¸E¢®‹íjMtÜ5s¦nËhÁ]²%&Å4Û>hüÅzæLÝVĆ–Ç^™àêw +L‰üAÅ£_ls5§£ª;ÏÃÉ“çÖ¥ oÑ<ºCNÙ¹U-yòÜ*t4Ze&̘9bNHÜ^ÍÇC<€-¹ú£?(š .ºãõî¶‘ô=§5nÛ•eYZ.¹Þ"v‚3^K9¤Sér[©s²h¾Ü¦h ÔÓ9,NøÕ6ª†è’™µ)•=jÌÔ‘D§Ž—9Rè­=J½NOˆy,Oˆ€×†(Krz­‚Åvމ£aÏUóðǰVËÁ{®ó'>_ôÁïù%!õ›-¿©iÛ;7m¾U Ùº8‘æ¢;KÿÙ*ìð¶J°Y¬[ºR4–c45B¶¶Ôuµ-qWÛy2A…ód^XÇ¥ÕÑÎðˆ·Â~ä/Dtó@7å›ÃOvºÜúô><®jŠN§rU 1Z¹,,bZ"Š©ÓhÒK<¨ÀÀ‹¾R=h‡Å['<‹âW0—5ÐKšûh›(Õ<¶ übI´ÒôQ®šÑáˆ`nõ˜¸ aã>ðt‘Ž7¾NJxHCÔNzeœéBã`„„vßž3ZB¹á”¬ftÌ9÷æÌ€¢`Äà«ådÚn.r½µ»Ból­*ŒÂœÓEÁ˜è®üa:p#àñÐDÆ@Y[^©žŸ0]É‹îâŒÓžwq½Ø»ÊèDÏ]ÿ n².êãqMÕ™m~ï.]flÅ1d3…«™h¹¼X¨²\- Æ´7š2hK"GÎùX©¶M}åVäb\©r58P~áEC5‰¯Y£¯ƒ©S‘žÈF3žüM÷˜Ýé,°-ôÅz.z1EÈ-ÕöSð«h:WÞ%áʟЕ_äʧ1ή|Z ÌhìÙ,RMY¼çÁGÜx©®‡“!….æá¼fvÙâZ»_è Wº °QË%Üð¯‰NÝK† î ­ ":r‘½3×Í ©Þ‘¹%v-,Cù™±\ýzÂlÝG¸íŠë‰ÚkIq¤cøÅwçɸEB‰i›©O¶sÓ¶ãgÖ"U þ&´.FwåÓRÄrPR æXÇœQÌß”ùR$r°ñ]|NnâŽ4à•d¥F^©7ãžM[Uµ¢ýáUÙߤi‰~oqtÀ¤Ñ\¦Øµ¡Î‰•B‡Î:_ªêb è5ú ™sUèØ¢h“U%uNèЮÊ/¬Ð%-4ö¹í‰wIé¸ÔQ ­˜‹§Í+‹p ¾a%÷@ÏØ',ë©:ÉnB7£Âtq¦£ZËW¤Ñ8¥ôãÐ%…VuK¤;kti…‰‰¼{±ÃõV%.Á¸#*b‚¹i´<¬ìdt…Þ|Gå!¨´C(rÂ/æp½ÅüƒÛ΢ÏÕ<Üö†ÏézÓ–1­~ŠjÀcÕXH¼:}§à+Ášý,oIhi‰Ã]¢ýP}n×Oê5#uè`+ Û  ön ‚¾PúM–§'²½œ4…„÷½8´~ò–`χVæ&:üuðP¿9St½ ¥tR«ÑhTÜ*ÐÞgô`Žü›C_UÌŒü éJ Ê'Ðá¼ÁK}òT’|㢷ÓwÂP<üÅ]-‰îÒÅs€Ýó‚oáz&,,/ô)ØÜ[Irøhܹ=žï{Íõ½à›|X&€ž0rTâƒùä¶iž0™=rúÍç#Ë‘±Pv ©—OÁ¢†ò;e^¬öϘ)ý:êœô¤¥ª24 ´xÃ,Ö*úJ¦íÚ(Kïyú¦^NH…]WŽ?™WÏ܇K…ͨc}‰"ÇB@º2=–±Ô«òÔ(uHèwÖhH`‹­MWûI-W¡æöÖÉÈ2‡„Nu]gSÄ:ü¤ÔxÛzZROF4޹ݹsGÄvíŠîªVAG¾ÃÄÔ®•ÒðÎ:}hirÑSý([Œ1Y¦ŠÑBG½IøÅNOµ-·þbB36©{^a.‰xÃÖ67:3kâ©ÑGí­ÒAךÆM½?G† ?åè£ ~vž<÷J}1G+éj‘$gEÒ9·ZkMìªmi4µdŸŸO¡c¥Òq‹©Îî1·=av@ë§AÞ²ÐQ-­TåCdfM÷cö}Úff¶Ð§B»¥·,3n9)Y ­rÌ2è“éyQm–yÔ¤äNÙ·iôH¡•#ÏÎT¡7MzvÛžÚ‡7O‡"'‹4 ¢¹°ç¡tÌÇDW®Üß”`ÿÀè‹ÑºMÚMÏgnY9LÞ/†g-*²|[°\4NÆ8:×vb±5?DáÑÔD8fž.Q0GSÓuÀ„ó›H7‰¶G= ‰m4;iJî_ø*2á‡^EI´T,X´+‹î…§Õ¿Üö†±üܶXà÷î5õÅ”ŽÀxîybÖ\ï^à’HÌù9ø&ò¸™7Wr˜À)ÃþðS±w^°H&KÜ¡ðYè‰Ïµ.Î «o¥ZC‘@BW‹OÅDÛ¦þ=`ú¬"\˜kc4ÕM5zB£Ð‡æ3¶_ÇÑd¡ãl³6Ь=8îQD Û(¼´V»Z/Ì-Á1UÔ ]w|v]Iôu0ô¤÷Aºí¤h¡vîHTbk’șؾ7“ÏšÏdh{ ªL2¥]^u¹ 9ÿ©sp¦N¶):KËk\ᯢY¹öG»R1Œ]ÔÂF=ê ¶àœ)[œh ô*\±‰š”h;‹<ø½—‚÷L¦FèŶOïú qÛK½ ½)¯Ûh–tÏ+ö‘™‰†×ZÚßÁ{ í Å‹&Ñö.™=¶kªç9tKõÜò[ð³Ê }oy©×c®ºa4å-J™¦”RèOD\vD¨$@ kËÿDè#Úõœ'5oG™«t£gg±ä ÃËÂÊÑÁŠÑSe_¨Åh‚½IÏÎ5~8»HJ¯¸ë*¬‡2@úålà¶$ZÌE¦=ÚU™ Ѷ’×ô;ÚN ·ÜUèhTÙµH÷EÇK—¾Íή.®J\¡1˦K['1îšw®mÚðt(ƒ3ºŒî>ÐUÀ¾A†/4s¡Y ‹´`6[ÓeÃ27ý–± «¥&ÔõºŠjO()~ì¡zÎýêêÐï]eä3›MèC…ù>hf5õËÂã]º4yø. nR‡¡U‚n²™šô•êºb|ô v!sÓ:êZÞ« z…OJÁ±Èm—–ÑO†–‹ñ&…ŽhKpã” 33ˆÑ´ëÚâôPnZ«ô€h*EÁäÆºJPññ.ÞÅ„‰Rv‰è\lÝ…,(zˆv‰§m©9¶-!$x¼t±“YNV¿Vب+Œßñû Ð_ɶ]Ù1mzÄeSps„ißg®ñ•j|ñR7="|™®_RCŸ)ôÊu]¦2è·Ø/Ó>•/1p¾X0¡+›¿Ã Ûšö¼ñz»FçÚNŒÛºÊÔrÜŒ.¶Úe[/,ƃTŸc¡CãíFX®QW}ª…Ýo‰dFÙíW©—weó/˜ÇhtÇ,çãÓ¹ +0ÒH+¡}NgMhê ˆ² ¥dàX-vÄ2+õTç&c .“²zÓôp¡UÈíÒ¡|a*c)4öÑŽˆÿD)r¦W&qßS ÷i(å7¶vhMËB ¥üòI/‡³8‡Â ºôG=¯*ÈÜ…Ê[9 FSÆðS¾âun—>n[2ûtƒ×ÁéãVÅfD¡Cw”ÅQÜx‡Émãjü3æÌS~Ât¥Üœ†{Þ\‰ƒ #¼¬Á]¡›´Yp•´á¥L-¸ÞºËÌZ6šJ~›Hm€Þ,4›€¿†>3xoë*Ô‰J,3Ú¸’óðÄ Û>g龡>ðˆ WŒ.XWDe‚JºIãQÍFx©K¥üaËÂ2 ^x¡š=éåA‰°'\rC©,ô:55né1ÒSf¬TÛ+Õ¶ëÐÃ}êÊâ,'t„rÊ‹¹mª¸6boÇJ…=Ÿ׊û4M|WG›Ñì…ÆîÂܶ¸,e[èCY c†:"¦óAi×'/©.t¸®KÎoX&éƒfaGímëQbôæ{To$ê ˜’Ñfܑް*â{.¯c¢Ýa}¡Ú¸Eé¸W=Á ô)Aѧ㇡uòéjqÏ©½·t1-·½ð™ìDXú˜_-Õ¶j¨Ñu¾D[bI™ãS\€Ž[é¤=Ñö†ô<ålZµ÷;ÐÆÜTŸW>Šè7À1€¾E—D±ðƒÆçÚ%ÏÐÃE9¼4’`4µš–bn4Õ"a X‹Bè3°ãD•,*Œ.»ñ•Ç=p*º6Ä>90XèÓ`¡A·Må>=gÅÇeÝ x>¸ç4±¥ÀM½Û<ú½+¯â.ô¡2ZB—r Ÿr\²=·úÔ©¼­tGO—¦È К0Dƒ[ïAúŒÞzÒ0狎ª¹t¥+âÆÄKÇunŒNÌšXøLV¥úªÚº„©gó(ÇŽqú”ÿ²¹OÖü0z6YøÔOvgx‰rÞÚsÅá÷vê±±6}›%l1òÇ”²@ƒ¯ªšEMæ­‚Áö·$î’èß&Ÿ¶™ïa^UF|UT53îËè(.ˆN‡)M„DÛ9ôJ¡wM3ìç­<ÂNd¡£†F¢í _dS:‰qûœ@/ŸÒÀøÿœ-úÓÿùÍøÃýOÿñ§?þ³ß„Ðö üÅ?ÿìÿËûß¾vâÿýÍ_ü·ôßS~ú“÷?ÿã7EªÜÿù7KìÈ%åæ¿ý©­40ÿù7?ýÙ?ùÙMå¼Å¯¥ªPøççûç/~_z†~ýî?þ½VŠúü~ÿüÅïk§þëwÿùóï­j#~õÞþâ÷_çkt?ÿs¯Éûýþ™ÉûÃïÿîý4õ~šúïïþ‡ÿzùôõ1Íž¿þwÏèëËþ‹ð `­ò |yñëWàÇ ŸÒÏøúëðõYqÑÿŒo¿?vl‰Ÿñý×áÛs‚ïù3~üJü”ÁÏøùKüУÖ{þoò_­ˆÿŸü\®jÛû×Ï¿–.­‚ÏÏ÷ÏŸ¯OèÔç÷ûç/~Ÿ%þõõ»ÿüù÷ÛÏï¿èÝ/ÿ‹ÿÑ/&¢+þ¼Ë'>öÏ.¼[úóyÈÕ_þY¿ÿjpë#@15¸•¯¸ÜþÇûîôßôGÿÃ{Ž}þlK/°¿ùLþ?þóó?þ3ªé£¡ÄÃe½ÿºÎ°¿øíþá¯þþw?ýQ~úí?üåoÿ¿ÿî¯ÿüw‘ðÓoßÿú=ãûW¿ÿŸù»ßý·ŸþüOþ•ÓQ4€²>WËÛÆïÿ×ßÿõ¿âÿüOóÿ²+z endstream endobj 221 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xœ–wTSهϽ7½P’Š”ÐkhRH ½H‘.*1 JÀ"6DTpDQ‘¦2(à€£C‘±"Š…Q±ëDÔqp–Id­ß¼yïÍ›ß÷~kŸ½ÏÝgï}ÖºüƒÂLX € ¡Xáçň‹g` ðlàp³³BøF™|ØŒl™ø½º ùû*Ó?ŒÁÿŸ”¹Y"1P˜ŒçòøÙ\É8=Wœ%·Oɘ¶4MÎ0JÎ"Y‚2V“sò,[|ö™e9ó2„<ËsÎâeðäÜ'ã9¾Œ‘`çø¹2¾&cƒtI†@Æoä±|N6(’Ü.æsSdl-c’(2‚-ãyàHÉ_ðÒ/XÌÏËÅÎÌZ.$§ˆ&\S†“‹áÏÏMç‹ÅÌ07#â1Ø™YárfÏüYym²";Ø8980m-m¾(Ô]ü›’÷v–^„îDøÃöW~™ °¦eµÙú‡mi]ëP»ý‡Í`/в¾u}qº|^RÄâ,g+«ÜÜ\KŸk)/èïúŸC_|ÏR¾Ýïåaxó“8’t1C^7nfz¦DÄÈÎâpù 柇øþuü$¾ˆ/”ED˦L L–µ[Ȉ™B†@øŸšøÃþ¤Ù¹–‰ÚøЖX¥!@~(* {d+Ðï} ÆGù͋љ˜ûÏ‚þ}W¸LþÈ$ŽcGD2¸QÎìšüZ4 E@ê@èÀ¶À¸àA(ˆq`1à‚D €µ ”‚­`'¨u 4ƒ6ptcà48.Ë`ÜR0ž€)ð Ì@„…ÈR‡t CȲ…XäCP”%CBH@ë R¨ª†ê¡fè[è(tº C· Qhúz#0 ¦ÁZ°l³`O8Ž„ÁÉð28.‚·À•p|î„O×àX ?§€:¢‹0ÂFB‘x$ !«¤i@Ú¤¹ŠH‘§È[EE1PL” Ê…⢖¡V¡6£ªQP¨>ÔUÔ(j õMFk¢ÍÑÎèt,:‹.FW ›Ðè³èô8úƒ¡cŒ1ŽL&³³³ÓŽ9…ÆŒa¦±X¬:ÖëŠ År°bl1¶ {{{;Ž}ƒ#âtp¶8_\¡8áú"ãEy‹.,ÖXœ¾øøÅ%œ%Gщ1‰-‰ï9¡œÎôÒ€¥µK§¸lî.îžoo’ïÊ/çO$¹&•'=JvMÞž<™âžR‘òTÀT ž§ú§Ö¥¾N MÛŸö)=&½=—‘˜qTH¦ û2µ3ó2‡³Ì³Š³¤Ëœ—í\6% 5eCÙ‹²»Å4ÙÏÔ€ÄD²^2šã–S“ó&7:÷Hžrž0o`¹ÙòMË'ò}ó¿^ZÁ]Ñ[ [°¶`t¥çÊúUЪ¥«zWë¯.Z=¾Æo͵„µik(´.,/|¹.f]O‘VÑš¢±õ~ë[‹ŠEÅ76¸l¨ÛˆÚ(Ø8¸iMKx%K­K+Jßoæn¾ø•ÍW•_}Ú’´e°Ì¡lÏVÌVáÖëÛÜ·(W.Ï/Û²½scGÉŽ—;—ì¼PaWQ·‹°K²KZ\Ù]ePµµê}uJõHWM{­fí¦Ú×»y»¯ìñØÓV§UWZ÷n¯`ïÍz¿úΣ†Š}˜}9û6F7öÍúº¹I£©´éÃ~á~éˆ}ÍŽÍÍ-š-e­p«¤uò`ÂÁËßxÓÝÆl«o§·—‡$‡›øíõÃA‡{°Ž´}gø]mµ£¤ê\Þ9Õ•Ò%íŽë>x´·Ç¥§ã{Ëï÷Ó=Vs\åx٠‰¢ŸN柜>•uêééäÓc½Kz=s­/¼oðlÐÙóç|Ïé÷ì?yÞõü± ÎŽ^d]ìºäp©sÀ~ ãû:;‡‡º/;]îž7|âŠû•ÓW½¯ž»píÒÈü‘áëQ×oÞH¸!½É»ùèVú­ç·snÏÜYs}·äžÒ½Šûš÷~4ý±]ê =>ê=:ð`Áƒ;cܱ'?eÿô~¼è!ùaÅ„ÎDó#ÛGÇ&}'/?^øxüIÖ“™§Å?+ÿ\ûÌäÙw¿xü20;5þ\ôüÓ¯›_¨¿ØÿÒîeïtØôýW¯f^—¼Qsà-ëmÿ»˜w3¹ï±ï+?˜~èùôñî§ŒOŸ~÷„óû endstream endobj 224 0 obj << /Length 2874 /Filter /FlateDecode >> stream xÚíZKsǾëW TIeYÖ;3ûL%©²QQÊ–Tml–À’@ÄÂXÀ4óëÓÏ™Y`©HÎ5óè™éééþúf³ÛY6{ý,“ï—WϾ¸,̬I›Ò–³«›™q.­ÊzVUj]1»ZÎ~LÜ…IR‹àc.æÆäuòu{áLò#kølás{1wµMZürÉ0òæ5·{è´ \pwñóÕ¿¾¸¬£3³ÙÜÔ©« Ÿvu+ú‹yîòäWÙ¾{À>líUÇíoßscƒ@o«dÇpA ¼I;0]Ë]ÜCø%w<ÇwˆÉn;Ü¢¿—Ó®qU+dwxSE<à¨ý”™§†÷q®ƒ?K¹@÷§+›´)DÀG ØÑ5Z s &½¨¶G ë`M8|ÝY‡ü­xlÐþÀBI‹Ü&o¶²É ç¹½`.uÄ•ç¶L:/^üSê}±œ݈gzß*‹ØÖuZ5nM·ýèðóWøÌÏÕÁæ©©+%n7¢øŠÈU3qÂÜ›6U3«|P5îž>Ô•i‘;=4•#Ìè&™›&-à2Dø÷‹ya‹™Ž?$lÖ(œæ3©y-,áìƒPw2öáÉ] èU‘ñ—)Pù‰|˜ä"„ô»3ÞÆ³ ñT|“¦‰ãmõÉ2V®öÀÑ%2Ð#³yþеIóªÐGøìä )n `kÒ‚–ì{`^–Ì—!ÃÉ €LQ‚žÙVˆ¤Ý²Éb{}`(Á6ÚXGk‘zß錡M{nnȽÉp~E61Hó@fnZäcmEEowˆ)®ÂCç¹)é¾L•QŠ(0,@@M1glGxE&ºûmÕP+X#ÉMœÞÓ-/ʦLÞmÃÆj÷øç ¢\÷[^ æï>vÞ1XE]¹-6i}<~JₜaxGúÕ„s×"¨Žé*¡I˜~‚t°zðH±]†c¶øÚ‘0"ÍHW(^B@DF›“š2J¯¦¬4:FÔ«©#×jüƒâYhC.̫ܦá7Þ†µ±«`e]ŒÌeìíë,­so0¸ò°G?m“;RGvñÐý9³¶œvá/½îô"+špÚ…ó>ÈsAøŽŸÇ‹:nÉ>¬kR›ÕçNr»ñ ö¬2öó›Gè” w:ž8—5 ®ÃBò”;ï2;² ËìÆ+¶Ü$ œ{eà@`ºž\±°h  ÓÉÔŠ¢HÞx&šþ(òYNÙÒŽƒýlf“ŸŒËgñ1žóèT¿ŠØg=ˆ_²‚`Ï?äHëÏ¥K3ˆ³èü}{û8,‚ÃÊi']4i™]ú9ιIëÌÅ åN;z<†×ð€Ä  =rªÝ­ÖGÅ•)ËD³"bû‘€Í ¼ç¾lQ%/_Áà?dlßqã^ÑB‚IÒ/;ƒVÝwÑß³¤£1¬ûàTÆN/AªˆBC¾è^æø­N5K#ï9nIxÿ=ÅbÈUoSÜ43yÚä'ÎMƒzEÁî±¼¶7mr<†âŒP]î†6t¼¾0S—‡§6•!Ã`âÛ…)!â—Äú‚.Fî¡UÉ㬄Âyº²zU]¼Ú•ñæ© <5–͉´UoY'wÏy€ÀäİÃê’uT´c-w!Á4³,ÅnÉ~—‚qí†=,‘=¬TÓ16ÈÄÄpuå7óÝFÜ ‘ÔâÜ9ÐðAhP•]ÚÙ©Ö&t¨Ã¬®³"‹¸¥oy|r‘G% óÖÙaŠ!Ò‰@˜³8‘r¢ a¥ ñ~ƒ©Ò$•3¼ñ€a†ö>ïÿ‡²†uê:ØÉ°93JM°©IÁ)°f'8*šÚ1$9Î!ß¾ÿ“à§Óâ 5Û°b/šÇ/l‹Ô#E\´°¡Ö`á1µ‡ph;RØÒeSªÓæ¼·€gˆSÞï×Òy˜/ó4wå(%‡$<Ï@ÇìiFA@oR1:€ºC§duáí¡?Âo¤¥‹ÜŠû¢ŠÚíö´ªU}*±;­óàPÁ_,þ;Šn‘óÒöyŒ¹"æší!¾ }¨¯€0‘[,ÁwM).Z²å(3ZD“×ËØ݈†N<çñû(Mš*ˆd“¥_±c©FùãûÑJ_òøXMãïªa$?“Ëêÿ^DàZFàOA»šäg-¶øC¼ˆø9pèoüõ|âœçQ±æ£%“+ÕGÛ$ß}…úów®÷s £dÖªð¾Jœ”GU€©rDP‚T­|_kx9H‰ùÚæÚ¨M …ªF»áa%ÐúDO%E^H¹Û8Y— a[Ó0¦30µwj’·2§ m•ÇöÇá8Au’0‹†$G4©‘S;èRssÁPÞ†žÎ¡lå ‰òxõšK:¸èê¢*[U»¯‰î\CæºÕäN,ù‰ÊtyÕiõë8`uMG YÏŽ3tÔØuˆ†tÙFpcŒ~‘´a¢ÆPÐþr®/7'‹‡|â²£ßVÊüÄ~ì¢&‚‹Úª [ìX˜àÎÁôlA•«¼J.ר…Ñ*ìtÕ_ä¢TØÛ†þSïm i.]îëÔ”KöôÆ›°hTŸ,ÒܯY ×Ãs8áqÀš^ü;–ÂïÙ²¦ôô]~ô] “æ¡Øðªá:è;|¥‰p¥L5Ó‹gkUU Õ –ÌÊJ«-”aKꇀŠk´ °ídÕìÄ¥!Ú*”´BEé‡þ^¯ Rʪ´°'Ú2#Ty6RÈeÏvDæç¤žR®3}"Ò KS3©rcýFÈbw³•.ì¯þvá§…(_îF 'ä˜Àß¼LÁÆ§îø²”©_ ª4«ódÎ˪ññ$r?pi‹Y¤Û±µ5.uYuâÛðëu\‹Ø¯}yÓ§B}†I†d‹?òà/(í6¤xê?=›ª«}z(5ËX‰g„¤õ…3^ýA–´Á‘GÁÑ%Œ|‰o!”¯ÂF2¼ŽÎÒòç;©0ÜŒ6C•û>ßù&ŒþψWe5¹ý7Â'kC¼õ/š* õHúc.äâûÏ5Ç!e*Â- }ý®æNÅðÿx|J‡CLî,Tº¼´bKΦµ /ÇšD/U–kªKT9ßù !4 ÜôÆbqàÛ—“Q¿5iÕ¼ÿ—üÛ•÷¦e5^,> stream xÚ¥YK“Û6¾Ï¯PM.T2¢ |m­S•™'µ©r¹b998>PGÒZ'"å‰ÿýö )rìuí"ˆg£Ñß×V4ÛÌ¢ÙýU$ïÛåÕ‹Wù¬‹T§³åÃLÅq˜¥ù,M²PÇÉl¹ž½M7WÁž‡ù"V)¼TМ°œ¯{û >oø«jŽsŸæ: j¨>ÁÓñ œc OÍŸØR·ðsÞÛ> õi°˜¥…]Ë §ühW*‚òå5wZ‹xí#üìKìù™'”Yç ‚Èv %Õ7ÜmçÅÄâQ¤aq?,ÿýâU¢zZŠf ¥Â"ý¼ƒnwoñ‡ûö'a¤ A=W¸›å{BqkÜYȃâbÆsj¶q …yƃM½Õ–Ö&¸#ý•(7I¼‘3Và¶æòŠÖ;n3AK»¬ù£#¥ÂSÍcz Ž{ÌÃ8W¼øóÜÐÑÅ&x‰öôÀwœi/ÜæOy¬¶, ã(¶º¸Ý58eBYvxžªÉ’Äa®2;ð±gI”›ÞÒ [RΉ¶ý¶,çË(ì¡ïÄBßÊ;Ú[ª à%ës‹´G‘®%@ñ²;ÑTË]þIöNŃÔ½ðbozuyAe¿×ð,šTYü¶å¥´Ý÷Úlÿkö(Å×Tó^žëž”'Q Ö}ç+ªÙ÷¦ÝÈæ¶~S_֜̾P‘ɂNÏrÌ+§)jj˜Ï°¸Ìö ½“aUξ—}àÑz e˜á(ïÓbï·T>É™:›eíøBÈno;vÐIÐU¶Ü»œ •š0%€þÝžáÓ„ÔGî°Tž˜à?Ø»ê$*.hž_il\4‚õÛ<:ZN,ltè‡[)óè7ÄQƱš$‡K£YöHgü8‚ÜýGì¤÷¿zÐ+½eÚ =Ši¿ÑpØmö&EWýRÀôÛ}¼Yq_~‹7Süp§0Û4AÒB/ùu=Ay×=lÁC§’z3øß”;vHQ˜Ý7gìâQ(Ö—Ä@:Z¢rÁ Øì9ÌJVqáy”eçA©b¨¾så9úY„åE¨óüÿ0ùÔ¦v]芣€]KÀ~ËÆÁö“˜˜ Ì»g#vëÆëö«úk¹V,ŒRŹËÃRi2êĆÖ"Ö¥Šò$ƒ‡ôFM-/Yú•G÷5£ "a§ŠÈƒËgñ_û¦\÷„ÅS°° —ǃ%|¾£(à?t°bu£Jè2pâjö@ù“£Û‹é:¸­%Täyb #‚âƒõµ\©(ˆúhW“ž.>Äe-žz³ÔS[%5oú€ ¶9ó™ùàÏ»¤?#eðZï±¶;_¶Á´GhëŽ~ïg¡óé]ðXçc"Q¸¯"Ün…D¬‘×¹Œ lL&:LMb'›ô*:ÉBcô¤Wi{$owÕð~/¼É·Éù¬Ë»-çÆÎ§O×S®éÖðÁޝpÒïùµÆh@ÿùóìï‚ L¬+½KTlˆ»Å¾ª’¢£ŽÛ™å{Cñ²E\Nv —À²"}·- úp(÷ÜÚʵ«Ú¹#¤n;í.8:½Ä„–ŽN‡™‡K(õ/Ì7¥Zôk¯—„x;!èhû¸oä0ä6j] †\rÆf.U}qŠLæÂY$Cg‘™0Ša¾åµl¥›p@:‹Ìy³A •Фl#–ûöÌhÀ0¥â¬I·\ JqÃX¤d&1~í3SÜ$(ŒŸŠØE.vIm¼oæ »‹an(Né0RjhqHm»=²±‘ŒûYΨ*)all¾˜:ŽÄ­ŠãœM•7í/«6OyÉkÌÝEQPÿ-fRÓuj*"9RªV –òI·\)>óLÿ"È‘¨@f.O>N‚OE7è£Hò·"â8àªHíhÆ­\1a ø¶ [gœyy¨ù65©†B>üæ ZÇÝÙë´òYÍTÆ_ËtxøT  Ÿ65q*ødCÈ–kwòêûNŸÛm[®Y˜/:Jqð{a¢T ñožåa—>Œƒ¿ñõI´¦œ{‘(“˜’è/€{¦Ò®Mà€œò¼`Y”túyyõ_6‡2Æ endstream endobj 236 0 obj << /Length 2580 /Filter /FlateDecode >> stream xÚÙrãÆñ]_ÁÊ‹ÉÊÂà$¶²I•µGmœØ•·\);‘´HBHËÊ×§Ï™ñÈÁLOOßÝÓ'ëI8ùtÊÿ·Ë‹Ëq11&(Ò4š,o'&Žƒ<[L²4¢8,W“Ÿ¦i03S3›%Ó¿ÃK Ïþ~¿õlçéԼ͓¢˜74‘L¿Ô÷0€u=ÂóOtðÜÍp-o]ΊdÚâj…+w³ÿ,ÿ~ùq1)‚"‹2$*œÌÍ"ˆ†ÉYnvKØæq8ÞÃc *ø¢t¿;š i× —³('²pæçÐ$¸Sðµ3Þ ŽÊã(»»Y´ ™•ºFÍÁ´¥èÀò°’‚6§ƒî éôMíÆm‰‹sdŸ8&¥0Ç]…ë[¢ÉX²<#ŽI¨8W¶Gœˆhb{YÀûÏaÂÛòúš˜M O7·üÜ(h<Ý ƒ'böÀ«¢ðóòºFë7¼¤|Âp³6Å[Ö\nªƒ·HùëlžFñt'ÜÌX„¥ü?ò²ÐÛ _ Q‘ñÚ]´Ú‘p5"99p/àײ¥“‡ÄÈ\ Ø;þS²påA õ §1¥ûOð|…çJÀ¯dîׂù ÷ò.X_fAu‹ÈþB¦DC<5¼&'6Ó‚ÈñéÈzt òž[R»™¢=0\ª–ƒ¼×g'‚á—3(Æâɪa&soÃç—1 ©øŸÈ?>)< xr‡i{O¦¢{QGG1ÚÈ¡Åp\ò¯Ô⮥p¡»­fGû3ž°HÉ+Á^=ã_ðœ<û|üÿ,æãkèfïD}U=ãd›0É‹Ë`lܲz„E𡵞ç/8Q^©[ KoL1à7 ÿDÞÎ…À=&ŠlÚ´DÜa$si8NÒ4爘ixˆêƒ4!gw‚…óRqÃèO$-ŽØè1[‡ÌKv* Æ6ÓOL˜E*üŠ¿› óep–‚„òГTYa”6ÿ1Û±™Ax“bKp¿sÁ54²¦eˉ‹L21,ÜÛ莈©"Ðä«U³'3‚5ÒËÖæäy‘‹|Ñ·ùªìeãÆV¬zƒ§ÅÒˆK†}£év|½º¾â©þfç€o|Z:­šR›ÓÉ,I[f‚Ê 'w}w1PaêÏL®âÞ¥G),ÞÂs)ÏSÙ(úºX>н' Zä{¼•àf¹‚Å[9éÒËUcÕõ,¶oJ{À–2eN<`ã@[dÑ¢ïùѨ'ü{önUj„…Q'>wV8¨ž³%]kå^Ëc)µÀMÛ°[!’;Þh}_Ê-`sÚ›–בž®Ï‡¨l¡—‹5–G~yDF€+TD…<Šú {Àý¥ Wè(‰!*H-ÉËøóèb‘²Uãb›_£ÃÔ0XÝkGš¯]´ójÊ•æÎr+Ñ–#B½³b¢§+­’AE7˜øÌ”}/(Æ£¦ðù#yâëO_{úÃÉŠƒÜ/J5íŽWmdA&ŽZÒïú85Ø]¢ö úêfà [£ÆåÅÊNÐI”³9?‘îìL|õü¾ÿð¤Aœ[V'bWÜNo~úªjqÁ7^ÒB¶D'jˆ´ÝŠ¥“Wî$ÀˆMuœdëj+„g~lÛñÐ]`BœðYÅ ›É¨âd¡’y%Ya…¬ãžö“lùú«¾cà’ÿ:•ÓZT®ˆlØÇ ºLîgÛ°î IX9 ÏØ«ÿìžo{´âìs$‡iD‰ÆÇóJê,9Ï£ìáž®š,Ø£V-¢c¶Hr(²SçÊ'?ðÅñHàsÊb±øR‚ƃfᕘI¿Hȵ® ý#îž>éî±)<5(è­D³p‘ÞH¹K:•‰{*Ë=Å/-~PBQ?è­†‚¿Ÿ +’J£)®AòÔŠeÕ+wZeë• Bm¹°~Îá=]ÕÖ ñØV<‹;ÍþU¾•=WiΓ*¹=öF¸rNBN˜8OÇî±û+²»f°\TȆ‡+ÉÉ J¥€”²-)ŠÞñŒÈ“ 6Íz#ôvr0¥ªÐO0O‰‘r~š÷뿜;O'­1%£µ¼¦[ðœš*Ë“rÙñŠf:Å[»q?F£d1 A“FŽIC‘Œã£ãä½t´PÛªêWºùƒ#—ÂG|éÒQè”|XÅ‘V'M§0r_KƉ°àÇ"Þnªy¼£ø¼f2h†QGýt6‹€0+†l­ã"€õwZ"S;±ðC#m“%•‰(ŠbÔòp¾gŘKÁì—aÓ»¦ïäÞiq©®Á‚IÑ©ËÅQj@1+ êS䃤6pÀòNƒ,âS¦»ÿ’_ä„¡9¬ùÅù*œ”D)k W¬åìI’»;ž“û3_–[ßóòiwrÍL¢VOj5 =qpsÒ£Ò %l–åÓoc¿>£­T´Œö4(K $OØ ys5&‰‡ï±”*é†öÙËq6ÌPyRÚþ±¤µZW×O“¥T³¥TG¶ƒp:oëÒ™BâYì§Âa¯á… îk^l½Vôd«?MCêà¼Ípu{ÿ½6õk`:M°,AuÒúGÐâAÛNTðþÆ‘ æ~oRH©TLxŽ„&Š·£~âPî˜qP$ &ú;lùeL8~QÀ†k­>ïÿÐæXc¿0P-ökäy®qÏ7r lú‹»m°vô^s7a„Ñ«.ãz¯ä2¾²_(\£ú™«l¬âùV®Óˆ‡x‘Ž4qDsÏ\©3,â¸w¥öE@……q_U:–ž¯ÒÈÃ`‘õÝŠ?3ÐE·Õ’7c¸ÕàAÆQ#¡f„¹’¸…Æ UðúõŠ[ñvÍÜpØÍY“…ÂFÅ$§ƒ€1mîÎ@:yáë¸'^Ø’l2¢$g±<ö²µýÊ’P±õ6—@  { fˆø¥ª5dɱZYø•:˜ûF?¶”úmæ¿XX!Qñ¨M-µ8Jº'Ï(BæŒs>íI$qÈý¤²;ùULãM.‰z §¿˜i éò…‹‹ „'Íàxg*;í>pUÀfSð…DŠ_‚þF|`»Þ:ö ô“+„„ˆYrÔñìC]æîFm¯ÝËÇ}Ã8lÄ~uÇ.‹‚4K_#¼'ðâ…¶×tn'Í<}ߊ¤µùÞˆu]Ê'Á±·)ØLÿ&4Ô^×ý÷y)ö¾Ãè—ü™8¥a.Î:wó<Χ?ܸl Qß$éùu¥ô:@âV’”ìGÍ[uƒºTÝŠÖùë}Ûíä†JuY;z¥ÅØê*]b¼¹–{±ßÏw]ìrìúßbíwT¯uŸežéÒµ)¤w÷€>,/þ¡V® endstream endobj 249 0 obj << /Length 1782 /Filter /FlateDecode >> stream xÚåXYÛ6~ß_!¤@a£kYu.š‰s4M“¦»^Á6(äõ‰•-ò÷@ÑÿÞò£DÙ²¤- ´(r8÷ ?Ù±&–c½æ+ õÄðëï»Ú¿¤éù•’ø›8R°2h †!ÖN‡WÇ9°jüôñt`zL#ª8m“ c„Š›«û}ÁQz qaèÁc.v|0€a9¢Tàäê8xD¥µ‘T6RÜ ½TÑ©aChÒm•µ“™s¿!m¡×¡+ðl"ýtÚ⇚eǽY†¯©CÇãÎlL†Êƒß´;nèù¢!•÷Oýš¢Û^Њ¯ÿÍÃÏ úïÌ>ù=(ƒîù¡ýӑ꾉¥y|-‘X/²ãHI lUj®ëù­g3é¾¼-¼Öm[ÀSì€Å„-w[¿Ng×¼1U¯ýv" ‹iã¦àGeáçSùJóldl¯FŠÉšß¶CO.²°LÑJsØQ±C7"o ;ñc¥7'Ï*—VwDÈ˦wÑSÇÆ-Ü)OǶˆ]uúIÁÎŽ¥K§êŠàW6÷>e?.³2 äN: gHy@ñ¹åy"j ™fžsŠ2ú<òŸ2Ê‹[ùFq™óÉ¢•Ço>É÷ÎÐ ìG÷ÌïÔ—=ÎÍ^G1 ¾œ®Hé¼tØVf±¯òû‰RæÊ9+œ^3§µ’rÈôVZ%­¦0Áª˜VÔ¹"–Ö°]Yže–v‚0h½oÇ |™­)>(ƒUy²¨d–2Öd>².ÒÏÒã×&»×È'LCâÊÔüüDVú »F§ljnÌù{H^î1ÖÚè«ákH€¦ÞÙ/ÕÖkI8ŽíEB;ƒrнÞä¢ uç/eNdxæRøz#SÖ9{hÇ>7TAÍ&-øIYÅa©¹„‘¥¥ö§:ú#[U} |s—#mÜøK‡Iû²æn%)¡ ¡×ãºM»Aä¶¾Rç\ÀÓhÿUW¨­YeêÏØ]C«A饯u% h<ŸôUT*`XÛtòíΩ¿‰>=(£oz]jäeŠÉåT=Æsw4&© ‚œšXpX&WÉoU_ÒvVñ* äuZ±Wüäë°.UïùcÏ—ŒpéC&3ºÜ¬¦uÎÛaþoË÷3¾Yñû _{äψîÛ‚ð?./áÙ‰'†ž­žÖï:ÛH}•²;WÝ}±ƒ»¯_P„³å\ी5]Ì ÑEHáIvÕL+ûÁîP¤Šå½ŠçùXmiTËóy®„Ê9_(‹O ï$ä&ÅlV†zÄXlÝú¦¯%?F¸BE(“}£Õ®ë Bj€C¸Õ§P½Ó9¥œ&ÐG »”–Ñ|©Ñt´Ò ‡¹´Ž½¾‘É\‚WiÕŒ*éJ˜.T+ÌWšîÂé,CªÚ@^‰íÓW]Íèþ´ÂH’¥D[øÂ qªå6š=O/¡ÒÀ¢,ŠEEÏÇÇyýPºVŠNF‹’—y¡]d»߉$×xztÖ€ã:T‰ïÓ3© BßÅ~¥uÅÚÛù.â«ø\Uÿ­Ñ?žþç%ÄÓ­uô$òVQï‘1šŒ|W&¬rÏØ÷sùé!¥Ýã/EVâw<}ˆX¢;uÀJÇûâ=Ö'åš©¼ÉE…¬tµsãY’&ŠëÆÀ!Ú¡Ðÿ4ɺÒÅ…i¶ñ©]ý3ø:ÿ…VÈA¥ÏÃq+ès¯Ž- ð34.ý—óY…mFp{ ²L’5˜ÿ”6X'¸UΠ]Öé{¬k¸4‡lí€Y ^*ºôêÿõ¹ðH§WMw ÞÏ 3-ÛŠzæMFjßáÙÃÿùpØ—nkf@¤mHW³Y¦ò(3„¥º­Ê lÏsëNº‚ƪí¡2{È×÷ðásãÏÜh.‘@6æLÿÆÇ|ñ…Qç[н¿st¾x÷|Í»¡k‡/ÿ! <ìúµÏû'“­÷Ì endstream endobj 253 0 obj << /Length 1245 /Filter /FlateDecode >> stream xÚ½XËrâFÝû+Xš…4j5zMU~`‡Tì8À¤’šL¹°a*âQ»2óõiI§á¨i ±Éâ– Õ}ï¹ïÛò:óŽ×¹¿ðð¼_|¸‹¼Nâ&¡vÆ_;BÆn'0ˆ\_ñ´óùòsW\JE_ºNàËË_ÕÏEÏŠÆŠŠõý¤h¦h…÷Ÿ¹øï¿Sä(Š»NO$¢Â/þÖ-×rºÂÍû¦ûeü‹Âîá&á ìøÀï<Æà9Tô×ùx}/ Žø÷qfÞ÷´vÿÝ"»nO÷yÃóõ‘aUx>‚çC›'v\ùù[ÐаOÉωâ 9Š£>|Þ‡N?¾;`q×÷Å1 ª „>À` N¿{3hŠ@wf9À‘ö]Ѻֱbk_º‰¥jõbÊ¿*úŒÓRþ ^eÅr±´¡Ýÿà÷§òmëÜJÌHêçzHÍ‹g šOGx½ÈrÞñC‘8ô¹ ´Yk†³zÏ-x¾ÓžR‡âX/ >k‘ES‚t°Úb!~Ik9¼uaìò} ÃâìµRäšÎÎ U Ñ-|ÙÎqœ¡Õy×Û9…sŽJkæ"Ç2rÄ‚öfò7àuƒµoà+PžñÛ-¤|zužðÿŒ±Qâ) œšjðÊöxYFÐÆ½*ïøéÄÙbm™døçÈ Þø§úù°¾BÆržaüÃS|Ãß-áåØMñÿû> ŽcÅ.'´fî½Åîº( !keä‹é÷ø”^q³¼êv¾öëy‘z1dùä'¯Ee]¶à;¤žlÚ­ê÷¦žè„¤²MÀXã“ >ËÉ0ƒQt9ÞÕ8>lãQ-yB¿î’QËX"ùgÔÌ N›¨&¼."oôJ¢¥XÏÈfS IrËàkГ NȹQ]è6o%HßF»RQ¸‚-usÇÖiEA¾°c+_RÁœHXŸl×J*#`ª+t™%.zmâ"¶ëcŒ`ü½6…TT ó~Å…‚ók[™–ªºH[þÒX’‚ïñCs‡°&zR)+l^’ƒxBÁ´ù·xäÎéápQ-†‘3ÖÇ>Ábâ˜<øÖIzò08¤Ô”¶5ƒ‹ßbx¥†À¼¹ÖIªuen:‘”Áåì] v^ › Ë?›”Ëš—Ž÷¥ z¸»„]'–±Üï]ïGè:ü§Gë°ßtMá8=`)/ƒSàæ:`ž +õtCe[°þú—e·ŒIC œYzWûækl^œ~ÇMwað ãø0Î’Üç2 0ѦÐPïŒ L°HKJ†ÙW2³¨ê@“M_7Œf´Áä8ß5MZ:@ž+I±ÇÆ¢L¾Ôh,Œ«g æ°¶™<¾ºðþk™ôœýÑÒg·4ˆð<Å4·¥iù»%9ü3›F.ï“©­ªDKÔù³'Ú[ã®lêÝX0ýjü¿S3®kÄÀ'^TI`t¼?Ý£&ù²:¨jNë‹tQÌ&üÔø¹ãØ.^›[°q3{@]`\ æçˆg†Ð-}"y'Œæ0Ò3x‰&|Qµ˜¦4ðØâÀƒí–593²|Nb怾ÿRýá.æ¯ÔaèÆQ ›Äã¸Ä,‚ʉþøâ?NhÍj endstream endobj 257 0 obj << /Length 304 /Filter /FlateDecode >> stream xÚ}’ÍnÂ0„ïy “ƒj'>¶ õØú†PU Eˆ& ”J´OßM3!n$8|²£ìÎÎØ–lË$›'ëCH&³\2/¼ÓŽ…w¦Œ¹+˜³¹ÐƲ°a‹t‘©TžXfÜj“Îi[5q *bG¬‰{âß[ÔTQý‰ø$^ EÈkìeƵô6}FÝúO˜u€~¯¡#®ž(WJxe0ˆ +h·ž÷ÄÚÍýj3î Õý?FYkdìû êÝ¥ÿ†/3øz¡í2WðØ`Æflˆ)q†‡2ªŸõ8ƒιwFY;f…8娭 8qw+‚"´W÷ˆ 4c=òNs°¦q´kôµž¾q-õH£?Þ?O—'=™ñsvN¹eÜ-¤„aåþµLCò s­¦7 endstream endobj 167 0 obj << /Type /ObjStm /N 100 /First 858 /Length 1871 /Filter /FlateDecode >> stream xÚíY[sÜ4~÷¯ÐC¬»Ä¤0%iig€2m.™Pa˜R1DÑ‘4…ÉCrIápÌI(¯§¥ÏÀ8¼¸‘rÌ‘IÊЋ¡HÁ}Ö sÎPÈ$^(àr¼#9ÈYø¹ ™‹Îe§§™xÚ6=;=eâ)e–SHµ—h€nûî)ûä]ƒ‹y¨ñÅ™ø¾kËWUÏ.˜øþü)¯«w=»Ìð‰„¿þã¦Â‡bVeâ UM¿$ŠÓðL¼¬–íЕÕrÌDZëÛjZ_µïØa᣺Ä4E‡±È—Û¡wâÏÙ•…Q±Ÿ~þ §¸‡(Ÿ[r7Ã|~¹«G¬sžSv%–Ü¡ž¤¥å^&ª:sj¦½æŒLÍ-™8’<l×jüO`¢Q·ù´B¡ r­Qt• ñ}˜¶™æfš?€iþ¦í›\âÓÀ:XT¢dí@/ÁÆœ*YNKgë—R~,òŒË®¹yÂy‚K#OT›ä ><ëØ[wÙ¸ ! l5§b"XEHNkïyta_ÔÖVÕp¬/!«±}€õKñf ¢>6PѤjûW–G.wò`«9ö8iX¬=:ª4° ‘cë‘6ÊrÕ@Zp鱫‰NÄÚœcÓwp=ø›õãÞÌžy“Y´ù=ŽY´ùNeÖöï×`l¾¹t‰’U œöži`”mb"Ø¢lí Ën° ØÝ“ëëÃÃ. Jš->Hu κªèë¶9/úŠ}zþ9m8רˆÔ:?¸vº÷Û뺟ãËKöuWÜ\×å’½ú›¡?šeÕÑWÍ—'wsµÔu²n¹6¯†I?6©Sfâ»bAßðöU±¬F÷‹_Š›«óº™MŠ~y€ µ*ãY5SõuYdâIS¶Sˆ…w^¹ÏÏÎ=EïÌË•iþq+ðýxñcÝ  ïã´ÎéŽ' ŒS0÷Úœ%ðAꟊÛðBެF®%]©ä<{ù¾*‰oêæ7ñøôtœA<.©ðŠW⇗Ïé÷éußß|.ĬjÚEŇrYòj:ˆrV6©q={]LP+N æjÃ4 {¶s;™vÑÈó eXǽr){ô5J­¥úþet#ס‘v[4Ò&‰FÊØMé[]èÎîö©îžú^ô¢“ŽŠt3ùøÜxÇL”™N]ÏdÜHsÀÂkv,ØŽñÕ¿y,>tŸ¼ïæëXjX½E +¢ÆŠÑV¥ùrÅèUs>Øy´5~Û{´5î_±æÂ*Ëþÿý«¿ËìOq“—Ÿ endstream endobj 269 0 obj << /Length1 2099 /Length2 17301 /Length3 0 /Length 18556 /Filter /FlateDecode >> stream xÚŒõtÝ[×À Ƕ6¶mÛöŽmÛ¶4Vã4Nc£±Í&iãF7ç<èyÞïãÞ‘1vþ¿5½ÖœkQ(©Ò ›9˜%ì]陘x¢ò"ZÌL&&V&&8 5+W[àÖá(4€Î.Vö<ÿÐu»~¬‰»~(Ê;ØdÜl̬ffN&& ÷œybÆîVfy€Œƒ=ÐŽBÔÁÑËÙÊÂÒõ#Î>T¦ÔfnnNº¿ÍÂv@g+Sc{€¼±«%Ðî#¢©±-@ÕÁÔ èêõ?.¨ø,]]y=<<Œí\œ-¨éV®–  ÐÙhø«d€‚±ðߥ1ÀQÔ,­\þ%Pu0wõ0v>l­Lö.&nöf@gÀGt€ª´@Ñhÿ/e¹)Ðþ½9fæÿºû·õ_ެìÿ6665u°s4¶÷²²·˜[ÙŠr ®ž®tc{³¿m]>ìÝ­lM>þNÝ !¬ 0þ¨ðßõ¹˜:[9ºº0¸XÙþU#ã_n>¶YÜÞLÔÁÎhïê÷W~bVÎ@Ó}÷bü÷áÚØ;xØûü‡Ì­ìÍÌÿ*ÃÌÍ‘QÝÞÊÉ (-öo%¸?k@W;'èzšZ2þ@ÍËø·ù¯åü|æeý¬Ìÿà|\ŒÝWg7 ŸÏ?ÿKpÌÌ3+SW€ ÐÂÊî÷e ù¿øãü­<ºLíÇ `úëï¿_úfæ`oëõGýï#fT““ÖÖ¥ýwÉÿŠˆ8x|èÙ9ô,ìLff6çLJßÿúQ2¶úwÿ°•¶7wpÿ+Ý}úOÊîÿîª5à})8|t.@õ§Ñõ˜Ø™L?~˜ÿ?·ûß&ÿÿºü//ÿ¯þ3’p³µý[Nõ/…ÿ¹±•­×¿5>:×Íõc ä>fÁþÿªjÿ5º"¶fÿW&íjü1 Âö¶ÿÝF+ +O ™’•«©å¿Úå_ëê š­•=PÉÁÅ꯫@ÏÌÄôdÓejóq}¸|ôäß"àÇðüoHq{S³¿¦Œåㄽà>ùƒØ>Ìãhôü»‹Œ ö®&€âüæÎp(;€Qø¯¥€QäqEÿ€QìqÅÿKœLF‰?Ä `”üC,F©?Ä `”þCñäþÐG<ù?ôOá¿ÄõAé}øTùC>UÿÛÇ(ü¡úÔÿÐGŒþGü‘ªãñÇæ9~L¬Ã?JgþÈõ•0äêò'Þ‡Ðåãû#þðàúGüÜÕÒø­ùH×ÕÃá»ý?Šuÿ~äëñY>¬ÿŒåý×ßø?cêæìüñlü}¥}LÓøï7 ôšÂ­.9˜ò†Z7†v=6ã{ÐNó/PjfRÓû¬:w»ýF‚N£®Ï Þv¾N@ÙØ§ºZ#~õ9ïh†Žøš¢Üùìûb˜¤2wØ ·2‹5¾t¨|TÏ! ÿR5O§«Tþ¢È$o‡Ê•ž†íÚùûÝýZÁÌ;±L-œßEëg–ø§EïÍ5—>\r\Bð;´É9J‘“tìeŸŠ²Ømþå|Ψ„ѵÐÁäEY \R%çÐJzþœ@¹^tò¾Óg[ Óå'â&Ÿ0Š Ió”:²± Ã<«€§W2BÕd-P3Úî~¢¾‹Kõ^ß俏ãi;¢{~ô½ž<Ž—'(Æjã9I9È4s-²5E¬ù)Õ"?q•1—¸æRÝ¡÷"†²zkpëß2W;½-žAxO.l¥ég¥æ“”«¯Ÿ{-Çt[0î0CfQ {¸#÷g]YÞXSZ9†ÒI³`‹ ý¨Îã•ÉÜfZİs!PÓœUþm¦uAB07$ˆ´ðš×ó£Jp]ùí‚íP%F*^!š!Ë1ÀpvŠ@07è€ë2ŸÇá”§MÏ­T,EG×.Ë€qÔ¸eaã(`‰-¦Åö–m4yëÐUŽÏŸ’X3;¬ÆCΘÛM ¦ßÉrW90{º«ÏÚ½nŽ:ìJßå‹“ éëlýHÙK"ð²°-íéRG6@Iê:ÉY"‡ïA\¦¸ñ9›gŽAÁÿ¼2Pc¡Á FN†ÖpÆz¡yÎõMÛ]vµ˜¸¨ç“%w­ìϧ‘,-¼†wöÄmÜm¸õ‰òLB¬[’L£óó“»Mô˜k;ƒ8¯wu¯N±Uo¾ÂEYbF®ß¸¤×0s(•RÂkœ=K‚¤Õù%yØ®éc¼4s‡‘¶ìð½ðˆ"š¿™ÃT‰HÞ†ÀJYhZ.ð¡¾OáÇrñh%~ úe«^Ý*]|+¨ëQ †·7i K©slTŽ;WYгՀàb&”(Ëø„ÕNãrt‚8?¤fÆý]Äx§4%8lM7~Ò8‰<Ý¢‘¹óÅZï$ šé–ó‘±ÊŒ*Uö‹¶5*Ù‰ÇK'Y§ý„ó.¹oÌûœÚ9èÔýYŸj­r£÷ßlC ’iè­5ë¾J,"gÍ7&6} ùððA 5åæÖ¼ñf‚d‰¶¤´Õ„`G >Ow¨4O[—?2pçàÑéT•XÊ:‹Ÿk(?UØ×âê5ê+Ç„†ðœ ímv pØâÚ3™p‡Ûéw]ÿ¤;g\«ø¬§MΧK¤.M6Ü+_¤xA…8ÓÈ ö²+W¿W…£wG³+ôèÍú©¼Œr6£,ôš%c*º—’–*í6Û&ШGlû±q,͆ m,9>Á&űÉÕèÞàTäÛÅ/zRAþgÚè†÷•ÉÍo˜0Ïè¦}ÈþT$kp2îË.HÈ~™#ÜNKG³;>û…áhuÓ.Ó)¨ò¡Y°”Êô߃?EQFgÉS6r6£v ¦»êl?Cè9ø²§É—·³“6ÓôÔ#÷^¬ñ5ÄN§‰ÅÇ6ÑuÊݘ[Ó¦&]Œ÷t÷N€ÞŸŒå‘z2 cVê¢$ƒÖüBü†pìjÍ Ã:$¿éµç]zD·+¨sÝ&tô[CIÄJàæ`öüóÕź{¤†Ä¢ž°¥Í‡ÌÖ:È”\.b(°,ˆ«+¨ÞaÂ(iô;ßÕ”:•ÅáÝÊÓU©‘"KFLÇk)κ· +$Ó>üÄ=ŽšFƒOW=죡ÔUbŒA„nÝVddo1#žð…-Vágà ïw$V‡€@/?° œU9e–>û“×ÜöJœ‚x²;MÌöf$>§Þsšë5{Ý.k\*?qü·é.Ü•¯ØÈK¾º*Ù»_؃¤ãÐC«òœÛîéEômFë¸4à²A¯®…¯øùgï÷4‡vžwTÀ‡‚_üzÃã $Oo…ßDZóM¸g;æ´—²ä+º›ckÑVÊ÷Ьàãw2c¨Gœ¯* ý6™o²á–²¡ùxÌèê 8>šçÑ)õ9NWø^×Ùt©p}ål¹%°‚„Šlýô†6åæ)Ìu6X¢äÕëŠHDôlÑÉQ|·S'Èí:AovÑ7Û;xî²ÊPîn4È{t‹uûc_Ã2ÍÕyqÙÞbâóq•¡¬;n’‡6%ECYtF[dl;lm ’PªãaôuYF}®ìÜ úž`¹;éX.hêýR\NØmÞÉêVÄÑLž6ÔŒ×tà cäíˆCh!=R!¨µÛ¨+È¡®»¯ÄÈ×sÕdFè_˜KvHý<‹⵿µJ-2}­×#´ft;##hwrZM ½åb3XšßCî+h%0~áæDØ/mï›õ©+ÏA«Ö!i64¢w^³]M ¹êt ÎÁÉ? Xýº]äŠ!' j1Çco"ù[îë S^êˆó±5»Á 7x•‚ŠF“ òq-'sçW¢}#ÅÅîLºöpšÛ¨ëR@:Ñ:D$6Ûp{Ì>Ÿ©¦«ˆo‘pÅ#¤þKI $Qã¾9Θ‡——¯F‘ÏY¸º?Ÿmï¤ñ›üOBÈLž@ÔK—õ厕dù®ÁçéE‰é˜ÁŒh÷dåˆ1kä‚7T<°äßuy˜ù¦àd¥#þ-‰ðÑŠGˆà@°ù¨¤ˆOÆ«ªÌÙ¿f€€£ x7D+RœÓ³0¯fDºÔ–XÑëÏÉþ{*ÃÉF]tø¯Ö¤!´«£5²6qˆÊìØQ¹ãÒ!UÖ/âá?MÔ¨/‘ë‘ Iã›ZpˆÜ¨)¥‚8§<ÿSî<'¶Ëج} ^ð,Jë\• ÛÊrXŸ£É¥˜¿.uý´[yëÉë¦$%££BÈrá*om—kÊ"hh,ŽãÉÂÆÓ€Ÿ‡|6&*#ˆì癚À&“ÊŒ}kýx!¾˜Ò#Äàû7o¯%ÛïÔﯤ€õë;Ù"ô™ý¾Mu;‡ù¬K˜U–RS° ?êÀ¼ýcï”\>Ô/Wwë¡Oİ…×C!(•ù'’rÈ^ãjkœ¿øÄׯöÞúœ¢4ýE›‹Ÿì´qoøû f¿Ž˜ÞËx·Ñ{ÚÚÈ~Lƒ Ðiç2Jðu¾9AkÉÅA2VÞ,˜ôÎæI;49v[”ye&:¹TÄ{N$9ØÓPX:<¤C&ÜœŒSTÙt5tï@ëU‘«‚ ~ ”]"÷]Ӭ͊Y¸eTRh‚2˜Mc¥a’½;:|Ýn£ö[¯“9•· 'gÿÍõÓ°Ç¢ZÔ…E´…“N6¯y1_fºsz†ºð(-’m á7Ò3è€Ã×êôŽ6lLib-Ó<¥‡ÿ¨6f@É)Œñ¯àƒÏCl¯˜c„ ©ÔÖ„ŠekƘ€AcD¯×8ƒÂêyJnô패;˜ã‘jŠâ^>>½ ~ÁÔiðõ7k¡%_›{¬¶‰·‹p?­×o+²eÖåY7¦ŽúþY\|}Bû‰ý™¬­%Ö‡,yÁi Üœ Ó×äÞþ‰ýÑ`vrßäö¹¼¢Î›úqÃ/`@ÆËÔP3Äê/Ôb ‚SK KÜ]yõæl*÷,UWñsZ“ˆ0dDȆ*Þø0:“nÔN»;>€ßè÷Hw0¬–ûªÛ9ÇJ˜;¨bãCÉžPÔ\0 ƒ0)K‡‰Êú|ß'Ígcü—Ìsør»Û0d«kÄHtÖ{eÅðÇæMûΨùеpFqòNˆg¥N;Y¥°"G@Â*eîÀ•8“ÓÈ&ˆThÛMÕw« ÕÔvA©ò©‰[_Äe ÌÖ)šûH½©Æ0ÈUPúr:Ex,J¾â®äüÎ'ßшšS(êYy³µ›çpbÑ“ØÉˆýº2Õ{QJ)dÌJ=WªÀy"ÃÙD ñ}—™³òpI¶Ù›Fœgûi| ÕÈÂ…}LE’ Û«;²JK3C^cµÁO´rê‰xj"Ï¢÷¤Òœ’nToeéêf‡Oqð"p½Y«³V#ÙaæòÛ®¤áÛV`áË’Ýu áý—Î [ª…Õ¼ô+•çïb‹]ùúô J7æÔŸ.Ü_Ø¢gªûÅe4¦u¹{í>ó‚E^8'"9ƒ‘Ä/¦.x›= æ/C6B2'³Nk’¬95ËÎÈršæ“¡ S—Ç›ÆF¾ŠhHRìX`ëH—k ó µŸìçð7pÜ Ö£ŸZ€ Æ’#ªKVž£1)¸È±ß­‚LŸ&É߸EÓǃr,Yºÿƒ“;rø,^ß>\ì/MÝ,KªõsÚ£ DNùáÍç¡?Óu˜Ê€o:¬GS.\ œÙÿ „Uy Ýw³qXZéxûÅÝ€K–9óÙ‹Æ‚1õj°b³æL€Àg…¡k=šj:øªé.ûwt½ÖSKk˜ LÚ!Œ3>¾ï~uq¾BÆtgŒV•¨7¤Š qâh\¾ Az1ê¢O™Q¿¾§Ÿksóc@µYîÊëbËðÍúq"Se¹•ïjðk²cÆ™±­º;ǺËpK¶„3qÀƒ]U ‘L¶[—a¹çèÖt¡ò/_ŽY1 Ä·Æí½aáÕO§´\B^^ʪçnã¨W©3ZÞoùv§«¬žË·QV²$qµ.n1³Éf1M«üÎ8¢_´ol»BÒ&54ͼ6×Ùe›æNl6ΙÎçáU¿vZªnÊvÄQ·cB.ÿ®Â‹Jk±m7Ùu¹Æoxó=ç‘öi6¢¨:¾-~Gh-ÎLªÓÞ²(à®|˜ l8O™“„ð”,czìØ#¯ñ"w¤N…„ËÂf ZÄ@($9…Ÿe@°4r¡P&¨}ž‚2éCÛ¬ÈTQ협Ÿâ9·a+¹ÁØP…I÷[åeåK_?oá;˨ª€MÇ$88Þ¢4¿›“² ÇÀý4qÂ8Õ'¸ïÑ\¢ÑPL ’¯u][¢S½¶0„1Ôo)d ‹®;£—×Z|ôn:¡•ôM†)27LvÖ—LZß6vZÏ·H,·ƒ]Ôo‘·/yÏ€q§jkdl¾]“3©F 8Y6Û»ZU©å]—Ì4–ù¦¡†¼ûæep²^ûÞfQbç¿“mÔ¨Ã{²;é9ës ,cš¡¬òXŠàdoFµ…¼žë•õ«íÞAlÊH­JF4bãF*Â[ÅxãvdPé¥ñµd9eù,jÜs8WT¨ó-6EÞqšO7!ŽiF°â8 ¦£vv›@V©¢[lóh14S÷Ž2‡j ÖKZå„dðÅd麡g{u–fÿ%÷íÂùábõ§oOФB¢ˆb¿º7ÒØ†”ɵ±d½˜Rýrr6W¹®”zи.éKiÑ¥\§cÙ,TºáZ@Ñd/8Û4ÎOùvæ)ð”ÍãÌC»•P󨣪[;g/ð•šÆ^ý?9&'‡]™å#€¬ÛÕ«\¶ƒM Q‘ J¹ãgÏ)fÃÊ\*=–ñ}ƒ†… 8IÁ‡Í=ü 3 ^^l³[k+×)"2ëŽcú ª˜]Êpåã&².«<Âí® Ô ë#úLU»ïñeòs+²(/fª¾˜Ø7¦M0è„ÅRå]~ïÀ·ñÏJE4²¢êNÉ6… ©!ûd3‚Ç6 ðˆÔò°?Zñbí}$q·ù,'É×\ü@,ЍJÞi‹)—'ªðg›/; yß.•o@?0'9ï²TdÊÞŠÕTÿî>®’(OÙóòÇ' w(Ê(T?1«{†áÖqlWUãÚè`ì)j×÷ßC*/B-•VØ9qÌÜÉž7Š=¼$¡~çÒy©j»ô¬(ô ¿Mù2d kl?0@ŒõÒZê¢Ýç2WG=83ì§BÔƒÔˆkìñ_*±êÕ†Eñ¿<¢P%“ñÂpFJö”[ô0´À® ±zK^ŽÙ¾ÏÖoœû ôÁgG„Jj8“VaE¨|L±2¾Otÿúd­èª>z*áŸP—9ØÒè¢ ò¦‘æÓЦ…͹ûh0uø™wô" þ”§m'J¾½¢)Àw[žr|ó44öFµ§~Yùt¸rÿÉz;Êk`Ä9©^ì‚Ѫ49[Ç´JŽ˜Ü(±ZîÜ;€^/™”¡æ\»‡» AB “¬ÀA“ô|½7°ãV«¥X««‹§/ŽZ>?%cóٔώóK%­¿O&ÎùÚ`”©Ð¸“\˜Ò%Ëý`ΚÍË«%è—,Q’í$QÒŽïÑõüÑÅ*//Q^vœã[ùŸc¿½<Ö}†N}¿±0î§íësfØ'_`'jK„GTùÄÛ*Y“•šnL©›ã)„.l„Ž‘*Ì'7-‰´¼5Þ8šÙë8~jÌ^¾æ`ý](ˆ9ä7Mzû+]îÎÉ .‚ýÂ~ìDò-Nmútâ[{ô²­’m«Oòö<ŽŒRÌgqeÍZ¬ÉjO§T[‰Žm/d/Ê4óÞÜl{µ£-0Ë3Kê}Fˆ*sOÍLœ…¶…Ö{Õ$ Ù²xMt°¯µ^esᫌJu­Ëª†” Ì#“ƒcó:CëÙÛxu,?•Îç®´·<ÔUW7u û *‘݃C DÌÛTu“hô1×aÔ”.ÊiVaîG2Y>'î^dŠn™¸¶ÚÀìÎÂ’·;H,Ÿÿ’Mc‰’$ߞϭKÖWÎwl´0Tå#äâ¶µ¤]'Fz…ù®ðØ“§[–ÍLKEQf³°æð oXÖ—o¾ú‚ËD“¨Rt§c±/ìuŒ»d!ß)€ð;µ­)ZDŠ¢E#&\ÎpÙì…ƒ¡ J:ÃL`áÛ³èáFXtµãdýtÕäû—|>EÈõÆørª`pÊ–Þ˜O—²Œ)~ÇSËõuN"ˆŽQ‡“ß9b®¶ŽÝîÉc2\\¿;£òÒGÙz‰'EI0y±¦B~Òœ§…š³·3ÝÈú圀&øîæÄ/jéL*­aHÀl$š¬8Ÿsö;‚¸B—ÿÛ¨³É½ 5ÌÎ~#ktÃ(†3ã“ Zn¥f>%òºïQqÒ Ë7"+åÛ¿ó€?q¬p‘j#†ÖÀ‰ü¨c 2.½Æ€Î.ÁvmcxxÑ{,k{‰$:qÊ÷òþfÏáM.ŠÀFY¢ñ»ß·öÛõm!çæÉ âf”>òï3=‰×ã½Qzˆê˜0êh> Q•ø6¥Sk–þéݼ[¬$=‡$ ‘«H™j!7½Dr fB„|Æöej>Œå¸Xªß$Z¨©ý¢ÏóÙpØEÛLÀ5s¾—¬'†XêÏ¥t&Íå¯(2TšºˆŽã;†á3ÏDÔ`ç1CÔ„0Ìßr½Xºs3NÙýFz6©þý:÷™Uì"D!ý“:!¾ÿÊ÷×A!¶($ÀP†Ú™üâ‹‘°A2µõ;È "oú×%]§nLdtÝæGªÒïXI`]ÜØ ¨Ø¢q jÒæ¸+òäÂ|ÇêBÔIÎ5<2‚ý43œ]$P$a( ­j„å#Nh‰6ûwN–á®éÒª |ØDwýÆÅ±:,òÌÝ´œ´,Åá¡ýŠÝzQŠü´ÀìµlÕPõ+Eúކ’Ï ·±ó½©±x0‚~Qwå‰v÷;{=+†—0á`âW±wIãŒx}Gˆ¬ŸFG5?DÑdE®ŸùÑûè)Ýh‚˜\øtÛDUVÈ[sè§áÂkÃZ ,ü9·É%¿‰~m™ùÀßÒzmØ·¼U…Œy‚m×~‰í¼š×úTfnö-GêØ¡c—P3’j1Q§X“å¢[nÑbFp5L5á~9tȺ¸4µDë¼Ç#j3¸{I3ˆº'ßµQ3ü–¦~s𤱧[S6Pd/G}›¾º‚‡‡ )t¤›q)3GkÍðjCŒ– S¢ÑL$d†áI*¥¦m{ã lFòSW»<ÎÒn¿ÓoU²ew^'JËwB<ìŽÁÇ< gBd»XÂØõñÁ#Ô)hë‡P­›ÈŒOPoWÚùb_jjcã|¥ ºému•š°”&È\óð+åƒ_OŒ(3P½f/-7¨.Àbè¡‹‹ EÏg '†…›¡t0¾ˆHù̵Qyßï½TBà|Ñ”ùþvU娒Æ*®4—¿ˆ¼x@ë)B^Ê¥TEùÃɲäy£\š’ÕëÜ—fœè:O=›­, ¾w¦I¥ý Œø<›âY¯ó®Ä¡ä&ôª×5,)#„ÀúŒÀÌ+l¹4×ÿtvre£ÈØÕýÑ·Ÿ0i… €˜TXlñ´öëÄ)Áv\ÂZ §è*úR°1U, _VÞ–.äfg¿$糑Ì>ø³‹žÐ·Æ7ßîO< yÏà‰õ ýÕ¡Š U{_×ù¨áV6²ÞX Õ¬.C±ü*~`j– c\ˆp®N?Aü¸ðWÜË®Øvu18“D |é¡’¶‰,;HOáõQ<‚Í/ŽbÕ–ù…|mB*ŸcÌA®ñ\ÑœeÄôi‘˹¾Îæ"œÿ˜6—~h@Aë?â›m»ãr.Lä\Àp¼æ:)»z •rXšÉf>j¿3sç²ÑuüU‹«5I#AšÀh–+ [„7‡>šcä{½,LC–ðuÔô›˜—Ðßl¦4Ž3•–§ÓXOS$ü“ï•‘°×´íL¢ÃgÍû_¨‡8,Ùžä%êHéÚ¬±{ät‡=Öfz”ªoê³&má]|æÊ½JlkSg4G£³}õÞ.½‘üói³{ðúb˜x©#W§/9ˆÓ }¾ë·42zºÈ9ÇÀK¢½¾=Èšµ5Ò£…OZµ ¢ö2$6z‘šã±Ð듌qˆýÙŒ¼‡} ÔЖ™Õߣîgf‡5HˆcIî1É—G£>ýLOò\ý,&Šð.çg¿n £Ö,p熥©“F¿.d¤Ì䆄g —ªKün£o£ü*ÀRÌ]nT »Í‹M0ÛɤJSæ’ Õ¯3Aµ¦2ÄÌ ¹wÍ,è™{^´™Iÿ0oØÝª-ÆQ‹tÉÚ¨ÞÒ±ãÆ¶™£ý$¿Ñœä”õ[%¯d|3f- ù®øTw+{vsÖÙú–î“ã$»C$›Ärö:ä3ìX}<,M×J52ö=ZÙžú))¹Â)åâ 8?ºSÙi¬8Ûtäöž€f?+¿m÷x_¡Úvm²Ç}k1sÛFPœ7pï'Ô‚šrÛ“DI¶¦í¢åY‘Ï]}ÝK”ì1Í;Kòþ­»YŽŒ.•T‹Uyw»…ªØ]Y<óïÊ­Ê÷㎖Qû œÖàGlšðÁ R2» 7Ö"®o SÇRŪ@µçoe@Ì‚"—b²n©m pÑúV!âÀ©·k¨TÂÛ•cWqÅ7¶†Ð''\a}€âjŽj Ÿ²ØÄ`Ÿ2üž¸øS ñ¨ÕÊxÄt,}‡âðlIeK‰Èés ŒÀpëêdݵ\Þ*ƒ'_?BÈó˜du%Òcm—Òñ"`¿ úóEÌJêÈý毎õ%=Ø•éÓ—ìlÚñ%î3)Èø—·äÏEƒK¼Û8 jÄ·èô Nؽ,±NÙǹxÂï²&Õ8ÈÏ´îŽ ûƒCãýÌ|SÑR1‘øz·a`¶¾æW6DLócò•P(2rþŸýú]¥Ìž;J/\tÝû•8MÍÐÈóñPv¾¤â0º=2ÎOí¡Äz¾¦Q<`›Ô‡šyßµ¿ä¾:¼¦5P©;Òsñà‚)’œC¬*ÇÁüç›}+??†A Ù»‡Íée%V1D¯™ÇmÐ#ô¦œ%í6ÕR¢](§P2n•ÜUôåÖ-¿•¢ƒ¾:~¯3Jë“L2sÅå¨HeMDn¦Ú~c j´Ä]KÑ‘uʦç á.v^‹Ø›ãÎ9)…Ϊ˜dO¦H'§<$Ï7O¿º!¨<–Í¢(t˜†‡×È3i·q9Êñs‰z-?H€BÞÝé xꬑ€YÚ­\ )V¬²›N/ø‘a>Q²rˆÖ“ 2`¬F&ü\ŸãŒ]¶—Ãqv0Ë0d‚í0¤ÉD.µ+¤îŠPÜ·ô[ …†çi‹-;ˆÒìuK^2Ò#høÃ¬û-ivaá5õ1Î]£åiLú¦ð«aKt^x}–ì º~…àÖ÷uÜ{‡{YêOnV|™¨M-?µyN­;Už}í LPµâ‰ *Ë*ê:Ëø¿eÒ@X©,C lü¾¼Y“<ìA—žZý¤bÈ“éÅœü)åù•*Q‚ä€wW'«w¨C‚ "iË9»xÈdXwÐs㉠þÿ*Ç7 ˜«`‡Ê[˜†H ÊÎDºzkô büÔèЂ[” í-UŠÓ‰$ZePúyN+YÍSNݧ±HÍðŽoÓÏQœ°ópwèÚ\ |–c9à’ñ‹æ7ÂÊzÀ’L3”CƒNÝ1öÝX>¢9f#¤ýÞR2á§©$;úÏö«”^J½§,`Àê5OgºI(ØÎh ˆ" sN!¤YØŽCáÍ‚w±`ßÑdøuئNlàiªu±[Þ˜,!{æ§PºD>[Õ¯ƒš-{‘5äGßQ7_DÜÉz²´é’P´­g~A9šÄ bàRˆîtÍ|#Ÿ¾ Yw½þ-Ý™~gO@jßN¾]”{±¤4lMàSź‹iøŽØøçø†dImÂMAMSŠ3ÊçÒÓ[ „vg8ü+%7È$ª_;·$R(oÒóXŠ;ÁK׎!Á­]̶1­7wb²äw+H6mˆb{ÃÙt‹€^O±ß´LÁé eß`ß¶ìÚ}Ï“ô)Œz¨“'Ë&êS/ÝT\ŒNaÃŒ†Î>ã†Ü»|ñlŒWåéSºõŠ”f6ž\‡Î•ÃÍ eëèÖ+[¤p ³½7:GO5°ÂˆÚ¦¦7]·Ôh˪Ö¿ëÇ0Š÷9‡N³ô¨Ñ±ó'š §iȪ oUÆ>Ç ÏÑ7‹à§Vj3,ÂŽnPÙ˜¨èÆëx–>ÈáxnEMÏ(¢þ•ž˜¤Tgù'Ò"³Wü„xò9îÐ×ôÀ}”#B‹D‰òoâÇ¿*ÏCjÄ[‹½cc ˜¢¿ý&L°Ï´ËQŒ~ì*s@e q§ow •bœÛ#¼"Þ,®Ã@÷|ÙË\^Äî«Ê%‹ìsíÌ›oÿy`)— §Œ$dLÎQnëÂg.½ã0l¿îú•hÆDš‡bã.C]¤¶ª`ÕÅÓVÉ7ó »s 8»7ËUCC{ÿN´é%ž›™ Êm#®rm‘ÑÀ’U¹ 脵fX&ŸLÐúë¼ê‰Ü=ô³¸ëœ°E`'çÌs+奌¸§\VîC %­U`Ðî(_œiÊ jµÈù¦°Ïúd++«9!çj’:ÝÍ.˜ý›²ž 똂åuY¼~û·f5l; ^¾ÜäË!Úrè³µøÌ)/W0=4}èE'ì6p¦sîP£Ï¡¨‹H1QDó?Ò%Œ(„´÷hàªE:z=¯Æt\¦šû”ëŒAñ@ÊKQÂE|~ôˆ WÝ÷,9T½ ¥35ç [/©CúÐ8¥~A‚^>š6ÒLPrK¹ÇsppN5Ãk&²”vxqcŒJa§UÈN“¤æQƒ©CâÉúÁŸò#, 5ØÖ–FR{ÅF¥•R%c'´ôº_¿14® î«ó#åK|!éÁê{[fç[n/i¦éИ^*8ÿ%u<ýJõù™¢Ö§­ek4Ÿèã´2ÊÅ—àKRKÜ+²:ã¨#o5±©.Îá„Àù× ÍÕ7ÂpCh`°½dð Ê»#±}SÔñ¯Aà­ny¿ ƒsoÆ’8ùœÜ½iÃPóq!ϼ•ßÓ€¤Nm= úcùçnÔÅ«û5£¬÷§•_ˆ •¡Ëå%ÑmgØ… ?ø‡QËŸßymùZÛû9árxet5(,{Rƒ¬mÏ¡“ÁbÌç¼}‘˜I‹ìÐjòg3æú©ÇyÆz“³ï: Z§ÜÍx·Z;sG\Û™û5§_•†=¯~(OƒÛÁÂ7$‚-D©[*i“NQaÄ—ÉŒóɧuo•Ï 4Jì9^’` à˜9! zc¦*J+;| ;8)9Tj—Ÿ1ºsô ЙG˜º|P´9ðÆmmª‚„vpê«—?¦+-¨Ùë}×¼#ÈõMÕÍ>ù.™Ûh™•×ëö å®U——¤mc›D¥ X m…Ìùóˆ¿æ¦Ù¯!c£èìrD¦’N匟¯ræÛíQAÝÎ0P,»¹=¥¡¸O<çWÁúàtŠN×¼·Th]ÛÓXž“‚s…!܃à²òå+¾b¢]zoÛÆmã¥erIJâã·7š´#éåt Š»Z¤¡é5)Z ý ­îÅ6È]ËWñ5ÒÚuVƒ«1(û~® Ó 8—+œ3¹ôڷЋ$/¯•šÏhí¡™8‚H„@ñ7!í⸎¶tÈEç&-ç©/~YüÖ2ŒU(6]kã'ÞKìä±Ö¢æD% Ð©ú$lb² ú`—Tg -r“eí->.™ì®”Eò.,•dW†ëôÇb ƒ•Kä­I O>GC¾à=›ì[&ŒjCM ñ<Þ ˜ž^±”[á‹ß¦z¼.}·Ï6ÞÜwÐåèÁhs4Íõ²¶0+„¿ÎxyËŠ(YÔ^Ê”¾x1T  {†·o p¤¥Òö"‡q¿2ò°rbÓä0@pa2a†&pÃg.¡•ABêJãX9ñbyÏþ4½4ŽÚÓ°± ´h½Yõ) ìI¼ÚXÂZ7UºÊ_­<+„NQ£'Û8TJqf¿§Û×óÖmy†I¨ÅÝȆ)Š $Õ™Ù#ÕDdjš¼à«Àh÷Ïê,¨/nãÏ‘øcRãW Ñå·¸§ñALPŽëô‹Ç³ð É÷·m ±#l¹8“È«q)iXé¿pL8’Ã(B•¾ƒ3 ¦†ãÛ%? ‡*.¡ -4¢…¢~šóšjMÌI-2ÓÕ .¸Á=3%4¶‡¿·x¹p’°SúNqÚ~UÒhrÇ$^’²°wµBŒørwûU]¹NZûôåy‰Ì²i—3¾5.c¦ ƒ“ [Oœ-î¡êäª6p³Üü§yÉúUë2*Òá¨K—|(SØÛÊ+WÓ˜§ é!½ýÔùä¹Õ°?åzºŸþ)Òž¤µýhç› fJòÕN¤áÊ Øöp¯cÆêpFÌÕàõ)KEý-”‚z<7I•ÙÒŸu1˜vR/©Á¶žæ T$/ y ºÏÄ8ô‰ ÔÞKG9®_ßa@Ý¿‘È® nB9¢EüGBûz¢}¹Â2ƒ_F‡QíI£wnÃTŠ2KÆêI¿&$”¹þFpñ+Êß´bõ•ƒź źùÂ{ùÕ!ÐéðtfƲdâ[€„‹ÿׄáicµg¯Üv5TÒË3e“¦OöFÇ49&âùÉ özè†Fäv¯sÀ¹æM#n™œ`Êæð'—}ê£Õ&QR"å&­+»Ý€z18µ†Çáw}Û>V—_¡B!$劦:©9¾Sª)ÍG 0)êkC‡>Ü þ?Æ ¹ø•æÃ/)—!¤”—÷úDl£–­áÛ|b;@ä@mæ@šK7ƒ6 °öÒP¾–¬Žt–¿§tvnc`%4©CØ#˜žŽë’<Âá®QY˜A½’¡Œ©zÅÿþJ2<¨ÿµn=¦o$ÜvõIN+M]ùíëRˆ,Û;yÇïïØ U$ï=ú,ó™bûÔ$þy…eÂåMWoA‡[õÖ Ï´O NÝUaH¯“ÊÂúq6BŠLLâŸö¼@²«K˜RÝ5Ÿ¦‰ØÓü§Ú¨Ô|\®lg^ÓÕ.Ëœ-¿¨Ë…ÍÓ_Ö¹…b.E\}¿@ßзƒ×z‰ßcAµÎ»§f>:mõç§^¥Ô¹)³fIÑ·¹ ½ÙOô+äªÀ¦¾ñè¡aÔ 5=‚”“l˜_ Ê¯†èèÕ«`vŒóh¯ŠŽÜH¦Ò0¸Êº8ʱ< Òö愉é•×V¥ßV©=?ØdgÓÅç´*!ÁÅe­æeå*EÌ÷í­Br !^1pó5¸Kßž>µ3w|yÆÚ䀜2GX¾*E×.$zdZæj.Z ÿ“ãŒÚ÷=÷fdš‰ü¦d×[ Éôø²ï¨ VßÅIħ&¨©RO :‘ô|T¸èÌ Â”œÎÑ(Å7‰Ôú"“ÑiJ èaA¨5‹LnZjv±„çZ †SGûúÚþ<¢Kä‡}[“º`ä®[1úTB.ïé{Ißàö–¶[‘v67©öä—,O,´Ñ*FHæ¼9ÿ\õÖöç‡ñÝY÷±õÄÆä3·»ˆ€³ù†óshRôân_ñ¶s£gæ˜Ô’à‚õ äpÖpð]xh“þX8ÛÆ2(÷08ÏVG’g'“¨À{6>;›¹¬æÁÛZ.×Ï"|‚›œn¨ÈFƵ‡dä ŽÉ7„j /vô®Œ©NZÚƒƒ¢ˆ3SfS°e2# ŒÞÜ –<,ëÛÕ1¢_.Ô_nÇ÷ÎøúÓ´nZ?µ¤!±'e¸­ $ùäfw¤–¸×“Ië ÓÍ:)ȻۊÓáÍS!/dÙ6Àî«uð èí,î&yÛ«ž}ðZâÒkpk-ÉÆïR÷»…­—錮–IZìm¶ÆAVU4Áü¢e|Û¿>Ào¤{Ð0=©ÜØYÒf Bu˦LÇqŒÏnBôæm†Ð)¸/àRÞ?W^¿b°âEƒ GÐC®É’ÄŠÄIѶٱæ[6礚בg™Ìt(ÛXdÁøH/¡;D—GÊgŒ×p©é3ùmh¨h¾ý0›&;„8ˆ½¶øqÿŒ²7>¬®¥µÃR,ÍÆ#®ø@•Æìô˜-æDw<Ù+mªóUÂÎŒƒ†³33ËèZÕÿSÎ"~¬œ‚g䜳 {7XFÊ*®í ots5áÝŠW‰[–iK©Ÿ†ç»-ï|U– §ÞxçÀãh0ÌU¥)&ªŠg_(6ôÔ¨§üÃYÍ~bT{fy=jUWgü)x‡¶«Ò9Å“”ãê“XÝ­†‡Ø 1ôÚ³öýä÷ØbMøº×²´dÍÜè€t…Ÿ#§‰ÞÖx¾£¦ØïÖ¡‘S*) ^Í»03IˆÔïšÂ*†ŸŠkíŸJÈSLYŸÈàª0õ‡®8LÒ„Ê…/#)ø×P?bVt#¾õ=G?Öú0šfæ·| ¬\Ó2Ù47tÊ]fWÁ.­j¦ì$—ÿÌ•øÈÃÆQ!) ÏOÃíÃì޲ѹÔDŸ©02)NH@·ˆ‡Å„\I!»Ö®7ƒM²ð2RæL OP3 ˆ~¯7´Z Œ%U…®òPm óúÀfêý†Ø-æòÍ_!bœ,œÄdÀû5_ú­æêf †¸ÙQqWØá1ʩۓøÿ ôøæ_—ˆV;lµ²éK!ÚWŠ/2åmM±ÕkUWlÛûbH@—ñÆÍŠûOD}ÚŒž!Wödã’‰b{ÎÔ¼T;¬âôFK L4)zaWÏ„¦…ð,G"ÙkŠÒLƒ`èñîiã(¡ûÛ¥í&ÖŸ4 “Óü6µ)î îý33¨‰/•Ö™D·=rõné-B”útr•ïKù§¶¹@dà¥yM”S v©ùðã¹+*A5f¿£&ÔãñÜ\Ýp¸ q’„©¼µK ˆû.|k'94çÕ»[1(ÎBí— ÕÇAC{Cc7dWœ†Ov8Ìu°üéYW+UáÂ÷ðP]C-ï ŽSa;“e¬Æ±øGÊP%ÆKáA}m±Š‚6Ѫ’NûÆ6GlÁ”‹QÊr¡] *B¦¹>ÏIÇvY¤ù¦&è8E›Ø£±5þÊ^ïœ,Hâ†Ê·ø¶»îÒÜê£öq…`’6ŒÅ9¬2Šˆ•b?CJrwþM³3ÉÅ«^>#"_l)¥«ŽìÅØ£W&jùöÈíá·›¼KMŠpªÄnû ‡ñ~®g@y˘‰ùÞ‹6ÜÉ5"³B­›PÍZ¿µ©áÈ¢Ô¬™H5P*HÐÿôØ+€‹ØIl ]Äú3çHæÌöÒ¡.=ñ<Å‘ž©ìmJ~%E{nΰŠ ó‘ü¿8ù´À‘§fß%ëBü¥Fbc,k ÍãA/¿,LÊ‚Øiø2~!Þo±²EÝŠAh VáÒËâ“yXÛ)}]zaiñ[€`9˜ƒBÁk?ns.¤“úéZŽ„º Kg@_Júuõÿ½e5• Œò ØŠ¼mY –eÌ$€öÛP>¸”¯¢Ê #Û«:¯è (ÚÆ½ý¸¯—0ù+㤀ì@„¾S®„°„ÓiLy(´¿Õfa½õ'Zp-.úÝw&TAq J|"@aª%}?Ü84ž©Ë~¦ñ­‡n°6á:Åîó$,iç¿Ê.®ã¨6àÍ»y'M–{ü$º´>¶•387'tª¦Æå][«YªÈ0ÚòÛáU=ÿc®µ“œÞy“ò7xöêMùü^lÒšryŠŠþÜèÝH´!8ö¦54]· endstream endobj 271 0 obj << /Length1 2114 /Length2 15305 /Length3 0 /Length 16569 /Filter /FlateDecode >> stream xÚ÷pk÷À ' šÆÙìØ¶mÛÎŽm›ÙØil›m³±íäÍ9zžÿ÷ͼïì™ìý[^×µÖ}Oˆñå©ùl €"6ÖŽÔô4tAi5z# 41±’™£%ð?rhb ½ƒ™5Ç?,íúŽ2!}ÇCik€„“%€ž@ÏÂAÏÊAG` £cÿ¡=@HßÙÌ M°±:@ ÚØºÙ›™˜:~äùÏO™!9€ž•êow¿ÐÞÌPß ­ïh ´úÈh¨o P´14:ºýO2.SGG[ZZ}+{r*€‹™£)@è´wþj £oüwk4ÐÄ%S3‡)mŒ]ô퀥™!ÐÚáÃÅÉÚhøÈP—ÈÚ­ÿe,õ/*À¿@OCÿßpÿöþ+™õßÎú††6V¶úÖnfÖ&c3K @VDŠÆÑÕ‘  omô—¡¾¥ƒÍ‡¿¾³¾™¥¾Á‡ÁߥëDøåúþ»?C{3[G3Ë¿z¤ý+ÌÇ1 [ ÚXY­ ÿªOÈÌhøqîn´ÿ¾\ kkÿ±™µ‘ñ_m9ÙÒ*[›Ù9Å…þmó!‚þ#3:˜éèèXYØ@;ÐÕДö¯Jn¶À¿•ô‰?zðò°µ±´ô23~|A{8è;ŽöN@/*þ— ééFf†Ž ‰™5ôŸèb ñ¿øãþíÍ\štãG ûëóß_ÚfdcméöÇüï+¦—P¡üwËÿU ظ<¨™Ô ÌôzzFv+3ÀëãÈé›ý»º?¾âÖÆ6ö•ûqNÿ)Ùùß3@öï!üo,›ÉÈþ º3áÇúÿÏãþ·Ëÿ¿)ÿ+Êÿë ÿߊDœ,-ÿÖ“ýËàÿG¯oeféöo‹ÉurüØi›]°þ¿¦ªÀ­®€¥ÑÿÕ‰;ê쿵‰åÑÌAÄÌh$gæhhú¯qù—\ù¯E³4³ÊÙ8˜ýõhPÓÓÑýÝÇvZ|<>>fòoðcyþ7¥°µ¡Ñ_[ÆÀÌз·×wƒ¦û%ff€ýÇ:]ÿžb-µã‡ à£9/€±=ô_7Ê  åÿKô/bÐ ü!V­àbÐ ý!v­ð‰•@+ò‡è´¢ˆ@+ö‡?õ}d—üCÙ¥þÐGvé?ô‘]æ¿Äö‘Oî}dPøCÿ€Vé}äSþCùTþÐG>Õÿûéÿ¡ìè£wÃÿó‡ÎÐÆòãÿ#ùëiþçü~”küÇý£\c3ç?zæ¿Ô6Nöÿpø01ù~´dúüèÉìøQ¸Å?ð£:ËàGéVþ£ÐÔýñd¢µù/2}Ø~¼»þ¡þ¨Ìöúãôl?ØæÒ”öÂé?JsøÓ؇Òáã©öGýÁñú#¹£©=ð'ñQ£‹Í?>zsú~ôæüü¨×å2|xÿ#ÃGx·¿ñöÇÐÉÞþã-ò÷îc¹þÿ²€@W !ôÒ¼!g yM`ÛC?¶ õî8÷ ñ®j29µÇ’}»ÓüçDòÊtÿ û;þÄ¡ÄÕa²[¾e¼WãæºÏ!-ñò­Ïž/º± S»­Ð‹“hýùÇüµ¿p¿àP+ñíy¾ÚyªøY€5ƒvJgÛ9±ÁËå"?¸ô‰ºÖþ*Y žß•ß«d‘„y)™¦ŽTŽÐò+œ%Î1Șà €t¤Æ…¢@ºpE˜½½›AÊšxÇ“ˆ¥„ö:‰d,ðÐØdˆzœs_+SbpèÂ$ÂÔÀÀ»E"ñ8H’@_ð(ú-þÓWg¾‘§Aߎ©¿s‰«ddbkãP×O°ag*8ÚP~›X`èÐR1«)»–µpú•^7ÚA¾cÿÍ=¼|6Ý>€·ßÂñTŽ!$¥7Îò[à-/dÇAÈAÒË"fnÿ/vïiÒº¸w¾ØEƒGÍn}W¸ÓŽO¬—^¢ÖP™š7Jê§½BC# ×ÊÓÝ&0¤:ÆoÈ_\Ë*X$ØÛ:%áh÷ö.“N óÕX 6Í|q<±ÍO¶ïÝjymì4*­¼ Œ4l˜tyÏïG·quÜ m¡ê¡äWÌ"6Ѐá'…~2-„¢À–qä\ð¾¥éÎÔ"Û äxüIÜÕköÚ7«Æ•WqújŒ6å±;0Cå³fÊð,H«zꊮM¦Ÿ(DK *BÔ•IÝ)³ªË’I¶õ•°g¹M 9ÞJN÷ó²Çµô¨±eø~8Þúi$¬Lùû‡«Ó¿>Sq·PŽ”¨ˆ î1þb¬Á`³øcz¢ q iÙŠºÏo ³¡Ÿº[ïßx'Ó57ÛÉq‘S¨™B4–eÄ1ifˆ:Ÿbþ*ø,Íð[o”Ù¾B*úš#ãwmþàÓfyǘ÷æ›a6Ò‚´Þ—¢Í0d|cv]¹£J/(‘üâ»rˆÅ½däĆäÏ»PLñm¸lîÀOÊP”§˜_1a¹x¨Ä¼+tJA•y*½¿"­{“ƒ³£'‰fQ£èRN̆@þ`xh‹±J5Û{Ï ±¯N,>¹ùÅ£Qz6ºÎ;5ƶ-§juIh’»™J- eiÁŽMxdÿéÌm*Ü¥«FÖï,óü™Œ«p݈yž+w]©¢•?úVM0 ²Jø›Ä]TiG#¢Ö⬶Z FKÒ·ºŠ´—%KЦÙQluœzjÛ!Ö»Ä&©–çºEÌAïÚËÛÇÛ²ïH­F)ôùc´~O|*”èöU¯ÈxùqÊ‹ÏìŒ*€ŽDùHËùcÑŠú†m8V|N¼O nv”[{¥—pÓu‰>üÇ_öœïÍií'ç–Ó4påÉ™ªŒç)emÕtC½ÌIšÑ D\¦Ù‚ë.Éíx—ÏLrüÈ .¦>bŒfÂ^þõšV'î÷‰ ¨D¸3/`šÂÙLÈA}¶î ´ª‡ðÔ_ZýŠôuÅ!öêã­LãK€ÆW¤mM¾ûšvi…P4ó‚tN8ʹ÷¸'í$%»+TüS_\¨ (™j‰Ö x¦›ó“¹ +€|’ªŸÚ„Ã*Áu‡¨%Ú` pÇóBò®5Œ¢/ŠMC’bj£ûx\eN‹s×mw¢À~f4‹Jù.ɘò\gÍØDÞÌge`u,Kp^HPjYAãáH`>³` ÷X`"GÍ[ù±@ÊÀô„¦»5Û/¦,.ü†\ÜëÎ^i£r ‚PÓß=ø~œKöSÞ”Óãû•GÆ+Z?æÿÚñ&ŒôÑýJ¬›Y¯evú(1f–>l7’l%¬·g‡ºQ(>‚Â{Ý…™‰ª°¸è7‚¢oYÕ;s!ºkÈcëHÍíÓÉ)Ø¥Þá¯P°9IɶsøŒyŸ½è®I|yôçåb¾,€€Q‚uw(¬;õr’ÒK’^ô-é `Í”ì˜;»ßo½ú¼Ææ& ÷¸ºŠÉ÷ÌvÖ#ÿÖC#ŒƒÃ˜³´—(I”ˆ‰’wð%¥ @ÅèS“š4½æÐ›!„Þº9£ð_У×à;jXý¹”á$6€ØïÅMHKºî«"»Øâ…|dÛ\†½ñh¡Î‹3sH"áÎ’3ªfúD9ê>šäoÅœ:oëæ”ri,µg*6’}…P×eLMò’äKÜc AªBmF<­6XÀ£e4Û¥D,³@j Ÿ\œÔ»A´gÙ¡-K§d$¼žœÚȆ»üÏ,`Ãé{¯w¿Srbt©EIcY„µ ¿íM™ÌlrL%uð½ÝÞ'+âÊ V¡´Ù-Bɧ…t³Fìtv}ÊŸ:ü±óÙ©ºË‰ŲÎèö7Sýa“{±¡”CH<Úƒ’¤&D™ó8ÖKÐ^¯j˜ÌC¸4*E \• „Ùù™”ñµ±È,m!/LÈh‚ âø¨®þ~ö*ܶÀ‘£ö­»¿V;zDÙz‚mŠ=SþñÁ1šôSQÚHÚ‚ˆ‹Ïà9™4JûʧN£Knì›í hÔÂBÃOûJÞA¹ýÀ!„q©xRj0ì_І¨_KÂWïE½ ”@1÷IS—s¢­»ux>EOgÏ“fS§5û®û®Š$BlžU$WMÖênÀ0TQ­ê».Mi%ÙØÜ?`LE°JËè×WÉù|—ÄšKËÚ]Î=bC½¯@ìû}oÓ: GB ‡Ïzô…Ÿî°Ç´ EA„½*KiÖ#†,—$ù‚h#(Ƈc䯴ëþý6ZúݼkÿsQì"ö qŒÈ't•À÷åPÑíAçFH^=EŽÍc  ­BÿhÃÏ6{Z)HDöÈ—ú½¦õà†ò›õOQÇP(3›[ólGDO„@¨In¤9 \ÜKãuãÀœ¤èˆ¬˜ ¤bÿ:X9lázöÂÛ "™ÖÀe®Ü×¢÷Ps5ˆV5°Wi{¬Å#áʺ“Œ9©‚ü c Ê4|Peþ°Ø‰áO°T¼ŒH];®¬I—,„Øïúø×ß¹Cw‘Ÿ_a†‡œ Ðà r›hã7D;kW br÷ZÅZz[;sDwöÜäc¼1´?±îÙ£¸Òl”Ž—X+h²™‹w0vÄ)µìú*øÈ;$¸®_éMö Ëì’-¹“‚O"¨ômÁ‘•mkbšç©¿EôÁZù¦óÌ\ö§Ý_Rß?õŒœ#; ox§iÃf´É¢Î—¡9v¯ôZòy§WW=‚²wwD³æ3¡øj8ús,Ëž~9èï±,uˆ¶L«|7n½‘øÚ–³Úq\0*Ê¥×|EÍ{v«ÍI}}Œ)ê¥HôMßö~Ëv¡Á‰ôÜ% ñµò‡›ˆÈQràºmoÃ7”æø>/qŠõ:tÁ 7ÞTYÝ!Pˆ6¦H/Û‰ÕÂûÙ*Úô Ó*T!’6"tF1úX-'˜ï£YëÆL¢:£eqdû½c«ÐP)õoëÚÔ@‰ÆE¬ÄC¿9^Ô꬗QÓ¡{J¤ñ\ŸïOýºõi™ýŠ5è¸TúŽEnf Õ—S£öoÍÄuW"Œ˜/&ˆYëá$¹Ò^‹+EƒŒYBƒ¦z‘ZYöNF<—œ÷fÍüغga¨Ð6"ºS)†·2i³áxÖz¹OÎ ¨sä ©‰+)q¿‰OáX§<ÞΡ^J÷·+´Dœo•OTqa:}-Ï ‰]!4MêfOƒÌY¼ afQW âât,,kÎÝZV‰qÞðÈ'‰­TçDÒeiAP¤SÜÊ}†Pf÷½¯5ìÚO‹—ñÌÄsƒüˆ~f Ž(¥Q¸”üÒ~.ÙO"¿Á3ËudÒHKR™Õ¶Ú óS™‰]–}Ž÷ó­¸m#71{k†¾"¦þ$¡ÜŸ­i\¥¤Æ:KKƒd‚î¥ JuoÊzÎ&Ë4q„óÅý€cg´vËüÍÊÞù6Mî&ŠŽ'.ÊÀ×õªuG÷¾õçˆToS_Œ[ipI|@ÕÍ3”­‡ñ±¼à¥W©ÑpÔàÂ÷âŽ}í!~%SëkÖTÌmk„±\žMã©o§ô ¥)U2ü‹.튪‡éâØÐùmØTêѨù~­¢×ôÛ©Dˆ;Ì”Cð÷¹†ßß·æÍÑ¿­×z»§IyØñk(L›‘‡s¸Ë(JH­¹á˜ëdö% ÄáÖƒÆôã|#ŸVšôž”ÔãG}’£ƒˆö‡”Có&ãñfß&é-XwîÞÖy'€ €è oQcÞÇæ6“™ö×—A\¬)&ޤ‡Øžw†¤_5qæÝ÷eb©eõ»‹E;Æ»®—¹yí6ÏÝ–eÂ-jGYê0X{ßÍoŽu̹r»Ú«Ý½½$9÷¸v‘×¤Ôø.—k×MÙ¼Ås¾ceMµa.m-l,kS¤ Š[© ^^§_ÉÖ“ú „^”÷ž!‰ø[»/_¿äº ¯¯ê÷ó}Ò~š;‹..¹Áž¼»D´¹;Ć u~Á[Ömøà;W©9ì((lßñVeœt•2ŽRé`ñHÎ( €ù2:$…Nâž·”ïótÅõ00 1F芟/ÊK{X*”]ne „ž}p'/®Ž¹E¢{¹úñ²¦4 ‚\éP@¾î¼Â¤ÜjxxøGöÞ¬ãÑbÀž² 6h|©ëÓÕ'61‚ónõ‰1Ø9T-=VÎv¾½Ë –Éν£LÏ̾ì²äixÙ/ß2ÜÉ î‚ ¤µÈžòFsº§ÞˆéHWEEV5lµžD> CàõéQ¡2òÕ"âüY戣¤ÐEŒ"ÍÖ-tâÓ4)•å î&TGÈó ä¡_¬eÎÙHd]€h4œE:6&) ›Dj¿ «?óínUWð+:(ý¼<üËð‹¾°0ü*AçO.Í£¡2/V_VâÅ–”}_ Zñ‹0ÒòB0®QD¤;ÏNõíX˜ŠNË.Å*Ô»ô½vhdR*žËcœ< ;;¾*=´0 Áðª3*xÌeÏ+ẽM†b‡¦ÑÝ=ÝZœïÃm™Ñ¦ÙEv›¼*\¶“NR'‰OCçxH^Vƒh|q;7{Íše9e*í²«Æ•ã9×ùÓt±î‚Á@Ø:Ìá92ÙÆ²ž³À$öXU0kaé-"U`u3{™ê\Vi@Õ£™êZâï·5ˆ¨Äט¼i#…ÞØEú„Ç8¡WÀÏ*í­F©»—Ü¡@(ú›_¥ÏQû»Ðº\Gþ—y:ßm ?§ ˆ÷ƒßèUþÉUØÇ¥öêS§?kd¾We5_Oaš@\ b)«‘˜Ž…²Ä,Êvì_?mΪŽ3Të,c<Ā»‹Vž¾Ìd²§ÇK__ÝŒÛuß –xžiLôî°XD÷¡_¿½ ©ÅÔ£ÜF5« {T§ŸíU‘Zu²,-å‹‘Y^!ÍlŠýâD¸jc°gS^4ÀÞÖ¶eˆÑÖå!u\Æ1ÖÂ{=ÒH„Ë#8r-¸a‡Ø—©8EÕ➉ÐYÞsËi•Æ’Åf®€è3÷n«ú&Ì ãÓR­·Õ©´BuOãŽ}«Xõ±CÒrØò‹FánY ¸ö[·6z.~ª)ù( ×3ÍXS µÄr5˜qÅoXs#Ľþ-²ð<@ýµ°5‰êÀh*D뺓Å&2ù´rv±ë K¸‡ DtNqÞ¸®ÐÏ—UM31ôó¡’*)K«ѳè­í9 ‘· n~ݶW6ÜŽ/¸´d- £Ç]6fG7\l¬Êh…ˆ|Î:G¸bZ|£œ©âg´ñ½eçæ×Tå<³ZP¶RŒåó:mû„ ñÑÞ¶²ø'„ ŠT®î«í‚s°cïñ”(’òçà¥z¥/ RØ2ìµ¢ÞÜ”úãíú9´O Á­duÐïÐ`Ã3ïöì%¦Mƒ{¸ÛyÖíÓÄ0’Þ\«#®ÉÛNnú2„—ò†èl“ÖDIšº?ý{Ê[Þ\‚Ô5»¥öOå;RÞÖëÂ>OÖ»p¬­ŽÀ“hH·p¦Q4²ÄÞ¾lëH÷L»=‹5ßJá²àד\·ÝŒ¥Jݱ¶íFû&å­*Déé0l¤*ÊRQãFÿ٠峄¤hA aßëÔ>ãµ="b,5Ü8’Äõ6dâ*'7h´äèȪ¿ÆÏIÎ<×ë¶c´ü—ÀUZ«ÄžáÎ~ì›môŽçh(‚èÎÚÐŒáÒs”:,÷‹÷¦™¿:ðë}Ä7¥”š~¢û?1¸ùS›B!.™­¤©Õ6¨p¶çlßb»©ÞnqŽÁn9”ý^ßl…Ø6y̘eGF)‹ËSt˜²pC~œ¦òæ—Μ Š@.e`é—*­£i‰Úä;Ô«ÿ­2¯Ï‹voE ýóË£å-@X… YBƒ¢³ã^âÕ/~«’ý]âŠsíÊfjjm™ A”ùó†8Uv[“^m+©l’ײºS‚)ß#½<,VeÒ Á0ÛQ?ïûGSFú£‘­™ Ox0Îî÷=Ï)¼ËB'¼>;”ÀÏåDü2~…Óî˜öB¨1ÇÄ7Kï*Ÿ´Wà üsðˆÔ²‰“¤ÃƒµhS1âÊ)j¢|‚pœŒ[üÐÄ1L¿ûªŸžG{)eâçÓ7K.ÈÑÀ ñH£XO%Û»‚·a\nWß?vz_œ8éb#ÚÖÌkâ"B×·¡2çyë1ÓóØnœê—›?Ù(¥,jovBIh¾U­iøò t’а™í|ÑaOkàŠ t™ú ¤Ì¡.´llÈ1JOsF>çù-Pü9†Ávë›&:Ú5†ù‚~erÍòÐÁ"à‰¹œ×á¦\oaÁ&3i*VJg–ò5F6`rI¿rÀdÿ“ÄÎgùkqMË›ÛP7qÿP<÷—‰u×¾%¹2Y ´aut§GHþȈMÇÚ8sûpà¸ê<ÎçÜÍe??·q¦KñûËV_Η¼œÖ]hpï*’ƒã6˜«Óĉv{·Ø7sжìÉ©üîómñZ¦eú.5§Íáíáš?GÑzí÷Ù±mák7w)áœ8ö[ãö!’Bßµ3«0÷ªëŒÍ*Ù$ºkfïÆÄCæ ‹ þn°Â9f‰V¦º¡êé ­5;§B¯{¥Á^Uj“å¢N%ˆïôyJ›nŸ²=å@=O8Z<˜= êX8 á.^KÞ„¦;=amP×@“òÂŒÆÈÖôŸ($åLG¬bÝb’8É„`|¿Ùç«‚¿³½p˜=ºzÖ,øHÇ·ºàT²á¶<Òwïüö< e½c–×y3&|¢ôZ&`*æžg.ÝDqx)Æâí€ïOñs¾ú>÷Mçt†«¶Á Ú*wà#T¦9§‡Ÿ>©×%Tni%MÕsÀ´ÁŒ2mùò«öâ¢îºM½‡5$¨ÌN•—†©Ø}t4_"iJ{^ø %5œüaê… =³«žLÆÌ-_>'ýÍï”Ø£¦Ž|ç¶×S¶ðU÷“.D¬³Æ„‘Õ»Ù»¡êþ»¡€NÖ;û|/yÓ\S)â…Ím;jZíØ‹ }Hç—èσp‚¶Ëm;L[‘1Ó ´S•£Ùo²7ÕÅþ$4 ¨”¡4*%[™’yx óØÑ‡¾ˆ|Æ4•% ¢ ´wž¾ áŸjG%ucAÚCÛ˜½RÓ ²ä:¿zf]QûtÚL¤1kVhÕãž:¬ìî‡t<6G äHR#|ÛÎ 3Ô|?£Vv’³ãîÂÔy9ŠƒTnæi­ Äá aX`.IÒ@áÑ> ºˆõ›:Ù/1Ô·µÝñ×Cúi53[ [öb·[¾Rî8̼~¢[r¢Ò¢œc¬B ˆ°L}¿ (D Ô–09oBÈÝ^g=_Õté|sï™-u*ªÌÒ5…Á5.š[ŒÐ]Ü òÈÉ•)yÌUqL×§fYr`éÃh£âyf'¡ývH]åÇ Ñ¤äHl(ÆÁeª~ÈœSÅ9Œšš3O¤ñµš˜CI”J 1Ä:&çËÊ!oo¾½× ½ýŠí:K¤0f‚s®àEª€ùÜÙÍ|ï*ó̯ŠJIû*î‡ÔLa Ä¢còÞåR >U£ïm↠¿ãÐ7ÂÈîþë³`‘$i¹lZ*Ñ͹ªuk]Ü8¬»rŒÚԨÃÞFA%ÆÎOJ÷¿6QݱÙñkÅaU×.­£‰&£‚ªõøÓZëê†Í]¢å‰G:½(Ið†DŒoaÂ#Z±=cpÌn4¤‘¾_Gœo=Ã]ZVªûêV¬]Ù¿–’ÝÇ…ú®«#í8±E«PE¥¯û„RÎñ *ÝZ±÷£±ýÞúH\&öEáG²'?ò´tþD&PG— fB 5Åóu&ˆ·õkãµè9ÌP'~jiH;êsÑA‰srÙŒ£àràmž o[J à¡ÄTµ­1EŽw³ƒk›¶hÕ ;AåÄ€·¥P›GÞ’}[_ºë¹`êˆÆ"F"’Dw1`Pwpyñót]nÿNÀÔtò,J߇Åú=.É~;>èMÓ+VÁàI[;fålxO+oTÕo+] —ü.w3P¬™ž±èpÙ³Æ0He” ÿè -À©+s#Åç‘MXŠž&H€ô$OÉÜÌϼۋ6þÙ? "b¥´%¹kpW›h?šl”ƒ¡/i©_…Žv<Š1iªRY‰wÝ{[Ü ¨ÖäXÞ©¯¼U•¯ ÔyD“¸Ò$øËS “ºÚ—ó#ÌÃ’°XaÖ—6ªî÷%ýS¡~ntײ2ëwÃöÄ®ŽW¥+žêŠÉyªT:_ÈŽP-/âÿÍ#>Y6ȵ¸Ñ~+ßÑìF> –š \£ˆàæS úòzbKºƒG4E“\ R*Ó½ãíÓ*î–BtàÀð½ûZƒÐÖ¯i§{R:p®y[|8mñHå”úàÛqm¦L]-že½³cÚž;‰bQ¤ªÚk,þχJ‹ ½Ïœ %Å8wbÆ»:²Åø™rr«i5"át®’kŠíAëSH]ÐמøˆÃ±ß`7ññµ§"2M5±\:w´wRûhÝNJÄ÷8,?MÎJ…’Ãò.q0ç8]qÍ·#"h -çXÎÃáÈuÌ$–P%z€\QƒÐbÐÿŒÜŠ úÆ {ŽºXXÙLQÞf5^PcF:MiŒMi§¸ˆ_É黃¤êé]/#Ù&{Üàm²<œ95:÷¥Äéâ4?ð‡¢¼3!£¾åÙ1Èñ¸Òó@}QHï+ÕbUvQÝŸk´òîà Ðù€IΞ2ºs†JxÜè}w²ÄZŒŒ‹ó¸ÑÆü©›<¡ÓM_&) '‰‹ºö;Ý Ví+‚zEe«œšÃI³ÀàªÿÞ‘“9ÕÓÖ:~#ëãÌ  ‚ÍÏÒqŽ¡®Ã9ûÞÛa1DJD;_ Jc~k6èàŸÙ©ð§ëCl¨iGžêÈ@dœ+½8˜ê`"Žã?ò¼ëvôˆƒ@nY|#ùÒé¾¢¶<:B5(Ô}¾ŒÁëœu ¶x×+†nH ?R^—EàÍ8Šb[s¥Ì !©]*w~TxÁ9„hø…ï[zSÏ3¸xR@ú;¡+QáñÆÂ­)Õ¯¡ŒùE¬tþF#P!ûÆ9.Íy„¤TyQšviÜ ¹l4\ÈßGDäU·)ó†„üÏÎý-LU=:ZÁ/ Û½'9p§rà ÂÆ#>`.üž_ü±ƒ1`>7ž)õ‚žÊ#³—:á¡'AV¢òÔ‰ÚÕw´Ûá죊‡ƒè¸–'¯5µ"¿ÐqÕÖ2›ÂœEv'>xM]]´s/ÆÉ`ˆµxåà7 p<³Æ–°’Û^¤Öa§¶¦„Ÿ 2¯ôà¶³&ÓëÀ™ü€û¥Ô³6R¸XA”‰€O-×OȆ‰O쬸qÊIýZ!©í%&…6N›×Œ¸Փ׈%N‘Tðˆ¢!çBKvl›5_Èí"”wЯ[E/Ï,u¥Å¹]E­“‘w46¼Ø~C§[êƒlOYx¢~á5#ôs#^Òr Qš¢áVsò)lÝYA->Ûu÷ÔñJņ¤MÝóWY}Æú,#ïph4¨…Ù|ì<»€j[åƒ(¹”½[CMnH@ÙôV\E:¥Ùš½h‹ZÀgL ×'ÁœX Mó”ðUÚ"ˆï<»¤×À8"ÉØ9Êóöà7qÿ3XÆÙ³˜¹~·ó]àíŠxzdÆüd$Ï€´Œ{ml0M±cãÊuÐ(8—þÚO/Z“A|`œ%åÛ-†¤¦#мŠÛ—Ç ÏѪÇÒŠsÚ–G†ìÞ¼ŠLµÁ}£ÜÚÇøCŸºj½Úþ!ŽÇL™X* û¦Þð4½½~ÎÌ¢_²ß 4jÝ$–äNé5lG>c=E/#ñƒdŸî#µÂ"CÑN",}î´´U˜Û™óñJèbìvŒÅè'ÖŒ•™Øåo…Ö„ kËõ __ÍÅ…a›Aÿã›ÊÁð…fºÚå|Ö`Î%Ÿ˜pA¼`îùˆ€È" ÚgtøV«ŸÏªN6#¢&5®ÚÄþÕ“7,ª8¹Í*}0ïb­šêWÏ%—õduÖïþßù]̹9ǶÜê ¨ #«ÀÙpó) m_«CÑ/:0£%´¤°ƒßNB”€t 5ÚÏ_´¼¼~ß ,È¥Ï-sN`(hÛr©îʽýòe›„tX"0ñ#«fåÏöH'iAbnäoŒ>¿TTÞŽG¦4(xwïèÉ"ÿfæˆjóTå³l‰‡›„–=­oOÛZÚШlØ]K“Æ=¦VÞæ…¡ “è(UÅÀÿ…‡ùo[fQ,™}Mq‚î×rÞîœ)!qÍûZ™2{šÉõI—çøêlúÅõ<áîéʼn™òÇ^{¼l]ôk%ž>p›DDýw© óÂ+ÿ¡Q·‹óŒ‰õýñ)©x>Èù:søc|ÔM1zX8BÕq;Ïnf‚YË iÑL·¨\þv þ—终~Ù¡ÏÒ ¾J/®Ú&Y6þ n±X‘Þ_ú ñúõyFÙŒLfÉ$ŽäØé %#¾¦²Õ%!‚#È€žÑ²Ã•C—ó-çýW#Ñ#;è¢rB¨ ð!Ô€ó°7Ð3F1•ŽáƒßëÙ|ßvtÌÇUßZ˜L€òó8GeBÉ-`üÎú}Y-¸0’ãBþ~æêŽÏ' *­¥}XŠí/˜¤Ïžd;¶Û-”î„„+…FAïG¯ló·YúvÔ÷oðÇ>hvœ£ŒS\•IºT·ß‚ÇyYßc">Óô:´à ûÊž{É£ ©NÏ¢ûzfð’ÍäAfç#m$·~Rþu·?K'Ù1i–Nï '® UŽ;CÜu›~RŠëhV1–€4OÙ•Q˜U< "—V—’ žÕU ä:=ò«x‡¤Fò È“~1±[»ú dSDɘ³Š\øœÒë9ünM¨¸OÖ“<ý²EÅ()2ó1êßøó q´ëžÈ¤’°£‹ 1^˕éZ‘$`DôH”ÞY ý6ª@ÐJÄP .ƒã¡ù«Ô2]Hn^.ÚÄÙØNtÜ_ó»¨ÙÕ·2½Yd0‰íb¹(¦–2‹ùê)³µV ÓƒHÅ×¾k5à“¸ÜÖšüòŽíÄŠ«…”è±Êô±´±s!£¼!IH¥SJÓO@0Ü{êGÙÞ6æoC—]Â^ ö{ÐM = ¼J‰x]öRݱÝ`É7ås†tÝ$Þð|¼3UÚG½ªš¨G¾Ï4eÂF’¹LzÃ!í&~·×à Ã^²ÔZþý^Ðó%L¥…É XtG¸ ¥IFž-Ò_0|åº(Ã,¯èÆ¥)Àº/pá”vÌ’Æ<Åþö}á}[¬¹L9û½`~¥(¹È ©@tƒ–wê]™Q¯Ô]&‡ñ ,t]ÓÉF³˜I¥þ7>glR†Äüîzˆ6…,ÝÔ,rèƒE3)Û׳Lvs^ïÕß?Ã;7 ûp’Mj 4°áiˆ%†<î^xyуI§ew¤3a‚K& PóEù@É2ö˜‘h®2”üñd¸z†"ÎoËæ}!p3·÷/P©[LÕm棜9ÕE—Ϙ1(ßÛžj¾òŠ;›p~#|¸UªÂÙ§c4rÌ ŒÎàËÈåÂ+Ê5v‡½a*;ÇjFäÄ”€vg¬>ÁsGHÊíä’¾ixcµ¬ÉèøF"¥l¨ˆØNf¦þPWG™#ÒH÷^“Ë}/ ¼H\ãÕ¿¸…q¾¡µ—.Icc_˜òh3ä öÃqÅwý’½5v´Õg}ÂsŸŒAß>aÈ9Ñÿ?¾áb¨F%ŠS+†,M5(Ta5­¢SZjÿ„còÅóÓút3]sqlz2 lê0ZË&æY2êñSÖ`æ }g††é&ž œ1«^©èÞ߈ÀÅ¿GŠ{²{ÁÒ9Ìý˜õzÅIN!ÀmMØÛ U&ÕëØ\Z! Q"ÔtøÈ©@X4ßI{ ¥{"²v8çLëØ¡CáâÆŸ‰'/YÒ;½‹pÏ÷éj³[;8[wù„Ïþ Vî…45—+?=q}@q£Ö_õz—ô–?—]ÂX“8ëQÂÕ 9'çn&0ÝVi6n9͸B"UWÆ+¨!_1økSÒâ´9]%¶Âüé{…ØcŠFøÁ±¸6pV}áõ9̵Œ.Rø[W_®£ôñ0Œ2Ù¤z k8òã"H>mcwNçb~žÕ]A¯v¢Ò8G§IG¬»hcÕ­)]¦MÑ¥:’HëQ+l=AïCÅÐ.ØŸ‰wÖN_b0û ü‰²§C•g1õH{êGŒµbÖl¢êT k /"¨ÞÔ]""|Í ‚žµÁ™ÆÞÀÍäb÷Á‰ã%“Í;Cý¹¡Õ^ÓÕ(w+tšö? ';@öÍ„qzQüz©èvÉÝpÑ÷-;2á_j|ÃxRå¼ÉÂí_øPß[weЍ&G ¢f-¢è‘o¬¼,T¹ê0YÒ‡Á}“Wï´(KžYËôYµlÑݶŸ'%ý‘+¾VwXÀAÛÀE#6ªÖŒRÛÒ /šB8\>Q+çà95mïóZ&i% ‹:Á2•Å=ÅÈŸÒqÃÎõü)óTYƒ‰‡õÐf@åÞ¯Hìça³¤¹VجLÏØ}K7‚c)¡ý%b÷|8 Ûg@s>\F髹>|yÊV‡!ò€snŸè!ÄûÓÙÓ®1~G't!Éó=ˆ®=¬C²N²ø F† ¦GN˜¢í%£Ÿ·|‹P:žgæÍo€}?àRCY”ôaëcé‘̪Ýf䥯NDßí™=sdôçѪ€+¡ý’X»Æp{›DxÝÁ|úµðb@i>Y‰kì°ª±Ãz";YâåÌÝ覥)Ú¢¨Á~ê÷1Ðòy6­³ýÙ:lª*‡Ý"¸¥Nò¨~çÜ]uùµª¹i¤Ÿ]mÖìTMß$))ë:à4œHtæºãfÁ7â/WÓ¶=š=ßò ®á~TüÈ)eÚJ7’i/‡Š©éÑ^#Ø‚±êô7×ðôöº³“Qõ÷·d¢ÇO£òŠ^¾ÝkøÂ ¸/žŽ•'Ò2e‚ãÙGˆZ›¤òµð Ý­i™×Ûn:¶\ŽWrûés¼=uRà·_<7Á• ˜ä¿&ÿãõˆæx YÝQ©–útD£WnORâ¸%ƒ#!¯æy—3 ŽU¬ºmWafö#98ë¡5¿T'7r Öýy³ÖÒ"NÓm·:‚yW´)¬ŒÂ"§-^bö’×° ‰•Kšt,¢Ëï¨#*¥›þ”¯I§ywµ2·–`"ÅüHþ6§Z®H„VŒ"¨„Oˆ€nÝ pþà ˆ¢ÈEd­®xiÐk{€#(‘‚[·™Ã¸îõʶ‚-±¤™„°ÉüSîÒeK5Îð§1ËÊ Ñï6døIK°™+OUOntR™éhQ”#ʽi½«Ï”ûçŽX¯°ôPµ@R¹S $î=©Q©« »¤ˆœÛfÀÐ,T J#P!!g<ŽÆ¦À¥ºÏÎXw7L(Í€ÓbN*Mqj(Eê‚–P?æýÉuc¢„O"y÷Â$E—Cré¢q³†­$ÎÓwº4q§ütÑ7nH]BT%€÷ìþSOÈuœ÷HµÄMö:b^O}T';[–ÆPtFsQ„yYÊPsòðR1ÜOE$+Üvä‰w±–y†E4Äëì z  tHÓjÓ%t%•Âß>»1úãù´‡Õ^*(-UÄ×^1ôE…<HƧïB·qíæÅ°žÔϦ`àÏU㯚¡GwëêK2÷iÁ2_‘§“W Ùê"_¦ , =óZ¶OD9ÇЯšQ’ãçÌ@q|D’+êmÙü±qS“L§š5y>ãΆ÷F%—áL 8¸a>‘lk‚ªZq‰ZñÓKb£~ÃÙ¸þToZJiòömƒ †Á0pKkZ¾³}!×Ü[Ãï‡|²eŠùŠíÙ"Þ‚@Æ\x"¸†%ç}Íö¢›°²›Ë+úî*pÿ4ìЂGê­8{…çÁ…šÕaæ Ý\¥Hú%sh„·ç_ôå°Ûv¿!®PîeÜ­Î@/_ˆë&¡ •c>Yª'Ò1J M1kùœ.‰é2ÍL‰j„¨#¦›ìK¦MWŠº;Ó¾—TÙø3ç^ »¢ök½'£òùõ·ýÒÆÈáV?´ÉÜæ“MVŒá*T›³©º±rÐ]Ÿ[†½T OôÌêý½ý•Pï0(rÿT’•Û¥n„„±<±Æû¬È #†Ì¯ˆ\šGö"v PZW<ÛßžN¯[n‚ÖNñE…ô}[œ•`è´EuÇŽUÛ…M–Ĩð!§î|æ”L< ×òJº“WK ,·%?lû¦^ä“™g’#>¯ÖL_’Ü‹1q<½Æx¼3´Ë8|›Õ³©¸ªî~š0ÂI ŽÎÏÏb›>«®µÉ»À½Køƒ2S°ÑzB3!qÂŒýŒhÙoZTÙš“ã_‚j«‹u#-hY"Z£4í ºÑ‡;áæBý¦‘§'´ˆaóp_è[JÐyõŠA+„&M7¡àLüšÕ#ezþù¦HJ{)¬oC’{y-!’Sóª3nÏEó >¥°ÆÂÑ×á*û‘.û§âov“(¿y5àŽòZÞ¯-½¦ Ïm(¡ûUR¬ßðSýc¦Øäâb²¬âç¢ìo’›¼´;–õŸ¯R›óâ·!ÓZÌ#ÆA[¾µÛŒx®Ý¥y†<Äù:L½»BÞ”r÷Cë9kÕ_wˆŽÌ+_ÌôÝÐÀ[qŒj©¿n[Ⱦ9¯C^HÄ[Ún°_B­ýö«Êä6-šêói`§s§-ÑëÑqÏÕÈ«^ÐdßT{ ¬Ã -”ú$ÐþƒËI7O5#׌óË(ç±ß«Ä*E}tÃPYƒ§«@Vu¨†*.rEžˆBEñŠŠHKáДeõPÃéþ]ùÉL6éÕPé÷¡ ±VÂûMÑÀ«”ëc¡`Å]HÓ§Û#† »Ë¨‚0HÙ"/ÐÞ ±pÖLösÐ]_]е+Êõ;Cn½^Ãò€@J§oÒýAJÓ9e7õ)§Għ!Ê1éÏœœä² \e0etÏnOïöÑb«_é=©…8S]ø„2Ó ûÄ{e¼X󇛛©;¤äôÆ(úÄãj_¿Ö¬âÍ2ü²–þÆÒÔü¹ÁŸÌ«éXRfðX&”‚ç¤IÝ"¹Ð¿Ê6EL±•ÇmÙ nµ ]NîeOkªá¥ŸTWø¯Ä}ñPH¶P"3¨?¤´ Óvïþ4TzÞ#åóóUh¯HÎÀ݉<劇Žóœ7žü¾7A§¬; ‰WÓ] 롆™® 1˜¾Ë£™º´ŒéŸÅœ‘Ÿú!5qþçEèF‹¿<,ÁO,›µ=Î$^¡ñ&X¤Y6fe¼„ug¤ÝÄs]mçòQêÆn ‰m:¬&—*:ßoR¦½\3› ­ÏÐPj*åÛk’üBFTͳ™‡Žé—ñ˜ ÐÜK.tm\ñkøš9‘zí{¤€õèÆyò˜ÉÞÞ?ç7M‘_ê×rQðËߣ4Ÿæ>÷E/DJ;µ#c‚ÿ”_›º-b ­Ó>Ceú:àéoah! qM˜(<ì×ëÏð»_Ý êHíl¥•¹‚û±£É}Ï·¹J4IÔ›¹þuöýþ®‘]»ÄlvÝÍeâ“ÿ ƒAêÎk=mµ El ܾø‹vÞ¯Ô·À_€—ò`a—ÌFÌ®ä9ò‚º\ëäKfPh Rv‚Ûü¦ÀŽ+¸÷xÒ1Ëݰ^ºf¾p |¯„.Âòhýý1B;h6ÿŒfc$ž_ÃüOD.•†n,4Æ‘»Í£š@¡"-W³l¨¢|áȰ~˜xÆzg‰!ÊÑÎrlh² «æ»g®¼E;'£è›{U¥zþ€/Ë9_r«†oЧÒÖŽ¼û æDí9­Vbi!¥¿Ew†Ž‚;$/Q€6cô’J ÚâýØ€ù,G{p%Ðèd!:WŒCä\ö9ÉðÐBü §+!T¥RÚCè4!2…÷èÌé…u=¶vR­š8Ý´/Äß2téþK‡?¢<`½ËXhÀg dÇÓKûumWžn ­ú2Â# W•xÂa'l;_ÇÓÏßæußó#MÉû桼·'ñn&Y¹ó.«½Æ úHã„ÕÀGcŸ¿ä1Àá·éª¬™š_ž -?ÚˆÍÀ±´ãVâÆã%Ï«†“J»ãjÒ8c|öó'—×ßõžÚpmi M 1%z›YuU¹Åù¤¯µÕ=S=X’K“üÓDSDûpðžÙ¢Îä­{¾Æ¥íˆŒ |:§¥vš¿S »Õm%|37¦¯Eµ"ÎäF@'ÕXìF0&}/ò‘Š˜ cÍó<Ÿ½#]Œ«>ÅaöRýœÝõn°Adƒ µ°[0ŽŸB<ònF ]” 'b)Vdt¢H'~›ç85Ó^gŒÛ‡÷¸¹[í „>Oaµô”Jõœ ü)Ö…,EòÍ3N6I܃GÐ’­ä¨˜çÇ g4Èp}hç^­­£q%vÐ8Œý§ã…ö÷Žf©Áêí4¼žŽÓDk µ¥ÏKî)›çüˆ5¯Ö L'™‘ù5ºµÎÇFëóà.V@ÿNf¨ÀÛ 4 vû$â%4Un2v++9ËÆô4Md>?†œ/_QŸÀ6Yƒ.»œÖMNk¡C¢®M=:ùPñ‹xOO6 šæ”âÃM/°*—j;Õ¿ÖNòÓoŒ±´/ >•‚4IØ‚Kܧ]å’T:¤¬žÍÇÉ<ò‡ÎÒÍ}¢Î0‡4Ô,‚N-D 5™«ÂöÈt*ÑÜîg)¶ERË]0P\,LˆsFý»LY:›ŠVø5ÔŽ]æt;¾l” —¯+Õá¶3­Xeþm2åò³à¼–Qv4ð;<1)U×N|ÚŒÄâm±r<ª™YvÁêÏQ0{S>é„CúWñŸ A%Wò¶R¦y œ§rÀú$S™Cd¾Žnk 9¨0îô–mTÆžò˜Ý¬ædj‘‡Ð›MKÞò¯ü?ªEò endstream endobj 273 0 obj << /Length1 1478 /Length2 7519 /Length3 0 /Length 8509 /Filter /FlateDecode >> stream xÚWuT”Ý·¦Kº‘º‡¡ éîF`ˆ†$%¥%UBBR¤Sº”îîA)‹~õû~÷þq×»Ö¼ï³÷³÷ÙûœgŸµ†I×€OÞn Q†Ã|@$@QKÁÔPM„€ ›!é ùǃÇf AxBá0Éÿà(" `äí!yGÕ‚Ãê^®!€€¨¤€˜$$þ"Â’€‡`o¨=@ P‡Ã žxlŠpw?ÔÑ y·Ò_ŸN;.€€„„ïïp€¼µÃZ`¤ÄínE;°+Àn… ýþ•‚SÚ ‰t—äç÷ññ‚ݰ€°fïð«{/w~#Ôà ¢öðOÖ ï›# @bbˆâkçÄÿkC?wÈoçoó]Aîpw€Ã]+ ¨äî…à ö†/HPÀ:þðöP;$Àâ…áý“ýÎ qøß©õX€îD(ýzþþ²ºÓ™=æê÷ý÷Aóki*«ªšñüÝôßn¸/ €OPÀ'(Š ÄD„AÿΤ †þYÉĪÁà‰? ¾Û©¿ŠöþS œ àß¹´áw †8ÿ¼%Hdw÷#ðÿ–ýïÿKí¿²ü?ÿß5){¹ºþfpþEù_ °ÔÕïOΆ½wó ¿› ØSM Œ±ÜÕþ¿}jHðÝTÈÃï”Í'  ÿa‡z*C}!öºP¤ÓÊùÃnôkî\¡0ˆ.Üú뮹‹þËw7lv.w÷‰ç<» w³ôïu•`vpû_C'(" #`?¼»Ó¾C"€»é´‡øþ4€ƒ#ïBwà¼_G{§x~•_¦ßH\À¯ÿ7’ðƒÿFwRä‡üð;þï´Çû(à÷ü ÿU®q7ÿ•u×Ë_ø÷…øBìðf§àvR¡ÎÕ¡Íç•ò´>|›Ÿ… z¾=?Å1ÙP¢ñÞÖ Q”¾8Ê‹ž‘oŸØŠ¾X!Ý,º­s1¥¹X/¾Œ–¤œ­iÆt°]ç !•¹Ü÷ÔôÜÒhk3·‚Ù;R~­×ïó9•ç¢âõ8ÞœÌÚU‘f¯/?+súŠÍQûˆö)6›Z\\-´E>«¥\¡J~|¢UÕó›Ü§ƒ$zåÝ‹—݃‚"k=s%¼¨ÐÕ—´{{î§Y{²é;EïkØŒÆÙ6>*Q_%p†œ6‡sÚz馔iìdÌ\õúQ~›y©>¤òáMУp¤„Ž-™€ö¶B­NªL@½6§O™ßäaFð³ŠÎóCyÍÈîeR.ÛÏ‘Ð':cÌ ª´©ÆH±›`ÛÎQ£×\‚ä颭2{+|13gý×UëJ ýwΆKÖf] º KNx¨‹YŸU8µ˜ú‡D­í¦.~:|Oò3àUK™-k"?Œ#µl$×]¸ÁVKgµÕH’0ÏSÃ!G™b=ÄS»#%—à¨1†ÇHéƒ:j¤ýBchö§òÔk­‘ñèöLTõ³È½¯åÝ@Æ™'ø~K×ïÈö¾›G<ýÁgÇÔœäCßGe3{–óxò–ÁçÃX3,wt±©`P±M¶¸2s I}x†>³‚ôÒ(8á,¿Ï¥%Ùy+øK4ÙTÌÛ§S:Q{Ðå-r!Vóæ^}¨MÛ`Ñ1Ï¢úùûßÖÞòHFy&³â¿¶ßµµB µüXÅ zSŒ¾=ô•JQyà,”ÖÓâ1ЍâPýRÀ]ù‡=A‚ÄP~Ýc“d¤à0™RÆ€žódÈÊ<SQZÒ¼|¡¸¯Üv/ˤl1g¦£·Ò¤¾ÂKÄÛG:3ú”ºkÕi|ýËIµ¬=én(©ŽHg†Wö0͇¯rÓ¸Yï¥b÷Ñ’BHÌùƒÞÁù²øú®ÑQ¨¨ÛÜ6H²äßÎt<ô EoçŠ`ÉìôWõ#¬à>m𛩟4à›ÙKi¼L>YÌÈ…H5Œ4ÂØ¨ó( !S¿Üó‘çOÈK¡T¯ÀËÞë“]Ä¥í÷qò4Z¥Æ¶O7:Ò°7c‹Æ Ò®²?D­ÚZSÔ‹º#F,\G—jX¥mGàt¶âÕõ~+áO3g‹¦ÉÕ‹ƒê|åsÂWΨa½B´J”ª Œ£Æôáœë†o‰ …cGhÕ„•¯$æ‰ÊÂI:;gµ1‹ŽáÂ_~VK½qúú`¿i7ƒf¯Ê‚æèMGßrTÑAÂq}[ê{ú·^>“ÓS·¦D!m6¬Êd~ãÉ~üüø÷ ²/K#¬žÍ¢7µÉoê2<‹OɶküÀ'Ô‘EQ÷Þâ›u¿q·j@LsЇU“qJÖeHdÝ”S£>QFÙÁ7?­è«}„Óf>‰e “r­ 3Ië¯]ô*ûžÆXÒtðüû+ú ùbšÎ¨€£mð\ÊçëMnËÐÝ­³?5‡žFZ‘ô§›Û(ÆÈRÉ’²Ï4+§•ó*ÕŲõ“ÃmÂ.Ý{8¦Þe¦_†…\-¯‡y7~f•«¼>Ä–—³‚LD2+Æmèqëèq bb“5I"¾´Ëe.‹Ö7s8Їð¬!Év^õŸà·(ú7å;[}\¾Ïbe¹ƒp³ÂýÝ‹Y} B­û¸¿¿å€2Š€¯£¬”S©•Ø>š0ÑkR¥ËgUàdÖÁ`“z^ R¾zkù…¿Tø ë8'‹0 âÀ™ò›Vè[·Ùp’Œ†Ãð­,ò9 ·ö¥ù _ôKeé„ 7rµ.U”1BYÛ¾áLøüz5ÏoÓqTò™*`tö+>aÑtedN[Q‡7a:½Z ò]ûA¤¡±GaâKJB%,¸¡øQdм«5 '™ÿ²ÞìÙ%…1Fv²ü\£›Ž$§ n£¡ÅÔÏ'(OØë®íhIMí·tÖæ&z,HüLåÊåšõÈæø†È®Üí—¾EpX4+F½zW6H•3Há¶”4 $îM“‹5Ĥêûh¶û&>å`¦éƒ#Ó/Ÿ»BÁº9b² R‹™#!Gnojô|+/l«ž\ÐÓÏ^»Ú¹àG/{âžÇéˆÄRâézkí?ôÜ"o„ŸåƒÍÇGP¹TJBÙ9¿Qµ@oùha+"NBVÇj|AÅ_ºØW‹¸xÇ?öhïŒøÛe¬³Oý´,—Ÿú¤Ýsìa ú×Þ1ÕªtÌXw4Vkéc^!GãªÃ´ŸrêF9?¼œúÂÔÜ«5ÃTœÇq~°·•S‘«ÓcyÂ~Â(1iØš@¤©«Ã…«„ PV"&œé3haAë1]9ÖÕë0áb“Ë ‚­0e]Æ\jÓÂ%QÉ„—ã„P²õ›\¡q0ùŒ¿F0TÓR‰ Ëð„y=-íÉ锃ßÛwûÄ,,•m ØÖÀ˜{GSå‹ÕOæ(Ü·’%ò¥2ˆ›(mH!ÝùÄ:|{·Z?áD§LŠª=ÁKÕ…z{/7ëTÖHãàÎÖרjl–Yî£A<‚B|¿”vÎÞ¸,)LsKÄvX(@«¦Êù¤£²ŸŠ ¿‰4*îÞž6ïð$îÜz84aö¨øM‹˜òÇ~Dv؈nuIß­hjníCÁnîRˆFrTæb¢Zj×fŸmLܼr§ÄuÿPŤJk0ëç ,°¹Ž¬b–Þ|èÒ’xNù2+î£ÙAíã"ŸBõù °îIýzÍêôjT‡…¶¤u ƒÂhî€môóÎWkìÆ„~8ë›:=ŽŸÒØ®ñÎe,~Éê¹"œûÕåLlHÀ²„æû¶dò#Ìc9Ëh¤…#YPøs²Ò«r-¬óÌj½È¸äbv`¼%ŒnÖã`¥VgyúžF›”/y«ÝÕîD\¤°ò‚’.‡‹®´Ï)ÈÓqKû@ÆEA€žÓ $ÆÖaDùxèA¢°óI×V˜SÐU¹¥z§„xÖšÙ2W™á\·zÿ@Y¥„b?ÐÄ›•VŠuЌ™N´ð ŸáPŸ¹ñ³®zyœ9£”msÞ ‡ZI1” kFÄÑére1àr1rî…±>T56ïaÔ«w »ÊÀb¯£/š¹š—®¯šdRb6:yçaŽJ‹ZH¦¡ýB²Xë¶Ò™Þ(Ø…n–F½Ì¦Ÿáà(ÃU!-F´¾óÒݘu´ð”«_ƒc}©´Gò]–¶À’.>&°ÇA6~âùÀwŸ’ÃüΟW,²AG2<ª»Ží5 C,êzŸÝ6ôífåÝ9íàz×Öqëe\MšÖ1‹É’Uq‘/::1G‰ùBgRŪÈý`[××Þ}a:SeêŠvæõ„wUXH¢•ÃòH$^¶rÀ7)y²ÛUÅR\:‰‚;L"™ákçÛl•eèì<1’Ÿ=ŽÍj3öNJY Cü‡ÌKû¶þ&›bÝ™u]Â@ï=Í Qš B#×áŠ;“]3‰(´#¬S+óÈ™d¡†í7ªh|ZcëcM¢•Ÿó^K0.|òá-õƒ6pÜ‹H¤OŽÏârî ØÑSD/p`µ0tZüœêÏ~ÂE§?߯9—ˆb¼é]d)è@û%lÒ è( L]Mm|Ã…¡­0T4ªoÄ|c»õ§7¹²“x)!Éȧyóº³É&!º÷À¾Ûh¼­Få¬ëÖù´M‰0S”îÅ[ÓäºL26Ä÷$Íߤß[Ph20›› QT;š_MjárLXU¦Šèxª‘·^}:GȲ劫÷TnxM=|b!æŸõöxž)!É#3Ç|­’þ´Æ?r`©PÉ¿û¹¾ë¦JKÕ—†GZƒÖ/x¿å—„ê_M$;ÈðÑH~!?%YA¬6Õ”Žû>:#ù4jF×yÑ¥¾å4 N ¬áœyñCn $­L„µaj\U€Å­Ì_;³tž{„Rðtä'æPÅ´ö¿ÔëÉ>VHÛW8²¨‡B•Óçý^5ÏeTZÛ…µã(=. ¥"KŠ…¬§êйÄ÷P’œw<ó7§²Úg_õÉEg´—ßÛ©9uJ‘Æ"ölžA®óá{u43N\²]‰«‘&v-–WHS:„µjr9Ê‘†Ü>ÇË@˜õ~¢™Î¬?´4Å 7ᦵŠÑXi¦¼¥ÚpH z­§R¢p„V+– wçb_­ìy¦òòî ” óå!yãòfÒ˜úâq OÐÆ ãäÈÝ•a3©ºäWëµÒ‚¾í[¼9µé%oÍc¤…Í鿝qú#½1ú\…}… ɜơôì'äëÌøµïIâGJá-kÇÆîÎ þ.¢TE¡×„Wöe²¹dõè·ºõû›³òOåGÆXºò㜀ôã!TœõºUªrìN]‡ªü`üv¢I48Ë¡”7öÏ$‰û§š· sB$|V3')ܾDyqôÊíßûÈäå„¿mª'ÑkÈo¦}n¦ø´„à:¾¥ð¼èV‹È‚æJêNŒd0Ú?æîÂy¶¬Y8@+yZšˆ.õ“bÀ@Èë~[_žÅöÁ÷µò —\Æž7ç\®.…GyX·ik¯)²#ˆ|Ct Fˆî¤ùàägÞ| q½}©ò†þdy.1åˆËˆO`.û‡¼èRÚÏL¸Þ3 Îí®fm%ÑÁÁlùbKŸ‹±\9q4ômk"î¹4ÍD½j-NIåA»ÒÜq“TF¾×ìÇa¶CêëM¸ K”€ˆõð¬ÇÞˆÅ÷?U6½3TÉ¢lIåryµÎ†¨¬«/–‹Tç¦Sí¼Hš”nP'”ù2PÔoÆŠRÆ¥OH>ŠâòìŒçSCOɾÒ7ïÔ.Á}1’ˆ–wús³‚C\ªŸí/”Ó€½¨Í4(Z"ØEaßôªéóðÆ©9[îåÞŒ>FšËr4640Dmg=›ëöÝ!éäDÚH WRÏŒññ!=1×ÝíÇZ ›,pØ]I÷ÔTl0j/›GÞp¯9±|ß*5\ô¼h™K4äçG2S[ŒªÝ0+ê¬"; ^¶7J_<©ùh¬î%ÿ3ÿ+à1y;:_þî”tc &éBGˆãÁÊSÿélè‰Kù,{ö÷Åj>Þ0 oI»E’ɯkñâð;Êœ®JÖ„vŒOijê³*>V%w– žñ}ÞIiÜ$\KÍé¬-¬Ë@ÓI=&>VÌlJf‹m æ4‰âÍðã6 Pw cˆ?J0u.;å’ òk3ÝJV&k Ä5Š…ïPÕ½ Q)dF;Ã?ƒÇ¬* »†²±½zÉ'ÅØãc i^_šÝhг¸è1ýŒxÂ&³ËÔó§±T‘ÅÎÄ‹Y´„O?‹]‡X?=Uæ–yœ‘Ï2 t“ÇúYçb˜_xðcPú†ðF—¹g”Ù~rÎ÷2«ÿ3¸w ýŒá{I0öÛšQD ô: Ö½5*бFìvÙB¶oÔx5½Qööã"Ae1<õþZôƒD!4Pz‰³áSŸóUÂW¨6Èf#Ä[Š8CG/I _EF÷…wž ùìp´[GD€«¸ÉœÖÐÐ÷!v] ù‘s:ª®;ƒ›9ûêݪò­¤ik½‘m» Á *¦”ôtè=¼÷ÌáÕ ¦`⌧&´xçúëº • U–J]¼ÀˆSîqjwcY¬]uòŠ{_û³½E¯£ëG·^]®¯v'X‘¹Eo¼:Ÿô¹Õ°èqY-—K4„M–áîÑIê“? ?ÊZ"jrk GuÔdí|q­”d45Q™gج=Äþ¶Ju3¥Î³¼ Vˆ!´a³îH·ÿfBÆT{Ïe+Äÿ]Òùbˆ?xÀIQØ“éçŒ Kÿè’¦l#îèO* GÑÖ®”ˆÌF=“y¸†JœèÁõI9zMÁJKâPÅÕT:áû…î=¹-Ëtº²†ìvÄ »— x£Š-=†ÉXijh¸TŠCMA6~â´·ÏériQ·•N„ý°5ÞKˆT¬d¶äøÙ<‹ÌtdO][a 9–4ïM¢óûÓÉÞôyHѾòª‹Z|ÃIÑú îU±XvóLn§½¸d÷Vé¨zêçÒ1d×[#¿ºÊ§ªŒ§É}Pî:iƒ^îjÅow»ƒ—4\±§Ë™LmPÐ"ÌRÊã·»”&ù@¤øE0X[rz¼‘î`“*B±¼>7Çêm‘Å^É;ºÕHwDlžë­9Ú7„åkÎ#Â=„ïqi˘|×çR&ñ5=/ºe°á¼ŒUæ±ÐþXóíXûûyzò.¥äs? }ÅG³á#•r«*˯ø•¼ú3À1!=Â3ÜØ û.s N YED åóCyóë„tˆ‰i–X¯ß†[} u¥¨Ï4 G¿4+ô8OÚ ÕŒh/Ý,YÝ u›v)~‹C{Nr±6þS"²T~e¾3×̳G„´ ÃTqùبþ;~l%U VkAñëæéc¦l¼ç<Ï~ŸüdJjcgOÕ›g?تòÙÖ”àïhpJ9ÀÃøz=•¥°|Á÷±‚ªÍ}zóÉÒ.¾¿.]°l+À¸I¿ha*)~$ÃvAÀ™¹ýÄú=jÛe ±Úlé㬀=GmüªwµÅÞ¤½úy)ñ…¦·¥ ¸hÍ^¬2»|~ZWìúÞ«\Ú˜æe E.êám²<ÙÀ+J“Çú¨å;ï[ó˧Œ? àå7Ý{“Z3t;L.,çOMßïS …ø1‘M¬PQÇ¢…=¸¥R"!«wËÿÈÕò9Þº­{Jlƒ±È)Ã[Ûþht wLáÆ¥Èô@ûã¢ÐÆ>e¾W¸ÞuÐ…÷)\žuáZåí±gìjÚËÊ(Ï ú,˜w¸Öôž¿—ÇÙûþœåÏ",OdæåIï[(*·r‡F®ó`Ù§·MĬ¡×âY±]¶oÕµV‘‹%!`æ•Ýå=Ž|ês ŽM% ÌvílÆ^kÁÚ!ÏÖªã¨wÞí¸¿ŠÎy6-a%°ýÎØBY7ÈZ®Ù¬9vÕìV0H¦~Z$¿‡õð…ØÖÔ.Õþ…•غóqšg­sbÞyoŒüy¦•àó*œp¬ ºú霚GÚ4r™âxK? ‚áØ¼å^Ü›:œ¦u9nRûôeÔ¢šíG&®'•¤¢¶c?äfÓ8ùrµtÓ.O¦¼M£?©š?ËãúgK /ic`K =5Ë êëåHgaèîëkFÖòqx3 æX7:"N‰`Cá›dÉŸ¶Ü Å_yòׇ|/¬¢·\v-ÃŒÒ0¶ ȈWcÊT›‰ž2zþ¨˜}{)eÿ¥Á'£ŠiþÕ)KÒÓ¸5-çtt -‚öc•õaÜýQYOœÄ8ïüy\2ÇW.ù!%`ÚÖzŒÒÄ·j §2lK-™¤Ña]²ï sVj™¹yÀ¨è“ë ÇÓs”ùB}‚l›UÐ[ š°äòçR^h[–sèò¾ÆxhÏ2ûB,á f•ýª»Uá£EõþÎn‹½µw>èùl (á»t³OˆáPPÂøªêKÏV]w{¶¬záÃ2îò¦‰˜s*¼ØUgÕâ8ÞÁDÒªŽ³ùAn2&Ñ3ÂýÓíº?Ì]ni.aÙ.Ð&rê@/½ûžÖ½ûH*y]ÚLàu!+4H ‹Ö ¤À;"—38ñTC¼ÄÙF ÄaÚµ­´fÛEXòXF _—¨o™ÑÉ-^$¢Q8³Ó=ØnT:³ÌL‰ÙjaGD&£f‹ÁB¾RÉÃ8ÉèD”{Y^RT&Ë•úLÿm–­´·ßàͶ¦È «uxßW†ÙÏŸtÞ¬=¦.«}*­Øb¨žöNh‹Óï9RU”)t/ì‘2C¦8Õ×Òöo y4fÆì1î³›l×~è›ÀSy'ÃZ¹2âELRgØ#Ý6ýˆa/j¹)„;eš–³Òq­,ìDÐåc”ÚU²>•È•¢÷xOcK_Ó»Ñv½áfPªU•j5æ±}¸å¡{Ù%iþë@Ez4ï"!£±­(Ãá‹Ä¤WGú©ËÕ½ÏÃɤKªâý=­qò2¬ØnÈPÂP¬)^å¾Ñ"hü‚ÄÙlªSÅÙšr—Êšå5‡iÐÅþM•¹€–PuÓ«¿è-%^—’ž´¨$~»º…äÀVúvÈÙwî}Îãf]c7¢×m}qÆÁGi%úxx-Áâ¬3·›*U #îGר·d ðdZ{¬ýµÙïòµµ¼¦¬xÂ!¨FY23?LAÁ¥ô¤2 j†šNÚ÷¸çž*´\R.꾺yˆØBr€ ~»™Ù§í’§Ÿ)Ÿ“#: p ?ñµQK[\@ϼZq÷¦ˆr²?ÓŠ×ë[T]®±T!Ec‰¿ŒÐÑ#C7 ÛWq†~=>ùZ-Õ ·9–cÄLŒƒNÐt¾œa¾”Í{Œÿ†mY,‰cßÇ´R°—æ¶©„¢=\ÔœÇödM^ø£ÊgêSI«2NS¼²{ÞŒ¯5À+ÆÙ}k&83Hvž]F|zãêÏ÷ôŠS­ÔÊóC‡l–"€6lÐsÅ:ÀËæ3„1†þX,SÅ«¨Í§åñƒ‹dÂMÆÝ¢×)„8Þjñ.Wg$ìòú|¼• ½¸NêäEü’ã&Ä_?kZ¾æ»¶@@Û_tF% Îì€Îâž9ãÏÃe}§´†‡Ü}œm¯Lt RÞ—n³¤ØÓu›Œöwý.‡'ý\î9Àn=÷b†;ÄïÏ´¿ÁŒ}1ü˜ä™ŸÂgÛ _2„Ò½¾ßš] 3R mïÇC™ôAK rY˜wfAޏ€…%ã×F‹Ýgp¦•¾â°÷/qªõ¹Ê}¿!1ǨŒd‡ë#Wtp邊"&kTþC&½þÞ9úù‚\¤yÀ[ lñ¼v1>wÒHíƒUÓç?=G‡Äš—[À "­¾˜ëWÖ2Š÷[¨’É=Øáû$øk:•ØÆ¹/r½) .Ë ^‹zA*ñ“ÙS‰[¯*/ü RQLiÝÌY‹‰¸‹¬ …®7—ÿÞ+å‹ÒèÖ‡<½œη-O¶zÌ„µ·Ç\Þ¶|ÚMŽ1™Ù×£°Ê˃O>ö[ây$X¡(£¨!ø-çŽzåFTÞ6…ï!Í»xÂÄâ$6{Õz@›Ô°ý:ÈAÁþ~ºuæL¤ý.¥Ç–TW,’&Š‹×ão]us endstream endobj 275 0 obj << /Length1 2527 /Length2 22421 /Length3 0 /Length 23859 /Filter /FlateDecode >> stream xÚŒ·PÚ¶- ÁÝÝwwwww§qww  î‚Kp‚»»—ABp{½åžäÜÿ«Þ+ª Ç´1m­ES’ª¨3ŠZ8™¥œÝY™XøâŠj¬,v&6xJJ w{à¿bxJ- «›“#ßâ®@SwLÂÔd§èäó°°²X¹øX¹ùXXl,,¼ÿcèäÊ0õ´±(2äœnð”âNÎ>®6VÖî šÿù 1§°òòr3üíuºÚ˜›:MÝ­ FsS{€º“¹ ÐÝç¿BÐX»»;ó13{yy1™:¸19¹Z Ñ2¼lÜ­j@7 «'ÐðWÁ%Sà?•1ÁS4¬mÜþ‘«;Yº{™º ½9ÐÑ äááht€Èê² eg ã?Æ ÿ0þí €•‰õ?áþõþ+ãßΦææNΦŽ>6ŽVK{ @YJÉÝÛ`êhñ—¡©½›ÈßÔÓÔÆÞÔ dðwæ¦)QU€)¨ÀËs3wµqvwcr³±ÿ«Dæ¿Â€º,éh!îäàttwƒÿ+? W 9¨í>ÌÿLÖÎÑÉËÑï_`iãhaùWÎÌšŽ6.@Y‰M@"øß2+ ;€“………›—t½Í­™ÿ ¯áã ü[Éú—TA€Ÿ³“3ÀT0ÀÆúïçfê ¸»züþTü7‚geXؘ»Ì€V6Žð¿£ƒÄ@Ë0hø®6Þ}Ðî±XþúùÏ'CÐzY89Úûü6ÿ{¾ÌZZ  *ôÿTü˜˜“7À‘ƒÀÈÆÉ`ýkɸAþ;ŒŠ©Í¿iüá+ëhéàý'[P›þ'cÏ€æßÃA øïXJN ­h~/¹ '‹9èëÿóªÿíòÿ·áEù¿-ùÿNHÊÃÞþo5ÍßúÿÚÔÁÆÞç_ÐÒz¸ƒ€¢è8þoSmà?‡Vhaãá𿵲ƒ êheÿŸ6Ú¸IÙx-TlÜÍ­ÿÙ–äš2{G Š“›Í_× €4šÿ¥-s;ÐÕáZÉ¿U@ÐÉùoJIGs'‹¿Ž'ÀÔÕÕÔ4dâø±‚΢Ðûï%039:¹ƒ\ ò–N®ðM”‹À,ú—èÄ`û¸Ìâ¿€Yâ7â0Kþq³˜¥~#V³ôoÄ`–ùØ̲¿ˆ]þ7±+üF vÅßÄ®ôØ•ÿƒx@ì*¿ˆOí7ñ©ÿFfßÄ®ùص~#»öob×ù@ìºÿA¼ KÓßdiö,Íÿƒ8A:s'{ШÿGÂÁñ—ÄÁá·ÿ_;Àlñõø;(Çð·¨\Ëßdnùäø ÚüÆÿ†œìAÏ?âÿ¥wòpý#<ÈÄê hý;}P­}œ­ŽX€d²€2¶ý‚še÷uÄþj—õ€Zñ;2'ÈÕt&þЃŠuú ÈÙé¿Ô bœ«AÁœAO£=Ðòwû8Xÿ•ºþWWÙA\Î@WГö‡)×ß2§?¦zü™]~ODèâáä´0³ÿ/vŽßŠÿEÄû¯æ¿Å¬ î)°‚šêö» '7 ƒÍïç_6@Ï?fÁ âzEþS¨*7{S7ë?ƒŠúM ºž™Ý­],¨kî^N8€bxüAôü‚2óúcÛ@ÞÞ@PxŸ? ¨]¾¿“EòºþCõ_Wœ¹‡+h@î?B ûïðßÿRÞ@søÕ%'sþpÛ†ðÎû:Q/ƃ)ÁyÊí ZF¿U×.Gd˜TÚÚœÐ-×[ÑÔÑ>Ô=Iš‘5’¿Ó¶&˜¨ödÕŽ'ÿgãj³ð+3ØCÓ%§¢ƒDp„Œ"‡þ/.þZ!vmà_å( \1Kå'vœ&‡³ìW^º1´âÝ&PJ’ľÁˆÊtÌ–]k£ëØÒ_ï9±Úͺ_ §&ÂØO®¯hÁ4v%Sƪí0ŽÅp¯g·w[ŠmvÞjõZÚ¦®ñÎ5¾t­Oƒ[{ýžš\6Gdžï"ÓÛïG[Æöz´?  Zy±ÒIZëÇl¬óe¥CUºO¾ëÑÊb¢2¬y¦òîMö”={1TÊJPR—®*ʈò_5\‘(íÇ« Á~ÓÌÖÐ¥|O†˜ƒºO™s¸AnÜ5Ú¢uõŠ/F ®q_Dî» Ö¿<7¹G:>»Gág_mð‰c ÀÏù!Âþ#éò^pÖõ– ͇˜W˘Öoš^¢Mk„õÙ CÀ­³‘ H1r˜.vL¡©3@IuÎ7…RzÌ·¥ä<Û]ß\‘G’„VÁ7ƒ†o˜7Ÿ ztÁ)¶$„£5OàfŸ¹Róç¼¥ U‡?dÅàíÛÔR.¥ä‘.ÏÂ+°áÔëçe¡ýÚ+ ¢%ý`¡ k~Œ ¶'°H9Òv¥†¡Â.YHÎÈWF¶ý:#Š,‡R˵:Ð .7&ç^ FÕïÇ ÈUO¢5Ó?Ósº¸$³H|Ë\1†,µlåE&Å™’àu¥Má_ûâ¤*0u4•Ž€0køE —˜•¥Â6óM ã»ÃESËÃJηQëËoá[Õ߃a››ëê²…GñL„¯¹ÓN±Œ'  ôS»¯y¼U8X‰®ݧïeÀÖPø¹2ÛZ\å=X¿³?eiŠƒAÙda7ɸW7ÌÎÜúà/½šSl¹\´·r(sx’êgßɶÕ]4Ö>c šÇâ³l}þ©(÷ ˜¯ËR5‘àéǵ…›²dpßxçšï2šEÆŽ'x‘’«1§+Ï´!{2JÛË€#=&ïg-®'&×OLä³Nƒ#OÙϦÌ2¯•^Ã%«BAaÿôý±ª•1g[¿÷t89{?Œ‹'?±LÅFi•bVëu'7—Éàá¨XÅ6€ëûÍ#)³ j‹.«ƒ® i°éóìïשò-ábùlsZÜñ黃K«|÷j*ኽøé_OŽÐ§^]ɇJâ­Ù%SkÊ·KÓ"¥ÚlÞ$Ç<.¤ s5{N§û¬ZÌFÄEê=þ eIêÕ-tò} øñ0s7L9PýuvËkçÛ›¡Seÿ ÆøEXÖzÅã¸PÌá\ ‡¯™v%Ͷbćë.´gí€H ©<WÁ‘Sý§Uãé|]mž´ï}9ï ®àuÒ>ÍÄK§ì³µÒcÓ’ß¾2:9ƒBÁÓ|Ñ ʦ¹¬‡j„LñìÄa@¤E{1²·¤ÚaÃŒ’e5ŠîÑ$ëf 0y+™Ùò¦?×¾‹RE’­XK”V]LùP ûœ£R|&듪B®h‰%h‹iÑ&Bn¨¬Ûà1^„|ût¡†ŽÝŠ]ÚÕ!7 QÙ¥’ËtÜ¥9ì}Y†k¬?¥£†3|ýKµ ICåíÆ3¬à8Æäüº†ædüØšì}•þÁ„ÞÞö¨z·”h,b‰ÃÅŽ/³¥bê9ë‹§9‰e\—?‰9¤÷™•˜®r8½6A‘~ØÌ98’ßo³r.¤Z•ûXK‹¥°s2z ½F™I9oÛ†¡“‡çóqØYd„U¾ à¶™Ôö£¼Ô½F¡ÙSÆÇn­x{{«šÞÜ5³¹ê¸MÒÖãÊÅ´Åqƒ—SUVœº‰@ÀgÞ]­ÒÖO¥€$7#»EnñَȾ{aaª‹Jø–ò|ñ ãÑ.+]bJ‹*Ã<•$ºc¥¹y)dl^©’EW¬ví¹|À£äऔ› ÈܪL–(Ç‹ŠâŽyF&}›³/¢:j¾×=Xn¢^Ó^›9£ê)b ‘¼âae1ÛÀÙ¬ÎyÀ™åá÷‰Ãó øŠÊ”.泃Ãû0ýÔ/ðnÛÝtgõ¨®ÌEtfÒç(V_a3óJ¡7¸W”œ+ñq­ %&6É2I‰÷?óÓs;”xyã¡ëîJÃmrJÖLn'c¡æo´¥I7ßí\~¦!E´oÁ˜=g5Ùàñ`ºö ?ß[%{¼â¿dòmš¥„wê¨Ý*ð†aÉp E[ÁC×f•òž>_8NßX½:|ŒköÖò¹i^C›Í%3$÷ ÄMÿäìù³)—(òcæíÊ`9“«ï{ ,ÇV]ñjqÖÇ÷J ò»r°;¥¨…Xù:ð‚yþâž“…dû©Gh„•J×1eàüÛ;¥¯U}O?À“ªQŸ·è:c†Ê S÷1Â1*!ÜzÊxš¥Ä%M"´¾YowPb©&OI•:©t ì΢…QT&v‘Ͳ³wÞ©ð.óžéŹñFS›ìU#¹®i?ð)¥”ž¸Íß §´ˆ@[†!æioFP±qx¡WØû"R,°i_`4xmF )óš½)—åcŒMj÷ÓI¡n2—™øT~P­‡‹M1PMí#¢«Ü°ÑÀ¾Š;6RÜZ+š„•DªSj4*µËs'ÔÂÒ«e.é»–f?èÞ büÐutÖ¯"–ÆÞ­èF©<þ‚Ÿ’×”,:»~ýp9/Ö³ˆ"óº¡Y\OUd EvuÛ²xÿ--§G¿œ–{€ªû¹ÀzÊ1±ï».õºißþ+j× …­LfGcÇT9…BlXš4ø†£‚ñ™,øêf%"?y©æ­õK#»l³o}Ž'Ø?Lj‹ a×MK4 ÁÛýž£Ñ=w/¶6Ú‹8’±fPa¸:ˆ¾»¥bö ]ÿtÔÛ‚ Ë쬸s»¹tÊÆ4ñû賄K*.Në‡cˤ¤÷åì‚øÇaÛÌ9ÂÊM%‚qÖà¶vj!›JAÀù+$z+Š=¢[`vÏñ#Óè@ÚzË©a_ŸrÏ0’ã1ßš±¨üÈ_lž °ÐïN®;o–£úuÀM‹IyðKàÓÖ£p­¼VIaàa﹤àtE|Ô ¯"òßeV?Ø;‰-}¯J†#IËõ$ey8n‰‘J EÜÜz<¯Ü2Õµ¼Wñæ–‰(Àò?Ñ~nâ_—&^ÂDÕÅ cûŹzý|x¿#c@6ÿYúž5m*ó‡9§Ò=o¥³·\‡ØËu³3ÄyÌ+š_ÞXª ÈîBú5»<“ÉÒnƒ­!|$j¼†\˜TÑ>5´6Íx1ž£ßmûnµËcÔÄŒˆÔÄLí¿žz7,ëæò5p*~ª…Ü:<_ǼˆÁˆï¨Fi&*b¶-‰Ø\-$ øf’r~*A¥MX¤nåç=wQ%(F$Ç´Øta(ãoØFÆëV˜IÍyØC üq&Äu3?ÊåÅ¢¾]r¾ônÔ~l…J9¶ÿªêü1ÿsQÐ.¸Ì•†ïÇÎø²Š«Ó÷«°öGß©³M"°–KS\ Oµ§¹šo¦€%nŽª0;8+qÊsƒk¿cüiû×W¾™ÆÈ¤UoëµÍ×rxÄi|8êÿU© ˜%OÓM=;{ ]—…]Ð=(ŸÏÇ“§<6/•¬m=#~Ê[5$V‡f½_Ï·£Y#Oè«F*XWê2„ª»¾ú˜rUt¥+gø‰y!ã !+fqtÁ°c#D8ƒ“6·fiðáïs> !äö‡µŒJÈØF¡î¹a¹b…zo¤Á2õ ­Í,ÕÖNۥ׬ÙðS¥Õ’ ­eÕý&ÒZÎîKùf›´ ·íÉšƒ‰¨ËP¥ ¼Au&C=Áx0Br¥B ö´ê+Ù¯M«EI}|:÷ø®æé1óÌI‹½/¡ÒBͦ_—Þï0[°o¥eŸŽ— ï‘IW¤¡UQ[*ºÍÂ,èhk¾<ß6·´ê4Ç!/,SÚN“Êt_Ä*˼ÁŽNÆ“?|‰å?Žj˜úôqW®Õ³¹!Äpƒžb¦eZÜZ8„3S \÷…¨ãÇx]ï•Hr5n.\–iUS0#f¦hyLäw{'mð&EšŸ Ю`-ŸÈ×M–guýl×MØýíßyÕ˜´SËÚ¼mד4=ÞÌ«ôù¥AKÖf\N9›!„¬XŸ*ÛA˜ä¶œgï9ß?"VóxølP¸þLÛ¼Nõ€· 0wé§çìõ $}Ù4\Ì}$¸ï9CÖd¨ïv/ =´á“ùYЭ1°NSc TùN$¥Õýê2-Tåq¼=À(ͽs5à–‘-£g@™ ùÃs¥ŒiÆwÏw{\,·2XIc·õ » nÎé¶p§¦\Ò=6ã<{ø‘ÍÞ²ŒÈFbˆåtØ‹]«ÓiöÍ‹'uð°:õ¤ú^ŸDÇνÏ3 .w2v¢îÍ’xcõ Ã÷f£/µÒœÆÒÙ0÷Í«¬eO(îÌ^·ã&v/á·9Þ׳V;F?I8CÓZVZñZS=–‚Š\(>˜¬͵IËßòs~†.ñ>í€Ü—uu¹-g· ÝÒE³ñ¨ îÛÜïÿÙ5{q6‡®ëŠúHâæ–/!nÍ‚F­b,ꎆxÊX™È€I»ÛnZY2Ún½;Í«¿ðÉã Vý—W> /m@C¾ÂT‡bßËj4ù‹r˜þî;ïX—á°bHYš´·N[TN…O•²=æÍþÖÄ=}%v14§û½:tãè»^ªôø¦.ަKsX¿þl¶Zö ƒ›xÜ‹¼Ã÷‡¬:#ÁZÚˆ>nÊ2Zã"8gÎó™}21½,D/AŠÑ¯ŠA5™ëžÌ+îóÂï…:3%&@,ô=´ù©`Žƒ`;Vw4*òTs0ärx¡ý &óÀ1Ê->ƒÅ‘Ù¹Ö^X¯Â÷:6u =V¨õˆç‰3£Â,ÕHñÄ…¼‰À¤©œ²Ï$­è|óë¨[¥p»çxÇ‘Áó{º$¬¥Õ±r%3ËúõÎîoáyNdpq«Ÿ4á:}g¯­N¬&M÷ã=š¤ f3ú1t}6[+«fÞ=Òu¾±º}ãÖa3ìKä(—Éš,Ê^þ™eÔ;ã¢tjÈÉÐüqˆxWš”4Ã-tF;Tr)㘘÷®½¼Z”›ì»ŸD¤š3›û‹âà𯷃²à';^Y_I–Å9³»oÓ/Oô«e:’gŸÒPG˜NvH{fúÉèäÖÕ¹‘{Öt‰ka ¡.lבˆ¨æVEåé?Fmë€E_C¼IS*< àòlPÇ×ÐE{O¾Ž[£þÆ1õéüH8lšúöì®ÿ!H ÇBKZa‰þÛ «JúµdÛˆ¹µÂ¥©rôÜúà JÕÃq•o¸D…»"û=+;ÿXqEDÈ–V@ÛÚd_±3Zèm¹hô-p¸ýCKBnÑ?½½]%`ö“¸kÌÎÆˆèÈ1‚%îË»Œâ¤•~¨²ùNùÛyò©-ÈRwGø/wF ÉDøü™p=þ'j ƒP$®7ÕÁ—™ ê\Uö3~oòÖxökõ ¾J[3´ë”­îra˜…Æ •ßÎsˆ\µ¾…ôáyÖµAw Ñî^ä÷6Ûç>@p:u£êÎHñ£2(Q•ScØTÄÔ+©öÊþ”Y˜ü5CÒ#¬Á÷CdEêçHé F]§w“¥^ Š¶Ãz[{ :¤‹Ã²MJ¢Å:ai¥Qã­‘:Ô,#q„£WÀ B´žR«$ÖŒ8ø¯Ú;]„85(`³oßÂí%{çœü—÷¯¯º;œ& 8RÆÙÞ½qašyþ±Ô:IÍÃQáÒ"(šK¨\²$™áG·BÏ|£ZÆOïF…ËxédY°ç› ÈüV°`/Ø5×|‡®F=ö¥r,!&VK"nT¶ÊÇh%£yPBŸ5Ks½hk.­0bƱ\ø¶-lÉKÛj7°¢­a\†Js:ÝœÛD’àå!¤¹öȪýUg¢ÞV>ô~úºùG„(,6©cÄ”ò[V.:t~êe¿HXºTG`Äû¸¤ßhѲ’ü,—c°ÑˆM\MøÛül 7øùÅzܽۖuv([ôÈõ5«¦g¶æoBγAžÄîgSÄtªÖ·ÄÄøŒçlÕð&ýoš½:|„¡këÂæô·”Ûõp?”:6ÄÔ9y#ïÃzÁã*óÈú—r­Ž5¾wnî™UhÂB¯Ó4ÐQ>xAWÝÓbÅ|HÞ‹0ÂT"u­î×õ-(¤ÂqMçµ'0aŽ €g´€sùŒÛÿD™x‰É‘çÀ§› ‘gÄ[ÞÔ.U?P‰¬­”¦ÀØxÄiœ™›¼`[™‘QáîÅ©%þ¡»¯=ÊØ 5Š.©øqÙ0kDìýn>:˜á¥€jÛánà!„µÑñÞ÷‰³º âaòµa?‹2g¯Ùp"0›G›'X^×äIM?Gßñ.uÃkAã½Ø!ï›5ªΪ¥JjúŸbî”J^´•¹*™,†vªñEH–ÓEðkpŽäj6Ä[ø)Ý7&–":˜¡Õé[µ{‘ô[1 H§ˆvS2bäfó,ð$Ò’üñ•Ä#™JésRX=¿ö-œî¬%V|ÀÅ[dØUwà'‚÷&­õ±Å©à¾ æƒÙäû¿¾^¿7¹ rJã‹T¹ñ·Ñ[À±FÜèAé¢ó3—ÍAÉ-˜·Œ8X§„@¢PB'#½‘5a+ŸõhŽi¿T¬8+D%&‘s€k_6Yq´ÄËËg\Úƒ5º¼e˜EÁé–Á=v¤«M3h”BwÄñ颋w)j‚ÛÛ–LÐÄ“ìüÈbµ6wÙ'‡Ä>u¨ýnmlƒ ù¥,8¶Î¡WѧIž8ý©-hðÖÖâš~›fõ2æÃGœÇJåôœþ¦;Âi]¼A\bÖec!±àÜ6.Dvµ]7Õ9Pvŵm0…âÒ!¥H):¡¦óN±e\ÒO• þÖ j¾H-aŽ‹xbM #EšñÄ&i¡/´.7. þ`¼¾ìì>îýÁ[KÖH X%‰ “C+CæRmªA6¯Gö1a"Å2ôiÜ3rñ'O%|¨’%å™Ïîæøœäàäò¬2Dºu!Ýt«¹B+–Ö2óóE¡äŠ/y_‰X^F-s@zJÀŽÛ)}Ê„kÝëœË=Ô·©‰V6`ªñ.¤of2äìÿÆ¡igqÕz¥cÌXQ$Ë{2C-QM¿u]†Ø*Ù¦«Ò c±¬\ïR2»b2 õª›©~ø|¼wW†}OmàGA­WC} 6Íîd¦?®pB§lˆ×v*÷ˆÔb¬ ÜA`62@*]ÇÔÖŽØ®"ÔwJóùõ«Ä2Q¢†~î‡Ö‘½Û×þáÜå¯_9:ð.[+°Ißúem qŠ"? x®åÞÈfM c N ;¨#j@#ˆg%óP,Ç$ œ'ÀJal~|O¤†´L+QÑóë«U÷ RGÓYh¸¹­†´Õ~«“æ@x1nY²ì¥FÍ•H™ŒµÜÏÀëž|×OxLv*l߆Â9ˆeuu-”ü<î…ìC.tÕöÀB8ñUE¶a„Ãb(IšéÙVßñóˆè¥Y½1«`Ôy$rikÛZD‘d%¡rx:¬Ž“¡úEÖ±]¶%tË\Sñ¡ó–´H“¿•*!€FÕ¢ 2÷¡µ¶¬åý¤ÌD´$N–‹IÉwC=éÁ†?mñE•MP'iMí!ÞÉËôØTžÆÏÐ)`ð¸UZ–@‰šÖ÷¨ªŽ\šäŠÖžm¬„H:Í‘ôM¿¯½ƒ{Šj‘Þ`¡</Q»Çë`ÍILºô B²ÈÿE]쩪âÍ“: ÐË6ínq;V5M%*DßÉ”DTuh0J‹ÿ&ÇÔ+ìsURyJSlÓŒççCz±É ÅMöÙ}݈ú axÚÚ›vášÝüUD>ú8;«ÔaQìÝB;øÌÎ÷µ1É¥ç‹ÖCÂH7ª¬ÚæhÝè~h¨øeÒ‡ežõåÎN:—›bS©ùM}rº†æ´ŽÔ½¬Lï4µ×XM©ž÷£Wi‡âJ‹Cá½ZêÎ<2ê}ßï·Zè¹B’!é™Þ_$µ» Nì5̧Xo½¤–Û½áË„…’?Žä¨‘ä52ùF¨8êeZ­tNï\ƒ7:—Š…ß6§¾ëµ]˱JÉfKÁÿ£öµŠNë-R£YþbÍo§aþq9n@ñeuË}WØêó¶]iÕϤ\¿&ôx“ùPM–ï´˜}>Þ½6gœÜ_xƒQ†uÕç«Çâ#ÎN½emÍ~@9ìyß¶?)Œ7‰½‚@ÈæéË®* ö«&[ùÇü^¾ ‰ùŽ^诅*ͯÍì¹ìÈß Ȩ¥יu¿?BdF¯È´yŒH³±Õ?ÐzKødÒ4­y…ÍG¨<7C"vš!ù7á.Å„”ÑŒ ‰*nÛ"÷qFóÉ™ìj‘ÞèUS’GYë­áöÈ4¥eQ›f¬š+ÞÃrûÅéç'—öËí*_Ð[ õ^û¯º¶Ÿ©§‹Fú«ñx¢Ö¼Ü=M¼>Ð~ýµ™¹éóm)¥ÉvFbé–}àx,L=ω~9Z[œ‡ø¬­Õ¬I>nUy”oí—a€-6¢k’’(†™çÕâ{ýàYâ묟P—¥{[÷·|;´äùÍõ{îI-æ93«èSTð²5íPó¾¯ÙlÉr½(hlSÎTÁÂpÄ_ë+öïûD¡·—í ×ó]åôB#IX¬óúJXR£9 ¸òøºkø 1âìÎeB¦„8¿D·äj9áHפ7¨à7ÂT)* OOî> ’Ùn7&§¥rý †P|J.•Q2Ï?â_ýÈ?{P·˜ßù"Å*ï<`@Ñ(x”qâUQ“³Ë¼ yƒõ¢šø™®Wë~Hºn]„±'æ•ÖnéN¯9\bžç$TµfðDëׂp¶#t~ÐÄ.&ÇŸª¸_c‘>K Þfyר ü¥1îAWàÕx‰+5ÂP¸¯Êl«¾7\zÁÜc&á¢Ëá´M꥗÷uÅ2…#´J³DÁ‰v}¹«^ÝÖ& Ï<ž áåq䃺¥`}³šYÞß³-b­õE²Ü™¯ùÌ+“¾G4c\KÔ\F•^ñpE†´“ýÚe£ãxæ­ÛJ³ál˜¢®yjÂÙrãŒrÒž£Û}?P÷V¬d)ÅãÖÜuŒgœ¤ø´§Ü´Mbu@«(\À&*c“ž˜~÷£É̩Ԃ ë·¢ªCkHÕÖö[¨}’Ï¡¦æî¦x“£ê°†Ìk‰Â%¾i—RL¨ˆÅ~—T~™zéã‰|=0Ý‘…9,Ñ”Öün÷•a!"xö²]0h †¸D‡+g›¿ÑÝ4êQ½Çð°ñ&’š—$ ‚6ì]rœ:Õ!¶Éî‰óÉO£œ/$óá^ôÇ[ü\ëkRòÆ-FPú¹1¡œ;L¦Ž£¢tå•ó=aôñÙ(x‡F°•séå<@Èæ/ÇÛÐtc%#-@4x"âC¨20 ëg׸™ÛqÇ©a̧Ô|Ë  ™J`ä%!*•dÓÏ)š-ˆ4)婯š»Ùm¥Î*¦´8®ÉPc™ÑÝþ¢GóÎJöÒÞÔ©Yæ¼ÐÇû‚߈MÝšòvlFqãt—±¥³9ºD¾ÌÙQ]wp#¼ßõºaøê.åŠÜhËõËRNð»ø™6¶||ýRØ%»ç‰Î÷'FȲ#~Ò 3mF­øŒ$ⓗЊµ3¬œÅA$Èü­¬. ¸š†47žüÏD%qŠÛëžpUpp©¤OðwW/ÞÆt4xæÄt!Q¸Vø«ÅÒtcS㌛åI½/øÄf%ëVÎÕhåo`}mÔŃ)¾J¹ž=̿ߘ‚úý^9kBÖÊ£`Ás–9úVý ã”8s½º›ðˆqÊ`ó|xM õ*ÒÔ.[@N¾ò ¾4'Èúͽ>þ6Û“&$·v`Î*-Ðä:ìׂüÂ-q9…„7¡CÔ‚ûΞ֌9c¡0²`±–kOÈÉ–¼6¤ õ³„Ø~3—« øæ”Ña‰W£yxF_ëµØ²yDé¥í͘t|Hí«¯T`øüºVP[œè±¢‚O¼eÐs/µZãuWÓWµÈ†²3s²JãgÒ]¶lšr¿It$Løqœû~ŠE»}ŒEôDÉ3µÍ¹w¦ÎC} '­#®”íÏ(/<ôfLifVøý÷ÜU-¦òYí U<‡ó*Ù¹7N OæUØJøÒ‘aÛºI[áær ¥nFÊÓIÝî_Úƒ,²î}Kµ®ÐdžØ.ƒ ¨AO:u8…zå‚ t€¨ËJ­O† j`ñ†›=#å¯1zf &ªŒ ðýXÔ0à h—FMj¼®2O_(Bß…Ó›>dUˆ•òM t½a·Í™Cȼó^gŠÎìf¬Yœ÷w41<¸[U˜DÙF6u±xÜöß7ÃNf¯ìŠ‚_ö¸h®xŸË_£ î£V«bNq벆qùRðÄâRB;sm*£Iš/ˆ–¿|PM3àÚ.$C?^ ùÇ“×æKÒ-¬A3‚¿Ë°¿]Ý$ï|AÏ"2¥©Ùwmºc@xŸÓãújm~ ö‡$ü†¶ë6m`4[ŠÍ› —u›¥¿‘èíNjÒ˰·-Ø Õ”Œ6¸³¸r$Ó™Ecæ‘=à¾Tk•sF…#¤UKÓb'Êdß³ÐÉrU.4–ClÙf &Â?,“†À‚J±"~Eñ- ¥ŸÝΪc†£ð*–á€d:(+·ÞQ>^k+æCäOÕzž„–÷N¨V?ß'Ä0+d¢2žX5a›$_”³šÁMAã;NãÈF8ë+NÙ6^Õó|€Z?vÌZ+Gm£ç#¨itWæ¸v_M ¥¶$üaµ9ÆwèØ<è(Vb°FUÝwS•:ûУ¬[­ÇÜŽ¶ÈŠWyâFÆýÈ\ƒÌžm0íPãrÔñlCý“ù•Ý2Ã[¶éK<Õš}C؇OÓp×ë .VæZ„Ãή‡·‘ÍÙ7x˜Eª:Êy}IZö8Ï ­nãŠÀ:`Q%¬®Ø­ ¾³U+:²3$"ÂpÐ}¨ß}û†6ŽU^;šdÐ;Ÿ³ ÁÁR^kF6þÉÝ—îk=ò¼%Bë™ö.6×a#ŒZ @…˜<s—»ðcV¼{Älšj*×ã /~ ®å«UnÄ-^’kÜQý/Íf?Ž=[uÿ±»£º6f4*o±œTn rˆn¼~l²Îè¤âÜpwñ—s´ÚÅ¡F€æ„íjCBTRA|œ£xMc,Ö¡ÈÏNTŽÿnUø(a`X,ׯq±õš³××ZU¥ü`ðì۸ɾñÐØµJå+N$†kçÎÖÒ»›¶4~O\jHJ£'cùJÕ}VÀÓuvH“.Ð#,.(æFÝŒÒ7íp¡%vë êÓ͹x±ºíµéŒ`‡ëƒâä>Q‡ÑfÜϲe›¬BvÛ‚-)Ô•'-„tÛ5Û åï`h.EŒ8õÅšJZ‰,ªëêã6Öm®Sœç^ý¨¯ýwªØw|3i¾ðxÜ(+w+tbP(ʼŠÉ¥pžJ¥Ú^𺬥Sùm=èo£€·‰/M"F•Y¾o‡®€ª!6}í =ú:éTm<^Ç7!Ix„Wà ÙyJE¯ @úh–5þ]“¥=|r ˆñ=Ë®‰½4{|=ìЦ†*Š­•3¯›«6#ó:² «õÀŽñ§¤lú‹»ú™áJ¢ëm™³ ׯÁG¸!Êð›Y:‰¢ñs;%»»šTQºŽ­AG¸ÙtBY3 ÒÍõÀ[J›P§Yø¸|/}v²œµ%ò€W« µãT M4Š€—á4˜+$„DD«Óî­Ä“ðÊ å§:Þ„#Ö$Ê ¯p2õØNpZI_ Ù“¨£Ÿ™!r*¸•SL$4Ú¦ÂÊÀqäD ØÇ%aJC|}'Š£2¶ Xú®Qo£¸ÆÂ±¢%ç±·tŸË/ˆ•ôvEO ãb·Â|´àüÄ÷1ï|X¿ÁÙ䨂y‹ÞQ{WþFÖ5¾¤%g`£8ù@™Îè¸H5>Kî‡pôZúcMòîbVYã÷:†Ü“Ý6ü)A…æ ØF3´8VF!½çííÔ‰[d'‹e$RU²ÃÃ!0#éÕ+1Xp ×V?ñ¯ü{µI‰»¥°ÃÑy7Z,Ÿ£¡ÒÎò 2 °TóÄã;[øl­#äem¾E 7Á&à—x;éyPŸ.7AÜßÜò¯#Ö´NVfièHs¦êhДìU¿Ê8ËóÉ›;wz–›@È…9N\ “+1¾qHwæ‡;ÚÀXÇt´W}W{Õ%à# ÿÀïŸ$8*q³¥¶Ù¨Fê g[‰apw_±'ŠiŽ!î{ÿÒ¦¸D¦³…(*®âàoÁ'ØžaÅÉæÝ$þX!x÷iq\þ¾&4!à›ÏN@ɼ"û–¯ÔI,{$©õ@—fµ˜3 =鵄ðÙ ðƒ?Y™ïFà4ÏmÅÚx(K÷,3ìâÇ£sAþIfS…yyT£j¢÷*ÄÑÖ:ŸZ^×¥ÃSœtbå%õ]ËÎQʳ¾J±-C„/ rµ^&É)±I‹³9j¹î æÂèü¢•-ÞDf¥ôx±šF™I Û§šÔs¬îX¡m¥çYê2èkê”;aZ¼Ö³¾áªÑW¨'€>ÝNw'~¤2Ó²@äÐQ“ïd]Æõõd¦,¢[Æq ‡v$enR°Œ’Tžá}wº•TbZИߗgàЅÓ4ÈJK|'9rOM…ËiÍÁ&[wŸZhe]<"k°›;CMA"½¤gŠìDã¥G‘+§¦#œÖ–¼|sõû@9Ç¥ŸV&[ßñ¬Èõ°,åÀ>ÕHQ•VâšÕ0$);h» -E\àìõ#9·Å};?ìe×L…Ù€D¡™¹U€­Ò¥K“æ%§–DOääbL!1Ÿ~˜èÝ255“bжc¿•:Ò'Ìa4³'+dW$ é놬^ì»p~™’-mÛ ¼G·ô»Z¢ èK ­h0>A=O LD;ñõéðH†Æ¯MW ”Íî§Ý³[/ä\r¿z/(ðwß?I› Ê´fC=䘸|òµš<(mبhŽ3j ›'/Ñ$q|Ó!ËŠa@ Lã”S¥ie'ÏAÛuÇ;ì6b[R˜¤Uˆd;|h¼Epûe;¥.ˆî¥ÀÈ<<²Á–à× çfÆ¿zºÚµéÂHè/×gÜÏaR㣂˶)/ƒ¥¯ÎÇÛ>èßô±a"y`‰¯4_ t¿}‹éª˜}Ïj.¾lÞÅ=8ÉT¯æ7Ž‚t)ow@!ç=ú¾êÑÜÚæÝ‚¥¦ßUݸ'¾Žê9õ÷cCd™ <ôþYÛp¨ã2g&©[5ÍAÂA¯ï龨_Q#Î{ˆÉ÷¾!ßTD”eÇAEb’.@wH¨9Ü·'|Åb‰NnBÑ D ;ì¹'Ò¶zõ};NœOè¤Í†ŒCXÄóû–ë³@ äQ¡¸B̈‡—«#„=᥷Ääg=Iè–,{Ö!…lIbý8KÄÝ*Ü9bU°ŸŽ/ŽïAâüíýÈð™Äš|ŒXû쯘"ea m´ÎÌ“ë÷í9Sl.e é©:‡Rã.• ëKÐhs9Ok¹„ÄÉÓDô1Ø…LßÎ`ƒ–í>À¢²Â) Ü øÂg6ónj)žÞƒÅL²åÀÝIª#-ç8æp$9C‚ZÔsÖt%]MÀ½°.u‚О ;– ÍìBÊý“Ôðè‹ÔØÑ0[«Ÿ4Qó}ʇNÚï¦(╾÷â×(Ÿ6™M°ôÎ…i…»á$"^¸@¤6uÈ¡«/éf^XŽ8ý,íŒ g–Ä]ûv‘’Ê|˜•J’lf&ìâß_:ÅêŠjмF&üq‰àÃCc+}ñ¢ ì¥øËi¶Û¼²LzàÔ'¥KÜIÙ7\ÝsÔ|aÔò»…Twñþ¦f[[JW÷D<”;W]˜Y‹žW²|݃äDTY˜wþErʦŸê4ÒáL9¦†¯%ZäOeý™± Ä RØ‘!û— !æþ·ä)Ä]TÂù&Õèe`xäÉ%˜•Z\½8[zHÒr¤ë³¹óŠÐ“x® %•ø[cwW2´ÙΙ©è'ÔaÅ[PN×õm‚:¾Ù'šž6ø^.Ëýè0×åöµùâ{øðÚY¤Àp'¼»ò“ºç铘¡½¾Ù !©~ã/‚µéÓÍÄt¹ ‹ï}Þ¯z/$cu…q”ÁŽáþã†yÔ 3o¢§¯7LÝ·­-Q×<‹~ïÈÃʰÀ(Þ~öGÕyÖ·/-º=EÓb'@<¥nIm, ÕµÔÔhUžç¹”ÿ g«þº3–B¿pf+ò“ †h¶$åCÖ©C'BUöù°š˜ÃÌ©ÀvŠ E´v‚ƒ|Œ¤8‚ú‡ÄI臓Ú÷Cp®·‹ÂÃFˆ/rþQ~Àa‚à»|Òh!i6A­éëÙe=ìKg!Ÿ}¤2ÙÞõì!*|w,NDmf7fõ0`CÊvrœTíúÐÒœ@¹¦Øž|`"—Snœ’a¸KœIã0@üxjH‚ A€m«PÀÅ(ÌÍåÚO“TfÄ4¾ÿàá”;PhûHÁ×âfGå|H-po™Ì­pŠ]Ë‘WtAúÞêT;g"þ«Å>iÖ ¯bà·‚£ëiCE_JãÜ7»¢mN‘uÔ—/÷`º§¹<Òñ¼-g C¡^‘›Ø£¸ô4Ç便”¬;'ök'Qª™8ç•jˆãEtPÍæxm€Ï2ùÅ ®ü¨jc ”Sý¼ŸŒ˜Q1ÕAÜr›]Ç)æ?уöª}¹=°à¿<Úº€Õ”á<lKî²/Uh°yµÇ’×o%MºÂ#a-ZSÐó*ER?„݈^£6Ÿ™çMhÇ ~¹6H8‹_lÆ®· ¤$ÿì`Šú:ñ‹–#ãyסÔN…”˜Óú¨Ñ…IYœ¸SôŒr{“Çu—Q¿ 唡ލmêîÂ¥+“kªV@åá…ý+UÄ>¯Ágã캾÷”1äª³Šæ7ۼ扛ƾ9xÎ|ÇêiηVåàâ}¤ïßË‹í†!¯µ”FWðT%é:Ñ6³úÕÕ_8-×Ðà“Æ.˜&M,àŒàdªjœÜÊc¤!`|’”Iˆy\çÓ|cçX¡›síÍÀéÂu{¿3>áЯ¼ÈȽGXÔoš>¿;‡i ¢˜Y3¬»#tv¯¡’µ¶K»0·žÊ[—¨ô‚Í>IrŠôQÛæG‰úkUa‰Ëe}°qmþ¢ÀQwÞ["óAÛ„].Ô-†ëä¯W -æÄðÀpÚ#éÅHP&J©qÂ~|0äþŸ ¹ô86,ßåœãÞÕë 7@ã¸Z6ñn8 èQ‡mãÓ̰öÐOÌÓH‹‰=‚]j±­íe²ŒðTbËÁÕUW4X8%ò/kÑ™ýÙxÛB-2š—¾údúw!ïQð’3©Ã€4ON²ð;b¸&^Ôç®4°NktBò× ʨƒÔõû÷j=eFBP›¬„Ò¼,oã°:õ¼$dU‘-6Åj¸‘Éõ†“´†ôí:~Î}ÐV0NÂîˆÑˆöìÛG5ol K®œÂÍŽ>?õÏHÁ¹Ô9ñæmC-´‚Fi†zL§-í³—à¢NÍ* ·n +À][Öu&?sx?þ3¶ú%èb¼¶FÝøpl¦å:³￈ËtÛ)â»"yÖóS‹?µò›?È·‚¼×„Õ¡å³ür qø+Š¡èr"ËhÕfE•“÷lbF¸÷GeáǾNüdO«’ìK‘‡¬$wt =qZäé”°¸ TÕç›-ûY¾8ï ”/VKDrÂ[ /ûçIõë0qÅðmʺi˜8¼‡Vp¡vxsO%RMY‰ó2“›§.I†’&«ÜÚhŸ ˆ—ö Ø( …ÔP §û¨¦ÅZ®ÒÇŠžþµ5›íÈø]’Ú—36É]ug?W ö‘‰Ã×Öj<4Õp²÷lÌ @ðĦÀšéy&Ù½þ::ÆðµÖ:˜X:U ÚÉ9Xâ"Ó &ºN\-ÔÒÎ˯跿Œ(6·CJ*½ÐM9 z©Å¨2 kT‘ýij¡êŽØWOx/ y5 §~/­³lQ21®É9AA2‰´AQ…òÎa¤¼‡û¢²/-TMö¥¶˜¸Ô´Ky¿iˆC-ÕŒ×QÍÕQ"= ˆd a@Åø¾Ð]m>8râÑóU\Ú‘»yãûK Å <‘å 3qœÛ‰Ãª‡òÈ“&¥¿û­ 0Ü)F¥öHx†AØdoNÚ þ:Ž à{[P>!^U¿û7©c¿ä^'<Æf5Äéßµòåõö¾PŸ@[™ Fû©¦©ˆj§~tPÌ”žaEM´ÝTɾ,„Λï{Á‘áß8~ñN~0ÉÁ¤ÀטÏÉ'à£Z°KzŒ@*¯D`‘ðFM@㤆À9ª†Ò÷Ž3¨no7ˆ©ì¾fÄ^Ð]h§©:†/ΗÒJ*±¥RMÒ²´ :âµ:+¯›³–D6«Ü8QÍÑy^>²+O“T¸ÃÜ ›Dê¡§¢Õ‰O"Å\o¤Âþé*pfòîñ¡Z1 £D¥žÍ ¨ù++‡‹?¿òÅ57ÓÐ1 ûÂnª”Šg;¯fèyFžÝî( ÕšÚHŠëø^ÈÞmÚw¿Ý¾2Ö"¬Ÿ-Œ dnøFôô(ÚSY©äY¼7HÜÀ“ø‚Ýÿ —Zô® ~«iV'–ǰþdãˆÏ‡•rs€µŽ 8«­Ù_ Șˆ1D È «Uɯ‡Õ(-¥úß§Q<Ø¡09Ú?´›4H~.ÀYÖ«ìdеz‰‘ðŸÈ³+dÍZ´7 ЗIÞ¾Œcò±„ 2ü'L Äî¡¶.‚™Ÿ5"ž^*]€XÅxB~âdý~V·˜ç>\ò-ªúo¨¬Fñ)‘ƑۺÄë´p@T¹ÉNþèBã¨ó¦é¨O=ùÿÄtÃÚoäæM¾Ó”+ÈöªÌ¾ÿ;plj¶n$yó -]F2À¼2^(9c讜ɳÿøRí>†Èdz•DBų”#Wý×~Øù³.Ë»üÏñ±ƒ}@¤"1µ¶š“ú½Üô†ïK‘”«(’ˆ«ìªî@K„ŸÊZ<ÇÄT©¯Ç®¯` ð5Íötg@ȯ.‹ 2c¤\$jàAû¼ Èí©"¯wžfå<5uZDJÓñÛV¤Œá€æÛxyGÍ*°´TMÕBé…ä£M©3™nÒõ’Rpæ<ñÎØöØ„Ý'+Ç<û¾~ê’¼•-ˆƒì_} ù/ð îà }i^‚˜ŸS–éò¿AT>Lü2ðqta‡m$$|–‰¼P~Î /ý° ·3˜“=Gnô…Ú OÒ¼1®ÔØF¨6:V+2`¶Çù@vë8“ üp9¥8»õB¯ês¾?&‡xU±1Ãæ+}$ý «Azm풴ຮþbprà_ZŸŒ²¦záÃ]œ3pß°8ØÍQëËË{ šÍ‡àšõ•¡wÿµõ/90öÖ˜{m³<—&ùyº¬BF™í·« yR"<žò‚'íWm•W¸{+˜õ~­T 0iUµv 3Ÿ¥ŒÞç‚ÛÕ8qµ÷Z+Dô=Û… -æXQfS‡“‹©´Ù«ª•=^0u©ÂÆ‹•ÆG;¨žOI©SäΫí:â²¾×_nyh~#‘7QG‘VÍ WÈÓ¬7¥ÓÜ´ÁO¹É:Šf²aèÅr§õ-Ü­‰[ˆ+ä¹Wóõ¨ÀÍ´gÎmˆ"‚1V#çÌw¥Ýà£}bfk]bO9xÞ¶{å‘âãyË€sC<—]¼•’ÉÊ­cµ,) `SîzÒ›·‚SæøúzdŠŸ<{³©Ø.©»Lí8 #>\Àìv‘†´†»ô%-LxG8cDÈÚÈUÇb²ñ˜#¸Žü#qÎÅ OÆÎ±Ð' HÙ9ÎòË÷…£ªªQ;n²lÎLŸèèèuIÔ÷á®…ÝRr'˼é-n‹;¸Lƒ$| Ð}P ¼cÎPŸûˆe<8˜°ÌuÐË(@yàÁ»ä-N”ß/ÕFÔ?5K­’Ím’ŠMÈ«Cþ1T^[LÇ*¿¶›Îx¢úà¦xÃíá×ïa†ï$ôì+`—ÍyX\ˆ=úˆ ù6;F"¨^eW¾üÖtÌR…åW‰8H/5² V\=î¦D3 ióÏò3iÜ­¦ZZLé˜Î#p¡ê扥ϴÀóæé"Ý&‡`]Ó½“Þ¥7×Ý?RØ¿m†>[Γ ! Ž@¹æ{üyþìJ¸ïÔP $X‡êf7”ö—S^¯w¡ ¼ÙZX¦ã¿9uØ´„Ì–FeË'ÍYÄ-;4F3ƒªÓï‘a36IG@H%µ¤5öºj)9›6…{ŽÂ™­µfC7%z¿£Œ£„Ù$“ö^¸ÆŒkõÑpˆFÝÿ7+k`VÊi¿øeC:P¼““6¨¬›Æ9ï½*õêè;ê×¢.i‹?œ–B7Ó¶|G‚D”GÝXŽ%âŠ:5yËÜawŠ—pÄVéyCð¬hgK4m,:ºÔ0OGV/Å|¬\b—ž¥Ý©Å”Ú‰ÌÍIÕÖÏÍ"Ñô4 W°O`¶ÑôÿùÍÉSºÁ‹ðÂÔP3ìðYúO¤ˆÁÆ6Ø‹Ï !‚ì))ïÛNUÿöõdÞŸUô\UæXeV1zRùûÒÁ"ÆgÏpiÀ6Û"[Î"CR†wò‘héxÐÒ {y>6Õ;sîÂÖâúù(rh¢1êZ²†¢Çu¦çtÑ$ìF’em¦±i÷[vnóJû”oì(e>:Yƒ¹{“Žì%֪ߟJލš#»›' Bˆ@wÄv-éÅ+0t{.ýn€²ÈÞì-›£#Ößãy÷³Î7,ëXØ2îVW%@–‰’¸4¹3fqýe7¬u舺2åCxšþ÷Ñ'py^æµæª–§àdùÕ”^vÌØ;p_áÇŽaàÒ);m_½ð'œÀ¼½¹Æl¯‚ÿ[Q6Af¿4Ò¯måktËæ‹gÝJÕ˜™Žðy§©ðÙøõí°Î¬†Gý‹a¼ã èÀì69\EŽGÀ® ;Üe Do(lôÎÇ?OHPÉaó°£ß ¿UŒó]FÎ+9ýš«½ÐZb.€ŽJèÁ–âÏéeÇ•ÄùE =wýJÕ·ß¾¹öY¬ì×߉=³8»¬‹m¬ú.Öè vÁÖµjÞÝê?¯q d«™®û¢»ú m(=€³3|êb+²9À«TN5# ¥-#Ýió»~[j¬ÞKäsÕ¡ÍV4ÞÅC§…jT¦=áêËýªðÖ\Bt9ÑNÙH·Š­ðÕk°“ôÇ]‹¨¼oôoôØZå½Ò" ½¯hˆÏT0ο܂/Iƶ*ëè7N#tz"*›ë‡áûT“ûê_±ÒgåÃ_! eò§ÙM‹ì°ÎbÖ­rbAuº7"W/^háß!"æ·-G!5Ø&oÛ´¿ å•Ù;Å1§Ï/‡¾Âäo[A×»8š¡Mdïã´éjSï¤JL>«=8Ö´éÀt¥Ço¢ãtÃçäåý)…xI®¦ŒýáS¢¢c(±hbµŒO_FÅÝð"ãýu•²§ÜǸ~æ<0ó¾Âº¬ýbohV«Èɉ;›FQ«®O±ÛçoÙÜŽÕ…t}&?E†Rw8<× XAä´H»Nåsú ½=^Ü d>&I:Ðu¿º™ªtwÄ¿ü·L&zj/ˆ¢g‚=fšã¹Oú!l%N>÷ɧ|Õ}Ý&Ä<퉎~†>e… ÓGÞkýUnä²3aÃŶð»çáX|:¤Ò›imûÇrƒáUrÙ'0dÏÙ”UŧÓʈëÞ•ÕÒLKk'2¶ØÞï(§ÀßïïNäyS_ZêßUWž¢©ö mÿØ›Ñp ît¡µ){Û<ßk©?—'ÓáÂiIÔzvãC̱ÆÌ–«²ÈâažkäIÏ¢ÔÛüÆ>/#¯°¹W£3#¡sÍ•“cqpãçM‚‘e•€u¥× Ëÿlº&w¶Ä冧âÿµpÇǽÈëø†I+f’Bz‹ JßnPdigÖìp ½AçÌÖÅŸ5[<Cñ¬ò‰êíY#eú,þ4Sß A`ë‡ÅZ8Dr” 'þkz™|gt÷æU°u¯ðD<Ñ-t¬!ãÃø eg(·t×ò.´¼ï±E·žW˜]X`4Ú›ÐòÛzýÎ_Pã§š²™ · µõ½ƒ²ë;ËÖâƒxêçõþÞnÆ/çû)x}^ IT˜˜ÍŸ8CDìÉÚѸçÎÔ&ÜÓ@Ø¿`4+“k®$k~X˜Z®¾ÐømýC¤þŒE¸˜Ó¢Jí»VöL_N†ùÀžˆ†£Ò«)ýWÆùv '°ƒ@H¢0í®i!}B˜}_ø`þ]pþ56µIÕhÙtbDQˆ,˜áÆŒ‡SP“šj°š…öÜ…ÍÌ9vŸ;²÷³=ƒ„ ¬†-ê$ÛÑ”Ð0ŸQiŒ\ì².ÅXu¬+eÚÔ ¢wÙ ’h#Ô!.N¶ë‚è"o§}NŽœü÷üÿ6-Ć3V®¥ùtè? xœë‚¼k j”\º7»µZÕ4zË€ÛA§ð@/RÏB…žÖ_Åô­¢Ÿ4H|Ú~Ó8ÝÍÀ6J(’´X€|’óÐLͺù^@Ä_'8ÄîÆrná÷m¹½ì§1œ ±<);™ž«4n¥U—×8–A=$jÀΦ8›–+ç“à„»}޶.Ôã:ÛÅn)EÈòçtËÑRÁKÅZ\ÿz×ÝZÙÆNûɆ²ýG Þ1G¥ ðÿÁ(ˆ[ùò¥¶uN¹Ñ‹S3 lí k÷H ‚µ©®×ø#7=¸%ø*Sé± †›½µã¥×'±MÚà*c䙦æj.Ë¿«Î,“Ö„ØDá"E4# 나Ý:m˜ßp™ŒÕÓ?euÔöî*ê™ð€0„:¿+ÑK“óÆË7tX<Ó¿çLFÃ÷õJ˜O„dCƒ¬(¡«ßâ_<ëN+ûuK%/•ÕNp‹ƒ¥?ޤ3#î Šý¬L0dùúÀ馨}ù²ttnŒbÛ¬Oçõ¥8µÒA£·ßMP3r83én¶ å£ò¸†âöa/Ó„£›†Ïç'5BM),lqùLå¿ü–Çan¸·“]×Kïë p‚Á}C…t0#ÄúÒÇŸ ÈÁ/£ù¬ûŒþxÍB\ˆÞ)ÌFý]£È93íp7·Ç[Ú¬sI«OºÉäÔs™´àëà2žD„Œqà[[œÈç"ÂQ6Vdƒäìm×"ñÚÁ)3ͤ²UxºL]xˆ¯ŸË°<­_™¦Î×ûÎ+çÐK°ÎdøÕÇ º®ú™V•žì¯µŸÊ·õé*.†ðÑòñ¢Õö:ïœhyV»¬kFˆfþ¥ƒñ”3ש˜BBQÒkA=˪zÂ9ÓBzf—(ˆ÷|­mzSä&»„0~ÞÔkvk;L|f§ŠQ5 ª1‡eñTóíÕòå¬_þ H3ª×„b«“CËXK¿d0Ä¡kH‚Bø·³û÷ÌÊヾFjz:ÀT¤ª‡—ƒÎõL{ÉPôÄ{ ÆKõs¶#D5ì÷ó˹M´š`÷£ƨ-£”y#‹‚$Ç»ã¥ñwZ¦iùž_¯¯ZPC‘ó9Ïúd°Xa¦©O¹äì{CD?cX”4Àu}̪“LB5åK”zTöULHbMÃ8ÚWœ?eýK¡àÆ ’À`¹>vÈ endstream endobj 277 0 obj << /Length1 1651 /Length2 9078 /Length3 0 /Length 10151 /Filter /FlateDecode >> stream xÚ´TÚ.ŒSÜÝ‚;—R\Š»Š$@î.Å)îP …w)PœBÑbÅ­h±¢E=çÜsνÿ¿Ö{+k%ùæ›ùöÌì™ÍL¯¥Ë-cíl Vt†Â¹ùx€â9u>~(Àòc23ëAàŽà¿Ì˜Ì`˜Ä*þ/9´Éƒà~êÎP€Š»#€OÀ',Î'"ø@±ÿ8:ÃÄò ˆ5@ â »a2Ë9»xà ¶vðÇcþóÀfÅàáú# ã†A¬@P€:nvz<Ñ äÐu¶‚€áÞÿ%Á&a‡»ˆóòzzzò€œÜxœa¶’ì\OÜ vÃ<ÀÖ€ß4@Nà?+ãÁdèÙAÜþ´ë:ÛÀ=A00àÑà±CÝ#Ü¡Ö`àñp€®²@Ó ýÓYíO.À_½ðñðý-÷Wôo!ô`••³“ ê Úl Ž`€¦¢Ü ÎA­;‚ÝœãA ˆ#ÈòÑáÌAEmè±À¿Ês³‚A\àn â0>Îøûó÷?ÓÇñ²v†:zÿãþÇýòÊ<7ÔQQåü³â¿9YYg/€/·€ €›_ˆ &* üÿ[E ù+ à?¡ÊPg€ØŸÉ>vé? {üuÿlí;࿵4œ‡ `ûgÆ_…€V_|ÿÏ“þGÈÿ߀ÿVù¿Íøÿ&¤èîèøÍöÿÿ¡ANGï¿gÖþ8ÿêÎ[ý_WCðŸ;«¶†¸;ý/« =î ÔÖñï6BÜ!^`k-ÜÊîÏaùÓ®ÿ{É!P°–³ä÷«àæÿ‡{Ü,+‡Ç—Ãíq"ÿ À‹óßG*@­œ­o¿0ƒ¼1ƒÄ/$ðå{\Ek°×3 àå:ÃCåùlœa˜¿oTDÀ«öÛô'ðªÿƒÄ¼š#±GôðZþƒ=­þF‚‚èq3ÿñæ{œ\^ð¿à£‡Ý¿ €ò/ø¨íøäx¡C¡Ç4 ­ùÿ¨íüÏá©8ÿýxì_ð±`ø?jÚpOçÑážÿˆ=fâ†ýÉÿWß­Üa°Ç—çÍx¼”ÿà?ž90Ø l…9?ãlõ4̾6¬ýªZ†Ê“{ë˳)æ-à vnßyX‡û .z*{UNÈ ìB&uèþâ†Û¹ôÝï~K=zdkŠvÛ/¿[ó$‰­6̹qÒþ±7û2u}4ÔÜzÒÛ~w®~ÁÈ-ˆ*̮ZEDWž½J^u}åßF"f¶´·«„U±nË'¹ãôc_—N3Zæ~%g@ƒsÓ<á <ö›>¿˜"Ì{ SIâÄô?ˆ(ñ5^å¿þê³ô^ß­‹‚‰Â˜œùœpd‚ÅWv'M…lÖ·¬d6’þ•´ctÍé5Ÿã›Ï–†Îl÷ÔŒ…yLœ‚œ™XùUìJëód§Rúd4ÁÜãE•/åS‘K7.Ídȃ¦£H–ØV÷M~Ï:I­G¤ŽIj´G(’1¿Ž7ªxËvà6Žlùå€ÕÒðqC³®…MKGкmN­gðî’ýТנòô‰ŠÏd”Çî‡#ññO«lçþÎíQ7k' 3ÄT憆g;Õ­©ùòXœT¯HëriÜ/ÄZ¨P)ãSs² Z´°ÌMk·ö±Ø³«vÚú<1¯¢úö6ˆËõËdª>ˆæ¼ÁxŽžÝ„¹6êNª4¾&.¿L¹¦ÏQtføáÓÙèdz#Óbn O¹­®,¶†ãk"ã<ÍDµ£©Âx!*3±úâ{ñRÕVT¿Š˜!a¾=Ñ€…È ò®м_®íHd’ö@³t¯ý´Zí¾{V£žÝÃÀÝðèvöÐS oã!­sx3ÊF©äCÍÜ¢ËwZ¾`]ƒjDÿ„ñ·]Ëå 3k ]ï¬o` „ÚW~ÏÑü´›’p[¡þä´Á#ÌëPj*1¥» Ø€±Ã³iv Ý rœpëÎ $•„25ZWŽWçÌTឬ|nÁgfòűyø9¼ž  Y›šÉCM§‡œ8AA*^ËJ‡VÊÌ dÕoŸ¶:NNwk‚+4íÆTd2³êÚ%ÍJ Å<ò§½9¨ÐY•àÍS•âÖŒGé!ůզ¨¶A:^=ôá·Öô:Xˆ¯³£²8N Ђ;7Ŷ Èt+ûä­‰æz(“-™ªo N"ÊÍài‚þvBà¤åçQ°Þç”K¸4›Ð…YWK(ÖÆ‹êè"²1Ã"44÷Ƚ@ÚzyO ¶¸ÛØšèUšŒ?z­`t”Ñ›VùÌ.JÏò4½»&Á:ŒFãNH‘W«2‡Í?ßÚýàjRZÅK û^‚¿c;Z¥ÅœòÊ ðÞz¯3­Ë«`ZæÎj¿/c¸u¬°èö…õ[‡xÞ•sœµETQ‘Œú–eXl7ôMRän%Ù”±¡$ºßÑ–eh \–þo'ÍRÈšh‚CSC(§F_Ïî†bÉÑ£S¬Êœñzšb„ÉE.;«ŸŸs„­Y=ãkû‚Ö/ƒWÉš.…Ãp+9‹Ö¯ëÀìøÞÚ JQ¡÷/dØúXw“£øT²°Ø±)«ˆ^O=†J)¸Äǯ\ Šb^V]ï±²6œ§ùè¯ú¢°Š³ÁzFÒÌjÙà•p?!PÁ¸Î5xGLDÁþr hÒÕ}˜Ê‚¼¥‚ˆÊ Ýsl÷‡¥{­B;¤éº~!Ék=H¶€™ˆ•Ï¿˜5Cç»@X/Ê%I® ‹W+=¥º]zÖêFSzîÖà ¹¤4ߺèÍùíS½Ö°Zß’[kìä ®”IéSSιƤ޹ox>-çP_”] Î~e§êI,5Ë×à…]*ºê—”ý7Ç‹øÔd«+ÆU6kŽ»Îî{Nši\ÈÈ€$£b„/Fá*„Iª"Æjò  âÔŸ6ÛÊ|eÔRÓöðÖ!Qq^¶Xå<¥Âüt4„áá˜ŠÈ ‰PÎÂÚw° ÀUŽWÞœ}ðçgQõUmb[>=ÊéQÞö7ÂÀJF.2Ñi‚hún¦–Om“iã¸ÕÄ¿Ç^ò’¼_¨q!Í¥=Áßçóºx}:¸i‘„fЕz¢ €”,Õh…OŽ;sEŒ-÷-} SD¤–Ûb`ž ¥êƒºÇ úÍ©_]8‹[oììJa#ú^[F¨õX¤IŠ'ÁfX0”-Ìz>>ÝyÚ™î²Ô<üàµ3?î†ÄR[9RT õN7m¤—z¢r§fÇÏ&LÖòz{Æ3ø×Ø“=ö½M«!)?Mžï bž–ºH­n}²è>‰k3Yƒõô Yü¶ÇHofn‰…ËðW¿Z¢[Á2èZN¿%RòáÊ0¬@ŠFNøÛáIÁª4Ýšrܤ2ïÖž‰‘Ù =;44óaCõ ®ï}XÈS¤­î^€‹’áûkäÿœQŽ—{œÝY‘UB×IœH>„´ŒÄ`êØ¨HÜÙו4¯ GÄ?褑Àxû &"ì÷ÑÓÚ¬'ì ¶Åèæ°’øPÍ T¢}3À)Ç]í-màMÏ4´Â ÆÙâK™Ê÷N­£âÅnA3hݨ*ý9_ÚÒs’‹Ïa¦èOIÇ(…­EµßÄv{FéÔ`ü:'ù‰¢µA?€.ZõxŽý%ë‹¢‹þøŸÆ!1ùDq4ÑQ3~Û„b,è9}¸Ë60¼µÆ íöh7@M(Z›pë×$©ƒšÜ$%$HSÇ\Jv+¹¥Ô;†UâƒpSe¯õ¹ŠËÞð{ðkR…Jw‘zWœƒ¶+{'G̈˜,|úÅc 1XrØ>ecß½W”¾Vˆ‰²Î ¥ìZ_?óVsøi€ÿ·2¼f‚+kɰ˜AÊ'ø#i×8t¶­ÑQõo=Jîbò9 ê´™}žõ2•é# ºK4‘¨ë(¥_ ×/ŽDz8-oÖ‘1Ÿ_÷´å×M›¾¦%çv»hο80ípwNLIJ߄µû\£$2›ŒZ¢œvÛÔ¶éæmMºÀˆùEG±r”¦×]÷ãOQ7“% ?W²OŒ¼dpHÍ™Wg•yUúMGRŽºuEÝÌÿÆ4ÂZMÖ½™Í3c°ðUI…ïhú£nÐxGΫ߹³¢¤*­!»OœqiSÕ»¹tÊ¿\ýædV(2ÁL]Dä31*X"òêPôsÓaXPMä`‘CÀWñûŽ\yO†Š§ö'Õ2(70¾Xèê¼l|‚[Ã3驱Jv'W“ä°åMT°ìþœq—MwLC¤à·Â«LF‹eût'¨nCé;—üKQ€#%.T×ó9ÔÅ_¾xˆ~³ÿÓû|dó&4¨,GF@Já"žG?_qu+8ÕjLßO󴌳EŸ†©6ñl>2:±’ šxWÿ]Èb$µ˜kuwúØ öTHŠRlxîOR;GcVÉ‚ú~å2'É6=Âå™oÄ”9Þ`&púù¨$ÛçzwÃŽ©¿l½‘ú eõ*Ž•â0áO$è#Vß+Ì$Òst„F=¸=+9¶Ôñ梮ÏÒøB ŠÞbC"¥6‹BTdm (r÷itÞ"¡C|7Ÿ3Ö Úa±…#PÙö´cŠ~䞉ŸÝ ï%–¾bó?È&¿Þ&ÕËAÓÃROÏ ÓúPbqä2Uháë{Ïšå…}D™•Œù™Lâ‡|6YL#k¾{dÅQù9MÁ’[nϳ#70^õÈú ÙEà>•/åï8âf«;ß©™d6õƹqXÙžKÏ89Øx”ɉ. …Eààˆé¹K'˜„Žô#—†@D\š*øSC´Õ*êDj߸tá4‘ZKg×1í~°“Z0q w‘b<ð*Nr¡xnK9ûÔf7->Q^w×}ŽÇz€XwOÖg`XNKo$< Î2j;ã ôw»òÍÍ:dûæ/Æ}ØìÚt›ÏˆêE»tGÞþIö½Úm X Ç;êå2¹S„ö`–•.'õhf*”‚‘Nô¬—(2Ýã#§".rï ŠÕJ KTd[€ççÙ:×ÅNÂOCã?`xh­³)UÝnli‘3ãÕÚ˜2'hƒZ¶6ÈmÚeÐ× %‡fòÃ×èü¥£ÌÇšj7Pß³|/cGe¼þ2T;󋳌i(‘bžùN6×ÇåÈ‚ÚTnwÀÔŠs'(x"¶5¬•#tøº¡rK ØÒqY8ûrtð͹ŸîÛYü™S«æ;®=“ö3´âùPØk,~áã|Ó—gœ<»pó†I.Ö ·Ÿ´ØÎÆKó`Sk‚†á.³LXÔú¾4ܱe!²ÑTg€üØJ×…‚Ì"L…戟ëF´ujáòÚ]J䩞V¦µ=Þ3¿Iu›&n‹XªÕ*ìwO…·Õoüúò{lNƒ._ÜËMjOÙœÛçЦƒm)3ð(îV5[€=³VeDóà$fƒ’¡cªZð„RfnäfÃñõÛ ”¥¤w,Ý1vîç,´2ˆLø±!qÓÌ7ñbV/µ°”Ø–±ûÖ˯ïÎ"ÖP‡ºº‰S'ñ|ÂQ¨cóÓ9R6ƒ¨š‰šCË ÖŸÇd&Ÿ/P4Äñ)-ä_>÷ŠY×¾«W;:Y1„è–ÈÝ㢋VÑ-WW[à*Ž‚,&æ¶B3Õ™òõ‘«AŽl•òÖlÕáÙæ\Õc´¸µ`˜cô;$å8ðËdKn±P‡šÕ.íPèøL<³!ˆÞMc¿²µ—YJaõŠ´”Õ²–¨Ú(1›Œçš¢Çë)ôøºå4‡¥BŸTÃ!QYë[‹4ø é™úˆ˜¿É7µ~NPë}†uEa …ód“#¼Â/SÆ!òT4Ÿ¾ÓÙ‘“ÄûÑ«~—š|Å#ĦºvC2%ɉÊ)ØæýUºŒd57~\öë“tÍí¯Ï1ÞÓp[ÜĦF¿N:M¢/)åö{w®c ưf"°»¬ð¬Sæ·~ˆ;dcæ±à¹8Åw¥`ZŸ Fåí\Ô'@ù¶ìxPŸ‰o`ÜÕ FèµÓ&ñ²f5Òý|¹ç'OMw+\/«˜Ü̃âén±÷Ï?¹ŠVó½#8)úrz:ø5ûgQ(O°nç ™4 ^GLÒËÞ Ó®\KÕBú"å—yPÏ`²MB»c´m SA>»Þ}G&~R}FC°5} ò¬x!i‡x}$×° ™TÔ—6ÉIN®éi“6üžj#פ2Æx¥œÀ¾?«Þï²¶ Ýà¶œ‰1xlî™óæÖ|ìg+æÀ”@‚»…Úkcþ¤Ý@.dVbÝcÚ%i‹{#“ãŒ'­rJw…”)m^}š,á“€Ý(°à܃²¿^ˆú$ä˜9Œ/éb3jqÏŽ»ŸgXMò4óyA숕?ø]U™Ü§ÕP꾡×d±ŸßŒh]Ñâéa/{¤"—ÁcçFBËÕür@%¤ÊßI×̆>áå]7}¤!Såy*¥Gý4lZhÝ’ LÓŠ] 4Œ‡dF2 !73êÜa¦2ðJJ½±õÙ˜Ü;ú†…¾˜–Ì‹ãß6®8cˆYÔÑ3³Æw)G”Oć)Ží¢PpØÚaÁmÊ?ˆò6‡ÿíJ—n³òè’MO«‘w)Þ[£±òC à—/š†® ¤زX‚2 F‚pñ¼o^„a¹]þ_è^(a„¯«G/f³Wî}°ÝÖeŒ=ìPdbof^ìIPÂr4Å)³q»„¶:h¯\?û/µ¦ØzspWE¦ƒéÂm¼i¿2ƒ×K.š{”U&1D·ªnÈ[­þ|›¥ñÇúû¡xä€ÞI‰ó‘ËËG?ý7Ù¼z/sÂø'>ä¨)fO«ÒúüæÏñèë:4tÇF,VÛŽøyè » 77Üzƒ7ØÏ™Â^F2NÎE’ö)€_“ûH’LfÚßÎ6ôB9µ4Fíç©B¦fÛñŠÜËMÁ¾°´­ö„ÌP{üÍ̈·¯vuŽþìܰù|ó–ð-i>½MØgÿÃ{”ÔNŒX ÜA9œ)v÷ò¢JϾ‹ó‰h'‘ƒNä¹À_ë;õ{-vŽIÚÅ CÂl­¼Œ:êôóÏé2Ù²Ì³Š $âR†Ô”¥ª"¹W¶ƒYô œ3=bq¥-¨ÍB¡?¤Ìc—0/€dzãÇœTã’iPV°mƒ—Zѱ·k8k@ÂÉŠ‡Eósl,‘ÀmÕ‰ò/«Žd+‚áЗ¿(Ý \ðç^—ü¢Z ðQ-VÖƒÄAàmXÎüê,•À[Õ©oóé›,‘O:qñ¡–“ÅØ[¥ಠqš:üÀ<¹/çh"ïJÑ` ß…©u$y{¿úûMÄç+&HG»ñ> "]Þ}![Žm¥“ú3a™ÎƒuUÌ(sʦ«0&b¦›SL††šgM0ßÑ„‡3´ï~—ŽQüeððÔó ¸õÌGVF.s4cé¤óâ&EYšg£ž ã Kv¯tH2׎³jö‰_爬¬§y†W|ÅøÊYôþËÕÐa(Ë Ÿß:tÞW¸¥6T1 ä꙲bhù™ÛóøuŽ$³Ìô„#c_•s<2©n÷W/N¢½[”:°Œ÷„!;)ê4w?_‰ØáÚ6êw“„Kϳ>{*‰)"važšˆ•Éï6*‘A⣯C(fêoöªåÓ³ƒ¦Êg ÷þ4#Q\È;i¦|Ñy”Nu¨/Ç´% ›ÃƒÜÅ,¯KëÁ7: =X›{6œarjö’e¶1Ϥ4n¼f tÏ$Fê¨qÛÏÀŒIR/€`ʼ5-Åš~‰<ä@<í« ƒŽVà´·/âƒ&sÉBr¾‚¼™<™Ž‚?¢ôõë+¤WïL¬³ Öd‘zg¾Ý¶mA8†TÍÝǬ¤ðO\¸]ÕXô…Kn3%_þúN#ÒàÀ×;—j.Gp›”'v=Ðé.¬‘vKÓyÛßu —ÐúåvðJ‚þó a´ÒØþ[uvT¾Z~ãÕiZ9Ù?!޽5:(š…'UªÒÓð°hÂo?.\–q>¸—ÈO)”*=ÀçÃ4øÕµäsg/x¯ƒ“) «Ûñn“O:PtgL§âh4Á”D~l´÷4ç:sF׫_/Ð~_i_¿(áI&UT=•¤¼RGÔÌmØ!Øã71èžtÑnì¥ÅËzmñååaȳﵪü»&zº}“žŒYBBj„ŠhãFÆÏGD”é.q#ûÞâËÑ¿PºP‹|Ë?È•&sXž'>ëžö£­×jÆVMØ"‘î䟴nLéÉéúPØSXÐö¦DGž×Ñç×Kﮊ—aúõ¯/Ò ³¯¶f_ŒÜ,å-l‰ì<éìæêÇŠšdŽå˜M4Û럻tf¢(·Ek­?ÆYx÷ôüŽîÂ5»¡!;ÀÜÚS„³äS¶¼h°=£Ë–¸ ‚”×$C™µ\xqjÕu`ó ¸ÎàñÙþR8¸Úµ»Œ¢.ÛŽ7’‘aêN=o²à=½ÔzÐÓ´§i‡ÑÚÞbÁ™fXPˆp\’GF7ؾ”AÆÎÁÂÄIáÎÇßm!ÙÕMœL7ï|Ò›…+Žx ¯K·ï31VÙÌ7qm«‰àsp5\Ù÷‰ÚŸÑ~Äß©º¼£4ÛŠËD/«ö7l!õ² Óœ{QnÅKJ½°ñ VÓŒÈkOù!1ºfP‘Õ%;|³› ñÞ&ò./ËöîM“"vËJÏx^Hy¹€›Óq¾iÂYÅp‘´qc.ŒeóîÎzUfÚ)º¯n$ã»x¶œÐË닞—¬5î÷2Øš(Í­.ƒQ?÷c¦ ¾Œ;×ù3t æS}TNF’3­2Øl´©½œ¤#Ó¼XŒvîàV0~µÂáÿ8r´êÿ@¹†-°ÏK-+YµõúRŒè endstream endobj 279 0 obj << /Length1 1465 /Length2 7334 /Length3 0 /Length 8322 /Filter /FlateDecode >> stream xÚ¶T›Û6 EŠS¤X°ZÜÝÝ5@€@Hpw·–(î…âR(^¤hq)N¡w§|´çÜ{î½ÿ¿Ö÷­¬•¼ÏÌ3³gö~f¿a Q×b“°BX@dpW6NvA ”Š&'ƒƒ›ƒƒ ÀÀ  u…Aþ6t!Î.P\ð?RΰëƒMìúÀSAÀŠn0 '7ó¥ 'Ÿ ‹ƒCà_D„³ P쵪°pˆ €A áèå µ±u}Xæ_@FK& §€ëŸp „Äj †UÀ®¶‡‡-Á0 Â qõú¯ŒÂ¶®®Ž‚ ‡‡;ØÁ…ál#ÊÄ ô€ºÚ5!.gwˆðwÃ@U°ä¯ÎØ @m[¨Ë_v-„µ«Ø|0À –¸ËC„Ü â |X¨¥  Ts„Àÿ"+ÿE`þ½7@NvΧû;úw"(üO0ØÒáà†{Aá6@k( T“Ufwõte‚áV¿‰`˜ â!ì†ÂÀ„?•ƒ²@ðCƒ·çbé utuawÂ~·úæa—eàVRÜÕð»>i¨3ÄòaÛ½@¬=á÷ùXCáVÖ¿›°rséÀ¡Nné¿)&À?6ˆ+—ƒƒƒO€qB<-mA¿Ók{9Bþ89›:ðóqD8­š€øA­!?°;èêìñóùOÇ#''Ð jé ´€Ø@ဲ?˜!Öá‡Ãw†z8´Ç äøýù÷“Ƀ¼¬p˜×?ô?ç Ò—ÑS2Ðfù«ãû$%ž@6nn /P€‡ÈÇ#ôûï,ê`èßUpüª·Fþ*öa—þU°ûßçÏø÷l0ÿ;—*âA´ ã?7æàå°|øâüVúŸÿ?ÿÎòÓøÿ$ëƒýq3þñÿÜ`(ÌëoƒfÝ\ô¯‚x˜øÿRõ ͬ Ä êæð¿^WðÃHÀm`ÿÞF¨‹,Ôb¥uµ´ýK,Ùu~ ‡¨#\ ¿o 'Çÿø&ËÒþáæpyPääapþ{I¸%Âê÷„qñ¾‚Á^Ž!qñò}8FÑ âùGÃ@;áú|hÏhpü>Q~ Hû·éà‚Àÿ  Èò߈óA} È@n Èæ?àC"Ûÿ€™ìÿœ\@ãø_Õ[º9;?Ìï}=´ö/üç²€@+ï2“@ ìñ¬”R³ËØì×íÿHˆRwù!„â`S]ù)£wÞSF+.5ñ´Ã/Þæ¸õGUø,Nú¸ˆø‘Õ +ƒ Q„ÄðÉ´s„^aͯº?Gçˆ(ïѧËM›T­ê»Ï.£1MþAÇÑ"Þ¥&Ô(‹S°“·Æ½Xw… o}¢åú/¢¯pEÜçØD¿` ôÝø‹7aÄX⥚ ›(>[&|ÝZ'ò˜s4ë=œ¡’Ç.>Kã"V팟ÉXYDÄDç¹fNI/aâ²ùx™¾Óh&J\w À¥ôx#‡#°òD°u+àûL°Ãtá陬·™‚GÎÀ¬u øÍæJ`@Å-ƒprœ^¥l«I¸BÕèiùÕKü±˜šÑDyR5f•qÚGչ±gzVE™¬‹“à&~VcqQ’óµÏ ¿ZáÙ܉ӄòvB‰±®nª¡Z~O¿‡”摚 ·øð'ƒFËÍ”ªÌæ¸%0ÁhùÒB&릯>G’ˆÚç½Ö©õ9-ÈE˜Åõ-ºy{Ð`̶’á¬e f´í¾1§ Äç*R¿•näN?÷u•C{6NñÕՄȾSG<+‹ÏšÛÑXEzgT†ÚèÞ>·¬šÍpÄaGJžSœ\VM ëDû…Iuãþ8GÒàü|½€æ4á“5³™Î˜·Sr­çû8¸oó ¿´¼+ñ(Ö3ÐîZê YÜw¥9ö±ígÁ`f»›ÀÕ·õâ}`ÉÍPˆo›¶G¾ÄgǪæ9Ñx¶¢íÙ4ߦԭ¡ñÎïʼn¾‚N!Rœ£?I v`üô»ÎÒ»ÞñfD˹ãÂ(¹Êv{â ¼l¡wjW/"Âê“qÛdlù<É®›Wh_zyÀ`Â@ +UXl‰Bå~e—¬½Ð“ MJÞéyùò-cß7{Ô+Œ‹mÚî¾À æ¼Þ½ ¥AépíÔ÷Xµó¡r_O´§B’¿Û_¢óÍtO²åýê@ùU¯f.ÉT¢3&e-ÃÏ^‹­ Çá³´Ö'7Y´–¸õ¸žP²ú"z8L’P“̑ζeg»}MÉl9â¬]åô|ÎWG:z)õýT óðsÏÜa縺§C[V•3ÕöÓÕþQþ€6ÙS¾VÍPIÑK}®  ½ݘj`sˆé…­4tû¸®³’A­-Tb´•ÏÙF5µ.¡Ð¦TH¨ÁyTuƒºlÑ¢{†28 Õ\=¨ïýåŸ?8ô%Vàžî9ºqqciÎ<–ãÈvù[E^Þ÷Uè6Þ(|o‚lää+"G¥ƒ^ÏMÜÌ×…±³åÊ ¯a“áFñ·H+.ÍZÌÖÈMz’¨=oÙG ûÒcл.²‚ß{;#±í…ÑDù¦k*ë°%’¿Jt}}‰[œf?Ä~~p³!]ÄÈQBºÈ#®/8ÆmyÜr¿È_3X·iOÛui#;ÓbIDèáÝÊÖtÿÎøJ>óÛ$]R$Íö53Ã?ÝP_i|ÇïÙ¿W"U©Í°X ¥¶v T#7¹%D¹hÜÚ*ä¯P9„™X-v xÂCD@Xñõ¬ì,.FäWþÇó,·ú#"šˆ“IóbŒK™t¯¦žšÓ‚D½,øæ²î^ØýP Cg¢‡n ¶xnÆÖ»ÚØç'†¸ ˜Äõ*ò_¨ê¼_cˆ>™cá‘a*cfROž3Ê·Õ1Ok-"\õy|Ê0ˆ'އièMz1ßA˜€éH\ÐÎteó#eÅãV„¿”’íÞ¢jsÆø›ÇÙ)õSsÕÞ7sU¨åAø,»œù8wOü%zÝC@=£*ÉMÀTRS•V:ÿÐHÔ™Ÿ¦ž²ü¾[P¥OÙÊ ¾lõlØÀÕ¿—JËnRÙÐW^§í-MYÌEÉB‡ú0T :œyó>ϵáúÉ-ðX£Xkzo¯îˆaä@±Zj²{ñXÁO¹#.J˨­âÚV)my+¡„‡Qù3å~âvEL2a6{q9- G6,ÙNw4²y¼¢pÃê9ЩÊÐýM7Åó'îbSâ›°é ~çEUÜj;„=ªDdCs}*õ8Pì˨ð•&‡ŸÑ"_úD.E@åªñÇ:Hñçw'ÜcÚ9«:«\r„¨ƒý ?¨ÕœÎ BÞÍU,˜‡a] ጥÁže¤ò¾4ãRÑ#y®@ïûuæ[Ëð\Ù¾(R†f5•ÿñ!”ÆÎå{c;;j³puVÛ3À,G×i¤¦H·ÂWÞ2£:»\ßK.ÜcAWoô“£Ã¦*¸k$¤°å™Öÿ`ï`ú” bl£žQPžØxäÅ´[Gò¸ùI¤˜Q›M;Ãׄo1´QÇÀyÿ'Ѱ‘oÞÊ„)#‚7.Å–­2èÉ"=^_$Ã{52–•Cß™¥ yiftY¢n~)¨ ¶«¥)YwøOLÔjÓg£|LŽÚ]Ëæy¥Ã¾Üø:î·¸ /ŵ´˜ãªº$!1°Ô¯Á{”«.ü°àF„_¼“,åáZ6]¼æŒàû½ÀðD)©û7u!‚དྷä«_X^ìð&­ŸéæO=CoZá, çÍ1¬Reë½uŒ$ðápXMÑ‹§Ñ¾dîQ‹ãø©™/Ih îêTÍÔ ·_y¿®Ÿk>7ðË\)œkS)»%"sg[Ÿ7­T€޳‘c 5&‹‰Õé>y{/gD›9,%Dß[‚^抶ËX¯1^Hˆçm_Ò~Òa=zÕtšf9$! Ð‚*‰9‘wa’z{aG &FO“Ž ¬¯ì@uòaýµ˜ËÇòª&–þêÙÌOCßÒ‘gÍ5³ñtÞÐÂKˆ†ÉK¡OoW³énï$/^ÌEˆÙùÔtÛ×;Ñ¡»Ãy‚—µ™éßÏJáû s„µdš<¯%KJÔ õ/ï0°Z S•Ol |ìŽâ.Ê8Z¡CÄKÀB‘عÑeÔÓ>È#ý†m®Ã)×­Œu=Ú_*»p§*¶Ý÷å…¥¥JƒÑ”;ö•¥‡¶Ð°·Ý°~dÔ†YŽ˜z?äiã<¦=Úüé0žB§Nܰ1ˆµšˆ×ÌÕ¿÷ºÒ±¥±Ñ±~¡HE‚Ç8S—rMä²O³B~²Ö¢¡|2„f5#ý˜%Vn¬Ž¶ïùí‘fZ=7¢îµ Ò“d¤ÌFà‘¯®m=êãäVºÓ©heÍPQqÀî-ûbýAèõ4–cwzœçòšç{­W¸#v{%ëÏX§ðlë뉟E½ëL /¡(Êø¬+x ¥Op‡íC$TºWÏõ ÞjØã‡= PNþr»)ñ:»Q|ð\ÑýŒx+ÝQ;No6åùñµ–7¨÷;½GO²Ì«²h"ƒU˜RïÎe^j²ÿší+Ú˜ñ5íº”BŒ¦tt„ÎÊÔ_r>^ÿ˜Mæþce ‘'ƒºÍ‘ÖM‰nëÁ;K#´PÈ3?È•¢í Ì[¿ÌÍL" _Ö:?)ã}QB8G *ryeOéÛjÜCm-¸ Z®›M1a9+›öI’øþXå.ë ™^âD-’Ú æ9!¨Òä[p(5†ýrñ Ì9·§ƒ°#9Å.ˆæ11/ûQ¬÷D]æ÷sÞâ=%èšÐÐõö9Õhê³HÜ^pÒL$3Sžñ­D¡Oá‘’Æ\ò¼>þ°Ü·GR3åj°)‹g ªE‚©Dá}t ‹¥¥óˆy‰NBÃ7Ȉ‘—÷Í?˜b‡vxŽxòžz®Y~`¹ùÙúe5O0в!‡äܤXXÝ«õ¨8 2Ù8«‰6Æ“iÍjë?úv}1ªXÍ¡¯·2R—íZâô©†¦ß;©œcªê¨ ¢sDYÂFi aÔp­A  ”­fÊõ¼È—ß.„jc:l›‚ŸP7P“Ñì—KvÈøbØþ;;Œƒû¡F½Ç6£Ž®¿D0‘Œ‰Éñ†&]• %Þ¬?÷P‡•ÍP…² ‹Ÿw£½.K¢Ìu†´Ï©=Š7,wIâZݤðPXU¼‘¤&ï\‘¨üfnH/R1‡‘€¿ƒz.ëŒÝmx³G¢a`9Sá¸ñ¢Â¦>Ò4{ùR®œƒÞoüñ‡l§f ´Y›zíTÛOy”åê+yÊÖÉkå‚ e—t4bõðæìÅŠÜOºçß”Ý&;Ž¿¶­è ÔXPÃ-«E§XKlzz)0âûºS —2¹ ûp~,eîó!Œñèï놹6Έ ½]m² ˲Úñ¦”¶)?L‚¤’¿{WÏy«ÒŒ|ÝžˆŠš‘ùjʺ$}‚¬ü¿öÒêË`梽gm÷Ì#}ÚûbŽ[w–þëýÇžâj¼FïÛf'–±åÊ0œÐü뀞ÔäâÕÓÂÌhFS«ÈÎ ï¶éõ€S¿"—£¾"’‘xi8{q.$5å&$‡ë–Á¦¬ä£=âò:1…º,»¿»£¦ËwF èTŠnܲÓfwð½Æ²ÆEˆÞ<¯yœ6±åÀA%<îÁ“Â謒w‡ÃIƒãÛ¦eP«3ö)´¡9ñ×û Òò›0«,¶‹9b™Ç=ÀKó¯$ƒÇ²sø7Á9²èÞÖüõ4rëqƒôë´ÕK­ígº¥f¨ÒÙýAk›‹9/®)1ƒ’¶¾{Òfàj¬©DšŸ¹kÞ 9Ð…p®x¡nZ H­“@nŠK|$Øi¡m!"³;¥:ò<}ömJP'îôÚâ½J@[3ŸÌè€cŸ]¾ò0Ï~]ص¤^µ¤ˆ`xµì‘ùZÙwØ…Ü^²P¿u¥m۩몽§ê%äób6Edºm³X Ë“> ta7½\©Wå{E¶[›x h¯×…^½‰ô¸³„Zd!dµý{Ó,ëäö/<<í«õ†—_;P]s‹”^F±IµSf~Õj ýeí†(^Ò˜‹…ùÏQ=`̲ï@FÇ3ûÎSäµÎï ·`º©R¸À©Ø¥­¨äyMóⵉóÒèÁoÚ¨1§»­ígÞOlÉ¥KÙ#BÝ:„³Pt§3u"Eæ´…>6¯ÍÅ3KÝ’—KßÌt6r Œ_Æ›!ç¯E¡ñ´ö·-2*By.Õ½è*,qX²v`ÍÊ™ %GÂ÷Úà ´ƒÆÇÁ,"@ Gù$>M½€˜Hh•@'–k(zౄ ÁŠœÃ>IoÞî6Õ˲Ûˆ´:×eÚMZc¶‡h7Úž‘LïmAgàw?%^c_í/¬3Æy`Ÿï€ˆÖ_Ë`«¿r·Û/ ¨LØáç5ú?‚Â, endstream endobj 281 0 obj << /Length1 2700 /Length2 18086 /Length3 0 /Length 19631 /Filter /FlateDecode >> stream xÚŒ·eT•]×JI·tnº»A:¤»Cr›NéîNi¤¥CºîîîFâlßxôýÎùqc×ì9×5׺¥"SVc5™¥@vÎLl̬üq5yuu6V++3++;"•º•³ ð‘Jèèd²ãÿËFÜhì –I;ƒM@vY€›Ÿ‡Ÿ•ÀÎÊÊ÷_C#?@ÂØÕÊ  À Ù©ÄAöŽV–ÎàLÿý@kJ`ãããaü—;@ÔèhejlP0v¶Ú‚3šÛÔ@¦V@gÿ AûÎÒÙÙžŸ…ÅÍÍÙØÖ‰äh!DÇp³r¶¨€Ž®@3ÀﶊƶÀšcF¤¨[Z9ý[¥2wv3vÀ+S ØÉÅÎ èç¨ÉÈ”ìvÿ6–ÿ·#à?ã°1³ýî?Þ¿YÙýËÙØÔdkolçaeg0·²”¤ä™ÝÆvf¿ mœ@`cWc+c°Á¿Š7H‰ªŒÁ=þ§C'SG+{g'f'+›ß]²ü´¤™8ÈÖhçì„ø»> +G )xò,ÿ±µÈÍÎë6·²33ÿÝŠ™‹=‹†•ƒ PFâ?V`â™ÐÀÅÊÊÊ >X ènjÉò;‰º‡=ð_J¶ßbpÞ^ö {€9¸ ·•9ü ÑËÉØpvtz{ý­ø_„ÈÆ0³2u˜-¬ìÿD‹æÿÆ`8Z¹ôXÁ$d°þþùç/0ÏÌ@v6ÌÿuÐ,ÊêJâR ÿ4ýZL äðbbg0±sp¸ÙxÜ|Üïÿ ¤llõŸBþr•±3øþ]/xPÿ­Ùõ?D ýÏžÐþ7–"L` €ößõY¹XMÁÿ°ýÿfý¿\þ¿Èþ;Êÿ¾ÿßš¤\llþeAû_“ÿ—…±­•ÇlÀvq¯ƒ¼vÿ×T øï-VšY¹Øþ_­Œ³1x-Dí,ÀÔfâcæäþ·ØÊIÊÊh¦låljù/šü[¬ñ{íl¬ì€Ê '«ßW €‰•õÿèÀ»fj ¾NœÀìü— ^¥ÿÍ*ig 2û½sì\ÜcGGcDV0©Ø¹¸^làå4ºÿ‹Ïf;3ØîÐ`rDü}´Ü\Ñߢ#n‹ØÄ`ÿƒxÁdûƒø,’ÿ V‹ÔÄ`yÿ±X¤ÿ ‹ÌÎ.÷³ËÿAàì 8»âήôâgWþƒÀÙUþ pvÕ?œ]íâ°¨ÿAàZ4þ p-šÿ >pÝ?\™ñ?ˆ\™±­=x7~ßsÿ•²±ƒ;™ZÏÖÆ øœ“ý·L1+'ë?Á!LþrWiâhl ´š;ÿ%æúøß»õ3Û¿ÅÖ@çÿ±çãøGþÀÃ3ýqs›‚lÀüû§DÎß[Û?-þ&&ËŸÞ8À­™llŒÿ²Wñ§K0Y€ÿ“”û·ÞÁ¼è\À£0ÿã.×ÜÊõ¯¿Õ —¿s€M,þDë-~¿¾À¿MÀµ[þé<1K{K Ý_`™Õ_\éÇ¿ øh­ÿ‚àáü©˜<›ßËøG¥í¾~Yþ¤âDz/ñŸ¹S۹ؚü¾F-þ* ü4°€þ Ž úË‹ ܨý58‡=ø ·ûŸÃædûôš\˜™à·ú/Sîɬ@”œÇ€S%i~Øé¡v Ö¡©H² 4²ºH Çwo+Ú0ff{ÅP¸|§CÞ#:ל›ê”ðð·v°?Z¶É‰´Cv2FäÐì]1Ý-ÈC'øPP :ò¨à|¸t'IHÍžŒ²·ÜÈD+Ø» MÓñÏ"§}D0wó?*´”>ñÌæ)9òãž’¦=û‚9Ùa59bD±óE1òNH® e¨ø¼VĘÅt°hsã1þí«MüŽwüÃ:|§™¤çuTÄA?uYͲ=Œ #ÒGh%‰®)#9c½|¢“O ã´Ãûr³X>’Rêz¼­lÍÆîI[4 ù3ü¦½“®ºç]廕!µc l ñ%ÚžÇu¾$®c¢ø/ß)ÐE Æç!÷ð§óH/¦dé€d¨èØVûaõ›=êlG'gÈ}SÒÞͺ]¯¥¢#´­0B•H¦©åˆ »“0fK4Ô¦ózXúf+ÏáèÚ©¼F?ÇXµ KYg0n£ÓÜÖŽ˜)p>ÑÄŸ,AJUAŸåŽá”ã Ö3ã½Û|‹âq¨þ‰ì[¹»~ji[ }!Y= ÑRاºt>ô.TÔ!e~D‚ñÞp·Qìp7ÖÛk1Yqb7ÄaS­ÉRqx»ñY|a%"?®5õ̳­]™ÜšÅ)17o¾Hýˆ›ÃXJ¶µíËão4¯3•Q*e A‚Éè¦7,SÓƒÌøTxjÌfÓ6Nò”ií휨¬/gd_Ö»¬‡QÈô"eÖ«}ò–Öó© ȶTôF\¬=(l2ªVe =‰Ù*¶)]Íÿl·áãIqÉë•b[s+Q¦pÃKi|QX”Eš£ K.¤¾y›íˆe$ª£Þè”ÙÊœÝÚHØÛ«šÚ:uÖè >Fú“`RBYecû3?ÁÔÅ|¾—µûþº4¥åïéÅîøé™”Lù‹œtðÃ:wGÌž¢ô3XP¹P¾qýó®¦Úû±ʘš1cÌ$®êz»g¥Ñë2Êyk´ùÑʤ‹Ï_7W,e¥8kê4a¼‘RUn0²Åù?Ïýr'™ yùU¿ãÉ û|ǧ –çðSèÝìúè°§xÊóƒÁ-'W–;¯ÍIUwÙê­ï/˜jV'ä«îÓO6öíDa xŠK)>]žÉm®¨/æ¥HéY†k–Óᥞôôhôý÷>4ÄѲaR™=J¤TŠ“»Š¨`Þdx Ý.§Ñü!cñïÂ]P×éb¨xˆ—Kï¸%¯‘³àæ–ªë˜B´¢›Å«›F™Äø…’|ñd.ËΓ‘ù0QÓnøý«s=gõû6v'ÒÖ§Í@ùq´r¾ÄÃ#Næ“âŠÓ}ÓÑ.J¾‰/ªñ®ñ+’m]fðƒÊ˜þ­8_ò-§¸ßÿð1ÞduýhŒ_/ôðÕ÷ Ç^”=‚Š@ß.]%DŠfO‹3Žë»²) 6Þ5Ä’G‚LùðÑ]ìæ¥*/~ˆŠâË0œÁ`ÄŽ‹¥^Bž€³JVâùÿʧEñpÚ)Û‚©‡ˆîŒjVÏKÿ³‚ Û”ˆ‰.=1«ê'Dõ暦ïü؆…ÂûÑnŸ¤ÛI$2y¢š®²©êÎfúÅlv™S»f9ÛaF©ßž¿¶¹¶°wμC¬'Z¢0~Ò2>ŸµV k;hD‘RÄõ6Lý”tX0ò)-Cò©Y]yøû,}úø±áîzžx«=ö7“‚1ã¼~JšZW÷gÕ”*F¬7¼†èÛv"Õ¬¾a3O.v’Èd!—5öëî]2\äLE&‹]‚ôöË&1órЋž J&ú¶o9Qª—åYXśզ0RNV}¶ ͨdJ†>uø£®#4æÛw·vâÖƒðÊÀ{ö²Aó¸avC{ò­7þ™¦2oO®†_#ü²Ë¼Ð_Hý°)ø*;µyV³´®tYÄ^oIöЀAý‰!ÒýÁ_òjx¬«"±»V¶8ï†Ï¿<œµ`f±¾×ñBÅ`W»ÞsÂ33r^i/´>{´=3+æJˆþÒ¶š3£Yû|ܲë–xÜgòAWY ‹×k–ëÞÙZ[²ÙÄjc= ú´p~f ¡ÞSåúbÛØAÓç±{^èFv¼ÛcTfî—þ쟡IÞwÑm¶àH/ ¹—ìi ur2×Òå¢Ô3²â{&¶aÆFZ{3é…û6Kz¦#Yõél˜.úØgœ)ëÑÖ×6°eû•!AÚs´¬ z †ÑrpØ]Òç5RÏòƒ¡¾IYAGJ³TÒõ aÜöÐg†,Ü{2”EÇ’í2åt“Uö›£¬²®¦,NÒì…܈™= ¶¼weÊvh ù›“ó*Ú¦ ÎH©9ÐÂñ„ì<<ˆZñPi¬;?öŠQî/Ãͦ% ËÒÅ8Ó¦~rûëöX  u,!’®ÆwJrúÞ#I4àkÝ;™Ì1s­¾' ø®3uÀM§Á´}7ÞÎ’Ò¨Û¡HŸ¯t,k£þöFðMçËÛ0jfÓ¡“Ûbgâæ$äÞš@ã`¹U†8þR©Ããe¢Èm¾þ"ÊQïô#M2è`¸ë׊B&’2“5» ³=  Iä8’uÑ»7¯.2B°M?£È›$ÍVC ˆlèáM&¿üˆ¹ªF:$[®JOÍóž–ø^&MšxD‰•¼Å$ðÕÛy€emÙã4ÚIÚ•AÙ>—Ö^Ç+ÐtÁËx•~׬•çb£–€‚ õÊVÔ¾-êIᾇ•¿3`ò~pE2ýÎøÉù>Z¿/Qxâ21/©cÝö‡+Õt÷Dsͪ#Òé Ž i›1ñ‹âX毃}¯õ©Ž–'Â4¸I:"Ì|IFdæŽOö™Œœ[Âêå!µÃCœG¯„CQóÐ^+Ä7•ŽrÝAËÜd÷çÄÑŒ3¡D=Ô9¹7I¶(ªéþ™ŸÇ©<ðÜbxê•#1›Ó 3ðå[<'ë ó¿8Ç/9?¦w¹·Éì %ñ&úùÅ#©á^º¥Ãð´ºlW ÿöÏ¡–ÙZÞ–YËñ:¦šbX2=G<È‚æMx‘’ræŠr‚Š@eæ¾Ñ³-eó¢•úñµ÷žm“‹Õ5O:ñ{PÀ9Ê¡Q,®Ìæøì–@pà=ÿ±>°`þ¥ëCÇe¢¼å½¶vã›lO¯àö¯£üâ 5˜Ï#?GO¢4-^/„ZªPôauû[‘\Бn8 Cµ²5fŽuo~ÙÁªQd+úÐcxë5]دŽ÷Þ‹Zâêç‹€YÂò±{•”«!…tšJ0ðp,Ç.à!¼Z¼Žðå®]œO”›ëÝ[ñW¢œJ&§Ú%MQ¾H*'L}Ö½„ œñÌ·A5ko6ÎK½(aÔl[÷>Uò˜Vã÷uÜ1-Y/–~½Â ez; CÉñ “ÿãVªñ3ŒÎÇø“ü€˜Iަ‹¿Ô¼ùle K8ºÙ¨ïê ÆÛ.‹vqŽ~ñ¾ÎV¼4ìYoRÍ%é™oÁw +Û€°#‚h+„£+Wù WÔ –{«Å±ýªF,ŽÏkme3Ü:§ ; @¢7½m!$e Dë–z…£Ø=ìÜ+M«I?åg/ tL¢˜¯Ë˜ôÙÍ6.¦6‹ÝÒÖé8a]♞ðõT _x°Ýg³¯jöôZâ¯~eoaÙff—‡ðd|ݦ˜Öc˜µŽ ýò[Ï“€9”Ç/a±B¦(d¨®“?Þ©¿äàN×Ù¼ü/Ùîd¥oP¸V Ÿìd:5{ çic9&VjUµŒì´vð]žÑÄ#\n ȶHßÑ®—J~5Gž[¨²\KÖÆ ¹¬ïø¨Æ¤4‰@6«_œ€xæl¯Z— ¢g@¸´ kÐþËÔžùs„»è[9^úôÚ|W¡Ê }Øn‡¢sÄú™ó£Ø¶U¯ô³ä¹G]š,bo€-B„\Æžôrµ¼”Bðø#¼]ªW0êò 7hÖ•÷H ÚÝ=Ý+ú aÝrœ®º E Šé›‰€4})¾n]ÑwcæXäO$Þe毛œÏ>/¼i3SÄ]½Ý «²õ Ðå`þWƒ,ë&3Eœ/Lm?½,Ee«†ó¤Ï©ôø˜„l.d‰]§¤ë¿|+]cÁ‡Ø…QКÑc…û”mŒùÜð •—Ýš&⢱/+^+$×gAGÅLQˆ«‹-c•ïÕ$iá#|˜³Oq0+ñìj¤ÿ§¢QêW;\ާMÆÊæv®†Åæ\Y˜Éy²¦Ò£ÄµC»o“ç’;³÷Ø5¢mG„RÔ@‰Ø‹¦”ÄÕe§øeø*iã¶KE©  `-ê@ˆ#W*8ä 1›ç굚pãÆeL â•ð'¹œß_]yFy÷Áâ¾g˜8àÛ–5„¹óx–—ð|I¾$rc<ÄYƈQ/ ŒðDÒ4r&ÉD†bd2·\¥#"Äý? €‡u|‡bw¸ŒŒ9nü@wã j"*6MW­ääð‡¤iã쪀 Ûû¥3­! ¯} 7ž²ô^ϱ÷ ©êŸèǘ‘8g5WwÃÑ4lÔ“ÅÉܦcA8xÒ5;ߺ¦àâF Å5Ã!n&7,#&wÃ^e„n3ª’©¾^ÔÜ&b%±ž€&†“²H½¬¢ †j6ߦF(J¾7xï[Á¦l@úx9;‚òÑ–êÒ¡ @³Àhf,O„U…A¤tàݲPQ-Éð½ ©me¦8Ì£“&·@ÅÍN•¢«û}”ƒ+…c)&q"-ôºÝ㛞½˜ó¾RFŒÓþ+—‚õVûÞ¬}˜8dp[ÛÍìË(žÍŒj¹#ñ«ž)ëI‰Šìóü .þŒÇ(üÆ&m”à¤%7 Õ'•¾¶ï¯…>vÏ?â0Øa]Ùª¯48GTO¸ÊÒ"lHý8Œái¾ì9öü”¸ùòÈ„cNãÄdõ tå«ìk÷‘ùX?E­K8jï"4CŠ^p§u`ŠöØõ‹œ<_BüpI^š=’í[æ–×7ƒÖ÷Ȇ— 1Ìü£¥~dψp—æðX\\ˆ¢žC…OhB3+(WjÛˆ¼ áPg µ* œ£ø&Õ^P±ej³Œ¢ˆNýãšÈ¿JÄïÊ/Ç¡¡–$vù5‰+Ÿìm¹+“>j<žœ†6UµF}Žã<òHZä· ŒñqlÝD.×üΪü`€\ OO"-Ý4Õ‘IEÕjËš€» XXÖ4ä~/u…RüÎ¥%±V7j¼VÃ|u¼ÜP^+ã3ýsË7(\Õt)¸•Ò,¶µ™N(þ'c]ö\‘…§äo]Ód…TÔ¼Ûò¹ÙtØûMôô÷U'4.¶,ÕEÃôe?Átc"{¾ÆFŸ´ÀÃÕ^©ÉªùúD:Î{BcJeÑú·«MÐôQæ“Ñò dI >ôS°±:+½k{êoå3#uâ‘ÿ¤xSà{^²ìS]"÷f™ëŠ»æ6Ÿ óXY£FK†²6¡ý広 "ññ“ê;w¬Ž˜µþ¿¤œ-HÀûçá¤Ì¦ |l1øl²˜ë7jïièiz!÷›Û3§°´Ãw‡°2Ή¥Orö§)ŒÝËàìä@Á% &˜§ æò$‹ñ©6eM“^ržy@::?âñUxϯiƒòã24ºüŽbNìBн;§]w¶­r6`0—û4üzÖC)ï”ÆÔM° "â]ÁÛ‡ÖÉ¿b%Ç‹*96eÁÑe—ûuFBÀœï˜€ìHcI[²ó`L…ø`¬í)B*¥ƒ/B¶•Ú‡f­¨»êŸy{}SÒñ`êùª5¢¥ô “ópð]Ùáö—QRíT5 ¬cšÖCPh?“ ]‘!Ö)snMË8ýžÍŸÐ›\ùb‘Sª#·‚¹¢œßÉLѵ|ÜOsûöò+I:©ñ¸)Ò8+ÿÂŽ,yëƒBŒQ÷ë !& b-Uo¸¡Sª{‰—h£ì‚Ò¶eU»Rûo<Âjv—Ÿ‰‚©_:b»XgëIÍÓ&*´nÐíi’"¾¦úÚöò±5ð‰,Ñ Lò¢i'ïœý´@Kú6«|mH§°æ†ïòEJ:' ƒÖA®Q\?óoðÍ&: Ø-QSÐ8#» —ñ+j-í=6“o\™*³c P{âì›ØÃí 3§nºêC“•$ªb”wF—ÈwŒã½å§Úc~XSÈØ,è™uªÜ@UR”—-„^;¾]`JL¡… :D;<$ÒK}BY¢Šu»8¤„Lx£þ޽?[dü–ÏÍ(W)p>ai±õ£¬üÁ=jº:Â@àÛûëÎVjm—aúÆÀP…­ŒtÅ L¥ÏMsÔ_‰f+ëkˆ»ò¡J(Ù¤‰p ©ŽW't#Õ{ð£Èº]â¡È*$"=–bÔæk*Šp4ѬÈá¼~bðQ%aèxi›K^9ÅÊËòⱯtP‰ ¯‹Ù35&ÓL<)jO—BÉ]”¤Zؤ4‰¾—iÊœ•ð)“ü.ÿj–aTíñlÚ_ÊD·»\²g˜â\Åàe$Žßd kzŒ¨ÝܺD÷8õdK,~ªð‚®<NfˆÇGÏ9½*ùÈ4á™,«nç— s#ò2_DÃÇ×ézFÂŽèí‡8C—¦ù{”ÿS4_¸µˆJFM‘;x²UF›ãŽ-E‰¤£ï¯ ¿ÃH?i&`Jæ°A*ii)ˆÓe+þ¢í;á^RK*b¼íÝk\A¥f§…qaYµ·œ¹€G¢šA7k‡hd•¥¼{<@ƒµÊÁþ|ûâ¤bµÖ_@|ÿŒTá¦ÓÀè¨Êòì7 ÖCùóÀXÈ6UJY„+)R"‰K-îì\Á^¤ˆgÖ¶Ôß:•w;ýtð=Wð‚ô;®¦Iõà–§Ånå\¨=yœÀ>Áv [E#wMuc†zzá Âîb9Þ_âR6ÅŠ”UÛ˜,ÌJÉ2õ¶)Ý8} ÞËTÖ*5gÛß˧9t¨›'èŠe%YM.V!{±›4fJ×ûî-Ödd ãæÃISoüå¦ukqÃíW>Þ;rì-Òä\I„âÕ=p w$UÝŠøIRîÄòÅ•äþÄ{€Yˆ‰)‘“ “é«BÛÝP¹kÿº\Ì€`þY@^¯u›^:J‡1@¼mèÎë®B@éöö‡²l•›h•¨JÂ‹Þæcà¯n¡3î\«Âáb§è`„ŒÅp'ÔKó;¤3Ü».m÷ïvÄPä‚ uñXÉö—bŒÇiˆÕv Ç‚ #2)OT8e|ƒ°YYˆ×•U-ÁýŒ¤}bhFOêêÕ@L¥ „ñ€øFЊGiDà ÃvÆÔÌ?K¿%\EÁ´5…o:øj. ÅêŒ"n¤Xç/Ãä5<Ÿ1äT¿ÖZ6m¹úâààÄÜa~ÜÝ~þE{CW•_|*a§u-‡ÅŒ^ŽÒvy}êÀ†šû M:jZ”ÏZסD¢{fÓ k¦[Fk8϶š|Ÿåäæ[^BçJ`̃-ŒêñV*i¢@«<šwĨ5Á#ÐÉæU¶~=ÙŽ&ŠÍmxs”F+utèÅœG+Ï”.IMÀ™òŠŽ{„nbPö Àúcvè–ägÞ¡(™gæÀA¬Rðá©tedz,fØ^r±}C|Êë×_ ŒFk˜.ý[Ð0Z߯¸{mªÇ¦|œIËËL¢‹¥,7oAñ¸‘HÑø@®ØÙ+¦l >z2 W)¤6ÝSûxHVV_ÉÉ凜¾»/iDT[àw^¾“ Vú‹wx L:M:k@F¦àžJA07ÄL¤}ûµï¹q+ª)‘¶«Fƒ cSyG=†<!˃½'±¾lbº­»Lšìâ2Ð䆪ª_± ‰ìצW5þXåqÏcЭi3Wû¬š$¼¹´Ï¾ƒ¬O2õÆúÃzF%\BrCï;¸‘y£q‚ho‰>vsÞÎÏjÆ'7*Úõø¨â(ø­Ê$Ò‘Ïc<ÕV+:ùù(» ùýx©]¿œÐÛÞŸôT×.qaøjr†`ÚZQàm°Mñ!\y†L.%=@Fiµþ\JÐ"?|çÚáÉu¦¨Á‘dWb€ÎE[œ®u~·}~4š/Œú‡¥UK­ðsÈ)õÉ‹±4²O.Ä$ƒ–‚Uóõ‰fߘŸÒe íφ·­Ç*QÒjã˜îšؽ£ìû1BxÓpÙ6†ï[<¤¡ÉE³ãñe‡:é¿¢+ÒŠ^õö.l.ÓÆ"µ$›~ºT¬‘*#°|1`>±Â\à`YùUïYÅöð<ÅG‚JQI(~í´¡—N—ËwÇϱçD?îÉÁö¡ƒË$‹ãª†}ÒÁÇÿsžÚ~Hb†k4üÞr©ø­ÅYèZ$¡&HV®—Ÿ•œ±4¨Ý:¨—½ý(AXE·s 0'5·-{ÍKH»V)0+{È^2"C‡ÝÝêâÆüæÖ’Aÿèù¥/G‚¾éɯ ÇÙR)uƒ9þ¤ûI ]s×úÛYðyáY˜·’§´ä¯0>ư/^0:5? B¨Ê⺶¤3ß²mouç »Úg D°%|Yø¡ýÔ‰Wæ ÷W1ŒMç %Æád' Á$U túŽ(–Iílnžœù%ßÀ—æ©î:u´ŽIŸ %w‡‹,®š‡í±}3ì@üyµÍ;fÖ6ëÉ”¯Ò‘u6¥°£4sªäôÆïµ‚”:v„糡uÖÎÒöË^1ÂáüBƒ`ëÜwdùÇÔÐ<Šë\ûž¿65]‹s‹JU£±è‰B~Kâq†Czç½ò#àñ5î e ËAÔç¤ G»6Œ=ß?‡êW'Sº2Gm¬ÈNÅÂ3(o‘1vš[o¾‰˜ŒË—cÌ„²ö?uHÇ󧿨pï#¸¤Ò´ù¾Ë²g$߯À²ÇÑé«3J{¸Ù\zôÝÖþY~Ž·Óõ™Ò;1¶ñäZ}q=z¶Þ´=óÛÂÑ”ã¬g 5£ïÕ•„j¼"´&‡ý’~ ¼…±•’DzCü7½E¹9N.h‹º˜m!ÅOtÔKªTjfì*Ç‘^ÐÊó*ÉÊ Æ2GY—ð‹Ý}ìjæD‘—+¥‚´vŽ0_Qê~:qä sIe/CEWJh)÷A~h•¯Üqè8[…má–s9~›Q.›N6m °…Y˜®6‘gátÀ³žy¦À6AÒ©o›œª–›““ÚKUk‡Õ:RèÓ vb´ÖLvR6»±“W¶¸ éˆ@—é°µàïäv²P]ñ^íâŽØá­L^]CúUveFžÅð3Åyn(ymÙ‰jÆrÓ›6èFZOµXúr3÷ö™x V/#Þ¼llˆY^ ÛHjí÷ïüTC"·8Ÿåš•€ÍoQB¶T´*®” ²#þ°iÜ1\ù¤|¯o Óæêq£ñunSF8Hªõ¶ˆ\«9âæŽ»Ä,uSº‡ "׋çNß`¶‡·#c…LWm÷c jHÜ ¬Ò•:ç!øsQ¶×ŽAiÚVM%áúŠŽ%Ùåcu¾¹Ý¼ÍRFŽ=î¯bþv.IÊØò@ØwЙ@ a– ’"˜ÖpØMæÕ1q S@÷ˆÀ ¡9ÚŽ7qJœƒ&4Ñœ ‹M‡ q ½9éí§Yø"/ý¹"oûD–‘+Ï* N¸-@&lld"áÒüøp ý(ž+‡¢¡»ñìó¹j]:o¢l‡‰€ÃåE³$”ß?êõ=Òk%  ¼´ÈÞ¼'ç-…fm%dKõ$ãÖÐZdr|—©L7ÿŽâ;ø Y[*ë—c¤&Tž{Õ7ÂÂƒÆ çr)¶Ø¤ÆPÙ:.ïzÇ´ –wK·ê”«üf‡ª“ª©*) ˆÉ\‹žÚàˆ0ªÿ‹g§¾k”¸W5úËáY- ôbí4m WboIDc¤Ña®ÐëV—W#¼ãÂÈ!VÏ$êÉÂÍG™?ŸŒSךE¦²>ç3U…Õ€ÒžC.±ó!0ýðŽ)*`&!Ê=WV’¦^Ó±*ê“r`ÀÆ™|ÏjìKíæùpM*²¸±ñì™jÌ€4÷aYöíMÎÇuÅÒûÔ#þ‡øD©Ás‰0z ~þ˜fƈ*³äõþ«gm¯x Ì[h£¾èhtåÙ”84(mªõ|^ô¾„óÝY ç2}”ðsU_¼oÖqž>ßL8Z¤úçŠTkß7¼ÞT$ÊõÿÖ=gÓ]Ì’„ónKÃma 6 ²ÉàöðÌ5fá<mé]¯Ð´¸&ŸÁùAZv›<§{5Ù7ßû™ZÜ!,é;ƒRذD×=´^Bž:2Ðýô'¢îò"üÛ²&{i³ì…‘Ññ¯4–µÎʾÛö©ãŒo_¿­šÂ2ù’‹sÅÙ‚DõÞQ–©Õ›ßØãÍ3`Û›Ûg0(ä}ÜÅ ûäܘ§‚tÐá¾,ÿüƒ‰é;dÓé«}Ì}ä»é'ÏØ¡782h9Q¥^•²5Óqˆªƒew¥™òH–%冷U­‡¥]hmÉ^Xn•ßvãî†Ê©D;-vÚ;×±â…JøKŠoE×*–mÅÎÁüP‚ÐÓ瀭¹-^J ýù騋ÇB^U"ôK™’¸c>ÿoöé²L‡)z[|0Å™ÌÕa?Þ’Ðë!/4â‰8ãC’¶«¾gŒIñ·¯¶ø>æÂU¢¾ýŠÃôjÏi*~4š±ã{Í>†{vr×öžNfËÃßÍ’ùmjÍ÷ꆳBTîo³ŒN÷k҅ѬUŒlmWšk×¥W1›­âäKhÐíÏ÷„¿Î>ý¢(˜F‹ëoœt¢p^ûºíPo6ß+éj÷ìKÚ°uzµ?!ˆò¹4’ÈQö$}TºW(G椆F-Íß8æöÂÀ´pŠŒ ÜŽ K7?IÂØœæ Êœ©Á¤Ò®ƒü áIàà¿·OþJ óYö*+—¹’ÊË áÖ#»sëªoûüÄó a†â ˜I½X;£›ìùN=‘´ÉTHæ˜SqÙAöyÓdÛ€kßõû¿—™™¾â~hh°Nb«)µ›Z)m` ° ÀrÁTvDHD?aè;é¥l …}^½ã3ß‚³‘|d®~—{õ%ƒý"¹cì9ôû´Î 4²Z§´}y(*ö¢^™½– ö-ÖrŽ”äC œ=!ZuS¹ õšôÅÒ` +¬Dÿr¬ß±ŠXªºÍX9Ñkv‡g##É?ËîóBÆpG‹!ªë¯ÙüyK´¶—Ú¹ñϳ’eó&;z7:Ûð;—ùÖ8v¡4îB#Ò¹ÝÐ_ߧÜSÙÄÂÖ…Òòœuï-Ö:1D<˜÷ÌS’6úfŒP縒¥ø­¦ÈÝ£0sÓ&Ur[éØòƒ•²Jdµ·ê´Li¹Ìѵ= ú¨¾'µ8£ÅÂXÅt¥r=Œa «ÅvÓ/ŒX÷þR4›Þ3©(©)«¾?¸ àÆùÚ쀵áD&Vjª+sì›ñÖ¥·bs@>¨ÅgXŒŸÐ¦¾àâ?îRzñSLö{_Tñðp ©Àˆ¦fE\5òâ;æåc=.˜H;ÀwŠÌ>Aõ´|m™ß€¶KDðk¹Ï9¢Ë„*² àBr™]¶~ïhÓ L»2iv7ÃM°ž°×Päá_“þVÒô凅Øl^q0«eTómF‘©Áö‡O‘JÎQÐ Ó82V§‚m=qM’ÁæyóÁC»Þ “:àjŽï™Ò°CàÏc]6Êž ¬W±†UG"¤z,™¦Qš$dY³tE M•_é„sÍ ¯eˆOÊ•´h X'£ÝW&­»+{ì‰ "Iå #Éb è_¢Nž›¹Éä~ÑÇ×0Æk_¯-Íß9å¶&FÄ£Šc½WgRòaâ_§&’Ü\š½œ0žn /øq\–átÐT­3yßÍ×yŸÃ¨qFñ˜äø=®kÞ^Ùº¸Á×ùå+í)ü¤ØœµxºÈó˜¡1M»P d+YN„ì\xÀ¶G#ívYë!¾œïãx?§½;"å~¸QªôNû(Då$F͆¬“­µí© vY›¥¦ˆ¨@ÆÅÁ"ð Uß`a}m¸¿¿íbþJ*§[õ¼0á¡a7õÖÚ:|Æ_ãô‡]AùÈáóvªU 9¿ï#SùU'ãÊN )žhŸ©‰Ev,DxcJ_˜S vHØ·zi¤8aW Uf?Â1üîÞy¿h„Þ²ÄÓpcõçTi•¼ûÌìmô5jíe¼ªÃ•[#ðúÌ Z˜äñƒì±.Õ(ä{sžôb‹ -Œ%ÞûÊu¦qÚF€.œÎ‚5ÿó 3¤¡sÐF» F«Ø^ŠæEï©Ä'&ôñ(laâÔµäj…¯ó;Äz|oHè±}?.Ó,ë›@FÒùá'ýúú Û`›Ëæ· @¨­B;ó¹ Žv÷Ö„…*tÇ,/¬¤®ä³õˆ)½ Uœ\^ˆ+éÞ¨cӫç·@<÷c•¼ò‰"©>¥D_%§HhÍèJdˆÂ”­ÒbUb6Òü‘nVØºŽºYhg€QÞb«ÌºšBìè3uãâÌ"\±cä¹ßÞ¯óÁeV¯/U®·É7–‚(ä>-ÌAðsØ~ Jr¨›»¸qk^&f5øÍ—eÚV£YË®‚ªÍHÓÔ+Ì Ö-Wí6KlJ+¤CqB\YÉò™‘+΢ÈÉý/.4|Dç˯!aY;xéŸq1– Z¸‰Ú·“å«â-Ó(æñVÁEær_ß/KøÖ½6—»Ë¸Qä 6[Ýrê=ÒWEè™5§È“¦¡W¹Ü'hFÕRáEg"OˆNÌ¢dmV9=O Â÷ ±?ÇÙìAÑ—OTb©i0í°Dô/9néwO&‹m¡ìkVêÞø‰ÏZ|¶k¯‚mxûadކ¦ c5\oG±xmæ]²  AÚ|mÓ¤ú°”³ÍPùkõAà#+å1¨N\ÛBk‡J -Úåf\š_2ú¼’Ȧ‹Ø½"«BÚ^DÆRn Ƹ¤¤îzƒ ¯X.g«§ºÄÛì+RGh§Ë8à|+öi3¾mûÓ»ŒxêóEÙwyt7_*dŠäo£õ]!ÞÔ¢Îóc´65M>NÈÛ"ݽžxˆ¨2ö;B†ÒqÞµˆDð\óFç±_«Ô–\«U…ó_D—ŒÐ3ÑÝâùãr!üpÝEC™Žü£˜gá•í·'…«i«º³áçþÅcÑêt¨QŒ¢Ü›È‰}§ÈèüÇäš3ò*€zÙð¯]Ù>ÞŸ„= Ñc(s]~ž‹¨»9-=ÄC¾áýŸ­Hf4¿¯q¡âoæ[Ál]W"Í„¡C1ûHÀÂÂ.ÂÆ’¹J)+å÷ñúïJ+Éç9䢚è°o &#ÞÊÁ« ½v뜷{ÇTþzÉzXë)\ ´Jì˜ùÙÌ®ºL­Þl=ÝÌñš®my÷áÑX`ã­£‡>åæü¾ZÜyð¯Ä»1¦ƒ²r;ºþ·>íB©b]Psb¯9°„ ÄÑ~býü"°äõÒ…›]`J%ë«ÊWÓ$Ê",xˆ™OÝ l“H1ŒÃÜ’Év¡\°FÏ£õå=<£*ðEá8M%SÕ«ˆR/ùBä~KÜ^ÏXlÀ¢ m¥!‚ʾÔðÄ#‰ybtÔÉíL°O椗ëóž- ,5×# ᤬’©(YÞ'¾F¿M5mQ²³—œ{.3® Ôàànªì2>¼$ã}ËþbKè®Q÷Ó9¦uƒò»4ÑÔ7£^£¢)Î;ßgEÁPµÕáÝsÌÔϼʸÖ^—ëñPØg#“‹Âj®ÉìÇ\C™çÆ*2%‚å ­RÅžG×SÈ6×g—°ÈW¿¼àÛ]èG³z)'Éè—ÍŽzKFÜ?YZ.D$æ~‘ve‡6ÄëGbyéaâ¿e…x¤?ò¤®z`YTé­“¬¦zÓBàuä Q¤Ú@É4Sžµ^ãLaxäÐ>3‘WY¬ÚƒCï½ëÖÄ•·÷*r4*ÑW#øU¼ëeæ£îbd¢ù%•z& yRÆ&Ouf¾¾Hu|²9m´\Nt…åˆ'çó›ÒY"PCÖ¤®rœÄöa¹û7F÷œl36ù9Ó,ö§’Ÿ æ‡î [V `iÉáˆU›j–‡ZÞsó]Žîê¢)†žÎñÞ)~îªWžÏ±9`QÛnDʧá"[£Ä&ÔÒAgtä¢; –X:×Q"8n¦$Ceyχá# eW‘eY+ìH݆ð×êš&¶bFvÏšÑs¯oj]ãN„JÁ9¯ýÚH„*›sˆÉù™gŸ’úUR®†Ugºêd˜TÎêëÐ@ÛÀd2cœÌ¦u\ô>À=CyÕRØr-!du7ùÝ1š ’¤¨ãºýÎ/MÂxtK«­áÑ;!]·'Ÿ6܇DC$rÔÓ ¢sêjÿì f{tÀóÕÑ36¦Ü‚Åuî‰ÜýZ±{CÖ莱«ÃÏò)E©Š‘ðÓ$M#•þ0[Và”%ׄ ¹àAÞøÇªM”@ë³CÊ‚)ÅU¸Ý›œO$bz·ñ÷®Æþ—1°¦øˆÏ" v |Çùl”Ù•âÙlד˪ÈU6²5§.ÁÒ'|ðÔUœ>Ijf­¡¾XYúsx¦•:±”L”bp=c‹#î³Sì+¥6;™kvs×·uB§½b– %¿ÖaI#Éð†7;µn»TÊ–§ 粕Í6pœ»¦ÒìÞ±eé+;Ψïp¿ä«ˆi¾1§¦Á×2|ð2fÔãsÔÎèÔD™§*Åó~ï=tµ÷Æó;3«¢°rœ äû&íû•«è"\*ßé§Yˆ8áô†êé/×\ëuúÃ?O…ØÔžÊX»‡ªŠ¨¶è8 Ël ¤àñs¯n¨†õü-a§€£&Œ«e©¬éîTÙ†oz0‘ò£—èÌÕtàýз¦¿zj ö….¶Æ'µGþ0œÍ¹ >³Nˆø–Ü3ñÌ‹J.Í8@Ы¾3Ksù¦Z:%Q<£‘1È%žXÜCjâ+”JØö¢P-W¾[ûDËÕ«˜ oº¾Âü±³&ÏòÀg×Ú Ö'ȼù$Åßb÷ Jm4SEEgÐŽÔå²=Ö>7r¤üŽR¼{X­Èw(þõ8U8¨«L{Y>AœÔcÃêH¦ÝF0©5¹r÷¢‚ˆ¥G½ŽqŠŒ’ñ‰‚=Ú™y+›suýf¶ ¾üºyàÓëÃNà»g×–£ÜÈkÂ!ÆïÊTô f~Ce8 o¸`ÏÛ1‹ÑE»¾1¿6ÆÄo½‘ÕLÁþòvµ%dEy•qcNþ”ZïmC¼±3\¢|ÇHW Ù™Ì üqiP8L-ôÜq¯’õãEå<’ˆü:,ë5[sÙGËùTvp¸8å¨(µäáHºìN*w©ÒN@rçöpŽï8¸ô9=6éx=Œýçt×ûø^²Í:“n;¬'µ¾Ì¼ žO”N€øÅwÒ‚Ö²õ·ÃïvÉŸÙ è²,ƒWG?ʦ¢ul5ÌiœSKQy˽§ØsïÛž“}oÌe¼dÊk¥ÇÕØ¥z6‘/¸(ÔŸýDœ2 oƒõ?æXH_áüèè7Ï9û<ΗÖ(¬ ‹;Ñ.Ñ„ˆ›ËEŒG¶k¤i«~D-tî¼!PyWèKœ ;œ·ÑØlž¯Ë ‡ MÌâÕ™O‚ÿ«¿q—Æ_{ßòèó—†jŽajÖó¬®;Ô•Œ[,¶¨'PhígÔšyŒ­‰KààìÁ€+WZ`ðÿÇ 8õ!ú†Í%ò"ëTm¿»´ X‡ÂäHæRÉÚ{5l3?¹DÒ¯JtWÿp3Ûk°zß ß#ÊgBö+-¹üü£³ƒê·éÍátÚ0Ü®€òeC3`Î!OiU‹Æ,Äåú~ª12õõø/8.ôø¨ÝvÍo'àäcÂì]e6߆¸¸&Àa²U6(Nš®‡:¡WŸûKüs¢ ×¹1Q³ Ú84… î}ĽŽZ'ßJQ°÷õ+á8)ãG™ “Í‚ô °hÆA(pB\1‘ô€°%œlmïCÍôe^À ‰§4£¯oE‡<£‡OÉ×X ”B1%ËÀË’(SË TFîWïY$t*0x™ù€h0•ESïOWÕ\l¿só ,νpXøÜ`—ù®ÃC{¿°Q£’óâþ­]è®3ò±žQ¦Í…æa· iìA!îðñåØN¡P¢Cò‹*ùãÕê^iñ¾q4MØé(©ƒêðó&£öºp3+H]ZÆÒ>7íB¦óB€w‹Oá\ BvKP‚ÞÆå`Í@îáÛ_üzDÖ·¸þŠ1‚ e©bC‹ R×ÈN¹ X•£‡¿ðiL¥JÓ8 ‚>!åxDvx4t…øp£YÖf°)ÎïM{Õë‰&›,i{4cÔ¼9 I×/h_|AêïÔ…Û'¡Ç Sÿ¥;Å®/tÞUëìN$°)‡RXÁc!‰ª™RàH?_›(ýƒÁd[®f±y©2^Y 2 7«~ç<Ø?PÝáßøº°5[ñP‰Y¿äq"!YûâáYM(q #3=QºWÚÊ“dÒ=z·ü/4 ²×%7e¬EqMæŠæ:+U‡ºø Tñ‰àBÚ÷À ï­ÈÃKü½ò9„NA*Çx+7nYä“?±iÍi™}¯Á\Š|,M¿‡ SÝšíPh­÷‡Xîà`mÎóE,ø _¤µ)ÀÌØ¹9¤Óa¾¡õ×9¥²AFbBT‚yÚÞ‹•„íùbEëW>XAaÿbP¿f†7Ì¿Bi)o<˜ÄcPžÎ>!uÂÞ9V‰9ð(ã÷âe-Ì;=rÃͨò•\¦ÉgËçç–íß0ê4m»»wË\+LQ²~ T¸9e6ªNE6fº³6SS®ï*ªö…˜ðµyùbžÄZG·9„rÿ%ò zȇUdf#tøÞco|t9)ƒóõ8‚}ªéjù’áR#¢x2Çôõ:;Ðæ´ðñˆ‚J8;ŒUeSСïl™Ã³rª_’ êL)ïÜË<^~¶c û1t'û’ÅUy0tçEVÓ»º·ÁT'B ä’ºæaÄrežõ–úâK^©lFaÒ7(`îvcbŸMŒå7!axqàíà[îŠn_öšâ·žEÓ¢8/æ;{,ž»›ºi®.%ŽfU5bíŸtÄZmüN×}‡˜R`ÒZv¾òà–:hú5lÈò†Ýð6ÃuàásJ b¸¸ˆ€Øïbb'o•pp“3>Ù@u _™ï:vSx˜ ]FÉ ô(Vm•ì6K”Yb/œÁ0øãæ_ao¢V  ÿµ`ƹlÌZo–˜nÄÂ"Ffƒô´âYAþ¼¾K«Xš Ì%Ò;¶€ðI*xü(÷ÐÃÌó¼Zבj“ÉXíÎfá ³¾ÿ+Θƒ¤åfÉç·K}‘ZcœW¸¤¢r–n»îT¥¨9ìêX2Ù¬øÇ^Ût8BO‘´=g"Ç ØHº––à§£õ1oà¦Ô$oŠ–ÑnûV–¶Ï|9‡ƒh¿A‹jT¬Û”še3‡ ‚Ò[+å á—u9Zû¹FùÕøO\ǬäPó\´G­Æî倃¯a¨} W`ô 0&§ÑáVxe®' 2/ŸZœy ½WIáË òZ(Ãz‰ ß‚rQ‡s .Íe±á! œŠÀÜ/Z¼0œÐª)UŠ Šg.hòK‰ÜÎñ=®T‰žäT‰' ðD çÌaL9kô’ÞÅËÂý$}Žî±èÈÇtj¬|¶t=Cj–±`m®V?Kœ‹ÑU|c™ˆäÐSÒ¨¤üÔw7gÀ¼)ŠqS弨Ó18òÃX½ÇmÔ Ô|»‘/:éa¾ž…c±µ®¦fµ;ËÞï›Y–ƒÑæ,T¯GCTvÚÕ öù¸ã¸·B‹Vj»z ¢bWbš«[Ú'A.hYË3GáR„ƒúJƒ—ºIP†Â8©¥-Ï ý4® Š"ýC§†”A€±+JÛþP2»jãÛ3¯&óH"º÷Äдº·þBo®²1ΠY˜N¡#2ù$oH·1a"ðÊL¯Ð"Ë gܸ T¯Y¡ô¤‡Ýέ™ýß·¹üþˆœç% %rÃ(\à¸CÂq+”SpÞ)«^˜¤´_‚»JÑàcb5>ƒž?Y¡®V·Öb„Z„ê>¡|¨÷@Ü7´žˆšEÕX8ϯ.W"/E!@´ ,lÐrT‡æ§Ù¶N º8 Ï£‚L‘s‚j¿Æºßà0®Úh),PS–üa›ñ;6ý¹?;­™" ³Ú²Ü\8@[^TæÈðÇ-¶~yiÌÝi ­¹Çm.žA@pÍYvº‚ÒîÞÔLo¶;‡Ô¬÷¶sn^¿ò#¿XÕçkÜäèð|*Àá¿Õ ³Ìòƒ³ÊŒÄOÕn¶Û”^ôÊTû€!k_ +|Œ†¡tØá}ˆåëNü c©½iš2ù:º,ˆReÿ¿ô™æL‚"C OypBj¤Òg¢áRtÏtP´ÜŠÿ#‡ö4Ž_Õ¥p­(1…CÜÍmA3øgI`?õCÊ®$ar/œÉH"J˜¿»à~ð€eühßÓGR)ïâAL^‰WÁ'š7A%$âFŠ‹ ì£ÇLÄoõòmH7[¢ZÛì±ý‹’éþ>"íY endstream endobj 283 0 obj << /Length1 1924 /Length2 14859 /Length3 0 /Length 16045 /Filter /FlateDecode >> stream xÚôPËòÆ #Á‚X¸»»»»; ·àîîîîîw'¸w‚sÙrÎÞçÿ}U÷U‹÷×Ý3ýôL÷*(Ó šØÅìlhé¸Â²*’Œ f:&XRR 'kàì°¤j@G ;[®E; >l"†N²v¶)gk#3€‘‹‘‹ÀÄÀÀùŸ@;.€ˆ¡‹… @– eg t„%¶³ww°03wúÈóŸO…1%€‘““æÏåA ƒ…±¡-@ÖÐÉhó‘ÑØÐ lgltrÿŸ-(xÌœì¹èé]]]é méìÌø(i®Næ% #ÐÁhø£d€œ¡ ðïÒè`I*æŽ9”íL\ €€ƒµ…1ÐÖñc‰³­ Ðð‘ ,)·Úþ,óW àïÃ0Ò1þw»¿Wÿ±‘…ퟋ ílì mÝ-lͦÖ@€¼˜ “› ÀÐÖä@CkG»õ†.†Ö†FJ7ˆ * ?*ü»>Gc {'G:G ë?j¤ÿc›cµ5¶³±Ú:9Âþ¡OÄÂhüqîîô_®•­«­çÈÔÂÖÄô2LœíéUm-¾:%EþŽù0Áþc3:X8˜8À¯ ›±9ý TÜí:ÿ0Ôàíiog0ý(èma üøëéhè898½=ÿíø_‚ed˜X;Œ€f¶°ÿìþašþÅ÷ï`áÐføh?FÃÿýÒýè0;[k÷Âÿ¼bzqa%QU)ê¿Kþ¯SHÈÎ àIËÌ  ebe022±Ø?>¼ÿwC‹¿uük­¤­©€ó/¹çôÉ.÷ÅßB øß½äì>: ø§ÑuXŒ?~ÿ?·ûŸKþÿuù»ü¿6úÿU$ælmý§Ÿâ¯€ÿ¿¡…µûßëìô1²v³`ûCÕ®,ÐÄÂÙæÿz% ?¦AÐÖ죣iYèXþ²[8ŠY¸M,œŒÍÿêš¿ìªÌ›µ…-PÁÎÑâæcÃÿñ} ™±ÕÇ+âøÑšº€3ô¿yEmíLþ6&V6€¡ƒƒ¡;ìÇ]+À“ñc*M€n63€žÎÖÎéc à£Fo€©ìËÆ  üÃô±è…þ!v½ð‰ñ£Óþ¡H™è#RöâÐËÿ—8ô ÿ€^ébÐ+ÿC,z•èC™ê?ô‘Oí¿Äù‘ÏðâÐýCÙÿKœ)½É¿ð£ à¿ðCŽé?øá4ý2|È3û~è3ÿ/²|è3w·7ÿx(ÿ‰ø°Yü ?D[þ ?T[ý ?d[ÿ ?tÛüKʇîíü‡4»á‡nû¤|ä±ÿ)»Êø!Öá_ø¡Ìñ_ø±Âé_ø¡Ìù_ø!ÅõdúÈíþ'þOë;;8|¼Ã¾}ùþóÑ݀ư+‹vÆÜA– Au‚¸®´û“L,C×·Ðê{¢Ø.‡ŠÂ<7Ì…‘Ë‚½ó‘[¨'Leï­V Vz›^é‘\+M¦F»4^Ó¨¼O'Ž2ÎLÒ==Z̶&fmJ?\oæ(1i¾^í/d‰óµÕü®6¿€"o9¥ƒ›ŒŽ„Ââà`† êÌꪪœ›ï–$q¼˜8ÆÄº3´ZAj±Ž{|Œ`/}›uÌ—ö«Ÿ GÚ`0Gº×/ŠõGpÛäOaä8®ÌOÌ-¹7}-q½-©dÖ&1¼>˜ .¼Gt¹#˜ëfD¾£ÇMÕ#Rö-b%Y¥Øƒ™•¼¢¿²RW îû2ŒØÌiP].Š´—LýÈL‚žŠcrö\z1ÍX&Z‹‚òçãŒ1ÌXd CŒP×—]_¥@œh(Ë%kýŸSNõªEHp¤„HWÏø'ÄjEx^lSçãâœùè©ãÏôäôí?PèO@êϱ‡Lžòìo†¾«Eꋇ}_„íÏ©7„w‘!²7W~J¡-+Å*0;l õvºîØðÄ&K.ŸÖœ»Ë6—„ ôZ+pD™±0{mßÅ Õ}jä Ãòx©?µxÏL±Î¾TO}þ¢Z?nWé=•ÿ5ZϘ&X *Ù3¬qŒ­ßçb“?BJ¹§¡â{£ËIRã­E#ÉUƒ|lAA®ÚŠb<ÿ ÈÏ_ÐL וUÌlÎE ec“Þ¨ Î>… ;øÕ»…)œw=ûõIJ¼eP¦tF¨×s?*wq|;Äñçà[OÊO÷üó牤 qQWŸr+Ò†’é:rTÝ¿.óÖΨÀ?sgÁDþŒŠÍ EA2y´ á‚C¥å}¢ðémŶÆ\ãM•§˜nЀ]cx–ÌÓJ6ÝãPb®Ge)ùβ$™ßóûó—í H=Øóêš’gI' oä/À¨ÝÏd݇4‚ -HJw—§rî<?NÙíÝéÃ_¦ÈŠnDÆræÕ¤ «¡"Õû[Ô¡1_ϯVmá¹ãé¯î5šóʲdA¾À»j™ÔY0_ô«E¦Q“P°. zÑ%)ý>1X×®Dw›ZÆ“åt$kfÇúJ MÅ»ÔrKšøš‹í‘P(Å,&Hz"g•3K°u3kBïV©›cvóÝ?€iì~¸„Gç9œt3ÑvJ"ð3«³$Æ&Ùì†I¡$L‘©z]§S¥nê£.D÷13Á˜ÑõQy„"X󌲟ü]yM3Â/²$ƒ×#ó- GqA¢Æ]ÒC¤ø¡‰T¢óóž÷æ5vvÔsâ¼dbÜt(•©©ˆ|'øO2 øfÙóß””^™ Ö¼e½ ú¯Sâ‹^ýÓÅËkuèÍgltÝ9‰A³-0-½ã§Is÷¾Ã! ÷Ü›”O«mëÖ´”j–ñ]R•F%°Lf‚™p™á*šeB9Ém¥üà$j'.¡º"®èÌBÝqw×É”qʃ‰"{ºÅe+ ºÞÒ_Í”XäáÐ,¦~Ë(iaccåŠáWöCv fj½ †A‰¡¾Ñ=ëuÁ¨ iˆÚ¹·ý°výÀJáÇzÈý壧ÛryW*ðúa¹Ý.›0ò°¢”Ò=N zæ8÷}^ÏLÎZëê8Hný‰¢èóÁŒ% ]Üc<šðæß색ÃJ¯f¾G?sÒ„ŽÅóÏ ÷„rþŠÚµ'ÇJG‘ ,§|V<(i¼‡‡ù—¯ÆÅ¥jÅi­'ÞÃßÖÆ$Éß”DÍ׿ ƒ?ããuøÚÚŸz[tôDY• /Jà‹czºCLénX”Ÿ²N bªÔ'>AÂkwàŽe8öØÀÀ|{qº~>2Ü“þâ7é›Ê彂ÜÅI/»¢kzÖ©±bmz]Hû$6éµ ÐÀ 2^c…(%#ÕÑ3½q”Ñ2ö;ÊéõRçLԄࡵ GPФ<Û$’b³÷Ðýê§•[×ì¢è5  ÈÍ(Y?VqéÔ˜#åj&9ˆw&·»8ëÌA³56›yTÔlÚaO¥‘„érÀTå*¶ˆÞ*Ü6]©›7}YžèòÐCF—\ÎïñXküu 3éE$,Zçê-t5ØU|TÃPÃLfãÌ¢Èå<,æÚuKm+<ïãÒs¿èd’ÓÀ•jØHƒà@ …­‰ÅqÞ%pÜo軜šªÅðÁ4ëE ìŒï·/áµå‡¡¸‚ßãåëõ=š± ÷]ñÈ—c} ƒAÅ)‚Gœ½¡#a¢':Aú|cê[šË–O@J©D:jô“cŲìÕ˜ƒºÈwþÇÕ¥dŠÉK ÚÝ™3‚²º9¦ ü-nºø‘íé—¶ª|Oþ뤣m¯3½*üñØétŸ e>Ñ5¹¶Œ[†oHTW¾ý&ަ50ãÅÁ„ª1ýI «’Ø *âûŠ Ì”týhÇ/†k7ÇšÞçÈYÛ„Hèw;-®é0@²˜¸È½‘Ùë|øÜÅ‘hÎubùÅ&Kdß/”à îáÜú¬¶ÉËÚ %¾¼‘¾òa=ƒ›<‚IA—fÛö÷\ýü¬µÎwá—e¿-®Âäí¨,r/Ú9Ç÷`ôEVPàî˜HiåY4|j¢y5±¸¤/ùá;Ck²-Á·r?—j¾X*B$è‹} 5ظÏÖÅTÃ%·w{ÆLØ–Sóñ¬».ã#ô.9° ŠœáðD§ìU¶Ë‰ /Ö߬wshè—µMÀ±Có"FC9Õg'' i\g%p‚<ˆEä“€±²âA¡yÐýO1ã 6ÈÙßÍÃÖ{o=ÚÕFœ£mrJåAФ Ò8[Ãt»1§FßU Ò…=#hÐÏ8á>‘Áve2¢N|_þ†r« ­Š"¹æÑ^–»²gú¸ÝàxˆÒC^ž.fá*NÆ4jTŒ-£‹t7-1ù»Üe~.àŽO#•%ä wpžl›ÈI×¥[•ùzäk~{ÐjK+ÁŸéÑ÷²ÝFÂ2œÑûëkG¥¾†×OCŽÓ⟰±q«…í{»Çý“ÃPäS¼^Þ}ôh˜›ôb—ÌùøÐ›hä›Ê‘͵ ŽUVívý9Äc¸¾Ê£[ $¯ÍèöÓh×ûkã|4²Q+‚H ç+¦÷˜˜A(øbO5ÃoãÃÖ=Û¥õÀ^Éû0û&w eþqÖ¯ÀÄFe“¯×ïÀ[‹ˆwÅl)5¶˜í¢t>;§V2¦««“ŒÎV-õ)’·YE.…©Îñ^óÞI×’ûúË6ÞÉ÷-}™dâß®r³mAÞbë&ÜÐíñ£箑Ó¤ß eËŒò|Oè Îñ®ŒŒð}¥©Ñ33™¾nTšš¢(Ä!÷@|"‚µýõYiÉŽ>"„Ü5úºJJ­ ɰ¡¬8+,Ü®åê9bû br’õ96eí =z¹)øw·Ù[afÜë{Ðq7aƒY‚¹éÿ×F׎p§¥,é­…g§ßwd3`y4<Ä ¯”;ši4iƒ‘Ó=ÑP%µ¤Œ„ÉE Ãy-u!êDöÎS/€$›[C%ƲÍ]‡——:4áP 8½ìV§–íw%=†’È i'Ô Ï…$3¡Æg¢…ÍÒß"¦„[›¼^‘ åŠK°à»\/W‰=0Ú>eâ(ÑŽ.ø–¾é£‰V• pfx»ô—X¼‹H7÷qúºª øy-}Éljð*4$jå3œ(–çkZ›Í·±ïÈ_Þ}ÑXwº7[K‚Æ¿Ž×œ­¤ÏŠ[OÞoŸ{eÃx•*}{{•E†û…9¤ûÙEXÐüÉk¾;'lj ‡Ý1ãØCb]Åðð|åQùð‚.üü‘©Iy› `»íñjV޼Ö.FS… `#^ ?tºôI=/gËùÈÈ<ð$¡Ð³îêÕŸÔº”Ÿ,T£/Ô ©‚Ì%üñN€ï¼¿{ù• ä5•ñBPŸQnÙ!Gfë‰Ü·V´­Kº$ îáž³_ø™¢Hw6R;vä‹xä19^ B”½µ³P÷ùvw‡ïsñ ÚúÚ?©Ð/®´‘i¼ÇÌÿÌ_S‰¡P æv­„{û]>{^Wáñ£s®t cêØ¸ðü§U‚1¯ÇðåáÞ£„Á‚ fÊ=Ëw”'$Ø©È-T‰q½,zr'hõwõיїÃIg¯K\’JLA›†'êúê£Âoƒ.²ÆQsŠNÏ¢2©|‡oûq Üt#߮Ҹ€V3÷€p= böÈÊs)°ÕÈ$Ã2¤×Þ½Pj ¦ͱõ™9¸÷²2m羄ǽÕíÄdÿE¥54ŸÂíÕÑ gÙvd²ó@þÓrÉ+tI#g©3}â(ß·ÒÍË/¶»E˜¹Ì«ôV ¢ç³õôuÞù TT”a?¹@[é¸دäëN#Å',v?H œ>û ’¶±8E±£ôñkˆl׹ئXSÍåMEŸ(Ùý ÇçxŒ®}‘D¶xdjê_½Úlž gó3LP9$,€ìû*5ò©vuÆö7nLgaþv…×áÞÐúú€$†òû”ªOWõ~„Òùƒk°uÑ*g‰¡‰ ™¡)“wˆU€JW‚pÀîÛùµÃï7ê#;-»~,Hqof’©ÕøÈú Q•§ 9w¬t½‰üšaf$|ëPÈ‚'BÁÊ­ Çë©Áîwªò0ZßóÄù³mÀgªd†Ïß—® ­ljýQZ /Ö*ìliÜ}ûñX1&KAG¹Ýä2›³1¥5 ™ˆŸ`¡cÀ\)Z^–é졃h M»ãÅ¿–vù:†VCÐhÄ6loÜuM%ô_õ¸åÝ%T èQâ/¼;µA^Еù•÷NeZ¸†»å$añô=†w¾ý /lä9ÝU ‡ÜÚ‘Î]¿›ÌŽfÕ—˜T´—ý.}¢ÌxÝ•¶'eÈÙìñS½×±p,iÊD¤ZCâ 5KÇd-;Á²Û—’ÙmÔö•ÜÒî+-_úTk£ôYç§$«½º¼+ß´™€æë^25ÎL?çëNÛRk"ÃHSã'+Ä—ðÚøàû:į)‚#ý‰ë`"'áíG,rBÎÐ×½»îNHÓºöUí?J“ˆŠcRèøûÇfjçé×­×µ­’e~ÆA Wò‰Uw",¼Møýl«;ÄA-Éꪩ+á‚¶ÞÐÅ­J4œFp¸%‡Õ·Ú~Ér2õ“ê'ä÷;^O­ìSU¶X;jÒ‰Ÿ¼¯u€²ŽF—‘@gïʯŽu½e4Š;ubµüJÝâ6†Y=ë[8û9üîðî/'FnÓ¦ª˜2q±ê(Š¿‹BT×iÙj€kG+íߨ%1‡’. ÕM±]‡Î[måÆ;ýd¶owÛÁ_µ4gdÖä¯JŠ~»KU)&Râõ*€‚3ðh wš“ ÃÈã×}šÆFÌ:'xoÄ´Õ†œ áêe\Y%›¡ÙØ~Å?I…«„5b»hÔ³l?ZÅs‹šã3âh¬Jf±ƒß¸Ý‘—*»ü]tßøví:?'Î2ÌoÕþÆÄŠ¥’þéœæI±DóF²ýù(¨QHôBª›Ì¡SËc´N^yˆ{Þç«§ñ⇒JcãTìo‹éÝ&2ÃEF C)c=(‘æƒZK— JŸ¥J‡|Tóâpb±+Ø»žÜÂä@kIc  MÖr([Áb:ÙN¨Mê-ö§h:%ñÝ÷ Á`CEÈð`ÑSºú/XiîÔz¨ò@ ¸[\Ó3á#zAÌ0<œì„à]ú’ô?IÐ}cÌCOC9îµWoG‰~á¼è¨²óˆ°™S$þíùˆ°âp†³ÛoT){à7ËNëë,â>Á–ŠMé‚!˜q–'Jy„Þ”¡º…² r?F˜ká‰t]ô3cIàפ2E/ZaO„¢²Ïm Ü“8µŽg3(¨ƒñ{iTñTÕ~ÎjÒ\)A&&Å6 ‘°þs0O~žJC,k|_Ö¯X2µdl'©qæ…ô'œ%2Œ&×ñ7y©¡§Ñ»”ÙW bJG >FšÕ>ë<ÓJÉ ˆ\¹øl?Ú¡[™å-QŸ_@4‰õ"4Ä’ôúV`Y‡{3œ›ü qÎ 9GNP¸°å&¼U…¬¥3v4;Ìš`[Èã6’­™7d/An^裥š8-`×Ê‘ßy*[eòM“_-õÂ,Í·|ÑàìŬÔLõÙÚ//tŽ@µ ®:¨\¡„…„Î"²fwp´ÿg#39RÆIBYœ±U€mêK|^þp²¶°Dõ¦×&rKïY}±S‡;éR¹ ¨4²ºÒÔ†è'Pé±G”Žç%> Â=…ô‘Å(yC‘D… ›#4n3]$ìæÖ»rÖ5‹€¬/|@¢„ÄxPr>;G^ħ\J¦¡’Ñ¿8€¡$š¸Ý>æ>¹Ù«1µçdæ[=ÜÑ„UÈvUr)Î »2üu©¹UzÌm:¿§²I4g‡)ú8Ö6|m;.#Ý3,56Èãxé„zÝM?ézÖÌ`“ã&º]Ò µ¶F½žü ·Ùà>›½Ì \07ï;h™½ôsþaõ±É†©JAª®ú*ñW²#? É‘¸ÚǬu¥ÉáZ×k6¸¤üàö9¥{#­%ï`¼Õ~°+æÙÒÝ ˆ”….õY6ÎúeúO•Ô&§ ^‘6hQΰᴫ ²4Ç›#©­±YÊ…VÖFa¶Vø,ojí¦3q ƒ+}õÃàjýÞ;ÏÄÐ:…1³àu£N“WÞxã]}x_d1ÚSkQìEÌÑf¹ºûwäËrc—øVä{ws »„¹lís'ó»kÍ~@«n)MbpHÃ8osYª6ÿð²R¢ÚÓ7Í褲òˆŠís^·[Éûé9‡Ñ:÷ä©ýªzDíjô¸§÷3eÜj‹>ÙdË 'Wc®Šî²5é(Á ´jØTç`M锜§õiÌcúÝ kp0âA@Ë­ÕÒ”ijï:BÍúç„7O\ºç´úfš›V‹šÙ`‹ìÆT—VÀYÜ|}°ýuŶÞVú Îlö+?åÐÁ؆Ñ€A^û×ÈT©—¥FTR ›TXòC—¤°s7¥Qí«F®‰DLÃÿ@e vùQ˜í*OÇ&àÝÌ…Âém{…Jž/*9- yžj—f%IK&…`µÝCý*¼¦IXñÒ½§”OZ³O†Ce·2‚Ì„kDH£üŠ+`(€ÖñÍtýpLA…³kmI-q“Ú×%£®Ú†€.x„ö~ñœò©®\N^ŠÍh(ž[¶U•Øy*äÚÁ­àË(<«ª¨·Üfa;u¹Ç'ÄâzVLœÌ#PHq0Ç‚ðÉe^ ÒÔC‚*[{{7‹Ú·Gég4+Êxš]ƒÕÃàÀ:‚Ë«š>s>%ó›rõ¯‡¬¼Ådð‹¡µÍ鿬ý1tYkõYᢂ&jKNOx峉ÙÕ ôOG\×¼G\áòíZ¯ÞmÍk‹9;•G¹8N§ëyL®{)9vKÂmû9ÓÒá¸sÀ11ÇSŽ®‹oéf­“Ã[H>£ÔÄXú§}©¬}w†{çá A‚~æ[K·8‰8ÉkNb·}.®§lúŠ«r—Ml±º=3ÇžB\݉×HöŠF¡¡™d¢%½E¤³öI/•*í§vÞ…ä¦Û²DzK8a:=Å‘Ô£Š¸„‡*ßÛyû>±zè}R鄼ÒxVõ2Ò*sSxà8ä˜ñ`æ°ÙÔWØë鸫cŠÚi­‚)$x”:ÍÊUà w=I[N5°î¶UÎ_A0ÒqìÚ!}úf¾*á:Í©¹®`ï%Ò¤ÛsF‘qjg SÕO4 ÷ýž¹NPUSgëQÚO °S§ÏݰïíÒÇ® ætOh‡¦I©I7Á»õ#!°ÜÍRÛá3yC >móµ[FQöðø‰˜¿¤Žví·HH‹ÑÂBŠ{Òiˆ`p)íJöÍüíÒ_2ò®'ªc1¢41úІ÷鋪êšK“ô ;HèÜ3¦ŒŽ€æØ·AÂøÁvóUù”%~fÐQ0B v¶Ÿ®Z ¼2¡Ï6^}zD-ƒ ¤H(೜P¯JÆb~ß •nÂ;ç{ŽÂ¬K–$d*ùãŒðb;è½*³I“£CI&ÄJjnú>¤„SÍ;Üd¼ÀXÿ4…ãi},&O å¼hÛt‚ÄÕÿR}×ipÒã@*(©£´¢ëF‚Z•¤Îí›ÞÁó;¶{4 =<&IàR·*:·É{®ËHžÀy`eÖ/üL´§zbzq§ÔTõØ ‡=ú¢ß½ÛÔ\ÈMßL1AÇ~„Ζªj˜ÖŠb%©Â"ò‰¥øŽw6fTÁ&uwôÇ…Iùð•»³ó@ˆ‘sðÈS ²òGòñÆh.Ïéà‚6nÜZ›f£œY^sËFåà˜8•3‰»G_¢:æFk-7ØY1ü:ë«(7 üg!°®òîÓCÎÇNå¾[ª¯¦„⟙ҜxR¼³g¾½„WÑ<ƒ,Ojâ'K*ÌÅÇœi¿I Š;‹=Žõk7˜r+Ѻ·ð’“=;“†—áVÊ.u2,|ÂØÜ4š®É_(õÌ=Q¸Ò*¨¬ëÎtejÔà‡ïÉü’¾ÊŠ®Òð’..™V vÂ48§Þ‰ E-éªjNÿõô=ðh8éba>3OµzŒ ¼µÏÙ«d}â…Ñ‹hð‹P….ˆôÏ£äpÝ‘ë´xÚ¤à©>J9#õ†{’µúÎ ½ööqtÌ÷_dàép;ïÓÙÓ#ˆfouÓ)¨ ¿n8žÙ‘BMCiBš©°&*yäDš¨®¢@­u¨üw³WÈ”¡.Æåש1Å™˜k„ªï<«“Tæõn@æY¼9+ z)Ÿ¶•zGÕ.â Yµ#˜€›ßf¢cë£;F ƒ;_ ¨:FJ¯ó$ûÅ·Õ«Hõ¨¾NÝóÃ-&i-¯)ø[Õ{¡}*Ó}f_Æ1>Y„læÏbrW<>'oo ¬¿%z«+s –ļt+ïtîV~w7‡xƒÂ $Šc¸±0V2û¢Qâ«»Ž=oø%a ‘ªòŒ߬ȔL'öÚùŒÔ£ë^sÒ^d¶GÁBöžŒŒmM臼þÙ¾/™»ñ€?O=ìÈ ØBlÐUzHßIf‘™™Úb_²qfÝP‡YUª‡!¬!".e6 ]$–Q(wô>ê! _w Ä×zûø¶§¡©Ž`Ì)û:%js„LËBsðêBëœö¸TCšÁ§šë­¯­D:óöP5:ï°A#µš£ŸEç'‹Ü*kAxžŽ9%hÈ—·êe qŽFu¨’_tçÊÖ›Þ¬G¦ðà“F¥³——Á~¼¶ÜAÕ0/šÈvŽGn^H Ô‚&åÞ¨³4ÙÂÑïʼn¦U‰Ý÷àÂïh¼0~¿"ȧOýÝÁE2¿„Ë@ÇÕ 9îmx7]F9>Ëýé¤Á¸’q:ÖCÞ#HnPsý³UAkˆÃŸû‰=kýù8§Ê–?N-%r÷—ÓDÐømцŜkßDë3Ù£”³¢û¸fI¾@ɨĪ:ÔÌŠ¾¤`SÜ/ÞQ!¬õ±ü3Ç‚­š Æ­æ—}7ÖW9÷¢×ˆîD˜ñ…ø» âÚÛ5\<ÑËØ¶×½Š­7ü_Š£¾M¹m½'˜IYdkèÄÙŸY'¦$J¿‡2‹C½P?c4c§³rJ¿lÚGƒ^…þÒ¸”{À#à»N’'_a8DZ6¼À^®ëDñ÷Zè¥Ò)2V°=&Z†Ý­—øNbô¶̪¦RVñ§[á TM颅#ê÷¡üy!ôˆñÙy½4i9u`Ì'p¹—¿8ñ*€:Àþ÷qtúîU¢òwR1±ðºï©`d(±ˆGG@7Ñ;†k “ ÐÁ”yMd*Hý·7L¿]í&¾6½z2cЇ«o4¹trì7¨.cÕ‘õ¬U®ú™ÏÐpùÓaïW(í`ø 7Edi!šÀdð E0*î)ýä#Ý©ŽžÂXÙ»¶;v”TW¨›vÊ}|×b‰ïµp§4iÚBÛ-÷LÂòJ¼¹HÔ>¥S0£e âÙY½N"â ùÓyEi™§×užu,dEQÄLc_îŸu»¡£3&päJ£×ÊÉÀŸiñŸ¾y…wr³Z¾¹˜Ž_¥ÆîɆ|C¥‡˜3J‘DlÚ~zðA+•ö`í&íྩ·™z›ÑúEšÅÈ‚E+Ítö´Ÿ…ÇG«*­åň.½ûX¬œ¤Ep’yÌæØ —F¹Û$Érgœˆ2?eÖX3+‡vÕb‡v.òóÍ™øMþú™ª»%[œ2«…vêuÍ*ßIa¾ékCâYL—ÓžÔAa 듸¡CÓP“×KtGB¦2[±`€O•´ÌCðŒh,Òü—÷ÎÜ¥ãür£˜ÖO͇DWšÔoÇÄÄ-Q]do%¨Ä–{héf6éÇÝLOühg0ä%ÅØ6 w ;’ÉÌìQ~®Nž.Žd2ÈißX§ÏššÏXæ‘Ã0˜îÆR=¦"‡MœƒAã›C õvŒûÒÆÁj`žY%9œã=óÉPêÚíã¬C§ÄÇh =|e8^åkr쪧§F{ÛÎù£¢k½Æ×­éeš@ô—?¿P¿ÖåWøémN]ã²üçOJZÔc!óîÓ7ã“ÖýA¶={É®ðÑ™.kŒ)øå‡^ç{Ô%‹¢·e²¢Ò{.¿ôh.|æÔ9ɱasŸdÃíd>i—Âj^>¬ ÝÀeì¨oß­î €H¢´É-À¨ò¯dåɉ‡N _gyPXZ=´=x—¦‚XQˆð˜!ÒíÖJÎŒ`+Ék]SÁÇM]òb33­žÞiØ¥]eyAçʸ©\ œûŽÏ€pN¼Å»„|ž ÷wEò*F6$Pøº©˜Â}ãs8#¡Õušá»ÊmÌ6£m@ß”-Q1¬Óqí6PF7Ã|Ÿæ%—_öv©dK¬09¦Íq²ó]s9÷ôüUæ¡R©é-ƒùhw§ ø–¼x©­Ÿ8QØ“}ãÆÐ® +×x‰Tû¬A÷䪙à¥I½á øÅÑó0þ#…-äùñk‘GöÛÒL¨w‰ØâU’ER –׉Ä÷\ðõŠ•‹q×®bHg¹%ÁÝq:iõy,·3V¹”:³aò7Í‚OG Gh!PÐßô‹¡þt’ _Ⱦ3O÷CšŒÔ£öh¥ëÐ÷ŠtÙ.Ï´}5ŽZ––CdpÄš¿ 4¾îwZã&Í–öV;Þ™xƼbTû@RªkBvl1BwôHÕt;gPëüÌÏÔþîÇÍBuM¶ù#â#—K¼3¯¢ÐONNÙ3øüy×¼Ìï:-:¹wDªMû ót1Á<îÁß@øÇõ™|íUè¿Lx ¾šn›!ѵ3ÚŠ.Lÿ̸5¾œ7ÐУ¡ª‘®ÜöÓ÷ÿ¡C^ƒ”z2U¿3º¶•B¼zœ£@!zt|V»¢NŽäÃØ \F{ø²²p®Íý3&*-\e0þB?ä™&~R}TÄ›h )~ÿ«ºÓO¬· ºòv%±‰Ì9šËám|»T_]U•ó°Æ_´6<¡›*ßH¹k{×ÇG´Y>ç ©fäL)pÓ=ãͽ¤â¼p°äDˬù&l1 ÇõîÄà-¤G  1)Ã9e]s–Ë¢Zòi¬¢s‹±‰®徬i»ì•Ž„D–øœiÔ±Joè'–ÛsÜ÷û ‡­ò1”i­‰|ᯗ޽¡"4Úm2£97&jÃ$:3“µó9#èBçL|³¿ðÜŽðNà4¹lÌBkr"„…÷Ã"9«®ýµ,†ô=vÔ2§ßú«xJYÆÑ–! Ü\<$uî†ÿÚõÖt¶F:¸A+sPrZ¡‹m)Y8X`ïk´MXò®!Ï6QÉŠ~^ú£!RWºñ¼®X‡p9æ}¥s}{§³¹Ïn†‚å7b—æ·Fô¦+*I«»¢Yþîð‹4ĤwÉs5Ò|Y›Ë–ŒŒ¯i»ĺÉ,Ÿ6gN¡Œ‰9iå’¥ío(5~]R°3‚]P¿¶.e4çÁÎs𸉿³†ÕÙS‡ßÃ*Úl¶îÆžQv‚Ëíe3kžp¢K!P&+kˆñÒ}“Gø¡J!i~±t€õ™FžÌ¯ tösEÏëÌ’*[°0-+ œPn™ËNˆ3°úU49ŠƒKû "PHz™ÍaÛ,¹âÇÌsËð Ó¥Å/[Ö/¿Çà¼]”¿§™©ºí*öI}UùdTDÛg9ôвf…2C’ªÏÙ×®¾ºŸ)Lhw1 érî¥eÉí¡þŒ{«„gÁXñ¼Ï}b­<Ò± t˜BÎP¢uùö1ðK~/Kù…(_-O"9Už-æ«“!ËØwÛ•HT5wCÅ æĹÙyžeY¡r¾Þ;u9ó¾¢ÿ<Ðþ¦àØ4³Œõ´ˆmÂÚ³¤×¼­x¹ e›žý¼ÈaI)dò¯È¢äIƒc‚û ³Ÿ¶‚83{%1!3.7ʼ9i³ð×áÑÜP#8ç&ìÝ óä_ú_ìíç5Ô™ÄY,MÂ…^ž¶aòw£óóË©Q@Ç¿´à¿Vq†æuÃØ¤°sÛÏÄD‚,=9ön«¿LßÏ-ŸîôÉmÅßÛÎoxØbéŒZ<Ç\àS»y)›%bé´Í>méqø3â+É•{sðJ9%‚º&!«à[Î9=“¡§KÓo[=»„JvYˆ”ÉÁ~*”—Hk®<{HèÂÄ]{iL¹ÒO?Ch‰Ö2 “SR¯ñx{¤¤"Õ@ΘQ˽¥ƒ&[ûŒt€³›¦*®ì åu.©”þ†Ì”wb´Ü1ö ä–0Ckª=[ãÑò¸633é€n£€7«Ó 6`P&ZPú.©Og¯ëí²Ÿæ¨D‚ÎÊ Œ fzaU¥êò±•k¡(çÃ)¾ã˜tÏeô©Û¹~K°~Ìêêfþ²üĪyàðÌ«\æ›`F‰öRÝ/3¨8ÕhzYq€™ü¹7v Ð,”  …ϳ…ìø› \b\(%¡¸•Ÿ.ÜÂGÍ¢ñ~] !WÑ*3õD™:Žg^ÎÊHùMÊü w€q1ÎM-ý±¢ûw¾„·‡`Xb¸âçžá3×»2¥|¡r Y|tµ”N¨±}Ö=7úþaÿ Îú7_Zf³ÂÃßfßÄðÎ#ˆypºu¬ÜÚ2yqî è· ÓÜÖüŸsGcsŒ§%¸ ç»ZºX9«dɘiÏ:} W&-î*؉Ñ_{+.7@Ú#LÀ¶ i}3à#¢‘á ¹¿MƒÍû­5Þ‰GMqWÂë ‚£Íª`êŽ ÙœQäEâ¼ÜÒ]àŽõ4f¢Rï|IlpFw¾Ù•?Ø™ÖgmñkƒygtÏ•¨Ù¨Æ«7,ƒdÄöU­"Oa) Ãéãi>q=¬¢¾ÏcäkúÕ­–ÀÌ¢ ó=’׸¼N—Á"HÙ¡ß g¾zæPS5Œªì׃…½{ØßeA„TžQJ¦°“ÇÖƒFþŠCN¦iºg¼ f½¶lD|a(ývæg€·:ÄöŽ„p}ž]™$ÓiÀ2R–0^ç‹sÆìȳ}?ÝÞÍàlŽSÅ.n5tiÆ·Š!í©C´~e®oÇ£šq–jåÿ²3ãª}Ç–ÄKjFhÓ}Â5U“ƒíì’t,HMäM×Ýx曀¬Àëÿ9`°»Ç×PD¼ªÈ¬ÛŠƒ®uír3q†"/+#ãOêeK·¨nX5‰9ÝÑäTÛj\M ï\/Œ4#wâ§%;åUسù\p ª\«N’&(õ¢“èg²÷rd/³L´ŽÙù%©Ó VÉt™O¡Oi #·F˜Tð8ºGù*—vÝ[u°”kNDmÒ ³{"Ó ÅÐIÇ£v"Ÿ¦=ÔýIDšÁT6êV2åêàkïÏ‹Á’Ãb‹&Ét¾»ìÌó)íDñwaçå¥ì·&p mUѤ­÷õu%+‚c^÷ƾqlÒš8Õ§Ü/.ǦôÎÅ;B¿O­3'`eÈi¥ƒ¾°·Û|c’=­ cû– sA•=\Vqš§š ¹^…=­ÐÀ»ïݾç"Z;ã­šÉ%G>N¼,킘¿Ëüj©*‰Ò? B&M'”hP“v|ðÆçoBðË* öf@ Ñì­¥;½ü*¼lâ¾.Þ‘ïSš'_õÌ %…j:-©~k¸ÈN»ŒKÖò¾8kå7¨þÛEQ*´oº ÎŒŠ»AŽõH—ó¼Ь‡J´`‡ø¸/ÎmyƸÐDÙ0 RÊφÌ$¡PCNãeuðÄt>fìÂ$i·Z@¨i Rýmƒð(˜È&%!ˆ„$¥²@ðÞÑ ¨*tÍí¥†‘J ¢³¹ð…z¹bv¶?ìwÇÚŸJ©²| µµùVJ\*Š¢›iÆÀÄmáé…PìAí‚‚í ¶ )5©y8XºpËWÖ‘YrF´ SðZ°¼‘"èKý#õ–0„͸ ùª%^ ¯"cüOPÑŠì=š£ˆ,åDsŒŠ­ö™4W}WN˜dâ ûÉ Ÿø¨Qt6A·k1_Ç4ßx×D>Ç {üb6\)“D”·€/½*^<]skòëWˆlý¥+¿èÀ«åL9¡C›¿Eï¿å{S“#+só2×rã N†èÓÑù#?¼Îålš½éA/)ή¿ûwÿîåv6l?!]Ȩ۫y$˜ÞØR øÁ㌃»­-Ùš¯BÞS¥|Ñ8áb©LÇãi.`‘mš´– ço@_µ9Œö¢Ê¿S›ëGÓçX²Ø=¿+Tl]ª{ÈCvgB2ÔÎxIÔͱ9"¥Sè9Wªqwü¨ÕæaÆ hó»o™žTîZºB8ˆÇÛñówm?„¶È ê·4ojÌÖÛctU+üоõñ}Ra‡é ’ÛÙµ–ƒVˆ÷ïÛ!\·S£Ú%‚| :v<«ša"r ²¨Ý¢é.E‡õäm®36XÇ:Žùb-®ì˜¥æžo*Èñx¨K žN©§RãÞÐÞ¼Ü<ˆËtxÃÉÇcÛè«$Çÿ5ø‰дóF6u^¨ÏTÊ$thŸ%‚L 98D=Vå“^‰™ÆIr4>ûÜ\Úl©ÜèA‹È“Ä#­<¸$÷Rgžv¹Ì]¢Zœw¿{ÄŸª'±ùÔ'h endstream endobj 285 0 obj << /Length1 2580 /Length2 18726 /Length3 0 /Length 20221 /Filter /FlateDecode >> stream xÚŒ÷PœÛÒ cànÁÝÝÝÝ]‡AAw÷à.Áƒ[`ÁÝ‚Kp ×;ÙgŸ}¾ÿ¯º·¦Š™§õé^Ýë}¡$UQg5·7IÙÛ93²2±ðÄ54XY,,ìL,,lH””Öζ ÿÊ‘(µ@`'k{;¾YˆƒA¦Î™„©3ÄPÑÞ çb `e°rñ±ró±°ØXXxÿkhæH˜ºZ›™röv '$Jq{°µ¥•3$Ïh€´V^^n†¿Ü¢@`k ©@ÑÔÙ ô’hj P·Zƒœ=þ'€•³³3³››“é'&{°¥-ÀÍÚÙ  r]Aæ€ß%”L?€þ. ‰ aeíô…º½…³›)€l­ ;'ˆ‹‹9 €d¨Ë*”@vÿ1VøàïæX™Xÿ ÷·÷ï@Öv9›öLí<¬í,Ö¶ €²”“³»3ÀÔÎü·¡©­“=ÄßÔÕÔÚÖÔ bðuS€”¨*ÀRáßõ9ÁÖÎNLNÖ¶¿kdþÒfI;sqû@vÎNH¿ùIXƒA@Hß=˜ÿ>\;{7;¯ÿ" k;s‹ße˜»80kÚY;º€d%þ¶ˆþÈ,AÎNv6ÈrZ1ÿN ááúKÉú[ ©ÁÇËÁÞ`)äcm‚|!y9™º‚Î`׿ÿ‹XYæÖ@g€ÈÒÚéOtˆdñ 9°µ;@Ÿ2~¬–ߟ~B&ÌÜÞÎÖãù_G̬«&¡.¦DÿwÉÿ(ÅÄìÝ^ŒF6vv';7€‹— àó¿QTL­ÿfñ/OY; {ïÈBºô_®OÍßëA øßXJö¹hþŒ¹ ' ò‡õÿó°ÿåòÿoÆGùóÿËHÊÅÖö/=Í þô¦¬m=þ¶€Ì­‹3dí!›`÷MµAÿY\E¹µË‡ÿ«•u6…삨¥í?´v’²v™«X;­þšÿˆ5ï™­µHÅÞÉú÷Í`deaù?:Èrm ·‡d$ÿR »ó¿%í€öæ¿—Œ“ ` ›z ±@&‰“àÅ ÙFsû_C `f²³w†¸ Õù,ìÁH¿”‹À,ú[ôÄ`ûƒ¸Ìâ€Yââ0Kþƒ¸YÌR+€Yúb0ËüAìfÙ?’]þ‚dWøƒ Ùÿ Hv¥?’]ùÄÉ®òA²«þAìj$»úÄ`Öøƒ \4ÿ ­?’]ç‚d×ýñBxšþƒØ!–¦ òûšû¯”ÂÂÔ 2TÖN6!¦f„¶Øh‚<Š,œÿÈÙÿ‘ÿg—þQ@XÿAœ`@{[ÈýWò{š˜ÿP`‡dnokk þ—$'èOˆèRpýÖ;º@¶ò ¤‹?.rÖ®ÿŠñ[mïòïËAHÏ­þôÒs++пiCdÖÿ‚Vïÿ!ݶù„”ý‡¤bÛßÛòGiÒ‡?r-2ÿIÅ ‰eÙ²é!Ûÿaq¶ÿ5¤:‡?jH0ÈãÓî΋ƒõoéÿž¤ ÈTXÛÿk( q°uù[Èë³ãŸj~#Ó_—Ã?ÇÈñ[hï 27ûש°B¤ÿê9+¤…ÂrþF ×õ˜bîy¼üÃÒ'[S'«…€ðýÃrq3;[Aÿ:hHñÎnöÿr€Äpù3œœ½I8íÁÿî ä¼\ÿ!vûÙ AÝÿ!Y=þ!Ý÷üÃÉþƒÿ¹.`HûÿzjAîËÿâ¿^B@ wiqÞÈü¾6øÛm(‘ãθà åŽv-£×"¸Íå !™¶:+p|-š<Ô±òC’æJdéÝ“×Qs=BXK¢jëƒ÷£q¼ÚÔN+Ò÷I¼þ‰Â#Ѻ¾·ˆÄŒ"»ÞOŽÞZ6°ÍÐr”¹Ž.ÍÁ;3¾}M‡õÓ}öêz+gâå\<=’Ïq4ûg/½ ¶˜»9ÏÕ 6§NB B=‚·°WX£ST^bû)rø ^%EײYh™ ÖGûÞytžðé+Èbá³Ø‚y¥G)|Zë˜tzP³vÔMèjŽÐè-Üܤ¤ó•›ŠzvÃoÂÁô抮±J^»›‹pWºGWòG'µúžÃú[ˆH[¸+b«OaŽ>8ŠðÄ—»<Þ…ï3K)¾xõ¼Ÿ8v˜qßuWoë/—ëŒSåFË"wsìÏÝ\£~܆OA'°r°±h Wү̢Ä{¾¨–ê¶TK—/­3Œ‹PŸQ lê|A­ø,xU¶¥?JÜ“¸hXCî›6ª7Ó¥÷ÝcØ}°úcmØ—m* ýø™¨L*¬†–9~2^âÖŸ;ŸöøõŽž)Ó«ù÷LÆOãѹK#2ïVív£oûÝb‡fgèÜ?4ÍáíêV¥âŒ ¯ 2w°+â,¼X$:½¹DÊ÷r>ñ2W·[yOL2Ý«‰Â­ ÕÈÏÂ~Ȳ½6Z¡Ò^ñÇZð"iÌÿùôAª÷ÍêYùÛOõ©DKséCìqRò¾²x¡Ÿ¹Eð4¸EW”UÐ"™øcVã>Ê Ó[‡ê|Éæ÷©M¸ÍÆÙ}ß§«s%¹àRþî[ç@«Ãrœ˜ì·¢Í¼HuÞci.·ƒj[4 Z&}vŽã§‹þ1ª›n[OJFöÎ'¶oúΓÓCÃ)K별­.Ó#›Ì²6ŸéßÂPø#™÷6‰¤¨„ „dFð`æž—ÒÆ”zkNõ—}´À‡¿+Ç–h(t¾Å˜5Oí.άÈÌâûõÍžèkáé{î.Ê#k‘—T¼-ìALZBè©ð f¨IÇð7š+“R_nâšY“œ%'§WóEP§òýñY { j¥ŒÔ„S?%ºè.rÄ F0Ê"}øCÇjév³ÇÖ™ÇÁ\”›ÓÄÞ!R¾ePÃí¹lêy8ÅJ|@ÑÈ´‘þóW@”¤{ .uË`ÙÍ!g¸ÐOÐî};ÛVÛü<g?Î%úñvtŸÝß,GÖ0,+²Ë£©–/ftÕb>¯tå0*qçð¼è¡ÄÂò˜²Ã!ïAÀúü2 µWiì\íš[ù³ú®:(“šGâå|dŠh«Žmb¼sׇäFªÒ_l®Ä~&º%þÛ.¨+õT¯(ùhñ…:9®2 ZÙkJ*-¢Çt3S{0àáv‚Ÿs5«Påƒèì }®Ö°çêpAB&ï] »‘RŽŠ+Õ›šš]‡ñ†7jj™eâŸÅጪ9ŸxÉ/EO6é…ÄŽ(öVhEjùŠi´©w`àžÅú¤ËPÁ £y¡ÉsxºÖþpèÁb 6Ÿ`Kö¨0üÆË%É2]Î[u7îKM΄0§ŒLH êi’+g¨á?¤ß¿E–§F—ßšA¥ÊÁÌ’ÜPQbàSÜ÷ŠTg—fSCá2ÈÙfü9g„§Mí¿¼å'…Çäh•ÖóêF—(çâÁ6д¬ÄmtQ©JÓa¬Ø¤²òr+C‘÷ ü¶1Žœå´™éV*Êè7§Þ€aé$¨J‰NX³À!>mGRC?ëþ<·ÖD“—ýÂR8„Ô;Ý&VFðÝ(±²åv2 Ûí¯ù˜mc 17=¹&X«×ó?Òü¯VÔ%$áëh4‚p庬ͻ×幚S%ÌÇÊ÷¯4(M¨Ž‰½‚iäûø˜Ä­Çäyó;Üeú±]·$g9Ü9IÂwbs[#3z.³‹Í·l9©ÍFÌVRd®™Ê‰5û<}›ˆJJv7z½Ò¯]ÆH¾Ì+&Á´_vY>Ìš3ÃÂ0!ØŸøÒõ¶¥`m¶´£w€pnGXOk}ìÑý塎iRμDßL:)þxk" ÀDÉnñ!ÄðƺÈ‚Â*1š^*¦yXbípÍQ„Öyü.ú>ŽT îW §àa?U¦nÞ±5É¢Û¯Ðoü‚O¡®âÕQ* ÏRp_Ö¢L¤‚¶ä”I;ËŸ=ûóz $™hy D³œMèSÇí“^WU¢úyâ˜ì’z?ûUšÒU™ïi"ÇÁ!Ð29Ë[9Æ/<‡“бÀæ:žú·|ñ¯Ú VÂÐDìcï7»ÁÞëÏ«ìüUŸÝ;ú''˜öW³Cÿ÷ç‡ï<ëÉÚiÄŽ }mßb¼VNLjqÍÝ’ˆ¼‚Q¥å^<™³öe¨Ûõ(‚#¡Ò¿+ŽòDnÄÄöëaŒ†Ç@¾à^÷ªVpXÃì¹Ñ¢¥ÄÆÚÜ·^a >N×°/|·óájÔ{Öxµ‚ñ»4õ^x%Ëræg¥«6]â9x—„6Lì Ûǘ 7}ÐÜ·RbÕC¼³,xß-Twêœ3¹ й[H›I>2¹ió?„¤Û3t"âS°±‘oðBàµxmiùÈm{à]NõÈšMqД®`–â:âm‡+ùÊW¡cnÍcàßXÏW„r(êFœ0»&%ôÉôqÖ{EÚkýåÏ%‹/Z+(¥iJ.ðô¼/KèܘQÒè4SÝÏëë¨%¨Ý‘d•žÃ[höÊÝÆIÞ@½gbO±ÂÝ ‘F=Ñw«íw"¦ ÷”"3á¸=!²qÜdè—!ÝγӬyüˆ"K±z[8ìÅh^Í'©C¹ja2,}Ãnä¥WÃãV¿wåŽw&”œ‡jÂðøOÌ%zæí­µ+„ ×ùßÃ$â?ò‘ÈGñW]Ýçi¿PŽê$_ÁQ|ãÃ7âuøQ/edž!6N2/§FͥϨAwÂAš=å¡ eB­ØðD‹\ùºúdX»\E”¼ß"Þ_ƒÌ‚ø#œ0è&õY§˜*A­½WràÙ°„MÁÿ0´Š å\ØŠ–‡j—YÌÃ"è:%‘¿…%¼á§3F£¢@_¬ ´gë:n£ÏC€¶À:ëûë-n®½'ŠvŽ/ èšú:À^©Âƒëxž†‹ê¾}3ßê…à¹ÏÛÉú‘šêÃ#c,L‰Õ1¬k´ÈæxQA俆eáÇø[ýU ñ±Ú†ΛñÔ ;ž“÷“[da’È…3?%\ÿ0Ë™|\àñ^Y–žÈ^[=3ào‘AA²ëß„²…¯W»¿Ó‡ÇÉe%æÛÀÝÄlNÙÁÀs&'éÙÀ¦lžºI¶ ŽTïé{f䀯 B|ÃëV´©÷Ç(°ïïC^÷+s¹^yºƉ˜!Fõ!Z»×ûWMÀËXTàÎ=bT4ÙãCx¬XÂØ¥fc!Ìר¬ê‡êæ¯.¡vt)NCLh »+¯¦z ø^Eâv$c"ߪaNJÉViظÿÌ|oi–-“hþš‰†©kë¬<‹˜éã$L*e¡ƒcGÙ¥ž_…ѧ;Ã’—QÂМ¹Åe_ÕÚÐ|•7¸Vá,“¨±"þ4±HVæŸtÜ 0ä¹£Àñhj ·W£ú{ Zt~­  HÝöùÐ]QÞÑE¡aÝ—Ý;›;åãeŠC+y¿¶f?rJûŽù}ïnÊÙ¢ÞΚ—cAGþ04sò¤îäÛ™0Õ­/Kâ  Gz‚)âtY”#Ѹ¸¯L” Ç…æ)ÑÝlijkžœðzü€þíöþu¶óË´Êãq’s/n~±œ{]2ÏÂàŒñò&¾×°‰Ëê‹>n8Ñ»†âKʃfö®ðØÇînƒ9°]`¨’Ü»†Ã稉‹ô§\©J›ŠZäºWíÊï;RÛÞT­/íÒ×#hƒÞÌM:•*Îi¥Fіݦ¥üêÚ@(“;×Õ:Éä©?îdíz‚7'—S`ÅÆV¬Æ&ëË4+UíB#>ko¶6NÎä€ëÛª‘,m}£ÏRã9u«å'ÔwÎ Ì‘D ý8çdœ6®Vpû™/¶Z¢Fm´ˆW]v-·ý’žò¢æO1|¨9l“'“vDîª;Œ•e×›¹ 3'˜½âŒà<=ÍÁcî¨Dym£ïåÖ§æÏoƒf:oêÕ?•þ ÎyCäéEØ|dÖðyh£böÚ·?ê;KÞ—îžÛ¢1O¢²3•¤Á¨AMQje3 ŸIKŽ™s÷Å  ·¨$ÓàyºêÒÝ4o²Ž9R¿/õ2dmX…隬7Ó¾êÒG;^*ÆÒ5~òm!êô\iXóÐÜŸ MÕ-%Ê‘0lYÿàò)tœëÁGù€P’IìAs®Ù7Ó˜=R+¿þ”0¾žˆCí€,ö-^aídÃáÏM44ÔRûP¹Ôí.ªÜfom=š»àÃIÄ!‘ݰqnsåž‚Ýá`Gí¨PÓø Âê•Jül>'|JW:2EQx’4ƒ…­÷¼J²¯Òú9£­æVÑ #ï¶HÌfq»ª-•í¨yp‡Ë*«HñßHΆRó¿}aÅ„ýÍö£&üeª×°Ý#.™©¸æ¾#Ë7óטI!S%JrsŸ‰›8g¥ÃzSÇO}U2ùªÞ¨È]`‚æì—ß}§t'r0ˆÃ8ÎtÜ™è1¢y*½m¹™‰5W±+XKy/?ô5tœ|Ê^N`™Uк%sº{k^ÒÔIÿŒ&›ð…¥ø)Žj@9¹’®,‚¼~à]_8CûÌhÚ™šÊè;km èÄÂ8Ô#“pçqåð•þ ÛÑØk /: ä1ÊA±¥\¥\”ZáW,I©„/'Ï ?ë“tê¿ .­ÝI$™*Áï™`¿q,$ΉÞ™·—¥v%í¹VsâÔÁ¶dq‚p{%,Ôè‚*Ö0/NåË:ñ˜Í :#Ûöûá{ìYÔ[ô! oî+ß÷[^©ö„yøáD@2Ž ÒèYZ’õ×VPH¼JΘ„oBx[]¬»NcÛrþnH@=ï¯]8¯(Äõ§H¬#@?ƒ§Én j7Úûùß°{‹Æ{Jmêr\k#|W'–N“Û,Î> õ}Á¡Ì*6ÓïÀTî9ïãÇÍQs [o¬ä,&ËÖÞñö矫’å:†IÒ¡60Ü—¿»tòaûHè¥*JëöFîÐAg#ךÝå£;ŒF¦#g¼™7‰ïÑ}‚ÀÛC'7¡™¨OH@Nú›Ï :³Ê\{ÌÔ0&|ï&fÏÛ`ê;êãKHZ qÏy,?ÊBS\I3$¿Œ*šxøHeá ÓV^­ýJÉxáÞ”G&ån‹±…bZA±¿"™Àk˜s wE’o VcÑ({ûíBÑ(Û^fsþ, U@'ÜÜ$jä;°ÑèOHŠÖ¾!ðAºÙ5ÚÃ’…W¨¸žŒ„õ èÄ 4^!ûEÝ sHLV£ñãܬëÖ"h¿!ï¢Z««-…w¥õÍ1‹£ÃÏ6$Uw¨)°ý™{ÕðºtWÏó½Ì¾ Ÿ ðÅsŽX“’QP©ÙMZ‹p¹uµ©ûO\”nºÍ1<Ä<èVß(ÅqñËüˆª¤+–i2p‘S渺xÕ.Œ`÷´Ç0ʃþìì‘)c+E §BÒš"&¦,£Ð3Þ\’ì)k˜9y–ï)Uºl,lùÀDŸeÌúW ]«&4}I%¶y¨¢Ï„š®Kº™ lc`¥kÆPØØRцSϾ×~g›¸$§.hÚ"7ÖýDº[höñ{ÃÑX8CFnEÚK›!CIìFaØ´œï&¦áJÌ&ðÅè{ã[llÖ°%÷Î#ˆ4Ìú½"?¼ùŋ֡ MÁ\?æt®Pƒµ›`¾‰GEBA)ã]G¨Gèš”ì™È‹UoXÏ:ž`ó ò1]L uÐõv((ÞT œíešu$)ʦšz™ÙËgÊîÚMiÛ7¹ÍY¾½`Oèš‹öŽWkw|+Œù³œú¾}Zý~Þ^v^Ë aÙÐz^Ãr0*Zßx]¯Áøø}(qUÁsgau µºb8%½$ŸëG¤Èa²`ئ™²³R¿ÍDÓ"w<þ ]”“º(7_ÆûAÑgg¥dfNÖŽB ½oôì†ßö”d²ïvMŽÒ|þbÙÿÝþ¡÷@âXí®ñ%§áy¥âþUu5ì–ð}{Q ’RB»¸x¿2ư+™€Þ`¨0¯`Çl˜i Á Îý½âHkä×k*…];—OE~Ÿ9–s´ôG7è™òCÌK(œ¯ËãX™¾ú ÍÌt§«½¶Ë2]oVšÖñF=ç/Ãî‘Ç ÎS' V¡xGÁðk dYfÎ_Ó‡Ó(<&Ëæó´Ž†Ú)ÝóÓ³B«?X`³1¯üÞ©Š%4jÓ½ÕêÏŒTÎ>TðGoOÖÖµÊCårñÑüãŒ> l 3f‹ç”Û6ÿ”ð3oJõŠ:Ï1–×§x´¹Oºr6¸NÍ?©)Àô™ÎOa»Ü´Á´ë¨¢´GUgQ(p'ÒVÖY^û7„.üŠ‹ÿJÆÞùíÅŽ!™ùD·…„^ƒ¯8|ÈÇM\}õþ͇Ì4X”2Òê"¸öfwœ^"}0àt»î4"—ðÈ.nÕ(Ý©eˆ/Ç(UÑ«‡W2±¯gŠf”gjU쇳À’6ùQ¶Ó2"{‚O7FÀ®¯á„’èÓ”ïYÌàƒTk§ÍËÔÔ(»c_8å ‹hÍIøþ³aÇWBUа1·9Û#OvÑk“6/RKÆÉvf,èQÏÍh­-µ·):Àç›î^†N+E¬Ô#§ú™ËÈ$b`3‘. ¸˜o3õO;­³±Ü¡)@kônôÒ¿Ö·˜Ÿ,¸`}Ÿm˜x¢Š ³Å÷ïê?jŒj¦—Çb/´\ÕÚãM>Gó_¥+Úè7£ª?ç[§pÚµ3žÓ¡ZÎÎŒ}»EföØå~eúÖìuƒJ™Á-‰s<¾‘A7˃¢+r°P1cü:fy§¤¯©K¿:t1‡þ:~:·èZ…w{íÞ¯Ä!üÜäS$!)“ÅF§v±PRŽ¥ÔÌöµ¢Õò°iH[pré‡èö›Ó65m‹Ý¶IÉüOÚáü¼*3¹"±¡½rÝíùÛùø|šVìf鉟PëPh…+ýªš’΄_(ù(dsiÝ$_™ŸWõ¾­Eýãe·^ã{Õ ofÂñ¯{ÈÃuU´çÜh ÷¾rH´x¼Š±Ñoéì(™/² Ÿu’úä3%9èŽ4•¢ýMû¦|[¤ÝJh)½'´»l¾1-›?>ÄÇêœÌ‡njø×þ y^Т$˜Nÿ‰â’è¢t׬ª‘Ö¤ª&Y¯ìJû ·A™õå2«b÷N©KÑߨCàVóÊhkCÊÒLÑ(åª'fª;¹À¹ü½‰‚^â°II_ïç²±¯gšfFÜ…†bt€°QÞÂÅ&Í2äþZ¦ðšrè­ù+Â`›â|÷T'we‰;„*]JµC>Ä] ­ò÷ÔDŽÂ¸Z £Ðô„;cZîe,*Ú³žÓe ~ô’ÏÉt| æRn&·EÑ ý& K §.Þ¨Ôw±ì1áPn5äP@%¬SFI½‰™]:sŽeR°ÜÔ»¤Yté@zây¬p=®ÇkÜ%gY,läA)ˆ­9ÚZýe© Lá£FÅ*¿1ö"Y!šêaWµ¹ÏY'zÊ* æÉ.Ç©ýl»Dä|Ü£:XÞÈõ+΃è×õJŽî&óClŸ¹Ãd#2Zc‘:Wf ¿AVWÌ(ÛÕŠÓÇ^ê¾É`Sb!Éä8O/=CQÅËÏdìòËRv§Íw W˜‰ÈêâkTo;ÖkNyý‹ûy(w`ÃUf`ÜÐàô’µ V}ºëX<ï/Dº‘];¿à²”˜îL?¸éò%ŸÑŸØƒ%E oÒ]½~ÒÖ£K…y¸v1TK Ѩ<\h@¤-ÁÙ9™·ãlÆîä䉫%˜• f˜:ÝÌø6,iµys÷¿Zdïîü¼rj–ÆfÿË Õ]ˆní=ÃKºÓx½Ii²*°õ 8Ì,Ål¨irbµÝ³@ ’înKð&ž&ÖÇ&!3™áG ìo’åŽï!&jl±!ér†­¥ãzT~½ Ç'žŸtYü©_ ‘31³É^dú@YIÌ×ê4~šuyÚ±ý® ŸÏVVJm$²ëfòÛ3ƒ—v7%j‚FÿÉÛ8gËŒ½ô­«VÀ5n6ïÊ ›ó2ÊšE è³YÃlÂ= cF¹ô5ž,f!´p¨…J†v¤UÑð›Üâ£T‘ÿÚûM±Ê½m²ü”=-‰Ôí‹Ã65¢Qǰpöbë .Ô¦žÈò¶Q*¦æ²MGÿºÎ[•[òáÀEŸ˜G‹~{1Œ¼!OÎÈå %Ú¬0û”yª Ãp,Õ&ܶÜð¨ e%e~UÂúЦåÑ„iÑéq…ãAÙò¶mN\¤ºFWŒã›Þ.@.E¥®ù¶à3d4á Œ Q;iå¤I&”|XÉ:'«?0¬Æet¸VÇfO ضº0–4|{ó˜]/d›af³i2å÷KÈ8k-ô7iñŒõí|w\6‘;àÕ3~rÛÞòö>Ëbàu¹BÎëí\Qà ÂNµ¾²é÷縢œ \ Ë:ìÜæfv­|9ä.~CúÍlºíØé˜?è5ïøQþ†+‹d{•ô§áoR°WÚb+\Û/ù„«–ÝnÌòCBbŠ‘2ø×úªõ9ìðõξṪ+GZ_œSŸU£˜˜/°DEÃ*4ÆQ´4¸Ìø"üðž)âë€í…Z‚%R~ûCÊÍTžÄw9–úgNuG#»…kPµûرn¡ušx‘ö:3 ^:5Fߦ?½Y5€?f‘k…ä¾åWdV`\xe}5¼ã׳ËúªCï>­«`ÝO°_Ë¿3…FVkðûkacU?>‰L¼0ćˆQÊÙˆ±Érçþx¾‡âš»FŒË£z}øNQgõ¤õX²AD~¸pº_§”›ÿFNß@¸/ë|§Cê Œ­X+µêÎãÂôá,P4ç3VóYɇæ+‰úõŠ S‹ ~² î…wË׿Hçð5»÷Jë¸Ç%T[¸|‘¾õµ§!ÄŸâ‚écuÆÕH÷{}îú8©p:¿ö±šæÁĨ¾Öô*92«ŒwP Ö0,™Ãÿˆr¦mŠ!ˆ<Èߦ4þÕתˆ@ÙøÄâüˆÊ ×MËbeÛ§/ÊÖ3#SKïáK‘gÉ<Ç ìG狘ü ±VZñ ‹®iqfÌÈhÿWC¹€e…›ÑÀbòæóÝA±#eþ_òÂØ*"Ę3¨7¦þ²)ɳ·tHîI@4½…X¡`¸õĺ©—îV;Ì÷ƒù #£•/V°u$ñÊ\V¼o¯;wößñ§5|Òù9`ˆñíg†Èeì$åx¬˜º„t§È?,±ÏñméN€ºÔ}Cªä‰ÛH#U£þÔý—³ÆæÝ§GtxL~ĦI£ ¶t-ÔoÀ†Ø}Iêè`ùÛ%¦±õ¢‰¿Îa‡ÑAá"IU*gÂe•(þ„dG ·j×ãó6|áê –â͇{ ÁT×ĉ±Îêæ>äxÁñ/ùbÔ(s0ˆÊMAjrGO¬Bc]~¾í`ßxk¯JÔA¼ìeÆô’>#¼î¼–®/ñ⾜`gü]ݱ©ñ$ï0þ%²¥ebòÍ_ÎÄ‚Ç»Ž—Â&´‚FÅÚÄz~ÒM¼È£Œ,[Žiµ:ÕH«£å_1Ü"£í™ xû²-òhUC[qÙç”]Ág‚ê¤è0ªQë¬=ÁªqúíaYéÆf·Êeµ@ÏrºìzØ^œ­sü…OÍlçêª@¸jŽÆÚf"èIÙÜBîºÐWùu‹\«±(²ƒŽåøtUTì[©åÝR´¼/2áqóä§Æ,º Cp zЇ¥ØåD«° ÔÓüz§š…«æ%u\QHÁ£ör&ŸÂ1\Å,U«ê²ˆã8VwûQd°±žMšô6ÎÜ0°lª4ÃÌskƒ†8MÝA*Gµú´ÌÙÛ6 éƒ ¡¤,ÆoÖâá=ä4ì[Öê«6fµýN[ª¿‚Þ vš1å:à˜4˜v‡’kNž%õ;õÂG‰ Äi"óÚ|A¶Fê?sC²{Ð{k40ÃΰÅT²Sj¸gš{ž”¼“yIX®ÿ¾p¤âþ,kxD‘/¡¬Æ{®½_ŒÕnÛ_Â_Õ¥ë½ú†´8C´~ÎLýó°&YÍ-@ïšH`â0ê­ð( 4Fí5¬ÞYQ•W@P+ò0†ƒm5£_Õºw2ÔÝìÞ•è„MV9ããÒ)ÉÔªêò¤ú­JÒÀ7“3T˜Ð…¿ËrLîM}µz:·ñY7Fd[ð‹ ¨ö{ž›yb‡½ÊÜ©)IÄ®ŸÐ¡ï—èÉœ°`¥91ƒ¸–³\ót`ªsüDö §àæBÅÃ$×Î.ÈÚ}̦°‡œg/KÍj˜íy5þä04‡üùvôx±Y%Ó48³DèRàßô«5[wEµŠBbôq†$úýô±²Ôga+U€Ð¼—uÐ&kÎxD:R¬biÊN÷”) í€Ü%†I'MðÌ8w):<ö¬=ðÉ£cœ¯Xö“Çpú¡B€È)’Eã©-®ymKM²¸üÛ+Ô€~ûb0Þ®Œ»š»ªŠî þõO=*ºØmwX56ëîtLïëÞ¾…ú™… f!;øó×m±½ÄGÚ›Ã9˜¥ïÀ5Û9{gMÉû°FpOÛúÚÆ½\ Ù˜zÏšÂÆu`e>‰É¯ïÕs»l áu:•hƒSoµu…]EöÚG<"Gb¹¬WyÞ ëd½_’F}l|P´{½–"Id*Á,ŠIYÍ #`—ÚG­ƒójñ0¡…î%· úwcÇ30bÝ›÷Rã$Ýöˆ4w6õÒº¥¨¹>i'é±E`þ>Œ}¿üAœ‹ÛψCM]Y£b14^]fì §:h((›Ì|㥚'Ð_öÑê_µPßô€¥/b¢»¤qNKÈ k,žVb\€Øa§«Ô‹IªU>¹°y3 ¬âÍ7H¹ŽÙŸC‚Ììa•Ò‹ic‹ˆ[æI˜Éž`R~©ùÎ^&¤2Êôv;1µ9Šu÷Ðp¸ÊÙ‰½Y¦ÕgâlVk—ƒo|Ò£Ý׫'cYàáÏÕRI:š•°0(©¸¾.‹é‘ãùAÏÅÜSÕcðÙ’<à´‹–†ôö ï´ê–¿E×§Q‹v»SjâbÉ×V/}cýnk©£Û&^†LÄ÷‘öU½:Ùk¥ÑÊòÏ2=Žv¥ï.5ê=ea䜢kŸÁ=㇟R—Þ+þ¹ôÉ­¾èQŠˋ՘rt·Î¼gmíDWß7¥(Î*h´˜•Ø\ŠmÕŽ¹Gü´©óŽÒäÇñl˜Ë8÷ ϹIÙ@¤PB’¸H˜O6)qGׄÛUYš5ƒ­)¬e–yâÐßÔöÞ·3o¥¿nÀÒƒ²äj—AU³{/OO½cH*—ygh$"VVJTÊÉÒø’ð5€I<¦© o¼ª0:rC€ËMß[È~o¸V1Ü]7[þ˜”]Hþl3aÉ šñJÐÑ)ÔÍIu´™øl_ u§Ïqâ…ò%’&Y5Ö£eaðÑ­GÛš5©˜`ö{’ØÐ̾~IzµýwwÚ‰þ‘Öó‡½C îHª¤É«í3|>oøü_Ùoäý}/·)¨.Evø„ݹi:§>o&-ŠÕãT5¥ 7+GÜæœ^ìXdç |ûª˜¾­^²â‹ÁÕ[pÌ90™‡.ª'óFëiêµlòÊÝaŠ}+6!§f[½-CuÇðì’(šuŸ˜kœÝè'U¦™Ü’Í®µîY¡Õ¹–æçŸ/ˆeP”agWs'Q†“n–&ßEr¨ȳPˆfޛݸv[âK&ò]•«Ø[fÒ2 /9>iéuíÃøË§‹š£%$|") ~²BY8$q?ia `™vaÈ0F!=ŸìÚ®¥£`”^wiA_ÐÊÂL­ µt^ˆumÆi¯=R͇ç<¬i/eÇâØ‚Ÿ&ç#À´?¡,îå¿–E)°kµ-¥…'û\ã<‰aª œR0Ñê§½ÉCùMç{ÆÊÀ«¾ðÉ Ñä•*jó×Bߟ4Ê,…¼·j¤™’ ÎØÝèVmfÊQålèN£1i¿Öß[[‚ú5aVáÖ‚d¼¤¬ÅX3ÀÂÇ,“-3¦Ò,šêgwZ£z躔—†³üßM©¦b8&HªBµj¦4ýI‰™93ø¯>¿WŽx)±»RBgénV­½pKùhò>†´ÚDPÉÍ€1)]•¬åª/c¼Àû•êé´™U™JÕÑLŸg1í`õèÔ;åˆ󽨶ïdóÛ'vµÝ7÷ …g+-çí$&ðmÄ6öX_ÀûáEâ¨z©¾ýlÎÃ*†aÅt,¯üFMIªp?NöãrÎ5ý,Qæô/6ÑX>‰ÓïM‚ö”Dí7­ÒÇg´ñÍúüß?ØT‰ÓTV© )gÚ\±vûr­ˆ -* yã=D5Å›‘³¨§8€²<>5á5?F¶Yºg¥@À`Çúâƒ÷ÚgQ懾˜¡~A™ÛÅÐG•)GcíWŠ“¯„To]Ù³ ¨#ù•/¢dω«Ñ9Þ&£„>>3ö ì3ðkQyAmZ)«ÖòµÛúiôe¯4 Aêª䨀:Œ ®'¡àC!è’h­rXù÷*Õ.¤zìÝLmHA„2 ’ ¯Ía\¿‚Nð…Á=É)ÈôØ#@[D.IîwT±Húƒ²>)–B*œ£0dÒÕÐò©I@1J«:ïn%¥,"xÚÍͤvµ-…Î>b®¯#Q‘œÝÀÎ:S¯O¨Dtrq¶Þ5c¨v%_š–æî6òškгtÐYPŠM“ î xUéÉ|ˆ¯³›«È Õ¾:® ®=¡í) gínÐ}W,=±_è>ŸÁ='0¢¯ ºiRÿÄF #k~èbHº†$Ù/ÿ"Þ*½í -믷¬ÍµòÖf÷qè<æ^\2;mŽž…É4nœ¨¬CcëÓªûK[ù±5]SÜBú(Þ‡¢\•`ãÇ{†W¤Ž|ÿç@ ò!½¦&Éi´ Ïôktl8]_Ñf¤ž>Yì§ùVS‚$p˜ØgÏ÷’oËßÇœòµ>6ä'0æ|ª|¬T·„+yAO»­ðƒ`cŽßk¯p”û0XÅm½c·Èö‚ý&-QtaÇþí>ƒc ûiV"LS±ŽP=s"‡ð¨m@#°()hÕØjz[ð=Ý7‰_8ÛæyNýQŒºaÄ?w‚%øèÃ(Ò©7xífAä ãCŒ—KV“ßéyo)°~–zÿ Ç’Ö¹±ømïĽŒÆÙ$Ž2Mò2Çøy j ¾Äá¦W£{|}™NøFÌÚ ¶<8׿$Gï,›—©ì¦4¸ðVž<Ëx Eš5¾tSùôø odW-/î HÁþª‡—š >,¼g“?XăÅOÿ¼^Öm¾Ä©!þ FO†“Âå$¼ŒZ7Q–ê)–Y}(7K­¾Së‹¿Ìu=ôBöÓ’ë]æ!V"¬3Cƒ€Ç”ÍkÃà Ñ ÑÙ~íÏ¢P’Wêq©®Á¢ÆHl “÷vdsòMÄŽÝ€q¹nI×öøìÊ7 =o¶WìÞHEŽnð,ÛâÓZµ[Ç"Q@uFŸÃÖP§Sþìø“bó/™&/‡†œY l­løÌ 2´ôÚæ4ä‹'Ž w¦]-ˆ'ðé`žÅTúÝ}oËËÝEØwar¾õh§*ÑYÑÅh“ÊnlU*,ç»ï„´Z,Út9vüž™ê"Óˆ†ÒBN­zðÉ2“àYÈ8)-•97M-®^3–çiïQÖ0¥¸&ÐŽ»Â,c/R 1Œ¸ã µ ­ñ? !ÁÝ’#§wRɾt´Û.tå1ÁÑïßrKy¯žàat與\5Ig(E³blö¨hÚd›K¢¢BYñÏda±;tsV&¡‹¤&j—Óĵ'z]yÖ¾ÁÇI"O%³ú\ˆÔ¬2½LÉÂ`Ù[”ýîQÍ„G@ß²yøIlDÅΪÍH5ýq JS }FŒ–Yuå”—¹ÑÈ/ð Gd÷½VYzQò¥Ô‹ú>R8á‚:Îqt­ÏɼWø¿ÞR¤ÂÜhÐs ÆÞç’J5¡1TŠ ¶üèãá1}TÆÕKÜZÛÏYW8nùyöÊ=<î]ð~ßä ƒnWìOý³0Ô1÷Œ´²r—‚t:Ç]èÀH„£Š\‡ÀlêƒMÌm26€ÅðlÂ`7?ç÷oà …žÞ(3T–6Ö3Ú,&@‡$ÖäÒ¨‰ô•+ÈBîl£/{©ÌŒÌ7'·¿Âº;¼Mg’̘«2'Ip ·‘{Ùi“³ë—݉,ª°Ä »¡sƒÅÌ\|¨cns¶·ƒ"\ó;ø FeøPb¥Ÿ«­×<"…?Ój4“8øñÓ&Üik —ïg»ƒâã·Õ¦&ư?mõE+‡¿þ¼l>¦'¹dëË€Áɾ'›f/°v‘ïE%'NߨÉ·¿®ùŠ˜ÿYkÎ ]3ú—+E›@“a[Èô»¹'ÍsV jŸZ’¥øæbÜ7—œ‚ªú7‰ò®åü’út:?"…’Þ+¦J ßpo n6úçsŠÙŽÝù¥®S å)¹U½N# }¼½ãŒW 5#E½ÝõØ#œ·Tl%ƒ2ƒ¡ZšGÔ×™5VKÔÿ&`:"‘“Y—Á† üV$é zÇÙ¬l@áRÂ^ƒ~œìZÇ¢¯Ç³…8ŽºY ÉR’]Ä7+ó„®ï.¬%4w¥MŠÄ œ‰Þ7¾w/Ì:©X‰?ÊÌм; ÿB-xˆÙÿ3®.aGrêäë=Q© 2%Š;Ôv~Ѝžƒ†!s Ž¡Îù}¦ÆûŘˆ%f%~YU¯güÐWŽl‘p1+Ãh‘Ê<‡ˆ ¿)ÃKëWwGÁ?/K`\ϙבe“? %*¼š›Ïi¢¢)ß áòO¾ÞòH1u`û‚A3Õ¤<=Eég`±D(ù:¦ŒU/€äqÔeßE„§š¸A|óP hƒÃmé"i®9íꓯþ…G¿yèÞ¹˜3V4œ9y¸ã®-’Å‹O Ïx„’fP¥{ølÙO*U}!ýIl¼žbô¸¤O¯õv#¯|µ.‚…Z§¸y h¢>yïaußjŽN?í#^«k£ßECˆp½¶p’­ÙhoEb÷ò¶;»^Û`šîÀyÚ@ñÕˆÞÈU”õ0%OêµR.Õ«JjÈ¢-À6e¡Ì„òÎðFëâCÀ¯5XŠîí7±Y]uîƒùîQÁäñÀƒÀ¡;~ѼJx2_éï)€þ;£éŒ™ô¹@p֦ƒ)xU7bõ=¬é\Ur„"‰™"Ërï?õÆ}ͦuJ€ßÒÿ<¦OlêC‡vgi&pm”*À!II»e$E#9Ôs”­›e‘†‘)§Âî=õc¯´á5†i£ñ‹ùOŒr-„©æNmþEÓÊ¥,4R0øÔÀæs½ðZüž…mC+ŽV—C?Ëœ M®nV@Åtì ²¢„å$Z ù-ŒBêØ7ê=Où‚Ÿ7÷ËŽ»…3/ã­ã†´W‰Ö–E{Ê*Þ# @§?¦u@DS燜€z*ZÏÃÓCoï!@ÕåÝý¡ùö7«ú”Ä7¸š©ä' g)©¤Ÿ—qjð3šÁ—›ÁÕºÜF:ÚÒ)û«– lÊö…û·6Ns塲g©g>Åù#ÉZ»9MÜüÁ˜Ò²\ZLj±‘ÊLÌa›Dp8Ÿöõ8Ž édȆú†ô~}Ü:H•§H4=S®>ßSs y9I_ÇCk¬þ²ï¬}*Ž!œÛtÍÅ$µß]$¦³8¤¶Í$·GùÁ€3õ*2š«G` þa_m&‚|6<פôVêÚv¿7l;T!Ž0ÎÙwZ.4¸4‹2®J²KB:2§¿¸—ƒ|úð]ÛÓópó†íiêëdö]<©åï?¥~€†ž*ôG¦Oâ±]OQ/ÇòλNÈ©—<%(¡­¸0JOÞ5Sìž[0О<¬AõçÀn°ºŸŸ9Cê¬Ëú±œãÒ7²]‰1å`¡sºÀò•j™U€Y^Ñ+)Éd y¡Ÿå’2ºW­ðòpÙœiR8°OU–9{Šv«¦ËãÙsN¥¾Í}z8˜[vvÚ& ¥CôOCj;G“šp켬OŽ'‚Çþ.ÿ]'fšs¹áiÀ98‘Žœv_m33g ¹»šõ\ÍnM˱PŠ×3à3~¿-Ûž†I“güË:6ì4Ý­o<|ô¤~»×¤ ác"ÖsíG8oI®ËKçvþ FU[æ¨|b»ìrv+M?Ü)™×=¨­]h¡ cØ>J ¥o‚þwT o/Ì}ºq<6~iFJþ¢A©K»âL§ü#KÝBýÄÃYsÃò+fÄŽU×[–zŒŽ)Cƒ-c/­à ‡pÇܽÒ$€îgGb«öwµ¯AÍz°n¯v¾–œÜ7~ƒ}ïÑÔ› avïüÒœ©à&õiášuÜ/ì¦~=£Óö‹Däd÷z^!÷²|‹‹ÂYOøþ:›}>£’Ò»,½’;T] —’²žz”YImƒ(5×ñ“M›·`¹þVwC3ŠíõÛøs"æA¼Žá.œÊ¢Ð0,{Ðyâú×ÞI·,ZÏæ¡L®Y?Óø}‡Ð§-æô‚Œ@ÄF¶ÝQZÊg¸ÁdÝ.Ùu¼Éµî¬­Y˜‘Â9‰°hLäW 3ã[ùŒíqÏÉAV5 Ê›6¯;s_¦Æ¤¢7φ×ð+á“ «¾f¼ÚÊh“g˜v¼.Àªó¢¯Ë›ácôþ›ÈP‘H CNòÔVí#xœÓwùƶlÂUœŒ¦uOTûÜÍÆ÷s[T´J×?]T¡b¨‡\ý„# ì¶¶ARj†x<9þ¼cw¬+_}70ÿQøiŽ©z 7Žãc ¿òR Ñ¦B5Ëa.“«½@§@C/4×Ï ¸29W.jt¢§á­'ÄByO¿±)óÖŽÓ¼¾“ýöÊ»)‚í ¿É&¥%Lf÷äÞ>„¥t;Jrå-sãà’ï²…ÔíX´(„Áûsï¡ØË`¾àhÈà·íדF‰áà;“oç˜q#ÜÇHc'xU˦38Bͯÿ诔õ£}t±œ-¾Ó™¾š‹?  ® ­@LÃüË&îìš Õ‡ìhCâ~—A…mB|š×¨%"PÖún~`®!ƒ¤ ·Ûm½³¤ƒ- \7¤¶û¬TËÝ` údñtë0ìf¤¶æ‡ð+ ÅÚ“m¹ôÙY uÜ0x³IH^µ‡s$ýÀAïÝ꥘iwÐcÎàêf  —’½‹ÕûÕ ¿7ù0ô桲žðszuœI>B™þq¨Ÿ‡ƒŠ*QæˆKÒû?Ý’ÈÕÚ$¨?aBõOÕ”V4¹Ê›TÕf›\r¤~>ˆ_ÎhGÀ©&gŸ'Õ›WD÷µí7XBŠ÷œIø4ý½”RžM•ßYIg-¨BJAg‡àpaÙvÙ¾É$ÙM~¨Ló>”ÂÚíÃë­WДÛÙ0=eQ©¡QQrü.Y«c!N+V²‰&“Ú|ýÛCR”)9”ð5ô‰ôK$ÀCbþoá𥸑éX<¤™ø€NF -’§×8Îl†nÿO, Óò’'v&Àî£,‡ªš\°Ë9¾•Œ%e9 ™Ø>€r 4Œ[ǶÄM{G• üèìXH»du–O?ŒÕÿ›f~»äÏ‹Ñvå ò±—jb¿p÷]aÂ>ü¯óq   oI‘¿‡pbóf¿ß¼=tý[q·‰«JÉ?¹Ö!@4¸D4ÝkKüâ7(X±´4ñÆ‚…nžŒ¯ìqÚ%÷¡Õ;£0^íÖ°-â \ëòHX¡f¼¡Q&-׺æý¿Á\Ì:¶‘bY°½3óˆWÎ̺ZáÜ:ä-3Áó³˜óXPþM%k§wNÿþQT‰Õéhy•0Wôš}Íj~hôŒSèšÇt¯²Ðlµk A;ï<”ÄfÖ‰0¦ iånՔ池t6æ†(î¦ d£p~¡tͺ¡8‚~„µê©7Rt¡§è9"ÿ¹ra@òD6þ‰0gƲµˆwÛ þ .-Z æJ…ǓѠøÒ'G^ Œ¯Ó±‰Îc•D $`ÉÍž§_ÑŽÏjú“jÏ—Ë=•a²}öàœø{ËŠ9\4H¯€‘ZÒ>Ç\uÃ’Ó‹êæcG–?Ñ/ƒX`Û2+ñþŸòã~Æsž&Û£ýåD|˜Æ#°t>Š›ëHçAñ¨Z!wrz!×­˜*xÙžç^+¿÷LQŒrˆVdzQÔíÒ÷†_®K΂h™—¦¹°ì§ÀÀÍk…³ŠÃ1…™Ü-Ú\ÙúDê?ËÀ^Ð$ï÷‚0Ç®ãêNÐäûA*HûóDáw]N;#]„㞣=D¨UŸW—ņ2%bÒâÄQè\ ¼L65¦GÝõ³cEv@îHñÌYï Å9¿Â6Ì1äæƒ…꡼N¶¾Óg©—8'ͯ ߢ4‹oÇð4cFêö4¾C™ìŒúˆjy³ðp̉ã-oaWZĶώ!ãRªÃž²ØÀÀýª0!ð꼾аXâ­G‡Ä²§žOË¡ŸvÝ_sU`›P”+bVfYï{Ÿ9ļ×иÛí܉ªÏî' å˜Õdø€º Œì_›3µ¿ªŸÏæM¤: ,üήªKŸ=Mlfü½øF2Q2@öi’ïAž<˜P!úýŒúÍ2~Ì6KÜVCU)W½ÚP³Œ¬SO,,«Ù:úœƒyÂbºØ€¹}ûOcÓÿî—àÉ&»Ú»Ô=]§L'\ÉŒšðÄúUckE¾<ºž4e¼—Oì@")úÍ^þoa~$u‚h1[]~SS)}! M¼Öƒ"yó—ˆþí_«¤Ë¸ä#—_¯ªçžÑ¿·z6tÑ T%†/p†Nÿöø½äïQ ¿1Õ¥ ÉÉ—³M&=ùâÍõ³2š°¼®ÓfóL¦­VÀ-¾ß2"¹ :®/fsæ˜÷bÜ’¶|4_@¼ä¯“<ªÖ!ÖÓ~ufíw>œËfkH]±Kz{ï`°§sá9½áêéÜuµµÜˆR/À60ƒ ‡V)çÚëÔ,T®6m:èq_ïœg1‚•Ûz»‚…'œ^Ü‘ ÄÌÕŸ~Ñr7'ô8™m»·ß˜C<3•b{?ìºó"l™øxÁ¦£Æ}f›XåŵFÚWM »#†“R?EÜIÀ?¥,‡YÖ †æØÙ‚wtÁXüV‹xd@€,_.Ïë<¢ïa¡¬ÿŸÊ¯NC/”&ÎFQÖ·5 ´ësùq²¸©a-Óœv{7Dj ÔÑó꣎Rå(´îØ\Š®Ñ¿´óéÔï}¿ËŽ떮ͺÝ}|Ч¸íÔ„3çôÇo¨°èZÜ:˜'NàqÍ/cÕÜüp>,H [žë«\ùñxò&ûr"A)`JäuEy½§Û}VâÓ8´ã!w²<­ûî¤AJϔ۹”†w¯ ¿×¬m8 3Á’äÖ!8ðºÙÿUdàڵ̴í*]8bŠaÖ1ù/7r$Zt‚Θú¢ÀÞªq¼ê×ÝŠÞäÄoðfíÞ»ax æ¾L~² î”TKÍEN QwÒ(,\à&28f®ÍkZ%)ùO;6 }Óby$ÏŒ7ŒKÄO\Õ1v¤E³pýA¿šÏOÐFgÀ‡"U_%=(%{·: uwaBš€çKˆƒFªr1}sÕ‡4gqß[œ ŒF;~áuWìXe>¨/a ãÜ‚¡¹—·ÃÈÈ6.Ïí(>¿YLÛÚ#öƒy޾ñYÇT®ËŸJ Y' Hâ>—Ñ4ƒu¿áLi9нåñG…ËâÓþ Kë³CPžž>fÅE7³.!µÖp'»Æó]ŽJO´ Bæ=IÕ:øòë{¹°œ yM”€ù‡ÛúçU÷i™:ëqª½v‘ÄsE·`€Õ1ºU+/k·'Úç™AÕ„˜ÌOn”ã“5§(Ñ^î¯àý«_§A)×tJâX‹>â›ÒKHäM§]*$&®ñ`9‚À>uB±ÓUǵ%¬7a·®öÎÀj“ 9ŒÁ`á F*–ŠÁ<ÝrIþGšŒ«S „\:2ôã gGä#»Ÿ3SmËVàwz4®?h¿$¢Ô5Ž,½?l#ƸY,^éþ6xqIU ÿÑ¢ÿ•Ø4虄wۚВGòŒoÇk™ÛˆŸ»?¼ ˜©ÉRPóv U<Îi­·Üÿh0eë2îÏßß\ÚSމaûáb¡Ó ¯{Ì%¿^¡èà=öžŸOë¶¡ Ñ|µ•¢Ydyl'Iê¾?Á"ãöð&¡Ü<ÄHCMªk¾»x_—KÅa^ÐóVˆ…gçù‹Ptµ*«™B¦Ä‡ŸO›ŠnÅ#ÓN¨ ãxÃË%2cÐ@\3áÝ÷ìÚecèz¯Ÿã*ö˜ÄÕ¨·^*߉Oæ8Ûay€R~Þ7fߎ«içÙ–à8Å Q[ØÉRd†rèå4u.˜SWw–Ñ6Å飊!ïpÙ71C{ŸÙ‹ÂØé}®<âàµÝ"|ßÐ7ÉZ1ìfâœÐ˜Ú³„˜,…¯Uñàè£Ã \¬²_  ¯ÂZûðÖ'ú?¾„Î=ÖOõ‹,ÈU–¾ä2¹dÒ/¨s/‘-æ}ˆ3v鞌V.ƒ­‰{\.!*"Bd3ÞŒ¨+XÖ¿Åÿ§B‚ù«AÔnÕ Ü{5êRñj~Ñ2§úQÔà]ó[›ø¯q K[ü¥í¶À T‘ZLd8¶ý) o‘äý'Ò¯Pž~U à½ˆf*8ñX’«œÓßî€MðùÁÛÝŸ4 ¸QÌÉÂÁì=qwK—&$Çx£§Ð¼îöâÄáÖ£Ù"ºe#­Ÿˆ°Ó«Ðû/ÿJ$>Á$Ũï6ñŽ´NªÏ|ׯ—IÍð¶?§CõD¦‘Ö'fE•é]fñ‡G˜Ytó×U¹ùƒäÙìµÆü>Œ…V¥¦_ÓÞdÿS9qaæù"¾ÖÚ$ë_ÊÁ>žnÄ/ÔsêbËr ÅÂpj#M5fÎèÃ>[;ý¬ß­>>Yo£’Õ½9ͧƧœMÊ~.ã´,­Š X…sÇf..ü¸OE½;ž¾µmSiÈô^ÄÑ‹Ýgþ.•éeÃyý·ùŸ%\ŠÂšFª2+Õ’–šܺiYŹ-¬@D@\ n4Ô܈gæ©q?–Š endstream endobj 308 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.18)/Keywords() /CreationDate (D:20191029194838-04'00') /ModDate (D:20191029194838-04'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.18 (TeX Live 2017/Debian) kpathsea version 6.2.3) >> endobj 261 0 obj << /Type /ObjStm /N 77 /First 680 /Length 3495 /Filter /FlateDecode >> stream xÚí[YsI~ׯèÇa7¬º¯ˆ‰‰{ æXðp,Áƒ°[;²d$˜ùõ›™U]ªnuËÖÀ¾m®®ÎÊóË̪’l¤å¯¤••2žª²Ÿº8Hk*árØJÊ aâà'(|¥„4•„e¥¸€ h±Ò¤Ó• $œ­´p8ñ•¶¤<¯´@ñ²2B€”ו±—leðí*àʼn®¬è²Ö»‘о²^XX2• ZÂDUŽƒ/bp"€ã:TNI·¢rÚ 8¯œq®€³0‘ îN¼«œ·b$½¯\ ãÜ\Wžk^yÁen{áLZ¼T°ê+¯@Dà5WÀ O4 |Æñàá­Dá Ñ ÞyQADÞ«aW>@°Tsnx"dº ‚æ` Ò¡,<})àS®‚Ç$ðé* |`ÑatèÀæ SÀ呎* `?’££DŒ\c>@BpƒÕ€`rG4ƒ¸`F"H<…8ô…Â*3B§*˜ á¹aeÉ! S¨,!%¸ª8Vš‚ˆ ¤–È6¤nÅΤ½7PiÿÿùŸþ|½÷ÁŒ¡Žƒ‹J;1†F|ŒeŠíæÆ BÂ#²x¨&çÝXÒÌ›0Ɔ…f‹«ž#§5cȬÀ¢§i÷ã›2Z‰6âÜ£2†(8FŠQ̤± h(´’Ú’$:”,Ä “œKÒ¥VŽ‘joÇ0°BÆÒŠÇ˜½ÇuhÕ1–)jSQNŽÑ+z´EÿPÆ ô)މÃ#”Á9dô,Ö`»gr§9Ù'MÆ1j,W•AþFÛ.Oï2&Åm•<‘â4â縯RÌPÖy Zƒ;§J|Ê1À8àüÀr …&Ò哉…3”,DNC@=%%f´ÄµD¥Œ)R0g”·ü–ðδR©1s1C©r \HŸ9c©zT#m-ú¤-"¦¨Bã© cGí )q”.æ–V±:?ê\SÅÓ›$¤Hß—ÔÉ‚RDdYŒÈÍlf%—ò¤¾\+ÜëslèGnyµjGMî6`h¸y¨&,‚ÍzÜBRyyE‚'ŽIØÄi¡Ð‚°i=ÑH6iW´ àI¿‰p¡—ÍÃ¥ÌníÎ HYÊF1/²GÔVNåFGJ…isG°ªTÜ™bBŠÕ@œÇ‘,Cu)Aw™»þD‰4Büq74Ð_"‘âm }ËÓHgìž÷‚;?p=¦+O¥#Ü$`†š"œÈâ)¿pGC…4‡; Va¸9(ßÑ0Ü9ˆ½ ÑQµGÏm1ïFeLHJcצ9à†§ŠH‘Úà@Ã.ÐP‚¡].JfîÈ¡i×Ó†F»\¹±Šs!Kt¡–ôâ ®Í(ù#ji~´ÐJÆHq s 7ôÑijØwÑß@»´".‘àÙ©HRRGàÅ€¤T£/J&ÝtÎu#—ÂK&·ùÅÀö]ÜžmÞPV]È3¸ŽËu’ šž÷ôŽŸH"sÅ5E·åÑÝ8߬‘»Ô6XyÆ~ïõ¤QKll3º0Äß½xQÿVâÅÊGð}NÖ>rS’oî]Ö(%Á-ÖodðÐý1ƒ&ÍáSÝ¿ð'©c4ñ…xe“iGø–½F;%eDFS㥺“žñ†mÂ%~¤6ñJÎ'JP.qlxãº6è‡Ö4ßpÑZD(ÎiÄ«o©œUƒÑ(UPŒÅÍKjBÚ×öÌKŠ 1^º°-˹¼}‹'ÉF:íQ‘âà4ì†ÿÃèçŸGìôÏëºbÇ‹ùú¨^-§×ëÅrDïÏ&W°rzòøÝëÃ>}ðVpX˜M.V•Ž,¾UïàcÚÄKÀ;8«>ŒØýÕY=_ã'æ;œ\?ª§—ðê툡\;¸øx=™MÏîÏ/fuê_­ë«× VÞ&!8B@Çådùª^W?±ûì;dGìWv̲Gì1;aOÙ3ö‚½d¯Ø)û½foØ„}dgìœÕìû4ýÅÍ’]°K6e°»bs6ŸÎk¶` ¯Ùu½œ.ÎÙ’­Øjú­ÙúrY×lýuÁnØö•}cÞ‹QOÁWiCÅ«—£_~¹Š{wt|Q”(*DQà'ÛðcPäaŸìÀñl1[ÌoAóoéÄ>@>=9~ôèyúx¨ eH‰_ 9£ÿ.”X‡ ˜ṅÙÀ¹VíØÔ>±½~}rtòb{9˜æ)0Îo«u§±e‰(q·yÞ)’·ì]«PÎWW*RŒEƒÿ¦Œþ•åsùçõe=‡*úÏ@WN–õ|VZÇÙ’ÔA…aXM¥}fŸoëúü㌛—ÈKoqJY_M£«ú Æ ]Í&«Ëþ:e±¿êå¢R³OJï?zóò·'”Ò¶‡µ}ðþÇdÔ f³÷?ĽüÕÉééà„ªð«ÁØ"2!Z‘ákŽLJÙÙÂww꿊^ý7€0¹‚ÆYMæçl²:›N×ÓÙy Sl“ÕP—“³šZ‰f±ypúG½Îd˜Ç…nÏŸ/f³É2·~ýùf2ëœËzÖ¶ÛV¯V›=`~sõ^Ì÷Ú®g7«bOHmß4{»Íoæç`ál±¬wu¼ßë€zxøò×߃ê>ž”iîKROÏÇ“õ·TÇÃÔýåÎݺ$}ÚíC} ¸}íá~¯cîÝË£Wž!BƒÝ£cóõ]ÍÃhïÄS®ìžVËììŽ;õÅ-ýp[´Š¿^­§`w  ú޼;öÂÀéHß|\Ó+â“U+ÛŸ Z…A¿ÍC•ìxº\­11•†KÙÉ$½ ÊÞLÏ×—+úíàÞæ»Wï®y¹‡y·¿ùí k×ÝuÀ‰Òa äþtn•]ë¶k]´¬cOeëzë P׺ß_·b…u»¿õÎ ¤cÝoUžo[/c÷û[ß¾(tت=Õr@Ú&ìï@÷,êš×·ä¾,}µ¿ùîFß5oo‰¾„Ÿo›1¹¨W°—/nðdÁûÏü ;é}2=_UïñWþðZ £ÒÓÇg¬fx†øŒ—ÀËF|­ð¯ð)yzŠhSÊæéo³¡‡lHe¢ý—F¦§½M§°ÙQÓ£IX›áç7ëœ8«”š*• f†þZÞHÉ)ø•C\½_Æi' ¾XÖ_ªÐÞÈ’°ÙË–p…,þyD°h„ƒ– É©gõ·5ýÁÅ–¢à²Ý«'‰öøTå;bo¶¤¨Ü³ k]b} Úæ|ÆÚ·¡n Dk=1ú ´—½’äš÷=’eçw„hK=¡Üåb„¾UL²mÌåT¸v*liËõ”’Ë™p¼W’sv[ÒfPmT[‚j˳ñ †Ô¨ý!ÙŒ¼•½êÉ1Ûƒ¼ÍÈ›]È—ñµÎ·ì3yiwo2𦠼*{Éôo2ð†KêÒKÓ“³ í5ºTÓãÎhk¹CM ½î^gè•V£Ê­E÷tʨª~T£dÏÆ¢2ªªj™yÑj3Un$¦]“M[f°elQ†'{"’_)wH–øÊ|eÆWøa5¢Ä·Ï‘ñºWM”ì;<Ôæàé×U _Qâ+Ûݤ;ÇBnù}[–²mõ­(w—Ɖ¾Íaô[Š»B?~"‡{ÁOG‹³ƒWëÉr}À‹wƒŸÃgç±BÜMJ%xd<~ŠDJKBJºý°“éÕtÝ1›ù>t}‹ ´Ì Ä|5 ”Ø¢ ÅE·xEz¦ï-BúB%~FºRt7Ú¤àáhÌý‡>óI endstream endobj 309 0 obj << /Type /XRef /Index [0 310] /Size 310 /W [1 3 1] /Root 307 0 R /Info 308 0 R /ID [<9338B97558EF190B67FAC8C88FEE9030> <9338B97558EF190B67FAC8C88FEE9030>] /Length 728 /Filter /FlateDecode >> stream xÚ%”9STA…û>Þ{Ã>0 ²"¸ *ˆ(þo¢(‚ ›˜ùü &ÖML-"Í4  (‹ÔˆÔHç;&_Ý{º§§_ŸÓB£¢`¡õK Ú,ÔÉ•ƒ¦åõ1|¥/£±ƒHÁ ùS4mM‡È麵(4J þFÏÀX·nk• FŸ`×BnE{ 4BãÒö-Ôª:°øç*•e7 gj¹8ÎMqî‡s?œ[á\×5`“^n¡`¹w‚î :ñvÅ[ù«³0x¢yÚaõFvED¼x³…©IMQ:1Ï•Iìv¥Ž ¹²¦0tXXšÖ/—“&WšÈwYØ|¥Qœö «§jÉ+9äÅ•Râ}~ÕÜ÷¼Åþqràxîãú¥bá¸ïïïk`Îâ£?šBœ8qràäÀÉã¾Ë}ÖúX·øÛŽØ»`Ûâïï¥á¾ïƒ=‹HÃx?`©`™ª#^ÅÄ@ôÅ )ÈX|Z«yÅ…‡ DU‰%/óªJ-y{¦ªÌ’ßïT•[šû¬ªÂÒÞª*-}s¢*kéQ‘ª*Ð ZÀ ȃ! E/ˆžŒ10&À$л¡‡B/Ã,˜ó`,‚%Ëd_¾·å8ü¢µ—° endstream endobj startxref 466647 %%EOF rtracklayer/inst/extdata/0000755000175400017540000000000013556116552016543 5ustar00biocbuildbiocbuildrtracklayer/inst/extdata/demo.narrowPeak.gz0000644000175400017540000000035113556116552022140 0ustar00biocbuildbiocbuild‹¿‰Qdemo.narrowPeakEÐ9nÄ0 Кs•À÷å<©sÿ"”#M C¶õô©÷÷7T«¬%¼æáÀ$‡B¯l¢û‹•YÜï«Äèõ~¶›w±¶Ï ò ºâ9XÜD/y·Ñ^‚Øö b^ƒ=¢ Lxœcb``8ñ¨ƒùËãf(`B$±ý°? òà¬h$ppxœc```(xÐÁüáwsÃаŸÁa?ƒó†„WÎŒ@‘/;˜Kþw0s°ƒå÷±=à †A–:˜=þu0ë€30ì‡`±Ã Óœ  à¬h$pàˆHþˆbpàˆHþˆÀaZxœc```(xÐÁ\à×ÉÁä04ìg`pØÏàÀ|„!á•3#PäËãæ/Ìì`ù}@lÏp@Ã…!@ФåÄ£æÌ: Å û!Xì0Ã4'˜ãšà¬h$pàˆÈP‰´ÂpàˆÈP‰ZÂZ&üˆrtracklayer/inst/tests/bed.wig0000644000175400017540000000060213556116552017513 0ustar00biocbuildbiocbuildtrack type=wiggle_0 name="Bed Format" description="BED format" visibility=full color=200,100,0 altColor=0,100,200 priority=20 chr1 59102000 59102300 -1.0 chr1 59102300 59102600 -0.75 chr5 59102600 59102900 -0.50 chr19 59102900 59103200 -0.25 chr19 59103200 59103500 0.0 chr19 59103500 59103800 0.25 chr19 59103800 59104100 0.50 chr19 59104100 59104400 0.75 chr19 59104400 59104700 1.00 rtracklayer/inst/tests/genes.gff30000644000175400017540000000373613556116552020134 0ustar00biocbuildbiocbuild##gff-version 3 ##source-version rtracklayer 1.15.4 ##date 2011-12-06 chr10 rtracklayer gene 92828 95504 5 - . ID=GeneID:347688;Name=TUBB8;geneName=tubulin%2c beta 8;Alias=FLJ40100,TUBB8;genome=hg19 chr10 rtracklayer mRNA 92828 95178 . - . Parent=GeneID:347688;ID=873;Name=TUBB8; chr10 rtracklayer mRNA 92828 95504 . - . Parent=GeneID:347688;ID=872;Name=TUBB8; chr10 rtracklayer exon 92828 94054 . - . Parent=872,873; chr10 rtracklayer CDS 92997 94054 . - . Parent=872,873; chr10 rtracklayer exon 94555 94665 . - . Parent=872; chr10 rtracklayer exon 94555 94665 . - . Parent=873; chr10 rtracklayer CDS 94555 94615 . - . Parent=872; chr10 rtracklayer CDS 94555 94665 . - . Parent=873; chr10 rtracklayer exon 94744 94852 . - . Parent=872; chr10 rtracklayer exon 94744 94852 . - . Parent=873; chr10 rtracklayer CDS 94744 94852 . - . Parent=873; chr10 rtracklayer exon 95122 95178 . - . Parent=873; chr10 rtracklayer CDS 95122 95178 . - . Parent=873; chr10 rtracklayer exon 95348 95504 . . . Parent=872; chr12 rtracklayer gene 87984 91263 . + . ID=GeneID:100288778;Name=LOC100288778;geneName=WAS protein family homolog 1%3B pseudogene;Alias=LOC100288778 chr12 rtracklayer mRNA 87984 91263 . + . Parent=GeneID:100288778;ID=4644;Name=LOC100288778; chr12 rtracklayer exon 87984 88017 . + . Parent=4644; chr12 rtracklayer CDS 87984 88017 . + . Parent=4644; chr12 rtracklayer exon 88257 88392 . + . Parent=4644; chr12 rtracklayer CDS 88257 88392 . + . Parent=4644; chr12 rtracklayer exon 88570 88771 . + . Parent=4644; chr12 rtracklayer CDS 88570 88771 . + . Parent=4644; chr12 rtracklayer exon 88860 89018 . + . Parent=4644; chr12 rtracklayer CDS 88860 89018 . + . Parent=4644; chr12 rtracklayer exon 89675 89827 . + . Parent=4644; chr12 rtracklayer CDS 89675 89827 . + . Parent=4644; chr12 rtracklayer exon 90587 90655 . + . Parent=4644; chr12 rtracklayer CDS 90587 90655 . + . Parent=4644; chr12 rtracklayer exon 90796 91263 . + . Parent=4644; chr12 rtracklayer CDS 90796 91263 . ? . Parent=4644; > ACCCTGACTCCAGGATTACA rtracklayer/inst/tests/gtf.gff0000644000175400017540000000250013556116552017514 0ustar00biocbuildbiocbuildMm.16.ENSMUST00000040592.1 EnsEMBL exon 22572990 22573061 . - . gene_id "ENSMUSG00000033501.1"; transcript_id "ENSMUST00000040592.1"; exon_id "ENSMUSE00000310143.1"; Mm.16.ENSMUST00000040592.1 EnsEMBL CDS 22572990 22573010 . - 0 gene_id "ENSMUSG00000033501.1"; transcript_id "ENSMUST00000040592.1"; exon_id "ENSMUSE00000310143.1"; Mm.16.ENSMUST00000040592.1 EnsEMBL start_codon 22573008 22573010 . - 0 gene_id "ENSMUSG00000033501.1"; transcript_id "ENSMUST00000040592.1"; exon_id "ENSMUSE00000310143.1"; Mm.16.ENSMUST00000040592.1 EnsEMBL exon 22568081 22568323 . - . gene_id "ENSMUSG00000033501.1"; transcript_id "ENSMUST00000040592.1"; exon_id "ENSMUSE00000310133.1"; Mm.16.ENSMUST00000040592.1 EnsEMBL CDS 22568081 22568323 . - 0 gene_id "ENSMUSG00000033501.1"; transcript_id "ENSMUST00000040592.1"; exon_id "ENSMUSE00000310133.1"; Mm.16.ENSMUST00000040592.1 EnsEMBL exon 22566859 22567246 . - . gene_id "ENSMUSG00000033501.1"; transcript_id "ENSMUST00000040592.1"; exon_id "ENSMUSE00000310124.1"; Mm.16.ENSMUST00000040592.1 EnsEMBL CDS 22566977 22567246 . - 0 gene_id "ENSMUSG00000033501.1"; transcript_id "ENSMUST00000040592.1"; exon_id "ENSMUSE00000310124.1"; Mm.16.ENSMUST00000040592.1 EnsEMBL stop_codon 22566974 22566976 . - 0 gene_id "ENSMUSG00000033501.1"; transcript_id "ENSMUST00000040592.1"; exon_id "ENSMUSE00000310124.1"; rtracklayer/inst/tests/multi.wig0000644000175400017540000000335713556116552020125 0ustar00biocbuildbiocbuild# 300 base wide bar graph, autoScale is on by default == graphing # limits will dynamically change to always show full range of data # in viewing window, priority = 20 positions this as the second graph # Note, zero-relative, half-open coordinate system in use for bed format track type=wiggle_0 name="Bed Format" description="BED format" visibility=full color=200,100,0 altColor=0,100,200 priority=20 chr19 59102000 59102300 -1.0 chr19 59102300 59102600 -0.75 chr19 59102600 59102900 -0.50 chr19 59102900 59103200 -0.25 chr19 59103200 59103500 0.0 chr19 59103500 59103800 0.25 chr19 59103800 59104100 0.50 chr19 59104100 59104400 0.75 chr19 59104400 59104700 1.00 # 150 base wide bar graph at arbitrarily spaced positions, # threshold line drawn at y=11.76 # autoScale off viewing range set to [0:25] # priority = 10 positions this as the first graph # Note, one-relative coordinate system in use for this format track type=wiggle_0 name="variableStep" description="variableStep format" visibility=full autoScale=off viewLimits=0.0:25.0 color=255,200,0 yLineMark=11.76 yLineOnOff=on priority=10 variableStep chrom=chr19 span=150 59104701 10.0 59104901 12.5 59105401 15.0 59105601 17.5 59105901 20.0 59106081 17.5 59106301 15.0 59106691 12.5 59107871 10.0 # 200 base wide points graph at every 300 bases, 50 pixel high graph # autoScale off and viewing range set to [0:1000] # priority = 30 positions this as the third graph # Note, one-relative coordinate system in use for this format track type=wiggle_0 name="fixedStep" description="fixed step" visibility=full autoScale=off viewLimits=0:1000 color=0,200,100 maxHeightPixels=100:50:20 graphType=points priority=30 fixedStep chrom=chr19 start=59107401 step=300 span=200 1000 900 800 700 600 500 400 300 200 100 rtracklayer/inst/tests/quickload/0000755000175400017540000000000013556116552020227 5ustar00biocbuildbiocbuildrtracklayer/inst/tests/quickload/T_species_Oct_2011/0000755000175400017540000000000013556116552023415 5ustar00biocbuildbiocbuildrtracklayer/inst/tests/quickload/T_species_Oct_2011/T_species_Oct_2011.2bit0000644000175400017540000000010213556116552027356 0ustar00biocbuildbiocbuildC'Atestd8úè :µˆº:ŽD‰Z‚©© ¢Å»’irtracklayer/inst/tests/quickload/T_species_Oct_2011/annots.xml0000644000175400017540000000024713556116552025444 0ustar00biocbuildbiocbuild rtracklayer/inst/tests/quickload/T_species_Oct_2011/bedData.bed.gz0000644000175400017540000000043513556116552026036 0ustar00biocbuildbiocbuild‹ÿBCmÁj!E׿+$ÛLA}ꌋٔ@é&)ýƒI*AÚ™)£ú÷÷BkÐì.çp”—–áüɧaôýkòãûËóÞ3ÿðñ¼„ïæ©ß¢à«Yé8O1-ò-¿†Ná+¤Ÿ^ñ€õåÔ§Mò11©ZÝJéìm)°ÀÞæ(™`»‡RÓˆFÜÕ„iµÊu!ëš0-m]‹5äºuM˜–鬯ZçºuM˜V+@²ƒ¿àÝOåZ6ë w5aZtÖ*×…¬k´Xƒ5äºuMW' (¼Ûä» YÝ}ô¤uÿÖÿ—òïï_r  2‚‹ÿBCrtracklayer/inst/tests/quickload/T_species_Oct_2011/bedData.bed.gz.tbi0000644000175400017540000000026513556116552026614 0ustar00biocbuildbiocbuild‹ÿBC˜íËK €0Ð-\0€nÜk¡ ¨-<ÒòQÀõ½d2ÙI6o{JÑ¥è=´Œ-˽DL-µõ>Îõs|žß2?å·/äŒ{Wqó‹ÿBCrtracklayer/inst/tests/quickload/T_species_Oct_2011/bedGraphData.bw0000644000175400017540000000000013556116552026243 0ustar00biocbuildbiocbuildrtracklayer/inst/tests/quickload/T_species_Oct_2011/mod_chromInfo.txt0000644000175400017540000000001113556116552026731 0ustar00biocbuildbiocbuildtest 100 rtracklayer/inst/tests/quickload/contents.txt0000644000175400017540000000004613556116552022625 0ustar00biocbuildbiocbuildT_species_Oct_2011 T_species_Oct_2011 rtracklayer/inst/tests/step.wig0000644000175400017540000000066013556116552017740 0ustar00biocbuildbiocbuildtrack type=wiggle_0 name="test" description="test track" visibility=full autoScale=off viewLimits=0:1000 color=0,200,100 maxHeightPixels=100:50:20 graphType=points priority=30 variableStep chrom=chr19 59104701 10.0 59104901 12.5 59105401 15.0 59105601 17.5 59105901 20.0 59106081 17.5 59106301 15.0 59106691 12.5 59107871 10.0 fixedStep chrom=chr18 start=59108021 step=300 span=200 1000 900 800 700 600 500 400 300 200 100 rtracklayer/inst/tests/test.2bit0000644000175400017540000000027213556116552020015 0ustar00biocbuildbiocbuildC'A|gi|157704452|ref|AC_000143.1| Homo sapiens chromosome 11, alternate assembly (based on HuRef), whole genome shotgun sequence‘d8úè :µˆº:ŽD‰Z‚©© ¢Å»’irtracklayer/inst/tests/test.R0000644000175400017540000000050113556116552017351 0ustar00biocbuildbiocbuildlibrary(rtracklayer) files <- dir(system.file("tests", package = "rtracklayer"), pattern = "[^R~]$", full.names=TRUE) testExport <- function(file) { track <- import(file) export(track, format = "ucsc") } options(error=recover) sapply(files, testExport) ## test GRanges imports sapply(files[-8], import) rtracklayer/inst/tests/test.bed0000644000175400017540000000133313556116552017706 0ustar00biocbuildbiocbuild##Example 5 from Custom Annotation Tracks User's Guide track name="ItemRGBDemo" description="Item RGB demonstration" visibility=2 itemRgb="On" priority=1 useScore="0" color="0,60,120" colorByStrand="0,0,255 255,0,0" group="user" offset=0 url="http://genome.ucsc.edu/foo.html?query=$$" htmlUrl="http://genome.ucsc.edu/goldenPath/help/ct_description.txt" chr7 127471196 127472363 Pos1 0 + 127471196 127472363 255,0,0 3 300,200,100 0,500,1067 chr7 127472363 127473530 Pos2 2 + 127472363 127473530 255,0,0 2 250,500 0,667 chr7 127473530 127474697 Neg1 0 - 127473530 127474697 255,0,0 1 1167 0 chr9 127474697 127475864 Pos3 5 + 127474697 127475864 255,0,0 1 1167 0 chr9 127475864 127477031 Neg2 5 - 127475864 127477031 0,0,255 1 1167 0 rtracklayer/inst/tests/test.bed150000644000175400017540000000065413556116552020061 0ustar00biocbuildbiocbuildtrack type="array" expScale=3.0 expStep=0.5 expNames="breast_A,breast_B,breast_C,cerebellum_A,cerebellum_B," name="Microarray" description="Microarray custom track" chr1 159639972 159640031 2440848 500 - 159639972 159640031 0 1 59, 0, 5 0,1,2,3,4, 0.593000,1.196000,-0.190000,-1.088000,0.093000, chr1 159640161 159640190 2440849 500 - 159640161 159640190 0 1 29, 0, 5 0,1,2,3,4, -0.906000,-1.247000,0.111000,-0.515000,-0.057000,rtracklayer/inst/tests/test.bedGraph0000644000175400017540000000070713556116552020674 0ustar00biocbuildbiocbuildtrack type=bedGraph name="bedGraph track" description="Test" visibility=full color=200,100,0 altColor=0,100,200 gridDefault=Off priority=20 alwaysZero=On yLineMark=10 windowingFunction="mean" chr19 59102000 59102300 -1.0 chr19 59102300 59102600 -0.75 chr19 59102600 59102900 -0.50 chr19 59102900 59103200 -0.25 chr19 59103200 59103500 0.0 chr19 59103500 59103800 0.25 chr17 59103800 59104100 0.50 chr18 59104100 59104400 0.75 chr18 59104400 59104700 1.00 rtracklayer/inst/tests/test.bedpe0000644000175400017540000000035713556116552020240 0ustar00biocbuildbiocbuildchr7 118965072 118965122 chr7 118970079 118970129 TUPAC_0001:3:1:0:1452#0 37 + - chr11 46765606 46765656 chr10 46769934 46769984 TUPAC_0001:3:1:0:1472#0 37 + - chr20 54704674 54704724 chr20 54708987 54709037 TUPAC_0001:3:1:1:1833#0 37 + - rtracklayer/inst/tests/test.bw0000644000175400017540000022112613556116552017570 0ustar00biocbuildbiocbuild&üˆ˜Ö*p@I'na¤a$àÁÂŒ ð¿ð?”‘@‘ŒÊxchr2í~chr19—<†xœc`€€;¬ :ŒÌÌä04ìg`pb nØR[Zxœcd``¸ÃÊÀÐÃÅÀ ÃÁÌ ,@Ñ; aÏÀàÄ öL¢à¬h$Œ *ÜÞ%ÜŒ 'xœc`€Ou†;¬ VÃ~°@ƒõ†<.Œ qU]† ,` ; ¶Ê»€äÑ Tà¬h$%-¤a%-ra2xœc`€•¹ wXA¬†ý`ë# x\ â‹6°€%ì€Ø(ï’85 öà¬h$£Â£äÁ2&üˆrtracklayer/inst/tests/test.gtf0000644000175400017540000000044613556116552017740 0ustar00biocbuildbiocbuild##gff-version 3 ##date 2011-05-17 chr1 aggregate_genes.py aggregate_gene 564418 570350 . - . aggregate_gene_id "CUFF.168931" chr1 aggregate_genes.py exonic_section 564418 565718 . - . exonic_section_number "001"; transcripts "CUFF.168931.1"; is_full_exon "True"; aggregate_gene_id "CUFF.168931"rtracklayer/inst/tests/test.xmfa0000644000175400017540000000022113556116552020102 0ustar00biocbuildbiocbuild> 1:6-15 + ST1 ACGTACGTAC > 2:1-10 + ST2 ACGTAAATAC > 3:1-9 + ST3 ACGTAC-TAA = > 1:1-5 + ST1 ACGTA > 2:11-15 + ST2 ACGTT > 3:10-14 - ST3 ACGTA = rtracklayer/inst/tests/v1.gff0000644000175400017540000000024513556116552017266 0ustar00biocbuildbiocbuildchr21 TeleGene enhancer 1000000 1011000 500 + . touch1 chr22 TeleGene promoter 1010000 1010100 900 + . touch1 chr22 TeleGene promoter 1020000 1020000 800 - . touch2 rtracklayer/inst/tests/v2.gff0000644000175400017540000000227013556116552017267 0ustar00biocbuildbiocbuild##gff-version 2 ##Type DNA Escherichia_coli_K-12_complete_genome glimmer/tico CDS 337 2799 5.347931 + . Escherichia_coli_K-12_complete_genome glimmer/tico CDS 2801 3733 11.448764 + . Escherichia_coli_K-12_complete_genome glimmer/tico CDS 3734 5020 6.230648 + . Escherichia_coli_K-12_complete_genome glimmer/tico CDS 5088 5237 3.815619 + . Escherichia_coli_K-12_complete_genome glimmer/tico REANNCDS 5310 5741 -0.111382 - . shift -21 ; note "weak tis" Escherichia_coli_K-12_complete_genome glimmer/tico CDS 5310 5720 -0.111382 - . note "weak tis" Escherichia_coli_K-12_complete_genome glimmer/tico CDS 5683 6459 0.234908 - . Escherichia_coli_K-12_complete_genome glimmer/tico CDS 6529 7959 19.75313 - . Escherichia_coli_K-12_complete_genome glimmer/tico REANNCDS 8238 9191 19.169035 + . shift 63 ; Escherichia_coli_K-12_complete_genome glimmer/tico CDS 8175 9191 19.169035 + . Escherichia_coli_K-12_complete_genome glimmer/tico REANNCDS 9306 9893 19.613488 + . shift 3 ; Escherichia_coli_K-12_complete_genome glimmer/tico CDS 9303 9893 19.613488 + . Escherichia_coli_K-12_complete_genome glimmer/tico CDS 9928 10494 4.670315 - . Escherichia_coli_K-12_complete_genome glimmer/tico CDS 10643 11356 13.285624 - .rtracklayer/inst/tests/v3.gff0000644000175400017540000000166413556116552017276 0ustar00biocbuildbiocbuildedit_test.fa . gene 500 2610 . + . ID=newGene;Alias=NewGene,new_gene edit_test.fa . mRNA 500 2385 . + . Parent=newGene;Namo=reinhard+did+this;Name=t1%28newGene%29;ID=t1;uri=http%3A//www.yahoo.com edit_test.fa . five_prime_UTR 500 802 . + . Parent=t1 edit_test.fa . CDS 803 1012 . + . Parent=t1 edit_test.fa . three_prime_UTR 1013 1168 . + . Parent=t1 edit_test.fa . three_prime_UTR 1475 1654 . + . Parent=t1 edit_test.fa . three_prime_UTR 1720 1908 . + . Parent=t1 edit_test.fa . three_prime_UTR 2047 2385 . + . Parent=t1 edit_test.fa . mRNA 1050 2610 . + . Parent=newGene;Name=t2%28newGene%29;ID=t2 edit_test.fa . CDS 1050 1196 . + . Parent=t2 edit_test.fa . CDS 1472 1651 . + . Parent=t2 edit_test.fa . CDS 1732 2610 . + . Parent=t2 edit_test.fa . mRNA 1050 2610 . + . Parent=newGene;Name=t3%28newGene%29;ID=t3 edit_test.fa . CDS 1050 1196 . + . Parent=t3 edit_test.fa . CDS 1472 1651 . + . Parent=t3 edit_test.fa . CDS 1732 2610 . + . Parent=t3 rtracklayer/inst/tests/variableStep.bw0000644000175400017540000022140513556116552021232 0ustar00biocbuildbiocbuild&üˆ˜ãp@šUÍa+bhVgÂÅÂð¿4@À€­£@‘ŒÊxchr17»¼chr19C°Íchr5 ¬Ç xœc```ÈÐÁ|üQ3É ÃÈÀÀ„ 1††ý³‚h‡ýÀº _xœcd``øóªƒ9þ{3ÉÀÄL œ`1Ç#¯A´‡ãŽ· ºÀ±áˆîq\óD/pLøáÛ|„ÈúQ÷¢8U½xœcb``8þ¨ƒùóãf “A‡‘‰,ä»à¬h$oàˆóãˆoàˆÇâˆë)üêˆ_÷ˆJÇâˆóãˆ^#xœc```ÈÐÁÌiÖÉÁä04ìg`pØÏàÀ|„!á•3#PäÏ«æiÌœ iG†@ÌäÌðà› HËñG̉Ì:Œ`û!Xì0Ã4'8Šà¬h$oàˆa8‰+boàˆa8‰ÑaZxœc```ÈÐÁ|ݬ‹9‚ ÈahØÏÀà°ŸÁùCÂ+gF ÈŸWÌ)Ž]Ìœ iG†@ÌäÌðà› HËñGÌú–]Ì:Œ`û!Xì0Ã4'pªvà¬h$oàˆ/9ŠÅÂoàˆ/9ŠkÂZ&üˆrtracklayer/inst/tests/variableStep.wig0000644000175400017540000000070013556116552021401 0ustar00biocbuildbiocbuildtrack type=wiggle_0 name="variableStep" description="variable step" visibility=full autoScale=off viewLimits=0:1000 color=0,200,100 maxHeightPixels=100:50:20 graphType=points priority=30 variableStep chrom=chr19 59104701 10.0 59104901 12.5 59105401 15.0 59105601 17.5 59105901 20.0 59106081 17.5 59106301 15.0 59106691 12.5 59107871 10.0 variableStep chrom=chr5 span=300 59102600 -0.50 variableStep chrom=chr1 span=300 59102000 -1.0 59102300 -0.75 rtracklayer/inst/unitTests/0000755000175400017540000000000013556116552017113 5ustar00biocbuildbiocbuildrtracklayer/inst/unitTests/test_bed.R0000644000175400017540000002661013556116552021034 0ustar00biocbuildbiocbuildtest_bed <- function() { test_path <- system.file("tests", package = "rtracklayer") ## Import of classic test.bed with RGB colors test_bed <- file.path(test_path, "test.bed") ## import() createCorrectGR <- function(seqinfo) { ir <- IRanges(c(127471197, 127472364, 127473531, 127474698, 127475865), width = 1167) space <- factor(rep(c("chr7", "chr9"), c(3, 2)), seqlevels(seqinfo)) blocks <- split(IRanges(c(1, 501, 1068, 1, 668, 1, 1, 1), c(300, 700, 1167, 250, 1167, 1167, 1167, 1167)), rep(seq_len(5), c(3, 2, 1, 1, 1))) names(blocks) <- NULL correct_gr <- GRanges(space, ir, strand = strand(c("+", "+", "-", "+", "-")), name = c("Pos1", "Pos2", "Neg1", "Pos3", "Neg2"), score = c(0, 2, 0, 5, 5), itemRgb = c("#FF0000", "#FF0000", "#FF0000", "#FF0000", "#0000FF"), thick = ir, blocks) seqinfo(correct_gr) <- seqinfo correct_gr } createCorrectUCSC <- function(gr) { new("UCSCData", gr, trackLine = new("BasicTrackLine", itemRgb = TRUE, name = "ItemRGBDemo", description = "Item RGB demonstration", visibility = "2", color = c(0L, 60L, 120L), priority = 1, group = "user", offset = 0L, url = "http://genome.ucsc.edu/foo.html?query=$$", htmlUrl = paste("http://genome.ucsc.edu/goldenPath/", "help/ct_description.txt", sep = ""), colorByStrand = matrix(c(0L, 0L, 255L, 255L, 0L, 0L), 3), useScore = FALSE)) } correct_gr <- createCorrectGR(Seqinfo(c("chr7", "chr9"))) correct_ucsc <- createCorrectUCSC(correct_gr) test <- import(test_bed) checkIdentical(test, correct_ucsc) test_bed_file <- BEDFile(test_bed) test <- import(test_bed_file) checkIdentical(test, correct_ucsc) checkIdentical(import(test_bed_file, format = "bed"), correct_ucsc) checkException(import(test_bed_file, format = "gff")) test_bed_con <- file(test_bed) test <- import(test_bed_con, format = "bed") checkIdentical(test, correct_ucsc) test_bed_con <- file(test_bed, "r") test <- import(test_bed_con, format = "bed") checkIdentical(test, correct_ucsc) close(test_bed_con) test_bed_con <- file(test_bed) test <- import(BEDFile(test_bed_con)) checkIdentical(test, correct_ucsc) test <- import(test_bed, trackLine = FALSE) checkIdentical(test, correct_gr) test <- import(test_bed) checkIdentical(correct_ucsc, test) if (!require(BSgenome.Hsapiens.UCSC.hg19)) { stop("'BSgenome.Hsapiens.UCSC.hg19' must be installed to run tests") } hg19_seqinfo <- SeqinfoForBSGenome("hg19") correct_genome <- createCorrectUCSC(createCorrectGR(hg19_seqinfo)) test <- import(test_bed, genome = "hg19") checkIdentical(correct_genome, test) subcols <- c("name", "thick") correct_subcols <- correct_ucsc mcols(correct_subcols) <- mcols(correct_subcols)[ , subcols] test <- import(test_bed, colnames = c(subcols, "strand")) checkIdentical(correct_subcols, test) strand(correct_subcols) <- "*" test <- import(test_bed, colnames = subcols) checkIdentical(correct_subcols, test) which <- correct_gr[1:2] correct_which <- subsetByOverlaps(correct_ucsc, which) test <- import(test_bed, which = which) checkIdentical(correct_which, test) test <- import(test_bed, format = "bed") checkIdentical(correct_ucsc, test) ## import.bed() test <- import.bed(test_bed) checkIdentical(correct_ucsc, test) test_bed_con <- pipe(paste("head -n2", test_bed)) test <- import.bed(test_bed_con) correct_empty <- new("UCSCData", GRanges(), trackLine = correct_ucsc@trackLine) seqinfo(correct_empty) <- Seqinfo() checkIdentical(test, correct_empty) ## export() ## the 'gsub' is to handle Windows paths (for later coercion to URL) test_bed_out <- gsub("\\\\", "/", file.path(tempdir(), "test.bed")) on.exit(unlink(test_bed_out)) export(correct_ucsc, test_bed_out) test <- import(test_bed_out) checkIdentical(correct_ucsc, test) export(correct_ucsc, test_bed_out, format = "bed") test <- import(test_bed_out) checkIdentical(correct_ucsc, test) test_bed_out_file <- BEDFile(test_bed_out) export(correct_ucsc, test_bed_out_file) test <- import(test_bed_out) checkIdentical(correct_ucsc, test) checkException(export(correct_ucsc, test_bed_out_file, format = "gff")) correct_ucsc2 <- initialize(correct_ucsc, trackLine = initialize(correct_ucsc@trackLine, name = "ItemRGBDemo2")) export(correct_ucsc2, test_bed_out_file, append = TRUE) test <- import(test_bed_out_file) correct_list <- GRangesList(ItemRGBDemo = correct_ucsc, ItemRGBDemo2 = correct_ucsc2, compress=FALSE) checkIdentical(correct_list, test) export(correct_ucsc, test_bed_out, name = "ItemRGBDemo2") test <- import(test_bed_out) checkIdentical(correct_ucsc2, test) test_bed_url <- paste("file:///", test_bed_out, sep = "") export(correct_ucsc, test_bed_url) test <- import(test_bed_url) checkIdentical(correct_ucsc, test) if (FALSE) { # enable to test an HTTP URL using the R help server http_pipe <- pipe("Rscript -e 'tools::startDynamicHelp(); writeLines(as.character(tools:::httpdPort)); Sys.sleep(10);' &") port <- readLines(http_pipe, n = 1) test_bed_http <- paste("http://127.0.0.1:", port, "/library/rtracklayer/doc/example.bed", sep = "") test <- import(test_bed_http) checkIdentical(correct_ucsc, test) close(http_pipe) } ## GenomicRangesList export(correct_list, test_bed_out) test <- import(test_bed_out) checkIdentical(correct_list, test) ## To/From gzip test_bed_gz <- paste(test_bed_out, ".gz", sep = "") on.exit(unlink(test_bed_gz)) export(correct_ucsc, test_bed_gz) test <- import(test_bed_gz) checkIdentical(correct_ucsc, test) export(correct_ucsc2, test_bed_gz, append = TRUE) test <- import(test_bed_gz) checkIdentical(correct_list, test) test_bed_gz_url <- paste("file:///", test_bed_gz, sep = "") export(correct_ucsc, test_bed_gz_url) test <- import(test_bed_gz_url) checkIdentical(correct_ucsc, test) ## To/From tabix test_bed_bgz <- paste(test_bed_out, ".bgz", sep = "") export(correct_ucsc, test_bed_out, index = TRUE) on.exit(unlink(paste(test_bed_bgz, ".tbi", sep = ""))) test <- import(test_bed_bgz, which = which) checkIdentical(correct_which, test) ## check TabixFile test_bed_tabix <- Rsamtools::TabixFile(test_bed_bgz) test <- import(test_bed_tabix) checkIdentical(correct_ucsc, test) ## look mom, no track line export(correct_ucsc, test_bed_out, index = TRUE, trackLine = FALSE) test <- import(test_bed_bgz, which = which) checkIdentical(subsetByOverlaps(correct_gr, which), test) #test <- import(test_bed_tabix, format = "foo") ## To/From text bed_text <- export(correct_ucsc, format = "bed") test <- import(format = "bed", text = bed_text) checkIdentical(correct_ucsc, test) ## TODO: empty text ## Using connection to add comment header test_bed_con <- file(test_bed_out) open(test_bed_con, "w") comment <- "# test comment" writeLines(comment, test_bed_con) export(correct_ucsc, test_bed_con) close(test_bed_con) checkIdentical(comment, readLines(test_bed_out, n = 1)) test <- import(test_bed_out) checkIdentical(correct_ucsc, test) ## Set offset in correct_ucsc track line, export, then: correct_offset <- shift(correct_gr, -1) correct_ucsc@trackLine@offset <- 1L export(correct_ucsc, test_bed_out) test <- import(test_bed_out, trackLine = FALSE) checkIdentical(test, correct_offset) test <- import(test_bed_out) checkIdentical(test, correct_ucsc) correct_ucsc@trackLine@offset <- 0L ## Drop all extra columns, see if it still works correct_stripped <- correct_ucsc mcols(correct_stripped) <- NULL export(correct_stripped, test_bed_out) test <- import(test_bed_out) mcols(correct_stripped)$name <- NA_character_ mcols(correct_stripped)$score <- 0 checkIdentical(test, correct_stripped) ## - and even when asking for a column like blocks: correct_blocks <- correct_ucsc mcols(correct_blocks) <- mcols(correct_blocks)[ , "blocks", drop=FALSE] test <- import(test_bed, colnames = c("blocks", "strand")) checkIdentical(test, correct_blocks) strand(correct_blocks) <- "*" test <- import(test_bed, colnames = "blocks") checkIdentical(test, correct_blocks) ## Drop the columns except for blocks, see if it still works export(correct_blocks, test_bed_out) test <- import(test_bed_out) correct_fill_to_blocks <- correct_ucsc strand(correct_fill_to_blocks) <- "*" mcols(correct_fill_to_blocks)$name <- NA_character_ mcols(correct_fill_to_blocks)$score <- 0 mcols(correct_fill_to_blocks)$itemRgb <- NA_character_ mcols(correct_fill_to_blocks)$thick <- ranges(correct_fill_to_blocks) checkIdentical(test, correct_fill_to_blocks) } test_extendedBed <- function() { # the narrowPeak format represents a variety of "BED6+N" formats # used by the ENCODE project. see # http://genome.ucsc.edu/FAQ/FAQformat.html # "This format is used to provide called peaks of signal # enrichment based on pooled, normalized (interpreted) data. # It is a BED6+4 format." file <- system.file("extdata", "demo.narrowPeak.gz", package="rtracklayer") extraCols <- c(signalValue="numeric", pValue="numeric", qValue="numeric", peak="integer") gr <- import(file, forma="bed", extraCols=extraCols, genome="hg19") checkEquals(length(gr), 6) checkEquals(colnames(mcols(gr)), c("name","score","signalValue","pValue","qValue","peak")) # make sure that all seqnames in the gr object # are also in the seqinfo(gr) object checkTrue(all(seqnames(gr) %in% names(seqinfo(gr)))) } test_bedpe <- function() { path <- system.file("tests", "test.bedpe", package="rtracklayer") nms <- c("TUPAC_0001:3:1:0:1452#0", "TUPAC_0001:3:1:0:1472#0", "TUPAC_0001:3:1:1:1833#0") gr1 <- GRanges(c("chr7", "chr11", "chr20"), IRanges(c(118965073, 46765607, 54704675), c(118965122, 46765656, 54704724)), strand="+") gr2 <- GRanges(c("chr7", "chr10", "chr20"), IRanges(c(118970080, 46769935, 54708988), c(118970129, 46769984, 54709037)), strand="-") seqlevels(gr1) <- union(seqlevels(gr1), seqlevels(gr2)) seqlevels(gr2) <- seqlevels(gr1) pairs <- Pairs(gr1, gr2, name=nms, score=37) bedpe <- import(path) checkIdentical(pairs, bedpe) # test export test_bedpe_out <- file.path(tempdir(), "test.bedpe") on.exit(unlink(test_bedpe_out)) export(bedpe, test_bedpe_out) test <- import(test_bedpe_out) checkIdentical(bedpe, test) bedpe2 <- bedpe mcols(bedpe2)$qvalue <- c(0.02, 0.03, 0.05) mcols(bedpe2)$annotation <- c("promoter", "enhancer", "intron") # test extended bedpe test_bedpe2_out <- file.path(tempdir(), "test2.bedpe") on.exit(unlink(test_bedpe2_out)) export(bedpe2, test_bedpe2_out) test <- import(test_bedpe2_out, extraCols=c(qvalue="numeric", annotation="character")) checkIdentical(bedpe2, test) } rtracklayer/inst/unitTests/test_bedGraph.R0000644000175400017540000001117013556116552022011 0ustar00biocbuildbiocbuildtest_bedGraph <- function() { test_path <- system.file("tests", package = "rtracklayer") test_bg <- file.path(test_path, "test.bedGraph") createCorrectGR <- function(si) { part <- PartitioningByWidth(rep(300, 9)) ir <- shift(IRanges(start(part), end(part)), 59102000) score <- seq(-1, 1, by = 0.25) space <- factor(c(rep("chr19", 6), "chr17", rep("chr18", 2)), seqlevels(si)) correct_gr <- GRanges(space, ir, score = score) if (!any(is.na(genome(si)))) genome(correct_gr) <- unname(genome(si)[1]) seqinfo(correct_gr) <- si correct_gr } createCorrectUCSC <- function(gr) { track_line <- new("GraphTrackLine", type = "bedGraph", name = "bedGraph track", description = "Test", visibility = "full", alwaysZero = TRUE, gridDefault = FALSE, yLineMark = 10, windowingFunction = "mean", color = c(200L, 100L, 0L), altColor = c(0L, 100L, 200L), priority = 20) new("UCSCData", gr, trackLine = track_line) } correct_gr <- createCorrectGR(Seqinfo(c("chr19", "chr17", "chr18"))) correct_ucsc <- createCorrectUCSC(correct_gr) ## TEST: basic import test <- import(test_bg) checkIdentical(correct_ucsc, test) test <- import.bedGraph(test_bg) checkIdentical(correct_ucsc, test) test_bg_file <- BEDGraphFile(test_bg) checkException(import(test_bg_file, format = "wig")) test <- import(test_bg_file, format = "bedGraph") checkIdentical(correct_ucsc, test) test <- import(test_bg_file) checkIdentical(correct_ucsc, test) test_bg_con <- file(test_bg) test <- import(test_bg_con, format = "wig") checkIdentical(correct_ucsc, test) test_bg_con <- file(test_bg) test <- import(WIGFile(test_bg_con)) checkIdentical(correct_ucsc, test) ## TEST: 'genome' hg19_seqinfo <- SeqinfoForBSGenome("hg19") correct_genome <- createCorrectUCSC(createCorrectGR(hg19_seqinfo)) test <- import(test_bg, genome = "hg19") checkIdentical(correct_genome, test) ## TEST: trackLine = FALSE test <- import(test_bg, trackLine = FALSE) checkIdentical(correct_gr, test) ## TEST: which correct_which <- subsetByOverlaps(correct_ucsc, correct_gr[3:4]) test <- import(test_bg, which = correct_which) checkIdentical(correct_which, test) ## TEST: basic export test_bg_out <- file.path(tempdir(), "test.bedGraph") on.exit(unlink(test_bg_out)) export(correct_ucsc, test_bg_out) test <- import(test_bg_out) checkIdentical(correct_ucsc, test) export.bedGraph(correct_ucsc, test_bg_out) test <- import(test_bg_out) checkIdentical(correct_ucsc, test) test_foo_out <- file.path(tempdir(), "test.foo") export(correct_ucsc, test_foo_out, format = "bedGraph") on.exit(unlink(test_foo_out)) test <- import(test_bg_out) checkIdentical(correct_ucsc, test) test_bg_out_file <- BEDGraphFile(test_bg_out) export(correct_ucsc, test_bg_out_file) test <- import(test_bg_out) checkIdentical(correct_ucsc, test) checkException(export(correct_ucsc, test_bg_out_file, format = "gff")) ## TEST: append correct_ucsc2 <- initialize(correct_ucsc, trackLine = initialize(correct_ucsc@trackLine, name = "test2")) export(correct_ucsc2, test_bg_out_file, append = TRUE) test <- import(test_bg_out_file) correct_list <- GRangesList("bedGraph track" = correct_ucsc, test2 = correct_ucsc2, compress = FALSE) checkIdentical(correct_list, test) ## TEST: track line parameters export(correct_ucsc, test_bg_out, name = "test2") test <- import(test_bg_out) checkIdentical(correct_ucsc2, test) ## TEST: export trackLine export(correct_ucsc, test_bg_out, trackLine = FALSE) test <- import(test_bg_out) checkIdentical(test, correct_gr) ## TEST: SimpleGRangesList export(correct_list, test_bg_out) test <- import(test_bg_out) checkIdentical(correct_list, test) ## TEST: gzip test_bg_gz <- paste(test_bg_out, ".gz", sep = "") on.exit(unlink(test_bg_gz)) export(correct_ucsc, test_bg_gz) test <- import(test_bg_gz) checkIdentical(correct_ucsc, test) export(correct_ucsc2, test_bg_gz, append = TRUE) test <- import(test_bg_gz) checkIdentical(correct_list, test) ## TEST: Using connection to add comment header test_bg_con <- file(test_bg_out) open(test_bg_con, "w") comment <- "# test comment" writeLines(comment, test_bg_con) export(correct_ucsc, test_bg_con) close(test_bg_con) checkIdentical(comment, readLines(test_bg_out, n = 1)) test <- import(test_bg_out) checkIdentical(correct_ucsc, test) } rtracklayer/inst/unitTests/test_bw.R0000644000175400017540000000570013556116552020707 0ustar00biocbuildbiocbuildtest_bw <- function() { if (.Platform$OS.type == "windows") return() test_path <- system.file("tests", package = "rtracklayer") test_bw <- file.path(test_path, "test.bw") ir <- as(PartitioningByWidth(rep(300, 9)), "IRanges") space <- factor(c(rep("chr2", 5), rep("chr19", 4)), c("chr2", "chr19")) score <- seq(-1, 1, length = 9) correct_fixed <- GRanges(space, ir, score = score) si <- SeqinfoForBSGenome("hg19") seqlengths(correct_fixed) <- seqlengths(si)[levels(space)] test <- import(test_bw) checkIdentical(test, correct_fixed) test_bw_out <- file.path(tempdir(), "test_out.bw") export(correct_fixed, test_bw_out) on.exit(unlink(test_bw_out)) test <- import(test_bw_out) checkIdentical(test, correct_fixed) export.bw(correct_fixed, test_bw_out) test <- import.bw(test_bw_out) checkIdentical(test, correct_fixed) correct_bedgraph <- correct_fixed width(correct_bedgraph) <- seq(1, 300, length = 9) export(correct_bedgraph, test_bw_out) test <- import(test_bw_out) checkIdentical(test, correct_bedgraph) ## TEST: 'which' which <- GRanges(c("chr2", "chr2"), IRanges(c(1, 300), c(400, 1000))) correct_which <- subsetByOverlaps(correct_bedgraph, which) ranges(correct_which) <- ranges(intersect(correct_which, which)) test <- import(test_bw_out, which = which) checkIdentical(test, correct_which) ## TEST: BigWigSelection (range, no score) test <- import(test_bw_out, selection = BigWigSelection(which, colnames = character())) correct_which <- correct_which[, character()] checkIdentical(test, correct_which) ## TEST: empty which which <- GRanges() correct_which <- subsetByOverlaps(correct_bedgraph, which) test <- import(test_bw_out, which = which) checkIdentical(test, correct_which) ## TEST: non-UCSC naming correct_ncbi <- correct_bedgraph seqlevels(correct_ncbi) <- sub("chr", "", seqlevels(correct_ncbi)) export(correct_ncbi, test_bw_out) test <- import(test_bw_out) checkIdentical(test, correct_ncbi) ## TEST: as="RleList" correct_cov <- coverage(correct_ncbi, weight="score") test <- import(test_bw_out, as="RleList") checkIdentical(correct_cov, test) ## TEST: export RleList export(correct_cov, test_bw_out) test <- import(test_bw_out, as="RleList") checkIdentical(correct_cov, test) ## TEST: export/import NumericList correct_cov_short <- correct_cov[correct_cov != 0L] correct_int <- as(correct_cov_short, "NumericList") which <- GRanges(names(correct_int), IRanges(1, elementNROWS(correct_int))) names(which) <- names(correct_int) metadata(correct_int) <- list(ranges=which) export(correct_int, test_bw_out) test <- import(test_bw_out, as="NumericList") checkIdentical(correct_int, test) test <- import(test_bw_out, which=which[1], as="NumericList") checkIdentical(elementNROWS(correct_int[1]), elementNROWS(test)) test <- import(test_bw_out, which=which[1:2], as="NumericList") checkIdentical(correct_int, test) } rtracklayer/inst/unitTests/test_gff.R0000644000175400017540000002045013556116552021040 0ustar00biocbuildbiocbuildtest_gff <- function() { test_path <- system.file("tests", package = "rtracklayer") space <- c(rep("chr10", 15), rep("chr12", 16)) start <- c(rep(92828, 4), 92997, rep(94555, 4), rep(94744, 3), rep(95122, 2), 95348, rep(87984, 4), rep(c(88257, 88570, 88860, 89675, 90587, 90796), each = 2)) end <- c(95504, 95178, 95504, rep(94054, 2), rep(94665, 2), 94615, 94665, rep(94852, 3), rep(95178, 2), 95504, rep(c(91263, 88017, 88392, 88771, 89018, 89827, 90655, 91263), each = 2)) type <- c("gene", "mRNA", "mRNA", "exon", "CDS", "exon", "exon", "CDS", "CDS", "exon", "exon", "CDS", "exon", "CDS", "exon", "gene", "mRNA", "exon", "CDS", "exon", "CDS", "exon", "CDS", "exon", "CDS", "exon", "CDS", "exon", "CDS", "exon", "CDS") type <- factor(type, unique(type)) source <- factor("rtracklayer") phase <- NA_integer_ score <- c(5, rep(NA, length(type) - 1L)) strand <- strand(c(rep("-", 14), "*", rep("+", 15), "*")) Alias <- CharacterList(c(list(c("FLJ40100", "TUBB8")), rep(list(character()), 14), "LOC100288778", rep(list(character()), 15))) ID <- c("GeneID:347688", "873", "872", rep(NA, 12), "GeneID:100288778", "4644", rep(NA, 14)) Name <- c(rep("TUBB8", 3), rep(NA, 12), rep("LOC100288778", 2), rep(NA, 14)) Parent <- CharacterList(c(list(character()), rep("GeneID:347688", 2), rep(list(c("872", "873")), 2), rep(c("872", "873"), 3), rep("873", 3), "872", list(character()), "GeneID:100288778", rep("4644", 14))) geneName <- c("tubulin, beta 8", rep(NA, 14), "WAS protein family homolog 1; pseudogene", rep(NA, 15)) genome <- c("hg19", rep(NA, length(geneName) - 1)) correct_gff3 <- GRanges(space, IRanges(start, end), strand, source, type, score, phase, ID, Name, geneName, Alias, genome, Parent) seqinfo(correct_gff3) <- Seqinfo(c("chr10", "chr12")) correct_gff1 <- correct_gff3[,c("source", "type", "score", "phase")] correct_gff1$group <- as.factor(seqnames(correct_gff3)) correct_gff2 <- correct_gff3 toCSV <- function(x) { csv <- sapply(x, paste, collapse = ",") csv[nchar(csv) == 0] <- NA csv } correct_gff2$Alias <- toCSV(correct_gff2$Alias) correct_gff2$Parent <- toCSV(correct_gff2$Parent) ## TEST: basic GFF3 import test_gff3 <- file.path(test_path, "genes.gff3") test <- import(test_gff3) checkIdentical(correct_gff3, test) ## TEST: import.gff* test <- import.gff(test_gff3) checkIdentical(correct_gff3, test) test <- import.gff3(test_gff3) checkIdentical(correct_gff3, test) #suppressWarnings(test <- import.gff2(test_gff3)) #checkIdentical(correct_gff3, test) oldOpts <- options(warn = 2) checkException(import.gff2(test_gff3)) options(oldOpts) ## TEST: GFF(3)File test_gff_file <- GFF3File(test_gff3) test <- import(test_gff_file) checkIdentical(correct_gff3, test) test_gff_file <- GFFFile(test_gff3) test <- import(test_gff_file) checkIdentical(correct_gff3, test) test_gff_file <- GFFFile(test_gff3, version = "3") test <- import(test_gff_file) checkIdentical(correct_gff3, test) test_gff_file <- GFF2File(test_gff3) #suppressWarnings(test <- import(test_gff_file)) #checkIdentical(correct_gff3, test) oldOpts <- options(warn = 2) checkException(test <- import(test_gff_file)) options(oldOpts) ## TEST: 'gff' extension test_gff_out <- file.path(tempdir(), "genes.gff") on.exit(unlink(test_gff_out)) export(correct_gff3, test_gff_out) test <- import(test_gff_out) checkIdentical(test, correct_gff1) export(correct_gff3, test_gff_out, version = "1") test <- import(test_gff_out) checkIdentical(test, correct_gff1) export(correct_gff3, test_gff_out, version = "2") test <- import(test_gff_out) checkIdentical(test, correct_gff2) export(correct_gff3, test_gff_out, version = "3") test <- import(test_gff_out) checkIdentical(test, correct_gff3) test <- import(GFF3File(test_gff_out)) checkIdentical(test, correct_gff3) test <- import(GFFFile(test_gff_out)) checkIdentical(test, correct_gff3) test <- import(test_gff_out, version = "3") checkIdentical(test, correct_gff3) #suppressWarnings(test <- import(test_gff_out, version = "2")) #checkIdentical(test, correct_gff3) oldOpts <- options(warn = 2) checkException(test <- import(test_gff_out, version = "2")) options(oldOpts) ## TEST: 'gff2' extension test_gff2_out <- file.path(tempdir(), "genes.gff2") export(correct_gff3, test_gff2_out) test <- import(test_gff2_out) checkIdentical(test, correct_gff2) ## TEST: 'gff1' extension test_gff1_out <- file.path(tempdir(), "genes.gff1") export(correct_gff3, test_gff1_out) test <- import(test_gff1_out) checkIdentical(test, correct_gff1) ## TEST: 'format' argument test_gff_file <- GFF3File(test_gff3) test <- import(test_gff_file, format = "gff") checkIdentical(test, correct_gff3) test <- import(test_gff_file, format = "gff3") checkIdentical(test, correct_gff3) checkException(import(test_gff_file, format = "gff2")) checkException(import(test_gff_file, format = "bed")) ## TEST: 'genome' si_hg19 <- SeqinfoForBSGenome("hg19") correct_hg19 <- correct_gff3 seqlevels(correct_hg19) <- seqlevels(si_hg19) seqinfo(correct_hg19) <- si_hg19 test <- import(test_gff3, genome = "hg19") checkIdentical(test, correct_hg19) test_gff3_out <- file.path(tempdir(), "genes.gff3") on.exit(unlink(test_gff3_out)) correct_genome_hg19 <- correct_gff3 genome(correct_genome_hg19) <- "hg19" correct_genome_hg19 <- as(correct_genome_hg19, "GRanges") export(correct_genome_hg19, test_gff3_out) test <- import(test_gff3_out) checkIdentical(test, correct_hg19) ## TEST: colnames empty, colnames := "geneName" test <- import(test_gff3, colnames = character()) target <- correct_gff3[,character()] checkIdentical(target, test) test <- import(test_gff3, colnames = "geneName") target <- correct_gff3[,"geneName"] checkIdentical(target, test) ## TEST: import from connection test_gff_con <- file(test_gff_out) test <- import(test_gff_con, format = "gff") checkIdentical(correct_gff3, test) ## TEST: export to connection, with preceding comment test_gff_con <- file(test_gff_out) open(test_gff_con, "w") comment <- "# test comment" writeLines(comment, test_gff_con) export(correct_gff3, test_gff_con, version = "3") close(test_gff_con) checkIdentical(comment, readLines(test_gff_out, n = 1)) test <- import(test_gff_out) checkIdentical(correct_gff3, test) ## TEST: 'append' export(correct_gff3[seqnames(correct_gff3) == "chr10", ], test_gff3_out) export(correct_gff3[seqnames(correct_gff3) == "chr12", ], test_gff3_out, append = TRUE) test <- import(test_gff3_out) checkIdentical(correct_gff3, test) ## TEST: 'source' target <- correct_gff3 mcols(target)$source <- factor("test") export(correct_gff3, test_gff3_out, source = "test") test <- import(test_gff3_out) checkIdentical(target, test) ## TEST: 'which' which <- GRanges("chr10:90000-93000") which_target <- subsetByOverlaps(correct_gff3, which) test <- import(test_gff3, which = which) checkIdentical(which_target, test) ## TEST: 'index' export(correct_gff3, test_gff3_out, index = TRUE) test_gff_bgz <- paste(test_gff3_out, ".bgz", sep = "") on.exit(unlink(test_gff_bgz)) on.exit(unlink(paste(test_gff_bgz, ".tbi", sep = ""))) test <- import(test_gff_bgz, which = which) checkIdentical(which_target, test) ## TEST: SimpleGRangesList ucsc_data1 <- new("UCSCData", keepSeqlevels(correct_gff3, "chr10", pruning.mode="coarse"), trackLine = new("BasicTrackLine", name = "chr10")) ucsc_data2 <- new("UCSCData", keepSeqlevels(correct_gff3, "chr12", pruning.mode="coarse"), trackLine = new("BasicTrackLine", name = "chr12")) correct_grl <- GRangesList(ucsc_data1, ucsc_data2, compress=FALSE) mcols(correct_grl[[2]])$genome <- NULL names(correct_grl) <- seqlevels(correct_gff3) export(correct_grl, test_gff3_out) test <- import.ucsc(test_gff3_out) checkIdentical(correct_grl, test) } rtracklayer/inst/unitTests/test_twoBit.R0000644000175400017540000000440313556116552021546 0ustar00biocbuildbiocbuildtest_twoBit <- function() { test_path <- system.file("tests", package = "rtracklayer") test_2bit <- file.path(test_path, "test.2bit") correct_name <- "gi|157704452|ref|AC_000143.1|" correct_seq <- "TGATGGAAGAATTATTTGAAAGCCATATAGAATGAAATGACTCTATACCCAAATTAAAACTCAAAAACTTACTCAAAATAGTCCAGAGACTACAACTTCA" correct_char <- setNames(correct_seq, correct_name) correct_2bit <- Biostrings::DNAStringSet(correct_char) ## TEST: basic import test <- import(test_2bit) checkIdentical(test, correct_2bit) ## TEST: basic export, import test_2bit_out <- file.path(tempdir(), "test_out.2bit") export(correct_2bit, test_2bit_out) on.exit(unlink(test_2bit_out)) test <- import(test_2bit_out) checkIdentical(test, correct_2bit) ## TEST: twoBit extension test_twoBit_out <- file.path(tempdir(), "test_out.twoBit") export(correct_2bit, test_twoBit_out) on.exit(unlink(test_twoBit_out)) test <- import(test_twoBit_out) checkIdentical(test, correct_2bit) ## TEST: character export export(correct_char, test_2bit_out) test <- import(test_2bit_out) checkIdentical(test, correct_2bit) ## TEST: 'which' which_range <- IRanges(c(10, 40), c(30, 42)) correct_which <- correct_2bit[[1]][which_range] which <- GRanges(names(correct_2bit), which_range) test <- import(test_2bit_out, which = which) checkIdentical(unlist(test), correct_which) ## TEST: getSeq() with negative strand which rc_which <- which strand(rc_which)[1L] <- "-" test <- getSeq(TwoBitFile(test_2bit_out), which = rc_which) rc_correct_which <- correct_which rc_correct_which[1L] <- Biostrings::reverseComplement(rc_correct_which[1L]) checkIdentical(unlist(test), rc_correct_which) ## TEST: empty which which_range <- IRanges() correct_which <- Biostrings::DNAStringSet() which <- GRanges(character(), which_range) test <- import(test_2bit_out, which = which) checkIdentical(as.character(test), as.character(correct_which)) ## TEST: which with empty range which_range <- IRanges(1, 0) which <- GRanges(names(correct_2bit), which_range) test <- import(test_2bit_out, which = which) checkIdentical(unlist(correct_which), unlist(test)) ## TEST: invalid characters invalid_2bit <- paste0(correct_char, "L") checkException(export(invalid_2bit, test_2bit_out)) } rtracklayer/inst/unitTests/test_wig.R0000644000175400017540000001302513556116552021064 0ustar00biocbuildbiocbuildtest_wig <- function() { test_path <- system.file("tests", package = "rtracklayer") test_wig <- file.path(test_path, "step.wig") createCorrectGR <- function(si) { score <- c(seq(10, 20, by = 2.5), seq(17.5, 10, by = -2.5), seq(1000, 100, by = -100)) start <- c(59104701 + cumsum(c(0, 200, 500, 200, 300, 180, 220, 390, 1180)), 59108021 + cumsum(c(0, rep(300, 9)))) width <- c(rep(1, 9), rep(200, 10)) space <- factor(c(rep("chr19", 9), rep("chr18", 10)), seqlevels(si)) correct_gr <- GRanges(space, IRanges(start, width = width), score = score) if (!any(is.na(genome(si)))) genome(correct_gr) <- unname(genome(si)[1]) seqinfo(correct_gr) <- si correct_gr } createCorrectUCSC <- function(gr) { track_line <- new("GraphTrackLine", type = "wig", name = "test", description = "test track", visibility = "full", autoScale = FALSE, viewLimits = c(0, 1000), color = c(0L, 200L, 100L), maxHeightPixels = c(100L, 50L, 20L), graphType = "points", priority = 30) new("UCSCData", gr, trackLine = track_line) } correct_gr <- createCorrectGR(Seqinfo(c("chr19", "chr18"))) correct_ucsc <- createCorrectUCSC(correct_gr) ## TEST: basic import test <- import(test_wig) checkIdentical(correct_ucsc, test) test <- import.wig(test_wig) checkIdentical(correct_ucsc, test) test_wig_file <- WIGFile(test_wig) checkException(import(test_wig_file, format = "bed")) test <- import(test_wig_file, format = "wig") checkIdentical(correct_ucsc, test) test <- import(test_wig_file) checkIdentical(correct_ucsc, test) test_wig_con <- file(test_wig) test <- import(test_wig_con, format = "wig") checkIdentical(correct_ucsc, test) test_wig_con <- file(test_wig) test <- import(WIGFile(test_wig_con)) checkIdentical(correct_ucsc, test) ## TEST: 'genome' hg19_seqinfo <- SeqinfoForBSGenome("hg19") correct_genome <- createCorrectUCSC(createCorrectGR(hg19_seqinfo)) test <- import(test_wig, genome = "hg19") checkIdentical(correct_genome, test) ## TEST: trackLine = FALSE test <- import(test_wig, trackLine = FALSE) checkIdentical(correct_gr, test) ## TEST: which which <- correct_gr[3:4] correct_which <- subsetByOverlaps(correct_ucsc, which) test <- import(test_wig, which = which) checkIdentical(correct_which, test) ## TEST: basic export test_wig_out <- file.path(tempdir(), "test.wig") on.exit(unlink(test_wig_out)) export(correct_ucsc, test_wig_out) test <- import(test_wig_out) checkIdentical(correct_ucsc, test) export.wig(correct_ucsc, test_wig_out) test <- import(test_wig_out) checkIdentical(correct_ucsc, test) test_foo_out <- file.path(tempdir(), "test.foo") export(correct_ucsc, test_foo_out, format = "wig") on.exit(unlink(test_foo_out)) test <- import(test_wig_out) checkIdentical(correct_ucsc, test) test_wig_out_file <- WIGFile(test_wig_out) export(correct_ucsc, test_wig_out_file) test <- import(test_wig_out) checkIdentical(correct_ucsc, test) checkException(export(correct_ucsc, test_wig_out_file, format = "gff")) ## TEST: append correct_ucsc2 <- initialize(correct_ucsc, trackLine = initialize(correct_ucsc@trackLine, name = "test2")) export(correct_ucsc2, test_wig_out_file, append = TRUE) test <- import(test_wig_out_file) correct_list <- GRangesList(test = correct_ucsc, test2 = correct_ucsc2, compress = FALSE) checkIdentical(correct_list, test) ## TEST: track line parameters export(correct_ucsc, test_wig_out, name = "test2") test <- import(test_wig_out) checkIdentical(correct_ucsc2, test) ## TEST: export trackLine export(correct_ucsc, test_wig_out, trackLine = FALSE) test <- import(test_wig_out) checkIdentical(test, correct_gr) ## TEST: Plain GRanges / bedGraph export.ucsc(correct_gr, test_wig_out) # mixture of steps leads to bedGraph test <- import(test_wig_out) default_line <- new("GraphTrackLine", name = "R Track", type = "bedGraph") correct_default <- new("UCSCData", correct_gr, trackLine = default_line) checkIdentical(test, correct_default) correct_chr18 <- keepSeqlevels(correct_gr, "chr18", pruning.mode="coarse") export.ucsc(correct_chr18, test_wig_out) test <- import(test_wig_out) default_line <- new("GraphTrackLine", name = "R Track", type = "wig") correct_default <- new("UCSCData", keepSeqlevels(correct_gr, "chr18", pruning.mode="coarse"), trackLine = default_line) checkIdentical(test, correct_default) ## TEST: GenomicRangesList export(correct_list, test_wig_out) test <- import(test_wig_out) checkIdentical(correct_list, test) ## TEST: gzip test_wig_gz <- paste(test_wig_out, ".gz", sep = "") on.exit(unlink(test_wig_gz)) export(correct_ucsc, test_wig_gz) test <- import(test_wig_gz) checkIdentical(correct_ucsc, test) export(correct_ucsc2, test_wig_gz, append = TRUE) test <- import(test_wig_gz) checkIdentical(correct_list, test) ## TEST: Using connection to add comment header test_wig_con <- file(test_wig_out) open(test_wig_con, "w") comment <- "# test comment" writeLines(comment, test_wig_con) export(correct_ucsc, test_wig_con) close(test_wig_con) checkIdentical(comment, readLines(test_wig_out, n = 1)) test <- import(test_wig_out) checkIdentical(correct_ucsc, test) } rtracklayer/load.R0000644000175400017540000000063113556116552015176 0ustar00biocbuildbiocbuildlibrary(RCurl) library(XML) library(GenomicRanges) library(rJava) files <- c("web.R", "range.R", "trackSet.R", "browser.R", "gff.R", "ucsc.R", "bed.R", "wig.R", "io.R") sapply(files, source) #track <- import(system.file("inst", "test", "v1.gff", package = "rtracklayer")) track <- import("../inst/tests/bed.wig") track@genome <- "hg18" session <- browserSession("ucsc") layTrack(session, track) rtracklayer/man/0000755000175400017540000000000013556116552014707 5ustar00biocbuildbiocbuildrtracklayer/man/BEDFile-class.Rd0000644000175400017540000003177213556116552017505 0ustar00biocbuildbiocbuild\name{BEDFile-class} \docType{class} %% Classes: \alias{class:BEDFile} \alias{class:BED15File} \alias{class:BEDGraphFile} \alias{class:NarrowPeakFile} \alias{class:BroadPeakFile} \alias{BEDFile-class} \alias{BED15File-class} \alias{BEDGraphFile-class} \alias{BEDPEFile-class} \alias{NarrowPeakFile-class} \alias{BroadPeakFile-class} %% Constructor: \alias{BEDFile} \alias{BED15File} \alias{BEDGraphFile} \alias{BEDPEFile} \alias{NarrowPeakFile} \alias{BroadPeakFile} %% Import: \alias{import,BEDFile,ANY,ANY-method} \alias{import,BED15File,ANY,ANY-method} \alias{import,BEDPEFile,ANY,ANY-method} \alias{import,NarrowPeakFile,ANY-method} \alias{import,BroadPeakFile,ANY-method} \alias{import,NarrowPeakFile,ANY,ANY-method} \alias{import,BroadPeakFile,ANY,ANY-method} \alias{import.bed} \alias{import.bed,ANY-method} \alias{import.bed15} \alias{import.bed15,ANY-method} \alias{import.bedGraph} \alias{import.bedGraph,ANY-method} \alias{import.NarrowPeak} \alias{import.NarrowPeak,ANY-method} \alias{import.BroadPeak} \alias{import.BroadPeak,ANY-method} %% Export: \alias{export,ANY,BEDFile,ANY-method} \alias{export,GenomicRanges,BEDFile,ANY-method} \alias{export,GRangesList,BEDFile,ANY-method} \alias{export,GenomicRangesList,BEDFile,ANY-method} \alias{export,UCSCData,BEDFile,ANY-method} \alias{export,GenomicRanges,BED15File,ANY-method} \alias{export,ANY,BEDPEFile,ANY-method} \alias{export,Pairs,BEDPEFile,ANY-method} \alias{export,UCSCData,BED15File,ANY-method} \alias{export.bed} \alias{export.bed,ANY-method} \alias{export.bed15} \alias{export.bed15,ANY-method} \alias{export.bedGraph} \alias{export.bedGraph,ANY-method} \title{BEDFile objects} \description{ These functions support the import and export of the UCSC BED format and its variants, including BEDGraph. } \usage{ \S4method{import}{BEDFile,ANY,ANY}(con, format, text, trackLine = TRUE, genome = NA, colnames = NULL, which = NULL, seqinfo = NULL, extraCols = character(), sep = c("\t", ""), na.strings=character(0L)) import.bed(con, ...) import.bed15(con, ...) import.bedGraph(con, ...) \S4method{export}{ANY,BEDFile,ANY}(object, con, format, ...) \S4method{export}{GenomicRanges,BEDFile,ANY}(object, con, format, append = FALSE, index = FALSE, ignore.strand = FALSE, trackLine = NULL) \S4method{export}{UCSCData,BEDFile,ANY}(object, con, format, trackLine = TRUE, ...) export.bed(object, con, ...) export.bed15(object, con, ...) \S4method{export}{GenomicRanges,BED15File,ANY}(object, con, format, expNames = NULL, trackLine = NULL, ...) export.bedGraph(object, con, ...) } \arguments{ \item{con}{A path, URL, connection or \code{BEDFile} object. For the functions ending in \code{.bed}, \code{.bedGraph} and \code{.bed15}, the file format is indicated by the function name. For the base \code{export} and \code{import} functions, the format must be indicated another way. If \code{con} is a path, URL or connection, either the file extension or the \code{format} argument needs to be one of \dQuote{bed}, \dQuote{bed15}, \dQuote{bedGraph}, \dQuote{bedpe}, \dQuote{narrowPeak}, or \dQuote{broadPeak}. Compressed files (\dQuote{gz}, \dQuote{bz2} and \dQuote{xz}) are handled transparently. } \item{object}{The object to export, should be a \code{GRanges} or something coercible to a \code{GRanges}. If targeting the BEDPE format, this should be something coercible to \code{Pairs}. If the object has a method for \code{asBED} (like \code{GRangesList}), it is called prior to coercion. This makes it possible to export a \code{GRangesList} or \code{TxDb} in a way that preserves the hierarchical structure. For exporting multiple tracks, in the UCSC track line metaformat, pass a \code{GenomicRangesList}, or something coercible to one. } \item{format}{If not missing, should be one of \dQuote{bed}, \dQuote{bed15}, \dQuote{bedGraph}, \dQuote{bedpe}, \dQuote{narrowPeak} or \dQuote{broadPeak}.} \item{text}{If \code{con} is missing, a character vector to use as the input} \item{trackLine}{For import, an imported track line will be stored in a \code{\linkS4class{TrackLine}} object, as part of the returned \code{\linkS4class{UCSCData}}. For the UCSCData method on export, whether to output the UCSC track line stored on the object, for the other export methods, the actual TrackLine object to export. } \item{genome}{The identifier of a genome, or a \code{Seqinfo}, or \code{NA} if unknown. Typically, this is a UCSC identifier like \dQuote{hg19}. An attempt will be made to derive the \code{seqinfo} on the return value using either an installed BSgenome package or UCSC, if network access is available. } \item{colnames}{A character vector naming the columns to parse. These should name columns in the result, not those in the BED spec, so e.g. specify \dQuote{thick}, instead of \dQuote{thickStart}. } \item{which}{A \code{GRanges} or other range-based object supported by \code{\link[IRanges]{findOverlaps}}. Only the intervals in the file overlapping the given ranges are returned. This is much more efficient when the file is indexed with the tabix utility. } \item{index}{If \code{TRUE}, automatically compress and index the output file with bgzf and tabix. Note that tabix indexing will sort the data by chromosome and start. Tabix supports a single track in a file. } \item{ignore.strand}{Whether to output the strand when not required (by the existence of later fields). } \item{seqinfo}{If not \code{NULL}, the \code{Seqinfo} object to set on the result. Ignored if \code{genome} is a \code{Seqinfo} object. If the \code{genome} argument is not \code{NA}, it must agree with \code{genome(seqinfo)}. } \item{extraCols}{A character vector in the same form as \code{colClasses} from \code{\link{read.table}}. It should indicate the name and class of each extra/special column to read from the BED file. As BED does not encode column names, these are assumed to be the last columns in the file. This enables parsing of the various BEDX+Y formats. } \item{sep}{A character vector with a single character indicating the field separator, like \code{read.table}. This defaults to \code{"\t"}, as BEDtools requires, but BED files are also allowed to be whitespace separated (\code{""}) according to the UCSC spec. } \item{na.strings}{Character vector with strings, appended to the standard \code{"."}, that represent an \code{NA} value. } \item{append}{If \code{TRUE}, and \code{con} points to a file path, the data is appended to the file. Obviously, if \code{con} is a connection, the data is always appended. } \item{expNames}{character vector naming columns in \code{mcols(object)} to export as data columns in the BED15 file. These correspond to the sample names in the experiment. If \code{NULL} (the default), there is an attempt to extract these from \code{trackLine}. If the attempt fails, no scores are exported. } \item{...}{Arguments to pass down to methods to other methods. For import, the flow eventually reaches the \code{BEDFile} method on \code{import}. When \code{trackLine} is \code{TRUE} or the target format is BED15, the arguments are passed through \code{export.ucsc}, so track line parameters are supported. } } \value{ For a \dQuote{bedpe} file, a \code{Pairs} object combining two \code{GRanges}. The \code{name} and \code{score} are carried over to the metadata columns. Otherwise, a \code{GRanges} with the metadata columns described in the details. } \details{ The BED format is a tab-separated table of intervals, with annotations like name, score and even sub-intervals for representing alignments and gene models. Official (UCSC) child formats currently include BED15 (adding a number matrix for e.g. expression data across multiple samples) and BEDGraph (a compressed means of storing a single score variable, e.g. coverage; overlapping features are not allowed). Many tools and organizations have extended the BED format with additional columns for particular use cases. The advantage of BED is its balance between simplicity and expressiveness. It is also relatively scalable, because only the first three columns (chrom, start and end) are required. Thus, BED is best suited for representing simple features. For specialized cases, one is usually better off with another format. For example, genome-scale vectors belong in \link[=BigWigFile]{BigWig}, alignments from high-throughput sequencing belong in \link[Rsamtools:BamFile]{BAM}, and gene models are more richly expressed in \link[=GFFFile]{GFF}. The following is the mapping of BED elements to a \code{GRanges} object. NA values are allowed only where indicated. These appear as a \dQuote{.} in the file. Only the first three columns (chrom, start and strand) are required. The other columns can only be included if all previous columns (to the left) are included. Upon export, default values are used to automatically pad the table, if necessary. \describe{ \item{chrom, start, end}{the \code{ranges} component.} \item{name}{character vector (NA's allowed) in the \code{name} column; defaults to NA on export. } \item{score}{numeric vector in the \code{score} column, accessible via the \code{score} accessor. Defaults to 0 on export. This is the only column present in BEDGraph (besides chrom, start and end), and it is required. } \item{strand}{strand factor (NA's allowed) in the \code{strand} column, accessible via the \code{strand} accessor; defaults to NA on export. } \item{thickStart, thickEnd}{\code{IntegerRanges} object in a column named \code{thick}; defaults to the ranges of the feature on export. } \item{itemRgb}{an integer matrix of color codes, as returned by \code{\link{col2rgb}}, or any valid input to \code{\link{col2rgb}}, in the \code{itemRgb} column; default is NA on export, which translates to black. } \item{blockSizes, blockStarts, blockCounts}{\code{IntegerRangesList} object in a column named \code{blocks}; defaults to empty upon BED15 export. } } For BED15 files, there should be a column of scores in \code{mcols(object)} for each sample in the experiment. The columns are named according to the \code{expNames} (found in the file, or passed as an argument during export). \code{NA} scores are stored as \dQuote{-10000} in the file. } \section{BEDX+Y formats}{ To import one of the multitude of BEDX+Y formats, such as those used to distribute ENCODE data through UCSC (narrowPeaks, etc), specify the \code{extraCols} argument to indicate the expected names and classes of the special columns. We assume that the last \code{length(extraCols)} columns are special, and that the preceding columns adhere to the BED format. \dQuote{narrowPeak} and \dQuote{broadPeak} types are handled explicitly by specifying these types as the \code{format} argument, rather than by using \code{extraCols}. } \section{BEDFile objects}{ The \code{BEDFile} class extends \code{\linkS4class{RTLFile}} and is a formal represention of a resource in the BED format. To cast a path, URL or connection to a \code{BEDFile}, pass it to the \code{BEDFile} constructor. Classes and constructors also exist for the subclasses \code{BED15File}, \code{BEDGraphFile} and \code{BEDPEFile}. } \author{Michael Lawrence} \references{ \url{http://genome.ucsc.edu/goldenPath/help/customTrack.html} \url{http://bedtools.readthedocs.org/en/latest/content/general-usage.html} } \examples{ test_path <- system.file("tests", package = "rtracklayer") test_bed <- file.path(test_path, "test.bed") test <- import(test_bed) test test_bed_file <- BEDFile(test_bed) import(test_bed_file) test_bed_con <- file(test_bed) import(test_bed_con, format = "bed") import(test_bed, trackLine = FALSE) import(test_bed, genome = "hg19") import(test_bed, colnames = c("name", "strand", "thick")) which <- GRanges("chr7:1-127473000") import(test_bed, which = which) bed15_file <- file.path(test_path, "test.bed15") bed15 <- import(bed15_file) \dontrun{ test_bed_out <- file.path(tempdir(), "test.bed") export(test, test_bed_out) test_bed_out_file <- BEDFile(test_bed_out) export(test, test_bed_out_file) export(test, test_bed_out, name = "Alternative name") test_bed_gz <- paste(test_bed_out, ".gz", sep = "") export(test, test_bed_gz) export(test, test_bed_out, index = TRUE) export(test, test_bed_out, index = TRUE, trackLine = FALSE) bed_text <- export(test, format = "bed") test <- import(format = "bed", text = bed_text) test_bed15_out <- file.path(tempdir(), "test.bed15") export(bed15, test_bed15_out) # UCSCData knows the expNames export(as(bed15, "GRanges"), test_bed15_out, # have to specify expNames expNames=paste0("breast_", c("A", "B", "C"))) } } \keyword{methods} \keyword{classes} rtracklayer/man/BamFile-methods.Rd0000644000175400017540000000445213556116552020143 0ustar00biocbuildbiocbuild\name{BamFile-methods} \alias{export,ANY,BamFile,ANY-method} \alias{export,GAlignments,BamFile,ANY-method} \alias{export,GAlignmentPairs,BamFile,ANY-method} \alias{import,BamFile,ANY,ANY-method} \title{Export to BAM Files} \description{ Methods for import and export of \code{\link[GenomicAlignments]{GAlignments}} or \code{\link[GenomicAlignments]{GAlignmentPairs}} objects from and to BAM files, represented as \code{\link[Rsamtools]{BamFile}} objects. } \usage{ \S4method{import}{BamFile,ANY,ANY}(con, format, text, paired = FALSE, use.names = FALSE, param = ScanBamParam(...), genome = NA_character_, ...) \S4method{export}{ANY,BamFile,ANY}(object, con, format, ...) } \arguments{ \item{object}{The object to export, such as a \code{GAlignments} or \code{GAlignmentPairs}. } \item{con}{A path, URL, connection or \code{BamFile} object.} \item{format}{If not missing, should be \dQuote{bam}.} \item{text}{Not supported.} \item{paired}{If \code{TRUE}, return a GAlignmentPairs object, otherwise a GAlignments. } \item{use.names}{Whether to parse QNAME as the names on the result.} \item{param}{The \code{\link[Rsamtools]{ScanBamParam}} object governing the import. } \item{genome}{Single string or \code{Seqinfo} object identifying the genome} \item{\dots}{Arguments that are passed to \code{ScanBamParam} if \code{param} is missing. } } \details{ BAM fields not formally present in the \code{GAlignments[Pairs]} object are extracted from the metadata columns, if present; otherwise, the missing value, \dQuote{"."}, is output. The file is sorted and indexed. This can be useful for subsetting BAM files, although \code{\link[Rsamtools]{filterBam}} may eventually become flexible enough to be the favored alternative. } \seealso{ The \code{\link[GenomicAlignments]{readGAlignments}} and \code{\link[GenomicAlignments]{readGAlignmentPairs}} functions for reading BAM files. } \examples{ library(Rsamtools) ex1_file <- system.file("extdata", "ex1.bam", package="Rsamtools") gal <- import(ex1_file, param=ScanBamParam(what="flag")) gal.minus <- gal[strand(gal) == "-"] \dontrun{ export(gal, BamFile("ex1-minus.bam")) } } \author{Michael Lawrence} rtracklayer/man/Bed15TrackLine-class.Rd0000644000175400017540000000360713556116552020744 0ustar00biocbuildbiocbuild\name{Bed15TrackLine-class} \docType{class} \alias{Bed15TrackLine-class} \alias{coerce,character,Bed15TrackLine-method} \alias{coerce,Bed15TrackLine,character-method} \title{Class "Bed15TrackLine"} \description{ A \acronym{UCSC} track line for graphical tracks. } \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("Bed15TrackLine", ...)} or parsed from a character vector track line with \code{as(text, "Bed15TrackLine")}. } \section{Slots}{ \describe{ \item{\code{expStep}:}{A \code{"numeric"} scalar indicating the step size for the heatmap color gradient.} \item{\code{expScale}:}{A positive \code{"numeric"} scalar indicating the range of the data to be \code{[-expScale, expScale]} for determining the heatmap color gradient.} \item{\code{expNames}:}{A \code{"character"} vector naming the the experimental samples.} \item{\code{name}:}{Object of class \code{"character"} specifying the name of the track. } \item{\code{description}:}{Object of class \code{"character"} describing the track. } \item{\code{visibility}:}{Object of class \code{"character"} indicating the default visible mode of the track, see \code{\linkS4class{UCSCTrackModes}}.} \item{\code{color}:}{Object of class \code{"integer"} representing the track color (as from \code{\link{col2rgb}}). } \item{\code{priority}:}{Object of class \code{"numeric"} specifying the rank of this track. } } } \section{Extends}{ Class \code{"\linkS4class{TrackLine}"}, directly. } \section{Methods}{ \describe{ \item{as(object, "character")}{Export line to its string representation.} } } \references{ Official documentation: \url{http://genomewiki.ucsc.edu/index.php/Microarray_track}. } \author{ Michael Lawrence } \seealso{ \code{\link{export.bed15}} for exporting bed15 tracks. } \keyword{classes} rtracklayer/man/BigWigFile.Rd0000644000175400017540000002122413556116552017147 0ustar00biocbuildbiocbuild\name{BigWigFile-class} \docType{class} %% Classes: \alias{class:BigWigFile} \alias{BigWigFile-class} \alias{class:BWFile} \alias{BWFile-class} \alias{class:BigWigFileList} \alias{BigWigFileList-class} %% Constructor: \alias{BigWigFile} \alias{BWFile} \alias{BigWigFileList} %% Accessors: \alias{seqinfo,BigWigFile-method} %% Import: \alias{import.bw} \alias{import.bw,ANY-method} \alias{import,BigWigFile,ANY,ANY-method} %% Export: \alias{export.bw} \alias{export.bw,ANY-method} \alias{export,ANY,BigWigFile,ANY-method} \alias{export,GenomicRanges,BigWigFile,ANY-method} \alias{export,List,BigWigFile,ANY-method} %% Utilites: \alias{summary,BigWigFile-method} \alias{path,BigWigFileList-method} \alias{cleanupBigWigCache} \title{BigWig Import and Export} \description{ These functions support the import and export of the UCSC BigWig format, a compressed, binary form of WIG/BEDGraph with a spatial index and precomputed summaries. These functions do not work on Windows. } \usage{ \S4method{import}{BigWigFile,ANY,ANY}(con, format, text, selection = BigWigSelection(which, ...), which = con, as = c("GRanges", "RleList", "NumericList"), ...) import.bw(con, ...) \S4method{export}{ANY,BigWigFile,ANY}(object, con, format, ...) \S4method{export}{GenomicRanges,BigWigFile,ANY}(object, con, format, dataFormat = c("auto", "variableStep", "fixedStep", "bedGraph"), compress = TRUE, fixedSummaries = FALSE) export.bw(object, con, ...) } \arguments{ \item{con}{A path, URL or \code{BigWigFile} object. Connections are not supported. For the functions ending in \code{.bw}, the file format is indicated by the function name. For the \code{export} and \code{import} methods, the format must be indicated another way. If \code{con} is a path, or URL, either the file extension or the \code{format} argument needs to be \dQuote{bigWig} or \dQuote{bw}. } \item{object}{The object to export, should be an \code{RleList}, \code{IntegerList}, \code{NumericList}, \code{GRanges} or something coercible to a \code{GRanges}. } \item{format}{If not missing, should be \dQuote{bigWig} or \dQuote{bw} (case insensitive). } \item{text}{Not supported. } \item{as}{Specifies the class of the return object. Default is \code{GRanges}, which has one range per range in the file, and a score column holding the value for each range. For \code{NumericList}, one numeric vector is returned for each range in the \code{selection} argument. For \code{RleList}, there is one \code{Rle} per sequence, and that \code{Rle} spans the entire sequence. } \item{selection}{A \code{\linkS4class{BigWigSelection}} object indicating the ranges to load. } \item{which}{A range data structure coercible to \code{IntegerRangesList}, like a \code{GRanges}, or a \code{BigWigFile}. Only the intervals in the file overlapping the given ranges are returned. By default, the value is the \code{BigWigFile} itself. Its \code{Seqinfo} object is extracted and coerced to a \code{IntegerRangesList} that represents the entirety of the file. } \item{dataFormat}{Probably best left to \dQuote{auto}. Exists only for historical reasons. } \item{compress}{If \code{TRUE}, compress the data. No reason to change this. } \item{fixedSummaries}{If \code{TRUE}, compute summaries at fixed resolutions corresponding to the default zoom levels in the Ensembl genome browser (with some extrapolation): 30X, 65X, 130X, 260X, 450X, 648X, 950X, 1296X, 4800X, 19200X. Otherwise, the resolutions are dynamically determined by an algorithm that computes an initial summary size by initializing to 10X the size of the smallest feature and doubling the size as needed until the size of the summary is less than half that of the data (or there are no further gains). It then computes up to 10 more levels of summary, quadrupling the size each time, until the summaries start to exceed the sequence size. } \item{...}{Arguments to pass down to methods to other methods. For import, the flow eventually reaches the \code{BigWigFile} method on \code{import}. } } \value{ A \code{GRanges} (default), \code{RleList} or \code{NumericList}. \code{GRanges} return ranges with non-zero score values in a \code{score} metadata column. The length of the \code{NumericList} is the same length as the \code{selection} argument (one list element per range). The return order in the \code{NumericList} matches the order of the \code{BigWigSelection} object. } \section{\code{BigWigFile} objects}{ A \code{BigWigFile} object, an extension of \code{\linkS4class{RTLFile}} is a reference to a BigWig file. To cast a path, URL or connection to a \code{BigWigFile}, pass it to the \code{BigWigFile} constructor. BigWig files are more complex than most track files, and there are a number of methods on \code{BigWigFile} for accessing the additional information: \describe{ \item{}{ \code{seqinfo(x)}: Gets the \code{\link[GenomeInfoDb]{Seqinfo}} object indicating the lengths of the sequences for the intervals in the file. No circularity or genome information is available. } \item{}{ \code{summary(ranges = as(seqinfo(object), "GenomicRanges"), size = 1L, type = c("mean", "min", "max", "coverage", "sd"), defaultValue = NA_real_), as = c("GRangesList", "RleList", "matrix"), ...}: Aggregates the intervals in the file that fall into \code{ranges}, which should be something coercible to \code{GRanges}. The aggregation essentially compresses each sequence to a length of \code{size}. The algorithm is specified by \code{type}; available algorithms include the mean, min, max, coverage (percent sequence covered by at least one feature), and standard deviation. When a window contains no features, \code{defaultValue} is assumed. The result type depends on \code{as}, and can be a GRangesList, RleList or matrix, where the number elements (or rows) is equal to the length of \code{ranges}. For \code{as="matrix"}, there must be one unique value of \code{size}, which is equal to the number of columns in the result. The \code{as="matrix"} case is the only one that supports a \code{size} greater than the width of the corresponding element in \code{ranges}, where values are interpolated to yield the matrix result. The driving use case for this is visualization of coverage when the screen space is small compared to the viewed portion of the sequence. The operation is very fast, as it leverages cached multi-level summaries present in every BigWig file. If a summary statistic is not available / cannot be computed for a given range a warning is thrown and the defaultValue \code{NA_real_} is returned. } } When accessing remote data, the UCSC library caches data in the \file{/tmp/udcCache} directory. To clean the cache, call \code{cleanBigWigCache(maxDays)}, where any files older than \code{maxDays} days old will be deleted. } \section{\code{BigWigFileList} objects}{ A \code{BigWigFileList()} provides a convenient way of managing a list of \code{BigWigFile} instances. } \author{Michael Lawrence} \seealso{ \code{\link{wigToBigWig}} for converting a WIG file to BigWig. } \examples{ if (.Platform$OS.type != "windows") { test_path <- system.file("tests", package = "rtracklayer") test_bw <- file.path(test_path, "test.bw") ## GRanges ## Returns ranges with non-zero scores. gr <- import(test_bw) gr which <- GRanges(c("chr2", "chr2"), IRanges(c(1, 300), c(400, 1000))) import(test_bw, which = which) ## RleList ## Scores returned as an RleList is equivalent to the coverage. ## Best option when 'which' or 'selection' contain many small ranges. mini <- narrow(unlist(tile(which, 50)), 2) rle <- import(test_bw, which = mini, as = "RleList") rle ## NumericList ## The 'which' is stored as metadata: track <- import(test_bw, which = which, as = "NumericList") metadata(track) \dontrun{ test_bw_out <- file.path(tempdir(), "test_out.bw") export(test, test_bw_out) } bwf <- BigWigFile(test_bw) track <- import(bwf) seqinfo(bwf) summary(bwf) # for each sequence, average all values into one summary(bwf, range(head(track))) # just average the first few features summary(bwf, size = seqlengths(bwf) / 10) # 10X reduction summary(bwf, type = "min") # min instead of mean summary(bwf, track, size = 10, as = "matrix") # each feature 10 windows } } \keyword{methods} \keyword{classes} rtracklayer/man/BigWigSelection-class.Rd0000644000175400017540000000332213556116552021317 0ustar00biocbuildbiocbuild\name{BigWigSelection-class} \docType{class} \alias{BigWigSelection-class} % constructor \alias{BigWigSelection} \alias{coerce,IntegerRangesList,BigWigSelection-method} \alias{coerce,GenomicRanges,BigWigSelection-method} \title{Selection of ranges and columns} \description{A \code{BigWigSelection} represents a query against a BigWig file, see \code{\link{import.bw}}. It is simply a \link[IRanges]{RangedSelection} that requires its \code{colnames} parameter to be "score", if non-empty, as that is the only column supported by BigWig.} \section{Constructor}{ \describe{ \item{}{\code{BigWigSelection(ranges = GRanges(), colnames = "score")}: Constructs a \code{BigWigSelection} with the given \code{ranges} and \code{colnames}. \code{ranges} can be either something coercible to a \code{\linkS4class{IntegerRangesList}}, a \code{character} identifying a genome (see \code{\link{GenomicSelection}}), or a \code{\linkS4class{BigWigFile}}, in which case the ranges are derived from the bounds of its sequences. } } } \section{Coercion}{ \describe{ \item{}{\code{as(from, "BigWigSelection")}: Coerces \code{from} to a \code{BigWigSelection} object. Typically, \code{from} is a \code{\link[GenomicRanges]{GRanges}} or a \code{\link[IRanges]{IntegerRangesList}}, the ranges of which become the ranges in the new \code{BigWigSelection}. } } } \author{ Michael Lawrence } \examples{ rl <- IRangesList(chr1 = IRanges::IRanges(c(1, 5), c(3, 6))) BigWigSelection(rl) as(rl, "BigWigSelection") # same as above # do not select the 'score' column BigWigSelection(rl, character()) } \keyword{methods} \keyword{classes} rtracklayer/man/BrowserViewList-class.Rd0000644000175400017540000000123513556116552021414 0ustar00biocbuildbiocbuild\name{BrowserViewList-class} \docType{class} \alias{BrowserViewList-class} % Constructor \alias{BrowserViewList} \title{Lists of BrowserView} \description{ A formal list of \code{\linkS4class{BrowserView}} objects. Extends and inherits all its methods from \code{\link[S4Vectors]{Vector}}. Usually generated by passing multiple ranges to the \code{\link{browserView}} function. } \section{Constructor}{ \describe{ \item{}{\code{BrowserViewList(...)}: Concatenates the \code{BrowserView} objects in \code{...} into a new \code{BrowserViewList}. This is rarely called by the user. } } } \author{Michael Lawrence} \keyword{classes} rtracklayer/man/Chain-class.Rd0000644000175400017540000000563113556116552017330 0ustar00biocbuildbiocbuild\name{Chain-class} \docType{class} %% Classes: \alias{class:Chain} \alias{Chain-class} \alias{ChainBlock-class} \alias{class:ChainBlock} \alias{class:ChainFile} \alias{ChainFile-class} %% Constructor: \alias{import.chain} \alias{import.chain,ANY-method} \alias{import,ChainFile,ANY,ANY-method} \alias{ChainFile} %% Generics and methods: \alias{ranges,ChainBlock-method} \alias{offset,ChainBlock-method} \alias{score,ChainBlock-method} \alias{space,ChainBlock-method} \alias{reversed} \alias{reversed,ChainBlock-method} \title{Chain objects} \description{ A \code{Chain} object represents a UCSC chain alignment, typically imported from a \code{chain} file, and is essentially a list of \code{ChainBlock} objects. Each \code{ChainBlock} has a corresponding chromosome (its name in the list) and is a run-length encoded alignment, mapping a set of intervals on that chromosome to intervals on the same or other chromosomes. } \note{ A chain file essentially details many local alignments, so it is possible for the "from" ranges to map to overlapping regions in the other sequence. The "from" ranges are guaranteed to be disjoint (but do not necessarily cover the entire "from" sequence). } \section{Accessor Methods}{ In the code snippets below, \code{x} and \code{object} are \code{ChainBlock} objects. \describe{ \item{}{ \code{ranges(x)}: Get the \code{\link[IRanges]{IntegerRanges}} object holding the starts and ends of the "from" ranges. Each range is a contiguous block of positions aligned without gaps to the other sequence. } \item{}{ \code{offset(x)}: Integer offset from the "from" start to the "end" start (which could be in another chromosome). } \item{}{ \code{score(x)}: The score for each mapping. } \item{}{ \code{space(x)}: The space (chromosome) of the "to" range. } \item{}{ \code{reversed(x)}: Whether the mapping inverts the region, i.e., the alignment is between different strands. } } } \section{Import}{ A \code{Chain} object can be loaded from a UCSC chain format file simply by passing the path \code{import} function. If the file extension is not \dQuote{chain}, then either pass \dQuote{chain} to the \code{format} argument, or cast the path to a \code{ChainFile} object. The \code{import.chain} function is provided as a (slight) convenience. It is documented below, along with the extra \code{exclude} argument to the \code{import} method. \describe{ \item{}{ \code{import.chain(con, exclude = "_", ...)}: Imports a chain file named \code{con} as a \code{Chain} object, a list of \code{ChainBlock}s. Alignments for chromosomes matching the \code{exclude} pattern are not imported. } } } \author{Michael Lawrence} \seealso{ \code{\link{liftOver}} for performing lift overs using a chain alignment } \keyword{methods} \keyword{classes} rtracklayer/man/FastaFile-class.Rd0000644000175400017540000000427113556116552020143 0ustar00biocbuildbiocbuild\name{FastaFile-class} \docType{class} %% Classes: \alias{class:FastaFile} \alias{FastaFile-class} %% Constructor: \alias{FastaFile} %% Import: \alias{import,FastaFile,ANY,ANY-method} %% Export: \alias{export,ANY,FastaFile,ANY-method} \alias{export,XStringSet,FastaFile,ANY-method} \title{FastaFile objects} \description{ These functions support the import and export of the Fasta sequence format, using the Biostrings package. } \usage{ \S4method{import}{FastaFile,ANY,ANY}(con, format, text, type = c("DNA", "RNA", "AA", "B"), ...) \S4method{export}{ANY,FastaFile,ANY}(object, con, format, ...) \S4method{export}{XStringSet,FastaFile,ANY}(object, con, format, ...) } \arguments{ \item{con}{A path or \code{FastaFile} object. URLs and connections are not supported. If \code{con} is not a \code{FastaFile}, either the file extension or the \code{format} argument needs to be \dQuote{fasta}. Compressed files (\dQuote{gz}, \dQuote{bz2} and \dQuote{xz}) are handled transparently. } \item{object}{The object to export, should be an \code{XStringSet} or something coercible to a \code{DNAStringSet}, like a character vector. } \item{format}{If not missing, should be \dQuote{fasta}. } \item{text}{If \code{con} is missing, a character vector to use as the input } \item{type}{Type of biological sequence.} \item{...}{Arguments to pass down to \code{\link[Biostrings]{writeXStringSet}} (export) or the \code{\link[Biostrings]{readDNAStringSet}} family of functions (import). } } \seealso{ These functions are implemented by the Biostrings \code{\link[Biostrings]{writeXStringSet}} (export) and the \code{\link[Biostrings]{readDNAStringSet}} family of functions (import). See \link[BSgenome]{export-methods} in the \pkg{BSgenome} package for exporting a \link[BSgenome]{BSgenome} object as a FASTA file. } \section{FastaFile objects}{ The \code{FastaFile} class extends \code{\linkS4class{RTLFile}} and is a formal represention of a resource in the Fasta format. To cast a path, URL or connection to a \code{FastaFile}, pass it to the \code{FastaFile} constructor. } \author{Michael Lawrence} \keyword{methods} \keyword{classes} rtracklayer/man/GFFFile-class.Rd0000644000175400017540000002716713556116552017520 0ustar00biocbuildbiocbuild\name{GFFFile-class} \docType{class} %% Classes: \alias{class:GFFFile} \alias{class:GFF1File} \alias{class:GFF2File} \alias{class:GFF3File} \alias{class:GVFFile} \alias{class:GTFFile} \alias{GFFFile-class} \alias{GFF1File-class} \alias{GFF2File-class} \alias{GFF3File-class} \alias{GVFFile-class} \alias{GTFFile-class} %% Constructor: \alias{GFFFile} \alias{GFF1File} \alias{GFF2File} \alias{GFF3File} \alias{GVFFile} \alias{GTFFile} %% Import: \alias{import,GFFFile,ANY,ANY-method} \alias{import.gff} \alias{import.gff1} \alias{import.gff2} \alias{import.gff3} \alias{import.gff,ANY-method} \alias{import.gff1,ANY-method} \alias{import.gff2,ANY-method} \alias{import.gff3,ANY-method} %% Export: \alias{export,ANY,GFFFile,ANY-method} \alias{export,GenomicRanges,GFFFile,ANY-method} \alias{export,GenomicRangesList,GFFFile,ANY-method} \alias{export,GRangesList,GFFFile,ANY-method} \alias{export,GRangesList,GTFFile,ANY-method} \alias{export.gff} \alias{export.gff,ANY-method} \alias{export.gff1} \alias{export.gff1,ANY-method} \alias{export.gff2} \alias{export.gff2,ANY-method} \alias{export.gff3} \alias{export.gff3,ANY-method} % Other: \alias{genome,GFFFile-method} \title{GFFFile objects} \description{ These functions support the import and export of the GFF format, of which there are three versions and several flavors. } \usage{ \S4method{import}{GFFFile,ANY,ANY}(con, format, text, version = c("", "1", "2", "3"), genome = NA, colnames = NULL, which = NULL, feature.type = NULL, sequenceRegionsAsSeqinfo = FALSE) import.gff(con, ...) import.gff1(con, ...) import.gff2(con, ...) import.gff3(con, ...) \S4method{export}{ANY,GFFFile,ANY}(object, con, format, ...) \S4method{export}{GenomicRanges,GFFFile,ANY}(object, con, format, version = c("1", "2", "3"), source = "rtracklayer", append = FALSE, index = FALSE) \S4method{export}{GenomicRangesList,GFFFile,ANY}(object, con, format, ...) export.gff(object, con, ...) export.gff1(object, con, ...) export.gff2(object, con, ...) export.gff3(object, con, ...) } \arguments{ \item{con}{A path, URL, connection or \code{GFFFile} object. For the functions ending in \code{.gff}, \code{.gff1}, etc, the file format is indicated by the function name. For the base \code{export} and \code{import} functions, the format must be indicated another way. If \code{con} is a path, URL or connection, either the file extension or the \code{format} argument needs to be one of \dQuote{gff}, \dQuote{gff1} \dQuote{gff2}, \dQuote{gff3}, \dQuote{gvf}, or \dQuote{gtf}. Compressed files (\dQuote{gz}, \dQuote{bz2} and \dQuote{xz}) are handled transparently. } \item{object}{The object to export, should be a \code{GRanges} or something coercible to a \code{GRanges}. If the object has a method for \code{asGFF}, it is called prior to coercion. This makes it possible to export a \code{GRangesList} or \code{TxDb} in a way that preserves the hierarchical structure. For exporting multiple tracks, in the UCSC track line metaformat, pass a \code{GenomicRangesList}, or something coercible to one. } \item{format}{If not missing, should be one of \dQuote{gff}, \dQuote{gff1} \dQuote{gff2}, \dQuote{gff3}, \dQuote{gvf}, or \dQuote{gtf}. } \item{version}{If the format is given as \dQuote{gff}, i.e., it does not specify a version, then this should indicate the GFF version as one of \dQuote{} (for import only, from the \code{gff-version} directive in the file or \dQuote{1} if none), \dQuote{1}, \dQuote{2} or \dQuote{3}. } \item{text}{If \code{con} is missing, a character vector to use as the input. } \item{genome}{The identifier of a genome, or a \code{Seqinfo}, or \code{NA} if unknown. Typically, this is a UCSC identifier like \dQuote{hg19}. An attempt will be made to derive the \code{Seqinfo} on the return value using either an installed BSgenome package or UCSC, if network access is available. } \item{colnames}{A character vector naming the columns to parse. These should name either fixed fields, like \code{source} or \code{type}, or, for GFF2 and GFF3, any attribute. } \item{which}{A \code{GRanges} or other range-based object supported by \code{\link[IRanges]{findOverlaps}}. Only the intervals in the file overlapping the given ranges are returned. This is much more efficient when the file is indexed with the tabix utility. } \item{feature.type}{\code{NULL} (the default) or a character vector of valid feature types. If not \code{NULL}, then only the features of the specified type(s) are imported. } \item{sequenceRegionsAsSeqinfo}{If \code{TRUE}, attempt to infer the \code{Seqinfo} (\code{seqlevels} and \code{seqlengths}) from the \dQuote{##sequence-region} directives as specified by GFF3. } \item{source}{The value for the source column in GFF. This is typically the name of the package or algorithm that generated the feature. } \item{index}{If \code{TRUE}, automatically compress and index the output file with bgzf and tabix. Note that tabix indexing will sort the data by chromosome and start. Tabix supports a single track in a file. } \item{append}{If \code{TRUE}, and \code{con} points to a file path, the data is appended to the file. Obviously, if \code{con} is a connection, the data is always appended. } \item{...}{Arguments to pass down to methods to other methods. For import, the flow eventually reaches the \code{GFFFile} method on \code{import}. When \code{trackLine} is \code{TRUE} or the target format is BED15, the arguments are passed through \code{export.ucsc}, so track line parameters are supported. } } \value{ A \code{GRanges} with the metadata columns described in the details. } \details{ The Generic Feature Format (GFF) format is a tab-separated table of intervals. There are three different versions of GFF, and they all have the same number of columns. In GFF1, the last column is a grouping factor, whereas in the later versions the last column holds application-specific attributes, with some conventions defined for those commonly used. This attribute support facilitates specifying extensions to the format. These include GTF (Gene Transfer Format, an extension of GFF2) and GVF (Genome Variation Format, an extension of GFF3). The rtracklayer package recognizes the \dQuote{gtf} and \dQuote{gvf} extensions and parses the extra attributes into columns of the result; however, it does not perform any extension-specific processing. Both GFF1 and GFF2 have been proclaimed obsolete; however, the UCSC Genome Browser only supports GFF1 (and GTF), and GFF2 is still in broad use. GFF is distinguished from the simpler BED format by its flexible attribute support and its hierarchical structure, as specified by the \code{group} column in GFF1 (only one level of grouping) and the \code{Parent} attribute in GFF3. GFF2 does not specify a convention for representing hierarchies, although its GTF extension provides this for gene structures. The combination of support for hierarchical data and arbitrary descriptive attributes makes GFF(3) the preferred format for representing gene models. Although GFF features a \code{score} column, large quantitative data belong in a format like \link[=BigWigFile]{BigWig} and alignments from high-throughput experiments belong in \link[Rsamtools:BamFile]{BAM}. For variants, the VCF format (supported by the VariantAnnotation package) seems to be more widely adopted than the GVF extension. A note on the UCSC track line metaformat: track lines are a means for passing hints to visualization tools like the UCSC Genome Browser and the Integrated Genome Browser (IGB), and they allow multiple tracks to be concatenated in the same file. Since GFF is not a UCSC format, it is not common to annotate GFF data with track lines, but rtracklayer still supports it. To export or import GFF data in the track line format, call \code{\link{export.ucsc}} or \code{\link{import.ucsc}}. The following is the mapping of GFF elements to a \code{GRanges} object. NA values are allowed only where indicated. These appear as a \dQuote{.} in the file. GFF requires that all columns are included, so \code{export} generates defaults for missing columns. \describe{ \item{seqid, start, end}{the \code{ranges} component.} \item{source}{character vector in the \code{source} column; defaults to \dQuote{rtracklayer} on export. } \item{type}{character vector in the \code{type} column; defaults to \dQuote{sequence_feature} in the output, i.e., SO:0000110. } \item{score}{numeric vector (NA's allowed) in the \code{score} column, accessible via the \code{score} accessor; defaults to \code{NA} upon export. } \item{strand}{strand factor (NA's allowed) in the \code{strand} column, accessible via the \code{strand} accessor; defaults to \code{NA} upon export. } \item{phase}{integer vector, either 0, 1 or 2 (NA's allowed); defaults to \code{NA} upon export. } \item{group}{a factor (GFF1 only); defaults to the \code{seqid} (e.g., chromosome) on export. } } In GFF versions 2 and 3, attributes map to arbitrary columns in the result. In GFF3, some attributes (\code{Parent}, \code{Alias}, \code{Note}, \code{DBxref} and \code{Ontology_term}) can have multiple, comma-separated values; these columns are thus always \code{CharacterList} objects. } \section{GFFFile objects}{ The \code{GFFFile} class extends \code{\linkS4class{RTLFile}} and is a formal represention of a resource in the GFF format. To cast a path, URL or connection to a \code{GFFFile}, pass it to the \code{GFFFile} constructor. The \code{GFF1File}, \code{GFF2File}, \code{GFF3File}, \code{GVFFile} and \code{GTFFile} classes all extend \code{GFFFile} and indicate a particular version of the format. It has the following utility methods: \describe{ \item{}{\code{genome}: Gets the genome identifier from the \dQuote{genome-build} header directive. } } } \author{Michael Lawrence} \references{ \describe{ \item{GFF1, GFF2}{ \url{http://www.sanger.ac.uk/resources/software/gff/spec.html} } \item{GFF3}{\url{http://www.sequenceontology.org/gff3.shtml}} \item{GVF}{\url{http://www.sequenceontology.org/resources/gvf.html}} \item{GTF}{\url{http://mblab.wustl.edu/GTF22.html}} } } \examples{ test_path <- system.file("tests", package = "rtracklayer") test_gff3 <- file.path(test_path, "genes.gff3") ## basic import test <- import(test_gff3) test ## import.gff functions import.gff(test_gff3) import.gff3(test_gff3) ## GFFFile derivatives test_gff_file <- GFF3File(test_gff3) import(test_gff_file) test_gff_file <- GFFFile(test_gff3) import(test_gff_file) test_gff_file <- GFFFile(test_gff3, version = "3") import(test_gff_file) ## from connection test_gff_con <- file(test_gff3) test <- import(test_gff_con, format = "gff") ## various arguments import(test_gff3, genome = "hg19") import(test_gff3, colnames = character()) import(test_gff3, colnames = c("type", "geneName")) ## 'which' which <- GRanges("chr10:90000-93000") import(test_gff3, which = which) \dontrun{ ## 'append' test_gff3_out <- file.path(tempdir(), "genes.gff3") export(test[seqnames(test) == "chr10"], test_gff3_out) export(test[seqnames(test) == "chr12"], test_gff3_out, append = TRUE) import(test_gff3_out) ## 'index' export(test, test_gff3_out, index = TRUE) test_bed_gz <- paste(test_gff3_out, ".gz", sep = "") import(test_bed_gz, which = which) } } \keyword{methods} \keyword{classes} rtracklayer/man/GRangesForUCSCGenome.Rd0000644000175400017540000000363713556116552021015 0ustar00biocbuildbiocbuild\name{GRangesForUCSCGenome} \alias{GRangesForUCSCGenome} \alias{GRangesForBSGenome} \alias{SeqinfoForUCSCGenome} \alias{SeqinfoForBSGenome} \title{ GRanges for a Genome } \description{ These functions assist in the creation of \code{\link[GenomeInfoDb]{Seqinfo}} or \code{\link[GenomicRanges:GRanges-class]{GRanges}} for a genome. } \usage{ GRangesForUCSCGenome(genome, chrom = NULL, ranges = NULL, ...) GRangesForBSGenome(genome, chrom = NULL, ranges = NULL, ...) SeqinfoForUCSCGenome(genome) SeqinfoForBSGenome(genome) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{genome}{ A string identifying a genome, usually one assigned by UCSC, like "hg19". } \item{chrom}{ A character vector of chromosome names, or \code{NULL}. } \item{ranges}{ A \code{\link[IRanges]{IntegerRanges}} object with the intervals. } \item{\dots}{ Additional arguments to pass to the \code{\link[GenomicRanges]{GRanges}} constructor. } } \details{ The genome ID is stored in the metadata of the ranges and is retrievable via the \code{\link{genome}} function. The sequence lengths are also properly initialized for the genome. This mitigates the possibility of accidentally storing intervals for the wrong genome. \code{GRangesForUCSCGenome} obtains sequence information from the UCSC website, while \code{GRangesForBSGenome} looks for it in an installed \code{BSGenome} package. Using the latter is more efficient in the long-run, but requires downloading and installing a potentially large genome package, or creating one from scratch if it does not yet exist for the genome of interest. } \value{ For the \code{GRangesFor*} functions, a \code{GRanges} object, with the appropriate \code{\link[GenomeInfoDb]{seqlengths}} and \code{\link{genome}} ID. The \code{SeqinfoFor*} functions return a \code{Seqinfo} for the indicated genome. } \author{ Michael Lawrence } rtracklayer/man/GenomicData.Rd0000644000175400017540000000466313556116552017362 0ustar00biocbuildbiocbuild\name{GenomicData} % constructor \alias{GenomicData} % accessors \alias{chrom} \alias{chrom,GRanges-method} \alias{chrom<-} \alias{chrom<-,GRanges-method} \alias{score,ANY-method} \title{Data on a Genome} \description{The \code{rtracklayer} package adds convenience methods on top of \code{GenomicRanges} and \code{IntegerRangesList} to manipulate data on genomic ranges.} \section{Accessors}{ In the code snippets below, \code{x} is a \code{GenomicRanges} or \code{IntegerRangesList} object. \describe{ \item{}{ \code{chrom(x), chrom(x) <- value}: Gets or sets the chromosome names for \code{x}. The length of \code{value} should equal the length of \code{x}. } \item{}{ \code{score(x)}: Gets the \dQuote{score} column from the element metadata of a \code{GenomicRanges} or \code{GRangesList}. Many track formats have a score column, so this is often used during export. The \code{ANY} fallback for this method simply returns \code{NULL}. } } } \section{Constructor}{ \describe{ \item{}{ \code{GenomicData(ranges, ..., strand = NULL, chrom = NULL, genome = NULL)}: Constructs a \code{GRanges} instance with the given \code{ranges} and variables in \code{...} (see the \code{\link[GenomicRanges]{GRanges}} constructor). If non-\code{NULL}, the \code{strand} argument specifies the strand of each range. It should be a character vector or factor of length equal to that of \code{ranges}. All values should be either \code{-}, \code{+}, or \code{*}. To get the levels for \code{strand}, call \code{levels(strand())}. \code{chrom} argument is analogous to \code{seqnames} in the \code{GRanges} constructor. The \code{genome} argument should be a scalar string. See the examples. } } } \author{ Michael Lawrence and Patrick Aboyoun } \examples{ range1 <- IRanges(c(1,2,3), c(5,2,8)) ## with some data ## filter <- c(1L, 0L, 1L) score <- c(10L, 2L, NA) strand <- factor(c("+", NA, "-"), levels = levels(strand())) ## GRanges instance gr <- GenomicData(range1, score, chrom = "chr1", genome = "hg18") mcols(gr)[["score"]] strand(gr) ## all '*' gr <- GenomicData(range1, score, filt = filter, strand = strand, chrom = "chr1") mcols(gr)[["filt"]] strand(gr) ## equal to 'strand' ## coercion from data.frame ## df <- as.data.frame(gr) } \keyword{classes} \keyword{methods} rtracklayer/man/GenomicSelection.Rd0000644000175400017540000000171313556116552020427 0ustar00biocbuildbiocbuild\name{GenomicSelection} \alias{GenomicSelection} \title{ Genomic data selection } \description{ Convenience constructor of a \link[IRanges]{RangedSelection} object for selecting a data on a per-chromosome basis for a given genome. } \usage{ GenomicSelection(genome, chrom = NULL, colnames = character(0)) } \arguments{ \item{genome}{ A string identifying a genome. Should match the end of a BSgenome package name, e.g. "hg19". } \item{chrom}{ Character vector naming chromosomes to select. } \item{colnames}{ The column names to select from the dataset. } } \value{ A \link[IRanges]{RangedSelection} object, selecting entire chromosomes } \author{ Michael Lawrence } \seealso{ \code{\link[IRanges]{RangedSelection}}, \code{\link{BigWigSelection}} } \examples{ # every chromosome from hg19 GenomicSelection("hg19") # chr1 and 2 from hg19, with a score column GenomicSelection("hg19", c("chr1", "chr2"), "score") } \keyword{ manip } rtracklayer/man/IntegerRangesList-methods.Rd0000644000175400017540000000177013556116552022235 0ustar00biocbuildbiocbuild\name{IntegerRangesList-methods} \docType{methods} \alias{IntegerRangesList-methods} % accessors \alias{chrom,IntegerRangesList-method} \alias{chrom<-,IntegerRangesList-method} \title{Ranges on a Genome} \description{ Genomic coordinates are often specified in terms of a genome identifier, chromosome name, start position and end position. The \code{rtracklayer} package adds convenience methods to \code{IntegerRangesList} for the manipulation of genomic ranges. The spaces (or names) of \code{IntegerRangesList} are the chromosome names. The \code{universe} slot indicates the genome, usually as given by UCSC (e.g. \dQuote{hg18}). } \section{Accessors}{ In the code snippets below, \code{x} is a \code{IntegerRangesList} object. \describe{ \item{}{ \code{chrom(x), chrom(x) <- value}: Gets or sets the chromosome names for \code{x}. This is an alias for \code{\link[IRanges]{names}(x)}. } } } \author{ Michael Lawrence } \keyword{classes} \keyword{methods} rtracklayer/man/Quickload-class.Rd0000644000175400017540000000402413556116552020215 0ustar00biocbuildbiocbuild\name{Quickload-class} \docType{class} %% Classes: \alias{class:Quickload} \alias{Quickload-class} %% Constructor: \alias{Quickload} %% Accessors: \alias{$,Quickload-method} \alias{[[,Quickload,ANY,ANY-method} \alias{genome,Quickload-method} \alias{length,Quickload-method} \alias{uri} %% Coercion: \alias{coerce,character,Quickload-method} %% Show: \alias{show,Quickload-method} \title{Quickload Access} \description{ The \code{Quickload} class represents a Quickload data source, essentially directory layout separating tracks and sequences by genome, along with a few metadata files. This interface abstracts those details and provides access to a Quickload at any URL supported by R (HTTP, FTP, and local files). This is an easy way to make data accessible to the Integrated Genome Browser (IGB). } \section{Constructor}{ \describe{ \item{}{ \code{Quickload(uri = "quickload", create = FALSE)}: Constructs a new \code{Quickload} object, representing a repository at \code{uri}. If \code{create} is \code{TRUE}, and \code{uri} is writeable (i.e., local), the repository is created if it does not already exist. If it does exist, then a message is emitted to indicate that the repository was not recreated. } } } \section{Accessor Methods}{ In the code snippets below, \code{x} represents a \code{Quickload} object. \describe{ \item{}{\code{x$genome}, \code{x[["genome"]]}: Get the \code{\linkS4class{QuickloadGenome}} object for the genome named \code{genome}. This is where all the data is stored. } \item{}{\code{length(x)}: number of genomes in the repository } \item{}{\code{uri(x)}: Get the URI pointing to the Quickload repository. } \item{}{\code{genome(x)}: Get the identifiers of the genomes present in the repository. } } } \author{Michael Lawrence} \examples{ ql <- Quickload(system.file("tests", "quickload", package = "rtracklayer")) uri(ql) genome(ql) ql$T_species_Oct_2011 } \keyword{methods} \keyword{classes} rtracklayer/man/QuickloadGenome-class.Rd0000644000175400017540000001520013556116552021346 0ustar00biocbuildbiocbuild\name{QuickloadGenome-class} \docType{class} %% Classes: \alias{class:QuickloadGenome} \alias{QuickloadGenome-class} %% Constructor: \alias{QuickloadGenome} %% Accessors: \alias{seqinfo,QuickloadGenome-method} \alias{seqinfo,DNAStringSet-method} % sneak it in here \alias{seqinfo<-,QuickloadGenome-method} \alias{genome,QuickloadGenome-method} \alias{length,QuickloadGenome-method} \alias{names,QuickloadGenome-method} \alias{quickload} \alias{mcols,QuickloadGenome-method} \alias{releaseDate,QuickloadGenome-method} \alias{organism,QuickloadGenome-method} \alias{uri,QuickloadGenome-method} %% Data Access: \alias{track,QuickloadGenome-method} \alias{track<-,QuickloadGenome,ANY-method} \alias{track<-,QuickloadGenome,RTLFile-method} \alias{track<-,QuickloadGenome,RsamtoolsFile-method} \alias{track<-,QuickloadGenome,character-method} \alias{referenceSequence} \alias{referenceSequence<-} \alias{referenceSequence,QuickloadGenome-method} \alias{referenceSequence<-,QuickloadGenome-method} %% Show \alias{show,QuickloadGenome-method} \title{Quickload Genome Access} \description{ A Quickload data source is a collection of tracks and sequences, separated by genome. This class, \code{QuickloadGenome} provides direct access to the data for one particular genome. } \section{Constructor}{ \describe{ \item{}{ \code{QuickloadGenome(quickload, genome, create = FALSE, seqinfo = seqinfo(genome), title = toString(genome))}: Constructs a new \code{QuickloadGenome} object, representing \code{genome} in the repository \code{quickload} (a URI string or a \code{\linkS4class{Quickload}} object). The \code{genome} argument can be an ID corresponding to a genome (potentially) in \code{quickload} or an installed \code{BSgenome} package. It can also be any instance of a class which has methods for \code{organism} and \code{releaseDate}. A good example is \code{\link[BSgenome]{BSgenome}} or any other derivative of \code{\link[GenomeInfoDb]{GenomeDescription}}. Those items are necessary for constructing the canonical Quickload genome string (G_Species_Month_Year). If \code{create} is \code{TRUE}, and the genome does not already exist, the genome will be created, using \code{seqinfo} for the sequence lengths and \code{title} for the display name of the genome in a UI. Creation only works if the repository is local and writeable. Reasonable defaults are used for \code{seqinfo} and \code{title} when the necessary methods are available (and they are for \code{BSgenome}). } } } \section{Accessor Methods}{ In the code snippets below, \code{x} and \code{object} represent a \code{Quickload} object. \describe{ \item{}{ \code{seqinfo(x)}, \code{seqinfo(x) <- value}: Gets or sets the \code{\link[GenomeInfoDb]{Seqinfo}} object indicating the lengths of the sequences in the genome. No circularity information or genome identifier is stored. } \item{}{ \code{quickload(x)}: Get the Quickload object that contains this genome. } \item{}{ \code{uri(x)}: Get the uri pointing to the genome directory in the Quickload repository } \item{}{ \code{genome(x)}: Get the name of the genome, e.g. \dQuote{H_sapiens_Feb_2009}. } \item{}{ \code{releaseDate(x)}: Get the release portion of the genome name, e.g., \dQuote{Feb_2009}. } \item{}{ \code{organism(object)}: Get the organism portion of the genome name, e.g., \dQuote{H sapiens}. } } } \section{Data Access}{ \describe{ \item{}{ \code{length(x)}: number of datasets } \item{}{ \code{names(x), trackNames(x)}: names of the datasets } \item{}{ \code{mcols(x)}: merged metadata on the datasets } \item{}{ \code{track(x, name), x$name}: get the track called \code{name} } \item{}{ \code{track(x, name, format = bestFileFormat(value), ...) <- value, x$name <- value}: store the track \code{value} under \code{name}. Note that track storing is only supported for local repositories, i.e., those with a \code{file://} URI scheme. Currently, supported \code{value} types include a \code{GenomicRanges}, \code{GRangesList}, or a file resource (copied to the repository). The file resource may be represented as a path, URL, \code{\linkS4class{RTLFile}} or \code{\link[Rsamtools:RsamtoolsFile-class]{RsamtoolsFile}}. If not a file name, \code{value} is written in \code{format}. For generic interval data, this means a BigWig file (if there is a numeric \dQuote{score} column) or a BED file otherwise. An \code{RleList} (e.g., coverage) is output as BigWig. For \code{UCSCData} values, the format is chosen according to the type of track line. For \code{RsamtoolsFile} objects, the file and its index are copied. The arguments in \code{...} become attributes in the XML metadata. The \dQuote{description} attribute is standard and is a blurb for describing the track in a UI. For the rest, the interpretation is up to the client. IGB supports an ever-growing list; please see its documentation. } \item{}{ \code{referenceSequence(x)}: Get the reference sequence, as a \code{DNAStringSet}. } \item{}{ \code{referenceSequence(x) <- value}: Set the reference sequence, as a \code{DNAStringSet}. It is written as a 2bit file. This only works on local repositories. } } } \author{Michael Lawrence} \examples{ tests_dir <- system.file("tests", package = "rtracklayer") ql <- Quickload(file.path(tests_dir, "quickload")) qlg <- QuickloadGenome(ql, "T_species_Oct_2011") seqinfo(qlg) organism(qlg) releaseDate(qlg) names(qlg) mcols(qlg) if (.Platform$OS.type != "windows") { # temporary qlg$bedData } \dontrun{ ## populating the test repository ql <- Quickload(file.path(tests_dir, "quickload"), create = TRUE) reference_seq <- import(file.path(tests_dir, "test.2bit")) names(reference_seq) <- "test" qlg <- QuickloadGenome(ql, "T_species_Oct_2011", create = TRUE, seqinfo = seqinfo(reference_seq)) referenceSequence(qlg) <- reference_seq test_bed <- import(file.path(tests_dir, "test.bed")) names(test_bed) <- "test" qlg$bedData <- test_bed test_bedGraph <- import(file.path(tests_dir, "test.bedGraph")) names(test_bedGraph) <- "test" start(test_bedGraph) <- seq(1, 90, 10) width(test_bedGraph) <- 10 track(qlg, "bedGraphData", format = "bw") <- test_bedGraph } } \keyword{methods} \keyword{classes} rtracklayer/man/RTLFile-class.Rd0000644000175400017540000000413713556116552017547 0ustar00biocbuildbiocbuild\name{RTLFile-class} \docType{class} %% Classes: \alias{class:RTLFile} \alias{RTLFile-class} \alias{class:CompressedFile} \alias{CompressedFile-class} \alias{RTLFileList-class} %% Accessors \alias{path} \alias{path,RTLFile-method} \alias{resource} \alias{fileFormat} \alias{fileFormat,RTLFile-method} \alias{fileFormat,CompressedFile-method} \alias{fileFormat,character-method} %% Show: \alias{show,RTLFile-method} %% Related functions: \alias{FileForFormat} %% Coerce: \alias{as.character,RTLFile-method} \title{RTLFile objects} \description{ A \code{RTLFile} object is the base class for classes representing files accessible with rtracklayer. It wraps a resource (either a path, URL or connection). We can represent a list of \code{RTLFile} objects with a \code{RTLFileList}. } \section{Accessor Methods}{ In the code snippets below, \code{x} represents a \code{RTLFile} object. \describe{ \item{}{ \code{path(x)}: Gets the path, as a \code{character} vector, to the resource represented by the \code{RTLFile} object, if possible. } \item{}{ \code{resource(x)}: Gets the low-level resource, either a character vector (a path or URL) or a connection. } \item{}{ \code{fileFormat(x)}: Gets a string identifying the file format. Can also be called directly on a character file path, in which case it uses a heuristic based on the file extension. } } } \section{Coercion}{ \describe{ \item{}{ \code{as.character(x)}: Returns the path of the file as a character vector. } } } \section{Related functions}{ \describe{ \item{}{ \code{FileForFormat(path, format = file_ext(path))}: Determines the file type of \code{path} and returns a high-level file object such as BamFile, BEDFile, BigWigFile etc.. } } } \author{Michael Lawrence} \seealso{ Implementing classes include: \code{\linkS4class{BigWigFile}}, \code{\linkS4class{TwoBitFile}}, \code{\linkS4class{BEDFile}}, \code{\linkS4class{GFFFile}}, and \code{\linkS4class{WIGFile}}. } \keyword{methods} \keyword{classes} rtracklayer/man/TabixFile-methods.Rd0000644000175400017540000000602313556116552020507 0ustar00biocbuildbiocbuild\name{TabixFile-methods} \alias{import,TabixFile,ANY,ANY-method} \alias{exportToTabix} \alias{exportToTabix,ANY,character-method} % undocumented/internal for now \alias{export,GenomicRanges,TabSeparatedFile,ANY-method} \alias{export,ANY,TabSeparatedFile,ANY-method} \title{TabixFile Import/Export} \description{ These methods support the import and export of \code{Rsamtools:TabixFile}{TabixFile} objects. These are generally useful when working with tabix-indexed files that have a non-standard format (i.e., not BED nor GFF), as well as exporting an object with arbitrary columns (like a GRanges) to an indexed, tab-separated file. This relies on the tabix header, which indicates the columns in the file that correspond to the chromosome, start and end. The BED and GFF parsers handle tabix transparently. } \usage{ \S4method{import}{TabixFile,ANY,ANY}(con, format, text, which = if (is.na(genome)) NULL else as(seqinfoForGenome(genome), "GenomicRanges"), genome = NA, header = TRUE, ...) exportToTabix(object, con, ...) } \arguments{ \item{con}{For \code{import}, a \code{TabixFile} object; for \code{exportToTabix}, a string naming the destination file. } \item{object}{The object to export. It is coerced to a \code{data.frame}, written to a tab-separated file, and indexed with tabix for efficient range-based retrieval of the data using \code{import}. } \item{format}{If any known format, like \dQuote{bed} or \dQuote{gff} (or one of their variants), then the appropriate parser is applied. If any other value, then the tabix header is consulted for the format. By default, this is taken from the file extension. } \item{text}{Ignored.} \item{which}{A range data structure coercible to \code{IntegerRangesList}, like a \code{GRanges}. Only the intervals in the file overlapping the given ranges are returned. The default is to use the range over the entire genome given by \code{genome}, if specified. } \item{genome}{The identifier of a genome, or \code{NA} if unknown. Typically, this is a UCSC identifier like \dQuote{hg19}. An attempt will be made to derive the \code{seqinfo} on the return value using either an installed BSgenome package or UCSC, if network access is available. } \item{header}{If \code{TRUE}, then the header in the indexed file, which might include a track line, is sent to the parser. Otherwise, the initial lines are skipped, according to the \code{skip} field in the tabix index header. } \item{...}{Extra arguments to pass to the underlying import routine, which for non-standard formats is \code{\link{read.table}} or \code{\link{write.table}}. } } \value{ For \code{import}, a \code{GRanges} object. For \code{exportToTabix}, a \code{TabixFile} object that is directly passable to \code{import}. } \references{ \url{http://samtools.sourceforge.net/tabix.shtml} } \seealso{ \code{\link[Rsamtools]{scanTabix}} and friends } \author{Michael Lawrence} rtracklayer/man/TrackDb-class.Rd0000644000175400017540000000255613556116552017623 0ustar00biocbuildbiocbuild\name{TrackDb-class} \docType{class} %% Classes: \alias{class:TrackDb} \alias{TrackDb-class} %% Accessors: \alias{$,TrackDb-method} \alias{$<-,TrackDb-method} \alias{[[,TrackDb,ANY,ANY-method} \alias{[[<-,TrackDb,ANY,ANY-method} %% Data Access: \alias{track<-,TrackDb,ANY-method} \title{Track Databases} \description{ The \code{TrackDb} class is an abstraction around a database of tracks. Implementations include \code{\linkS4class{BrowserSession}} derivatives and \code{\linkS4class{QuickloadGenome}}. Here, a track is defined as an interval dataset. } \section{Accessor Methods}{ Every implementation should support these methods: \describe{ \item{}{ \code{length(x)}: number of tracks } \item{}{ \code{names(x)}, \code{trackNames(x)}: names of the tracks } \item{}{ \code{mcols(x)}: merged metadata on the tracks } \item{}{ \code{track(x, name)}, \code{x$name}, \code{x[[name]]}: get the track called \code{name} } \item{}{ \code{track(x, name) <- value}, \code{x$name <- value}, \code{x[[name]] <- value}: store the track \code{value} under \code{name}. Different implementations will support different types for \code{value}. Generally, an interval data structure like \code{GenomicRanges}. } } } \author{Michael Lawrence} \keyword{methods} \keyword{classes} rtracklayer/man/TwoBitFile-class.Rd0000644000175400017540000001102613556116552020311 0ustar00biocbuildbiocbuild\name{TwoBitFile-class} \docType{class} %% Classes: \alias{class:TwoBitFile} \alias{TwoBitFile-class} \alias{class:2BitFile} \alias{2BitFile-class} %% Constructor: \alias{TwoBitFile} \alias{2BitFile} %% Accessors: \alias{seqinfo,TwoBitFile-method} %% Import: \alias{import.2bit} \alias{import.2bit,ANY-method} \alias{import,TwoBitFile,ANY,ANY-method} \alias{getSeq,TwoBitFile-method} %% Export: \alias{export.2bit} \alias{export.2bit,ANY-method} \alias{export,DNAStringSet,TwoBitFile,ANY-method} \alias{export,DNAStringSet,character,ANY-method} \alias{export,ANY,TwoBitFile,ANY-method} \title{2bit Files} \description{ These functions support the import and export of the UCSC 2bit compressed sequence format. The main advantage is speed of subsequence retrieval, as it only loads the sequence in the requested intervals. Compared to the FA format supported by Rsamtools, 2bit offers the additional feature of masking and also has better support in Java (and thus most genome browsers). The supporting \code{TwoBitFile} class is a reference to a TwoBit file. } \usage{ \S4method{import}{TwoBitFile,ANY,ANY}(con, format, text, which = as(seqinfo(con), "GenomicRanges"), ...) \S4method{getSeq}{TwoBitFile}(x, which = as(seqinfo(x), "GenomicRanges")) import.2bit(con, ...) \S4method{export}{ANY,TwoBitFile,ANY}(object, con, format, ...) \S4method{export}{DNAStringSet,TwoBitFile,ANY}(object, con, format) \S4method{export}{DNAStringSet,character,ANY}(object, con, format, ...) export.2bit(object, con, ...) } \arguments{ \item{con}{A path, URL or \code{TwoBitFile} object. Connections are not supported. For the functions ending in \code{.2bit}, the file format is indicated by the function name. For the \code{export} and \code{import} methods, the format must be indicated another way. If \code{con} is a path, or URL, either the file extension or the \code{format} argument needs to be \dQuote{twoBit} or \dQuote{2bit}. } \item{object,x}{The object to export, either a \code{DNAStringSet} or something coercible to a \code{DNAStringSet}, like a character vector. } \item{format}{If not missing, should be \dQuote{twoBit} or \dQuote{2bit} (case insensitive). } \item{text}{Not supported.} \item{which}{A range data structure coercible to \code{IntegerRangesList}, like a \code{GRanges}, or a \code{TwoBitFile}. Only the intervals in the file overlapping the given ranges are returned. By default, the value is the \code{TwoBitFile} itself. Its \code{Seqinfo} object is extracted and coerced to a \code{IntegerRangesList} that represents the entirety of the file. } \item{...}{Arguments to pass down to methods to other methods. For import, the flow eventually reaches the \code{TwoBitFile} method on \code{import}. For export, the \code{TwoBitFile} methods on \code{export} are the sink. } } \value{ For import, a \code{DNAStringSet}. } \note{ The 2bit format only suports A, C, G, T and N (via an internal mask). To export sequences with additional IUPAC ambiguity codes, first pass the object through \code{\link[Biostrings]{replaceAmbiguities}} from the Biostrings package. } \section{\code{TwoBitFile} objects}{ A \code{TwoBitFile} object, an extension of \code{\linkS4class{RTLFile}} is a reference to a TwoBit file. To cast a path, URL or connection to a \code{TwoBitFile}, pass it to the \code{TwoBitFile} constructor. A TwoBit file embeds the sequence information, which can be retrieved with the following: \describe{ \item{}{ \code{seqinfo(x)}: Gets the \code{\link[GenomeInfoDb]{Seqinfo}} object indicating the lengths of the sequences for the intervals in the file. No circularity or genome information is available. } } } \seealso{ \link[BSgenome]{export-methods} in the \pkg{BSgenome} package for exporting a \link[BSgenome]{BSgenome} object as a twoBit file. } \author{Michael Lawrence} \examples{ test_path <- system.file("tests", package = "rtracklayer") test_2bit <- file.path(test_path, "test.2bit") test <- import(test_2bit) test test_2bit_file <- TwoBitFile(test_2bit) import(test_2bit_file) # the whole file which_range <- IRanges(c(10, 40), c(30, 42)) which <- GRanges(names(test), which_range) import(test_2bit, which = which) seqinfo(test_2bit_file) \dontrun{ test_2bit_out <- file.path(tempdir(), "test_out.2bit") export(test, test_2bit_out) ## just a character vector test_char <- as.character(test) export(test_char, test_2bit_out) } } \keyword{methods} \keyword{classes} rtracklayer/man/UCSCData-class.Rd0000644000175400017540000000477513556116552017645 0ustar00biocbuildbiocbuild\name{UCSCData-class} \docType{class} \alias{UCSCData-class} \alias{export.bed,UCSCData,characterORconnection-method} \alias{export.bed15,UCSCData-method} \alias{export.gff,UCSCData,characterORconnection-method} \alias{export.ucsc,UCSCData,characterORconnection-method} \alias{initialize,UCSCData-method} \alias{show,UCSCData-method} \alias{coerce,GRanges,UCSCData-method} \alias{coerce,UCSCData,GRanges-method} \alias{split,UCSCData,ANY-method} \alias{split,UCSCData,Vector-method} \title{Class "UCSCData"} \description{Each track in \acronym{UCSC} has an associated \code{\linkS4class{TrackLine}} that contains metadata on the track.} \section{Slots}{ \describe{ \item{\code{trackLine}:}{Object of class \code{"TrackLine"} holding track metadata. } } } \section{Methods}{ \describe{ \item{\code{\link{export.bed}(object, con, variant = c("base", "bedGraph", "bed15"), color, trackLine = TRUE, ...)}}{ Exports the track and its track line (if \code{trackLine} is \code{TRUE}) to \code{con} in the Browser Extended Display (\acronym{BED}) format. The arguments in \code{...} are passed to \code{\link{export.ucsc}}. } \item{\code{\link{export.bed15}(object, con, expNames = NULL, ...)}}{ Exports the track and its track line (if \code{trackLine} is \code{TRUE}) to \code{con} in the Bed15 format. The data is taken from the columns named in \code{expNames}, which defaults to the \code{expNames} in the track line, if any, otherwise all column names. The arguments in \code{...} are passed to \code{\link{export.ucsc}}. } \item{\code{\link{export.gff}(object)}}{ Exports the track and its track line (as a comment) to \code{con} in the General Feature Format (\acronym{GFF}). } \item{\code{\link{export.ucsc}(object, con, subformat, ...)}}{ Exports the track and its track line to \code{con} in the \acronym{UCSC} meta-format. } \item{\code{as(object, "UCSCData")}}{Constructs a \code{UCSCData} from a \code{GRanges} instance, by adding a default track line and ensuring that the sequence/chromosome names are compliant with UCSC conventions. If there is a numeric score, the track line type is either "bedGraph" or "wig", depending on the feature density. Otherwise, "bed" is chosen. } } } \author{ Michael Lawrence } \seealso{ \code{\link{import}} and \code{\link{export}} for reading and writing tracks to and from connections (files), respectively. } \keyword{classes} rtracklayer/man/UCSCFile-class.Rd0000644000175400017540000001567313556116552017652 0ustar00biocbuildbiocbuild\name{UCSCFile-class} \docType{class} %% Classes: \alias{class:UCSCFile} \alias{UCSCFile-class} %% Constructor: \alias{UCSCFile} %% Import: \alias{import,UCSCFile,ANY,ANY-method} \alias{import.ucsc} \alias{import.ucsc,ANY-method} \alias{import.ucsc,RTLFile-method} %% Export: \alias{export,ANY,UCSCFile,ANY-method} \alias{export,GenomicRanges,UCSCFile,ANY-method} \alias{export,GenomicRangesList,UCSCFile,ANY-method} \alias{export,UCSCData,UCSCFile,ANY-method} \alias{export.ucsc} \alias{export.ucsc,ANY,ANY-method} \alias{export.ucsc,ANY,RTLFile-method} \title{UCSCFile objects} \description{ These functions support the import and export of tracks emucscded within the UCSC track line metaformat, whereby multiple tracks may be concatenated within a single file, along with metadata mostly oriented towards visualization. Any \code{\linkS4class{UCSCData}} object is automatically exported in this format, if the targeted format is known to be compatible. The BED and WIG import methods check for a track line, and delegate to these functions if one is found. Thus, calling this API directly is only necessary when importing embedded GFF (rare), or when one wants to create the track line during the export process. } \usage{ \S4method{import}{UCSCFile,ANY,ANY}(con, format, text, subformat = "auto", drop = FALSE, genome = NA, ...) import.ucsc(con, ...) \S4method{export}{ANY,UCSCFile,ANY}(object, con, format, ...) \S4method{export}{GenomicRanges,UCSCFile,ANY}(object, con, format, ...) \S4method{export}{GenomicRangesList,UCSCFile,ANY}(object, con, format, append = FALSE, index = FALSE, ...) \S4method{export}{UCSCData,UCSCFile,ANY}(object, con, format, subformat = "auto", append = FALSE, index = FALSE, ...) export.ucsc(object, con, ...) } \arguments{ \item{con}{A path, URL, connection or \code{UCSCFile} object. For the functions ending in \code{.ucsc}, the file format is indicated by the function name. For the base \code{export} and \code{import} functions, \dQuote{ucsc} must be passed as the \code{format} argument. } \item{object}{The object to export, should be a \code{GRanges} or something coercible to a \code{GRanges}. For exporting multiple tracks pass a \code{GenomicRangesList}, or something coercible to one. } \item{format}{If not missing, should be \dQuote{ucsc}.} \item{text}{If \code{con} is missing, a character vector to use as the input } \item{subformat}{The file format to use for the actual features, between the track lines. Must be a text-based format that is compatible with track lines (most are). If an \code{RTLFile} subclass other than \code{UCSCFile} is passed as \code{con} to \code{import.ucsc} or \code{export.ucsc}, the subformat is assumed to be the corresponding format of \code{con}. Otherwise it defaults to \dQuote{auto}. The following describes the logic of the \dQuote{auto} mode. For import, the subformat is taken as the \code{type} field in the track line. If none, the file extension is consulted. For export, if \code{object} is a \code{UCSCData}, the subformat is taken as the \code{type} in its track line, if present. Otherwise, the subformat is chosen based on whether \code{object} contains a \dQuote{score} column. If there is a score, the target is either \code{BEDGraph} or \code{WIG}, depending on the structure of the ranges. Otherwise, \code{BED} is the target. } \item{genome}{The identifier of a genome, or \code{NA} if unknown. Typically, this is a UCSC identifier like \dQuote{hg19}. An attempt will be made to derive the \code{seqinfo} on the return value using either an installed BSgenome package or UCSC, if network access is available. This defaults to the \code{db} BED track line parameter, if any. } \item{drop}{If \code{TRUE}, and there is only one track in the file, return the track object directly, rather than embedding it in a list. } \item{append}{If \code{TRUE}, and \code{con} points to a file path, the data is appended to the file. Obviously, if \code{con} is a connection, the data is always appended. } \item{index}{If \code{TRUE}, automatically compress and index the output file with bgzf and tabix. Note that tabix indexing will sort the data by chromosome and start. Tabix supports a single track in a file. } \item{...}{Should either specify track line parameters or arguments to pass down to the import and export routine for the subformat. } } \value{ A \code{GenomicRangesList} unless \code{drop} is \code{TRUE} and there is only a single track in the file. In that case, the first and only object is extracted from the list and returned. The structure of that object depends on the format of the data. The \code{GenomicRangesList} contains \code{UCSCData} objects. } \details{ The UCSC track line permits the storage of multiple tracks in a single file by separating them with a so-called \dQuote{track line}, a line belonging with the word \dQuote{track} and containing various \code{key=value} pairs encoding metadata, most related to visualization. The standard fields in a track depend on the type of track being annotated. See \code{\linkS4class{TrackLine}} and its derivatives for how these lines are represented in R. The class \code{\linkS4class{UCSCData}} is an extension of \code{GRanges} with a formal slot for a \code{TrackLine}. Each \code{GRanges} in the returned \code{GenomicRangesList} has the track line stored in its metadata, under the \code{trackLine} key. For each track object to be exported, if the object is not a \code{UCSCData}, and there is no \code{trackLine} element in the metadata, then a new track line needs to be generated. This happens through the coercion of \code{object} to \code{UCSCData}. The track line is initialized to have the appropriate \code{type} parameter for the subformat, and the required \code{name} parameter is taken from the name of the track in the input list (if any). Otherwise, the default is simply \dQuote{R Track}. The \code{db} parameter (specific to BED track lines) is taken as \code{genome(object)} if not \code{NA}. Additional arguments passed to the export routines override parameters in the provided track line. If the subformat is either WIG or BEDGraph, and the features are stranded, a separate track will be output in the file for each strand. Neither of those formats encodes the strand and disallow overlapping features (which might occur upon destranding). } \section{UCSCFile objects}{ The \code{UCSCFile} class extends \code{\linkS4class{RTLFile}} and is a formal represention of a resource in the UCSC format. To cast a path, URL or connection to a \code{UCSCFile}, pass it to the \code{UCSCFile} constructor. } \author{Michael Lawrence} \references{ \url{http://genome.ucsc.edu/goldenPath/help/customTrack.html} } \keyword{methods} \keyword{classes} rtracklayer/man/UCSCSchema-class.Rd0000644000175400017540000000247413556116552020166 0ustar00biocbuildbiocbuild\name{UCSCSchema-class} \docType{class} \alias{UCSCSchema-class} \alias{genome,UCSCSchema-method} \alias{tableName,UCSCSchema-method} \alias{genome,UCSCSchema-method} \alias{formatDescription} \alias{formatDescription,UCSCSchema-method} \alias{nrow,UCSCSchema-method} \alias{ucscSchema,UCSCSchemaDescription-method} % Accessors: \title{UCSC Schema} \description{This is a preliminary class that describes a table in the UCSC database. The description includes the table name, corresponding genome, row count, and a textual description of the format. In the future, we could provide more table information, like the links and sample data frame. This is awaiting a use-case.} \section{Accessor methods}{ In the code snippets below, \code{x}/\code{object} is a \code{UCSCSchema} object. \describe{ \item{}{\code{genome(x)}: Get the genome for the table. } \item{}{\code{tableName(x)}: Get the name of the table. } \item{}{\code{nrow(x)}: Get the number of rows in the table. } \item{}{\code{formatDescription(x)}: Get a textual description of the table format. } } } \author{ Michael Lawrence } \examples{ \dontrun{ session <- browserSession() genome(session) <- "mm9" query <- ucscTableQuery(session, "knownGene") schema <- ucscSchema(query) nrow(schema) } } \keyword{methods} \keyword{classes} rtracklayer/man/UCSCTableQuery-class.Rd0000644000175400017540000001707413556116552021045 0ustar00biocbuildbiocbuild\name{UCSCTableQuery-class} \docType{class} \alias{UCSCTableQuery-class} % Accessors: \alias{browserSession,UCSCTableQuery-method} \alias{browserSession<-} \alias{browserSession<-,UCSCTableQuery,UCSCSession-method} \alias{trackName} \alias{trackName,UCSCTableQuery-method} \alias{trackName<-} \alias{trackName<-,UCSCTableQuery-method} \alias{tableName} \alias{tableName,UCSCTableQuery-method} \alias{tableName<-} \alias{tableName<-,UCSCTableQuery-method} \alias{range,UCSCTableQuery-method} \alias{range<-,UCSCTableQuery-method} \alias{names,UCSCTableQuery-method} \alias{names<-,UCSCTableQuery-method} \alias{trackNames,UCSCTableQuery-method} \alias{ucscSchema} \alias{ucscSchema,UCSCTableQuery-method} % Query execution \alias{tableNames} \alias{tableNames,UCSCTableQuery-method} \alias{getTable} \alias{getTable,UCSCTableQuery-method} \alias{track} \alias{track,UCSCTableQuery-method} % Constructor: \alias{ucscTableQuery} \alias{ucscTableQuery,UCSCSession-method} \alias{ucscTableQuery,character-method} % Show: \alias{show,UCSCTableQuery-method} \title{Querying UCSC Tables} \description{The UCSC genome browser is backed by a large database, which is exposed by the Table Browser web interface. Tracks are stored as tables, so this is also the mechanism for retrieving tracks. The \code{UCSCTableQuery} class represents a query against the Table Browser. Storing the query fields in a formal class facilitates incremental construction and adjustment of a query.} \details{ There are five supported fields for a table query: \describe{ \item{session}{The \code{\linkS4class{UCSCSession}} instance from the tables are retrieved. Although all sessions are based on the same database, the set of user-uploaded tracks, which are represented as tables, is not the same, in general. } \item{trackName}{The name of a track from which to retrieve a table. Each track can have multiple tables. Many times there is a primary table that is used to display the track, while the other tables are supplemental. Sometimes, tracks are displayed by aggregating multiple tables. If \code{NULL}, search for a primary table across all of the tracks (will not find secondary tables). } \item{tableName}{The name of the specific table to retrieve. May be \code{NULL}, in which case the behavior depends on how the query is executed, see below. } \item{range}{A genome identifier, a \code{\link[GenomicRanges]{GRanges}} or a \code{\link[IRanges]{IntegerRangesList}} indicating the portion of the table to retrieve, in genome coordinates. Simply specifying the genome string is the easiest way to download data for the entire genome, and \code{\link{GRangesForUCSCGenome}} facilitates downloading data for e.g. an entire chromosome. } \item{names}{Names/accessions of the desired features} } A common workflow for querying the UCSC database is to create an instance of \code{UCSCTableQuery} using the \code{ucscTableQuery} constructor, invoke \code{tableNames} to list the available tables for a track, and finally to retrieve the desired table either as a \code{data.frame} via \code{getTable} or as a track via \code{track}. See the examples. The reason for a formal query class is to facilitate multiple queries when the differences between the queries are small. For example, one might want to query multiple tables within the track and/or same genomic region, or query the same table for multiple regions. The \code{UCSCTableQuery} instance can be incrementally adjusted for each new query. Some caching is also performed, which enhances performance. } \section{Constructor}{ \describe{ \item{}{ \code{ucscTableQuery(x, track, range = seqinfo(x), table = NULL, names = NULL)}: Creates a \code{UCSCTableQuery} with the \code{UCSCSession} or genome identifier given as \code{x} and the track name given by the single string \code{track}. \code{range} should be a genome string identifier, a \code{GRanges} instance or \code{IntegerRangesList} instance, and it effectively defaults to \code{genome(x)}. If the genome is missing, it is taken from the session. The table name is given by \code{table}, which may be a single string or \code{NULL}. Feature names, such as gene identifiers, may be passed via \code{names} as a character vector. } } } \section{Executing Queries}{ Below, \code{object} is a \code{UCSCTableQuery} instance. \describe{ \item{}{ \code{track(object)}: Retrieves the indicated table as a track, i.e. a \code{GRanges} object. Note that not all tables are available as tracks. } \item{}{ \code{getTable(object)}: Retrieves the indicated table as a \code{data.frame}. Note that not all tables are output in parseable form, and that UCSC will truncate responses if they exceed certain limits (usually around 100,000 records). The safest (and most efficient) bet for large queries is to download the file via FTP and query it locally. } \item{}{ \code{tableNames(object)}: Gets the names of the tables available for the session, track and range specified by the query. } } } \section{Accessor methods}{ In the code snippets below, \code{x}/\code{object} is a \code{UCSCTableQuery} object. \describe{ \item{}{\code{browserSession(object)}, \code{browserSession(object) <- value}: Get or set the \code{UCSCSession} to query. } \item{}{\code{trackName(x)}, \code{trackName(x) <- value}: Get or set the single string indicating the track containing the table of interest. } \item{}{\code{trackNames(x)}}{List the names of the tracks available for retrieval for the assigned genome.} \item{}{\code{tableName(x)}, \code{tableName(x) <- value}: Get or set the single string indicating the name of the table to retrieve. May be \code{NULL}, in which case the table is automatically determined. } \item{}{\code{range(x)}, \code{range(x) <- value}: Get or set the \code{GRanges} indicating the portion of the table to retrieve in genomic coordinates. Any missing information, such as the genome identifier, is filled in using \code{range(browserSession(x))}. It is also possible to set the genome identifier string or a \code{IntegerRangesList}. } \item{}{\code{names(x)}, \code{names(x) <- value}: Get or set the names of the features to retrieve. If \code{NULL}, this filter is disabled. } \item{}{\code{ucscSchema(x)}: Get the \code{\linkS4class{UCSCSchema}} object describing the selected table.} } } \author{ Michael Lawrence } \examples{ \dontrun{ session <- browserSession() genome(session) <- "mm9" trackNames(session) ## list the track names ## choose the Conservation track for a portion of mm9 chr1 query <- ucscTableQuery(session, "Conservation", GRangesForUCSCGenome("mm9", "chr12", IRanges(57795963, 57815592))) ## list the table names tableNames(query) ## get the phastCons30way track tableName(query) <- "phastCons30way" ## retrieve the track data track(query) # a GRanges object ## get a data.frame summarizing the multiple alignment tableName(query) <- "multiz30waySummary" getTable(query) genome(session) <- "hg18" query <- ucscTableQuery(session, "snp129", names = c("rs10003974", "rs10087355", "rs10075230")) ucscSchema(query) getTable(query) } } \keyword{methods} \keyword{classes} rtracklayer/man/WIGFile-class.Rd0000644000175400017540000001516113556116552017533 0ustar00biocbuildbiocbuild\name{WIGFile-class} \docType{class} %% Classes: \alias{class:WIGFile} \alias{WIGFile-class} %% Constructor: \alias{WIGFile} %% Import: \alias{import,WIGFile,ANY,ANY-method} \alias{import.wig} \alias{import.wig,ANY-method} %% Export: \alias{export,ANY,WIGFile,ANY-method} \alias{export,GenomicRanges,WIGFile,ANY-method} \alias{export,GenomicRangesList,WIGFile,ANY-method} \alias{export,UCSCData,WIGFile,ANY-method} \alias{export.wig} \alias{export.wig,ANY-method} \title{WIG Import and Export} \description{ These functions support the import and export of the UCSC WIG (Wiggle) format. } \usage{ \S4method{import}{WIGFile,ANY,ANY}(con, format, text, genome = NA, trackLine = TRUE, which = NULL, seqinfo = NULL, ...) import.wig(con, ...) \S4method{export}{ANY,WIGFile,ANY}(object, con, format, ...) \S4method{export}{GenomicRanges,WIGFile,ANY}(object, con, format, dataFormat = c("auto", "variableStep", "fixedStep"), writer = .wigWriter, append = FALSE, ...) \S4method{export}{GenomicRangesList,WIGFile,ANY}(object, con, format, ...) \S4method{export}{UCSCData,WIGFile,ANY}(object, con, format, trackLine = TRUE, ...) export.wig(object, con, ...) } \arguments{ \item{con}{A path, URL, connection or \code{WIGFile} object. For the functions ending in \code{.wig}, the file format is indicated by the function name. For the base \code{export} and \code{import} functions, the format must be indicated another way. If \code{con} is a path, URL or connection, either the file extension or the \code{format} argument needs to be \dQuote{wig}. Compressed files (\dQuote{gz}, \dQuote{bz2} and \dQuote{xz}) are handled transparently. } \item{object}{The object to export, should be a \code{GRanges} or something coercible to a \code{GRanges}. For exporting multiple tracks, in the UCSC track line metaformat, pass a \code{GenomicRangesList}, or something coercible to one. } \item{format}{If not missing, should be \dQuote{wig}. } \item{text}{If \code{con} is missing, a character vector to use as the input } \item{trackLine}{Whether to parse/output a UCSC track line. An imported track line will be stored in a \code{\linkS4class{TrackLine}} object, as part of the returned \code{\linkS4class{UCSCData}}. } \item{genome}{The identifier of a genome, or \code{NA} if unknown. Typically, this is a UCSC identifier like \dQuote{hg19}. An attempt will be made to derive the \code{seqinfo} on the return value using either an installed BSgenome package or UCSC, if network access is available. } \item{seqinfo}{If not \code{NULL}, the \code{Seqinfo} object to set on the result. If the \code{genome} argument is not \code{NA}, it must agree with \code{genome(seqinfo)}. } \item{which}{A range data structure like \code{IntegerRangesList} or \code{GRanges}. Only the intervals in the file overlapping the given ranges are returned. This is inefficient; use BigWig for efficient spatial queries. } \item{append}{If \code{TRUE}, and \code{con} points to a file path, the data is appended to the file. Obviously, if \code{con} is a connection, the data is always appended. } \item{dataFormat}{Probably best left to \dQuote{auto}. Exists only for historical reasons. } \item{writer}{Function for writing out the blocks; for internal use only. } \item{...}{Arguments to pass down to methods to other methods. For import, the flow eventually reaches the \code{WIGFile} method on \code{import}. When \code{trackLine} is \code{TRUE}, the arguments are passed through \code{export.ucsc}, so track line parameters are supported. } } \value{ A \code{GRanges} with the score values in the \code{score} metadata column, which is accessible via the \code{score} function. } \details{ The WIG format is a text-based format for efficiently representing a dense genome-scale score vector. It encodes, for each feature, a range and score. Features from the same sequence (chromosome) are grouped together into a block, with a single block header line indicating the chromosome. There are two block formats: fixed step and variable step. For fixed step, the number of positions (or step) between intervals is the same across an entire block. For variable step, the start position is specified for each feature. For both fixed and variable step, the span (or width) is specified in the header and thus must be the same across all features. This requirement of uniform width dramatically limits the applicability of WIG. For scored features of variable width, consider \link[=BEDGraphFile]{BEDGraph} or \link[=BigWigFile]{BigWig}, which is generally preferred over both WIG and BEDGraph. To efficiently convert an existing WIG or BEDGraph file to BigWig, call \code{\link{wigToBigWig}}. Neither WIG, BEDGraph nor BigWig allow overlapping features. } \section{WIGFile objects}{ The \code{WIGFile} class extends \code{\linkS4class{RTLFile}} and is a formal represention of a resource in the WIG format. To cast a path, URL or connection to a \code{WIGFile}, pass it to the \code{WIGFile} constructor. } \author{Michael Lawrence} \references{ \url{http://genome.ucsc.edu/goldenPath/help/wiggle.html} } \examples{ test_path <- system.file("tests", package = "rtracklayer") test_wig <- file.path(test_path, "step.wig") ## basic import calls test <- import(test_wig) test import.wig(test_wig) test_wig_file <- WIGFile(test_wig) import(test_wig_file) test_wig_con <- file(test_wig) import(test_wig_con, format = "wig") test_wig_con <- file(test_wig) import(WIGFile(test_wig_con)) ## various options import(test_wig, genome = "hg19") import(test_wig, trackLine = FALSE) which <- as(test[3:4,], "IntegerRangesList") import(test_wig, which = which) \dontrun{ ## basic export calls test_wig_out <- file.path(tempdir(), "test.wig") export(test, test_wig_out) export.wig(test, test_wig_out) test_foo_out <- file.path(tempdir(), "test.foo") export(test, test_foo_out, format = "wig") test_wig_out_file <- WIGFile(test_wig_out) export(test, test_wig_out_file) ## appending test2 <- test metadata(test2)$trackLine <- initialize(metadata(test)$trackLine, name = "test2") export(test2, test_wig_out_file, append = TRUE) ## passing track line parameters export(test, test_wig_out, name = "test2") ## no track line export(test, test_wig_out, trackLine = FALSE) ## gzip test_wig_gz <- paste(test_wig_out, ".gz", sep = "") export(test, test_wig_gz) } } \keyword{methods} \keyword{classes} rtracklayer/man/activeView-methods.Rd0000644000175400017540000000124313556116552020745 0ustar00biocbuildbiocbuild\name{activeView-methods} \docType{methods} \alias{activeView} \alias{activeView<-} \alias{activeView-methods} \alias{activeView<--methods} \alias{activeView,BrowserSession-method} \alias{activeView,UCSCView-method} \title{Accessing the active view} \description{ Get the active view. } \section{Methods}{ The following methods are defined by \pkg{rtracklayer}. \describe{ \item{object = "BrowserSession"}{ \code{activeView(object)}: Gets the active \code{\linkS4class{BrowserView}} from a browser session. \code{activeView(object) <- value}: Sets the active \code{\linkS4class{BrowserView}} in a browser session. } }} \keyword{methods} rtracklayer/man/asBED.Rd0000644000175400017540000000243613556116552016121 0ustar00biocbuildbiocbuild\name{asBED} \alias{asBED} \alias{asBED,GRangesList-method} \alias{asBED,GAlignments-method} \title{Coerce to BED structure} \description{ Coerce the structure of an object to one following BED-like conventions, i.e., with columns for blocks and thick regions. } \usage{ asBED(x, ...) \S4method{asBED}{GRangesList}(x) \S4method{asBED}{GAlignments}(x) } \arguments{ \item{x}{ Generally, a tabular object to structure as BED } \item{\dots}{ Arguments to pass to methods } } \details{ The exact behavior depends on the class of \code{object}. \describe{ \item{\code{GRangesList}}{This treats \code{object} as if it were a list of transcripts, i.e., each element contains the exons of a transcript. The \code{blockStarts} and \code{blockSizes} columns are derived from the ranges in each element. Also, add \code{name} column from \code{names(object)}. } \item{\code{GAlignments}}{Converts to GRangesList via \code{grglist} and procedes accordingly. } } } \value{ A \code{GRanges}, with the columns \code{name}, \code{blockStarts} and \code{blockSizes} added. } \author{ Michael Lawrence } \examples{ \dontrun{ library(TxDb.Hsapiens.UCSC.hg19.knownGene) exons <- exonsBy(TxDb_Hsapiens_UCSC_hg19_knownGene) mcols(asBED(exons)) } } rtracklayer/man/asGFF.Rd0000644000175400017540000000243713556116552016132 0ustar00biocbuildbiocbuild\name{asGFF} \alias{asGFF} \alias{asGFF,GRangesList-method} \title{Coerce to GFF structure} \description{ Coerce the structure of an object to one following GFF-like conventions, i.e., using the \code{Parent} GFF3 attribute to encode the hierarchical structure. This object is then suitable for export as GFF3. } \usage{ asGFF(x, ...) \S4method{asGFF}{GRangesList}(x, parentType = "mRNA", childType = "exon") } \arguments{ \item{x}{ Generally, a tabular object to structure as GFF(3) } \item{parentType}{The value to store in the \code{type} column for the top-level (e.g., transcript) ranges. } \item{childType}{The value to store in the \code{type} column for the child (e.g., exon) ranges. } \item{\dots}{ Arguments to pass to methods } } \value{ For the \code{GRangesList} method: A \code{GRanges}, with the columns: \code{ID} (unique identifier), \code{Name} (from \code{names(x)}, and the names on each element of \code{x}, if any), \code{type} (as given by \code{parentType} and \code{childType}), and \code{Parent} (to relate each child range to its parent at the top-level). } \author{ Michael Lawrence } \examples{ \dontrun{ library(TxDb.Hsapiens.UCSC.hg19.knownGene) exons <- exonsBy(TxDb_Hsapiens_UCSC_hg19_knownGene) mcols(asGFF(exons)) } } rtracklayer/man/basicTrackLine-class.Rd0000644000175400017540000000561213556116552021163 0ustar00biocbuildbiocbuild\name{BasicTrackLine-class} \docType{class} \alias{BasicTrackLine-class} \alias{coerce,character,BasicTrackLine-method} \alias{coerce,BasicTrackLine,character-method} \title{Class "BasicTrackLine"} \description{The type of \acronym{UCSC} track line used to annotate most types of tracks (every type except Wiggle).} \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("BasicTrackLine", ...)} or parsed from a character vector track line with \code{as(text, "BasicTrackLine")} or converted from a \code{\linkS4class{GraphTrackLine}} using \code{as(wig, "BasicTrackLine")}. } \section{Slots}{ \describe{ \item{\code{itemRgb}:}{Object of class \code{"logical"} indicating whether each feature in a track uploaded as \acronym{BED} should be drawn in its specified color. } \item{\code{useScore}:}{Object of class \code{"logical"} indicating whether the data value should be mapped to color. } \item{\code{group}:}{Object of class \code{"character"} naming a group to which this track should belong. } \item{\code{db}:}{Object of class \code{"character"} indicating the associated genome assembly. } \item{\code{offset}:}{Object of class \code{"numeric"}, a number added to all positions in the track. } \item{\code{url}:}{Object of class \code{"character"} referring to additional information about this track. } \item{\code{htmlUrl}:}{Object of class \code{"character"} referring to an \acronym{HTML} page to be displayed with this track. } \item{\code{name}:}{Object of class \code{"character"} specifying the name of the track. } \item{\code{description}:}{Object of class \code{"character"} describing the track. } \item{\code{visibility}:}{Object of class \code{"character"} indicating the default visible mode of the track, see \code{\linkS4class{UCSCTrackModes}}.} \item{\code{color}:}{Object of class \code{"integer"} representing the track color (as from \code{\link{col2rgb}}). } \item{\code{colorByStrand}:}{Object of class \code{"matrix"} with two columns, as from \code{col2rgb}. The two colors indicate the color for each strand (positive, negative). } \item{\code{priority}:}{Object of class \code{"numeric"} specifying the rank of the track. } } } \section{Extends}{ Class \code{"\linkS4class{TrackLine}"}, directly. } \section{Methods}{ \describe{ \item{as(object, "character")}{Export line to its string representation.} \item{as(object, \code{"\linkS4class{GraphTrackLine}"})}{Convert this line to a graph track line, using defaults for slots not held in common.} } } \references{ \url{http://genome.ucsc.edu/goldenPath/help/customTrack.html#TRACK} for the official documentation. } \author{ Michael Lawrence } \seealso{ \code{\linkS4class{GraphTrackLine}} for Wiggle/bedGraph tracks. } \keyword{classes} rtracklayer/man/blocks-methods.Rd0000644000175400017540000000242313556116552020115 0ustar00biocbuildbiocbuild\name{blocks-methods} \docType{methods} \alias{blocks} \alias{blocks-methods} \alias{blocks,GenomicRanges-method} \title{Get blocks/exons} \description{ Obtains the block ranges (subranges, usually exons) from an object, such as a \code{\link[GenomicRanges]{GRanges}} imported from a BED file. } \usage{ blocks(x, ...) } \arguments{ \item{x}{The instance from which to obtain the block/exon information. Currently must be a \code{GenomicRanges}, with a metadata column of name \dQuote{blocks} and of type \code{IntegerRangesList}. Such an object is returned by \code{\link{import.bed}} and \code{\link{asBED}}. } \item{...}{Additional arguments for methods} } \value{ A \code{\link[GenomicRanges:GRangesList-class]{GRangesList}} with an element for each range in \code{x}. The original block ranges are relative to the start of the containing range, so the returned ranges are shifted to absolute coordinates. The seqname and strand are inherited from the containing range. } \author{Michael Lawrence} \seealso{\code{\link{import.bed}} for importing a track from BED, which can store block information; \code{\link{asBED}} for coercing a \code{GenomicRanges} into a BED-like structure that can be passed to this function. } \keyword{methods} \keyword{manip} rtracklayer/man/browseGenome.Rd0000644000175400017540000000364213556116552017637 0ustar00biocbuildbiocbuild\name{browseGenome} \alias{browseGenome} \alias{browseGenome,GenomicRanges_OR_GenomicRangesList-method} \alias{browseGenome,missing-method} \title{ Browse a genome } \description{ A generic function for launching a genome browser. } \usage{ browseGenome(object, ...) \S4method{browseGenome}{GenomicRanges_OR_GenomicRangesList}(object, browser = "UCSC", range = base::range(object), view = TRUE, trackParams = list(), viewParams = list(), name = "customTrack", ...) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{object}{ A \code{\link[GenomicRanges]{GRanges}} object or a list of \code{\link[GenomicRanges]{GRanges}} objects (e.g. a \code{\link[GenomicRanges]{GenomicRangesList}} object). } \item{browser}{ The name of the genome browser. } \item{range}{ A genome identifier or a \code{\link[GenomicRanges]{GRanges}} or \code{\link[IRanges]{IntegerRangesList}} to display in the initial view. } \item{view}{ Whether to open a view. } \item{trackParams}{ Named list of parameters to pass to \code{\link{track<-}}. } \item{viewParams}{ Named list of parameters to pass to \code{\link{browserView}}. } \item{name}{ The name for the track. } \item{\dots}{ Arguments passed to \code{\link{browserSession}}. } } \value{ Returns a \code{\linkS4class{BrowserSession}}. } \author{ Michael Lawrence } \seealso{ \code{\linkS4class{BrowserSession}} and \code{\linkS4class{BrowserView}}, the two main classes for interfacing with genome browsers.} \examples{ \dontrun{ ## open UCSC genome browser: browseGenome() ## to view a specific range: range <- GRangesForUCSCGenome("hg18", "chr22", IRanges(20000, 50000)) browseGenome(range = range) ## a slightly larger range: browseGenome(range = range, end = 75000) ## with a track: track <- import(system.file("tests", "v1.gff", package = "rtracklayer")) browseGenome(GRangesList(track)) } } \keyword{interface} rtracklayer/man/browserSession-class.Rd0000644000175400017540000001011513556116552021326 0ustar00biocbuildbiocbuild\name{BrowserSession-class} \docType{class} \alias{BrowserSession-class} \alias{show,BrowserSession-method} \alias{range,BrowserSession-method} \alias{genome,BrowserSession-method} \alias{genome<-,BrowserSession-method} \alias{names,BrowserSession-method} \alias{trackNames,BrowserSession-method} \title{Class "BrowserSession"} \description{An object representing a genome browser session. As a derivative of \code{\linkS4class{TrackDb}}, each session contains a set of loaded tracks. In addition, it has a set of views, in the form of \code{\linkS4class{BrowserView}} instances, on those tracks. Note that this is a virtual class; a concrete implementation is provided by each backend driver.} \section{Objects from the Class}{A virtual Class: No objects may be created from it. See \code{\link{browserSession}} for obtaining an instance of an implementation for a particular genome browser.} \section{Methods}{ This specifies the API implemented by each browser backend. Note that a backend is not required to support all operations, and that each backend often has additional parameters for each of the methods. See the backend-specific documentation for more details. The only built-in backend is \code{\linkS4class{UCSCSession}}. If a method is denoted as \emph{virtual}, it must be implemented by the backend to support the corresponding feature. Otherwise, the fallback behavior is described. \describe{ \item{\emph{virtual} \code{\link{browserView}(object, range = range(object), track = trackNames(object), ...)}}{ Constructs a \code{\linkS4class{BrowserView}} of \code{range} for this session. } \item{\emph{virtual} \code{\link{browserViews}(object, ...)}}{ Gets the \code{\linkS4class{BrowserView}} instances belonging to this session.} \item{\code{\link{activeView}(object, ...)}}{ Returns the \code{\linkS4class{BrowserView}} that is currently active in the session. Fallback calls \code{browserViews} and queries each view with \code{activeView}.} \item{\code{\link{range}(x, ...)}}{ Gets the \code{\link[GenomicRanges:GRanges-class]{GRanges}} representing the range of the genome currently displayed by the browser (i.e. the range shown by the active view) or a default value (possibly \code{NULL}) if no views exist. } \item{\emph{virtual} \code{\link[Biostrings]{getSeq}(object, range = range(object), ...)}}{ gets a genomic sequence of \code{range} from this session.} \item{\emph{virtual} \code{\link[=sequence<-]{sequence}(object, ...) <- value}}{ Loads a sequence into the session.} \item{\emph{virtual} \code{\link[=track<-]{track}(object, name = deparse(substitute(track)), view = TRUE, ...) <- value}}{ Loads one or more \code{track}s into the session and optionally open a \code{view} of the track. } \item{\code{x[[i]] <- value}}{Loads the track \code{value} into session \code{x}, under the name \code{i}. Shortcut to above.} \item{\code{x$name <- value}}{Loads the track \code{value} into session \code{x}, under the name \code{name}. Shortcut to above.} \item{\emph{virtual} \code{\link{track}(object, ...)}}{ Gets a track from a session. } \item{\code{x[[i]]}}{Gets the track named \code{i} from session \code{x}. A shortcut to \code{track}. } \item{\code{x$name}}{Gets the track named \code{name} from session \code{x}. A shortcut to \code{track}.} \item{\emph{virtual} \code{\link{trackNames}(object, ...)}}{ Gets the names of the tracks stored in this session. } \item{\emph{virtual} \code{\link{genome}(x)}, \code{genome(x) <- value}}{ Gets or sets the genome identifier (e.g. \dQuote{hg18}) for the session.} \item{\emph{virtual} \code{\link{close}(con, ...)}}{ Close this session. } \item{\code{\link{show}(object, ...)}}{ Output a textual description of this session.} } } \author{ Michael Lawrence } \seealso{ \code{\link{browserSession}} for obtaining implementations of this class for a particular genome browser. } \keyword{classes} rtracklayer/man/browserSession-methods.Rd0000644000175400017540000000171213556116552021667 0ustar00biocbuildbiocbuild\name{browserSession-methods} \docType{methods} \alias{browserSession} \alias{browserSession-methods} \alias{browserSession,character-method} \alias{browserSession,BrowserView-method} \alias{browserSession,missing-method} \title{ Get a genome browser session } \description{ Methods for getting browser sessions. } \section{Methods}{ The following methods are defined by \pkg{rtracklayer}. \describe{ \item{object = "character"}{ \code{browserSession(object, ...)}: Creates a \code{\linkS4class{BrowserSession}} from a genome browser identifier. The identifier corresponds to the prefix of the session class name (e.g. "UCSC" in "UCSCSession"). The arguments in \dots are passed to the initialization function of the class.} \item{object = "browserView"}{ Gets the \code{\linkS4class{BrowserSession}} for the view. } \item{object = "missing"}{ Calls \code{browserSession("ucsc", ...)}. } } } \keyword{methods} rtracklayer/man/browserView-class.Rd0000644000175400017540000000403013556116552020614 0ustar00biocbuildbiocbuild\name{BrowserView-class} \docType{class} \alias{BrowserView-class} \alias{show,BrowserView-method} \alias{visible} \alias{visible,BrowserView-method} \alias{visible<-} \alias{visible<-,BrowserView-method} \title{Class "BrowserView"} \description{ An object representing a genome browser view of a particular segment of a genome. } \section{Objects from the Class}{ A virtual Class: No objects may be created from it directly. See \code{\link{browserView}} for obtaining an instance of an implementation for a particular genome browser. } \section{Slots}{ \describe{ \item{\code{session}:}{Object of class \code{"BrowserSession"} the browser session to which this view belongs. } } } \section{Methods}{ This specifies the API implemented by each browser backend. Note that a backend is not guaranteed to support all operations. See the backend-specific documentation for more details. The only built-in backend is \code{\linkS4class{UCSCView}}. \describe{ \item{\code{\link{browserSession}(object)}}{ Obtains the \code{\linkS4class{BrowserSession}} to which this view belongs. } \item{\code{\link{close}(object)}}{ Close this view. } \item{\code{\link{range}(object)}}{ Obtains the \code{\link[GenomicRanges:GRanges-class]{GRanges}} displayed by this view.} \item{\code{\link{trackNames}(object)}}{ Gets the names of the visible tracks in the view. } \item{\code{\link{trackNames}(object) <- value}}{ Sets the visible tracks by their names. } \item{\code{\link{show}(object)}}{ Outputs a textual description of this view. } \item{\code{visible(object)}}{Get a named logical vector indicating whether each track is visible. } \item{\code{visible(object) <- value}}{Set a logical vector indicating the visibility of each track, with the same names and in the same order as that returned by \code{visible(object)}. } } } \author{ Michael Lawrence } \seealso{ \code{\link{browserView}} for obtaining instances of this class. } \keyword{classes} rtracklayer/man/browserView-methods.Rd0000644000175400017540000000325713556116552021164 0ustar00biocbuildbiocbuild\name{browserView-methods} \docType{methods} \alias{browserView} \alias{browserView-methods} \alias{browserView,UCSCSession-method} \title{Getting browser views} \description{ Methods for creating and getting browser views. } \usage{ browserView(object, range, track, ...) } \arguments{ \item{object}{The object from which to get the views.} \item{range}{The \code{\link[GenomicRanges]{GRanges}} or \code{\link[IRanges]{IntegerRangesList}} to display. If there are multiple elements, a view is created for each element and a \code{\linkS4class{BrowserViewList}} is returned.} \item{track}{List of track names to make visible in the view.} \item{\dots}{Arguments to pass to methods} } \section{Methods}{ The following methods are defined by \pkg{rtracklayer}. \describe{ \item{object = "UCSCSession"}{ \code{browserView(object, range = range(object), track = trackNames(object), imagewidth = 800, ...)}: Creates a \code{\linkS4class{BrowserView}} of \code{range} with visible tracks specified by \code{track}. The \code{imagewidth} parameter specifies the width of the track image in pixels. \code{track} may be an instance of \code{\linkS4class{UCSCTrackModes}}. Arguments in \code{...} are passed to \code{\link{ucscTrackModes}} to create the \code{UCSCTrackModes} instance that will override modes indicated by the \code{track} parameter. } }} \examples{ \dontrun{ session <- browserSession() browserView(session, GRangesForUCSCGenome("hg19", "chr2", IRanges(20000, 50000))) ## only view "knownGene" track browserView(session, track = "knownGene") } } \keyword{methods} rtracklayer/man/browserViews-methods.Rd0000644000175400017540000000110613556116552021336 0ustar00biocbuildbiocbuild\name{browserViews-methods} \docType{methods} \alias{browserViews} \alias{browserViews-methods} \alias{browserViews,UCSCSession-method} \title{ Getting the browser views } \description{ Methods for getting browser views. } \section{Methods}{ \describe{ The following methods are defined by \pkg{rtracklayer}. \item{object = "UCSCSession"}{ Gets the instances of \code{\linkS4class{BrowserView}} in the session. } }} \seealso{\code{\link{browserView}} for creating a browser view.} \examples{ \dontrun{ session <- browseGenome() browserViews(session) } } \keyword{methods} rtracklayer/man/cpneTrack.Rd0000644000175400017540000000137213556116552017113 0ustar00biocbuildbiocbuild\name{cpneTrack} \alias{cpneTrack} \docType{data} \title{CPNE1 SNP track} \description{ A \code{GRanges} object (created by the \code{GGtools} package) with features from a subset of the SNPs on chromosome 20 from 60 HapMap founders in the CEU cohort. Each SNP has an associated data value indicating its association with the expression of the CPNE1 gene according to a Cochran-Armitage 1df test. The top 5000 scoring SNPs were selected for the track. } \usage{data(cpneTrack)} \format{ Each feature (row) is a SNP. The association test scores are accessible via \code{\link[BiocGenerics]{score}}. } \source{ Vince Carey and the \code{GGtools} package. } \examples{ data(cpneTrack) plot(start(cpneTrack), score(cpneTrack)) } \keyword{datasets} rtracklayer/man/export.Rd0000644000175400017540000001762213556116552016527 0ustar00biocbuildbiocbuild\name{io} \alias{export} \alias{export,ANY,connection,character-method} \alias{export,ANY,connection,missing-method} \alias{export,ANY,CompressedFile,missing-method} \alias{export,ANY,missing,character-method} \alias{export,ANY,character,missing-method} \alias{export,ANY,character,character-method} \alias{import} \alias{import,connection,character,ANY-method} \alias{import,connection,missing,ANY-method} \alias{import,CompressedFile,missing,ANY-method} \alias{import,character,missing,ANY-method} \alias{import,character,character,ANY-method} \alias{import,missing,ANY,character-method} %- Also NEED an '\alias' for EACH other topic documented here. \title{ Import and export } \description{ The functions \code{import} and \code{export} load and save objects from and to particular file formats. The rtracklayer package implements support for a number of annotation and sequence formats. } \usage{ export(object, con, format, ...) import(con, format, text, ...) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{object}{ The object to export. } \item{con}{ The connection from which data is loaded or to which data is saved. If this is a character vector, it is assumed to be a filename and a corresponding file connection is created and then closed after exporting the object. If a \code{\linkS4class{RTLFile}} derivative, the data is loaded from or saved to the underlying resource. If missing, the function will return the output as a character vector, rather than writing to a connection. } \item{format}{ The format of the output. If missing and \code{con} is a filename, the format is derived from the file extension. This argument is unnecessary when \code{con} is a derivative of \code{\linkS4class{RTLFile}}. } \item{text}{ If \code{con} is missing, this can be a character vector directly providing the string data to import. } \item{\dots}{ Parameters to pass to the format-specific method. } } \details{ The rtracklayer package supports a number of file formats for representing annotated genomic intervals. These are each represented as a subclass of \code{\linkS4class{RTLFile}}. Below, we list the major supported formats, with some advice for when a particular file format is appropriate: \describe{ \item{\acronym{\link[=GFFFile]{GFF}}}{The General Feature Format is meant to represent any set of genomic features, with application-specific columns represented as \dQuote{attributes}. There are three principal versions (1, 2, and 3). This is a good format for interoperating with other genomic tools and is the most flexible format, in that a feature may have any number of attributes (in version 2 and above). Version 3 (GFF3) is the preferred version. Its specification lays out conventions for representing various types of data, including gene models, for which it is the format of choice. For variants, rtracklayer has rudimentary support for an extention of GFF3 called GVF. UCSC supports GFF1, but it needs to be encapsulated in the UCSC metaformat, i.e. \code{export.ucsc(subformat = "gff1")}. The BED format is typically preferred over GFF for interaction with UCSC. GFF files can be indexed with the tabix utility for fast range-based queries via rtracklayer and Rsamtools. } \item{\acronym{\link[=BEDFile]{BED}}}{The Browser Extended Display format is for displaying qualitative tracks in a genome browser, in particular UCSC. It finds a good balance between simplicity and expressiveness. It is much simpler than GFF and yet can still represent multi-exon gene structures. It is somewhat limited by its lack of the attribute support of GFF. To circumvent this, many tools and organizations have extended BED with additional columns. Use the \code{extraCols} argument on \code{import} to read those columns into R. The rtracklayer package supports two official extensions of BED: Bed15 and bedGraph, and the unofficial BEDPE format, see below. BED files can be indexed with the tabix utility for fast range-based queries via rtracklayer and Rsamtools. } \item{\acronym{\link[=BED15File]{Bed15}}}{An extension of BED with 15 columns, Bed15 is meant to represent data from microarray experiments. Multiple samples/columns are supported, and the data is displayed in UCSC as a compact heatmap. Few other tools support this format. With 15 columns per feature, this format is probably too verbose for e.g. ChIP-seq coverage (use multiple BigWig tracks instead).} \item{\acronym{\link[=BEDGraphFile]{bedGraph}}}{A variant of BED that represents a score column more compactly than \acronym{BED} and especially \acronym{Bed15}, although only one sample is supported. The data is displayed in UCSC as a bar or line graph. For large data (the typical case), \code{BigWig} is preferred. } \item{\acronym{\link[=BEDPEFile]{BEDPE}}}{A variant of BED that represents pairs of genomic regions, such as interaction data or chromosomal rearrangements. The data cannot be displayed in UCSC directly but can be represented using the BED12 format. } \item{\acronym{\link[=WIGFile]{WIG}}}{The Wiggle format is meant for storing dense numerical data, such as window-based GC and conservation scores. The data is displayed in UCSC as a bar or line graph. The WIG format only works for intervals with a uniform width. For non-uniform widths, consider \code{bedGraph}. For large data, consider \code{BigWig}. } \item{\acronym{\link[=BigWigFile]{BigWig}}}{The BigWig format is a binary version of both \code{bedGraph} and \code{WIG} (which are now somewhat obsolete). A BigWig file contains a spatial index for fast range-based queries and also embeds summary statistics of the scores at several zoom levels. Thus, it is ideal for visualization of and parallel computing on genome-scale vectors, like the coverage from a high-throughput sequencing experiment. } } In summary, for the typical use case of combining gene models with experimental data, \acronym{GFF} is preferred for gene models and \code{BigWig} is preferred for quantitative score vectors. Note that the Rsamtools package provides support for the \code{\link[Rsamtools:BamFile]{BAM}} file format (for representing read alignments), among others. Based on this, the rtracklayer package provides an \code{export} method for writing \code{GAlignments} and \code{GappedReads} objects as \code{BAM}. For variants, consider VCF, supported by the VariantAnnotation package. There is also support for reading and writing biological sequences, including the UCSC \code{\link[=TwoBitFile]{TwoBit}} format for compactly storing a genome sequence along with a mask. The files are binary, so they are efficiently queried for particular ranges. A similar format is \code{\link[Rsamtools:FaFile]{FA}}, supported by Rsamtools. } \value{ If \code{con} is missing, a character vector containing the string output. Otherwise, nothing is returned. } \author{ Michael Lawrence } \seealso{ Format-specific options for the popular formats: \acronym{\link[=GFFFile]{GFF}}, \acronym{\link[=BEDFile]{BED}}, \acronym{\link[=BED15File]{Bed15}}, \acronym{\link[=BEDGraphFile]{bedGraph}}, \acronym{\link[=WIGFile]{WIG}}, \acronym{\link[=BigWigFile]{BigWig}} } \examples{ track <- import(system.file("tests", "v1.gff", package = "rtracklayer")) \dontrun{export(track, "my.gff", version = "3")} ## equivalently, \dontrun{export(track, "my.gff3")} ## or \dontrun{ con <- file("my.gff3") export(track, con, "gff3") } ## or as a string export(track, format = "gff3") } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{IO} rtracklayer/man/genomeBrowsers.Rd0000644000175400017540000000164513556116552020205 0ustar00biocbuildbiocbuild\name{genomeBrowsers} \alias{genomeBrowsers} \title{Get available genome browsers} \description{ Gets the identifiers of the loaded genome browser drivers. } \usage{ genomeBrowsers(where = topenv(parent.frame())) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{where}{ The environment in which to search for drivers. } } \details{ This searches the specified environment for classes that extend \code{\linkS4class{BrowserSession}}. The prefix of the class name, e.g. "ucsc" in "UCSCSession", is returned for each driver. } \value{ A character vector of driver identifiers. } \author{ Michael Lawrence } \seealso{ \code{\link{browseGenome}} and \code{\link{browserSession}} that create \code{browserSession} implementations given an identifier returned from this function. } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{interface} rtracklayer/man/laySequence-methods.Rd0000644000175400017540000000047713556116552021125 0ustar00biocbuildbiocbuild\name{sequence<--methods} \docType{methods} \alias{sequence<-} \alias{sequence<--methods} \title{ Load a sequence } \description{ Methods for loading sequences. } \section{Methods}{ \describe{ No methods are defined by \pkg{rtracklayer} for the \code{sequence(object, ...) <- value} generic. }} \keyword{methods} rtracklayer/man/layTrack-methods.Rd0000644000175400017540000000153713556116552020417 0ustar00biocbuildbiocbuild\name{track<--methods} \docType{methods} \alias{track<-} \alias{track<--methods} \alias{track<-,BrowserSession,ANY-method} \title{ Laying tracks } \description{ Methods for loading tracks into genome browsers. } \usage{ track(object, ...) <- value } \arguments{ \item{object}{A \code{\linkS4class{BrowserSession}} into which the track is loaded.} \item{value}{The track(s) to load.} \item{\dots}{Arguments to pass on to methods. Can be: \itemize{ \item{name}{The name(s) of the track(s) being loaded.} \item{view}{Whether to create a view of the track after loading it.} } } } \seealso{\code{\link{track}} for getting a track from a session.} \examples{ \dontrun{ session <- browserSession() track <- import(system.file("tests", "v1.gff", package = "rtracklayer")) track(session, "My Track") <- track } } \keyword{methods} rtracklayer/man/liftOver.Rd0000644000175400017540000000237413556116552016776 0ustar00biocbuildbiocbuild\name{liftOver} \alias{liftOver} \alias{liftOver,GenomicRanges,Chain-method} \alias{liftOver,ANY,ANY-method} \title{ Lift intervals between genome builds } \description{ A reimplementation of the UCSC liftover tool for lifting features from one genome build to another. In our preliminary tests, it is significantly faster than the command line tool. Like the UCSC tool, a chain file is required input. } \usage{ liftOver(x, chain, ...) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{x}{ The intervals to lift-over, usually a \code{\link[GenomicRanges:GRanges]{GRanges}}. } \item{chain}{ A \code{\linkS4class{Chain}} object, usually imported with \code{\link{import.chain}}, or something coercible to one. } \item{\dots}{ Arguments for methods. } } \value{ A \code{GRangesList} object. Each element contains the ranges mapped from the corresponding element in the input (may be one-to-many). } \references{ \url{http://genome.ucsc.edu/cgi-bin/hgLiftOver} } \examples{ \dontrun{ chain <- import.chain("hg19ToHg18.over.chain") library(TxDb.Hsapiens.UCSC.hg19.knownGene) tx_hg19 <- transcripts(TxDb.Hsapiens.UCSC.hg19.knownGene) tx_hg18 <- liftOver(tx_hg19, chain) } } \author{ Michael Lawrence } rtracklayer/man/readGFF.Rd0000644000175400017540000000651513556116552016443 0ustar00biocbuildbiocbuild\name{readGFF} \alias{readGFF} \alias{GFFcolnames} \title{Reads a file in GFF format} \description{ Reads a file in GFF format and creates a data frame or \link[S4Vectors]{DataFrame} object from it. This is a low-level function that should not be called by user code. } \usage{ readGFF(filepath, version=0, columns=NULL, tags=NULL, filter=NULL, nrows=-1, raw_data=FALSE) GFFcolnames(GFF1=FALSE) } \arguments{ \item{filepath}{ A single string containing the path or URL to the file to read. Alternatively can be a connection. } \item{version}{ \code{readGFF} should do a pretty descent job at detecting the GFF version. Use this argument \emph{only} if it doesn't or if you want to force it to parse and import the file as if its 9-th column was in a different format than what it really is (e.g. specify \code{version=1} on a GTF or GFF3 file to interpret its 9-th column as the \code{"group"} column of a GFF1 file). Supported versions are 1, 2, and 3. } \item{columns}{ The standard GFF columns to load. All of them are loaded by default. } \item{tags}{ The tags to load. All of them are loaded by default. } \item{filter}{ } \item{nrows}{ \code{-1} or the maximum number of rows to read in (after filtering). } \item{raw_data}{ } \item{GFF1}{ } } \value{ A DataFrame with columns corresponding to those in the GFF. } \author{ H. Pages } \seealso{ \itemize{ \item \code{\link{import}} for importing a GFF file as a \link[GenomicRanges]{GRanges} object. \item \code{\link[GenomicRanges]{makeGRangesFromDataFrame}} in the \pkg{GenomicRanges} package for making a \link[GenomicRanges]{GRanges} object from a data frame or \link[S4Vectors]{DataFrame} object. \item \code{\link[GenomicFeatures]{makeTxDbFromGFF}} in the \pkg{GenomicFeatures} package for importing a GFF file as a \link[GenomicFeatures]{TxDb} object. \item The \link[S4Vectors]{DataFrame} class in the \pkg{S4Vectors} package. } } \examples{ ## Standard GFF columns. GFFcolnames() GFFcolnames(GFF1=TRUE) # "group" instead of "attributes" tests_dir <- system.file("tests", package="rtracklayer") test_gff3 <- file.path(tests_dir, "genes.gff3") ## Load everything. df0 <- readGFF(test_gff3) head(df0) ## Load some tags only (in addition to the standard GFF columns). my_tags <- c("ID", "Parent", "Name", "Dbxref", "geneID") df1 <- readGFF(test_gff3, tags=my_tags) head(df1) ## Load no tags (in that case, the "attributes" standard column ## is loaded). df2 <- readGFF(test_gff3, tags=character(0)) head(df2) ## Load some standard GFF columns only (in addition to all tags). my_columns <- c("seqid", "start", "end", "strand", "type") df3 <- readGFF(test_gff3, columns=my_columns) df3 table(df3$seqid, df3$type) makeGRangesFromDataFrame(df3, keep.extra.columns=TRUE) ## Combine use of 'columns' and 'tags' arguments. readGFF(test_gff3, columns=my_columns, tags=c("ID", "Parent", "Name")) readGFF(test_gff3, columns=my_columns, tags=character(0)) ## Use the 'filter' argument to load only features of type "gene" ## or "mRNA" located on chr10. my_filter <- list(type=c("gene", "mRNA"), seqid="chr10") readGFF(test_gff3, filter=my_filter) readGFF(test_gff3, columns=my_columns, tags=character(0), filter=my_filter) } \keyword{manip} rtracklayer/man/targets.Rd0000644000175400017540000000212613556116552016650 0ustar00biocbuildbiocbuild\name{targets} \Rdversion{1.1} \alias{targets} \docType{data} \title{microRNA target sites} \description{ A data frame of human microRNA target sites retrieved from MiRBase. This is a subset of the \code{hsTargets} data frame in the \code{microRNA} package. See the \code{rtracklayer} vignette for more details. } \usage{data(targets)} \format{ A data frame with 2981 observations on the following 6 variables. \describe{ \item{\code{name}}{The miRBase ID of the microRNA.} \item{\code{target}}{The Ensembl ID of the targeted transcript.} \item{\code{chrom}}{The name of the chromosome for target site.} \item{\code{start}}{Target start position.} \item{\code{end}}{Target stop position.} \item{\code{strand}}{The strand of the target site, \code{"+"}, or \code{"-"}.} } } \source{ The \code{microRNA} package, dataset \code{hsTargets}. Originally MiRBase (\url{http://microrna.sanger.ac.uk/}). } \examples{ data(targets) targetTrack <- with(targets, GenomicData(IRanges::IRanges(start, end), strand = strand, chrom = chrom)) } \keyword{datasets} rtracklayer/man/tracks-methods.Rd0000644000175400017540000000266713556116552020141 0ustar00biocbuildbiocbuild\name{tracks-methods} \docType{methods} \alias{trackNames} \alias{trackNames<-} \alias{trackNames<--methods} \alias{trackNames<-,UCSCTrackModes-method} \alias{trackNames<-,UCSCView-method} \alias{trackNames-methods} \alias{trackNames,UCSCSession-method} \alias{trackNames,UCSCTrackModes-method} \alias{trackNames,UCSCView-method} \title{ Accessing track names } \description{ Methods for getting and setting track names. } \section{Methods}{ \describe{ The following methods are defined by \pkg{rtracklayer} for \bold{getting} track names via the generic \code{trackNames(object, ...)}. \item{object = "UCSCSession"}{ Get the tracks loaded in the session. } \item{object = "UCSCTrackModes"}{ Get the visible tracks according to the modes (all tracks not set to "hide").} \item{object = "UCSCView"}{ Get the visible tracks in the view. } The following methods are defined by \pkg{rtracklayer} for \bold{setting} track names via the generic \code{trackNames(object) <- value}. \item{object = "UCSCTrackModes"}{ Sets the tracks that should be visible in the modes. All specified tracks with mode "hide" in \code{object} are set to mode "full". Any tracks in \code{object} that are not specified in the value are set to "hide". No other modes are changed.} \item{object = "UCSCView"}{ Sets the visible tracks in the view. This opens a new web browser with only the specified tracks visible. } }} \keyword{methods}rtracklayer/man/ucscGenomes.Rd0000644000175400017540000000171513556116552017455 0ustar00biocbuildbiocbuild\name{ucscGenomes} \alias{ucscGenomes} \title{Get available genomes on UCSC} \description{ Get a \code{data.frame} describing the available UCSC genomes. } \usage{ ucscGenomes(organism=FALSE) } \arguments{ \item{organism}{A \code{logical(1)} indicating whether scientific name should be appended.} } \value{ A \code{data.frame} with the following columns: \item{db}{UCSC DB identifier (e.g. "hg18")} \item{species}{The name of the species (e.g. "Human")} \item{date}{The date the genome was built} \item{name}{The official name of the genome build} \item{organism}{The scientific name of the species (e.g. "Homo sapiens")} } \seealso{\code{\linkS4class{UCSCSession}} for details on specifying the genome.} \details{ For populating the organism column, the web url \url{http://genome.ucsc.edu/cgi-bin} is scraped for every assembly version to get the scientific name. } \examples{ ucscGenomes() } \author{ Michael Lawrence } \keyword{interface} rtracklayer/man/ucscSession-class.Rd0000644000175400017540000001222613556116552020605 0ustar00biocbuildbiocbuild\name{UCSCSession-class} \docType{class} \alias{UCSCSession-class} \alias{initialize,UCSCSession-method} \alias{track,UCSCSession-method} \alias{track<-,UCSCSession,GenomicRangesList-method} \alias{range<-} \alias{range<-,UCSCSession-method} \alias{track<-,UCSCSession,RTLFile-method} \alias{genome,UCSCSession-method} \alias{genome<-,UCSCSession-method} \alias{range,UCSCSession-method} \alias{seqinfo,UCSCSession-method} \alias{range,ucscCart-method} \alias{genome,ucscCart-method} \alias{getTable,UCSCSession-method} \title{Class "UCSCSession"} \description{An implementation of \code{\linkS4class{BrowserSession}} for the \acronym{UCSC} genome browser.} \section{Objects from the Class}{ Objects can be created by calls of the form \code{\link{browserSession}("ucsc", url = "http://genome.ucsc.edu/cgi-bin", ...)}. The arguments in \code{...} correspond to libcurl options, see \code{\link[RCurl]{getCurlHandle}}. Setting these options may be useful e.g. for getting past a proxy. } \section{Slots}{ \describe{ \item{\code{url}:}{Object of class \code{"character"} holding the base \acronym{URL} of the \acronym{UCSC} browser. } \item{\code{hguid}:}{Object of class \code{"numeric"} holding the user identification code.} \item{\code{views}:}{Object of class \code{"environment"} containing a list stored under the name "instances". The list holds the instances of \code{\linkS4class{BrowserView}} for this session. } } } \section{Extends}{ Class \code{"\linkS4class{BrowserSession}"}, directly. } \section{Methods}{ \describe{ \item{\code{\link{browserView}(object, range = range(object), track = trackNames(object), ...)}}{ Creates a \code{\linkS4class{BrowserView}} of \code{range} with visible tracks specified by \code{track}. \code{track} may be an instance of \code{\linkS4class{UCSCTrackModes}}. Arguments in \code{...} should match parameters to a \code{\link{ucscTrackModes}} method for creating a \code{UCSCTrackModes} instance that will be merged with and override modes indicated by the \code{track} parameter. } \item{\code{\link{browserViews}}(object)}{ Gets the \code{\linkS4class{BrowserView}} instances for this session. } \item{\code{\link{range}}(x)}{ Gets the \code{\link[GenomicRanges:GRanges-class]{GRanges}} last displayed in this session.} \item{\code{genome(x)}}{Gets the genome identifier of the session, i.e. \code{genome(range(x))}.} \item{\code{seqinfo}}{ Gets the \code{\link[GenomeInfoDb]{Seqinfo}} object with the lengths of the chromosomes in the currenet genome. No circularity information is available. } \item{\code{range(x) <- value}}{ Sets \code{value}, usually a \code{GRanges} object or \code{IntegerRangesList}, as the range of session \code{x}. Note that this setting only lasts until a view is created or manipulated. This mechanism is useful, for example, when treating the UCSC browser as a database, rather than a genome viewer.} \item{\code{genome(x) <- value}}{ Sets the genome identifier on the range of session \code{x}.} \item{\code{\link[Biostrings]{getSeq}(object, range, track = "Assembly")}}{ Gets the sequence in \code{range} and \code{track}. } \item{\code{\link[=track<-]{track}(object, name = names(track), format = "auto", ...) <- value}}{ Loads a track, stored under \code{name} and formatted as \code{format}. The "auto" format resolves to "bed" for qualitative data. For quantitative data, i.e., data with a numeric \code{score} column, "wig" or "bedGraph" is chosen, depending on how well the data compresses into wig. The arguments in \code{...} are passed on to \code{\link{export.ucsc}}, so they could be slots in a \code{\linkS4class{TrackLine}} subclass (and thus specify visual attributes like color) or parameters to pass on to the export function for \code{format}. The \code{value} may be either a range object (like a \code{GRanges}) or a file object (like a \code{BEDFile}). } \item{\code{\link{track}(object, name, range = range(object), table = NULL)}}{ Retrieves a \code{\link{GRanges}} with features in \code{range} from track named \code{name}. Some built-in tracks have multiple series, each stored in a separate database table. A specific table may be retrieved by passing its name in the \code{table} parameter. See \code{\link{tableNames}} for a way to list the available tables. } \item{}{ \code{getTable(object, name, range = base::range(object), table = NULL)}: Retrieves the table indicated by the track \code{name} and \code{table} name, over \code{range}, as a \code{data.frame}. See \code{\link{getTable}}. } \item{\code{\link{trackNames}}(object)}{ Gets the names of the tracks stored in the session. } \item{\code{\link{ucscTrackModes}}(object)}{ Gets the default view modes for the tracks in the session. } } } \author{ Michael Lawrence } \seealso{ \code{\link{browserSession}} for creating instances of this class. } \keyword{classes} rtracklayer/man/ucscTrackLine-class.Rd0000644000175400017540000000356513556116552021044 0ustar00biocbuildbiocbuild\name{TrackLine-class} \docType{class} \alias{TrackLine-class} \alias{coerce,character,TrackLine-method} \alias{coerce,TrackLine,character-method} \alias{show,TrackLine-method} \title{Class "TrackLine"} \description{An object representing a "track line" in the \acronym{UCSC} format. There are two concrete types of track lines: \code{\linkS4class{BasicTrackLine}} (used for most types of tracks) and \code{\linkS4class{GraphTrackLine}} (used for graphical tracks). This class only declares the common elements between the two.} \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("TrackLine", ...)} or parsed from a character vector track line with \code{as(text, "TrackLine")}. But note that \acronym{UCSC} only understands one of the subclasses mentioned above. } \section{Slots}{ \describe{ \item{\code{name}:}{Object of class \code{"character"} specifying the name of the track. } \item{\code{description}:}{Object of class \code{"character"} describing the track. } \item{\code{visibility}:}{Object of class \code{"character"} indicating the default visible mode of the track, see \code{\linkS4class{UCSCTrackModes}}.} \item{\code{color}:}{Object of class \code{"integer"} representing the track color (as from \code{\link{col2rgb}}). } \item{\code{priority}:}{Object of class \code{"numeric"} specifying the rank of this track. } } } \section{Methods}{ \describe{ \item{as(object, "character")}{Export line to its string representation.} } } \references{ \url{http://genome.ucsc.edu/goldenPath/help/customTrack.html#TRACK} for the official documentation. } \author{ Michael Lawrence } \seealso{ \code{\linkS4class{BasicTrackLine}} (used for most types of tracks) and \code{\linkS4class{GraphTrackLine}} (used for Wiggle/bedGraph tracks). } \keyword{classes} rtracklayer/man/ucscTrackModes-class.Rd0000644000175400017540000000505113556116552021214 0ustar00biocbuildbiocbuild\name{UCSCTrackModes-class} \docType{class} \alias{UCSCTrackModes-class} \alias{[,UCSCTrackModes,ANY,ANY,ANY-method} \alias{[<-,UCSCTrackModes,ANY,ANY,ANY-method} \title{Class "UCSCTrackModes"} \description{A vector of view modes ("hide", "dense", "full", "pack", "squish") for each track in a \acronym{UCSC} view.} \section{Objects from the Class}{ Objects may be created by calls of the form \code{\link{ucscTrackModes}(object = character(), hide = character(), dense = character(), pack = character(), squish = character(), full = character())}, where \code{object} should be a character vector of mode names (with its \code{names} attribute specifying the corresponding track names). The other parameters should contain track names that override the modes in \code{object}. Later parameters override earlier ones, so, for example, if a track is named in \code{hide} and \code{full}, it is shown in the full view mode. } \section{Slots}{ \describe{ \item{\code{.Data}:}{Object of class \code{"character"} holding the modes ("hide", "dense", "full", "pack", "squish"), with its \code{names} attribute holding corresponding track names.} \item{\code{labels}:}{Object of class \code{"character"} holding labels (human-readable names) corresponding to each track/mode.} } } \section{Extends}{ Class \code{"\linkS4class{character}"}, from data part. Class \code{"\linkS4class{vector}"}, by class "character", distance 2. } \section{Methods}{ \describe{ \item{\code{\link{trackNames}(object)}}{ Gets the names of the visible tracks (those that do not have mode "hide"). } \item{\code{\link{trackNames}(object) <- value}}{ Sets the names of the visible tracks. Any tracks named in \code{value} are set to "full" if the are currently set to "hide" in this object. Any tracks not in \code{value} are set to "hide". All other modes are preserved.} \item{\code{object[i]}}{Gets the track mode of the tracks indexed by \code{i}, which can be any type of index supported by character vector subsetting. If \code{i} is a character vector, it indexes first by the internal track IDs (the \code{names} on \code{.Data}) and then by the user-level track names (the \code{labels} slot).} \item{\code{object[i] <- value}}{Sets the track modes indexed by \code{i} (in the same way as in \code{object[i]} above) to those specified in \code{value}.} } } \author{ Michael Lawrence } \seealso{ \code{\linkS4class{UCSCView}} on which track view modes may be set. } \keyword{classes} rtracklayer/man/ucscTrackModes-methods.Rd0000644000175400017540000000521513556116552021554 0ustar00biocbuildbiocbuild\name{ucscTrackModes-methods} \docType{methods} \alias{ucscTrackModes} \alias{ucscTrackModes<-} \alias{ucscTrackModes-methods} \alias{ucscTrackModes,character-method} \alias{ucscTrackModes,missing-method} \alias{ucscTrackModes,UCSCView-method} \alias{ucscTrackModes<--methods} \alias{ucscTrackModes<-,UCSCView,UCSCTrackModes-method} \alias{ucscTrackModes<-,UCSCView,character-method} \alias{ucscTrackModes,ucscTracks-method} \alias{ucscTrackModes,UCSCSession-method} \title{ Accessing UCSC track modes } \description{ Generics for getting and setting UCSC track visibility modes ("hide", "dense", "full", "pack", "squish"). } \section{Methods}{ \describe{ The following methods are defined by \pkg{rtracklayer} for \bold{getting} the track modes through the generic \code{ucscTrackModes(object, ...)}. \item{object = "character"}{ \code{function(object, hide = character(), dense = character(), pack = character(), squish = character(), full = character())} Creates an instance of \code{\linkS4class{UCSCTrackModes}} from \code{object}, a character vector of mode names, with the corresponding track ids given in the \code{names} attribute. Note that \code{object} can be a \code{UCSCTrackModes} instance, as \code{UCSCTrackModes} extends \code{character}. The other parameters are character vectors identifying the tracks for each mode and overriding the modes specified by \code{object}. } \item{object = "missing"}{ The same interface as above, except \code{object} defaults to an empty character vector. } \item{object = "UCSCView"}{ Gets modes for tracks in the view. } \item{object = "UCSCSession"}{ Gets default modes for the tracks in the session. These are the modes that will be used as the default for a newly created view. } The following methods are defined by \pkg{rtracklayer} for \bold{setting} the track modes through the generic \code{ucscTrackModes(object) <- value}. \item{object = "UCSCView", value = "UCSCTrackModes"}{ Sets the modes for the tracks in the view. } \item{object = "UCSCView", value = "character"}{ Sets the modes from a character vector of mode names, with the corresponding track names given in the \code{names} attribute. } }} \seealso{\code{\link{trackNames}} and \code{\link{trackNames<-}} for just getting or setting which tracks are visible (not of mode "hide").} \examples{ # Tracks "foo" and "bar" are fully shown, "baz" is hidden modes <- ucscTrackModes(full = c("foo", "bar"), hide = "baz") # Update the modes to hide track "bar" modes2 <- ucscTrackModes(modes, hide = "bar") } \keyword{methods} rtracklayer/man/ucscView-class.Rd0000644000175400017540000000600013556116552020065 0ustar00biocbuildbiocbuild\name{UCSCView-class} \docType{class} \alias{UCSCView-class} \alias{range,UCSCView-method} \alias{range<-,UCSCView-method} \alias{visible,UCSCView-method} \alias{visible<-,UCSCView-method} \alias{viewURL} \title{Class "UCSCView"} \description{An object representing a view of a genome in the \acronym{UCSC} browser.} \section{Objects from the Class}{ Calling \code{\link{browserView}(session, range = range(object), track = trackNames(object), browse = TRUE, ...)} creates \code{\linkS4class{BrowserView}} of \code{range} with visible tracks specified by \code{track}. \code{track} may be an instance of \code{\linkS4class{UCSCTrackModes}}. Arguments in \code{...} should match parameters to a \code{\link{ucscTrackModes}} method for creating a \code{UCSCTrackModes} instance that will be merged with and override modes indicated by the \code{track} parameter. If \code{browse} is \code{TRUE} (default), automatically launch a browser to display the view. } \section{Slots}{ \describe{ \item{\code{hgsid}:}{Object of class \code{"numeric"}, which identifies this view to \acronym{UCSC}.} \item{\code{session}:}{Object of class \code{"BrowserSession"} to which this view belongs.} } } \section{Extends}{ Class \code{"\linkS4class{BrowserView}"}, directly. } \section{Methods}{ \describe{ \item{\code{\link{activeView}(object)}}{ Obtains a logical indicating whether this view is the active view. } \item{\code{\link{range}(object)}}{ Obtains the \code{\link[GenomicRanges:GRanges-class]{GRanges}} displayed by this view. } \item{\code{\link{range}(object) <- value}}{ Sets the \code{\link[GenomicRanges]{GRanges}} or \code{\link[IRanges]{IntegerRangesList}} displayed by this view. } \item{\code{\link{trackNames}(object)}}{ Gets the names of the visible tracks in this view. } \item{\code{\link{trackNames}(object) <- value}}{ Sets the visible tracks by name. } \item{\code{visible(object)}}{Get a named logical vector indicating whether each track is visible. } \item{\code{visible(object) <- value}}{Set a logical vector indicating the visibility of each track, in the same order as returned by \code{visible(object)}. } \item{\code{\link{ucscTrackModes}(object)}}{ Obtains the \code{\linkS4class{UCSCTrackModes}} for this view. } \item{\code{\link{ucscTrackModes}(object) <- value}}{ Sets the \code{\linkS4class{UCSCTrackModes}} for this view. The \code{value} may be either a \code{UCSCTrackModes} instance or a character vector that will be coerced by a call to \code{\link{ucscTrackModes}}. } } } \section{Utilities}{ \describe{ \item{viewURL(x)}{Gets the URL corresponding to the view \code{x}. Typically used when passing \code{browse=FALSE} to the constructor in order to display the view in another way.} } } \author{ Michael Lawrence } \seealso{ \code{\link{browserView}} for creating instances of this class. } \keyword{classes} rtracklayer/man/wigToBigWig.Rd0000644000175400017540000000210413556116552017355 0ustar00biocbuildbiocbuild\name{wigToBigWig} \alias{wigToBigWig} \title{ Convert WIG to BigWig } \description{ This function calls the Kent C library to efficiently convert a WIG file to a BigWig file, without loading the entire file into memory. This solves the problem where simple tools write out text WIG files, instead of more efficiently accessed binary BigWig files. } \usage{ wigToBigWig(x, seqinfo, dest = paste(file_path_sans_ext(x, TRUE), "bw", sep = "."), clip = FALSE) } \arguments{ \item{x}{ Path or URL to the WIG file. Connections are not supported. } \item{seqinfo}{ \code{\linkS4class{Seqinfo}} object, describing the genome of the data. All BigWig files must have this defined. } \item{dest}{ The path to which to write the BigWig file. Defaults to \code{x} with the extension changed to \dQuote{bw}. } \item{clip}{ If \code{TRUE}, regions outside of \code{seqinfo} will be clipped, so that no error is thrown. } } \author{ Michael Lawrence } \seealso{ \code{\link[=BigWigFile]{BigWig}} import and export support } rtracklayer/man/wigTrackLine-class.Rd0000644000175400017540000000675513556116552020701 0ustar00biocbuildbiocbuild\name{GraphTrackLine-class} \docType{class} \alias{GraphTrackLine-class} \alias{coerce,character,GraphTrackLine-method} \alias{coerce,GraphTrackLine,character-method} \alias{coerce,GraphTrackLine,BasicTrackLine-method} \alias{coerce,BasicTrackLine,GraphTrackLine-method} \title{Class "GraphTrackLine"} \description{ A \acronym{UCSC} track line for graphical tracks. } \section{Objects from the Class}{ Objects can be created by calls of the form \code{new("GraphTrackLine", ...)} or parsed from a character vector track line with \code{as(text, "GraphTrackLine")} or converted from a \code{\linkS4class{BasicTrackLine}} using \code{as(basic, "GraphTrackLine")}. } \section{Slots}{ \describe{ \item{\code{altColor}:}{Object of class \code{"integer"} giving an alternate color, as from \code{\link{col2rgb}}.} \item{\code{autoScale}:}{Object of class \code{"logical"} indicating whether to automatically scale to min/max of the data.} \item{\code{alwaysZero}:}{Object of class \code{"logical"} indicating whether to fix the lower limit of the Y axis at zero.} \item{\code{gridDefault}:}{Object of class \code{"logical"} indicating whether a grid should be drawn. } \item{\code{maxHeightPixels}:}{Object of class \code{"numeric"} of length three (max, default, min), giving the allowable range for the vertical height of the graph.} \item{\code{graphType}:}{Object of class \code{"character"}, specifying the graph type, either "bar" or "points". } \item{\code{viewLimits}:}{Object of class \code{"numeric"} and of length two specifying the data range (min, max) shown in the graph.} \item{\code{yLineMark}:}{Object of class \code{"numeric"} giving the position of a horizontal line.} \item{\code{yLineOnOff}:}{Object of class \code{"logical"} indicating whether the \code{yLineMark} should be visible. } \item{\code{windowingFunction}:}{Object of class \code{"character"}, one of "maximum", "mean", "minimum", for removing points when the graph shrinks.} \item{\code{smoothingWindow}:}{Object of class \code{"numeric"} giving the window size of a smoother to pass over the graph. } \item{\code{type}:}{Scalar \code{"character"} indicating the type of the track, either \code{"wig"} or \code{"bedGraph"}.} \item{\code{name}:}{Object of class \code{"character"} specifying the name of the track. } \item{\code{description}:}{Object of class \code{"character"} describing the track. } \item{\code{visibility}:}{Object of class \code{"character"} indicating the default visible mode of the track, see \code{\linkS4class{UCSCTrackModes}}.} \item{\code{color}:}{Object of class \code{"integer"} representing the track color (as from \code{\link{col2rgb}}). } \item{\code{priority}:}{Object of class \code{"numeric"} specifying the rank of this track. } } } \section{Extends}{ Class \code{"\linkS4class{TrackLine}"}, directly. } \section{Methods}{ \describe{ \item{as(object, "character")}{Export line to its string representation.} \item{as(object, \code{"\linkS4class{BasicTrackLine}"})}{Convert this line to a basic UCSC track line, using defaults for slots not held in common.} } } \references{ Official documentation: \url{http://genome.ucsc.edu/goldenPath/help/wiggle.html}. } \author{ Michael Lawrence } \seealso{ \code{\link{export.wig}}, \code{\link{export.bedGraph}} for exporting graphical tracks. } \keyword{classes} rtracklayer/src/0000755000175400017540000000000013556147727014733 5ustar00biocbuildbiocbuildrtracklayer/src/IRanges_stubs.c0000644000175400017540000000003413556116552017634 0ustar00biocbuildbiocbuild#include <_IRanges_stubs.c> rtracklayer/src/Makevars0000644000175400017540000000030613556147601016415 0ustar00biocbuildbiocbuildinclude Makevars.common OBJECTS = $(PKG_OBJECTS) $(UCSC_OBJECTS:%=ucsc/%) PKG_LIBS=-lz -pthread -lssl -lcrypto PKG_CPPFLAGS= -DUSE_SSL -D_FILE_OFFSET_BITS=64 all: $(SHLIB) clean: rm -f $(OBJECTS) rtracklayer/src/Makevars.common0000644000175400017540000000102213556116552017701 0ustar00biocbuildbiocbuildPKG_OBJECTS = \ S4Vectors_stubs.o IRanges_stubs.o XVector_stubs.o R_init_rtracklayer.o \ readGFF.o bigWig.o chain_io.o twoBit.o handlers.o utils.o UCSC_OBJECTS = \ bPlusTree.o bbiRead.o bbiWrite.o bwgCreate.o bwgQuery.o \ cirTree.o common.o dnaseq.o dnautil.o errAbort.o hash.o linefile.o localmem.o\ sqlNum.o zlibFace.o dystring.o hmmstats.o obscure.o pipeline.o \ rangeTree.o rbTree.o memalloc.o dlist.o udc.o net.o bits.o twoBit.o \ _cheapcgi.o internet.o https.o base64.o verbose.o os.o wildcmp.o _portimpl.o rtracklayer/src/Makevars.in0000644000175400017540000000033313556116552017023 0ustar00biocbuildbiocbuildinclude Makevars.common OBJECTS = $(PKG_OBJECTS) $(UCSC_OBJECTS:%=ucsc/%) PKG_LIBS=-lz -pthread @OPENSSL_LIBS@ PKG_CPPFLAGS=@OPENSSL_CFLAGS@ @SSL_CPPFLAGS@ -D_FILE_OFFSET_BITS=64 all: $(SHLIB) clean: rm -f $(OBJECTS) rtracklayer/src/Makevars.win0000644000175400017540000000064613556116552017221 0ustar00biocbuildbiocbuildZLIB_CFLAGS+=$(shell echo 'zlibbioc::pkgconfig("PKG_CFLAGS")'|\ "${R_HOME}/bin/R" --vanilla --slave) PKG_LIBS+=$(shell echo 'zlibbioc::pkgconfig("PKG_LIBS_shared")' |\ "${R_HOME}/bin/R" --vanilla --slave) PKG_LIBS+=-lws2_32 include Makevars.common OBJECTS = $(PKG_OBJECTS) $(UCSC_OBJECTS:%=ucsc/%) all: $(SHLIB) clean: rm -f $(OBJECTS) %.o: %.c $(CC) $(ZLIB_CFLAGS) $(ALL_CPPFLAGS) $(ALL_CFLAGS) -c $< -o $@ rtracklayer/src/R_init_rtracklayer.c0000644000175400017540000000217113556116552020717 0ustar00biocbuildbiocbuild#include "rtracklayer.h" #include "readGFF.h" #include "bigWig.h" #include "twoBit.h" #include "utils.h" #include #define CALLMETHOD_DEF(fun, numArgs) {#fun, (DL_FUNC) &fun, numArgs} static const R_CallMethodDef callMethods[] = { /* readGFF.c */ CALLMETHOD_DEF(gff_colnames, 1), CALLMETHOD_DEF(read_gff_pragmas, 1), CALLMETHOD_DEF(scan_gff, 5), CALLMETHOD_DEF(load_gff, 8), /* bigWig.c */ CALLMETHOD_DEF(BWGSectionList_add, 5), CALLMETHOD_DEF(BWGSectionList_write, 5), CALLMETHOD_DEF(BWGSectionList_cleanup, 1), CALLMETHOD_DEF(BWGFile_query, 5), CALLMETHOD_DEF(BWGFile_seqlengths, 1), CALLMETHOD_DEF(BWGFile_summary, 6), CALLMETHOD_DEF(BWGFile_fromWIG, 4), CALLMETHOD_DEF(R_udcCleanup, 1), CALLMETHOD_DEF(R_setUserUdcDir, 1), /* twobit.c */ CALLMETHOD_DEF(DNAString_to_twoBit, 3), CALLMETHOD_DEF(TwoBits_write, 2), CALLMETHOD_DEF(TwoBitFile_seqlengths, 1), CALLMETHOD_DEF(TwoBitFile_read, 4), /* utils.c */ CALLMETHOD_DEF(CharacterList_pasteCollapse, 2), {NULL, NULL, 0} }; void R_init_rtracklayer(DllInfo *info) { R_registerRoutines(info, NULL, callMethods, NULL, NULL); } rtracklayer/src/S4Vectors_stubs.c0000644000175400017540000000003613556116552020142 0ustar00biocbuildbiocbuild#include <_S4Vectors_stubs.c> rtracklayer/src/XVector_stubs.c0000644000175400017540000000003413556116552017676 0ustar00biocbuildbiocbuild#include <_XVector_stubs.c> rtracklayer/src/bigWig.c0000644000175400017540000002716413556116552016311 0ustar00biocbuildbiocbuild#include "ucsc/common.h" #include "ucsc/linefile.h" #include "ucsc/localmem.h" #include "ucsc/hash.h" #include "ucsc/bbiFile.h" #include "ucsc/bigWig.h" #include "ucsc/bwgInternal.h" #include "bigWig.h" #include "handlers.h" static struct bwgBedGraphItem * createBedGraphItems(int *start, int *width, double *score, int len, struct lm *lm) { struct bwgBedGraphItem *itemList = NULL, *item; int i; for (i=0; iend = start[i] + width[i] - 1; item->start = start[i] - 1; item->val = score[i]; slAddHead(&itemList, item); } slReverse(&itemList); return itemList; } static struct bwgVariableStepPacked * createVariableStepItems(int *start, double *score, int len, struct lm *lm) { struct bwgVariableStepPacked *packed; lmAllocArray(lm, packed, len); int i; for (i=0; ichrom = (char *)seq; section->start = start[0] - 1; section->end = start[len-1] + width[len-1] - 1; section->type = type; section->itemSpan = width[0]; if (type == bwgTypeFixedStep) { section->items.fixedStepPacked = createFixedStepItems(score, len, lm); section->itemStep = len > 1 ? start[1] - start[0] : 0; } else if (type == bwgTypeVariableStep) { section->items.variableStepPacked = createVariableStepItems(start, score, len, lm); } else section->items.bedGraphList = createBedGraphItems(start, width, score, len, lm); section->itemCount = len; return section; } static struct bwgSection * createBWGSection_Atomic(const char *seq, int start, double *score, int len, struct lm *lm) { struct bwgSection *section; lmAllocVar(lm, section); section->chrom = (char *)seq; section->start = start; section->end = start + len - 1; section->type = bwgTypeFixedStep; section->itemSpan = 1; section->items.fixedStepPacked = createFixedStepItems(score, len, lm); section->itemStep = 1; section->itemCount = len; return section; } static int itemsPerSlot = 1024; static int blockSize = 256; static void BWGSectionList_addRle(struct bwgSection **sections, const char *seq, SEXP r_ranges, double *score, enum bwgSectionType type, struct lm *lm) { int numLeft = get_IRanges_length(r_ranges); int *start = INTEGER(get_IRanges_start(r_ranges)); int *width = INTEGER(get_IRanges_width(r_ranges)); while(numLeft) { int numSection = numLeft > itemsPerSlot ? itemsPerSlot : numLeft; numLeft -= numSection; slAddHead(sections, createBWGSection_Rle(seq, start, width, score, numSection, type, lm)); start += numSection; width += numSection; score += numSection; } } static void BWGSectionList_addAtomic(struct bwgSection **sections, const char *seq, double *score, int num, struct lm *lm) { int numLeft = num; while(numLeft) { int numSection = numLeft > itemsPerSlot ? itemsPerSlot : numLeft; slAddHead(sections, createBWGSection_Atomic(seq, num - numLeft, score, numSection, lm)); score += numSection; numLeft -= numSection; } } /* --- .Call ENTRY POINT --- */ SEXP BWGSectionList_add(SEXP r_sections, SEXP r_seq, SEXP r_ranges, SEXP r_score, SEXP r_format) { struct bwgSection *sections = NULL; const char *seq = CHAR(asChar(r_seq)); double *score = REAL(r_score); const char *format = CHAR(asChar(r_format)); SEXP ans; struct lm *lm; enum bwgSectionType type = bwgTypeBedGraph; if (sameString(format, "fixedStep")) type = bwgTypeFixedStep; else if (sameString(format, "variableStep")) type = bwgTypeVariableStep; if (r_sections != R_NilValue) { sections = R_ExternalPtrAddr(r_sections); lm = R_ExternalPtrAddr(R_ExternalPtrTag(r_sections)); } else lm = lmInit(0); pushRHandlers(); if (r_ranges != R_NilValue) { BWGSectionList_addRle(§ions, seq, r_ranges, score, type, lm); } else { BWGSectionList_addAtomic(§ions, seq, score, length(r_score), lm); } popRHandlers(); PROTECT(ans = R_MakeExternalPtr(sections, R_NilValue, R_NilValue)); R_SetExternalPtrTag(ans, R_MakeExternalPtr(lm, R_NilValue, R_NilValue)); UNPROTECT(1); return ans; } static struct hash *createIntHash(SEXP v) { struct hash *hash = hashNew(0); SEXP names = getAttrib(v, R_NamesSymbol); for (int i = 0; i < length(v); i++) hashAddInt(hash, (char *)CHAR(STRING_ELT(names, i)), INTEGER(v)[i]); return hash; } /* --- .Call ENTRY POINT --- */ SEXP BWGSectionList_write(SEXP r_sections, SEXP r_seqlengths, SEXP r_compress, SEXP r_fixed_summaries, SEXP r_file) { struct bwgSection *sections = NULL; struct hash *lenHash = createIntHash(r_seqlengths); if (r_sections != R_NilValue) { sections = R_ExternalPtrAddr(r_sections); slReverse(§ions); } pushRHandlers(); bwgCreate(sections, lenHash, max(blockSize, length(r_seqlengths)), itemsPerSlot, asLogical(r_compress), FALSE /*keepAllChromosomes*/, asLogical(r_fixed_summaries), (char *)CHAR(asChar(r_file))); freeHash(&lenHash); popRHandlers(); return r_file; } /* --- .Call ENTRY POINT --- */ SEXP BWGSectionList_cleanup(SEXP r_sections) { pushRHandlers(); if (r_sections != R_NilValue) { struct lm *lm = R_ExternalPtrAddr(R_ExternalPtrTag(r_sections)); lmCleanup(&lm); } popRHandlers(); return R_NilValue; } /* --- .Call ENTRY POINT --- */ SEXP BWGFile_seqlengths(SEXP r_filename) { pushRHandlers(); struct bbiFile * file = bigWigFileOpen((char *)CHAR(asChar(r_filename))); struct bbiChromInfo *chromList = bbiChromList(file); struct bbiChromInfo *chrom = chromList; SEXP seqlengths, seqlengthNames; PROTECT(seqlengths = allocVector(INTSXP, slCount(chromList))); seqlengthNames = allocVector(STRSXP, length(seqlengths)); setAttrib(seqlengths, R_NamesSymbol, seqlengthNames); for(int i = 0; i < length(seqlengths); i++) { INTEGER(seqlengths)[i] = chrom->size; SET_STRING_ELT(seqlengthNames, i, mkChar(chrom->name)); chrom = chrom->next; } bbiFileClose(&file); bbiChromInfoFreeList(&chromList); popRHandlers(); UNPROTECT(1); return seqlengths; } /* --- .Call ENTRY POINT --- */ SEXP BWGFile_query(SEXP r_filename, SEXP r_seqnames, SEXP r_ranges, SEXP r_return_score, SEXP r_return_list) { pushRHandlers(); struct bbiFile * file = bigWigFileOpen((char *)CHAR(asChar(r_filename))); Rboolean return_list = asLogical(r_return_list); SEXP ans, ans_start, ans_width, ans_score, ans_ranges, ans_nhits; SEXP numericListEls = NULL; bool returnScore = asLogical(r_return_score); struct lm *lm = lmInit(0); struct bbiInterval *hits = NULL; int n_ranges = get_IRanges_length(r_ranges); if (return_list) { PROTECT(numericListEls = allocVector(VECSXP, n_ranges)); } else { PROTECT(ans_nhits = allocVector(INTSXP, n_ranges)); } int *start = INTEGER(get_IRanges_start(r_ranges)); int *width = INTEGER(get_IRanges_width(r_ranges)); for (int i = 0; i < n_ranges; i++) { struct bbiInterval *queryHits = bigWigIntervalQuery(file, (char *)CHAR(STRING_ELT(r_seqnames, i)), start[i] - 1, start[i] - 1 + width[i], lm); int nqhits = slCount(queryHits); if (return_list) { struct bbiInterval *qhits = queryHits; SEXP ans_numeric; PROTECT(ans_numeric = allocVector(REALSXP, width[i])); memset(REAL(ans_numeric), 0, sizeof(double) * width[i]); for (int k = 0; k < nqhits; k++, qhits = qhits->next) { for (int l = qhits->start; l < qhits->end; l++) REAL(ans_numeric)[(l - start[i] + 1)] = qhits->val; } SET_VECTOR_ELT(numericListEls, i, ans_numeric); UNPROTECT(1); } else { slReverse(&queryHits); hits = slCat(queryHits, hits); INTEGER(ans_nhits)[i] = nqhits; } } bbiFileClose(&file); if (return_list) { ans = new_SimpleList("SimpleList", numericListEls); UNPROTECT(1); } else { int n_hits = slCount(hits); PROTECT(ans_start = allocVector(INTSXP, n_hits)); PROTECT(ans_width = allocVector(INTSXP, n_hits)); if (returnScore) { PROTECT(ans_score = allocVector(REALSXP, n_hits)); } else ans_score = R_NilValue; slReverse(&hits); for (int i = 0; i < n_hits; i++, hits = hits->next) { INTEGER(ans_start)[i] = hits->start + 1; INTEGER(ans_width)[i] = hits->end - hits->start; if (returnScore) REAL(ans_score)[i] = hits->val; } PROTECT(ans_ranges = new_IRanges("IRanges", ans_start, ans_width, R_NilValue)); ans = allocVector(VECSXP, 3); SET_ELEMENT(ans, 0, ans_ranges); SET_ELEMENT(ans, 1, ans_score); SET_ELEMENT(ans, 2, ans_nhits); UNPROTECT(4 + returnScore); } lmCleanup(&lm); popRHandlers(); return ans; } /* --- .Call ENTRY POINT --- */ SEXP BWGFile_summary(SEXP r_filename, SEXP r_chrom, SEXP r_ranges, SEXP r_size, SEXP r_type, SEXP r_default_value) { pushRHandlers(); struct bbiFile * file = bigWigFileOpen((char *)CHAR(asChar(r_filename))); enum bbiSummaryType type = bbiSummaryTypeFromString((char *)CHAR(asChar(r_type))); double default_value = asReal(r_default_value); int *start = INTEGER(get_IRanges_start(r_ranges)); int *width = INTEGER(get_IRanges_width(r_ranges)); SEXP ans; PROTECT(ans = allocVector(VECSXP, length(r_chrom))); for (int i = 0; i < length(r_chrom); i++) { int size = INTEGER(r_size)[i]; char *chrom = (char *)CHAR(STRING_ELT(r_chrom, i)); SEXP r_values = allocVector(REALSXP, size); double *values = REAL(r_values); for (int j = 0; j < size; j++) values[j] = default_value; SET_VECTOR_ELT(ans, i, r_values); bool success = bigWigSummaryArray(file, chrom, start[i] - 1, start[i] - 1 + width[i], type, size, values); if (!success) warning("Failed to summarize range %d (%s:%d-%d)", i, chrom, start[i], start[i] - 1 + width[i]); } bbiFileClose(&file); popRHandlers(); UNPROTECT(1); return ans; } #include "ucsc/verbose.h" SEXP BWGFile_fromWIG(SEXP r_infile, SEXP r_clip, SEXP r_seqlengths, SEXP r_outfile) { pushRHandlers(); struct lm *lm = lmInit(0); struct hash *lenHash = createIntHash(r_seqlengths); Rboolean clip = asLogical(r_clip); struct bwgSection *sections = bwgParseWig((char *)CHAR(asChar(r_infile)), clip, lenHash, itemsPerSlot, lm); bwgCreate(sections, lenHash, max(blockSize, length(r_seqlengths)), itemsPerSlot, TRUE, TRUE, FALSE, (char *)CHAR(asChar(r_outfile))); lmCleanup(&lm); freeHash(&lenHash); popRHandlers(); return r_outfile; } SEXP R_udcCleanup(SEXP r_maxDays) { double maxDays = asReal(r_maxDays); bits64 size = udcCleanup(udcDefaultDir(), maxDays, FALSE); return ScalarReal(size); } SEXP R_setUserUdcDir(SEXP r_dir) { char *dir = (char *)CHAR(asChar(r_dir)); udcSetDefaultDir(dir); return R_NilValue; } rtracklayer/src/bigWig.h0000644000175400017540000000153613556116552016311 0ustar00biocbuildbiocbuild#ifndef BIG_WIG_H #define BIG_WIG_H #include "rtracklayer.h" /* The .Call entry points */ SEXP BWGSectionList_add(SEXP r_sections, SEXP r_seq, SEXP r_ranges, SEXP r_score, SEXP r_format); SEXP BWGSectionList_write(SEXP r_sections, SEXP r_seqlengths, SEXP r_compress, SEXP r_fixed_summaries, SEXP r_file); SEXP BWGSectionList_cleanup(SEXP r_sections); SEXP BWGFile_query(SEXP r_filename, SEXP r_seqnames, SEXP r_ranges, SEXP r_colnames, SEXP r_int_ranges); SEXP BWGFile_seqlengths(SEXP r_filename); SEXP BWGFile_summary(SEXP r_filename, SEXP r_chrom, SEXP r_ranges, SEXP r_size, SEXP r_type, SEXP r_default_value); SEXP BWGFile_fromWIG(SEXP r_infile, SEXP r_clip, SEXP r_outfile, SEXP r_seqlengths); SEXP R_udcCleanup(SEXP r_maxDays); SEXP R_setUserUdcDir(SEXP dir); #endif rtracklayer/src/chain_io.c0000644000175400017540000001443713556116552016651 0ustar00biocbuildbiocbuild#include #include "ucsc/common.h" #include "ucsc/hash.h" #include "rtracklayer.h" #define LINEBUF_SIZE 20001 /* hash these chain blocks by target and query name */ typedef struct _ChainBlock { char *name; IntPairAE *ranges; /* to become an IRanges */ IntAE *offset; /* starts in the other sequence */ /* rle of spaces and scores */ IntAE *length, *score; CharAE *rev; /* use CharAE until we have a bitset */ CharAEAE *space; } ChainBlock; #define HEADER_SIZE 11 #define DATA_SIZE 3 /* returns an array of ChainBlock pointers */ ChainBlock **read_chain_file(FILE *stream, const char *exclude, int *nblocks) { /* fgets() a line if first or after blank, parse header get names, use hash table to get existing block, ow create one add score, get offsets for starts ow parse a record for width, tstart, qstart */ char linebuf[LINEBUF_SIZE]; char *header[HEADER_SIZE]; char *data[DATA_SIZE]; int tstart = 0, qstart = 0; Rboolean new_block = TRUE, excluded = FALSE, trc = FALSE, qrc = FALSE; ChainBlock *block = NULL, **result = NULL; struct hash *hash = hashNew(6); struct hashEl *hash_elements; int line = 0, i = 0, header_line = 0; while (fgets(linebuf, LINEBUF_SIZE, stream) != NULL) { line++; if (strlen(linebuf) == LINEBUF_SIZE - 1) { error("line %d is too long", line); } if (linebuf[0] == '#') { continue; } if (excluded) { eraseWhiteSpace(linebuf); if (!strlen(linebuf)) { excluded = FALSE; new_block = TRUE; } } else if (new_block) { /* have a header */ void *value; int matches = chopByChar(linebuf, ' ', header, HEADER_SIZE); if (matches < HEADER_SIZE) error("expected %d elements in header, got %d, on line %d", HEADER_SIZE, matches, line); new_block = FALSE; if (exclude && (strstr(header[2], exclude) || strstr(header[7], exclude))) { //Rprintf("excluding: [%s -> %s]\n", header[2], header[7]); excluded = TRUE; continue; } value = hashFindVal(hash, header[2]); if (!value) { /* new block */ int name_size = strlen(header[2])+1; block = Salloc(1, ChainBlock); hashAdd(hash, header[2], block); block->name = Salloc(name_size, char); memcpy(block->name, header[2], name_size); block->ranges = new_IntPairAE(0, 0); block->offset = new_IntAE(0, 0, 0); block->length = new_IntAE(0, 0, 0); block->score = new_IntAE(0, 0, 0); block->rev = new_CharAE(0); block->space = new_CharAEAE(0, 0); } else block = value; IntAE_insert_at(block->score, IntAE_get_nelt(block->score), atoi(header[1])); CharAEAE_append_string(block->space, header[7]); header_line = line; trc = strcmp("+", header[4]); qrc = strcmp("+", header[9]); CharAE_insert_at(block->rev, CharAE_get_nelt(block->rev), trc != qrc); tstart = atoi(header[5]) + 1; /* 0-based -> 1-based */ if (trc) tstart = atoi(header[3]) - tstart + 2; /* start one too high */ qstart = atoi(header[10]) + 1; if (qrc) qstart = atoi(header[8]) - qstart + 2; } else { int matches = chopByChar(linebuf, '\t', data, DATA_SIZE), width; if (matches != 1 && matches != 3) error("expecting 1 or 3 elements on line %d, got %d", line, matches); width = atoi(data[0]); tstart -= (trc ? width : 0); qstart -= (qrc ? width : 0); IntPairAE_insert_at(block->ranges, IntPairAE_get_nelt(block->ranges), tstart, width); IntAE_insert_at(block->offset, IntAE_get_nelt(block->offset), tstart - qstart); if (matches == 3) { /* normal line */ int dt = atoi(data[1]), dq = atoi(data[2]); int tchange, qchange; if (trc) /* width already subtracted above */ tchange = -dt; else tchange = width + dt; tstart += tchange; if (qrc) qchange = -dq; else qchange = width + dq; qstart += qchange; } else { new_block = TRUE; IntAE_insert_at(block->length, IntAE_get_nelt(block->length), line-header_line); //Rprintf("end of %s block, line: %d\n", block->name, line); if (fgets(linebuf, LINEBUF_SIZE, stream) == NULL) /* skip empty line */ error("incomplete block"); line++; } } } result = Salloc(hashNumEntries(hash), ChainBlock *); hash_elements = hashElListHash(hash); for (struct hashEl *h = hash_elements; h; h = h->next, i++) { result[i] = h->val; } *nblocks = i; hashElFreeList(&hash_elements); hashFree(&hash); return result; } /* parse the chain file format from UCSC for representing alignments */ SEXP readChain(SEXP r_path, SEXP r_exclude) { const char *path, *exclude; FILE *stream; SEXP ans, ans_names, ans_listData, chain_class, chainBlock_class; ChainBlock **chains; int i, nblocks; path = translateChar(STRING_ELT(r_path, 0)); if ((stream = fopen(path, "r")) == NULL) error("cannot open file '%s'", path); exclude = r_exclude == R_NilValue ? NULL : CHAR(STRING_ELT(r_exclude, 0)); chains = read_chain_file(stream, exclude, &nblocks); PROTECT(chain_class = MAKE_CLASS("Chain")); PROTECT(chainBlock_class = MAKE_CLASS("ChainBlock")); PROTECT(ans = NEW_OBJECT(chain_class)); ans_listData = allocVector(VECSXP, nblocks); SET_SLOT(ans, install("listData"), ans_listData); ans_names = allocVector(STRSXP, nblocks); SET_NAMES(ans_listData, ans_names); for (i = 0; i < nblocks; i++) { SEXP block; block = NEW_OBJECT(chainBlock_class); SET_VECTOR_ELT(ans_listData, i, block); SET_SLOT(block, install("ranges"), new_IRanges_from_IntPairAE("IRanges", chains[i]->ranges)); SET_SLOT(block, install("offset"), new_INTEGER_from_IntAE(chains[i]->offset)); SET_SLOT(block, install("length"), new_INTEGER_from_IntAE(chains[i]->length)); SET_SLOT(block, install("score"), new_INTEGER_from_IntAE(chains[i]->score)); SET_SLOT(block, install("space"), new_CHARACTER_from_CharAEAE(chains[i]->space)); SET_SLOT(block, install("reversed"), new_LOGICAL_from_CharAE(chains[i]->rev)); SET_STRING_ELT(ans_names, i, mkChar(chains[i]->name)); } UNPROTECT(3); return ans; } rtracklayer/src/handlers.c0000644000175400017540000000115713556116552016673 0ustar00biocbuildbiocbuild#include "ucsc/common.h" #include "ucsc/errAbort.h" #include "handlers.h" #define WARN_BUF_SIZE 512 static void R_warnHandler(char *format, va_list args) { char warn_buf[WARN_BUF_SIZE]; vsnprintf(warn_buf, WARN_BUF_SIZE, format, args); warning(warn_buf); } static void R_abortHandler() { error("UCSC library operation failed"); } extern int R_ignore_SIGPIPE; void pushRHandlers() { pushAbortHandler(R_abortHandler); pushWarnHandler(R_warnHandler); #ifndef WIN32 R_ignore_SIGPIPE = 1; #endif } void popRHandlers() { popAbortHandler(); popWarnHandler(); #ifndef WIN32 R_ignore_SIGPIPE = 0; #endif } rtracklayer/src/handlers.h0000644000175400017540000000016413556116552016675 0ustar00biocbuildbiocbuild#ifndef HANDLERS_H #define HANDLERS_H #include "rtracklayer.h" void pushRHandlers(); void popRHandlers(); #endif rtracklayer/src/readGFF.c0000644000175400017540000007553013556116552016337 0ustar00biocbuildbiocbuild#include "XVector_interface.h" #include "S4Vectors_interface.h" #include /* for R_ReadConnection() */ #include /* for isspace() */ #include /* for strtod() */ #include /* for memcpy() and memcmp() */ /* #include static clock_t clock0; static void init_clock(const char *msg) { printf("%s", msg); clock0 = clock(); } static void print_elapsed_time() { printf("%8.6f s\n", ((double) clock() - clock0) / CLOCKS_PER_SEC); } */ /**************************************************************************** * filexp_gets2(): A version of filexp_gets() that also works on connections */ Rconnection getConnection(int n); /* not in , why? */ static char con_buf[25000]; static int con_buf_len, con_buf_offset; static void init_con_buf() { con_buf_len = con_buf_offset = 0; return; } static int filexp_gets2(SEXP filexp, char *buf, int buf_size, int *EOL_in_buf) { Rconnection con; int buf_offset; char c; if (TYPEOF(filexp) == EXTPTRSXP) return filexp_gets(filexp, buf, buf_size, EOL_in_buf); buf_offset = *EOL_in_buf = 0; while (buf_offset < buf_size - 1) { if (con_buf_offset == con_buf_len) { con = getConnection(asInteger(filexp)); con_buf_len = (int) R_ReadConnection(con, con_buf, sizeof(con_buf) / sizeof(char)); if (con_buf_len == 0) break; con_buf_offset = 0; } c = con_buf[con_buf_offset++]; buf[buf_offset++] = c; if (c == '\n') { *EOL_in_buf = 1; break; } } buf[buf_offset] = '\0'; if (buf_offset == 0) return 0; if (con_buf_len == 0 || *EOL_in_buf) return 2; return 1; } /**************************************************************************** * Buffer of tags */ #define MAX_COLLECTED_TAGS 4096 typedef struct tags_buf { CharAEAE *collected_tags; /* used in COLLECT MODE */ SEXP tags; /* used in LOAD MODE */ /* We use a hash table for fast mapping of the tags to their corresponding column in the output of readGFF(). */ struct htab htab; } TagsBuf; #define IN_COLLECT_MODE(tags_buf) ((tags_buf)->collected_tags != NULL) /* Copied from R_HOME/src/main/envir.c */ static unsigned int char_hash(const char *s, int len) { /* djb2 as from http://www.cse.yorku.ca/~oz/hash.html */ int i; unsigned int h = 5381; for (i = 0; i < len; i++) h = ((h << 5) + h) + (*s); return h; } static int TagsBuf_get_bucket_idx(const TagsBuf *tags_buf, const char *tag, int tag_len) { unsigned int hval; int bucket_idx, M, i2; const int *buckets; const CharAE *tag_ae; SEXP tags_elt; hval = char_hash(tag, tag_len); bucket_idx = hval & tags_buf->htab.Mminus1; buckets = tags_buf->htab.buckets; M = tags_buf->htab.M; while ((i2 = buckets[bucket_idx]) != NA_INTEGER) { if (IN_COLLECT_MODE(tags_buf)) { /* COLLECT MODE */ tag_ae = tags_buf->collected_tags->elts[i2]; if (CharAE_get_nelt(tag_ae) == tag_len && memcmp(tag_ae->elts, tag, tag_len) == 0) break; } else { /* LOAD MODE */ tags_elt = STRING_ELT(tags_buf->tags, i2); if (LENGTH(tags_elt) == tag_len && memcmp(CHAR(tags_elt), tag, tag_len) == 0) break; } bucket_idx = (bucket_idx + 1) % M; } return bucket_idx; } static int TagsBuf_get_bucket_val(const TagsBuf *tags_buf, int bucket_idx) { return get_hbucket_val(&(tags_buf->htab), bucket_idx); } static void TagsBuf_set_bucket_val(TagsBuf *tags_buf, int bucket_idx, int val) { set_hbucket_val(&(tags_buf->htab), bucket_idx, val); return; } static void init_tags_buf_in_COLLECT_MODE(TagsBuf *tags_buf) { tags_buf->collected_tags = new_CharAEAE(MAX_COLLECTED_TAGS, 0); tags_buf->tags = R_NilValue; tags_buf->htab = new_htab(MAX_COLLECTED_TAGS); return; } /* The tags in 'tags' must be unique. */ static void init_tags_buf_in_LOAD_MODE(TagsBuf *tags_buf, SEXP tags) { int ntag, i, tag_len, bucket_idx, bucket_val; SEXP tags_elt; const char *tag; tags_buf->collected_tags = NULL; tags_buf->tags = tags; ntag = LENGTH(tags); tags_buf->htab = new_htab(ntag); for (i = 0; i < ntag; i++) { tags_elt = STRING_ELT(tags, i); if (tags_elt == NA_STRING) error("'tags' cannot contain NAs"); tag = CHAR(tags_elt); tag_len = LENGTH(tags_elt); bucket_idx = TagsBuf_get_bucket_idx(tags_buf, tag, tag_len); bucket_val = TagsBuf_get_bucket_val(tags_buf, bucket_idx); if (bucket_val != NA_INTEGER) error("'tags' cannot contain duplicates"); TagsBuf_set_bucket_val(tags_buf, bucket_idx, i); } return; } static void collect_tag(TagsBuf *tags_buf, const char *tag, int tag_len) { int bucket_idx, bucket_val; int i; CharAE *ae; /* We want to store unique tags in 'tags_buf' so we first check to see if 'tag' is already stored and we don't do anything if it is. */ bucket_idx = TagsBuf_get_bucket_idx(tags_buf, tag, tag_len); bucket_val = TagsBuf_get_bucket_val(tags_buf, bucket_idx); if (bucket_val != NA_INTEGER) return; /* 'tag' was found ==> nothing to do */ /* 'tag' was not found ==> add it */ i = CharAEAE_get_nelt(tags_buf->collected_tags); if (i >= MAX_COLLECTED_TAGS) error("GFF files with more than %d tags are not supported", MAX_COLLECTED_TAGS); TagsBuf_set_bucket_val(tags_buf, bucket_idx, i); ae = new_CharAE(tag_len); CharAE_set_nelt(ae, tag_len); memcpy(ae->elts, tag, tag_len); CharAEAE_insert_at(tags_buf->collected_tags, i, ae); return; } static int match_tag(const TagsBuf *tags_buf, const char *tag, int tag_len) { int bucket_idx; bucket_idx = TagsBuf_get_bucket_idx(tags_buf, tag, tag_len); return TagsBuf_get_bucket_val(tags_buf, bucket_idx); } static SEXP get_collected_tags(const TagsBuf *tags_buf) { if (tags_buf == NULL || !IN_COLLECT_MODE(tags_buf)) return R_NilValue; return new_CHARACTER_from_CharAEAE(tags_buf->collected_tags); } /**************************************************************************** * gff_colnames() * * See http://www.sequenceontology.org/resources/gff3.html for the official * GFF3 specs. */ static const char *col_names[] = { "seqid", "source", "type", "start", "end", "score", "strand", "phase", "attributes" /* "group" for GFF1 */ }; static const SEXPTYPE col_types[] = { STRSXP, /* seqid */ STRSXP, /* source */ STRSXP, /* type */ INTSXP, /* start */ INTSXP, /* end */ REALSXP, /* score */ STRSXP, /* strand */ INTSXP, /* phase */ STRSXP /* attributes */ }; #define GFF_NCOL ((int) (sizeof(col_names) / sizeof(char *))) #define SEQID_IDX 0 #define SOURCE_IDX 1 #define TYPE_IDX 2 #define START_IDX 3 #define END_IDX 4 #define SCORE_IDX 5 #define STRAND_IDX 6 #define PHASE_IDX 7 #define ATTRIBUTES_IDX 8 static const char *gff_colname(int col_idx, int gff1) { if (col_idx == ATTRIBUTES_IDX && gff1) return "group"; return col_names[col_idx]; } /* --- .Call ENTRY POINT --- */ SEXP gff_colnames(SEXP GFF1) { SEXP ans, ans_elt; int col_idx; const char *colname; PROTECT(ans = NEW_CHARACTER(GFF_NCOL)); for (col_idx = 0; col_idx < GFF_NCOL; col_idx++) { colname = gff_colname(col_idx, LOGICAL(GFF1)[0]); PROTECT(ans_elt = mkChar(colname)); SET_STRING_ELT(ans, col_idx, ans_elt); UNPROTECT(1); } UNPROTECT(1); return ans; } /**************************************************************************** * read_gff_pragmas(), scan_gff(), and load_gff() */ static double as_double(const char *val, int val_len) { double x; char *end_conversion, c; int end_offset, i; x = strtod(val, &end_conversion); end_offset = end_conversion - val; if (end_offset == 0) return NA_REAL; for (i = end_offset; i < val_len; i++) { c = val[i]; if (!isspace(c)) return NA_REAL; } return x; } static int prepare_colmap0(int *colmap0, SEXP colmap) { int ans_ncol0, col_idx, j; ans_ncol0 = 0; for (col_idx = 0; col_idx < GFF_NCOL; col_idx++) { j = INTEGER(colmap)[col_idx]; if (j != NA_INTEGER) { if (j > ans_ncol0) ans_ncol0 = j; j--; } colmap0[col_idx] = j; } return ans_ncol0; } static SEXP alloc_ans(int ans_nrow, int ans_ncol0, const int *colmap0, SEXP tags, SEXP pragmas, SEXP attrcol_fmt, SEXP raw_data) { int ans_ntag, ans_ncol, gff1, is_raw, col_idx, j, i; SEXP ans, ans_attr, ans_names, ans_col, ans_colname, tags_elt; SEXPTYPE col_type; const char *colname; ans_ntag = LENGTH(tags); ans_ncol = ans_ncol0 + ans_ntag; gff1 = INTEGER(attrcol_fmt)[0] == 1; is_raw = LOGICAL(raw_data)[0]; PROTECT(ans = NEW_LIST(ans_ncol)); PROTECT(ans_names = NEW_CHARACTER(ans_ncol)); /* Alloc standard GFF columns. */ for (col_idx = 0; col_idx < GFF_NCOL; col_idx++) { j = colmap0[col_idx]; if (j == NA_INTEGER) continue; col_type = is_raw ? STRSXP : col_types[col_idx]; PROTECT(ans_col = allocVector(col_type, ans_nrow)); SET_ELEMENT(ans, j, ans_col); UNPROTECT(1); colname = gff_colname(col_idx, gff1); PROTECT(ans_colname = mkChar(colname)); SET_STRING_ELT(ans_names, j, ans_colname); UNPROTECT(1); j++; } /* Alloc tag columns. */ for (j = ans_ncol0; j < ans_ncol; j++) { PROTECT(ans_col = NEW_CHARACTER(ans_nrow)); for (i = 0; i < ans_nrow; i++) SET_STRING_ELT(ans_col, i, NA_STRING); SET_ELEMENT(ans, j, ans_col); UNPROTECT(1); tags_elt = STRING_ELT(tags, j - ans_ncol0); PROTECT(ans_colname = duplicate(tags_elt)); SET_STRING_ELT(ans_names, j, ans_colname); UNPROTECT(1); } SET_NAMES(ans, ans_names); UNPROTECT(1); /* list_as_data_frame() performs IN-PLACE coercion */ list_as_data_frame(ans, ans_nrow); /* Set additional attributes. */ PROTECT(ans_attr = duplicate(pragmas)); SET_ATTR(ans, install("pragmas"), ans_attr); UNPROTECT(1); PROTECT(ans_attr = duplicate(attrcol_fmt)); SET_ATTR(ans, install("attrcol_fmt"), ans_attr); UNPROTECT(1); PROTECT(ans_attr = ScalarInteger(ans_ncol0)); SET_ATTR(ans, install("ncol0"), ans_attr); UNPROTECT(1); PROTECT(ans_attr = ScalarInteger(ans_ntag)); SET_ATTR(ans, install("ntag"), ans_attr); UNPROTECT(1); PROTECT(ans_attr = duplicate(raw_data)); SET_ATTR(ans, install("raw_data"), raw_data); UNPROTECT(1); UNPROTECT(1); return ans; } static void load_string(const char *data, int data_len, SEXP ans_col, int row_idx) { SEXP tmp; PROTECT(tmp = mkCharLen(data, data_len)); SET_STRING_ELT(ans_col, row_idx, tmp); UNPROTECT(1); return; } static void load_int(const char *data, int data_len, SEXP ans_col, int row_idx) { INTEGER(ans_col)[row_idx] = as_int(data, data_len); return; } static void load_double(const char *data, int data_len, SEXP ans_col, int row_idx) { REAL(ans_col)[row_idx] = as_double(data, data_len); return; } static char errmsg_buf[256]; static const char *load_data(const char *data, int data_len, SEXP ans, int row_idx, int col_idx, const int *colmap0, int lineno) { SEXP ans_col; int is_raw; SEXPTYPE col_type; ans_col = VECTOR_ELT(ans, colmap0[col_idx]); is_raw = LOGICAL(GET_ATTR(ans, install("raw_data")))[0]; if (is_raw) { load_string(data, data_len, ans_col, row_idx); return NULL; } col_type = col_types[col_idx]; if (col_idx == START_IDX || col_idx == END_IDX) { reset_ovflow_flag(); load_int(data, data_len, ans_col, row_idx); if (get_ovflow_flag()) { snprintf(errmsg_buf, sizeof(errmsg_buf), "line %d contains values greater than 2^31-1 " "\n (= .Machine$integer.max) in column 4 " "(start) and/or 5 (end).\n Bioconductor " "does not support such GFF files at the " "moment. Sorry!", lineno); return errmsg_buf; } return NULL; } switch (col_type) { case STRSXP: if (data_len == 1) { if (col_idx == STRAND_IDX && (data[0] == '.' || data[0] == '?')) { data = "*"; data_len = 1; } else if (data[0] == '.') { SET_STRING_ELT(ans_col, row_idx, NA_STRING); break; } } load_string(data, data_len, ans_col, row_idx); break; case INTSXP: load_int(data, data_len, ans_col, row_idx); break; case REALSXP: load_double(data, data_len, ans_col, row_idx); break; } return NULL; } static void load_tagval(const char *tag, int tag_len, const char *val, int val_len, SEXP ans, int row_idx, const TagsBuf *tags_buf) { int j; SEXP ans_col; j = match_tag(tags_buf, tag, tag_len); if (j == NA_INTEGER) return; /* 'tag' was not found ==> nothing to do */ j += INTEGER(GET_ATTR(ans, install("ncol0")))[0]; ans_col = VECTOR_ELT(ans, j); load_string(val, val_len, ans_col, row_idx); return; } #define IOBUF_SIZE 65536 /* * We use a heuristic to detect the format of the "attributes" col. * Terminology: * - Chunks in 'data' separated by ';' are called units. * - A unit with only white-space characters is called a "white" unit. * - A "tag-like word" is a sequence of contiguous non-white-space characters * with no '=' in it. * - A unit made of one "tag-like word" (possibly surrounded by white-space * characters) is called a "tag-only" unit. * Heuristic: * (a) If 'data' contains only 1 unit (i.e. no ';' in it), * then: * - if it's "white" -> return UNKNOWN_FMT * - if it's "tag-only" -> return GFF1_FMT * - otherwise -> (c) below applies. * (b) If 'data' contains > 1 units (i.e. at least 1 ';' in it), then the * format can't be GFF1_FMT anymore so we have to choose between GFF2_FMT * and GFF3_FMT. For that matter "white" and "tag-only" units are * considered uninformative so we skip them. If all units are * uninformative then we return UNKNOWN_FMT. Otherwise the first * informative unit is used and (c) below applies. * (c) Now we're looking at a unit that is not "white" or "tag-only" and * want to be able to tell whether its format is GFF2_FMT or GFF3_FMT * (UNKNOWN_FMT or GFF1_FMT are not an option anymore). The rule is: if * the unit contains a '=' and if this '=' is preceded by one * "tag-like word" only (possibly surrounded by white-space characters) * then the format is GFF3_FMT. Otherwise it's GFF2_FMT. * Examples: * data detected format * |ID=4|----------------> GFF3_FMT * | ID = 4 |--------> GFF3_FMT * |=|-------------------> GFF3_FMT * | = 4 |---------> GFF3_FMT * | = ID 4 |-------> GFF3_FMT * |ID 4|----------------> GFF2_FMT * | ID 4 |----------> GFF2_FMT * |X Y=4|---------------> inherently ambiguous (could be GFF2 or GFF3) but * our heuristic returns GFF2_FMT (tag is "X" and * value is "Y=4") * |XY z =|--------------> GFF2_FMT (tag is "XY" and value is "z =") * |; ;ID=4;Parent 12|---> GFF3_FMT (we look at the 1st informative unit) * |; ;ID 4;Parent=12|---> GFF2_FMT (we look at the 1st informative unit) * |99|------------------> GFF1_FMT * ||--------------------> UNKNOWN_FMT * | |-----------------> UNKNOWN_FMT * | ; 99 ; |----------> UNKNOWN_FMT * |99; ID = 4|---------> GFF3_FMT */ #define UNKNOWN_FMT 0 #define GFF1_FMT 1 #define GFF2_FMT 2 #define GFF3_FMT 3 #define FIRST_SPACE 0 #define FIRST_WORD 1 #define SECOND_SPACE 2 static int detect_attrcol_fmt(const char *data, int data_len) { int nsep, state, i; char c; nsep = 0; state = FIRST_SPACE; for (i = 0; i < data_len; i++) { c = data[i]; if (isspace(c)) { if (state == FIRST_WORD) state = SECOND_SPACE; continue; } if (c == ';') { nsep++; /* We came to the end of a unit that was "white" (i.e. current state is FIRST_SPACE) or "tag-only" (i.e. current state is FIRST_WORD or SECOND_SPACE). This is considered uninformative i.e. it didn't allow us to decide between GFF2_FMT and GFF3_FMT (see (b) above). */ state = FIRST_SPACE; continue; } if (c == '=') return GFF3_FMT; if (state == SECOND_SPACE) return GFF2_FMT; if (state == FIRST_SPACE) state = FIRST_WORD; } if (nsep == 0 && state != FIRST_SPACE) return GFF1_FMT; return UNKNOWN_FMT; } static void parse_GFF3_tagval(const char *tagval, int tagval_len, SEXP ans, int row_idx, TagsBuf *tags_buf) { int tag_len, val_len; char c; const char *val; /* Some GFF3 files have a space betwwen the tag=value and the preceding ; e.g. ID=Csa1M000010.1; Parent=Csa1G000010; Name=Csa1M000010.1 We skip those spaces. */ while (tagval_len > 0 && tagval[0] == ' ') { tagval++; tagval_len--; } /* Compute 'tag_len'. */ for (tag_len = 0; tag_len < tagval_len; tag_len++) { c = tagval[tag_len]; if (c == '=') break; } /* If 'tagval' is not in the "tag=value" format then we ignore it. */ if (tag_len >= tagval_len) return; if (ans != R_NilValue) { val = tagval + tag_len + 1; val_len = tagval_len - tag_len - 1; load_tagval(tagval, tag_len, val, val_len, ans, row_idx, tags_buf); return; } if (tags_buf != NULL && IN_COLLECT_MODE(tags_buf)) collect_tag(tags_buf, tagval, tag_len); return; } /* * It seems that embedded double-quotes might be allowed in the value part of * the tag value pairs of a GFF2 file, and that they are represented with 2 * consecutive double-quotes. To handle them properly, we should replace the * 2 double-quotes by only 1, but this would require to generate a (shrinked) * copy of 'val'. So for now we don't do this and just leave the 2 consecutive * double-quotes in 'val' as-is, and attach an attribute to 'ans' to indicate * that we've found embedded double-quotes. We also issue a warning. If we ever * get that warning on real-world files, then we'll revisit this. */ static void check_for_embedded_dblquotes(const char *val, int val_len, SEXP ans) { SEXP has_embedded_quotes; int i, j; has_embedded_quotes = GET_ATTR(ans, install("has_embedded_quotes")); if (!isNull(has_embedded_quotes) && LOGICAL(has_embedded_quotes)[0]) return; for (i = 0, j = 1; j < val_len; i++, j++) { if (val[i] == '"' && val[j] == '"') break; } if (j >= val_len) return; PROTECT(has_embedded_quotes = ScalarLogical(1)); SET_ATTR(ans, install("has_embedded_quotes"), has_embedded_quotes); UNPROTECT(1); warning("the value part of some of the tag value pairs " "contains embedded double-quotes"); return; } static void parse_GFF2_tagval(const char *tagval, int tagval_len, SEXP ans, int row_idx, TagsBuf *tags_buf) { int i, tag_len, val_len; char c; const char *val; /* Trim leading space. */ for (i = 0; i < tagval_len; i++) { c = tagval[i]; if (!isspace(c)) break; } tagval += i; tagval_len -= i; /* Compute 'tag_len'. */ for (tag_len = 0; tag_len < tagval_len; tag_len++) { c = tagval[tag_len]; if (isspace(c)) break; } /* If 'tagval' is not in the "tag value" format then we ignore it. */ if (tag_len >= tagval_len) return; if (ans != R_NilValue) { val = tagval + tag_len + 1; val_len = tagval_len - tag_len - 1; /* Trim leading space in 'val'. */ for (i = 0; i < val_len; i++) { c = val[i]; if (!isspace(c)) break; } val += i; val_len -= i; /* Trim trailing space in 'val'. */ for (i = val_len - 1; i >= 0; i--) { c = val[i]; if (!isspace(c)) break; } val_len = i + 1; /* Trim leading and trailing double-quotes in 'val'. */ if (val_len != 0 && val[0] == '"') { val++; val_len--; } if (val_len != 0 && val[val_len - 1] == '"') { val_len--; } check_for_embedded_dblquotes(val, val_len, ans); load_tagval(tagval, tag_len, val, val_len, ans, row_idx, tags_buf); return; } if (tags_buf != NULL && IN_COLLECT_MODE(tags_buf)) collect_tag(tags_buf, tagval, tag_len); return; } static void parse_GFF3_attrcol(const char *data, int data_len, SEXP ans, int row_idx, TagsBuf *tags_buf) { const char *tagval; int tagval_len, i; char c; tagval = data; tagval_len = 0; for (i = 0; i < data_len; i++) { c = data[i]; if (c != ';') { tagval_len++; continue; } parse_GFF3_tagval(tagval, tagval_len, ans, row_idx, tags_buf); tagval = data + i + 1; tagval_len = 0; } parse_GFF3_tagval(tagval, tagval_len, ans, row_idx, tags_buf); return; } static void parse_GFF2_attrcol(const char *data, int data_len, SEXP ans, int row_idx, TagsBuf *tags_buf) { const char *tagval; int tagval_len, in_quotes, i; char c; tagval = data; tagval_len = 0; in_quotes = 0; for (i = 0; i < data_len; i++) { c = data[i]; if (c == '"') { tagval_len++; in_quotes = !in_quotes; continue; } if (in_quotes || c != ';') { tagval_len++; continue; } parse_GFF2_tagval(tagval, tagval_len, ans, row_idx, tags_buf); tagval = data + i + 1; tagval_len = 0; } parse_GFF2_tagval(tagval, tagval_len, ans, row_idx, tags_buf); return; } static const char *set_data_holders(Chars_holder *data_holders, const char *line, int lineno) { int col_idx, i, data_len; const char *data; char c; col_idx = i = 0; data = line; data_len = 0; while ((c = line[i++])) { if (c != '\t') { data_len++; continue; } data_holders[col_idx].ptr = data; data_holders[col_idx].length = data_len; col_idx++; if (col_idx == GFF_NCOL) break; data = line + i; data_len = 0; } if (col_idx == GFF_NCOL) { /* We've seen 9 tabs but it's OK if the 9th tab is followed by white spaces only (some GTF files are like that). Otherwise we raise an error. */ while ((c = line[i++])) { if (isspace(c)) continue; snprintf(errmsg_buf, sizeof(errmsg_buf), "line %d has more than %d " "tab-separated columns", lineno, GFF_NCOL); return errmsg_buf; } } else { if (col_idx < GFF_NCOL - 2) { snprintf(errmsg_buf, sizeof(errmsg_buf), "line %d has less than %d " "tab-separated columns", lineno, GFF_NCOL - 1); return errmsg_buf; } data_len = delete_trailing_LF_or_CRLF(data, data_len); data_holders[col_idx].ptr = data; data_holders[col_idx].length = data_len; col_idx++; if (col_idx == GFF_NCOL - 1) data_holders[col_idx].length = 0; } return NULL; } static void check_filter(SEXP filter, int attrcol_fmt) { int filter_len, col_idx, nval, i; SEXP filter_elt, val; if (isNull(filter)) return; filter_len = attrcol_fmt == 1 ? GFF_NCOL : GFF_NCOL - 1; if (!(IS_LIST(filter) && LENGTH(filter) == filter_len)) error("incorrect 'filter'"); for (col_idx = 0; col_idx < filter_len; col_idx++) { filter_elt = VECTOR_ELT(filter, col_idx); if (isNull(filter_elt)) continue; if (!IS_CHARACTER(filter_elt)) error("each list element in 'filter' must be " "NULL or a character vector"); nval = LENGTH(filter_elt); for (i = 0; i < nval; i++) { val = STRING_ELT(filter_elt, i); if (val == NA_STRING) error("'filter' cannot contain NAs"); } } return; } static int pass_filter(Chars_holder *data_holders, SEXP filter) { int filter_len, col_idx, data_len, nval, i; SEXP filter_elt, val; const char *data; filter_len = LENGTH(filter); for (col_idx = 0; col_idx < filter_len; col_idx++) { filter_elt = VECTOR_ELT(filter, col_idx); if (isNull(filter_elt)) continue; data = data_holders[col_idx].ptr; data_len = data_holders[col_idx].length; nval = LENGTH(filter_elt); for (i = 0; i < nval; i++) { val = STRING_ELT(filter_elt, i); if (LENGTH(val) == data_len && memcmp(CHAR(val), data, data_len) == 0) break; } if (i >= nval) return 0; } return 1; } static const char *parse_GFF_line(const char *line, int lineno, int *attrcol_fmt, SEXP filter, /* used during scan and load */ SEXP ans, /* used during load (2nd pass) */ int *row_idx, /* used during scan and load */ const int *colmap0, /* used during load (2nd pass) */ TagsBuf *tags_buf) /* used during scan and load */ { const char *errmsg; Chars_holder data_holders[GFF_NCOL]; const Chars_holder *data_holder; const char *data; int data_len, col_idx; errmsg = set_data_holders(data_holders, line, lineno); if (errmsg != NULL) return errmsg; /* Try to detect the format of the "attributes" col before filtering. */ if (*attrcol_fmt == UNKNOWN_FMT) { data_holder = data_holders + ATTRIBUTES_IDX; data = data_holder->ptr; data_len = data_holder->length; *attrcol_fmt = detect_attrcol_fmt(data, data_len); } if (!(isNull(filter) || pass_filter(data_holders, filter))) return NULL; for (col_idx = 0, data_holder = data_holders; col_idx < GFF_NCOL; col_idx++, data_holder++) { data = data_holder->ptr; data_len = data_holder->length; if (ans != R_NilValue && colmap0[col_idx] != NA_INTEGER) { errmsg = load_data(data, data_len, ans, *row_idx, col_idx, colmap0, lineno); if (errmsg != NULL) return errmsg; } if (col_idx != ATTRIBUTES_IDX) continue; switch (*attrcol_fmt) { case GFF3_FMT: parse_GFF3_attrcol(data, data_len, ans, *row_idx, tags_buf); break; case GFF2_FMT: parse_GFF2_attrcol(data, data_len, ans, *row_idx, tags_buf); break; } } (*row_idx)++; return NULL; } /* Stop parsing after 1st GFF line. */ static const char *load_GFF_pragmas(SEXP filexp, CharAEAE *pragmas_buf, int *attrcol_fmt) { int row_idx, lineno, ret_code, EOL_in_buf, buf_len; char buf[IOBUF_SIZE], c; if (TYPEOF(filexp) != EXTPTRSXP) init_con_buf(); row_idx = 0; for (lineno = 1; (ret_code = filexp_gets2(filexp, buf, IOBUF_SIZE, &EOL_in_buf)); lineno += EOL_in_buf) { if (ret_code == -1) { snprintf(errmsg_buf, sizeof(errmsg_buf), "read error while reading characters " "from line %d", lineno); return errmsg_buf; } if (!EOL_in_buf) { snprintf(errmsg_buf, sizeof(errmsg_buf), "cannot read line %d, " "line is too long", lineno); return errmsg_buf; } c = buf[0]; if (c != '#') { /* Skip empty line. */ if (c == '\n' || (c == '\r' && buf[1] == '\n')) continue; /* Stop parsing at 1st FASTA header... */ if (c == '>') return NULL; /* ... or at 1st GFF line. */ return parse_GFF_line(buf, lineno, attrcol_fmt, R_NilValue, R_NilValue, &row_idx, NULL, NULL); } /* Line starting with a single # -> human-readable comment. */ if (buf[1] != '#') continue; /* Line starting with ## -> pragma line. */ buf_len = delete_trailing_LF_or_CRLF(buf, -1); buf[buf_len] = '\0'; CharAEAE_append_string(pragmas_buf, buf); } return NULL; } static const char *parse_GFF_file(SEXP filexp, int *attrcol_fmt, SEXP filter, /* used during scan and load */ int *nrows, /* used during scan and load */ SEXP ans, /* used during load (2nd pass) */ const int *colmap0, /* used during load (2nd pass) */ TagsBuf *tags_buf) /* used during scan and load */ { int row_idx, lineno, ret_code, EOL_in_buf; char buf[IOBUF_SIZE], c; const char *errmsg; if (TYPEOF(filexp) != EXTPTRSXP) init_con_buf(); row_idx = 0; for (lineno = 1; (ret_code = filexp_gets2(filexp, buf, IOBUF_SIZE, &EOL_in_buf)); lineno += EOL_in_buf) { if (ret_code == -1) { snprintf(errmsg_buf, sizeof(errmsg_buf), "read error while reading characters " "from line %d", lineno); return errmsg_buf; } if (!EOL_in_buf) { snprintf(errmsg_buf, sizeof(errmsg_buf), "cannot read line %d, " "line is too long", lineno); return errmsg_buf; } if (*nrows >= 0 && row_idx == *nrows) return NULL; c = buf[0]; if (c == '#') continue; if (c == '\n' || (c == '\r' && buf[1] == '\n')) continue; /* skip empty line */ if (c == '>') break; /* stop parsing at 1st FASTA header */ errmsg = parse_GFF_line(buf, lineno, attrcol_fmt, filter, ans, &row_idx, colmap0, tags_buf); if (errmsg != NULL) return errmsg; } *nrows = row_idx; return NULL; } /* --- .Call ENTRY POINT --- * Return pragmas and detected format of the "attributes" col from the 1st * GFF line. * Arg: * filexp: A "file external pointer" (see src/io_utils.c in the XVector * package). Alternatively can be a connection. */ SEXP read_gff_pragmas(SEXP filexp) { CharAEAE *pragmas_buf; int attrcol_fmt0; const char *errmsg; SEXP pragmas, attrcol_fmt; pragmas_buf = new_CharAEAE(0, 0); attrcol_fmt0 = UNKNOWN_FMT; errmsg = load_GFF_pragmas(filexp, pragmas_buf, &attrcol_fmt0); if (errmsg != NULL) error("reading GFF file: %s", errmsg); PROTECT(pragmas = new_CHARACTER_from_CharAEAE(pragmas_buf)); PROTECT(attrcol_fmt = ScalarInteger(attrcol_fmt0)); SET_ATTR(pragmas, install("attrcol_fmt"), attrcol_fmt); UNPROTECT(2); return pragmas; } /* --- .Call ENTRY POINT --- * Perform the 1st pass of readGFF(). * Args: * filexp: MUST be the same as passed to read_gff_pragmas(). * attrcol_fmt: * tags: NULL or a character vector indicating which tags to load. * NULL means load all tags. * filter: NULL or a list of length GFF_NCOL-1 (or GFF_NCOL if * 'attrcol_fmt' is 1). Each list element must be NULL or a * character vector with no NAs. * nrows: -1 or the maximum number of rows to read in (after * filtering). */ SEXP scan_gff(SEXP filexp, SEXP attrcol_fmt, SEXP tags, SEXP filter, SEXP nrows) { int attrcol_fmt0, nrows0; TagsBuf tags_buf, *tags_buf_p; const char *errmsg; SEXP scan_ans, scan_ans_elt; //init_clock("scan_gff: T1 = "); attrcol_fmt0 = INTEGER(attrcol_fmt)[0]; if (tags == R_NilValue) { tags_buf_p = &tags_buf; init_tags_buf_in_COLLECT_MODE(tags_buf_p); } else { tags_buf_p = NULL; } check_filter(filter, attrcol_fmt0); nrows0 = INTEGER(nrows)[0]; errmsg = parse_GFF_file(filexp, &attrcol_fmt0, filter, &nrows0, R_NilValue, NULL, tags_buf_p); if (errmsg != NULL) error("reading GFF file: %s", errmsg); PROTECT(scan_ans = NEW_LIST(2)); PROTECT(scan_ans_elt = get_collected_tags(tags_buf_p)); SET_ELEMENT(scan_ans, 0, scan_ans_elt); UNPROTECT(1); PROTECT(scan_ans_elt = ScalarInteger(nrows0)); SET_ELEMENT(scan_ans, 1, scan_ans_elt); UNPROTECT(2); //print_elapsed_time(); return scan_ans; } /* --- .Call ENTRY POINT --- * Perform the 2nd pass of readGFF(). * Args: * filexp: MUST be the same as passed to scan_gff(). * attrcol_fmt: * tags: A character vector indicating which tags to load. Unlike for * scan_gff() above, it cannot be NULL. * filter: MUST be the same as passed to scan_gff(). This time we * don't check it. * nrows: Integer vector of length 1 containing the number of rows * scan_gff() said will end up in 'ans'. * pragmas: Character vector containing the pragma lines returned by * read_gff_pragmas(). * colmap: An integer vector of length GFF_NCOL indicating which columns * to load and in which order. * raw_data: TRUE or FALSE. If TRUE, numeric columns (e.g. "start" or * "score") are loaded as character vectors and as-is i.e. how * they are found in the file. */ SEXP load_gff(SEXP filexp, SEXP attrcol_fmt, SEXP tags, SEXP filter, SEXP nrows, SEXP pragmas, SEXP colmap, SEXP raw_data) { int attrcol_fmt0, colmap0[GFF_NCOL], ans_ncol0; TagsBuf tags_buf; SEXP ans; const char *errmsg; //init_clock("load_gff: T2 = "); attrcol_fmt0 = INTEGER(attrcol_fmt)[0]; init_tags_buf_in_LOAD_MODE(&tags_buf, tags); ans_ncol0 = prepare_colmap0(colmap0, colmap); PROTECT(ans = alloc_ans(INTEGER(nrows)[0], ans_ncol0, colmap0, tags, pragmas, attrcol_fmt, raw_data)); errmsg = parse_GFF_file(filexp, &attrcol_fmt0, filter, INTEGER(nrows), ans, colmap0, &tags_buf); UNPROTECT(1); if (errmsg != NULL) error("reading GFF file: %s", errmsg); //print_elapsed_time(); return ans; } rtracklayer/src/readGFF.h0000644000175400017540000000060213556116552016330 0ustar00biocbuildbiocbuild#ifndef GFF_H #define GFF_H #include "rtracklayer.h" /* The .Call entry points */ SEXP gff_colnames(SEXP GFF1); SEXP read_gff_pragmas(SEXP filexp); SEXP scan_gff(SEXP filexp, SEXP attrcol_fmt, SEXP tags, SEXP filter, SEXP nrows); SEXP load_gff(SEXP filexp, SEXP attrcol_fmt, SEXP tags, SEXP filter, SEXP nrows, SEXP pragmas, SEXP colmap, SEXP raw_data); #endif rtracklayer/src/rtracklayer.h0000644000175400017540000000025513556116552017421 0ustar00biocbuildbiocbuild#ifndef RTRACKLAYER_H #define RTRACKLAYER_H #include #include #include #include #endif rtracklayer/src/twoBit.c0000644000175400017540000000753313556116552016347 0ustar00biocbuildbiocbuild#include "ucsc/common.h" #include "ucsc/dnaseq.h" #include "ucsc/twoBit.h" #include "twoBit.h" #include "handlers.h" /* .Call entry point */ SEXP DNAString_to_twoBit(SEXP r_dna, SEXP r_mask, SEXP r_seqname) { pushRHandlers(); dnaUtilOpen(); const DNA *dna = CHAR(asChar(r_dna)); struct dnaSeq *seq = newDnaSeq((DNA *)dna, strlen(dna), (char *)CHAR(asChar(r_seqname))); struct twoBit *twoBit = twoBitFromDnaSeq(seq, FALSE); int *mask_start = INTEGER(get_IRanges_start(r_mask)); int *mask_width = INTEGER(get_IRanges_width(r_mask)); int mask_count = get_IRanges_length(r_mask); SEXP ans; if (mask_count) { AllocArray(twoBit->maskStarts, mask_count); AllocArray(twoBit->maskSizes, mask_count); } for (int i = 0; i < mask_count; i++) { twoBit->maskStarts[i] = mask_start[i] - 1; twoBit->maskSizes[i] = mask_width[i]; } seq->dna = NULL; /* do not free memory owned by R */ freeDnaSeq(&seq); popRHandlers(); PROTECT(ans = R_MakeExternalPtr(twoBit, R_NilValue, R_NilValue)); setAttrib(ans, R_ClassSymbol, mkString("twoBit")); UNPROTECT(1); return ans; } /* .Call entry point */ /* Writes the list of twoBit pointers to disk and frees them */ SEXP TwoBits_write(SEXP r_twoBits, SEXP r_filename) { pushRHandlers(); FILE *file = mustOpen((char *)CHAR(asChar(r_filename)), "wb"); struct twoBit *twoBits = NULL, *twoBit_it = NULL; for (int i = 0; i < length(r_twoBits); i++) slAddHead(&twoBits, R_ExternalPtrAddr(VECTOR_ELT(r_twoBits, i))); slReverse(&twoBits); twoBitWriteHeader(twoBits, file); for (twoBit_it = twoBits; twoBit_it != NULL; twoBit_it = twoBit_it->next) { twoBitWriteOne(twoBit_it, file); } twoBitFreeList(&twoBits); carefulClose(&file); popRHandlers(); return R_NilValue; } /* .Call entry point */ SEXP TwoBitFile_seqlengths(SEXP r_filename) { pushRHandlers(); struct twoBitFile *tbf = twoBitOpen((char *)CHAR(asChar(r_filename))); struct twoBitIndex *index; int i, n = slCount(tbf->indexList); SEXP r_seqlengths, r_seqnames; PROTECT(r_seqlengths = allocVector(INTSXP, n)); r_seqnames = allocVector(STRSXP, n); setAttrib(r_seqlengths, R_NamesSymbol, r_seqnames); for (index = tbf->indexList, i = 0; index != NULL; index = index->next, i++) { SET_STRING_ELT(r_seqnames, i, mkChar(index->name)); INTEGER(r_seqlengths)[i] = twoBitSeqSize(tbf, index->name); } twoBitClose(&tbf); popRHandlers(); UNPROTECT(1); return r_seqlengths; } SEXP TwoBitFile_read(SEXP r_filename, SEXP r_seqnames, SEXP r_ranges, SEXP lkup) { pushRHandlers(); struct twoBitFile *file = twoBitOpen((char *)CHAR(asChar(r_filename))); int *frag_start = INTEGER(get_IRanges_start(r_ranges)); int *frag_width = INTEGER(get_IRanges_width(r_ranges)); int frag_count = get_IRanges_length(r_ranges); SEXP r_ans_width, r_ans; XVectorList_holder r_ans_holder; PROTECT(r_ans_width = duplicate(get_IRanges_width(r_ranges))); PROTECT(r_ans = alloc_XRawList("DNAStringSet", "DNAString", r_ans_width)); r_ans_holder = hold_XVectorList(r_ans); for (int i = 0; i < frag_count; i++) { if (frag_width[i]) { // UCSC library does not like zero width ranges struct dnaSeq *frag = twoBitReadSeqFrag(file, (char *)CHAR(STRING_ELT(r_seqnames, i)), frag_start[i] - 1, frag_start[i] + frag_width[i] - 1); Chars_holder r_ans_elt_holder = get_elt_from_XRawList_holder(&r_ans_holder, i); /* r_ans_elt_holder.ptr is a const char * so we need to cast it to char * before we can write to it */ Ocopy_bytes_to_i1i2_with_lkup(0, r_ans_elt_holder.length - 1, (char *)r_ans_elt_holder.ptr, r_ans_elt_holder.length, frag->dna, frag->size, INTEGER(lkup), LENGTH(lkup)); freeDnaSeq(&frag); } } twoBitClose(&file); popRHandlers(); UNPROTECT(2); return r_ans; } rtracklayer/src/twoBit.h0000644000175400017540000000056113556116552016346 0ustar00biocbuildbiocbuild#ifndef TWO_BIT_H #define TWO_BIT_H #include "rtracklayer.h" /* The .Call entry points */ SEXP DNAString_to_twoBit(SEXP r_dna, SEXP r_mask, SEXP r_seqname); SEXP TwoBits_write(SEXP r_twoBits, SEXP r_filename); SEXP TwoBitFile_seqlengths(SEXP r_filename); SEXP TwoBitFile_read(SEXP r_filename, SEXP r_seqnames, SEXP r_ranges, SEXP lkup); #endif rtracklayer/src/ucsc/0000755000175400017540000000000013556147727015670 5ustar00biocbuildbiocbuildrtracklayer/src/ucsc/_cheapcgi.c0000644000175400017540000000310713556116552017727 0ustar00biocbuildbiocbuild/* rtracklayer took out these little utilities from cheapcgi.c */ #include "common.h" void cgiDecode(char *in, char *out, int inLength) /* Decode from cgi pluses-for-spaces format to normal. * Out will be a little shorter than in typically, and * can be the same buffer. */ { char c; int i; for (i=0; isize = size; fi->isDir = isDir; fi->statErrno = statErrno; fi->lastAccess = lastAccess; strcpy(fi->name, name); return fi; } int cmpFileInfo(const void *va, const void *vb) /* Compare two fileInfo. */ { const struct fileInfo *a = *((struct fileInfo **)va); const struct fileInfo *b = *((struct fileInfo **)vb); return strcmp(a->name, b->name); } rtracklayer/src/ucsc/_portimpl.h0000644000175400017540000000037113556116552020037 0ustar00biocbuildbiocbuild/* Utilities that rtracklayer made common between win9x and unix */ struct fileInfo *newFileInfo(char *name, off_t size, bool isDir, int statErrno, time_t lastAccess); int cmpFileInfo(const void *va, const void *vb); rtracklayer/src/ucsc/bPlusTree.c0000644000175400017540000004640713556116552017744 0ustar00biocbuildbiocbuild/* Copyright (C) 2013 The Regents of the University of California * See README in this or parent directory for licensing information. */ /* bptFile - B+ Trees. These are a method of indexing data similar to binary trees, but * with many children rather than just two at each node. They work well when stored on disk, * since typically only two or three disk accesses are needed to locate any particular * piece of data. This implementation is *just* for disk based storage. For memory * use the rbTree instead. Currently the implementation is just useful for data warehouse * type applications. That is it implements a function to create a b+ tree from bulk data * (bptFileCreate) and a function to lookup a value given a key (bptFileFind) but not functions * to add or delete individual items. * * The layout of the file on disk is: * header * root node * (other nodes) * In general when the tree is first built the higher level nodes are stored before the * lower level nodes. It is possible if a b+ tree is dynamically updated for this to * no longer be strictly true, but actually currently the b+ tree code here doesn't implement * dynamic updates - it just creates a b+ tree from a sorted list. * * Each node can be one of two types - index or leaf. The index nodes contain pointers * to child nodes. The leaf nodes contain the actual data. * * The layout of the file header is: * 4 bytes - The value bptSig (0x78CA8C91) * 4 bytes - Number of children per block (not byte size of block) * 4 bytes - Number of significant bytes in key * 4 bytes - Number of bytes in value * 8 bytes - Number of items in index * 4 bytes - Always 0 for now * 4 bytes - Always 0 for now * The magic number may be byte-swapped, in which case all numbers in the file * need to be byte-swapped. * * The nodes start with a header: * 1 byte - 1 for leaf nodes, 0 for index nodes. * 1 byte - Always 0 for now. * 2 bytes - The number of children/items in node * This is followed by count items. For the index nodes the items are * key size bytes - always written most significant byte first * 8 bytes - Offset of child node in index file. * For leaf nodes the items are * key size bytes - always written most significant byte first * val sized bytes - the value associated with the key. * Note in general the leaf nodes may not be the same size as the index nodes, though in * the important case where the values are file offsets they will be. */ #include "common.h" #include "sig.h" #include "udc.h" #include "bPlusTree.h" /* This section of code deals with locating a value in a b+ tree. */ struct bptFile *bptFileAttach(char *fileName, struct udcFile *udc) /* Open up index file on previously open file, with header at current file position. */ { /* Open file and allocate structure to hold info from header etc. */ struct bptFile *bpt = needMem(sizeof(*bpt)); bpt->fileName = fileName; bpt->udc = udc; /* Read magic number at head of file and use it to see if we are proper file type, and * see if we are byte-swapped. */ bits32 magic; boolean isSwapped = FALSE; udcMustReadOne(udc, magic); if (magic != bptSig) { magic = byteSwap32(magic); isSwapped = bpt->isSwapped = TRUE; if (magic != bptSig) errAbort("%s is not a bpt b-plus tree index file", fileName); } /* Read rest of defined bits of header, byte swapping as needed. */ bpt->blockSize = udcReadBits32(udc, isSwapped); bpt->keySize = udcReadBits32(udc, isSwapped); bpt->valSize = udcReadBits32(udc, isSwapped); bpt->itemCount = udcReadBits64(udc, isSwapped); /* Skip over reserved bits of header. */ bits32 reserved32; udcMustReadOne(udc, reserved32); udcMustReadOne(udc, reserved32); /* Save position of root block of b+ tree. */ bpt->rootOffset = udcTell(udc); return bpt; } void bptFileDetach(struct bptFile **pBpt) /* Detach and free up cirTree file opened with cirTreeFileAttach. */ { freez(pBpt); } struct bptFile *bptFileOpen(char *fileName) /* Open up index file - reading header and verifying things. */ { return bptFileAttach(cloneString(fileName), udcFileOpen(fileName, udcDefaultDir())); } void bptFileClose(struct bptFile **pBpt) /* Close down and deallocate index file. */ { struct bptFile *bpt = *pBpt; if (bpt != NULL) { udcFileClose(&bpt->udc); freeMem(bpt->fileName); bptFileDetach(pBpt); } } static boolean rFind(struct bptFile *bpt, bits64 blockStart, void *key, void *val) /* Find value corresponding to key. If found copy value to memory pointed to by val and return * true. Otherwise return false. */ { /* Seek to start of block. */ udcSeek(bpt->udc, blockStart); /* Read block header. */ UBYTE isLeaf; UBYTE reserved; bits16 i, childCount; udcMustReadOne(bpt->udc, isLeaf); udcMustReadOne(bpt->udc, reserved); boolean isSwapped = bpt->isSwapped; childCount = udcReadBits16(bpt->udc, isSwapped); UBYTE keyBuf[bpt->keySize]; /* Place to put a key, buffered on stack. */ if (isLeaf) { for (i=0; iudc, keyBuf, bpt->keySize); udcMustRead(bpt->udc, val, bpt->valSize); if (memcmp(key, keyBuf, bpt->keySize) == 0) return TRUE; } return FALSE; } else { /* Read and discard first key. */ udcMustRead(bpt->udc, keyBuf, bpt->keySize); /* Scan info for first file offset. */ bits64 fileOffset = udcReadBits64(bpt->udc, isSwapped); /* Loop through remainder. */ for (i=1; iudc, keyBuf, bpt->keySize); if (memcmp(key, keyBuf, bpt->keySize) < 0) break; fileOffset = udcReadBits64(bpt->udc, isSwapped); } return rFind(bpt, fileOffset, key, val); } } static void rFindMulti(struct bptFile *bpt, bits64 blockStart, void *key, struct slRef **pList) /* Find values corresponding to key and add them to pList. You'll need to * Do a slRefFreeListAndVals() on the list when done. */ { /* Seek to start of block. */ udcSeek(bpt->udc, blockStart); /* Read block header. */ UBYTE isLeaf; UBYTE reserved; bits16 i, childCount; udcMustReadOne(bpt->udc, isLeaf); udcMustReadOne(bpt->udc, reserved); boolean isSwapped = bpt->isSwapped; childCount = udcReadBits16(bpt->udc, isSwapped); int keySize = bpt->keySize; UBYTE keyBuf[keySize]; /* Place to put a key, buffered on stack. */ UBYTE valBuf[bpt->valSize]; /* Place to put a value, buffered on stack. */ if (isLeaf) { for (i=0; iudc, keyBuf, keySize); udcMustRead(bpt->udc, valBuf, bpt->valSize); if (memcmp(key, keyBuf, keySize) == 0) { void *val = cloneMem(valBuf, bpt->valSize); refAdd(pList, val); } } } else { /* Read first key and first file offset. */ udcMustRead(bpt->udc, keyBuf, keySize); bits64 lastFileOffset = udcReadBits64(bpt->udc, isSwapped); bits64 fileOffset = lastFileOffset; int lastCmp = memcmp(key, keyBuf, keySize); /* Loop through remainder. */ for (i=1; iudc, keyBuf, keySize); fileOffset = udcReadBits64(bpt->udc, isSwapped); int cmp = memcmp(key, keyBuf, keySize); if (lastCmp >= 0 && cmp <= 0) { bits64 curPos = udcTell(bpt->udc); rFindMulti(bpt, lastFileOffset, key, pList); udcSeek(bpt->udc, curPos); } if (cmp < 0) return; lastCmp = cmp; lastFileOffset = fileOffset; } /* If made it all the way to end, do last one too. */ rFindMulti(bpt, fileOffset, key, pList); } } static void rTraverse(struct bptFile *bpt, bits64 blockStart, void *context, void (*callback)(void *context, void *key, int keySize, void *val, int valSize) ) /* Recursively go across tree, calling callback at leaves. */ { /* Seek to start of block. */ udcSeek(bpt->udc, blockStart); /* Read block header. */ UBYTE isLeaf; UBYTE reserved; bits16 i, childCount; udcMustReadOne(bpt->udc, isLeaf); udcMustReadOne(bpt->udc, reserved); boolean isSwapped = bpt->isSwapped; childCount = udcReadBits16(bpt->udc, isSwapped); char keyBuf[bpt->keySize], valBuf[bpt->valSize]; if (isLeaf) { for (i=0; iudc, keyBuf, bpt->keySize); udcMustRead(bpt->udc, valBuf, bpt->valSize); callback(context, keyBuf, bpt->keySize, valBuf, bpt->valSize); } } else { bits64 fileOffsets[childCount]; /* Loop through to get file offsets of children. */ for (i=0; iudc, keyBuf, bpt->keySize); fileOffsets[i] = udcReadBits64(bpt->udc, isSwapped); } /* Loop through recursing on child offsets. */ for (i=0; irootOffset; for (;;) { /* Seek to block start */ udcSeek(bpt->udc, offset); /* Read block header, break if we are leaf. */ UBYTE isLeaf; UBYTE reserved; udcMustReadOne(bpt->udc, isLeaf); if (isLeaf) break; udcMustReadOne(bpt->udc, reserved); boolean isSwapped = bpt->isSwapped; udcReadBits16(bpt->udc, isSwapped); /* Read and discard first key. */ char keyBuf[bpt->keySize]; udcMustRead(bpt->udc, keyBuf, bpt->keySize); /* Get file offset of sub-block. */ offset = udcReadBits64(bpt->udc, isSwapped); } return offset; } static bits64 bptDataOffset(struct bptFile *bpt, bits64 itemPos) /* Return position of file of data corresponding to given itemPos. For first piece of * data pass in 0. */ { if (itemPos >= bpt->itemCount) errAbort("Item index %lld greater than item count %lld in %s", itemPos, bpt->itemCount, bpt->fileName); bits64 blockPos = itemPos/bpt->blockSize; bits32 insidePos = itemPos - blockPos*bpt->blockSize; int blockHeaderSize = 4; bits64 itemByteSize = bpt->valSize + bpt->keySize; bits64 blockByteSize = bpt->blockSize * itemByteSize + blockHeaderSize; bits64 blockOffset = blockByteSize*blockPos + bptDataStart(bpt); bits64 itemOffset = blockOffset + blockHeaderSize + itemByteSize * insidePos; return itemOffset; } void bptKeyAtPos(struct bptFile *bpt, bits64 itemPos, void *result) /* Fill in result with the key at given itemPos. For first piece of data itemPos is 0 * Result must be at least bpt->keySize. If result is a string it won't be zero terminated * by this routine. Use bptStringKeyAtPos instead. */ { bits64 offset = bptDataOffset(bpt, itemPos); udcSeek(bpt->udc, offset); udcMustRead(bpt->udc, result, bpt->keySize); } void bptStringKeyAtPos(struct bptFile *bpt, bits64 itemPos, char *result, int maxResultSize) /* Fill in result with the key at given itemPos. The maxResultSize should be 1+bpt->keySize * to accommodate zero termination of string. */ { assert(maxResultSize > bpt->keySize); bptKeyAtPos(bpt, itemPos, result); result[bpt->keySize] = 0; } static boolean bptFileFindMaybeMulti(struct bptFile *bpt, void *key, int keySize, int valSize, boolean multi, void *singleVal, struct slRef **multiVal) /* Do either a single or multiple find depending in multi parameter. Only one of singleVal * or multiVal should be non-NULL, depending on the same parameter. */ { /* Check key size vs. file key size, and act appropriately. If need be copy key to a local * buffer and zero-extend it. */ if (keySize > bpt->keySize) return FALSE; char keyBuf[bpt->keySize]; if (keySize != bpt->keySize) { memcpy(keyBuf, key, keySize); memset(keyBuf+keySize, 0, bpt->keySize - keySize); key = keyBuf; } /* Make sure the valSize matches what's in file. */ if (valSize != bpt->valSize) errAbort("Value size mismatch between bptFileFind (valSize=%d) and %s (valSize=%d)", valSize, bpt->fileName, bpt->valSize); if (multi) { rFindMulti(bpt, bpt->rootOffset, key, multiVal); return *multiVal != NULL; } else return rFind(bpt, bpt->rootOffset, key, singleVal); } boolean bptFileFind(struct bptFile *bpt, void *key, int keySize, void *val, int valSize) /* Find value associated with key. Return TRUE if it's found. * Parameters: * bpt - file handle returned by bptFileOpen * key - pointer to key string, which needs to be bpt->keySize long * val - pointer to where to put retrieved value */ { return bptFileFindMaybeMulti(bpt, key, keySize, valSize, FALSE, val, NULL); } struct slRef *bptFileFindMultiple(struct bptFile *bpt, void *key, int keySize, int valSize) /* Find all values associated with key. Store this in ->val item of returned list. * Do a slRefFreeListAndVals() on list when done. */ { struct slRef *list = NULL; bptFileFindMaybeMulti(bpt, key, keySize, valSize, TRUE, NULL, &list); slReverse(&list); return list; } void bptFileTraverse(struct bptFile *bpt, void *context, void (*callback)(void *context, void *key, int keySize, void *val, int valSize) ) /* Traverse bPlusTree on file, calling supplied callback function at each * leaf item. */ { return rTraverse(bpt, bpt->rootOffset, context, callback); } /* This section of code deals with making balanced b+ trees given a sorted array as input. * The difficult part is mostly just calculating the offsets of various things. As an example * if you had the sorted array: * 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 * and wanted to create a tree of block size 4, the resulting tree would have three levels * as so: * 01 17 * 01 05 09 13 17 21 25 * 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 */ static long xToY(int x, unsigned y) /* Return x to the Y power, with y usually small. */ { long i, val = 1; for (i=0; i maxBlockSize) { itemCount = (itemCount + maxBlockSize - 1) / maxBlockSize; levels += 1; } return levels; } static bits32 writeIndexLevel(bits16 blockSize, void *itemArray, int itemSize, long itemCount, bits32 indexOffset, int level, void (*fetchKey)(const void *va, char *keyBuf), bits32 keySize, bits32 valSize, FILE *f) /* Write out a non-leaf level. */ { char *items = itemArray; /* Calculate number of nodes to write at this level. */ long slotSizePer = xToY(blockSize, level); // Number of items per slot in node long nodeSizePer = slotSizePer * blockSize; // Number of items per node long nodeCount = (itemCount + nodeSizePer - 1)/nodeSizePer; /* Calculate sizes and offsets. */ long bytesInIndexBlock = (bptBlockHeaderSize + blockSize * (keySize+sizeof(bits64))); long bytesInLeafBlock = (bptBlockHeaderSize + blockSize * (keySize+valSize)); bits64 bytesInNextLevelBlock = (level == 1 ? bytesInLeafBlock : bytesInIndexBlock); bits64 levelSize = nodeCount * bytesInIndexBlock; bits64 endLevel = indexOffset + levelSize; bits64 nextChild = endLevel; UBYTE isLeaf = FALSE; UBYTE reserved = 0; long i,j; char keyBuf[keySize+1]; keyBuf[keySize] = 0; for (i=0; i blockSize) countOne = blockSize; bits16 shortCountOne = countOne; /* Write block header. */ writeOne(f, isLeaf); writeOne(f, reserved); writeOne(f, shortCountOne); /* Write out the slots that are used one by one, and do sanity check. */ int slotsUsed = 0; long endIx = i + nodeSizePer; if (endIx > itemCount) endIx = itemCount; for (j=i; j blockSize) countOne = blockSize; else countOne = countLeft; writeOne(f, isLeaf); writeOne(f, reserved); writeOne(f, countOne); /* Write out position in genome and in file for each item. */ for (j=0; j 0; --i) { bits32 endLevelOffset = writeIndexLevel(blockSize, itemArray, itemSize, itemCount, indexOffset, i, fetchKey, keySize, valSize, f); indexOffset = ftell(f); if (endLevelOffset != indexOffset) internalErr(); } /* Write leaf nodes */ writeLeafLevel(blockSize, itemArray, itemSize, itemCount, fetchKey, keySize, fetchVal, valSize, f); } void bptFileCreate( void *itemArray, /* Sorted array of things to index. */ int itemSize, /* Size of each element in array. */ bits64 itemCount, /* Number of elements in array. */ bits32 blockSize, /* B+ tree block size - # of children for each node. */ void (*fetchKey)(const void *va, char *keyBuf), /* Given item, copy key to keyBuf */ bits32 keySize, /* Size of key */ void* (*fetchVal)(const void *va), /* Given item, return pointer to value */ bits32 valSize, /* Size of value */ char *fileName) /* Name of output file. */ /* Create a b+ tree index file from a sorted array. */ { /* Open file and write header. */ FILE *f = mustOpen(fileName, "wb"); bptFileBulkIndexToOpenFile(itemArray, itemSize, itemCount, blockSize, fetchKey, keySize, fetchVal, valSize, f); carefulClose(&f); } rtracklayer/src/ucsc/bPlusTree.h0000644000175400017540000001432213556116552017740 0ustar00biocbuildbiocbuild/* bptFile - B+ Trees. These are a method of indexing data similar to binary trees, but * with many children rather than just two at each node. They work well when stored on disk, * since typically only two or three disk accesses are needed to locate any particular * piece of data. This implementation is *just* for disk based storage. For memory * use the rbTree instead. Currently the implementation is just useful for data warehouse * type applications. That is it implements a function to create a b+ tree from bulk data * (bptFileCreate) and a function to lookup a value given a key (bptFileFind) but not functions * to add or delete individual items. * * * The layout of the file on disk is: * header * root node * (other nodes) * In general when the tree is first built the higher level nodes are stored before the * lower level nodes. It is possible if a b+ tree is dynamically updated for this to * no longer be strictly true, but actually currently the b+ tree code here doesn't implement * dynamic updates - it just creates a b+ tree from a sorted list. * * Each node can be one of two types - index or leaf. The index nodes contain pointers * to child nodes. The leaf nodes contain the actual data. * * The layout of the file header is: * 4 bytes - The value bptSig (0x78CA8C91) * 4 bytes - Number of children per block (not byte size of block) * 4 bytes - Number of significant bytes in key * 4 bytes - Number of bytes in value * 8 bytes - Number of items in index * 4 bytes - Always 0 for now * 4 bytes - Always 0 for now * The magic number may be byte-swapped, in which case all numbers in the file * need to be byte-swapped. * * The nodes start with a header: * 1 byte - 1 for leaf nodes, 0 for index nodes. * 1 byte - Always 0 for now. * 2 bytes - The number of children/items in node * This is followed by count items. For the index nodes the items are * key size bytes - always written most significant byte first * 8 bytes - Offset of child node in index file. * For leaf nodes the items are * key size bytes - always written most significant byte first * val sized bytes - the value associated with the key. * Note in general the leaf nodes may not be the same size as the index nodes, though in * the important case where the values are file offsets they will be. */ #ifndef BPLUSTREE_H #define BPLUSTREE_H struct bptFile /* B+ tree index file handle. */ { struct bptFile *next; /* Next in list of index files if any. */ char *fileName; /* Name of file - for error reporting. */ struct udcFile *udc; /* Open file pointer. */ bits32 blockSize; /* Size of block. */ bits32 keySize; /* Size of keys. */ bits32 valSize; /* Size of values. */ bits64 itemCount; /* Number of items indexed. */ boolean isSwapped; /* If TRUE need to byte swap everything. */ bits64 rootOffset; /* Offset of root block. */ }; struct bptFile *bptFileOpen(char *fileName); /* Open up index file - reading header and verifying things. */ void bptFileClose(struct bptFile **pBpt); /* Close down and deallocate index file. */ struct bptFile *bptFileAttach(char *fileName, struct udcFile *udc); /* Open up index file on previously open file, with header at current file position. */ void bptFileDetach(struct bptFile **pBpt); /* Detach and free up bptFile opened with bptFileAttach. */ boolean bptFileFind(struct bptFile *bpt, void *key, int keySize, void *val, int valSize); /* Find value associated with key. Return TRUE if it's found. * Parameters: * bpt - file handle returned by bptFileOpen * key - pointer to key string * keySize - size of key. Normally just strlen(key) * val - pointer to where to put retrieved value * valSize - size of memory buffer that will hold val. Should match bpt->valSize. */ struct slRef *bptFileFindMultiple(struct bptFile *bpt, void *key, int keySize, int valSize); /* Find all values associated with key. Store this in ->val item of returned list. * Do a slRefFreeListAndVals() on list when done. */ void bptFileTraverse(struct bptFile *bpt, void *context, void (*callback)(void *context, void *key, int keySize, void *val, int valSize) ); /* Traverse bPlusTree on file, calling supplied callback function at each * leaf item. */ void bptKeyAtPos(struct bptFile *bpt, bits64 itemPos, void *result); /* Fill in result with the key at given itemPos. For first piece of data itemPos is 0 * and for last piece is bpt->itemCount - 1. Result must be at least bpt->keySize. * If result is a string it won't be zero terminated * by this routine. Use bptStringKeyAtPos instead. */ void bptStringKeyAtPos(struct bptFile *bpt, bits64 itemPos, char *result, int maxResultSize); /* Fill in result with the key at given itemPos. The maxResultSize should be 1+bpt->keySize * to accommodate zero termination of string. */ void bptFileCreate( void *itemArray, /* Sorted array of things to index. */ int itemSize, /* Size of each element in array. */ bits64 itemCount, /* Number of elements in array. */ bits32 blockSize, /* B+ tree block size - # of children for each node. */ void (*fetchKey)(const void *va, char *keyBuf), /* Given item, copy key to keyBuf */ bits32 keySize, /* Size of key */ void* (*fetchVal)(const void *va), /* Given item, return pointer to value */ bits32 valSize, /* Size of value */ char *fileName); /* Name of output file. */ /* Create a b+ tree index file from a sorted array. */ void bptFileBulkIndexToOpenFile(void *itemArray, int itemSize, bits64 itemCount, bits32 blockSize, void (*fetchKey)(const void *va, char *keyBuf), bits32 keySize, void* (*fetchVal)(const void *va), bits32 valSize, FILE *f); /* Create a b+ tree index from a sorted array, writing output starting at current position * of an already open file. See bptFileCreate for explanation of parameters. */ #define bptFileHeaderSize 32 #define bptBlockHeaderSize 4 #endif /* BPLUSTREE_H */ rtracklayer/src/ucsc/base64.c0000644000175400017540000000567613556116552017126 0ustar00biocbuildbiocbuild/* Copyright (C) 2011 The Regents of the University of California * See README in this or parent directory for licensing information. */ #include "common.h" #include "base64.h" char *base64Encode(char *input, size_t inplen) /* Use base64 to encode a string. Returns one long encoded * string which need to be freeMem'd. Note: big-endian algorithm. * For some applications you may need to break the base64 output * of this function into lines no longer than 76 chars. */ { char b64[] = B64CHARS; int words = (inplen+2)/3; int remains = inplen % 3; char *result = (char *)needMem(4*words+1); size_t i=0, j=0; int word = 0; unsigned char *p = (unsigned char*) input; /* p must be unsigned char*, because without "unsigned", sign extend messes up last group outputted when the value of the chars following last in input happens to be char 0x80 or higher */ for(i=1; i<=words; i++) { word = 0; word |= *p++; word <<= 8; word |= *p++; word <<= 8; word |= *p++; if (i==words && remains>0) { word &= 0x00FFFF00; if (remains==1) word &= 0x00FF0000; } result[j++]=b64[word >> 18 & 0x3F]; result[j++]=b64[word >> 12 & 0x3F]; result[j++]=b64[word >> 6 & 0x3F]; result[j++]=b64[word & 0x3F]; } result[j] = 0; if (remains >0) result[j-1] = '='; if (remains==1) result[j-2] = '='; return result; } boolean base64Validate(char *input) /* Return true if input is valid base64. * Note that the input string is changed by * eraseWhiteSpace(). */ { size_t i = 0, l = 0; char *p = input; boolean validB64 = TRUE; /* remove whitespace which is unnecessary and */ eraseWhiteSpace(input); l = strlen(p); for(i=0;i> 16 & 0xFF; result[j++]=word >> 8 & 0xFF; result[j++]=word & 0xFF; } result[j] = 0; if (returnSize) *returnSize = j; return result; } rtracklayer/src/ucsc/base64.h0000644000175400017540000000171013556116552017114 0ustar00biocbuildbiocbuild/* Base64 encoding and decoding. * by Galt Barber */ #ifndef BASE64_H #define BASE64_H #define B64CHARS "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" char *base64Encode(char *input, size_t inplen); /* Use base64 to encode a string. Returns one long encoded * string which need to be freeMem'd. Note: big-endian algorithm. * For some applications you may need to break the base64 output * of this function into lines no longer than 76 chars. */ boolean base64Validate(char *input); /* Return true if input is valid base64. * Note that the input string is changed by * eraseWhiteSpace(). */ char *base64Decode(char *input, size_t *returnSize); /* Use base64 to decode a string. Return decoded * string which will be freeMem'd. Note: big-endian algorithm. * Call eraseWhiteSpace() and check for invalid input * before passing in input if needed. * Optionally set retun size for use with binary data. */ #endif /* BASE64_H */ rtracklayer/src/ucsc/bbiFile.h0000644000175400017540000004763613556116552017405 0ustar00biocbuildbiocbuild/* bbiFile - Big Binary Indexed file. Stuff that's common between bigWig and bigBed. */ #ifndef BBIFILE_H #define BBIFILE_H #include "cirTree.h" #include "linefile.h" #include "localmem.h" /* bigWig/bigBed file structure: * fixedWidthHeader * magic# 4 bytes * version 2 bytes * zoomLevels 2 bytes * chromosomeTreeOffset 8 bytes * fullDataOffset 8 bytes * fullIndexOffset 8 bytes * fieldCount 2 bytes (for bigWig 0) * definedFieldCount 2 bytes (for bigWig 0) * autoSqlOffset 8 bytes (for bigWig 0) (0 if no autoSql information) * totalSummaryOffset 8 bytes (0 in earlier versions of file lacking totalSummary) * uncompressBufSize 4 bytes (Size of uncompression buffer. 0 if uncompressed.) * extensionOffset 8 bytes (Offset to header extension 0 if no such extension) * zoomHeaders there are zoomLevels number of these * reductionLevel 4 bytes * reserved 4 bytes * dataOffset 8 bytes * indexOffset 8 bytes * autoSql string (zero terminated - only present if autoSqlOffset non-zero) * totalSummary - summary of all data in file - only present if totalSummaryOffset non-zero * basesCovered 8 bytes * minVal 8 bytes float (for bigBed minimum depth of coverage) * maxVal 8 bytes float (for bigBed maximum depth of coverage) * sumData 8 bytes float (for bigBed sum of coverage) * sumSquared 8 bytes float (for bigBed sum of coverage squared) * extendedHeader * extensionSize 2 size of extended header in bytes - currently 64 * extraIndexCount 2 number of extra fields we will be indexing * extraIndexListOffset 8 Offset to list of non-chrom/start/end indexes * reserved 48 All zeroes for now * extraIndexList - one of these for each extraIndex * type 2 Type of index. Always 0 for bPlusTree now * fieldCount 2 Number of fields used in this index. Always 1 for now * indexOffset 8 offset for this index in file * reserved 4 All zeroes for now * fieldList - one of these for each field being used in _this_ index * fieldId 2 index of field within record * reserved 2 All zeroes for now * chromosome b+ tree bPlusTree index * full data * sectionCount 8 bytes (item count for bigBeds) * section data section count sections, of three types (bed data for bigBeds) * full index cirTree index * zoom info one of these for each zoom level * zoom data * zoomCount 4 bytes * zoom data there are zoomCount of these items * chromId 4 bytes * chromStart 4 bytes * chromEnd 4 bytes * validCount 4 bytes * minVal 4 bytes float * maxVal 4 bytes float * sumData 4 bytes float * sumSquares 4 bytes float * zoom index cirTree index * extraIndexes [optional] bPlusTreeIndex for each extra field that is indexed * magic# 4 bytes - same as magic number at start of header */ #ifndef CIRTREE_H #include "cirTree.h" #endif #define bbiCurrentVersion 4 /* Version history (of file format, not utilities - corresponds to version field in header) * 1 - Initial release * 1 - Unfortunately when attempting a transparent change to encoders, made the sectionCount * field inconsistent, sometimes not present, sometimes 32 bits. Since offset positions * in index were still accurate this did not break most applications, but it did show * up in the summary section of the Table Browser. * 2 - Made sectionCount consistently 64 bits. Also fixed missing zoomCount in first level of * zoom in files made by bedToBigBed and bedGraphToBigWig. (The older wigToBigWig was fine.) * Added totalSummary section. * 3 - Adding zlib compression. Only active if uncompressBufSize is non-zero in header. * 4 - Fixed problem in encoder for the max field in zoom levels higher than the first one. * Added an extra sig at end of file. */ struct bbiZoomLevel /* A zoom level in bigWig file. */ { struct bbiZoomLevel *next; /* Next in list. */ bits32 reductionLevel; /* How many bases per item */ bits32 reserved; /* Zero for now. */ bits64 dataOffset; /* Offset of data for this level in file. */ bits64 indexOffset; /* Offset of index for this level in file. */ }; struct bbiZoomLevel *bbiBestZoom(struct bbiZoomLevel *levelList, int desiredReduction); /* Return zoom level that is the closest one that is less than or equal to * desiredReduction. */ struct bbiFile /* An open bbiFile */ { struct bbiFile *next; /* Next in list. */ char *fileName; /* Name of file - for better error reporting. */ struct udcFile *udc; /* Open UDC file handle. */ bits32 typeSig; /* bigBedSig or bigWigSig for now. */ boolean isSwapped; /* If TRUE need to byte swap everything. */ struct bptFile *chromBpt; /* Index of chromosomes. */ bits16 version; /* Version number - initially 1. */ bits16 zoomLevels; /* Number of zoom levels. */ bits64 chromTreeOffset; /* Offset to chromosome index. */ bits64 unzoomedDataOffset; /* Start of unzoomed data. */ bits64 unzoomedIndexOffset; /* Start of unzoomed index. */ bits16 fieldCount; /* Number of columns in bed version. */ bits16 definedFieldCount; /* Number of columns using bed standard definitions. */ bits64 asOffset; /* Offset to embedded null-terminated AutoSQL file. */ bits64 totalSummaryOffset; /* Offset to total summary information if any. (On older files have to calculate) */ bits32 uncompressBufSize; /* Size of uncompression buffer, 0 if uncompressed */ bits64 extensionOffset; /* Start of header extension block or 0 if none. */ struct cirTreeFile *unzoomedCir; /* Unzoomed data index in memory - may be NULL. */ struct bbiZoomLevel *levelList; /* List of zoom levels. */ /* Fields based on extension block. */ bits16 extensionSize; /* Size of extension block */ bits16 extraIndexCount; /* Number of extra indexes (on fields other than chrom,start,end */ bits64 extraIndexListOffset; /* Offset to list of extra indexes */ }; struct bbiFile *bbiFileOpen(char *fileName, bits32 sig, char *typeName); /* Open up big wig or big bed file. */ void bbiFileClose(struct bbiFile **pBwf); /* Close down a big wig/big bed file. */ struct fileOffsetSize *bbiOverlappingBlocks(struct bbiFile *bbi, struct cirTreeFile *ctf, char *chrom, bits32 start, bits32 end, bits32 *retChromId); /* Fetch list of file blocks that contain items overlapping chromosome range. */ struct bbiChromIdSize /* We store an id/size pair in chromBpt bPlusTree */ { bits32 chromId; /* Chromosome ID */ bits32 chromSize; /* Chromosome Size */ }; struct bbiChromInfo /* Pair of a name and a 32-bit integer. Used to assign IDs to chromosomes. */ { struct bbiChromInfo *next; char *name; /* Chromosome name */ bits32 id; /* Chromosome ID - a small number usually */ bits32 size; /* Chromosome size in bases */ }; struct bbiChromInfo *bbiChromList(struct bbiFile *bbi); /* Return all chromosomes in file. Dispose of this with bbiChromInfoFreeList. */ void bbiChromInfoFreeList(struct bbiChromInfo **pList); /* Free a list of bbiChromInfo's */ bits32 bbiChromSize(struct bbiFile *bbi, char *chrom); /* Returns size of given chromosome. */ void bbiChromInfoKey(const void *va, char *keyBuf); /* Get key field out of bbiChromInfo. */ void *bbiChromInfoVal(const void *va); /* Get val field out of bbiChromInfo. */ char *bbiCachedChromLookup(struct bbiFile *bbi, int chromId, int lastChromId, char *chromBuf, int chromBufSize); /* Return chromosome name corresponding to chromId. Because this is a bit expensive, * if you are doing this repeatedly pass in the chromId used in the previous call to * this in lastChromId, which will save it from doing the lookup again on the same * chromosome. Pass in -1 to lastChromId if this is the first time or if you can't be * bothered. The chromBufSize should be at greater or equal to bbi->keySize+1. */ struct bbiChromUsage /* Information on how many items per chromosome etc. Used by multipass bbiFile writers. */ { struct bbiChromUsage *next; char *name; /* chromosome name. */ bits32 itemCount; /* Number of items for this chromosome. */ bits32 id; /* Unique ID for chromosome. */ bits32 size; /* Size of chromosome. */ }; enum bbiSummaryType /* Way to summarize data. */ { bbiSumMean = 0, /* Average value */ bbiSumMax = 1, /* Maximum value */ bbiSumMin = 2, /* Minimum value */ bbiSumCoverage = 3, /* Bases in region containing actual data. */ bbiSumStandardDeviation = 4, /* Standard deviation in window. */ }; enum bbiSummaryType bbiSummaryTypeFromString(char *string); /* Return summary type given a descriptive string. */ char *bbiSummaryTypeToString(enum bbiSummaryType type); /* Convert summary type from enum to string representation. */ struct bbiSummary /* A summary type item. */ { struct bbiSummary *next; bits32 chromId; /* ID of associated chromosome. */ bits32 start,end; /* Range of chromosome covered. */ bits32 validCount; /* Count of (bases) with actual data. */ float minVal; /* Minimum value of items */ float maxVal; /* Maximum value of items */ float sumData; /* sum of values for each base. */ float sumSquares; /* sum of squares for each base. */ bits64 fileOffset; /* Offset of summary in file. */ }; #define bbiSummaryFreeList slFreeList struct bbiSummaryOnDisk /* The part of the summary that ends up on disk - in the same order written to disk. */ { bits32 chromId; /* ID of associated chromosome. */ bits32 start,end; /* Range of chromosome covered. */ bits32 validCount; /* Count of (bases) with actual data. */ float minVal; /* Minimum value of items */ float maxVal; /* Maximum value of items */ float sumData; /* sum of values for each base. */ float sumSquares; /* sum of squares for each base. */ }; struct bbiInterval /* Data on a single interval. */ { struct bbiInterval *next; /* Next in list. */ bits32 start, end; /* Position in chromosome, half open. */ double val; /* Value at that position. */ }; typedef struct bbiInterval *(*BbiFetchIntervals)(struct bbiFile *bbi, char *chrom, bits32 start, bits32 end, struct lm *lm); /* A callback function that returns a bbiInterval list. */ void bbiAttachUnzoomedCir(struct bbiFile *bbi); /* Make sure unzoomed cir is attached. */ struct bbiSummaryElement /* An element of a summary from the user side. */ { bits64 validCount; /* Count of (bases) with actual data. */ double minVal; /* Minimum value of items */ double maxVal; /* Maximum value of items */ double sumData; /* sum of values for each base. */ double sumSquares; /* sum of squares for each base. */ }; boolean bbiSummaryArrayExtended(struct bbiFile *bbi, char *chrom, bits32 start, bits32 end, BbiFetchIntervals fetchIntervals, int summarySize, struct bbiSummaryElement *summary); /* Fill in summary with data from indicated chromosome range in bigWig/bigBed file. * Returns FALSE if no data at that position. */ boolean bbiSummaryArray(struct bbiFile *bbi, char *chrom, bits32 start, bits32 end, BbiFetchIntervals fetchIntervals, enum bbiSummaryType summaryType, int summarySize, double *summaryValues); /* Fill in summaryValues with data from indicated chromosome range in bigWig file. * Be sure to initialize summaryValues to a default value, which will not be touched * for regions without data in file. (Generally you want the default value to either * be 0.0 or nan("") depending on the application.) Returns FALSE if no data * at that position. */ struct bbiSummaryElement bbiTotalSummary(struct bbiFile *bbi); /* Return summary of entire file! */ /****** Write side of things - implemented in bbiWrite.c. Few people need this. ********/ struct bbiBoundsArray /* Minimum info needed for r-tree indexer - where a section lives on disk and the * range it covers. */ { bits64 offset; /* Offset within file. */ struct cirTreeRange range; /* What is covered. */ }; struct cirTreeRange bbiBoundsArrayFetchKey(const void *va, void *context); /* Fetch bbiBoundsArray key for r-tree */ bits64 bbiBoundsArrayFetchOffset(const void *va, void *context); /* Fetch bbiBoundsArray file offset for r-tree */ struct bbiSumOutStream /* Buffer output to file so have a chance to compress. */ { struct bbiSummaryOnDisk *array; int elCount; int allocCount; FILE *f; boolean doCompress; }; struct bbiSumOutStream *bbiSumOutStreamOpen(int allocCount, FILE *f, boolean doCompress); /* Open new bbiSumOutStream. */ void bbiSumOutStreamClose(struct bbiSumOutStream **pStream); /* Free up bbiSumOutStream */ void bbiSumOutStreamWrite(struct bbiSumOutStream *stream, struct bbiSummary *sum); /* Write out next one to stream. */ void bbiOutputOneSummaryFurtherReduce(struct bbiSummary *sum, struct bbiSummary **pTwiceReducedList, int doubleReductionSize, struct bbiBoundsArray **pBoundsPt, struct bbiBoundsArray *boundsEnd, struct lm *lm, struct bbiSumOutStream *stream); /* Write out sum to file, keeping track of minimal info on it in *pBoundsPt, and also adding * it to second level summary. */ struct bbiSummary *bbiSummarySimpleReduce(struct bbiSummary *list, int reduction, struct lm *lm); /* Do a simple reduction - where among other things the reduction level is an integral * multiple of the previous reduction level, and the list is sorted. Allocate result out of lm. */ void bbiWriteDummyHeader(FILE *f); /* Write out all-zero header, just to reserve space for it. */ void bbiWriteDummyZooms(FILE *f); /* Write out zeroes to reserve space for ten zoom levels. */ void bbiSummaryElementWrite(FILE *f, struct bbiSummaryElement *sum); /* Write out summary element to file. */ void bbiWriteChromInfo(struct bbiChromUsage *usageList, int blockSize, FILE *f); /* Write out information on chromosomes to file. */ void bbiWriteFloat(FILE *f, float val); /* Write out floating point val to file. Mostly to convert from double... */ struct hash *bbiChromSizesFromFile(char *fileName); /* Read two column file into hash keyed by chrom. */ bits64 bbiTotalSummarySize(struct bbiSummary *list); /* Return size on disk of all summaries. */ void bbiChromUsageFree(struct bbiChromUsage **pUsage); /* free a single bbiChromUsage structure */ void bbiChromUsageFreeList(struct bbiChromUsage **pList); /* free a list of bbiChromUsage structures */ struct bbNamedFileChunk /* A name associated with an offset into a possibly large file. Used for extra * indexes in bigBed files. */ { char *name; /* Name of chunk. */ bits64 offset; /* Start in file. */ bits64 size; /* Size in file. */ }; struct bbExIndexMaker /* A helper structure to make indexes beyond primary one. Just used for bigBeds */ { bits16 indexCount; /* Number of extra indexes. */ /* Kind of wish next four fields, all of which are arrays indexed * by the same thing, were a single array of a structure instead. */ bits16 *indexFields; /* array of field ids, one for each extra index. */ int *maxFieldSize; /* array of maximum sizes seen for this field. */ struct bbNamedFileChunk **chunkArrayArray; /* where we keep name/start/size triples */ bits64 *fileOffsets; /* array of file offsets where indexes starts. */ int recordCount; /* number of records in file. */ }; struct bbiChromUsage *bbiChromUsageFromBedFile(struct lineFile *lf, struct hash *chromSizesHash, struct bbExIndexMaker *eim, int *retMinDiff, double *retAveSize, bits64 *retBedCount); /* Go through bed file and collect chromosomes and statistics. If eim parameter is non-NULL * collect max field sizes there too. */ #define bbiMaxZoomLevels 10 /* Max number of zoom levels */ #define bbiResIncrement 4 /* Amount to reduce at each zoom level */ int bbiCalcResScalesAndSizes(int aveSize, int resScales[bbiMaxZoomLevels], int resSizes[bbiMaxZoomLevels]); /* Fill in resScales with amount to zoom at each level, and zero out resSizes based * on average span. Returns the number of zoom levels we actually will use. */ typedef struct bbiSummary *bbiWriteReducedOnceReturnReducedTwice( struct bbiChromUsage *usageList, int fieldCount, struct lineFile *lf, bits32 initialReduction, bits32 initialReductionCount, int zoomIncrement, int blockSize, int itemsPerSlot, boolean doCompress, struct lm *lm, FILE *f, bits64 *retDataStart, bits64 *retIndexStart, struct bbiSummaryElement *totalSum); /* Typedef for a function that writes out data reduced by factor of initial reduction, and * also returns an array of bbiSummaries for the next reduction level. */ int bbiWriteZoomLevels( struct lineFile *lf, /* Input file. */ FILE *f, /* Output. */ int blockSize, /* Size of index block */ int itemsPerSlot, /* Number of data points bundled at lowest level. */ bbiWriteReducedOnceReturnReducedTwice writeReducedOnceReturnReducedTwice, /* callback */ int fieldCount, /* Number of fields in bed (4 for bedGraph) */ boolean doCompress, /* Do we compress. Answer really should be yes! */ bits64 dataSize, /* Size of data on disk (after compression if any). */ struct bbiChromUsage *usageList, /* Result from bbiChromUsageFromBedFile */ int resTryCount, int resScales[], int resSizes[], /* How much to zoom at each level */ bits32 zoomAmounts[bbiMaxZoomLevels], /* Fills in amount zoomed at each level. */ bits64 zoomDataOffsets[bbiMaxZoomLevels], /* Fills in where data starts for each zoom level. */ bits64 zoomIndexOffsets[bbiMaxZoomLevels], /* Fills in where index starts for each level. */ struct bbiSummaryElement *totalSum); /* Write out all the zoom levels and return the number of levels written. Writes * actual zoom amount and the offsets of the zoomed data and index in the last three * parameters. Sorry for all the parameters - it was this or duplicate a big chunk of * code between bedToBigBed and bedGraphToBigWig. */ int bbiCountSectionsNeeded(struct bbiChromUsage *usageList, int itemsPerSlot); /* Count up number of sections needed for data. */ void bbiAddToSummary(bits32 chromId, bits32 chromSize, bits32 start, bits32 end, bits32 validCount, double minVal, double maxVal, double sumData, double sumSquares, int reduction, struct bbiSummary **pOutList); /* Add data range to summary - putting it onto top of list if possible, otherwise * expanding list. */ void bbiAddRangeToSummary(bits32 chromId, bits32 chromSize, bits32 start, bits32 end, double val, int reduction, struct bbiSummary **pOutList); /* Add chromosome range to summary - putting it onto top of list if possible, otherwise * expanding list. */ struct bbiSummary *bbiReduceSummaryList(struct bbiSummary *inList, struct bbiChromInfo *chromInfoArray, int reduction); /* Reduce summary list to another summary list. */ bits64 bbiWriteSummaryAndIndex(struct bbiSummary *summaryList, int blockSize, int itemsPerSlot, boolean doCompress, FILE *f); /* Write out summary and index to summary, returning start position of * summary index. */ boolean bbiFileCheckSigs(char *fileName, bits32 sig, char *typeName); /* check file signatures at beginning and end of file */ time_t bbiUpdateTime(struct bbiFile *bbi); /* return bbi->udc->updateTime */ struct bbiSummary *bbiSummariesInRegion(struct bbiZoomLevel *zoom, struct bbiFile *bbi, int chromId, bits32 start, bits32 end); /* Return list of all summaries in region at given zoom level of bbiFile. */ #endif /* BBIFILE_H */ rtracklayer/src/ucsc/bbiRead.c0000644000175400017540000005737213556116552017372 0ustar00biocbuildbiocbuild/* bbiRead - Big Binary Indexed file. Stuff that's common between bigWig and bigBed on the * read side. */ /* Copyright (C) 2014 The Regents of the University of California * See README in this or parent directory for licensing information. */ #include "common.h" #include "linefile.h" #include "hash.h" #include "obscure.h" #include "zlibFace.h" #include "bPlusTree.h" #include "hmmstats.h" #include "cirTree.h" #include "udc.h" #include "bbiFile.h" struct bbiZoomLevel *bbiBestZoom(struct bbiZoomLevel *levelList, int desiredReduction) /* Return zoom level that is the closest one that is less than or equal to * desiredReduction. */ { if (desiredReduction < 0) errAbort("bad value %d for desiredReduction in bbiBestZoom", desiredReduction); if (desiredReduction <= 1) return NULL; int closestDiff = BIGNUM; struct bbiZoomLevel *closestLevel = NULL; struct bbiZoomLevel *level; for (level = levelList; level != NULL; level = level->next) { int diff = desiredReduction - level->reductionLevel; if (diff >= 0 && diff < closestDiff) { closestDiff = diff; closestLevel = level; } } return closestLevel; } boolean bbiFileCheckSigs(char *fileName, bits32 sig, char *typeName) /* check file signatures at beginning and end of file */ { int fd = mustOpenFd(fileName, O_RDONLY); bits32 magic; boolean isSwapped = FALSE; // look for signature at the beginning of the file mustReadFd(fd, &magic, sizeof(magic)); if (magic != sig) { magic = byteSwap32(magic); isSwapped = TRUE; if (magic != sig) return FALSE; } // look for signature at the end of the file mustLseek(fd, -sizeof(magic), SEEK_END); mustReadFd(fd, &magic, sizeof(magic)); mustCloseFd(&fd); if (isSwapped) { magic = byteSwap32(magic); if (magic != sig) return FALSE; } else { if (magic != sig) return FALSE; } return TRUE; } struct bbiFile *bbiFileOpen(char *fileName, bits32 sig, char *typeName) /* Open up big wig or big bed file. */ { /* This code needs to agree with code in two other places currently - bigBedFileCreate, * and bigWigFileCreate. I'm thinking of refactoring to share at least between * bigBedFileCreate and bigWigFileCreate. It'd be great so it could be structured * so that it could send the input in one chromosome at a time, and send in the zoom * stuff only after all the chromosomes are done. This'd potentially reduce the memory * footprint by a factor of 2 or 4. Still, for now it works. -JK */ struct bbiFile *bbi; AllocVar(bbi); bbi->fileName = cloneString(fileName); struct udcFile *udc = bbi->udc = udcFileOpen(fileName, udcDefaultDir()); /* Read magic number at head of file and use it to see if we are proper file type, and * see if we are byte-swapped. */ bits32 magic; boolean isSwapped = FALSE; udcMustRead(udc, &magic, sizeof(magic)); if (magic != sig) { magic = byteSwap32(magic); isSwapped = TRUE; if (magic != sig) errAbort("%s is not a %s file", fileName, typeName); } bbi->typeSig = sig; bbi->isSwapped = isSwapped; /* Read rest of defined bits of header, byte swapping as needed. */ bbi->version = udcReadBits16(udc, isSwapped); bbi->zoomLevels = udcReadBits16(udc, isSwapped); bbi->chromTreeOffset = udcReadBits64(udc, isSwapped); bbi->unzoomedDataOffset = udcReadBits64(udc, isSwapped); bbi->unzoomedIndexOffset = udcReadBits64(udc, isSwapped); bbi->fieldCount = udcReadBits16(udc, isSwapped); bbi->definedFieldCount = udcReadBits16(udc, isSwapped); bbi->asOffset = udcReadBits64(udc, isSwapped); bbi->totalSummaryOffset = udcReadBits64(udc, isSwapped); bbi->uncompressBufSize = udcReadBits32(udc, isSwapped); bbi->extensionOffset = udcReadBits64(udc, isSwapped); /* Read zoom headers. */ int i; struct bbiZoomLevel *level, *levelList = NULL; for (i=0; izoomLevels; ++i) { AllocVar(level); level->reductionLevel = udcReadBits32(udc, isSwapped); level->reserved = udcReadBits32(udc, isSwapped); level->dataOffset = udcReadBits64(udc, isSwapped); level->indexOffset = udcReadBits64(udc, isSwapped); slAddHead(&levelList, level); } slReverse(&levelList); bbi->levelList = levelList; /* Deal with header extension if any. */ if (bbi->extensionOffset != 0) { udcSeek(udc, bbi->extensionOffset); bbi->extensionSize = udcReadBits16(udc, isSwapped); bbi->extraIndexCount = udcReadBits16(udc, isSwapped); bbi->extraIndexListOffset = udcReadBits64(udc, isSwapped); } /* Attach B+ tree of chromosome names and ids. */ udcSeek(udc, bbi->chromTreeOffset); bbi->chromBpt = bptFileAttach(fileName, udc); return bbi; } void bbiFileClose(struct bbiFile **pBwf) /* Close down a big wig/big bed file. */ { struct bbiFile *bwf = *pBwf; if (bwf != NULL) { cirTreeFileDetach(&bwf->unzoomedCir); slFreeList(&bwf->levelList); slFreeList(&bwf->levelList); bptFileDetach(&bwf->chromBpt); udcFileClose(&bwf->udc); freeMem(bwf->fileName); freez(pBwf); } } static void chromIdSizeHandleSwapped(boolean isSwapped, struct bbiChromIdSize *idSize) /* Swap bytes in chromosome Id and Size as needed. */ { if (isSwapped) { idSize->chromId = byteSwap32(idSize->chromId); idSize->chromSize = byteSwap32(idSize->chromSize); } } struct fileOffsetSize *bbiOverlappingBlocks(struct bbiFile *bbi, struct cirTreeFile *ctf, char *chrom, bits32 start, bits32 end, bits32 *retChromId) /* Fetch list of file blocks that contain items overlapping chromosome range. */ { struct bbiChromIdSize idSize; if (!bptFileFind(bbi->chromBpt, chrom, strlen(chrom), &idSize, sizeof(idSize))) return NULL; chromIdSizeHandleSwapped(bbi->isSwapped, &idSize); if (retChromId != NULL) *retChromId = idSize.chromId; return cirTreeFindOverlappingBlocks(ctf, idSize.chromId, start, end); } struct chromNameCallbackContext /* Some stuff that the bPlusTree traverser needs for context. */ { struct bbiChromInfo *list; /* The list we are building. */ boolean isSwapped; /* Need to byte-swap things? */ }; static void chromNameCallback(void *context, void *key, int keySize, void *val, int valSize) /* Callback that captures chromInfo from bPlusTree. */ { struct chromNameCallbackContext *c = context; struct bbiChromInfo *info; struct bbiChromIdSize *idSize = val; assert(valSize == sizeof(*idSize)); chromIdSizeHandleSwapped(c->isSwapped, idSize); AllocVar(info); info->name = cloneStringZ(key, keySize); info->id = idSize->chromId; info->size = idSize->chromSize; slAddHead(&c->list, info); } struct bbiChromInfo *bbiChromList(struct bbiFile *bbi) /* Return list of chromosomes. */ { struct chromNameCallbackContext context; context.list = NULL; context.isSwapped = bbi->isSwapped; bptFileTraverse(bbi->chromBpt, &context, chromNameCallback); slReverse(&context.list); return context.list; } bits32 bbiChromSize(struct bbiFile *bbi, char *chrom) /* Return chromosome size, or 0 if no such chromosome in file. */ { struct bbiChromIdSize idSize; if (!bptFileFind(bbi->chromBpt, chrom, strlen(chrom), &idSize, sizeof(idSize))) return 0; chromIdSizeHandleSwapped(bbi->isSwapped, &idSize); return idSize.chromSize; } void bbiChromInfoFree(struct bbiChromInfo **pInfo) /* Free up one chromInfo */ { struct bbiChromInfo *info = *pInfo; if (info != NULL) { freeMem(info->name); freez(pInfo); } } void bbiChromInfoFreeList(struct bbiChromInfo **pList) /* Free a list of dynamically allocated bbiChromInfo's */ { struct bbiChromInfo *el, *next; for (el = *pList; el != NULL; el = next) { next = el->next; bbiChromInfoFree(&el); } *pList = NULL; } void bbiAttachUnzoomedCir(struct bbiFile *bbi) /* Make sure unzoomed cir is attached. */ { if (bbi->unzoomedCir == NULL) { udcSeek(bbi->udc, bbi->unzoomedIndexOffset); bbi->unzoomedCir = cirTreeFileAttach(bbi->fileName, bbi->udc); } } enum bbiSummaryType bbiSummaryTypeFromString(char *string) /* Return summary type given a descriptive string. */ { if (sameWord(string, "mean") || sameWord(string, "average")) return bbiSumMean; else if (sameWord(string, "max") || sameWord(string, "maximum")) return bbiSumMax; else if (sameWord(string, "min") || sameWord(string, "minimum")) return bbiSumMin; else if (sameWord(string, "coverage") || sameWord(string, "dataCoverage")) return bbiSumCoverage; else if (sameWord(string, "std")) return bbiSumStandardDeviation; else { errAbort("Unknown bbiSummaryType %s", string); return bbiSumMean; /* Keep compiler quiet. */ } } char *bbiSummaryTypeToString(enum bbiSummaryType type) /* Convert summary type from enum to string representation. */ { switch (type) { case bbiSumMean: return "mean"; case bbiSumMax: return "max"; case bbiSumMin: return "min"; case bbiSumCoverage: return "coverage"; case bbiSumStandardDeviation: return "std"; default: errAbort("Unknown bbiSummaryType %d", (int)type); return NULL; } } #ifdef UNUSED static void bbiSummaryOnDiskRead(struct bbiFile *bbi, struct bbiSummaryOnDisk *sum) /* Read in summary from file. */ { struct udcFile *udc = bbi->udc; boolean isSwapped = bbi->isSwapped; sum->chromId = udcReadBits32(udc, isSwapped); sum->start = udcReadBits32(udc, isSwapped); sum->end = udcReadBits32(udc, isSwapped); sum->validCount = udcReadBits32(udc, isSwapped); // looks like a bug to me, these should call udcReadFloat() udcMustReadOne(udc, sum->minVal); udcMustReadOne(udc, sum->maxVal); udcMustReadOne(udc, sum->sumData); udcMustReadOne(udc, sum->sumSquares); } #endif /* UNUSED */ static void bbiSummaryHandleSwapped(struct bbiFile *bbi, struct bbiSummaryOnDisk *in) /* Swap integer fields in summary as needed. */ { if (bbi->isSwapped) { in->chromId = byteSwap32(in->chromId); in->start = byteSwap32(in->start); in->end = byteSwap32(in->end); in->validCount = byteSwap32(in->validCount); in->minVal = byteSwapFloat(in->minVal); in->maxVal = byteSwapFloat(in->maxVal); in->sumData = byteSwapFloat(in->sumData); in->sumSquares = byteSwapFloat(in->sumSquares); } } static struct bbiSummary *bbiSummaryFromOnDisk(struct bbiSummaryOnDisk *in) /* Create a bbiSummary unlinked to anything from input in onDisk format. */ { struct bbiSummary *out; AllocVar(out); out->chromId = in->chromId; out->start = in->start; out->end = in->end; out->validCount = in->validCount; out->minVal = in->minVal; out->maxVal = in->maxVal; out->sumData = in->sumData; out->sumSquares = in->sumSquares; return out; } struct bbiSummary *bbiSummariesInRegion(struct bbiZoomLevel *zoom, struct bbiFile *bbi, int chromId, bits32 start, bits32 end) /* Return list of all summaries in region at given zoom level of bbiFile. */ { struct bbiSummary *sumList = NULL, *sum; struct udcFile *udc = bbi->udc; udcSeek(udc, zoom->indexOffset); struct cirTreeFile *ctf = cirTreeFileAttach(bbi->fileName, bbi->udc); struct fileOffsetSize *blockList = cirTreeFindOverlappingBlocks(ctf, chromId, start, end); struct fileOffsetSize *block, *beforeGap, *afterGap; /* Set up for uncompression optionally. */ char *uncompressBuf = NULL; if (bbi->uncompressBufSize > 0) uncompressBuf = needLargeMem(bbi->uncompressBufSize); /* This loop is a little complicated because we merge the read requests for efficiency, but we * have to then go back through the data one unmerged block at a time. */ for (block = blockList; block != NULL; ) { /* Find contigious blocks and read them into mergedBuf. */ fileOffsetSizeFindGap(block, &beforeGap, &afterGap); bits64 mergedOffset = block->offset; bits64 mergedSize = beforeGap->offset + beforeGap->size - mergedOffset; udcSeek(udc, mergedOffset); char *mergedBuf = needLargeMem(mergedSize); udcMustRead(udc, mergedBuf, mergedSize); char *blockBuf = mergedBuf; /* Loop through individual blocks within merged section. */ for (;block != afterGap; block = block->next) { /* Uncompress if necessary. */ char *blockPt, *blockEnd; if (uncompressBuf) { blockPt = uncompressBuf; int uncSize = zUncompress(blockBuf, block->size, uncompressBuf, bbi->uncompressBufSize); blockEnd = blockPt + uncSize; } else { blockPt = blockBuf; blockEnd = blockPt + block->size; } /* Figure out bounds and number of items in block. */ int blockSize = blockEnd - blockPt; struct bbiSummaryOnDisk *dSum; int itemSize = sizeof(*dSum); assert(blockSize % itemSize == 0); int itemCount = blockSize / itemSize; /* Read in items and convert to memory list format. */ int i; for (i=0; ichromId == chromId) { int s = max(dSum->start, start); int e = min(dSum->end, end); if (s < e) { sum = bbiSummaryFromOnDisk(dSum); slAddHead(&sumList, sum); } } } assert(blockPt == blockEnd); blockBuf += block->size; } freeMem(mergedBuf); } freeMem(uncompressBuf); slFreeList(&blockList); cirTreeFileDetach(&ctf); slReverse(&sumList); return sumList; } static int normalizeCount(struct bbiSummaryElement *el, double countFactor, double minVal, double maxVal, double sumData, double sumSquares) /* normalize statistics to be based on an integer number of valid bases * Integer value is the smallest integer not less than countFactor */ { bits32 validCount = ceil(countFactor); double normFactor = (double)validCount/countFactor; el->validCount = validCount; el->minVal = minVal; el->maxVal = maxVal; el->sumData = sumData * normFactor; el->sumSquares = sumSquares * normFactor; return validCount; } static bits32 bbiSummarySlice(struct bbiFile *bbi, bits32 baseStart, bits32 baseEnd, struct bbiSummary *sumList, struct bbiSummaryElement *el) /* Update retVal with the average value if there is any data in interval. Return number * of valid data bases in interval. */ { bits32 validCount = 0; if (sumList != NULL) { double minVal = sumList->minVal; double maxVal = sumList->maxVal; double sumData = 0, sumSquares = 0; double countFactor = 0.0; struct bbiSummary *sum; for (sum = sumList; sum != NULL && sum->start < baseEnd; sum = sum->next) { int overlap = rangeIntersection(baseStart, baseEnd, sum->start, sum->end); if (overlap > 0) { double overlapFactor = (double)overlap / (sum->end - sum->start); countFactor += sum->validCount * overlapFactor; sumData += sum->sumData * overlapFactor; sumSquares += sum->sumSquares * overlapFactor; if (maxVal < sum->maxVal) maxVal = sum->maxVal; if (minVal > sum->minVal) minVal = sum->minVal; } } if (countFactor > 0) validCount = normalizeCount(el, countFactor, minVal, maxVal, sumData, sumSquares); } return validCount; } static int bbiChromId(struct bbiFile *bbi, char *chrom) /* Return chromosome Id */ { struct bbiChromIdSize idSize; if (!bptFileFind(bbi->chromBpt, chrom, strlen(chrom), &idSize, sizeof(idSize))) return -1; chromIdSizeHandleSwapped(bbi->isSwapped, &idSize); return idSize.chromId; } static boolean bbiSummaryArrayFromZoom(struct bbiZoomLevel *zoom, struct bbiFile *bbi, char *chrom, bits32 start, bits32 end, int summarySize, struct bbiSummaryElement *summary) /* Look up region in index and get data at given zoom level. Summarize this data * in the summary array. */ { boolean result = FALSE; int chromId = bbiChromId(bbi, chrom); if (chromId < 0) return FALSE; struct bbiSummary *sum, *sumList = bbiSummariesInRegion(zoom, bbi, chromId, start, end); if (sumList != NULL) { int i; bits32 baseStart = start, baseEnd; bits32 baseCount = end - start; sum = sumList; for (i=0; iend <= baseStart) sum = sum->next; if (bbiSummarySlice(bbi, baseStart, baseEnd, sum, &summary[i])) result = TRUE; /* Next time round start where we left off. */ baseStart = baseEnd; } slFreeList(&sumList); } return result; } static bits32 bbiIntervalSlice(struct bbiFile *bbi, bits32 baseStart, bits32 baseEnd, struct bbiInterval *intervalList, struct bbiSummaryElement *el) /* Update retVal with the average value if there is any data in interval. Return number * of valid data bases in interval. */ { bits32 validCount = 0; if (intervalList != NULL) { double countFactor = 0; struct bbiInterval *interval; double sumData = 0, sumSquares = 0; double minVal = intervalList->val; double maxVal = intervalList->val; for (interval = intervalList; interval != NULL && interval->start < baseEnd; interval = interval->next) { int overlap = rangeIntersection(baseStart, baseEnd, interval->start, interval->end); if (overlap > 0) { int intervalSize = interval->end - interval->start; double overlapFactor = (double)overlap / intervalSize; double intervalWeight = intervalSize * overlapFactor; countFactor += intervalWeight; sumData += interval->val * intervalWeight; sumSquares += interval->val * interval->val * intervalWeight; if (maxVal < interval->val) maxVal = interval->val; if (minVal > interval->val) minVal = interval->val; } } validCount = normalizeCount(el, countFactor, minVal, maxVal, sumData, sumSquares); } return validCount; } static boolean bbiSummaryArrayFromFull(struct bbiFile *bbi, char *chrom, bits32 start, bits32 end, BbiFetchIntervals fetchIntervals, int summarySize, struct bbiSummaryElement *summary) /* Summarize data, not using zoom. */ { struct bbiInterval *intervalList = NULL, *interval; struct lm *lm = lmInit(0); intervalList = (*fetchIntervals)(bbi, chrom, start, end, lm); boolean result = FALSE; if (intervalList != NULL) { int i; bits32 baseStart = start, baseEnd; bits32 baseCount = end - start; interval = intervalList; for (i=0; iend <= baseStart) interval = interval->next; if (bbiIntervalSlice(bbi, baseStart, end1, interval, &summary[i])) result = TRUE; /* Next time round start where we left off. */ baseStart = baseEnd; } } lmCleanup(&lm); return result; } boolean bbiSummaryArrayExtended(struct bbiFile *bbi, char *chrom, bits32 start, bits32 end, BbiFetchIntervals fetchIntervals, int summarySize, struct bbiSummaryElement *summary) /* Fill in summary with data from indicated chromosome range in bigWig file. * Returns FALSE if no data at that position. */ { boolean result = FALSE; /* Protect from bad input. */ if (start >= end) return result; bzero(summary, summarySize * sizeof(summary[0])); /* Figure out what size of data we want. We actually want to get 2 data points per summary * value if possible to minimize the effect of a data point being split between summary pixels. */ bits32 baseSize = end - start; int fullReduction = (baseSize/summarySize); int zoomLevel = fullReduction/2; if (zoomLevel < 0) zoomLevel = 0; /* Get the closest zoom level less than what we're looking for. */ struct bbiZoomLevel *zoom = bbiBestZoom(bbi->levelList, zoomLevel); if (zoom != NULL) result = bbiSummaryArrayFromZoom(zoom, bbi, chrom, start, end, summarySize, summary); else result = bbiSummaryArrayFromFull(bbi, chrom, start, end, fetchIntervals, summarySize, summary); return result; } boolean bbiSummaryArray(struct bbiFile *bbi, char *chrom, bits32 start, bits32 end, BbiFetchIntervals fetchIntervals, enum bbiSummaryType summaryType, int summarySize, double *summaryValues) /* Fill in summaryValues with data from indicated chromosome range in bigWig file. * Be sure to initialize summaryValues to a default value, which will not be touched * for regions without data in file. (Generally you want the default value to either * be 0.0 or nan("") depending on the application.) Returns FALSE if no data * at that position. */ { struct bbiSummaryElement *elements; AllocArray(elements, summarySize); boolean ret = bbiSummaryArrayExtended(bbi, chrom, start, end, fetchIntervals, summarySize, elements); if (ret) { int i; double covFactor = (double)summarySize/(end - start); for (i=0; ivalidCount > 0) { double val; switch (summaryType) { case bbiSumMean: val = el->sumData/el->validCount; break; case bbiSumMax: val = el->maxVal; break; case bbiSumMin: val = el->minVal; break; case bbiSumCoverage: val = covFactor*el->validCount; break; case bbiSumStandardDeviation: val = calcStdFromSums(el->sumData, el->sumSquares, el->validCount); break; default: internalErr(); val = 0.0; break; } summaryValues[i] = val; } } } freeMem(elements); return ret; } struct bbiSummaryElement bbiTotalSummary(struct bbiFile *bbi) /* Return summary of entire file! */ { struct udcFile *udc = bbi->udc; boolean isSwapped = bbi->isSwapped; struct bbiSummaryElement res; ZeroVar(&res); if (bbi->totalSummaryOffset != 0) { udcSeek(udc, bbi->totalSummaryOffset); res.validCount = udcReadBits64(udc, isSwapped); res.minVal = udcReadDouble(udc, isSwapped); res.maxVal = udcReadDouble(udc, isSwapped); res.sumData = udcReadDouble(udc, isSwapped); res.sumSquares = udcReadDouble(udc, isSwapped); } else if (bbi->version == 1) /* Require version 1 so as not to have to deal with compression. Should not happen * to have NULL totalSummaryOffset for non-empty version 2+ file anyway. */ { /* Find most extreme zoom. */ struct bbiZoomLevel *bestZoom = NULL, *zoom; bits32 bestReduction = 0; for (zoom = bbi->levelList; zoom != NULL; zoom = zoom->next) { if (zoom->reductionLevel > bestReduction) { bestReduction = zoom->reductionLevel; bestZoom = zoom; } } if (bestZoom != NULL) { udcSeek(udc, bestZoom->dataOffset); bits32 zoomSectionCount = udcReadBits32(udc, isSwapped); bits32 i; for (i=0; i res.maxVal) res.maxVal = maxVal; res.sumData += udcReadFloat(udc, isSwapped); res.sumSquares += udcReadFloat(udc, isSwapped); } } } } return res; } time_t bbiUpdateTime(struct bbiFile *bbi) /* return bbi->udc->updateTime */ { struct udcFile *udc = bbi->udc; return udcUpdateTime(udc); } char *bbiCachedChromLookup(struct bbiFile *bbi, int chromId, int lastChromId, char *chromBuf, int chromBufSize) /* Return chromosome name corresponding to chromId. Because this is a bit expensive, * if you are doing this repeatedly pass in the chromId used in the previous call to * this in lastChromId, which will save it from doing the lookup again on the same * chromosome. Pass in -1 to lastChromId if this is the first time or if you can't be * bothered. The chromBufSize should be at greater or equal to bbi->keySize+1. */ { if (chromId != lastChromId) bptStringKeyAtPos(bbi->chromBpt, chromId, chromBuf, chromBufSize); return chromBuf; } rtracklayer/src/ucsc/bbiWrite.c0000644000175400017540000005551213556116552017603 0ustar00biocbuildbiocbuild/* bbiWrite.c - Routines to help write bigWig and bigBed files. See also bbiFile.h */ /* Copyright (C) 2014 The Regents of the University of California * See README in this or parent directory for licensing information. */ #include "common.h" #include "hash.h" #include "linefile.h" #include "sqlNum.h" #include "zlibFace.h" #include "cirTree.h" #include "bPlusTree.h" #include "bbiFile.h" #include "obscure.h" void bbiWriteDummyHeader(FILE *f) /* Write out all-zero header, just to reserve space for it. */ { repeatCharOut(f, 0, 64); } void bbiWriteDummyZooms(FILE *f) /* Write out zeroes to reserve space for ten zoom levels. */ { repeatCharOut(f, 0, bbiMaxZoomLevels * 24); } void bbiSummaryElementWrite(FILE *f, struct bbiSummaryElement *sum) /* Write out summary element to file. */ { writeOne(f, sum->validCount); writeOne(f, sum->minVal); writeOne(f, sum->maxVal); writeOne(f, sum->sumData); writeOne(f, sum->sumSquares); } static int bbiChromInfoCmp(const void *va, const void *vb) /* Sort bbiChromInfo. Unlike most of our sorts this is single rather * than double indirect. */ { const struct bbiChromInfo *a = (const struct bbiChromInfo *)va; const struct bbiChromInfo *b = (const struct bbiChromInfo *)vb; return strcmp(a->name, b->name); } void bbiWriteChromInfo(struct bbiChromUsage *usageList, int blockSize, FILE *f) /* Write out information on chromosomes to file. */ { int chromCount = slCount(usageList); struct bbiChromUsage *usage; /* Allocate and fill in array from list. */ struct bbiChromInfo *chromInfoArray = NULL; int maxChromNameSize = 0; if (chromCount > 0) { AllocArray(chromInfoArray, chromCount); int i; for (i=0, usage = usageList; inext) { char *chromName = usage->name; int len = strlen(chromName); if (len > maxChromNameSize) maxChromNameSize = len; chromInfoArray[i].name = chromName; chromInfoArray[i].id = usage->id; chromInfoArray[i].size = usage->size; } /* Sort so the b-Tree actually works. */ qsort(chromInfoArray, chromCount, sizeof(chromInfoArray[0]), bbiChromInfoCmp); } /* Write chromosome bPlusTree */ int chromBlockSize = min(blockSize, chromCount); bptFileBulkIndexToOpenFile(chromInfoArray, sizeof(chromInfoArray[0]), chromCount, chromBlockSize, bbiChromInfoKey, maxChromNameSize, bbiChromInfoVal, sizeof(chromInfoArray[0].id) + sizeof(chromInfoArray[0].size), f); freeMem(chromInfoArray); } void bbiWriteFloat(FILE *f, float val) /* Write out floating point val to file. Mostly to convert from double... */ { writeOne(f, val); } struct hash *bbiChromSizesFromFile(char *fileName) /* Read two column file into hash keyed by chrom. */ { struct hash *hash = hashNew(0); struct lineFile *lf = lineFileOpen(fileName, TRUE); char *row[2]; while (lineFileRow(lf, row)) hashAddInt(hash, row[0], sqlUnsigned(row[1])); lineFileClose(&lf); return hash; } void bbiChromInfoKey(const void *va, char *keyBuf) /* Get key field out of bbiChromInfo. */ { const struct bbiChromInfo *a = ((struct bbiChromInfo *)va); strcpy(keyBuf, a->name); } void *bbiChromInfoVal(const void *va) /* Get val field out of bbiChromInfo. */ { const struct bbiChromInfo *a = ((struct bbiChromInfo *)va); return (void*)(&a->id); } void bbiChromUsageFree(struct bbiChromUsage **pUsage) /* free a single bbiChromUsage structure */ { struct bbiChromUsage *usage = *pUsage; if (usage != NULL) { freeMem(usage->name); freez(pUsage); } } void bbiChromUsageFreeList(struct bbiChromUsage **pList) /* free a list of bbiChromUsage structures */ { struct bbiChromUsage *el, *next; for (el = *pList; el != NULL; el = next) { next = el->next; bbiChromUsageFree(&el); } *pList = NULL; } int bbExIndexMakerMaxIndexField(struct bbExIndexMaker *eim) /* Return the maximum field we have to index. */ { int maxIx = 0; int i; for (i=0; iindexCount; ++i) { int ix = eim->indexFields[i]; if (ix > maxIx) maxIx = ix; } return maxIx; } void bbExIndexMakerUpdateMaxFieldSize(struct bbExIndexMaker *eim, char **row) /* Fold in information about row into bbExIndexMaker into eim->maxFieldSize */ { int i; for (i=0; iindexCount; ++i) { int rowIx = eim->indexFields[i]; int size = strlen(row[rowIx]); if (size > eim->maxFieldSize[i]) eim->maxFieldSize[i] = size; } } struct bbiChromUsage *bbiChromUsageFromBedFile(struct lineFile *lf, struct hash *chromSizesHash, struct bbExIndexMaker *eim, int *retMinDiff, double *retAveSize, bits64 *retBedCount) /* Go through bed file and collect chromosomes and statistics. If eim parameter is non-NULL * collect max field sizes there too. */ { int maxRowSize = (eim == NULL ? 3 : bbExIndexMakerMaxIndexField(eim) + 1); char *row[maxRowSize]; struct hash *uniqHash = hashNew(0); struct bbiChromUsage *usage = NULL, *usageList = NULL; int lastStart = -1; bits32 id = 0; bits64 totalBases = 0, bedCount = 0; int minDiff = BIGNUM; lineFileRemoveInitialCustomTrackLines(lf); for (;;) { int rowSize = lineFileChopNext(lf, row, maxRowSize); if (rowSize == 0) break; lineFileExpectAtLeast(lf, maxRowSize, rowSize); char *chrom = row[0]; int start = lineFileNeedNum(lf, row, 1); int end = lineFileNeedNum(lf, row, 2); if (eim != NULL) bbExIndexMakerUpdateMaxFieldSize(eim, row); if (start > end) { errAbort("end (%d) before start (%d) line %d of %s", end, start, lf->lineIx, lf->fileName); } ++bedCount; totalBases += (end - start); if (usage == NULL || differentString(usage->name, chrom)) { if (hashLookup(uniqHash, chrom)) { errAbort("%s is not sorted at line %d. Please use \"sort -k1,1 -k2,2n\" or bedSort and try again.", lf->fileName, lf->lineIx); } hashAdd(uniqHash, chrom, NULL); struct hashEl *chromHashEl = hashLookup(chromSizesHash, chrom); if (chromHashEl == NULL) errAbort("%s is not found in chromosome sizes file", chrom); int chromSize = ptToInt(chromHashEl->val); AllocVar(usage); usage->name = cloneString(chrom); usage->id = id++; usage->size = chromSize; slAddHead(&usageList, usage); lastStart = -1; } if (end > usage->size) errAbort("End coordinate %d bigger than %s size of %d line %d of %s", end, usage->name, usage->size, lf->lineIx, lf->fileName); usage->itemCount += 1; if (lastStart >= 0) { int diff = start - lastStart; if (diff < minDiff) { if (diff < 0) errAbort("%s is not sorted at line %d. Please use \"sort -k1,1 -k2,2n\" or bedSort and try again.", lf->fileName, lf->lineIx); minDiff = diff; } } lastStart = start; } slReverse(&usageList); double aveSize = 0; if (bedCount > 0) aveSize = (double)totalBases/bedCount; *retMinDiff = minDiff; *retAveSize = aveSize; *retBedCount = bedCount; freeHash(&uniqHash); return usageList; } int bbiCalcResScalesAndSizes(int aveSize, int resScales[bbiMaxZoomLevels], int resSizes[bbiMaxZoomLevels]) /* Fill in resScales with amount to zoom at each level, and zero out resSizes based * on average span. Returns the number of zoom levels we actually will use. */ { int resTryCount = bbiMaxZoomLevels, resTry; int resIncrement = bbiResIncrement; int minZoom = 10; int res = aveSize; if (res < minZoom) res = minZoom; for (resTry = 0; resTry < resTryCount; ++resTry) { resSizes[resTry] = 0; resScales[resTry] = res; // if aveSize is large, then the initial value of res is large, and we // and we cannot do all 10 levels without overflowing res* integers and other related variables. if (res > 1000000000) { resTryCount = resTry + 1; verbose(2, "resTryCount reduced from 10 to %d\n", resTryCount); break; } res *= resIncrement; } return resTryCount; } int bbiWriteZoomLevels( struct lineFile *lf, /* Input file. */ FILE *f, /* Output. */ int blockSize, /* Size of index block */ int itemsPerSlot, /* Number of data points bundled at lowest level. */ bbiWriteReducedOnceReturnReducedTwice writeReducedOnceReturnReducedTwice, /* callback */ int fieldCount, /* Number of fields in bed (4 for bedGraph) */ boolean doCompress, /* Do we compress. Answer really should be yes! */ bits64 dataSize, /* Size of data on disk (after compression if any). */ struct bbiChromUsage *usageList, /* Result from bbiChromUsageFromBedFile */ int resTryCount, int resScales[], int resSizes[], /* How much to zoom at each level */ bits32 zoomAmounts[bbiMaxZoomLevels], /* Fills in amount zoomed at each level. */ bits64 zoomDataOffsets[bbiMaxZoomLevels], /* Fills in where data starts for each zoom level. */ bits64 zoomIndexOffsets[bbiMaxZoomLevels], /* Fills in where index starts for each level. */ struct bbiSummaryElement *totalSum) /* Write out all the zoom levels and return the number of levels written. Writes * actual zoom amount and the offsets of the zoomed data and index in the last three * parameters. Sorry for all the parameters - it was this or duplicate a big chunk of * code between bedToBigBed and bedGraphToBigWig. */ { /* Write out first zoomed section while storing in memory next zoom level. */ assert(resTryCount > 0); int maxReducedSize = dataSize/2; int initialReduction = 0, initialReducedCount = 0; /* Figure out initialReduction for zoom - one that is maxReducedSize or less. */ int resTry; for (resTry = 0; resTry < resTryCount; ++resTry) { bits64 reducedSize = resSizes[resTry] * sizeof(struct bbiSummaryOnDisk); if (doCompress) reducedSize /= 2; // Estimate! if (reducedSize <= maxReducedSize) { initialReduction = resScales[resTry]; initialReducedCount = resSizes[resTry]; break; } } verbose(2, "initialReduction %d, initialReducedCount = %d\n", initialReduction, initialReducedCount); /* Force there to always be at least one zoom. It may waste a little space on small * files, but it makes files more uniform, and avoids special case code for calculating * overall file summary. */ if (initialReduction == 0) { initialReduction = resScales[0]; initialReducedCount = resSizes[0]; } /* Call routine to make the initial zoom level and also a bit of work towards further levels. */ struct lm *lm = lmInit(0); int zoomIncrement = bbiResIncrement; lineFileRewind(lf); struct bbiSummary *rezoomedList = writeReducedOnceReturnReducedTwice(usageList, fieldCount, lf, initialReduction, initialReducedCount, zoomIncrement, blockSize, itemsPerSlot, doCompress, lm, f, &zoomDataOffsets[0], &zoomIndexOffsets[0], totalSum); verboseTime(2, "writeReducedOnceReturnReducedTwice"); zoomAmounts[0] = initialReduction; int zoomLevels = 1; /* Loop around to do any additional levels of zoom. */ int zoomCount = initialReducedCount; int reduction = initialReduction * zoomIncrement; while (zoomLevels < bbiMaxZoomLevels) { int rezoomCount = slCount(rezoomedList); if (rezoomCount >= zoomCount) break; zoomCount = rezoomCount; zoomDataOffsets[zoomLevels] = ftell(f); zoomIndexOffsets[zoomLevels] = bbiWriteSummaryAndIndex(rezoomedList, blockSize, itemsPerSlot, doCompress, f); zoomAmounts[zoomLevels] = reduction; ++zoomLevels; reduction *= zoomIncrement; rezoomedList = bbiSummarySimpleReduce(rezoomedList, reduction, lm); } lmCleanup(&lm); verboseTime(2, "further reductions"); return zoomLevels; } int bbiCountSectionsNeeded(struct bbiChromUsage *usageList, int itemsPerSlot) /* Count up number of sections needed for data. */ { struct bbiChromUsage *usage; int count = 0; for (usage = usageList; usage != NULL; usage = usage->next) { int countOne = (usage->itemCount + itemsPerSlot - 1)/itemsPerSlot; count += countOne; verbose(2, "%s %d, %d blocks of %d\n", usage->name, usage->itemCount, countOne, itemsPerSlot); } return count; } void bbiAddToSummary(bits32 chromId, bits32 chromSize, bits32 start, bits32 end, bits32 validCount, double minVal, double maxVal, double sumData, double sumSquares, int reduction, struct bbiSummary **pOutList) /* Add data range to summary - putting it onto top of list if possible, otherwise * expanding list. */ { struct bbiSummary *sum = *pOutList; if (end > chromSize) // Avoid pathological clipping situation on bad input end = chromSize; while (start < end) { /* See if need to allocate a new summary. */ if (sum == NULL || sum->chromId != chromId || sum->end <= start) { struct bbiSummary *newSum; AllocVar(newSum); newSum->chromId = chromId; if (sum == NULL || sum->chromId != chromId || sum->end + reduction <= start) newSum->start = start; else newSum->start = sum->end; newSum->end = newSum->start + reduction; if (newSum->end > chromSize) newSum->end = chromSize; newSum->minVal = minVal; newSum->maxVal = maxVal; sum = newSum; slAddHead(pOutList, sum); } /* Figure out amount of overlap between current summary and item */ int overlap = rangeIntersection(start, end, sum->start, sum->end); if (overlap <= 0) { warn("%u %u doesn't intersect %u %u, chromId %u chromSize %u", start, end, sum->start, sum->end, chromId, chromSize); internalErr(); } int itemSize = end - start; double overlapFactor = (double)overlap/itemSize; /* Fold overlapping bits into output. */ sum->validCount += overlapFactor * validCount; if (sum->minVal > minVal) sum->minVal = minVal; if (sum->maxVal < maxVal) sum->maxVal = maxVal; sum->sumData += overlapFactor * sumData; sum->sumSquares += overlapFactor * sumSquares; /* Advance over overlapping bits. */ start += overlap; } } void bbiAddRangeToSummary(bits32 chromId, bits32 chromSize, bits32 start, bits32 end, double val, int reduction, struct bbiSummary **pOutList) /* Add chromosome range to summary - putting it onto top of list if possible, otherwise * expanding list. */ { int size = end-start; double sum = size*val; double sumSquares = sum*val; bbiAddToSummary(chromId, chromSize, start, end, size, val, val, sum, sumSquares, reduction, pOutList); } struct bbiSummary *bbiReduceSummaryList(struct bbiSummary *inList, struct bbiChromInfo *chromInfoArray, int reduction) /* Reduce summary list to another summary list. */ { struct bbiSummary *outList = NULL; struct bbiSummary *sum; for (sum = inList; sum != NULL; sum = sum->next) bbiAddToSummary(sum->chromId, chromInfoArray[sum->chromId].size, sum->start, sum->end, sum->validCount, sum->minVal, sum->maxVal, sum->sumData, sum->sumSquares, reduction, &outList); slReverse(&outList); return outList; } bits64 bbiTotalSummarySize(struct bbiSummary *list) /* Return size on disk of all summaries. */ { struct bbiSummary *el; bits64 total = 0; for (el = list; el != NULL; el = el->next) total += sizeof(struct bbiSummaryOnDisk); return total; } static bits64 bbiSummaryFetchOffset(const void *va, void *context) /* Fetch bbiSummary file offset for r-tree */ { const struct bbiSummary *a = *((struct bbiSummary **)va); return a->fileOffset; } static struct cirTreeRange bbiSummaryFetchKey(const void *va, void *context) /* Fetch bbiSummary key for r-tree */ { struct cirTreeRange res; const struct bbiSummary *a = *((struct bbiSummary **)va); res.chromIx = a->chromId; res.start = a->start; res.end = a->end; return res; } static bits64 bbiWriteSummaryAndIndexComp(struct bbiSummary *summaryList, int blockSize, int itemsPerSlot, FILE *f) /* Write out summary and index to summary uncompressed, returning start position of * summary index. */ { bits32 i, count = slCount(summaryList); struct bbiSummary **summaryArray; AllocArray(summaryArray, count); writeOne(f, count); struct bbiSummary *summary = summaryList; /* Figure out max size of uncompressed and compressed blocks. */ bits32 itemSize = sizeof(summary->chromId) + sizeof(summary->start) + sizeof(summary->end) + sizeof(summary->validCount) + 4*sizeof(float); int uncBufSize = itemSize * itemsPerSlot; char uncBuf[uncBufSize]; int compBufSize = zCompBufSize(uncBufSize); char compBuf[compBufSize]; /* Loop through compressing and writing one slot at a time. */ bits32 itemsLeft = count; int sumIx = 0; while (itemsLeft > 0) { bits32 itemsInSlot = itemsLeft; if (itemsInSlot > itemsPerSlot) itemsInSlot = itemsPerSlot; char *writePt = uncBuf; bits64 filePos = ftell(f); for (i=0; ichromId); memWriteOne(&writePt, summary->start); memWriteOne(&writePt, summary->end); memWriteOne(&writePt, summary->validCount); memWriteFloat(&writePt, summary->minVal); memWriteFloat(&writePt, summary->maxVal); memWriteFloat(&writePt, summary->sumData); memWriteFloat(&writePt, summary->sumSquares); summary->fileOffset = filePos; summary = summary->next; if (summary == NULL) break; } bits32 uncSize = writePt - uncBuf; int compSize = zCompress(uncBuf, uncSize, compBuf, compBufSize); mustWrite(f, compBuf, compSize); itemsLeft -= itemsInSlot; } bits64 indexOffset = ftell(f); cirTreeFileBulkIndexToOpenFile(summaryArray, sizeof(summaryArray[0]), count, blockSize, itemsPerSlot, NULL, bbiSummaryFetchKey, bbiSummaryFetchOffset, indexOffset, f); freez(&summaryArray); return indexOffset; } static bits64 bbiWriteSummaryAndIndexUnc(struct bbiSummary *summaryList, int blockSize, int itemsPerSlot, FILE *f) /* Write out summary and index to summary compressed, returning start position of * summary index. */ { bits32 i, count = slCount(summaryList); struct bbiSummary **summaryArray; AllocArray(summaryArray, count); writeOne(f, count); struct bbiSummary *summary; for (summary = summaryList, i=0; summary != NULL; summary = summary->next, ++i) { summaryArray[i] = summary; summary->fileOffset = ftell(f); writeOne(f, summary->chromId); writeOne(f, summary->start); writeOne(f, summary->end); writeOne(f, summary->validCount); bbiWriteFloat(f, summary->minVal); bbiWriteFloat(f, summary->maxVal); bbiWriteFloat(f, summary->sumData); bbiWriteFloat(f, summary->sumSquares); } bits64 indexOffset = ftell(f); cirTreeFileBulkIndexToOpenFile(summaryArray, sizeof(summaryArray[0]), count, blockSize, itemsPerSlot, NULL, bbiSummaryFetchKey, bbiSummaryFetchOffset, indexOffset, f); freez(&summaryArray); return indexOffset; } bits64 bbiWriteSummaryAndIndex(struct bbiSummary *summaryList, int blockSize, int itemsPerSlot, boolean doCompress, FILE *f) /* Write out summary and index to summary, returning start position of * summary index. */ { if (doCompress) return bbiWriteSummaryAndIndexComp(summaryList, blockSize, itemsPerSlot, f); else return bbiWriteSummaryAndIndexUnc(summaryList, blockSize, itemsPerSlot, f); } struct cirTreeRange bbiBoundsArrayFetchKey(const void *va, void *context) /* Fetch bbiBoundsArray key for r-tree */ { const struct bbiBoundsArray *a = ((struct bbiBoundsArray *)va); return a->range; } bits64 bbiBoundsArrayFetchOffset(const void *va, void *context) /* Fetch bbiBoundsArray file offset for r-tree */ { const struct bbiBoundsArray *a = ((struct bbiBoundsArray *)va); return a->offset; } struct bbiSumOutStream *bbiSumOutStreamOpen(int allocCount, FILE *f, boolean doCompress) /* Allocate new bbiSumOutStream. */ { struct bbiSumOutStream *stream; AllocVar(stream); AllocArray(stream->array, allocCount); stream->allocCount = allocCount; stream->f = f; stream->doCompress = doCompress; return stream; } void bbiSumOutStreamFlush(struct bbiSumOutStream *stream) /* Flush out any pending input. */ { if (stream->elCount != 0) { int uncSize = stream->elCount * sizeof(stream->array[0]); if (stream->doCompress) { int compBufSize = zCompBufSize(uncSize); char compBuf[compBufSize]; int compSize = zCompress(stream->array, uncSize, compBuf, compBufSize); mustWrite(stream->f, compBuf, compSize); } else { mustWrite(stream->f, stream->array, uncSize); } stream->elCount = 0; } } void bbiSumOutStreamClose(struct bbiSumOutStream **pStream) /* Free up bbiSumOutStream */ { struct bbiSumOutStream *stream = *pStream; if (stream != NULL) { bbiSumOutStreamFlush(stream); freeMem(stream->array); freez(pStream); } } void bbiSumOutStreamWrite(struct bbiSumOutStream *stream, struct bbiSummary *sum) /* Write out next one to stream. */ { int elCount = stream->elCount; struct bbiSummaryOnDisk *a = &stream->array[elCount]; a->chromId = sum->chromId; a->start = sum->start; a->end = sum->end; a->validCount = sum->validCount; a->minVal = sum->minVal; a->maxVal = sum->maxVal; a->sumData = sum->sumData; a->sumSquares = sum->sumSquares; elCount += 1; stream->elCount = elCount; if (elCount >= stream->allocCount) bbiSumOutStreamFlush(stream); } void bbiOutputOneSummaryFurtherReduce(struct bbiSummary *sum, struct bbiSummary **pTwiceReducedList, int doubleReductionSize, struct bbiBoundsArray **pBoundsPt, struct bbiBoundsArray *boundsEnd, struct lm *lm, struct bbiSumOutStream *stream) /* Write out sum to file, keeping track of minimal info on it in *pBoundsPt, and also adding * it to second level summary. */ { /* Get place to store file offset etc and make sure we have not gone off end. */ struct bbiBoundsArray *bounds = *pBoundsPt; assert(bounds < boundsEnd); *pBoundsPt += 1; /* Fill in bounds info. */ bounds->offset = ftell(stream->f); bounds->range.chromIx = sum->chromId; bounds->range.start = sum->start; bounds->range.end = sum->end; /* Write out summary info. */ bbiSumOutStreamWrite(stream, sum); /* Fold summary info into pTwiceReducedList. */ struct bbiSummary *twiceReduced = *pTwiceReducedList; if (twiceReduced == NULL || twiceReduced->chromId != sum->chromId || twiceReduced->start + doubleReductionSize < sum->end) { lmAllocVar(lm, twiceReduced); *twiceReduced = *sum; slAddHead(pTwiceReducedList, twiceReduced); } else { twiceReduced->end = sum->end; twiceReduced->validCount += sum->validCount; if (sum->minVal < twiceReduced->minVal) twiceReduced->minVal = sum->minVal; if (sum->maxVal > twiceReduced->maxVal) twiceReduced->maxVal = sum->maxVal; twiceReduced->sumData += sum->sumData; twiceReduced->sumSquares += sum->sumSquares; } } struct bbiSummary *bbiSummarySimpleReduce(struct bbiSummary *list, int reduction, struct lm *lm) /* Do a simple reduction - where among other things the reduction level is an integral * multiple of the previous reduction level, and the list is sorted. Allocate result out of lm. */ { struct bbiSummary *newList = NULL, *sum, *newSum = NULL; for (sum = list; sum != NULL; sum = sum->next) { if (newSum == NULL || newSum->chromId != sum->chromId || sum->end > newSum->start + reduction) { lmAllocVar(lm, newSum); *newSum = *sum; slAddHead(&newList, newSum); } else { assert(newSum->end < sum->end); // check sorted input assumption newSum->end = sum->end; newSum->validCount += sum->validCount; if (newSum->minVal > sum->minVal) newSum->minVal = sum->minVal; if (newSum->maxVal < sum->maxVal) newSum->maxVal = sum->maxVal; newSum->sumData += sum->sumData; newSum->sumSquares += sum->sumSquares; } } slReverse(&newList); return newList; } rtracklayer/src/ucsc/bigBed.h0000644000175400017540000001454113556116552017212 0ustar00biocbuildbiocbuild/* bigBed - interface to binary file with bed-style values (that is a bunch of * possibly overlapping regions. * * This shares a lot with the bigWig module. * * Most of the functions here are concerned with reading bigBed files. There's * two common things you want to do with a bigBed, either stream through everything in it, * or just read the parts that overlap a interval within the genome. The files * are optimized for interval queries, but streaming through them is not difficult either. * * To query an interval: * struct bbiFile *bbi = bigBedFileOpen(fileName); * struct lm *lm = lmInit(0); // Memory pool to hold returned list * struct bigBedInterval *list = bigBedIntervalQuery(bbi, chrom, start, end, 0, lm); * struct bigBedInterval *el; * for (el = list; el != NULL; el = el->next) * // do something involving chrom, el->start, el->end * lmCleanup(&lm); // typically do this after each query * bigBedFileClose(&bbi); // typically only do this when finished all queries * * To stream through whole file * struct bbiFile *bbi = bigBedFileOpen(fileName); * struct bbiChromInfo *chrom, *chromList = bbiChromList(bbi); * for (chrom = chromList; chrom != NULL; chrom = chrom->next) * { * struct lm *lm = lmInit(0); * struct bigBedInterval *list = bigBedIntervalQuery(bbi,chrom->name,0,chrom->size,0,lm); * struct bigBedInterval *el; * for (el = list; el != NULL; el = el->next) * // do something involving chrom, el->start, el->end * lmCleanup(&lm); * } * bigBedFileClose(&bbi); * * The processes for streaming through or doing interval queries on a bigWig file are very * similar. */ #ifndef BIGBED_H #define BIGBED_H #ifndef BBIFILE #include "bbiFile.h" #endif struct bigBedInterval /* A partially parsed out bed record plus some extra fields. Use this directly * or convert it to an array of characters with bigBedIntervalToRow. */ { struct bigBedInterval *next; /* Next in list. */ bits32 start, end; /* Range inside chromosome - half open zero based. */ char *rest; /* Rest of line. May be NULL*/ bits32 chromId; /* ID of chromosome. */ }; /*** Routines to open & close bigBed files, and to do chromosome range queries on them. ***/ struct bbiFile *bigBedFileOpen(char *fileName); /* Open up big bed file. Free this up with bbiFileClose. */ #define bigBedFileClose(a) bbiFileClose(a) struct bigBedInterval *bigBedIntervalQuery(struct bbiFile *bbi, char *chrom, bits32 start, bits32 end, int maxItems, struct lm *lm); /* Get data for interval. Return list allocated out of lm. Set maxItems to maximum * number of items to return, or to 0 for all items. */ int bigBedIntervalToRow(struct bigBedInterval *interval, char *chrom, char *startBuf, char *endBuf, char **row, int rowSize); /* Convert bigBedInterval into an array of chars equivalent to what you'd get by * parsing the bed file. The startBuf and endBuf are used to hold the ascii representation of * start and end. Note that the interval->rest string will have zeroes inserted as a side effect. * Returns number of fields in row. */ boolean bigBedSummaryArray(struct bbiFile *bbi, char *chrom, bits32 start, bits32 end, enum bbiSummaryType summaryType, int summarySize, double *summaryValues); /* Fill in summaryValues with data from indicated chromosome range in bigBed file. * Be sure to initialize summaryValues to a default value, which will not be touched * for regions without data in file. (Generally you want the default value to either * be 0.0 or nan("") depending on the application.) Returns FALSE if no data * at that position. */ boolean bigBedSummaryArrayExtended(struct bbiFile *bbi, char *chrom, bits32 start, bits32 end, int summarySize, struct bbiSummaryElement *summary); /* Get extended summary information for summarySize evenely spaced elements into * the summary array. */ /*** Some routines for accessing bigBed items via name. ***/ struct bigBedInterval *bigBedNameQuery(struct bbiFile *bbi, struct bptFile *index, int fieldIx, char *name, struct lm *lm); /* Return list of intervals matching file. These intervals will be allocated out of lm. */ struct bigBedInterval *bigBedMultiNameQuery(struct bbiFile *bbi, struct bptFile *index, int fieldIx, char **names, int nameCount, struct lm *lm); /* Fetch all records matching any of the names. Using given index on given field. * Return list is allocated out of lm. */ int bigBedIntervalToRowLookupChrom(struct bigBedInterval *interval, struct bigBedInterval *prevInterval, struct bbiFile *bbi, char *chromBuf, int chromBufSize, char *startBuf, char *endBuf, char **row, int rowSize); /* Convert bigBedInterval to array of chars equivalend to what you'd get by parsing the * bed file. If you already know what chromosome the interval is on use the simpler * bigBedIntervalToRow. This one will look up the chromosome based on the chromId field * of the interval, which is relatively time consuming. To avoid doing this unnecessarily * pass in a non-NULL prevInterval, and if the chromId is the same on prevInterval as this, * it will avoid the lookup. The chromBufSize should be at greater or equal to * bbi->chromBpt->keySize+1. The startBuf and endBuf are used to hold the ascii representation of * start and end, and should be 16 bytes. Note that the interval->rest string will have zeroes * inserted as a side effect. Returns number of fields in row. */ void bigBedIntervalListToBedFile(struct bbiFile *bbi, struct bigBedInterval *intervalList, FILE *f); /* Write out big bed interval list to bed file, looking up chromosome. */ /** Routines to access other data from a bigBed file. */ bits64 bigBedItemCount(struct bbiFile *bbi); /* Return total items in file. */ char *bigBedAutoSqlText(struct bbiFile *bbi); /* Get autoSql text if any associated with file. Do a freeMem of this when done. */ boolean bigBedFileCheckSigs(char *fileName); /* check file signatures at beginning and end of file */ struct bptFile *bigBedOpenExtraIndex(struct bbiFile *bbi, char *fieldName, int *retFieldIx); /* Return index associated with fieldName. Aborts if no such index. Optionally return * index in a row of this field. */ struct slName *bigBedListExtraIndexes(struct bbiFile *bbi); /* Return list of names of extra indexes beyond primary chrom:start-end one" */ #endif /* BIGBED_H */ rtracklayer/src/ucsc/bigWig.h0000644000175400017540000001277013556116552017250 0ustar00biocbuildbiocbuild/* bigWig - interface to binary file with wiggle-style values (that is a bunch of * small non-overlapping regions each associated with a floating point value. * * There are several ways to use this module. To create a new bigWig file use the * bigWigCreate function, which takes as input an ascii file in fixedStep, variableStep * or bedGraph format. * * To get a section of of a bigWig for display on a browser, use the bigWigSummaryArray * function, which will fill in an array of doubles with on value for each pixel that * you want to display. * * To read all the data out of a bigWig get the chromosome info with bbiChromList * and then fetch all of it for each chromosome using bigWigIntervalQuery. * * See also the module bbiFile that has a description of they structure of * a bigWig file, and lower level routines used to implement this interface. */ #ifndef BIGWIG_H #define BIGWIG_H #ifndef BBIFILE #include "bbiFile.h" #endif #ifndef BITS_H #include "bits.h" #endif void bigWigFileCreateEx( char *inName, /* Input file in ascii wiggle format. */ char *chromSizes, /* Two column tab-separated file: . */ int blockSize, /* Number of items to bundle in r-tree. 1024 is good. */ int itemsPerSlot, /* Number of items in lowest level of tree. 512 is good. */ boolean clipDontDie, /* If TRUE then clip items off end of chrom rather than dying. */ boolean compress, /* If TRUE then compress data. */ boolean keepAllChromosomes, /* If TRUE then store all chromosomes in chromosomal b-tree. */ boolean fixedSummaries, /* If TRUE then impose fixed summary levels. */ char *outName); /* Convert ascii format wig file (in fixedStep, variableStep or bedGraph format) * to binary big wig format. */ void bigWigFileCreate( char *inName, /* Input file in ascii wiggle format. */ char *chromSizes, /* Two column tab-separated file: . */ int blockSize, /* Number of items to bundle in r-tree. 1024 is good. */ int itemsPerSlot, /* Number of items in lowest level of tree. 512 is good. */ boolean clipDontDie, /* If TRUE then clip items off end of chrom rather than dying. */ boolean compress, /* If TRUE then compress data. */ char *outName); /* Convert ascii format wig file (in fixedStep, variableStep or bedGraph format) * to binary big wig format. */ struct bbiFile *bigWigFileOpen(char *fileName); /* Open up big wig file. Free this up with bbiFileClose */ #define bigWigFileClose(a) bbiFileClose(a) struct bbiInterval *bigWigIntervalQuery(struct bbiFile *bwf, char *chrom, bits32 start, bits32 end, struct lm *lm); /* Get data for interval. Return list allocated out of lm. */ int bigWigIntervalDump(struct bbiFile *bwf, char *chrom, bits32 start, bits32 end, int maxCount, FILE *out); /* Print out info on bigWig parts that intersect chrom:start-end. Set maxCount to 0 if you * don't care how many are printed. Returns number printed. */ boolean bigWigSummaryArray(struct bbiFile *bwf, char *chrom, bits32 start, bits32 end, enum bbiSummaryType summaryType, int summarySize, double *summaryValues); /* Fill in summaryValues with data from indicated chromosome range in bigWig file. * Be sure to initialize summaryValues to a default value, which will not be touched * for regions without data in file. (Generally you want the default value to either * be 0.0 or nan(0) depending on the application.) Returns FALSE if no data * at that position. */ boolean bigWigSummaryArrayExtended(struct bbiFile *bwf, char *chrom, bits32 start, bits32 end, int summarySize, struct bbiSummaryElement *summary); /* Get extended summary information for summarySize evenely spaced elements into * the summary array. */ double bigWigSingleSummary(struct bbiFile *bwf, char *chrom, int start, int end, enum bbiSummaryType summaryType, double defaultVal); /* Return the summarized single value for a range. */ boolean isBigWig(char *fileName); /* Peak at a file to see if it's bigWig */ boolean bigWigFileCheckSigs(char *fileName); /* check file signatures at beginning and end of file */ /* bigWigValsOnChrom - a little system for optimizing bigWig use when doing a pass over the * whole chromosome. How it is used typically is: * struct bigWigValsOnChrom *chromVals = bigWigValsOnChromNew(); * for (chrom = chromList; chrom != NULL; chrom = chrom->next) * { * if (bigWigValsOnChromFetchData(chromVals, chrom->name, bigWig)) * // do stuff using the valBuf, or covBuf fields which have * // the big wig data unpacked into them. Can use chromSize and chrom too * } * bigWigValsOnChromFree(&chromVals); */ struct bigWigValsOnChrom /* Object for bulk access a chromosome at a time. This is faster than * doing bigWigInterval queries when you have ~3000 or more queries. */ { struct bigWigValsOnChrom *next; char *chrom; /* Current chromosome. */ long chromSize; /* Size of current chromosome. */ long bufSize; /* Size of allocated buffer */ double *valBuf; /* A value for each base on chrom. Zero where no data. */ Bits *covBuf; /* A bit for each base with data. */ }; struct bigWigValsOnChrom *bigWigValsOnChromNew(); /* Allocate new empty bigWigValsOnChromStructure. */ void bigWigValsOnChromFree(struct bigWigValsOnChrom **pChromVals); /* Free up bigWigValsOnChrom */ boolean bigWigValsOnChromFetchData(struct bigWigValsOnChrom *chromVals, char *chrom, struct bbiFile *bigWig); /* Fetch data for chromosome from bigWig. Returns FALSE if not data on that chrom. */ #endif /* BIGWIG_H */ rtracklayer/src/ucsc/bits.c0000644000175400017540000002153513556116552016773 0ustar00biocbuildbiocbuild/* bits - handle operations on arrays of bits. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include "common.h" #include "bits.h" static Bits oneBit[8] = { 0x80, 0x40, 0x20, 0x10, 0x8, 0x4, 0x2, 0x1}; static Bits leftMask[8] = {0xFF, 0x7F, 0x3F, 0x1F, 0xF, 0x7, 0x3, 0x1,}; static Bits rightMask[8] = {0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE, 0xFF,}; int bitsInByte[256]; static boolean inittedBitsInByte = FALSE; void bitsInByteInit() /* Initialize bitsInByte array. */ { int i; if (!inittedBitsInByte) { inittedBitsInByte = TRUE; for (i=0; i<256; ++i) { int count = 0; if (i&1) count = 1; if (i&2) ++count; if (i&4) ++count; if (i&8) ++count; if (i&0x10) ++count; if (i&0x20) ++count; if (i&0x40) ++count; if (i&0x80) ++count; bitsInByte[i] = count; } } } Bits *bitAlloc(int bitCount) /* Allocate bits. */ { int byteCount = ((bitCount+7)>>3); return needLargeZeroedMem(byteCount); } Bits *bitRealloc(Bits *b, int bitCount, int newBitCount) /* Resize a bit array. If b is null, allocate a new array */ { int byteCount = ((bitCount+7)>>3); int newByteCount = ((newBitCount+7)>>3); return needLargeZeroedMemResize(b, byteCount, newByteCount); } Bits *bitClone(Bits* orig, int bitCount) /* Clone bits. */ { int byteCount = ((bitCount+7)>>3); Bits* bits = needLargeZeroedMem(byteCount); memcpy(bits, orig, byteCount); return bits; } void bitFree(Bits **pB) /* Free bits. */ { freez(pB); } Bits *lmBitAlloc(struct lm *lm,int bitCount) // Allocate bits. Must supply local memory. { assert(lm != NULL); int byteCount = ((bitCount+7)>>3); return lmAlloc(lm,byteCount); } Bits *lmBitRealloc(struct lm *lm,Bits *b, int bitCount, int newBitCount) // Resize a bit array. If b is null, allocate a new array. Must supply local memory. { assert(lm != NULL); int byteCount = ((bitCount+7)>>3); int newByteCount = ((newBitCount+7)>>3); return lmAllocMoreMem(lm, b ,byteCount, newByteCount); } Bits *lmBitClone(struct lm *lm,Bits* orig, int bitCount) // Clone bits. Must supply local memory. { assert(lm != NULL); int byteCount = ((bitCount+7)>>3); Bits* bits = lmAlloc(lm,byteCount); memcpy(bits, orig, byteCount); return bits; } void bitSetOne(Bits *b, int bitIx) /* Set a single bit. */ { b[bitIx>>3] |= oneBit[bitIx&7]; } void bitClearOne(Bits *b, int bitIx) /* Clear a single bit. */ { b[bitIx>>3] &= ~oneBit[bitIx&7]; } void bitSetRange(Bits *b, int startIx, int bitCount) /* Set a range of bits. */ { if (bitCount <= 0) return; int endIx = (startIx + bitCount - 1); int startByte = (startIx>>3); int endByte = (endIx>>3); int startBits = (startIx&7); int endBits = (endIx&7); int i; if (startByte == endByte) { b[startByte] |= (leftMask[startBits] & rightMask[endBits]); return; } b[startByte] |= leftMask[startBits]; for (i = startByte+1; i>3] & oneBit[bitIx&7]) != 0; } int bitCountRange(Bits *b, int startIx, int bitCount) /* Count number of bits set in range. */ { if (bitCount <= 0) return 0; int endIx = (startIx + bitCount - 1); int startByte = (startIx>>3); int endByte = (endIx>>3); int startBits = (startIx&7); int endBits = (endIx&7); int i; int count = 0; if (!inittedBitsInByte) bitsInByteInit(); if (startByte == endByte) return bitsInByte[b[startByte] & leftMask[startBits] & rightMask[endBits]]; count = bitsInByte[b[startByte] & leftMask[startBits]]; for (i = startByte+1; i>3); int iByte; /* scan initial byte */ while (((iBit & 7) != 0) && (iBit < bitCount)) { if (bitReadOne(b, iBit) == val) return iBit; iBit++; } /* scan byte at a time, if not already in last byte */ iByte = (iBit >> 3); if (iByte < endByte) { while ((iByte < endByte) && (b[iByte] == notByteVal)) iByte++; iBit = iByte << 3; } /* scan last byte */ while (iBit < bitCount) { if (bitReadOne(b, iBit) == val) return iBit; iBit++; } return bitCount; /* not found */ } int bitFindSet(Bits *b, int startIx, int bitCount) /* Find the index of the the next set bit. */ { return bitFind(b, startIx, TRUE, bitCount); } int bitFindClear(Bits *b, int startIx, int bitCount) /* Find the index of the the next clear bit. */ { return bitFind(b, startIx, FALSE, bitCount); } void bitClear(Bits *b, int bitCount) /* Clear many bits (possibly up to 7 beyond bitCount). */ { int byteCount = ((bitCount+7)>>3); zeroBytes(b, byteCount); } void bitClearRange(Bits *b, int startIx, int bitCount) /* Clear a range of bits. */ { if (bitCount <= 0) return; int endIx = (startIx + bitCount - 1); int startByte = (startIx>>3); int endByte = (endIx>>3); int startBits = (startIx&7); int endBits = (endIx&7); int i; if (startByte == endByte) { b[startByte] &= ~(leftMask[startBits] & rightMask[endBits]); return; } b[startByte] &= ~leftMask[startBits]; for (i = startByte+1; i>3); while (--byteCount >= 0) { *a = (*a & *b++); a++; } } int bitAndCount(Bits *a, Bits *b, int bitCount) // Without altering 2 bitmaps, count the AND bits. { int byteCount = ((bitCount+7)>>3); int count = 0; if (!inittedBitsInByte) bitsInByteInit(); while (--byteCount >= 0) count += bitsInByte[(*a++ & *b++)]; return count; } void bitOr(Bits *a, Bits *b, int bitCount) /* Or two bitmaps. Put result in a. */ { int byteCount = ((bitCount+7)>>3); while (--byteCount >= 0) { *a = (*a | *b++); a++; } } int bitOrCount(Bits *a, Bits *b, int bitCount) // Without altering 2 bitmaps, count the OR'd bits. { int byteCount = ((bitCount+7)>>3); int count = 0; if (!inittedBitsInByte) bitsInByteInit(); while (--byteCount >= 0) count += bitsInByte[(*a++ | *b++)]; return count; } void bitXor(Bits *a, Bits *b, int bitCount) { int byteCount = ((bitCount+7)>>3); while (--byteCount >= 0) { *a = (*a ^ *b++); a++; } } int bitXorCount(Bits *a, Bits *b, int bitCount) // Without altering 2 bitmaps, count the XOR'd bits. { int byteCount = ((bitCount+7)>>3); int count = 0; if (!inittedBitsInByte) bitsInByteInit(); while (--byteCount >= 0) count += bitsInByte[(*a++ ^ *b++)]; return count; } void bitNot(Bits *a, int bitCount) /* Flip all bits in a. */ { int byteCount = ((bitCount+7)>>3); while (--byteCount >= 0) { *a = ~*a; a++; } } void bitReverseRange(Bits *bits, int startIx, int bitCount) // Reverses bits in range (e.g. 110010 becomes 010011) { if (bitCount <= 0) return; int ixA = startIx; int ixB = (startIx + bitCount - 1); for ( ;ixA < ixB; ixA++, ixB--) { boolean bitA = bitReadOne(bits, ixA); boolean bitB = bitReadOne(bits, ixB); if (!bitA && bitB) { bitSetOne( bits, ixA); bitClearOne(bits, ixB); } else if (bitA && !bitB) { bitClearOne(bits, ixA); bitSetOne( bits, ixB); } } } void bitPrint(Bits *a, int startIx, int bitCount, FILE* out) /* Print part or all of bit map as a string of 0s and 1s. Mostly useful for * debugging */ { int i; for (i = startIx; i < bitCount; i++) { if (bitReadOne(a, i)) fputc('1', out); else fputc('0', out); } fputc('\n', out); } void bitsOut(FILE* out, Bits *bits, int startIx, int bitCount, boolean onlyOnes) // Print part or all of bit map as a string of 0s and 1s. // If onlyOnes, enclose result in [] and use ' ' instead of '0'. { if (onlyOnes) fputc('[', out); int ix = startIx; for ( ; ix < bitCount; ix++) { if (bitReadOne(bits, ix)) fputc('1', out); else { if (onlyOnes) fputc(' ', out); else fputc('0', out); } } if (onlyOnes) fputc(']', out); } Bits *bitsIn(struct lm *lm,char *bitString, int len) // Returns a bitmap from a string of 1s and 0s. Any non-zero, non-blank char sets a bit. // Returned bitmap is the size of len even if that is longer than the string. // Optionally supply local memory. Note does NOT handle enclosing []s printed with bitsOut(). { if (bitString == NULL || len == 0) return NULL; Bits *bits = NULL; if (lm != NULL) bits = lmBitAlloc(lm,len); else bits = bitAlloc(len); int ix = 0; for ( ;ix < len && bitString[ix] != '\0'; ix++) { if (bitString[ix] != '0' && bitString[ix] != ' ') bitSetOne(bits, ix); } return bits; } rtracklayer/src/ucsc/bits.h0000644000175400017540000000643213556116552016777 0ustar00biocbuildbiocbuild/* bits - handle operations on arrays of bits. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef BITS_H #define BITS_H #include "localmem.h" typedef unsigned char Bits; #define bitToByteSize(bitSize) ((bitSize+7)/8) /* Convert number of bits to number of bytes needed to store bits. */ Bits *bitAlloc(int bitCount); /* Allocate bits. */ Bits *bitRealloc(Bits *b, int bitCount, int newBitCount); /* Resize a bit array. If b is null, allocate a new array */ Bits *bitClone(Bits* orig, int bitCount); /* Clone bits. */ void bitFree(Bits **pB); /* Free bits. */ Bits *lmBitAlloc(struct lm *lm,int bitCount); // Allocate bits. Must supply local memory. Bits *lmBitRealloc(struct lm *lm, Bits *b, int bitCount, int newBitCount); // Resize a bit array. If b is null, allocate a new array. Must supply local memory. Bits *lmBitClone(struct lm *lm, Bits* orig, int bitCount); // Clone bits. Must supply local memory. void bitSetOne(Bits *b, int bitIx); /* Set a single bit. */ void bitClearOne(Bits *b, int bitIx); /* Clear a single bit. */ void bitSetRange(Bits *b, int startIx, int bitCount); /* Set a range of bits. */ boolean bitReadOne(Bits *b, int bitIx); /* Read a single bit. */ int bitCountRange(Bits *b, int startIx, int bitCount); /* Count number of bits set in range. */ int bitFindSet(Bits *b, int startIx, int bitCount); /* Find the index of the the next set bit. */ int bitFindClear(Bits *b, int startIx, int bitCount); /* Find the index of the the next clear bit. */ void bitClear(Bits *b, int bitCount); /* Clear many bits (possibly up to 7 beyond bitCount). */ void bitClearRange(Bits *b, int startIx, int bitCount); /* Clear a range of bits. */ void bitAnd(Bits *a, Bits *b, int bitCount); /* And two bitmaps. Put result in a. */ int bitAndCount(Bits *a, Bits *b, int bitCount); // Without altering 2 bitmaps, count the AND bits. void bitOr(Bits *a, Bits *b, int bitCount); /* Or two bitmaps. Put result in a. */ int bitOrCount(Bits *a, Bits *b, int bitCount); // Without altering 2 bitmaps, count the OR'd bits. void bitXor(Bits *a, Bits *b, int bitCount); /* Xor two bitmaps. Put result in a. */ int bitXorCount(Bits *a, Bits *b, int bitCount); // Without altering 2 bitmaps, count the XOR'd bits. void bitNot(Bits *a, int bitCount); /* Flip all bits in a. */ void bitReverseRange(Bits *bits, int startIx, int bitCount); // Reverses bits in range (e.g. 110010 becomes 010011) void bitPrint(Bits *a, int startIx, int bitCount, FILE* out); /* Print part or all of bit map as a string of 0s and 1s. Mostly useful for * debugging */ void bitsOut(FILE* out, Bits *bits, int startIx, int bitCount, boolean onlyOnes); // Print part or all of bit map as a string of 0s and 1s. // If onlyOnes, enclose result in [] and use ' ' instead of '0'. Bits *bitsIn(struct lm *lm,char *bitString, int len); // Returns a bitmap from a string of 1s and 0s. Any non-zero, non-blank char sets a bit. // Returned bitmap is the size of len even if that is longer than the string. // Optionally supply local memory. Note does NOT handle enclosing []s printed with bitsOut(). extern int bitsInByte[256]; /* Lookup table for how many bits are set in a byte. */ void bitsInByteInit(); /* Initialize bitsInByte array. */ #endif /* BITS_H */ rtracklayer/src/ucsc/bwgCreate.c0000644000175400017540000011520513556116552017733 0ustar00biocbuildbiocbuild/* bwgCreate - create big wig files. Implements write side of bwgInternal.h module. * See the comment in bwgInternal.h for a description of the file format. */ /* Copyright (C) 2014 The Regents of the University of California * See README in this or parent directory for licensing information. */ #include "common.h" #include "linefile.h" #include "hash.h" #include "errAbort.h" #include "sqlNum.h" #include "sig.h" #include "zlibFace.h" #include "bPlusTree.h" #include "cirTree.h" #include "bbiFile.h" #include "bwgInternal.h" #include "bigWig.h" static int bwgBedGraphItemCmp(const void *va, const void *vb) /* Compare to sort based on query start. */ { const struct bwgBedGraphItem *a = *((struct bwgBedGraphItem **)va); const struct bwgBedGraphItem *b = *((struct bwgBedGraphItem **)vb); int dif = (int)a->start - (int)b->start; if (dif == 0) dif = (int)a->end - (int)b->end; return dif; } static int bwgVariableStepItemCmp(const void *va, const void *vb) /* Compare to sort based on query start. */ { const struct bwgVariableStepItem *a = *((struct bwgVariableStepItem **)va); const struct bwgVariableStepItem *b = *((struct bwgVariableStepItem **)vb); return (int)a->start - (int)b->start; } void bwgDumpSummary(struct bbiSummary *sum, FILE *f) /* Write out summary info to file. */ { fprintf(f, "summary %d:%d-%d min=%f, max=%f, sum=%f, sumSquares=%f, validCount=%d, mean=%f\n", sum->chromId, sum->start, sum->end, sum->minVal, sum->maxVal, sum->sumData, sum->sumSquares, sum->validCount, sum->sumData/sum->validCount); } static int bwgSectionWrite(struct bwgSection *section, boolean doCompress, FILE *f) /* Write out section to file, filling in section->fileOffset. */ { UBYTE type = section->type; UBYTE reserved8 = 0; int itemSize; switch (section->type) { case bwgTypeBedGraph: itemSize = 12; break; case bwgTypeVariableStep: itemSize = 8; break; case bwgTypeFixedStep: itemSize = 4; break; default: itemSize = 0; // Suppress compiler warning internalErr(); break; } int fixedSize = sizeof(section->chromId) + sizeof(section->start) + sizeof(section->end) + sizeof(section->itemStep) + sizeof(section->itemSpan) + sizeof(type) + sizeof(reserved8) + sizeof(section->itemCount); int bufSize = section->itemCount * itemSize + fixedSize; char buf[bufSize]; char *bufPt = buf; section->fileOffset = ftell(f); memWriteOne(&bufPt, section->chromId); memWriteOne(&bufPt, section->start); memWriteOne(&bufPt, section->end); memWriteOne(&bufPt, section->itemStep); memWriteOne(&bufPt, section->itemSpan); memWriteOne(&bufPt, type); memWriteOne(&bufPt, reserved8); memWriteOne(&bufPt, section->itemCount); int i; switch (section->type) { case bwgTypeBedGraph: { struct bwgBedGraphItem *item = section->items.bedGraphList; for (item = section->items.bedGraphList; item != NULL; item = item->next) { memWriteOne(&bufPt, item->start); memWriteOne(&bufPt, item->end); memWriteOne(&bufPt, item->val); } break; } case bwgTypeVariableStep: { struct bwgVariableStepPacked *items = section->items.variableStepPacked; for (i=0; iitemCount; ++i) { memWriteOne(&bufPt, items->start); memWriteOne(&bufPt, items->val); items += 1; } break; } case bwgTypeFixedStep: { struct bwgFixedStepPacked *items = section->items.fixedStepPacked; for (i=0; iitemCount; ++i) { memWriteOne(&bufPt, items->val); items += 1; } break; } default: internalErr(); break; } assert(bufSize == (bufPt - buf) ); if (doCompress) { size_t maxCompSize = zCompBufSize(bufSize); char compBuf[maxCompSize]; int compSize = zCompress(buf, bufSize, compBuf, maxCompSize); mustWrite(f, compBuf, compSize); } else mustWrite(f, buf, bufSize); return bufSize; } int bwgSectionCmp(const void *va, const void *vb) /* Compare to sort based on chrom,start,end. */ { const struct bwgSection *a = *((struct bwgSection **)va); const struct bwgSection *b = *((struct bwgSection **)vb); int dif = strcmp(a->chrom, b->chrom); if (dif == 0) { dif = (int)a->start - (int)b->start; if (dif == 0) dif = (int)a->end - (int)b->end; } return dif; } static struct cirTreeRange bwgSectionFetchKey(const void *va, void *context) /* Fetch bwgSection key for r-tree */ { struct cirTreeRange res; const struct bwgSection *a = *((struct bwgSection **)va); res.chromIx = a->chromId; res.start = a->start; res.end = a->end; return res; } static bits64 bwgSectionFetchOffset(const void *va, void *context) /* Fetch bwgSection file offset for r-tree */ { const struct bwgSection *a = *((struct bwgSection **)va); return a->fileOffset; } static boolean stepTypeLine(char *line) /* Return TRUE if it's a variableStep or fixedStep line. */ { return (startsWithWord("variableStep", line) || startsWithWord("fixedStep", line)); } static boolean steppedSectionEnd(char *line, int maxWords) /* Return TRUE if line indicates the start of another section. */ { int wordCount = chopByWhite(line, NULL, 5); if (wordCount > maxWords) return TRUE; return stepTypeLine(line); } static void parseFixedStepSection(struct lineFile *lf, boolean clipDontDie, struct lm *lm, int itemsPerSlot, char *chrom, bits32 chromSize, bits32 span, bits32 sectionStart, bits32 step, struct bwgSection **pSectionList) /* Read the single column data in section until get to end. */ { struct lm *lmLocal = lmInit(0); /* Stream through section until get to end of file or next section, * adding values from single column to list. */ char *words[1]; char *line; struct bwgFixedStepItem *item, *itemList = NULL; int originalSectionSize = 0; bits32 sectionEnd = sectionStart; while (lineFileNextReal(lf, &line)) { if (steppedSectionEnd(line, 1)) { lineFileReuse(lf); break; } chopLine(line, words); lmAllocVar(lmLocal, item); item->val = lineFileNeedDouble(lf, words, 0); if (sectionEnd + span > chromSize) { warn("line %d of %s: chromosome %s has %u bases, but item ends at %u", lf->lineIx, lf->fileName, chrom, chromSize, sectionEnd + span); if (!clipDontDie) noWarnAbort(); } else { slAddHead(&itemList, item); ++originalSectionSize; } sectionEnd += step; } slReverse(&itemList); /* Break up into sections of no more than items-per-slot size, and convert to packed format. */ int sizeLeft = originalSectionSize; for (item = itemList; item != NULL; ) { /* Figure out size of this section */ int sectionSize = sizeLeft; if (sectionSize > itemsPerSlot) sectionSize = itemsPerSlot; sizeLeft -= sectionSize; /* Allocate and fill in section. */ struct bwgSection *section; lmAllocVar(lm, section); section->chrom = chrom; section->start = sectionStart; sectionStart += sectionSize * step; section->end = sectionStart - step + span; section->type = bwgTypeFixedStep; section->itemStep = step; section->itemSpan = span; section->itemCount = sectionSize; /* Allocate array for data, and copy from list to array representation */ struct bwgFixedStepPacked *packed; /* An array */ section->items.fixedStepPacked = lmAllocArray(lm, packed, sectionSize); int i; for (i=0; ival = item->val; item = item->next; ++packed; } /* Add section to list. */ slAddHead(pSectionList, section); } lmCleanup(&lmLocal); } static void parseVariableStepSection(struct lineFile *lf, boolean clipDontDie, struct lm *lm, int itemsPerSlot, char *chrom, int chromSize, bits32 span, struct bwgSection **pSectionList) /* Read the single column data in section until get to end. */ { struct lm *lmLocal = lmInit(0); /* Stream through section until get to end of file or next section, * adding values from single column to list. */ char *words[2]; char *line; struct bwgVariableStepItem *item, *nextItem, *itemList = NULL; int originalSectionSize = 0; while (lineFileNextReal(lf, &line)) { if (steppedSectionEnd(line, 2)) { lineFileReuse(lf); break; } chopLine(line, words); lmAllocVar(lmLocal, item); int start = lineFileNeedNum(lf, words, 0); if (start <= 0) { errAbort("line %d of %s: zero or negative chromosome coordinate not allowed", lf->lineIx, lf->fileName); } item->start = start - 1; item->val = lineFileNeedDouble(lf, words, 1); if (item->start + span > chromSize) { warn("line %d of %s: chromosome %s has %u bases, but item ends at %u", lf->lineIx, lf->fileName, chrom, chromSize, item->start + span); if (!clipDontDie) noWarnAbort(); } else { slAddHead(&itemList, item); ++originalSectionSize; } } slSort(&itemList, bwgVariableStepItemCmp); /* Make sure no overlap between items. */ if (itemList != NULL) { item = itemList; for (nextItem = item->next; nextItem != NULL; nextItem = nextItem->next) { if (item->start + span > nextItem->start) errAbort("Overlap on %s between items starting at %d and %d.\n" "Please remove overlaps and try again", chrom, item->start, nextItem->start); item = nextItem; } } /* Break up into sections of no more than items-per-slot size. */ int sizeLeft = originalSectionSize; for (item = itemList; item != NULL; ) { /* Figure out size of this section */ int sectionSize = sizeLeft; if (sectionSize > itemsPerSlot) sectionSize = itemsPerSlot; sizeLeft -= sectionSize; /* Convert from list to array representation. */ struct bwgVariableStepPacked *packed, *p; p = lmAllocArray(lm, packed, sectionSize); int i; for (i=0; istart = item->start; p->val = item->val; item = item->next; ++p; } /* Fill in section and add it to list. */ struct bwgSection *section; lmAllocVar(lm, section); section->chrom = chrom; section->start = packed[0].start; section->end = packed[sectionSize-1].start + span; section->type = bwgTypeVariableStep; section->items.variableStepPacked = packed; section->itemSpan = span; section->itemCount = sectionSize; slAddHead(pSectionList, section); } lmCleanup(&lmLocal); } static unsigned parseUnsignedVal(struct lineFile *lf, char *var, char *val) /* Return val as an integer, printing error message if it's not. */ { char c = val[0]; if (!isdigit(c)) errAbort("Expecting numerical value for %s, got %s, line %d of %s", var, val, lf->lineIx, lf->fileName); return sqlUnsigned(val); } static void parseSteppedSection(struct lineFile *lf, boolean clipDontDie, struct hash *chromSizeHash, char *initialLine, struct lm *lm, int itemsPerSlot, struct bwgSection **pSectionList) /* Parse out a variableStep or fixedStep section and add it to list, breaking it up as need be. */ { /* Parse out first word of initial line and make sure it is something we recognize. */ char *typeWord = nextWord(&initialLine); enum bwgSectionType type = bwgTypeFixedStep; if (sameString(typeWord, "variableStep")) type = bwgTypeVariableStep; else if (sameString(typeWord, "fixedStep")) type = bwgTypeFixedStep; else errAbort("Unknown type %s\n", typeWord); /* Set up defaults for values we hope to parse out of rest of line. */ int span = 0; bits32 step = 0; bits32 start = 0; char *chrom = NULL; /* Parse out var=val pairs. */ char *varEqVal; while ((varEqVal = nextWord(&initialLine)) != NULL) { char *wordPairs[2]; int wc = chopByChar(varEqVal, '=', wordPairs, 2); if (wc != 2) errAbort("strange var=val pair line %d of %s", lf->lineIx, lf->fileName); char *var = wordPairs[0]; char *val = wordPairs[1]; if (sameString(var, "chrom")) chrom = cloneString(val); else if (sameString(var, "span")) span = parseUnsignedVal(lf, var, val); else if (sameString(var, "step")) step = parseUnsignedVal(lf, var, val); else if (sameString(var, "start")) { start = parseUnsignedVal(lf, var, val); } else errAbort("Unknown setting %s=%s line %d of %s", var, val, lf->lineIx, lf->fileName); } /* Check that we have all that are required and no more, and call type-specific routine to parse * rest of section. */ if (chrom == NULL) errAbort("Missing chrom= setting line %d of %s\n", lf->lineIx, lf->fileName); bits32 chromSize = (chromSizeHash ? hashIntVal(chromSizeHash, chrom) : BIGNUM); if (start > chromSize) { warn("line %d of %s: chromosome %s has %u bases, but item starts at %u", lf->lineIx, lf->fileName, chrom, chromSize, start); if (!clipDontDie) noWarnAbort(); } if (type == bwgTypeFixedStep) { if (start == 0) errAbort("Missing start= setting line %d of %s\n", lf->lineIx, lf->fileName); if (step == 0) errAbort("Missing step= setting line %d of %s\n", lf->lineIx, lf->fileName); if (span == 0) span = step; parseFixedStepSection(lf, clipDontDie, lm, itemsPerSlot, chrom, chromSize, span, start-1, step, pSectionList); } else { if (start != 0) errAbort("Extra start= setting line %d of %s\n", lf->lineIx, lf->fileName); if (step != 0) errAbort("Extra step= setting line %d of %s\n", lf->lineIx, lf->fileName); if (span == 0) span = 1; parseVariableStepSection(lf, clipDontDie, lm, itemsPerSlot, chrom, chromSize, span, pSectionList); } } struct bedGraphChrom /* A chromosome in bed graph format. */ { struct bedGraphChrom *next; /* Next in list. */ char *name; /* Chromosome name - not allocated here. */ bits32 size; /* Chromosome size. */ struct bwgBedGraphItem *itemList; /* List of items. */ }; static int bedGraphChromCmpName(const void *va, const void *vb) /* Compare to sort based on query start. */ { const struct bedGraphChrom *a = *((struct bedGraphChrom **)va); const struct bedGraphChrom *b = *((struct bedGraphChrom **)vb); return strcmp(a->name, b->name); } static void parseBedGraphSection(struct lineFile *lf, boolean clipDontDie, struct hash *chromSizeHash, struct lm *lm, int itemsPerSlot, struct bwgSection **pSectionList) /* Parse out bedGraph section until we get to something that is not in bedGraph format. */ { /* Set up hash and list to store chromosomes. */ struct hash *chromHash = hashNew(0); struct bedGraphChrom *chrom, *chromList = NULL; /* Collect lines in items on appropriate chromosomes. */ struct bwgBedGraphItem *item; char *line; while (lineFileNextReal(lf, &line)) { /* Check for end of section. */ if (stepTypeLine(line)) { lineFileReuse(lf); break; } /* Parse out our line and make sure it has exactly 4 columns. */ char *words[5]; int wordCount = chopLine(line, words); lineFileExpectWords(lf, 4, wordCount); /* Get chromosome. */ char *chromName = words[0]; chrom = hashFindVal(chromHash, chromName); if (chrom == NULL) { lmAllocVar(chromHash->lm, chrom); hashAddSaveName(chromHash, chromName, chrom, &chrom->name); chrom->size = (chromSizeHash ? hashIntVal(chromSizeHash, chromName) : BIGNUM); slAddHead(&chromList, chrom); } /* Convert to item and add to chromosome list. */ lmAllocVar(lm, item); item->start = lineFileNeedNum(lf, words, 1); item->end = lineFileNeedNum(lf, words, 2); item->val = lineFileNeedDouble(lf, words, 3); /* Do sanity checking on coordinates. */ if (item->start > item->end) errAbort("bedGraph error: start (%u) after end line (%u) %d of %s.", item->start, item->end, lf->lineIx, lf->fileName); if (item->end > chrom->size) { warn("bedGraph error line %d of %s: chromosome %s has size %u but item ends at %u", lf->lineIx, lf->fileName, chrom->name, chrom->size, item->end); if (!clipDontDie) noWarnAbort(); } else { slAddHead(&chrom->itemList, item); } } slSort(&chromList, bedGraphChromCmpName); /* Loop through each chromosome and output the item list, broken into sections * for that chrom. */ for (chrom = chromList; chrom != NULL; chrom = chrom->next) { slSort(&chrom->itemList, bwgBedGraphItemCmp); /* Check to make sure no overlap between items. */ struct bwgBedGraphItem *item = chrom->itemList, *nextItem; for (nextItem = item->next; nextItem != NULL; nextItem = nextItem->next) { if (item->end > nextItem->start) errAbort("Overlap between %s %d %d and %s %d %d.\nPlease remove overlaps and try again", chrom->name, item->start, item->end, chrom->name, nextItem->start, nextItem->end); item = nextItem; } /* Break up into sections of no more than items-per-slot size. */ struct bwgBedGraphItem *startItem, *endItem, *nextStartItem = chrom->itemList; for (startItem = chrom->itemList; startItem != NULL; startItem = nextStartItem) { /* Find end item of this section, and start item for next section. * Terminate list at end item. */ int sectionSize = 0; int i; endItem = startItem; for (i=0; inext; ++sectionSize; } endItem->next = NULL; /* Fill in section and add it to section list. */ struct bwgSection *section; lmAllocVar(lm, section); section->chrom = cloneString(chrom->name); section->start = startItem->start; section->end = endItem->end; section->type = bwgTypeBedGraph; section->items.bedGraphList = startItem; section->itemCount = sectionSize; slAddHead(pSectionList, section); } } /* Free up hash, no longer needed. Free's chromList as a side effect since chromList is in * hash's memory. */ hashFree(&chromHash); chromList = NULL; } void bwgMakeChromInfo(struct bwgSection *sectionList, struct hash *chromSizeHash, int *retChromCount, struct bbiChromInfo **retChromArray, int *retMaxChromNameSize) /* Fill in chromId field in sectionList. Return array of chromosome name/ids. * The chromSizeHash is keyed by name, and has int values. */ { /* Build up list of unique chromosome names. */ struct bwgSection *section; char *chromName = ""; int chromCount = 0; int maxChromNameSize = 0; struct slRef *uniq, *uniqList = NULL; for (section = sectionList; section != NULL; section = section->next) { if (!sameString(section->chrom, chromName)) { chromName = section->chrom; refAdd(&uniqList, chromName); ++chromCount; int len = strlen(chromName); if (len > maxChromNameSize) maxChromNameSize = len; } section->chromId = chromCount-1; } slReverse(&uniqList); /* Allocate and fill in results array. */ struct bbiChromInfo *chromArray; AllocArray(chromArray, chromCount); int i; for (i = 0, uniq = uniqList; i < chromCount; ++i, uniq = uniq->next) { chromArray[i].name = uniq->val; chromArray[i].id = i; chromArray[i].size = hashIntVal(chromSizeHash, uniq->val); } /* Clean up, set return values and go home. */ slFreeList(&uniqList); *retChromCount = chromCount; *retChromArray = chromArray; *retMaxChromNameSize = maxChromNameSize; } static int bwgStrcmp (const void * A, const void * B) { char * stringA = *((char **) A); char * stringB = *((char **) B); return strcmp(stringA, stringB); } void bwgMakeAllChromInfo(struct bwgSection *sectionList, struct hash *chromSizeHash, int *retChromCount, struct bbiChromInfo **retChromArray, int *retMaxChromNameSize) /* Fill in chromId field in sectionList. Return array of chromosome name/ids. * The chromSizeHash is keyed by name, and has int values. */ { /* Build up list of unique chromosome names. */ int maxChromNameSize = 0; /* Get list of values */ int chromCount = chromSizeHash->elCount; char ** chromName, ** chromNames; AllocArray(chromNames, chromCount); chromName = chromNames; struct hashEl* el; struct hashCookie cookie = hashFirst(chromSizeHash); for (el = hashNext(&cookie); el; el = hashNext(&cookie)) { *chromName = el->name; if (strlen(el->name) > maxChromNameSize) maxChromNameSize = strlen(el->name); chromName++; } qsort(chromNames, chromCount, sizeof(char *), bwgStrcmp); /* Allocate and fill in results array. */ struct bbiChromInfo *chromArray; AllocArray(chromArray, chromCount); int i; for (i = 0; i < chromCount; ++i) { chromArray[i].name = chromNames[i]; chromArray[i].id = i; chromArray[i].size = hashIntVal(chromSizeHash, chromNames[i]); } // Assign IDs to sections: struct bwgSection *section; char *name = ""; bits32 chromId = 0; for (section = sectionList; section != NULL; section = section->next) { if (!sameString(section->chrom, name)) { for (i = 0; i < chromCount; ++i) { if (sameString(section->chrom, chromArray[i].name)) { section->chromId = i; break; } } if (i == chromCount) errAbort("Could not find %s in list of chromosomes\n", section->chrom); chromId = section->chromId; name = section->chrom; } else section->chromId = chromId; } /* Clean up, set return values and go home. */ *retChromCount = chromCount; *retChromArray = chromArray; *retMaxChromNameSize = maxChromNameSize; } int bwgAverageResolution(struct bwgSection *sectionList) /* Return the average resolution seen in sectionList. */ { if (sectionList == NULL) return 1; bits64 totalRes = 0; bits32 sectionCount = 0; struct bwgSection *section; int i; for (section = sectionList; section != NULL; section = section->next) { int sectionRes = 0; switch (section->type) { case bwgTypeBedGraph: { struct bwgBedGraphItem *item; sectionRes = BIGNUM; for (item = section->items.bedGraphList; item != NULL; item = item->next) { int size = item->end - item->start; if (sectionRes > size) sectionRes = size; } break; } case bwgTypeVariableStep: { struct bwgVariableStepPacked *items = section->items.variableStepPacked, *prev; bits32 smallestGap = BIGNUM; for (i=1; iitemCount; ++i) { prev = items; items += 1; bits32 gap = items->start - prev->start; if (smallestGap > gap) smallestGap = gap; } if (smallestGap != BIGNUM) sectionRes = smallestGap; else sectionRes = section->itemSpan; break; } case bwgTypeFixedStep: { sectionRes = section->itemStep; break; } default: internalErr(); break; } totalRes += sectionRes; ++sectionCount; } return (totalRes + sectionCount/2)/sectionCount; } #define bwgSectionHeaderSize 24 /* Size of section header in file. */ static int bwgItemSize(enum bwgSectionType type) /* Return size of an item inside a particular section. */ { switch (type) { case bwgTypeBedGraph: return 2*sizeof(bits32) + sizeof(float); break; case bwgTypeVariableStep: return sizeof(bits32) + sizeof(float); break; case bwgTypeFixedStep: return sizeof(float); break; default: internalErr(); return 0; } } static int bwgSectionSize(struct bwgSection *section) /* Return size (on disk) of section. */ { return bwgSectionHeaderSize + bwgItemSize(section->type) * section->itemCount; } static bits64 bwgTotalSectionSize(struct bwgSection *sectionList) /* Return total size of all sections. */ { bits64 total = 0; struct bwgSection *section; for (section = sectionList; section != NULL; section = section->next) total += bwgSectionSize(section); return total; } static void bwgReduceBedGraph(struct bwgSection *section, bits32 chromSize, int reduction, struct bbiSummary **pOutList) /*Reduce a bedGraph section onto outList. */ { struct bwgBedGraphItem *item = section->items.bedGraphList; for (item = section->items.bedGraphList; item != NULL; item = item->next) { bbiAddRangeToSummary(section->chromId, chromSize, item->start, item->end, item->val, reduction, pOutList); } } static void bwgReduceVariableStep(struct bwgSection *section, bits32 chromSize, int reduction, struct bbiSummary **pOutList) /*Reduce a variableStep section onto outList. */ { struct bwgVariableStepPacked *items = section->items.variableStepPacked; int i; for (i=0; iitemCount; ++i) { bbiAddRangeToSummary(section->chromId, chromSize, items->start, items->start + section->itemSpan, items->val, reduction, pOutList); items += 1; } } static void bwgReduceFixedStep(struct bwgSection *section, bits32 chromSize, int reduction, struct bbiSummary **pOutList) /*Reduce a fixedStep section onto outList. */ { struct bwgFixedStepPacked *items = section->items.fixedStepPacked; int start = section->start; int i; for (i=0; iitemCount; ++i) { bbiAddRangeToSummary(section->chromId, chromSize, start, start + section->itemSpan, items->val, reduction, pOutList); start += section->itemStep; items += 1; } } struct bbiSummary *bwgReduceSectionList(struct bwgSection *sectionList, struct bbiChromInfo *chromInfoArray, int reduction) /* Return summary of section list reduced by given amount. */ { struct bbiSummary *outList = NULL; struct bwgSection *section = NULL; /* Loop through input section list reducing into outList. */ for (section = sectionList; section != NULL; section = section->next) { bits32 chromSize = chromInfoArray[section->chromId].size; switch (section->type) { case bwgTypeBedGraph: bwgReduceBedGraph(section, chromSize, reduction, &outList); break; case bwgTypeVariableStep: bwgReduceVariableStep(section, chromSize, reduction, &outList); break; case bwgTypeFixedStep: bwgReduceFixedStep(section, chromSize, reduction, &outList); break; default: internalErr(); return 0; } } slReverse(&outList); return outList; } static void bwgComputeDynamicSummaries(struct bwgSection *sectionList, struct bbiSummary ** reduceSummaries, bits16 * summaryCount, struct bbiChromInfo *chromInfoArray, int chromCount, bits32 * reductionAmounts, boolean doCompress) { /* Figure out initial summary level - starting with a summary 10 times the amount * of the smallest item. See if summarized data is smaller than half input data, if * not bump up reduction by a factor of 2 until it is, or until further summarying * yeilds no size reduction. */ int i; int minRes = bwgAverageResolution(sectionList); int initialReduction = minRes*10; bits64 fullSize = bwgTotalSectionSize(sectionList); bits64 lastSummarySize = 0, summarySize; bits64 maxReducedSize = fullSize/2; struct bbiSummary *summaryList = NULL; for (;;) { summaryList = bwgReduceSectionList(sectionList, chromInfoArray, initialReduction); bits64 summarySize = bbiTotalSummarySize(summaryList); if (doCompress) { summarySize *= 2; // Compensate for summary not compressing as well as primary data } if (summarySize >= maxReducedSize && summarySize != lastSummarySize) { /* Need to do more reduction. First scale reduction by amount that it missed * being small enough last time, with an extra 10% for good measure. Then * just to keep from spinning through loop two many times, make sure this is * at least 2x the previous reduction. */ int nextReduction = 1.1 * initialReduction * summarySize / maxReducedSize; if (nextReduction < initialReduction*2) nextReduction = initialReduction*2; initialReduction = nextReduction; bbiSummaryFreeList(&summaryList); lastSummarySize = summarySize; } else break; } *summaryCount = 1; reduceSummaries[0] = summaryList; reductionAmounts[0] = initialReduction; /* Now calculate up to 10 levels of further summary. */ bits64 reduction = initialReduction; for (i=0; i<9; i++) { reduction *= 4; if (reduction > 1000000000) break; summaryList = bbiReduceSummaryList(reduceSummaries[*summaryCount-1], chromInfoArray, reduction); summarySize = bbiTotalSummarySize(summaryList); if (summarySize != lastSummarySize) { reduceSummaries[*summaryCount] = summaryList; reductionAmounts[*summaryCount] = reduction; ++(*summaryCount); } int summaryItemCount = slCount(summaryList); if (summaryItemCount <= chromCount) break; } } static void bwgComputeFixedSummaries(struct bwgSection * sectionList, struct bbiSummary ** reduceSummaries, bits16 * summaryCount, struct bbiChromInfo *chromInfoArray, bits32 * reductionAmounts) { // Hack: pre-defining summary levels, set off Ensembl default zoom levels // The last two values of this array were extrapolated following Jim's formula int i; #define REDUCTION_COUNT 10 bits32 presetReductions[REDUCTION_COUNT] = {30, 65, 130, 260, 450, 648, 950, 1296, 4800, 19200}; bits64 reduction = reductionAmounts[0] = presetReductions[0]; reduceSummaries[0] = bwgReduceSectionList(sectionList, chromInfoArray, presetReductions[0]); for (i=1; inext) { bits32 uncSizeOne = bwgSectionWrite(section, doCompress, f); if (uncSizeOne > uncompressBufSize) uncompressBufSize = uncSizeOne; } /* Write out index - creating a temporary array rather than list representation of * sections in the process. */ indexOffset = ftell(f); struct bwgSection **sectionArray; AllocArray(sectionArray, sectionCount); for (section = sectionList, i=0; section != NULL; section = section->next, ++i) sectionArray[i] = section; cirTreeFileBulkIndexToOpenFile(sectionArray, sizeof(sectionArray[0]), sectionCount, blockSize, 1, NULL, bwgSectionFetchKey, bwgSectionFetchOffset, indexOffset, f); freez(§ionArray); /* Write out summary sections. */ verbose(2, "bwgCreate writing %d summaries\n", summaryCount); for (i=0; ivalidCount; totalSum.minVal = sum->minVal; totalSum.maxVal = sum->maxVal; totalSum.sumData = sum->sumData; totalSum.sumSquares = sum->sumSquares; for (sum = sum->next; sum != NULL; sum = sum->next) { totalSum.validCount += sum->validCount; if (sum->minVal < totalSum.minVal) totalSum.minVal = sum->minVal; if (sum->maxVal > totalSum.maxVal) totalSum.maxVal = sum->maxVal; totalSum.sumData += sum->sumData; totalSum.sumSquares += sum->sumSquares; } /* Write real summary */ fseek(f, totalSummaryOffset, SEEK_SET); bbiSummaryElementWrite(f, &totalSum); } else totalSummaryOffset = 0; /* Edge case, no summary. */ /* Go back and fill in offsets properly in header. */ fseek(f, dataOffsetPos, SEEK_SET); writeOne(f, dataOffset); fseek(f, indexOffsetPos, SEEK_SET); writeOne(f, indexOffset); fseek(f, chromTreeOffsetPos, SEEK_SET); writeOne(f, chromTreeOffset); fseek(f, totalSummaryOffsetPos, SEEK_SET); writeOne(f, totalSummaryOffset); if (doCompress) { int maxZoomUncompSize = itemsPerSlot * sizeof(struct bbiSummaryOnDisk); if (maxZoomUncompSize > uncompressBufSize) uncompressBufSize = maxZoomUncompSize; fseek(f, uncompressBufSizePos, SEEK_SET); writeOne(f, uncompressBufSize); } /* Also fill in offsets in zoom headers. */ for (i=0; ilineIx, lf->fileName, line); /* Parse out a bed graph line just to check numerical format. */ char *chrom = words[0]; int start = lineFileNeedNum(lf, words, 1); int end = lineFileNeedNum(lf, words, 2); double val = lineFileNeedDouble(lf, words, 3); verbose(2, "bedGraph %s:%d-%d@%g\n", chrom, start, end, val); /* Push back line and call bed parser. */ lineFileReuse(lf); parseBedGraphSection(lf, clipDontDie, chromSizeHash, lm, maxSectionSize, §ionList); } } slSort(§ionList, bwgSectionCmp); /* Check for overlap at section level. */ struct bwgSection *section, *nextSection; for (section = sectionList; section != NULL; section = nextSection) { nextSection = section->next; if (nextSection != NULL) { if (sameString(section->chrom, nextSection->chrom)) { if (section->end > nextSection->start) { errAbort("There's more than one value for %s base %d (in coordinates that start with 1).\n", section->chrom, nextSection->start+1); } } } } return sectionList; } void bigWigFileCreateEx( char *inName, /* Input file in ascii wiggle format. */ char *chromSizes, /* Two column tab-separated file: . */ int blockSize, /* Number of items to bundle in r-tree. 1024 is good. */ int itemsPerSlot, /* Number of items in lowest level of tree. 512 is good. */ boolean clipDontDie, /* If TRUE then clip items off end of chrom rather than dying. */ boolean compress, /* If TRUE then compress data. */ boolean keepAllChromosomes, /* If TRUE then store all chromosomes in chromosomal b-tree. */ boolean fixedSummaries, /* If TRUE then impose fixed summary levels. */ char *outName) /* Convert ascii format wig file (in fixedStep, variableStep or bedGraph format) * to binary big wig format. */ { /* This code needs to agree with code in two other places currently - bigBedFileCreate, * and bbiFileOpen. I'm thinking of refactoring to share at least between * bigBedFileCreate and bigWigFileCreate. It'd be great so it could be structured * so that it could send the input in one chromosome at a time, and send in the zoom * stuff only after all the chromosomes are done. This'd potentially reduce the memory * footprint by a factor of 2 or 4. Still, for now it works. -JK */ struct hash *chromSizeHash = bbiChromSizesFromFile(chromSizes); struct lm *lm = lmInit(0); struct bwgSection *sectionList = bwgParseWig(inName, clipDontDie, chromSizeHash, itemsPerSlot, lm); if (sectionList == NULL) errAbort("%s is empty of data", inName); bwgCreate(sectionList, chromSizeHash, blockSize, itemsPerSlot, compress, keepAllChromosomes, fixedSummaries, outName); lmCleanup(&lm); } void bigWigFileCreate( char *inName, /* Input file in ascii wiggle format. */ char *chromSizes, /* Two column tab-separated file: . */ int blockSize, /* Number of items to bundle in r-tree. 1024 is good. */ int itemsPerSlot, /* Number of items in lowest level of tree. 512 is good. */ boolean clipDontDie, /* If TRUE then clip items off end of chrom rather than dying. */ boolean compress, /* If TRUE then compress data. */ char *outName) /* Convert ascii format wig file (in fixedStep, variableStep or bedGraph format) * to binary big wig format. */ { bigWigFileCreateEx( inName, chromSizes, blockSize, itemsPerSlot, clipDontDie, compress, FALSE, FALSE, outName); } rtracklayer/src/ucsc/bwgInternal.h0000644000175400017540000001041313556116552020304 0ustar00biocbuildbiocbuild/* bwgInternal - stuff to create and use bigWig files. Generally you'll want to use the * simpler interfaces in the bigWig module instead. This file is good reading though * if you want to extend the bigWig interface, or work with bigWig files directly * without going through the Kent library. */ #ifndef BIGWIGFILE_H #define BIGWIGFILE_H enum bwgSectionType /* Code to indicate section type. */ { bwgTypeBedGraph=1, bwgTypeVariableStep=2, bwgTypeFixedStep=3, }; struct bwgBedGraphItem /* An bedGraph-type item in a bwgSection. */ { struct bwgBedGraphItem *next; /* Next in list. */ bits32 start,end; /* Range of chromosome covered. */ float val; /* Value. */ }; struct bwgVariableStepItem /* An variableStep type item in a bwgSection. */ { struct bwgVariableStepItem *next; /* Next in list. */ bits32 start; /* Start position in chromosome. */ float val; /* Value. */ }; struct bwgVariableStepPacked /* An variableStep type item in a bwgSection. */ { bits32 start; /* Start position in chromosome. */ float val; /* Value. */ }; struct bwgFixedStepItem /* An fixedStep type item in a bwgSection. */ { struct bwgFixedStepItem *next; /* Next in list. */ float val; /* Value. */ }; struct bwgFixedStepPacked /* An fixedStep type item in a bwgSection. */ { float val; /* Value. */ }; union bwgItem /* Union of item pointers for all possible section types. */ { struct bwgBedGraphItem *bedGraphList; /* A linked list */ struct bwgFixedStepPacked *fixedStepPacked; /* An array */ struct bwgVariableStepPacked *variableStepPacked; /* An array */ /* No packed format for bedGraph... */ }; struct bwgSection /* A section of a bigWig file - all on same chrom. This is a somewhat fat data * structure used by the bigWig creation code. See also bwgSection for the * structure returned by the bigWig reading code. */ { struct bwgSection *next; /* Next in list. */ char *chrom; /* Chromosome name. */ bits32 start,end; /* Range of chromosome covered. */ enum bwgSectionType type; union bwgItem items; /* List/array of items in this section. */ bits32 itemStep; /* Step within item if applicable. */ bits32 itemSpan; /* Item span if applicable. */ bits16 itemCount; /* Number of items in section. */ bits32 chromId; /* Unique small integer value for chromosome. */ bits64 fileOffset; /* Offset of section in file. */ }; struct bwgSectionHead /* A header from a bigWig file section - similar to above bug what is on disk. */ { bits32 chromId; /* Chromosome short identifier. */ bits32 start,end; /* Range covered. */ bits32 itemStep; /* For some section types, the # of bases between items. */ bits32 itemSpan; /* For some section types, the # of bases in each item. */ UBYTE type; /* Type byte. */ UBYTE reserved; /* Always zero for now. */ bits16 itemCount; /* Number of items in block. */ }; void bwgSectionHeadFromMem(char **pPt, struct bwgSectionHead *head, boolean isSwapped); /* Read section header. */ int bwgSectionCmp(const void *va, const void *vb); /* Compare to sort based on chrom,start,end. */ struct bwgSection *bwgParseWig( char *fileName, /* Name of ascii wig file. */ boolean clipDontDie, /* Skip items outside chromosome rather than aborting. */ struct hash *chromSizeHash, /* If non-NULL items checked to be inside chromosome. */ int maxSectionSize, /* Biggest size of a section. 100 - 100,000 is usual range. */ struct lm *lm); /* Memory pool to allocate from. */ /* Parse out ascii wig file - allocating memory in lm. */ int bwgAverageResolution(struct bwgSection *sectionList); /* Return the average resolution seen in sectionList. */ struct bbiSummary *bwgReduceSectionList(struct bwgSection *sectionList, struct bbiChromInfo *chromInfoArray, int reduction); /* Return summary of section list reduced by given amount. */ void bwgCreate(struct bwgSection *sectionList, struct hash *chromSizeHash, int blockSize, int itemsPerSlot, boolean doCompress, boolean keepAllChromosomes, boolean fixedSummaries, char *fileName); /* Create a bigWig file out of a sorted sectionList. A lower level routine * than the one above. */ #endif /* BIGWIGFILE_H */ rtracklayer/src/ucsc/bwgQuery.c0000644000175400017540000002657513556116552017650 0ustar00biocbuildbiocbuild/* bwgQuery - implements the query side of bigWig. See bwgInternal.h for definition of file * format. */ /* Copyright (C) 2012 The Regents of the University of California * See README in this or parent directory for licensing information. */ #include "common.h" #include "linefile.h" #include "hash.h" #include "options.h" #include "sig.h" #include "sqlNum.h" #include "obscure.h" #include "dystring.h" #include "bPlusTree.h" #include "cirTree.h" #include "rangeTree.h" #include "udc.h" #include "zlibFace.h" #include "bbiFile.h" #include "bwgInternal.h" #include "bigWig.h" #include "bigBed.h" struct bbiFile *bigWigFileOpen(char *fileName) /* Open up big wig file. */ { return bbiFileOpen(fileName, bigWigSig, "big wig"); } boolean bigWigFileCheckSigs(char *fileName) /* check file signatures at beginning and end of file */ { return bbiFileCheckSigs(fileName, bigWigSig, "big wig"); } #ifdef OLD static void bwgSectionHeadRead(struct bbiFile *bwf, struct bwgSectionHead *head) /* Read section header. */ { struct udcFile *udc = bwf->udc; boolean isSwapped = bwf->isSwapped; head->chromId = udcReadBits32(udc, isSwapped); head->start = udcReadBits32(udc, isSwapped); head->end = udcReadBits32(udc, isSwapped); head->itemStep = udcReadBits32(udc, isSwapped); head->itemSpan = udcReadBits32(udc, isSwapped); head->type = udcGetChar(udc); head->reserved = udcGetChar(udc); head->itemCount = udcReadBits16(udc, isSwapped); } #endif /* OLD */ void bwgSectionHeadFromMem(char **pPt, struct bwgSectionHead *head, boolean isSwapped) /* Read section header. */ { char *pt = *pPt; head->chromId = memReadBits32(&pt, isSwapped); head->start = memReadBits32(&pt, isSwapped); head->end = memReadBits32(&pt, isSwapped); head->itemStep = memReadBits32(&pt, isSwapped); head->itemSpan = memReadBits32(&pt, isSwapped); head->type = *pt++; head->reserved = *pt++; head->itemCount = memReadBits16(&pt, isSwapped); *pPt = pt; } static int bigWigBlockDumpIntersectingRange(boolean isSwapped, char *blockPt, char *blockEnd, char *chrom, bits32 rangeStart, bits32 rangeEnd, int maxCount, FILE *out) /* Print out info on parts of block that intersect start-end, block starting at current position. */ { struct bwgSectionHead head; bwgSectionHeadFromMem(&blockPt, &head, isSwapped); bits16 i; float val; int outCount = 0; switch (head.type) { case bwgTypeBedGraph: { fprintf(out, "#bedGraph section %s:%u-%u\n", chrom, head.start, head.end); for (i=0; i 0) { fprintf(out, "%s\t%u\t%u\t%g\n", chrom, start, end, val); ++outCount; if (maxCount != 0 && outCount >= maxCount) break; } } break; } case bwgTypeVariableStep: { fprintf(out, "variableStep chrom=%s span=%u\n", chrom, head.itemSpan); for (i=0; i 0) { fprintf(out, "%u\t%g\n", start+1, val); ++outCount; if (maxCount != 0 && outCount >= maxCount) break; } } break; } case bwgTypeFixedStep: { boolean gotStart = FALSE; bits32 start = head.start; for (i=0; i 0) { if (!gotStart) { fprintf(out, "fixedStep chrom=%s start=%u step=%u span=%u\n", chrom, start+1, head.itemStep, head.itemSpan); gotStart = TRUE; } fprintf(out, "%g\n", val); ++outCount; if (maxCount != 0 && outCount >= maxCount) break; } start += head.itemStep; } break; } default: internalErr(); break; } assert( (maxCount != 0 && outCount >= maxCount) || (blockPt == blockEnd)); return outCount; } struct bbiInterval *bigWigIntervalQuery(struct bbiFile *bwf, char *chrom, bits32 start, bits32 end, struct lm *lm) /* Get data for interval. Return list allocated out of lm. */ { if (bwf->typeSig != bigWigSig) errAbort("Trying to do bigWigIntervalQuery on a non big-wig file."); bbiAttachUnzoomedCir(bwf); struct bbiInterval *el, *list = NULL; struct fileOffsetSize *blockList = bbiOverlappingBlocks(bwf, bwf->unzoomedCir, chrom, start, end, NULL); struct fileOffsetSize *block, *beforeGap, *afterGap; struct udcFile *udc = bwf->udc; boolean isSwapped = bwf->isSwapped; float val; int i; /* Set up for uncompression optionally. */ char *uncompressBuf = NULL; if (bwf->uncompressBufSize > 0) uncompressBuf = needLargeMem(bwf->uncompressBufSize); /* This loop is a little complicated because we merge the read requests for efficiency, but we * have to then go back through the data one unmerged block at a time. */ for (block = blockList; block != NULL; ) { /* Find contigious blocks and read them into mergedBuf. */ fileOffsetSizeFindGap(block, &beforeGap, &afterGap); bits64 mergedOffset = block->offset; bits64 mergedSize = beforeGap->offset + beforeGap->size - mergedOffset; udcSeek(udc, mergedOffset); char *mergedBuf = needLargeMem(mergedSize); udcMustRead(udc, mergedBuf, mergedSize); char *blockBuf = mergedBuf; /* Loop through individual blocks within merged section. */ for (;block != afterGap; block = block->next) { /* Uncompress if necessary. */ char *blockPt, *blockEnd; if (uncompressBuf) { blockPt = uncompressBuf; int uncSize = zUncompress(blockBuf, block->size, uncompressBuf, bwf->uncompressBufSize); blockEnd = blockPt + uncSize; } else { blockPt = blockBuf; blockEnd = blockPt + block->size; } /* Deal with insides of block. */ struct bwgSectionHead head; bwgSectionHeadFromMem(&blockPt, &head, isSwapped); switch (head.type) { case bwgTypeBedGraph: { for (i=0; i end) e = end; if (s < e) { lmAllocVar(lm, el); el->start = s; el->end = e; el->val = val; slAddHead(&list, el); } } break; } case bwgTypeVariableStep: { for (i=0; i end) e = end; if (s < e) { lmAllocVar(lm, el); el->start = s; el->end = e; el->val = val; slAddHead(&list, el); } } break; } case bwgTypeFixedStep: { bits32 s = head.start; bits32 e = s + head.itemSpan; for (i=0; i end) clippedE = end; if (clippedS < clippedE) { lmAllocVar(lm, el); el->start = clippedS; el->end = clippedE; el->val = val; slAddHead(&list, el); } s += head.itemStep; e += head.itemStep; } break; } default: internalErr(); break; } assert(blockPt == blockEnd); blockBuf += block->size; } freeMem(mergedBuf); } freeMem(uncompressBuf); slFreeList(&blockList); slReverse(&list); return list; } int bigWigIntervalDump(struct bbiFile *bwf, char *chrom, bits32 start, bits32 end, int maxCount, FILE *out) /* Print out info on bigWig parts that intersect chrom:start-end. Set maxCount to 0 if you * don't care how many are printed. Returns number printed. */ { if (bwf->typeSig != bigWigSig) errAbort("Trying to do bigWigIntervalDump on a non big-wig file."); bbiAttachUnzoomedCir(bwf); struct fileOffsetSize *blockList = bbiOverlappingBlocks(bwf, bwf->unzoomedCir, chrom, start, end, NULL); struct fileOffsetSize *block, *beforeGap, *afterGap; struct udcFile *udc = bwf->udc; int printCount = 0; /* Set up for uncompression optionally. */ char *uncompressBuf = NULL; if (bwf->uncompressBufSize > 0) uncompressBuf = needLargeMem(bwf->uncompressBufSize); /* This loop is a little complicated because we merge the read requests for efficiency, but we * have to then go back through the data one unmerged block at a time. */ for (block = blockList; block != NULL; ) { /* Find contigious blocks and read them into mergedBuf. */ fileOffsetSizeFindGap(block, &beforeGap, &afterGap); bits64 mergedOffset = block->offset; bits64 mergedSize = beforeGap->offset + beforeGap->size - mergedOffset; udcSeek(udc, mergedOffset); char *mergedBuf = needLargeMem(mergedSize); udcMustRead(udc, mergedBuf, mergedSize); char *blockBuf = mergedBuf; /* Loop through individual blocks within merged section. */ for (;block != afterGap; block = block->next) { /* Uncompress if necessary. */ char *blockPt, *blockEnd; if (uncompressBuf) { blockPt = uncompressBuf; int uncSize = zUncompress(blockBuf, block->size, uncompressBuf, bwf->uncompressBufSize); blockEnd = blockPt + uncSize; } else { blockPt = blockBuf; blockEnd = blockPt + block->size; } /* Do the actual dump. */ int oneCount = bigWigBlockDumpIntersectingRange(bwf->isSwapped, blockPt, blockEnd, chrom, start, end, maxCount, out); /* Keep track of how many dumped, not exceeding maximum. */ printCount += oneCount; if (maxCount != 0) { if (oneCount >= maxCount) { block = NULL; // we want to drop out of the outer loop too break; } maxCount -= oneCount; } blockBuf += block->size; } freeMem(mergedBuf); } freeMem(uncompressBuf); slFreeList(&blockList); return printCount; } boolean bigWigSummaryArray(struct bbiFile *bwf, char *chrom, bits32 start, bits32 end, enum bbiSummaryType summaryType, int summarySize, double *summaryValues) /* Fill in summaryValues with data from indicated chromosome range in bigWig file. * Be sure to initialize summaryValues to a default value, which will not be touched * for regions without data in file. (Generally you want the default value to either * be 0.0 or nan("") depending on the application.) Returns FALSE if no data * at that position. */ { boolean ret = bbiSummaryArray(bwf, chrom, start, end, bigWigIntervalQuery, summaryType, summarySize, summaryValues); return ret; } boolean bigWigSummaryArrayExtended(struct bbiFile *bwf, char *chrom, bits32 start, bits32 end, int summarySize, struct bbiSummaryElement *summary) /* Get extended summary information for summarySize evenely spaced elements into * the summary array. */ { boolean ret = bbiSummaryArrayExtended(bwf, chrom, start, end, bigWigIntervalQuery, summarySize, summary); return ret; } double bigWigSingleSummary(struct bbiFile *bwf, char *chrom, int start, int end, enum bbiSummaryType summaryType, double defaultVal) /* Return the summarized single value for a range. */ { double arrayOfOne = defaultVal; bigWigSummaryArray(bwf, chrom, start, end, summaryType, 1, &arrayOfOne); return arrayOfOne; } boolean isBigWig(char *fileName) /* Peak at a file to see if it's bigWig */ { FILE *f = mustOpen(fileName, "rb"); bits32 sig; mustReadOne(f, sig); fclose(f); if (sig == bigWigSig) return TRUE; sig = byteSwap32(sig); return sig == bigWigSig; } rtracklayer/src/ucsc/cheapcgi.h0000644000175400017540000005321413556116552017601 0ustar00biocbuildbiocbuild/***************************************************************************** * Copyright (C) 2000 Jim Kent. This source code may be freely used * * for personal, academic, and non-profit purposes. Commercial use * * permitted only by explicit agreement with Jim Kent (jim_kent@pacbell.net) * *****************************************************************************/ /* Cheapcgi.h - turns variables passed from the web form into * something that C understands. */ #ifndef CHEAPCGI_H #define CHEAPCGI_H #ifndef DYSTRING_H #include "dystring.h" #endif #ifndef HASH_H #include "hash.h" #endif #define COLOR_BG_DEFAULT "#FFFEE8" #define COLOR_BG_ALTDEFAULT "#FFF9D2" #define COLOR_BG_DEFAULT_DARKER "#FCECC0" #define COLOR_BG_DEFAULT_DARKEST "#EED5B7" #define COLOR_BG_GHOST "#EEEEEE" #define COLOR_BG_PALE "#F8F8F8" #define COLOR_BG_HEADER_LTBLUE "#D9E4F8" #define COLOR_DARKGREEN "#008800" #define COLOR_LTGREEN "#CCFFCC" #define COLOR_DARKBLUE "#000088" #define COLOR_BLUE_BUTTON "#91B3E6" #define COLOR_DARKGREY "#666666" #define COLOR_LTGREY "#CCCCCC" #define COLOR_YELLOW "#FFFF00" #define COLOR_LTYELLOW "#FFF380" #define COLOR_WHITE "#FFFFFF" #define COLOR_RED "#AA0000" #define COLOR_TRACKLIST_LEVEL1 COLOR_BG_DEFAULT #define COLOR_TRACKLIST_LEVEL2 COLOR_BG_ALTDEFAULT #define COLOR_TRACKLIST_LEVEL3 COLOR_BG_DEFAULT_DARKER #define COLOR_TRACKLIST_LEVEL4 COLOR_BG_DEFAULT_DARKEST void initSigHandlers(boolean dumpStack); /* set handler for various terminal signals for logging purposes. * if dumpStack is TRUE, attempt to dump the stack. */ struct cgiVar /* Info on one cgi variable. */ { struct cgiVar *next; /* Next in list. */ char *name; /* Name - allocated in hash. */ char *val; /* Value - also not allocated here. */ boolean saved; /* True if saved. */ }; struct cgiVar* cgiVarList(); /* return the list of cgiVar's */ struct cgiDictionary /* Stuff to encapsulate parsed out CGI vars. */ { struct cgiDictionary *next; /* Next in list if we have multiple */ char *stringData; /* Where values if cgi-vars live. */ struct hash *hash; /* Keyed by cgi-var name, value is cgiVar */ struct cgiVar *list; /* List of all vars. */ }; void cgiDictionaryFree(struct cgiDictionary **pD); /* Free up resources associated with dictionary. */ void cgiDictionaryFreeList(struct cgiDictionary **pList); /* Free up a whole list of cgiDictionaries */ struct cgiDictionary *cgiDictionaryFromEncodedString(char *encodedString); /* Giving a this=that&this=that string, return cgiDictionary parsed out from it. * This does *not* destroy input like the lower level cgiParse functions do. */ char *findCookieData(char *varName); /* Get the string associated with varName from the cookie string. */ void dumpCookieList(); /* Print out the cookie list. */ boolean cgiIsOnWeb(); /* Return TRUE if looks like we're being run as a CGI. */ char *cgiRequestMethod(); /* Return CGI REQUEST_METHOD (such as 'GET/POST/PUT/DELETE/HEAD') */ char *cgiRequestUri(); /* Return CGI REQUEST_URI */ char *cgiRequestContentLength(); /* Return HTTP REQUEST CONTENT_LENGTH if available*/ char *cgiScriptName(); /* Return name of script so libs can do context-sensitive stuff. */ char *cgiServerName(); /* Return name of server, better to use cgiServerNamePort() for actual URL construction */ char *cgiServerPort(); /* Return port number of server */ char *cgiServerNamePort(); /* Return name of server with port if different than 80 */ boolean cgiServerHttpsIsOn(); /* Return true if HTTPS is on */ char *cgiAppendSForHttps(); /* if running on https, add the letter s to the url protocol */ char *cgiRemoteAddr(); /* Return IP address of client (or "unknown"). */ char *cgiUserAgent(); /* Return remote user agent (HTTP_USER_AGENT) or NULL if remote user agent is not known */ enum browserType /* How to look at a track. */ { btUnknown=0, // Not yet known btOpera=1, // Opera btIE=2, // MS Internet Explorer btFF=3, // Firefox btChrome=4, // Google Chrome btSafari=5, // Safari btOther=6 // Anything else }; enum osType /* How to look at a track. */ { osUnknown=0, // Not yet known osWindows=1, // The evil empire osLinux=2, // Workhorse osMac=3, // ashion or Religion osOther=4 // Anything else }; enum browserType cgiClientBrowser(char **browserQualifier, enum osType *clientOs, char **clientOsQualifier); /* These routines abort the html output if the input isn't * there or is misformatted. */ #define cgiBrowser() cgiClientBrowser(NULL,NULL,NULL) char *cgiString(char *varName); int cgiInt(char *varName); double cgiDouble(char *varName); boolean cgiBoolean(char *varName); /* The cgiBoolean is a little problematic. If the variable * is TRUE it exists, but if it is false it is simply not * defined. cgiBoolean() thus returns FALSE if the CGI * variable doesn't exist or if it is set to FALSE. To * work around this when need be use cgiBooleanDefined(), * which relies on the fact that when we define a boolean * variable we also define a hidden variable. */ boolean cgiBooleanDefined(char *name); /* Return TRUE if boolean variable is defined (by * checking for shadow). */ char *cgiBooleanShadowPrefix(); /* Prefix for shadow variable set with boolean variables. */ void cgiMakeHiddenBoolean(char *name, boolean on); /* Make hidden boolean variable. Also make a shadow hidden variable so we * can distinguish between variable not present and * variable set to false. */ char *cgiMultListShadowPrefix(); /* Prefix for shadow variable set with multi-select inputs. */ int cgiIntExp(char *varName); /* Evaluate an integer expression in varName and * return value. */ char *cgiOptionalString(char *varName); /* Return value of string if it exists in cgi environment, else NULL */ char *cgiUsualString(char *varName, char *usual); /* Return value of string if it exists in cgi environment. * Otherwiser return 'usual' */ struct slName *cgiStringList(char *varName); /* Find list of cgi variables with given name. This * may be empty. Free result with slFreeList(). */ int cgiOptionalInt(char *varName, int defaultVal); /* This returns value of varName if it exists in cgi environment, * otherwise it returns defaultVal. */ double cgiOptionalDouble(char *varName, double defaultVal); /* Returns double value. */ #define cgiUsualInt cgiOptionalInt #define cgiUsualDouble cgiOptionalDouble struct cgiChoice /* Choice table */ { char *name; int value; }; int cgiOneChoice(char *varName, struct cgiChoice *choices, int choiceSize); /* Returns value associated with string variable in choice table. */ boolean cgiVarExists(char *varName); /* Returns TRUE if the variable was passed in. */ void cgiBadVar(char *varName); /* Complain about a variable that's not there. */ void cgiDecode(char *in, char *out, int inLength); /* Decode from cgi pluses-for-spaces format to normal. * Out will be a little shorter than in typically. */ void cgiDecodeFull(char *in, char *out, int inLength); /* Out will be a cgi-decoded version of in (no space from plus!). * Out will be a little shorter than in typically, and * can be the same buffer. */ char *cgiEncode(char *inString); /* Return a cgi-encoded version of inString. * Alphanumerics kept as is, space translated to plus, * and all other characters translated to %hexVal. * You can free return value with freeMem(). */ char *cgiEncodeFull(char *inString); /* Return a cgi-encoded version of inString (no + for space!). * Alphanumerics/./_ kept as is and all other characters translated to * %hexVal. */ void cgiMakeButtonWithMsg(char *name, char *value, char *msg); /* Make 'submit' type button. Display msg on mouseover, if present*/ void cgiMakeButtonWithOnClick(char *name, char *value, char *msg, char *onClick); /* Make 'submit' type button, with onclick javascript */ void cgiMakeButton(char *name, char *value); /* Make 'submit' type button. */ void cgiMakeOnClickButton(char *command, char *value); /* Make 'push' type button with client side onClick (java)script. */ void cgiMakeOnClickSubmitButton(char *command, char *name, char *value); /* Make submit button with both variable name and value with client side * onClick (java)script. */ void cgiMakeOptionalButton(char *name, char *value, boolean disabled); /* Make 'submit' type button that can be disabled. */ void cgiMakeRadioButton(char *name, char *value, boolean checked); /* Make radio type button. A group of radio buttons should have the * same name but different values. The default selection should be * sent with checked on. */ void cgiMakeOnClickRadioButton(char *name, char *value, boolean checked, char *command); /* Make radio type button with onClick command. * A group of radio buttons should have the * same name but different values. The default selection should be * sent with checked on. */ void cgiMakeCheckBoxUtil(char *name, boolean checked, char *msg, char *id); /* Make check box - can be called directly, though it was originally meant * as the common code for all lower level checkbox routines. * However, it's util functionality has been taken over by * cgiMakeCheckBoxWithIdAndOptionalHtml() */ void cgiMakeCheckBox(char *name, boolean checked); /* Make check box. */ void cgiMakeCheckBoxWithMsg(char *name, boolean checked, char *msg); /* Make check box, which includes a msg. */ void cgiMakeCheckBoxWithId(char *name, boolean checked, char *id); /* Make check box, which includes an ID. */ void cgiMakeCheckBoxJS(char *name, boolean checked, char *javascript); /* Make check box with javascript */ void cgiMakeCheckBoxIdAndJS(char *name, boolean checked, char *id, char *javascript); /* Make check box with ID and javascript. */ void cgiMakeCheckBoxFourWay(char *name, boolean checked, boolean enabled, char *id, char *classes, char *moreHtml); /* Make check box - with fourWay functionality (checked/unchecked by enabled/disabled * Also makes a shadow hidden variable that supports the 2 boolean states. */ void cgiMakeTextArea(char *varName, char *initialVal, int rowCount, int columnCount); /* Make a text area with area rowCount X columnCount and with text: intialVal. */ void cgiMakeTextAreaDisableable(char *varName, char *initialVal, int rowCount, int columnCount, boolean disabled); /* Make a text area that can be disabled. The rea has rowCount X * columnCount and with text: intialVal */ void cgiMakeTextVar(char *varName, char *initialVal, int charSize); /* Make a text control filled with initial value. If charSize * is zero it's calculated from initialVal size. */ void cgiMakeTextVarWithExtraHtml(char *varName, char *initialVal, int width, char *extra); /* Make a text control filled with initial value. */ void cgiMakeOnKeypressTextVar(char *varName, char *initialVal, int charSize, char *script); /* Make a text control filled with initial value, with a (java)script * to execute every time a key is pressed. If charSize is zero it's * calculated from initialVal size. */ void cgiMakeIntVar(char *varName, int initialVal, int maxDigits); /* Make a text control filled with initial integer value. */ #define NO_VALUE -96669 void cgiMakeIntVarInRange(char *varName, int initialVal, char *title, int width, char *min, char *max); /* Make a integer control filled with initial value. If min and/or max are non-NULL will enforce range Requires utils.js jQuery.js and inputBox class */ void cgiMakeIntVarWithLimits(char *varName, int initialVal, char *title, int width, int min, int max); void cgiMakeIntVarWithMin(char *varName, int initialVal, char *title, int width, int min); void cgiMakeIntVarWithMax(char *varName, int initialVal, char *title, int width, int max); #define cgiMakeIntVarNoLimits(varName,initialVal,title,width) \ cgiMakeIntVarInRange(varName,initialVal,title,width,NULL,NULL) /* All four of these call cgiMakeIntVarInRange() and therefore require utils.js */ void cgiMakeDoubleVar(char *varName, double initialVal, int maxDigits); /* Make a text control filled with initial floating-point value. */ void cgiMakeDoubleVarInRange(char *varName, double initialVal, char *title, int width, char *min, char *max); /* Make a floating point control filled with initial value. If min and/or max are non-NULL will enforce range Requires utils.js jQuery.js and inputBox class */ void cgiMakeDoubleVarWithLimits(char *varName, double initialVal, char *title, int width, double min, double max); void cgiMakeDoubleVarWithMin(char *varName, double initialVal, char *title, int width, double min); void cgiMakeDoubleVarWithMax(char *varName, double initialVal, char *title, int width, double max); #define cgiMakeDoubleVarNoLimits(varName,initialVal,title,width) \ cgiMakeDoubleVarInRange(varName,initialVal,title,width,NULL,NULL) /* All four of these call cgiMakeDoubleVarInRange() and therefore require utils.js */ void cgiMakeDropListClass(char *name, char *menu[], int menuSize, char *checked, char *class); /* Make a drop-down list with names and style sheet class. */ void cgiMakeDropList(char *name, char *menu[], int menuSize, char *checked); /* Make a drop-down list with names. * uses style "normalText" */ void cgiMakeDropListClassWithStyleAndJavascript(char *name, char *menu[], int menuSize, char *checked, char *class, char *style,char *javascript); /* Make a drop-down list with names, text class, style and javascript. */ void cgiMakeDropListClassWithStyle(char *name, char *menu[], int menuSize, char *checked, char *class, char *style); /* Make a drop-down list with names, text class and style. */ void cgiMakeDropListWithVals(char *name, char *menu[], char *values[], int menuSize, char *checked); /* Make a drop-down list with names and values. In this case checked * corresponds to a value, not a menu. */ void cgiMakeDropListFull(char *name, char *menu[], char *values[], int menuSize, char *checked, char *extraAttribs); /* Make a drop-down list with names and values. */ void cgiDropDownWithTextValsAndExtra(char *name, char *text[], char *values[], int count, char *selected, char *extra); /* Make a drop-down list with both text and values. */ char *cgiMakeSelectDropList(boolean multiple, char *name, struct slPair *valsAndLabels, char *selected, char *anyAll,char *extraClasses, char *extraHtml); // Returns allocated string of HTML defining a drop-down select // (if multiple, REQUIRES ui-dropdownchecklist.js) // valsAndLabels: val (pair->name) must be filled in but label (pair->val) may be NULL. // selected: if not NULL is a val found in the valsAndLabels (multiple then comma delimited list). // If null and anyAll not NULL, that will be selected // anyAll: if not NULL is the string for an initial option. It can contain val and label, // delimited by a comma // extraHtml: if not NULL contains id, javascript calls and style. // It does NOT contain class definitions #define cgiMakeMultiSelectDropList(name,valsAndLabels,selected,anyAll,extraClasses,extraHtml) \ cgiMakeSelectDropList(TRUE,(name),(valsAndLabels),(selected),(anyAll),\ (extraClasses),(extraHtml)) #define cgiMakeSingleSelectDropList(name,valsAndLabels,selected,anyAll,extraClasses,extraHtml) \ cgiMakeSelectDropList(FALSE,(name),(valsAndLabels),(selected),(anyAll),\ (extraClasses),(extraHtml)) void cgiMakeMultList(char *name, char *menu[], int menuSize, struct slName *checked, int length); /* Make a list of names which can have multiple selections. * Same as drop-down list except "multiple" is added to select tag */ void cgiMakeCheckboxGroup(char *name, char *menu[], int menuSize, struct slName *checked, int tableColumns); /* Make a table of checkboxes that have the same variable name but different * values (same behavior as a multi-select input). */ void cgiMakeCheckboxGroupWithVals(char *name, char *menu[], char *values[], int menuSize, struct slName *checked, int tableColumns); /* Make a table of checkboxes that have the same variable name but different * values (same behavior as a multi-select input), with nice labels in menu[]. */ void cgiMakeHiddenVarWithExtra(char *varName, char *string, char *extra); /* Store string in hidden input for next time around. */ #define cgiMakeHiddenVar(name,val) cgiMakeHiddenVarWithExtra((name),(val),NULL) /* Store string in hidden input for next time around. */ void cgiContinueHiddenVar(char *varName); /* Write CGI var back to hidden input for next time around. * (if it exists). */ void cgiContinueAllVars(); /* Write back all CGI vars as hidden input for next time around. */ void cgiVarExclude(char *varName); /* If varName exists, remove it. */ void cgiVarExcludeExcept(char **varNames); /* Exclude all variables except for those in NULL * terminated array varNames. varNames may be NULL * in which case nothing is excluded. */ void cgiVarSet(char *varName, char *val); /* Set a cgi variable to a particular value. */ struct dyString *cgiUrlString(); /* Get URL-formatted that expresses current CGI variable state. */ void cgiEncodeIntoDy(char *var, char *val, struct dyString *dy); /* Add a CGI-encoded &var=val string to dy. */ boolean cgiSpoof(int *pArgc, char *argv[]); /* Use the command line to set up things as if we were a CGI program. * User types in command line (assuming your program called cgiScript) * like: * cgiScript nonCgiArg1 var1=value1 var2=value2 var3=value3 nonCgiArg2 * or like * cgiScript nonCgiArg1 var1=value1&var2=value2&var3=value3 nonCgiArg2 * (The non-cgi arguments can occur anywhere. The cgi arguments (all containing * the character '=') are erased from argc/argv. Normally you call this * cgiSpoof(&argc, argv); */ boolean cgiFromCommandLine(int *pArgc, char *argv[], boolean preferWeb); /* Use the command line to set up things as if we were a CGI program. * If preferWeb is TRUE will choose real CGI variables over command * line ones. */ void useTempFile(); /* tell cheapcgi to use temp files */ boolean cgiFromFile(char *fileName); /* Set up a cgi environment using parameters stored in a file. * Takes file with arguments in the form: * argument1=someVal * # This is a comment * argument2=someOtherVal * ... * and puts them into the cgi environment so that the usual * cgiGetVar() commands can be used. Useful when a program * has a lot of possible parameters. */ boolean cgiParseInput(char *input, struct hash **retHash, struct cgiVar **retList); /* Parse cgi-style input into a hash table and list. This will alter * the input data. The hash table will contain references back * into input, so please don't free input until you're done with * the hash. Prints message and returns FALSE if there's an error. * To clean up - slFreeList, hashFree, and only then free input. */ void cgiParseInputAbort(char *input, struct hash **retHash, struct cgiVar **retList); /* Parse cgi-style input into a hash table and list as above but abort if there's an error. */ char *cgiStringNewValForVar(char *cgiIn, char *varName, char *newVal); /* Return a cgi-encoded string with newVal in place of what was oldVal. * It is an error for var not to exist. Do a freeMem of this string * when you are through. */ void cgiSimpleTableStart(); /* start HTML table -- no customization. Leaves room * for a fancier implementation */ void cgiTableEnd(); /* end HTML table */ void cgiMakeSubmitButton(); /* Make 'submit' type button. */ void cgiMakeResetButton(); /* Make 'reset' type button. */ void cgiMakeClearButton(char *form, char *field); /* Make button to clear a text field. */ void cgiMakeFileEntry(char *name); /* Make file entry box/browser */ void cgiSimpleTableRowStart(); /* Start table row */ void cgiTableRowEnd(); /* End table row */ void cgiSimpleTableFieldStart(); /* Start table field */ void cgiTableFieldStartAlignRight(); /* Start table field */ void cgiTableFieldEnd(); /* End table field */ void cgiTableField(char *text); /* Make table field entry */ void cgiTableFieldWithMsg(char *text, char *msg); /* Make table field entry with mouseover */ void cgiParagraph(char *text); /* Make text paragraph */ void logCgiToStderr(); /* Log useful CGI info to stderr */ void cgiResetState(); /* This is for reloading CGI settings multiple times in the same program * execution. No effect if state has not yet been initialized. */ void cgiDown(float lines); // Drop down a certain number of lines (may be fractional) char *commonCssStyles(); /* Returns a string of common CSS styles */ char *javaScriptLiteralEncode(char *inString); /* Use backslash escaping on newline * and quote chars, backslash and others. * Intended that the encoded string will be * put between quotes at a higher level and * then interpreted by Javascript. */ struct cgiParsedVars /* A parsed out cgi variable string */ { struct cgiParsedVars *next; /* In case want to make a list of these. */ char *stringBuf; /* Holds strings inside vars. */ struct cgiVar *list; /* List of variables. */ struct hash *hash; /* Keyed by varName, value is just value, not cgiVar. */ }; struct cgiParsedVars *cgiParsedVarsNew(char *cgiString); /* Build structure containing parsed out cgiString */ void cgiParsedVarsFree(struct cgiParsedVars **pTags); /* Free up memory associated with cgiParsedVars */ #endif /* CHEAPCGI_H */ rtracklayer/src/ucsc/cirTree.c0000644000175400017540000004650613556116552017434 0ustar00biocbuildbiocbuild/* cirTree chromosome id r tree. Part of a system to index chromosome ranges - things of * form chrN:start-end. Generally you'll be using the crTree module - which * makes use of this module and the bPlusTree module - rather than this module directly. * This module works with chromosomes mapped to small integers rather than chromosomes * as strings, saving space and speeding things up in the process, but requiring the * separate bPlusTree to map the names to IDs. * This module implements a one dimensional R-tree index treating the chromosome ID * as the most significant part of a two-part key, and the base position as the least * significant part of the key. */ /* Copyright (C) 2014 The Regents of the University of California * See README in this or parent directory for licensing information. */ #include "common.h" #include "localmem.h" #include "sig.h" #include "udc.h" #include "cirTree.h" struct rTree /* Recursive range structure. */ { struct rTree *next; /* Next on same level. */ struct rTree *children; /* Child list. */ struct rTree *parent; /* Our parent if any. */ bits32 startChromIx; /* Starting chromosome. */ bits32 startBase; /* Starting base position. */ bits32 endChromIx; /* Ending chromosome. */ bits32 endBase; /* Ending base. */ bits64 startFileOffset; /* Start offset in file for leaves. */ bits64 endFileOffset; /* End file offset for leaves. */ }; #define fileHeaderSize (48) /* Size of file header. */ #define indexSlotSize (24) /* Size of startChrom,startBase,endChrom,endBase,offset */ #define leafSlotSize (32) /* Size of startChrom,startBase,endChrom,endBase,offset,size */ #define nodeHeaderSize (4) /* Size of rTree node header. isLeaf,reserved,childCount. */ int indexNodeSize(int blockSize) /* Return size of an index node. */ { return nodeHeaderSize + indexSlotSize * blockSize; } int leafNodeSize(int blockSize) /* Return size of a leaf node. */ { return nodeHeaderSize + leafSlotSize * blockSize; } static bits64 rWriteIndexLevel(bits16 blockSize, int childNodeSize, struct rTree *tree, int curLevel, int destLevel, bits64 offsetOfFirstChild, FILE *f) /* Recursively write an index level, skipping levels below destLevel, * writing out destLevel. */ { struct rTree *el; bits64 offset = offsetOfFirstChild; if (curLevel == destLevel) { /* We've reached the right level, write out a node header */ UBYTE reserved = 0; UBYTE isLeaf = FALSE; bits16 countOne = slCount(tree->children); writeOne(f, isLeaf); writeOne(f, reserved); writeOne(f, countOne); /* Write out elements of this node. */ for (el = tree->children; el != NULL; el = el->next) { writeOne(f, el->startChromIx); writeOne(f, el->startBase); writeOne(f, el->endChromIx); writeOne(f, el->endBase); writeOne(f, offset); offset += childNodeSize; } /* Write out zeroes for empty slots in node. */ int i; for (i=countOne; ichildren; el != NULL; el = el->next) offset = rWriteIndexLevel(blockSize, childNodeSize, el, curLevel+1, destLevel, offset, f); } return offset; } static void writeIndexLevel(int blockSize, int childNodeSize, struct rTree *tree, bits64 offsetOfFirstChild, int level, FILE *f) /* Write out a non-leaf level nodes at given level. */ { rWriteIndexLevel(blockSize, childNodeSize, tree, 0, level, offsetOfFirstChild, f); } static void rWriteLeaves(int itemsPerSlot, int lNodeSize, struct rTree *tree, int curLevel, int leafLevel, FILE *f) /* Write out leaf-level nodes. */ { if (curLevel == leafLevel) { /* We've reached the right level, write out a node header. */ UBYTE reserved = 0; UBYTE isLeaf = TRUE; bits16 countOne = slCount(tree->children); writeOne(f, isLeaf); writeOne(f, reserved); writeOne(f, countOne); /* Write out elements of this node. */ struct rTree *el; for (el = tree->children; el != NULL; el = el->next) { writeOne(f, el->startChromIx); writeOne(f, el->startBase); writeOne(f, el->endChromIx); writeOne(f, el->endBase); writeOne(f, el->startFileOffset); bits64 size = el->endFileOffset - el->startFileOffset; writeOne(f, size); } /* Write out zeroes for empty slots in node. */ int i; for (i=countOne; ichildren; el != NULL; el = el->next) rWriteLeaves(itemsPerSlot, lNodeSize, el, curLevel+1, leafLevel, f); } } static void writeLeaves(int itemsPerSlot, int lNodeSize, struct rTree *tree, int leafLevel, FILE *f) /* Write out leaf-level nodes. */ { rWriteLeaves(itemsPerSlot, lNodeSize, tree, 0, leafLevel, f); } void calcLevelSizes(struct rTree *tree, int *levelSizes, int level, int maxLevel) /* Recursively count sizes of levels and add to appropriate slots of levelSizes */ { struct rTree *el; for (el = tree; el != NULL; el = el->next) { levelSizes[level] += 1; if (level < maxLevel) calcLevelSizes(el->children, levelSizes, level+1, maxLevel); } } static struct rTree *rTreeFromChromRangeArray( struct lm *lm, int blockSize, int itemsPerSlot, void *itemArray, int itemSize, bits64 itemCount, void *context, struct cirTreeRange (*fetchKey)(const void *va, void *context), bits64 (*fetchOffset)(const void *va, void *context), bits64 endFileOffset, int *retLevelCount) { if (itemCount == 0) return NULL; char *items = itemArray; struct rTree *el, *list=NULL, *tree = NULL; /* Make first level above leaf. */ bits64 i; bits64 nextOffset = (*fetchOffset)(items, context); int oneSize = 0; for (i=0; istartChromIx = el->endChromIx = key.chromIx; el->startBase = key.start; el->endBase = key.end; el->startFileOffset = nextOffset; oneSize = 1; char *endItem = startItem; int j; for (j=i+1; jstartFileOffset) break; else oneSize++; } if (j == itemCount) { nextOffset = endFileOffset; } el->endFileOffset = nextOffset; /* Expand area spanned to include all items in block. */ for (j=1; jstartChromIx) { el->startChromIx = key.chromIx; el->startBase = key.start; } else if (key.chromIx == el->startChromIx) { if (key.start < el->startBase) el->startBase = key.start; } if (key.chromIx > el->endChromIx) { el->endChromIx = key.chromIx; el->endBase = key.end; } else if (key.chromIx == el->endChromIx) { if (key.end > el->endBase) el->endBase = key.end; } } } slReverse(&list); verbose(2, "Made %d primary index nodes out of %llu items\n", slCount(list), itemCount); /* Now iterate through making more and more condensed versions until have just one. */ int levelCount = 1; tree = list; while (tree->next != NULL || levelCount < 2) { list = NULL; int slotsUsed = blockSize; struct rTree *parent = NULL, *next; for (el = tree; el != NULL; el = next) { next = el->next; if (slotsUsed >= blockSize) { slotsUsed = 1; lmAllocVar(lm, parent); parent = lmCloneMem(lm, el, sizeof(*el)); parent->children = el; el->parent = parent; el->next = NULL; slAddHead(&list, parent); } else { ++slotsUsed; slAddHead(&parent->children, el); el->parent = parent; if (el->startChromIx < parent->startChromIx) { parent->startChromIx = el->startChromIx; parent->startBase = el->startBase; } else if (el->startChromIx == parent->startChromIx) { if (el->startBase < parent->startBase) parent->startBase = el->startBase; } if (el->endChromIx > parent->endChromIx) { parent->endChromIx = el->endChromIx; parent->endBase = el->endBase; } else if (el->endChromIx == parent->endChromIx) { if (el->endBase > parent->endBase) parent->endBase = el->endBase; } } } slReverse(&list); for (el = list; el != NULL; el = el->next) slReverse(&el->children); tree = list; levelCount += 1; } *retLevelCount = levelCount; return tree; } static void writeTreeToOpenFile(struct rTree *tree, int blockSize, int levelCount, FILE *f) /* Write out tree to a file that is open already - writing out index nodes from * highest to lowest level, and then leaf nodes. */ { /* Calculate sizes of each level. */ int i; int levelSizes[levelCount]; for (i=0; istartChromIx); writeOne(f, tree->startBase); writeOne(f, tree->endChromIx); writeOne(f, tree->endBase); writeOne(f, endFileOffset); writeOne(f, itemsPerSlot); writeOne(f, reserved); if (tree != &dummyTree) writeTreeToOpenFile(tree, blockSize, levelCount, f); lmCleanup(&lm); } void cirTreeFileCreate( void *itemArray, /* Sorted array of things to index. */ int itemSize, /* Size of each element in array. */ bits64 itemCount, /* Number of elements in array. */ bits32 blockSize, /* R tree block size - # of children for each node. */ bits32 itemsPerSlot, /* Number of items to put in each index slot at lowest level. */ void *context, /* Context pointer for use by fetch call-back functions. */ struct cirTreeRange (*fetchKey)(const void *va, void *context),/* Given item, return key. */ bits64 (*fetchOffset)(const void *va, void *context), /* Given item, return file offset */ bits64 endFileOffset, /* Last position in file we index. */ char *fileName) /* Name of output file. */ /* Create a r tree index file from a sorted array. */ { FILE *f = mustOpen(fileName, "wb"); cirTreeFileBulkIndexToOpenFile(itemArray, itemSize, itemCount, blockSize, itemsPerSlot, context, fetchKey, fetchOffset, endFileOffset, f); carefulClose(&f); } struct cirTreeFile *cirTreeFileAttach(char *fileName, struct udcFile *udc) /* Open up r-tree index file on previously open file, with cirTree * header at current file position. */ { /* Open file and allocate structure to hold info from header etc. */ struct cirTreeFile *crt = needMem(sizeof(*crt)); crt->fileName = fileName; crt->udc = udc; /* Read magic number at head of file and use it to see if we are proper file type, and * see if we are byte-swapped. */ bits32 magic; boolean isSwapped = FALSE; udcMustReadOne(udc, magic); if (magic != cirTreeSig) { magic = byteSwap32(magic); isSwapped = crt->isSwapped = TRUE; if (magic != cirTreeSig) errAbort("%s is not a chromosome id r-tree index file", fileName); } /* Read rest of defined bits of header, byte swapping as needed. */ crt->blockSize = udcReadBits32(udc, isSwapped); crt->itemCount = udcReadBits64(udc, isSwapped); crt->startChromIx = udcReadBits32(udc, isSwapped); crt->startBase = udcReadBits32(udc, isSwapped); crt->endChromIx = udcReadBits32(udc, isSwapped); crt->endBase = udcReadBits32(udc, isSwapped); crt->fileSize = udcReadBits64(udc, isSwapped); crt->itemsPerSlot = udcReadBits32(udc, isSwapped); /* Skip over reserved bits of header. */ bits32 reserved32; udcMustReadOne(udc, reserved32); /* Save position of root block of r tree. */ crt->rootOffset = udcTell(udc); return crt; } struct cirTreeFile *cirTreeFileOpen(char *fileName) /* Open up r-tree index file - reading header and verifying things. */ { return cirTreeFileAttach(cloneString(fileName), udcFileOpen(fileName, udcDefaultDir())); } void cirTreeFileDetach(struct cirTreeFile **pCrt) /* Detatch and free up cirTree file opened with cirTreeFileAttach. */ { freez(pCrt); } void cirTreeFileClose(struct cirTreeFile **pCrt) /* Close and free up cirTree file opened with cirTreeFileAttach. */ { struct cirTreeFile *crt = *pCrt; if (crt != NULL) { freez(&crt->fileName); udcFileClose(&crt->udc); cirTreeFileDetach(pCrt); } } INLINE int cmpTwoBits32(bits32 aHi, bits32 aLo, bits32 bHi, bits32 bLo) /* Return - if b is less than a , 0 if equal, else +*/ { if (aHi < bHi) return 1; else if (aHi > bHi) return -1; else { if (aLo < bLo) return 1; else if (aLo > bLo) return -1; else return 0; } } INLINE boolean cirTreeOverlaps(int qChrom, int qStart, int qEnd, int rStartChrom, int rStartBase, int rEndChrom, int rEndBase) { return cmpTwoBits32(qChrom, qStart, rEndChrom, rEndBase) > 0 && cmpTwoBits32(qChrom, qEnd, rStartChrom, rStartBase) < 0; } static void rFindOverlappingBlocks(struct cirTreeFile *crt, int level, bits64 indexFileOffset, bits32 chromIx, bits32 start, bits32 end, struct fileOffsetSize **retList) /* Recursively find blocks with data. */ { struct udcFile *udc = crt->udc; /* Seek to start of block. */ udcSeek(udc, indexFileOffset); /* Read block header. */ UBYTE isLeaf; UBYTE reserved; bits16 i, childCount; udcMustReadOne(udc, isLeaf); udcMustReadOne(udc, reserved); boolean isSwapped = crt->isSwapped; childCount = udcReadBits16(udc, isSwapped); verbose(3, "rFindOverlappingBlocks %llu %u:%u-%u. childCount %d. isLeaf %d\n", indexFileOffset, chromIx, start, end, (int)childCount, (int)isLeaf); if (isLeaf) { /* Loop through node adding overlapping leaves to block list. */ for (i=0; ioffset = offset; block->size = size; slAddHead(retList, block); } } } else { /* Read node into arrays. */ bits32 startChromIx[childCount], startBase[childCount]; bits32 endChromIx[childCount], endBase[childCount]; bits64 offset[childCount]; for (i=0; irootOffset, chromIx, start, end, &blockList); slReverse(&blockList); return blockList; } static void rEnumerateBlocks(struct cirTreeFile *crt, int level, bits64 indexFileOffset, struct fileOffsetSize **retList) /* Recursively find blocks with data. */ { struct udcFile *udc = crt->udc; /* Seek to start of block. */ udcSeek(udc, indexFileOffset); /* Read block header. */ UBYTE isLeaf; UBYTE reserved; bits16 i, childCount; udcMustReadOne(udc, isLeaf); udcMustReadOne(udc, reserved); boolean isSwapped = crt->isSwapped; childCount = udcReadBits16(udc, isSwapped); verbose(3, "rEnumerateBlocks %llu childCount %d. isLeaf %d\n", indexFileOffset, (int)childCount, (int)isLeaf); if (isLeaf) { /* Loop through node adding overlapping leaves to block list. */ for (i=0; ioffset = offset; block->size = size; slAddHead(retList, block); } } else { /* Read node into arrays. */ bits64 offset[childCount]; for (i=0; irootOffset, &blockList); slReverse(&blockList); return blockList; } rtracklayer/src/ucsc/cirTree.h0000644000175400017540000001015413556116552017427 0ustar00biocbuildbiocbuild/* cirTree chromosome id r tree. Part of a system to index chromosome ranges - things of * form chrN:start-end. Generally you'll be using the crTree module - which * makes use of this module and the bPlusTree module - rather than this module directly. * This module works with chromosomes mapped to small integers rather than chromosomes * as strings, saving space and speeding things up in the process, but requiring the * separate bPlusTree to map the names to IDs. * This module implements a one dimensional R-tree index treating the chromosome ID * as the most significant part of a two-part key, and the base position as the least * significant part of the key. */ #ifndef CIRTREE_H #define CIRTREE_H struct cirTreeFile /* R tree index file handle. */ { struct cirTreeFile *next; /* Next in list of index files if any. */ char *fileName; /* Name of file - for error reporting. */ struct udcFile *udc; /* Open file pointer. */ boolean isSwapped; /* If TRUE need to byte swap everything. */ bits64 rootOffset; /* Offset of root block. */ bits32 blockSize; /* Size of block. */ bits64 itemCount; /* Number of items indexed. */ bits32 startChromIx; /* First chromosome in file. */ bits32 startBase; /* Starting base position. */ bits32 endChromIx; /* Ending chromosome in file. */ bits32 endBase; /* Ending base position. */ bits64 fileSize; /* Total size of index file. */ bits32 itemsPerSlot; /* Max number of items to put in each index slot at lowest level. */ }; struct cirTreeFile *cirTreeFileOpen(char *fileName); /* Open up r-tree index file - reading header and verifying things. */ void cirTreeFileClose(struct cirTreeFile **pCrt); /* Close and free up cirTree file opened with cirTreeFileAttach. */ struct cirTreeFile *cirTreeFileAttach(char *fileName, struct udcFile *udc); /* Open up r-tree index file on previously open file, with cirTree * header at current file position. */ void cirTreeFileDetach(struct cirTreeFile **pCrt); /* Detach and free up cirTree file opened with cirTreeFileAttach. */ struct fileOffsetSize *cirTreeFindOverlappingBlocks(struct cirTreeFile *crf, bits32 chromIx, bits32 start, bits32 end); /* Return list of file blocks that between them contain all items that overlap * start/end on chromIx. Also there will be likely some non-overlapping items * in these blocks too. When done, use slListFree to dispose of the result. */ struct fileOffsetSize *cirTreeEnumerateBlocks(struct cirTreeFile *crf); /* Return list of file blocks. When done, use slListFree to dispose of the result. */ struct cirTreeRange /* A chromosome id and an interval inside it. */ { bits32 chromIx; /* Chromosome id. */ bits32 start; /* Start position in chromosome. */ bits32 end; /* One past last base in interval in chromosome. */ }; void cirTreeFileBulkIndexToOpenFile( void *itemArray, int itemSize, bits64 itemCount, bits32 blockSize, bits32 itemsPerSlot, void *context, struct cirTreeRange (*fetchKey)(const void *va, void *context), bits64 (*fetchOffset)(const void *va, void *context), bits64 endFileOffset, FILE *f); /* Create a r tree index from a sorted array, writing output starting at current position * of an already open file. See cirTreeFileCreate for explanation of parameters. */ void cirTreeFileCreate( void *itemArray, /* Sorted array of things to index. Sort on chromIx,start. */ int itemSize, /* Size of each element in array. */ bits64 itemCount, /* Number of elements in array. */ bits32 blockSize, /* R tree block size - # of children for each node. */ bits32 itemsPerSlot, /* Number of items to put in each index slot at lowest level. */ void *context, /* Context pointer for use by fetch call-back functions. */ struct cirTreeRange (*fetchKey)(const void *va, void *context),/* Given item, return key. */ bits64 (*fetchOffset)(const void *va, void *context), /* Given item, return file offset */ bits64 endFileOffset, /* Last position in file we index. */ char *fileName); /* Name of output file. */ /* Create a r tree index file from a sorted array. */ #endif /* CIRTREE_H */ rtracklayer/src/ucsc/common.c0000644000175400017540000023541213556116552017323 0ustar00biocbuildbiocbuild/* Commonly used routines in a wide range of applications. * Strings, singly-linked lists, and a little file i/o. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include "common.h" #include "errAbort.h" #include "portable.h" #include "linefile.h" #include "hash.h" void *cloneMem(void *pt, size_t size) /* Allocate a new buffer of given size, and copy pt to it. */ { void *newPt = needLargeMem(size); memcpy(newPt, pt, size); return newPt; } static char *cloneStringZExt(const char *s, int size, int copySize) /* Make a zero terminated copy of string in memory */ { char *d = needMem(copySize+1); copySize = min(size,copySize); memcpy(d, s, copySize); d[copySize] = 0; return d; } char *cloneStringZ(const char *s, int size) /* Make a zero terminated copy of string in memory */ { return cloneStringZExt(s, strlen(s), size); } char *cloneString(const char *s) /* Make copy of string in dynamic memory */ { int size = 0; if (s == NULL) return NULL; size = strlen(s); return cloneStringZExt(s, size, size); } char *cloneLongString(char *s) /* Make clone of long string. */ { size_t size = strlen(s); return cloneMem(s, size+1); } char *catTwoStrings(char *a, char *b) /* Allocate new string that is a concatenation of two strings. */ { int aLen = strlen(a), bLen = strlen(b); int len = aLen + bLen; char *newBuf = needLargeMem(len+1); memcpy(newBuf, a, aLen); memcpy(newBuf+aLen, b, bLen); newBuf[len] = 0; return newBuf; } /* Reverse the order of the bytes. */ void reverseBytes(char *bytes, long length) { long halfLen = (length>>1); char *end = bytes+length; char c; while (--halfLen >= 0) { c = *bytes; *bytes++ = *--end; *end = c; } } void reverseInts(int *a, int length) /* Reverse the order of the integer array. */ { int halfLen = (length>>1); int *end = a+length; int c; while (--halfLen >= 0) { c = *a; *a++ = *--end; *end = c; } } void reverseUnsigned(unsigned *a, int length) /* Reverse the order of the unsigned array. */ { int halfLen = (length>>1); unsigned *end = a+length; unsigned c; while (--halfLen >= 0) { c = *a; *a++ = *--end; *end = c; } } void reverseDoubles(double *a, int length) /* Reverse the order of the double array. */ { int halfLen = (length>>1); double *end = a+length; double c; while (--halfLen >= 0) { c = *a; *a++ = *--end; *end = c; } } void reverseStrings(char **a, int length) /* Reverse the order of the char* array. */ { int halfLen = (length>>1); char **end = a+length; char *c; while (--halfLen >= 0) { c = *a; *a++ = *--end; *end = c; } } /* Swap buffers a and b. */ void swapBytes(char *a, char *b, int length) { char c; int i; for (i=0; inext; } return len; } void *slElementFromIx(void *list, int ix) /* Return the ix'th element in list. Returns NULL * if no such element. */ { struct slList *pt = (struct slList *)list; int i; for (i=0;inext; } return pt; } int slIxFromElement(void *list, void *el) /* Return index of el in list. Returns -1 if not on list. */ { struct slList *pt; int ix = 0; for (pt = list, ix=0; pt != NULL; pt = pt->next, ++ix) if (el == (void*)pt) return ix; return -1; } void *slLastEl(void *list) /* Returns last element in list or NULL if none. */ { struct slList *next, *el; if ((el = list) == NULL) return NULL; while ((next = el->next) != NULL) el = next; return el; } /* Add new node to tail of list. * Usage: * slAddTail(&list, node); * where list and nodes are both pointers to structure * that begin with a next pointer. */ void slAddTail(void *listPt, void *node) { struct slList **ppt = (struct slList **)listPt; struct slList *n = (struct slList *)node; while (*ppt != NULL) { ppt = &((*ppt)->next); } n->next = NULL; *ppt = n; } void *slPopHead(void *vListPt) /* Return head of list and remove it from list. (Fast) */ { struct slList **listPt = (struct slList **)vListPt; struct slList *el = *listPt; if (el != NULL) { *listPt = el->next; el->next = NULL; } return el; } void *slPopTail(void *vListPt) /* Return tail of list and remove it from list. (Not so fast) */ { struct slList **listPt = (struct slList **)vListPt; struct slList *el = *listPt; if (el != NULL) { for (;;) { if (el->next == NULL) { *listPt = NULL; break; } listPt = &el->next; el = el->next; } } return el; } void *slCat(void *va, void *vb) /* Return concatenation of lists a and b. * Example Usage: * struct slName *a = getNames("a"); * struct slName *b = getNames("b"); * struct slName *ab = slCat(a,b) */ { struct slList *a = va; struct slList *b = vb; struct slList *end; if (a == NULL) return b; for (end = a; end->next != NULL; end = end->next) ; end->next = b; return a; } void slReverse(void *listPt) /* Reverse order of a list. * Usage: * slReverse(&list); */ { struct slList **ppt = (struct slList **)listPt; struct slList *newList = NULL; struct slList *el, *next; next = *ppt; while (next != NULL) { el = next; next = el->next; el->next = newList; newList = el; } *ppt = newList; } void slFreeList(void *listPt) /* Free list */ { struct slList **ppt = (struct slList**)listPt; struct slList *next = *ppt; struct slList *el; while (next != NULL) { el = next; next = el->next; freeMem((char*)el); } *ppt = NULL; } void slSort(void *pList, int (*compare )(const void *elem1, const void *elem2)) /* Sort a singly linked list with Qsort and a temporary array. */ { struct slList **pL = (struct slList **)pList; struct slList *list = *pL; int count; count = slCount(list); if (count > 1) { struct slList *el; struct slList **array; int i; array = needLargeMem(count * sizeof(*array)); for (el = list, i=0; el != NULL; el = el->next, i++) array[i] = el; qsort(array, count, sizeof(array[0]), compare); list = NULL; for (i=0; inext = list; list = array[i]; } freeMem(array); slReverse(&list); *pL = list; } } void slUniqify(void *pList, int (*compare )(const void *elem1, const void *elem2), void (*free)()) /* Return sorted list with duplicates removed. * Compare should be same type of function as slSort's compare (taking * pointers to pointers to elements. Free should take a simple * pointer to dispose of duplicate element, and can be NULL. */ { struct slList **pSlList = (struct slList **)pList; struct slList *oldList = *pSlList; struct slList *newList = NULL, *el; slSort(&oldList, compare); while ((el = slPopHead(&oldList)) != NULL) { if ((newList == NULL) || (compare(&newList, &el) != 0)) slAddHead(&newList, el); else if (free != NULL) free(el); } slReverse(&newList); *pSlList = newList; } void slSortMerge(void *pA, void *b, CmpFunction *compare) // Merges and sorts a pair of singly linked lists using slSort. { struct slList **pList = (struct slList **)pA; slCat(*pList, b); slSort(pList,compare); } void slSortMergeUniq(void *pA, void *b, CmpFunction *compare, void (*free)()) // Merges and sorts a pair of singly linked lists leaving only unique // items via slUniqufy. duplicate itens are defined by the compare routine // returning 0. If free is provided, items dropped from list can disposed of. { struct slList **pList = (struct slList **)pA; slCat(*pList, b); slUniqify(pList,compare,free); } boolean slRemoveEl(void *vpList, void *vToRemove) /* Remove element from singly linked list. Usage: * slRemove(&list, el); * Returns TRUE if element in list. */ { struct slList **pList = vpList; struct slList *toRemove = vToRemove; struct slList *el, *next, *newList = NULL; boolean didRemove = FALSE; for (el = *pList; el != NULL; el = next) { next = el->next; if (el != toRemove) { slAddHead(&newList, el); } else didRemove = TRUE; } slReverse(&newList); *pList = newList; return didRemove; } struct slInt *slIntNew(int x) /* Return a new int. */ { struct slInt *a; AllocVar(a); a->val = x; return a; } int slIntCmp(const void *va, const void *vb) /* Compare two slInts. */ { const struct slInt *a = *((struct slInt **)va); const struct slInt *b = *((struct slInt **)vb); return a->val - b->val; } int slIntCmpRev(const void *va, const void *vb) /* Compare two slInts in reverse direction. */ { const struct slInt *a = *((struct slInt **)va); const struct slInt *b = *((struct slInt **)vb); return b->val - a->val; } struct slInt * slIntFind(struct slInt *list, int target) /* Find target in slInt list or return NULL */ { struct slInt *i; for (i=list;i;i=i->next) if (i->val == target) return i; return NULL; } struct slUnsigned *slUnsignedNew(unsigned x) /* Return a new int. */ { struct slUnsigned *a; AllocVar(a); a->val = x; return a; } static int doubleCmp(const void *va, const void *vb) /* Compare function to sort array of doubles. */ { const double *a = va; const double *b = vb; double diff = *a - *b; if (diff < 0) return -1; else if (diff > 0) return 1; else return 0; } void doubleSort(int count, double *array) /* Sort an array of doubles. */ { if (count > 1) qsort(array, count, sizeof(array[0]), doubleCmp); } double doubleMedian(int count, double *array) /* Return median value in array. This will sort * the array as a side effect. */ { double median; doubleSort(count, array); if ((count&1) == 1) median = array[count>>1]; else { count >>= 1; median = (array[count] + array[count-1]) * 0.5; } return median; } void doubleBoxWhiskerCalc(int count, double *array, double *retMin, double *retQ1, double *retMedian, double *retQ3, double *retMax) /* Calculate what you need to draw a box and whiskers plot from an array of doubles. */ { if (count <= 0) errAbort("doubleBoxWhiskerCalc needs a positive number, not %d for count", count); if (count == 1) { *retMin = *retQ1 = *retMedian = *retQ3 = *retMax = array[0]; return; } doubleSort(count, array); double min = array[0]; double max = array[count-1]; double median; int halfCount = count>>1; if ((count&1) == 1) median = array[halfCount]; else { median = (array[halfCount] + array[halfCount-1]) * 0.5; } double q1, q3; if (count <= 3) { q1 = 0.5 * (median + min); q3 = 0.5 * (median + max); } else { int q1Ix = count/4; int q3Ix = count - 1 - q1Ix; uglyf("count %d, q1Ix %d, q3Ix %d\n", count, q1Ix, q3Ix); q1 = array[q1Ix]; q3 = array[q3Ix]; } *retMin = min; *retQ1 = q1; *retMedian = median; *retQ3 = q3; *retMax = max; } struct slDouble *slDoubleNew(double x) /* Return a new double. */ { struct slDouble *a; AllocVar(a); a->val = x; return a; } int slDoubleCmp(const void *va, const void *vb) /* Compare two slDoubles. */ { const struct slDouble *a = *((struct slDouble **)va); const struct slDouble *b = *((struct slDouble **)vb); double diff = a->val - b->val; if (diff < 0) return -1; else if (diff > 0) return 1; else return 0; } double slDoubleMedian(struct slDouble *list) /* Return median value on list. */ { int i,count = slCount(list); struct slDouble *el; double *array, median; if (count == 0) errAbort("Can't take median of empty list"); AllocArray(array,count); for (i=0, el=list; inext) array[i] = el->val; median = doubleMedian(count, array); freeMem(array); return median; } void slDoubleBoxWhiskerCalc(struct slDouble *list, double *retMin, double *retQ1, double *retMedian, double *retQ3, double *retMax) /* Calculate what you need to draw a box and whiskers plot from a list of slDoubles. */ { int i,count = slCount(list); struct slDouble *el; double *array; if (count == 0) errAbort("Can't take do slDoubleBoxWhiskerCalc of empty list"); AllocArray(array,count); for (i=0, el=list; inext) array[i] = el->val; doubleBoxWhiskerCalc(count, array, retMin, retQ1, retMedian, retQ3, retMax); freeMem(array); } static int intCmp(const void *va, const void *vb) /* Compare function to sort array of ints. */ { const int *a = va; const int *b = vb; int diff = *a - *b; if (diff < 0) return -1; else if (diff > 0) return 1; else return 0; } void intSort(int count, int *array) /* Sort an array of ints. */ { if (count > 1) qsort(array, count, sizeof(array[0]), intCmp); } int intMedian(int count, int *array) /* Return median value in array. This will sort * the array as a side effect. */ { int median; intSort(count, array); if ((count&1) == 1) median = array[count>>1]; else { count >>= 1; median = (array[count] + array[count-1]) * 0.5; } return median; } struct slName *newSlName(char *name) /* Return a new name. */ { struct slName *sn; if (name != NULL) { int len = strlen(name); sn = needMem(sizeof(*sn)+len); strcpy(sn->name, name); return sn; } else { AllocVar(sn); } return sn; } struct slName *slNameNewN(char *name, int size) /* Return new slName of given size. */ { struct slName *sn = needMem(sizeof(*sn) + size); memcpy(sn->name, name, size); return sn; } int slNameCmpCase(const void *va, const void *vb) /* Compare two slNames, ignore case. */ { const struct slName *a = *((struct slName **)va); const struct slName *b = *((struct slName **)vb); return strcasecmp(a->name, b->name); } void slNameSortCase(struct slName **pList) /* Sort slName list, ignore case. */ { slSort(pList, slNameCmpCase); } int slNameCmp(const void *va, const void *vb) /* Compare two slNames. */ { const struct slName *a = *((struct slName **)va); const struct slName *b = *((struct slName **)vb); return strcmp(a->name, b->name); } int slNameCmpStringsWithEmbeddedNumbers(const void *va, const void *vb) /* Compare strings such as gene names that may have embedded numbers, * so that bmp4a comes before bmp14a */ { const struct slName *a = *((struct slName **)va); const struct slName *b = *((struct slName **)vb); return cmpStringsWithEmbeddedNumbers(a->name, b->name); } void slNameSort(struct slName **pList) /* Sort slName list. */ { slSort(pList, slNameCmp); } boolean slNameInList(struct slName *list, char *string) /* Return true if string is in name list -- case insensitive. */ { struct slName *el; for (el = list; el != NULL; el = el->next) if (sameWord(string, el->name)) return TRUE; return FALSE; } boolean slNameInListUseCase(struct slName *list, char *string) /* Return true if string is in name list -- case sensitive. */ { struct slName *el; for (el = list; el != NULL; el = el->next) if (string != NULL && !strcmp(string, el->name)) return TRUE; return FALSE; } void *slNameFind(void *list, char *string) /* Return first element of slName list (or any other list starting * with next/name fields) that matches string. */ { struct slName *el; for (el = list; el != NULL; el = el->next) if (sameWord(string, el->name)) return el; return NULL; } int slNameFindIx(struct slName *list, char *string) /* Return index of first element of slName list (or any other * list starting with next/name fields) that matches string. * Return -1 if not found. */ { struct slName *el; int ix = 0; for (el = list; el != NULL; el = el->next, ix++) if (sameString(string, el->name)) return ix; return -1; } char *slNameStore(struct slName **pList, char *string) /* Put string into list if it's not there already. * Return the version of string stored in list. */ { struct slName *el; for (el = *pList; el != NULL; el = el->next) { if (sameString(string, el->name)) return el->name; } el = newSlName(string); slAddHead(pList, el); return el->name; } struct slName *slNameAddHead(struct slName **pList, char *name) /* Add name to start of list and return it. */ { struct slName *el = slNameNew(name); slAddHead(pList, el); return el; } struct slName *slNameAddTail(struct slName **pList, char *name) /* Add name to end of list (not efficient for long lists), * and return it. */ { struct slName *el = slNameNew(name); slAddTail(pList, el); return el; } struct slName *slNameCloneList(struct slName *list) /* Return clone of list. */ { struct slName *el, *newEl, *newList = NULL; for (el = list; el != NULL; el = el->next) { newEl = slNameNew(el->name); slAddHead(&newList, newEl); } slReverse(&newList); return newList; } struct slName *slNameListFromString(char *s, char delimiter) /* Return list of slNames gotten from parsing delimited string. * The final delimiter is optional. a,b,c and a,b,c, are equivalent * for comma-delimited lists. */ { char *e; struct slName *list = NULL, *el; while (s != NULL && s[0] != 0) { e = strchr(s, delimiter); if (e == NULL) el = slNameNew(s); else { el = slNameNewN(s, e-s); e += 1; } slAddHead(&list, el); s = e; } slReverse(&list); return list; } struct slName *slNameListOfUniqueWords(char *text,boolean respectQuotes) // Return list of unique words found by parsing string delimited by whitespace. // If respectQuotes then ["Lucy and Ricky" 'Fred and Ethyl'] will yield 2 slNames no quotes { struct slName *list = NULL; char *word = NULL; while (text != NULL) { if (respectQuotes) { word = nextWordRespectingQuotes(&text); if (word != NULL) { if (word[0] == '"') stripChar(word, '"'); else if (word[0] == '\'') stripChar(word, '\''); } } else word = nextWord(&text); if (word) slNameStore(&list, word); else break; } slReverse(&list); return list; } struct slName *slNameListFromStringArray(char *stringArray[], int arraySize) /* Return list of slNames from an array of strings of length arraySize. * If a string in the array is NULL, the array will be treated as * NULL-terminated (shorter than arraySize). */ { char *s; struct slName *list = NULL, *el; int i; if (stringArray == NULL) return NULL; for (i = 0; i < arraySize; i++) { s = stringArray[i]; if (s == NULL) break; el = slNameNew(s); slAddHead(&list, el); } slReverse(&list); return list; } char *slNameListToString(struct slName *list, char delimiter) /* Return string created by joining all names with the delimiter. */ { struct slName *el; int elCount = 0; int len = 0; char del[2]; char *s; del[0] = delimiter; del[1] = '\0'; for (el = list; el != NULL; el = el->next, elCount++) len += strlen(el->name); len += elCount; AllocArray(s, len); for (el = list; el != NULL; el = el->next) { strcat(s, el->name); if (el->next != NULL) strcat(s, del); } return s; } struct slName *slNameLoadReal(char *fileName) /* load file lines that are not blank or start with a '#' into a slName * list */ { struct slName *lines = NULL; char *line; struct lineFile *lf = lineFileOpen(fileName, TRUE); while (lineFileNextReal(lf, &line)) slSafeAddHead(&lines, slNameNew(line)); lineFileClose(&lf); slReverse(&lines); return lines; } struct slName *slNameIntersection(struct slName *a, struct slName *b) /* return intersection of two slName lists. */ { struct hash *hashA = newHash(0); struct slName *el, *retval = NULL; for (el = a; el != NULL; el = el->next) hashAddInt(hashA, el->name, 1); for (el = b; el != NULL; el = el->next) if(hashLookup(hashA, el->name) != NULL) slNameAddHead(&retval, el->name); hashFree(&hashA); return retval; } struct slRef *refOnList(struct slRef *refList, void *val) /* Return ref if val is already on list, otherwise NULL. */ { struct slRef *ref; for (ref = refList; ref != NULL; ref = ref->next) if (ref->val == val) return ref; return NULL; } struct slRef *slRefNew(void *val) /* Create new slRef element. */ { struct slRef *ref; AllocVar(ref); ref->val = val; return ref; } void refAdd(struct slRef **pRefList, void *val) /* Add reference to list. */ { struct slRef *ref; AllocVar(ref); ref->val = val; slAddHead(pRefList, ref); } void refAddUnique(struct slRef **pRefList, void *val) /* Add reference to list if not already on list. */ { if (refOnList(*pRefList, val) == NULL) { refAdd(pRefList, val); } } void slRefFreeListAndVals(struct slRef **pList) /* Free up (with simple freeMem()) each val on list, and the list itself as well. */ { struct slRef *el, *next; for (el = *pList; el != NULL; el = next) { next = el->next; freeMem(el->val); freeMem(el); } *pList = NULL; } struct slRef *refListFromSlList(void *list) /* Make a reference list that mirrors a singly-linked list. */ { struct slList *el; struct slRef *refList = NULL, *ref; for (el= list; el != NULL; el = el->next) { ref = slRefNew(el); slAddHead(&refList, ref); } slReverse(&refList); return refList; } struct slPair *slPairNew(char *name, void *val) /* Allocate new name/value pair. */ { struct slPair *el; AllocVar(el); el->name = cloneString(name); el->val = val; return el; } void slPairAdd(struct slPair **pList, char *name, void *val) /* Add new slPair to head of list. */ { struct slPair *el = slPairNew(name, val); slAddHead(pList, el); } void slPairFree(struct slPair **pEl) /* Free up struct and name. (Don't free up values.) */ { struct slPair *el = *pEl; if (el != NULL) { freeMem(el->name); freez(pEl); } } void slPairFreeList(struct slPair **pList) /* Free up list. (Don't free up values.) */ { struct slPair *el, *next; for (el = *pList; el != NULL; el = next) { next = el->next; slPairFree(&el); } *pList = NULL; } void slPairFreeVals(struct slPair *list) /* Free up all values on list. */ { struct slPair *el; for (el = list; el != NULL; el = el->next) freez(&el->val); } void slPairFreeValsAndList(struct slPair **pList) /* Free up all values on list and list itself */ { slPairFreeVals(*pList); slPairFreeList(pList); } struct slPair *slPairFind(struct slPair *list, char *name) /* Return list element of given name, or NULL if not found. */ { struct slPair *el; for (el = list; el != NULL; el = el->next) if (sameString(name, el->name)) break; return el; } void *slPairFindVal(struct slPair *list, char *name) /* Return value associated with name in list, or NULL if not found. */ { struct slPair *el = slPairFind(list, name); if (el == NULL) return NULL; return el->val; } struct slPair *slPairListFromString(char *str,boolean respectQuotes) // Return slPair list parsed from list in string like: [name1=val1 name2=val2 ...] // if respectQuotes then string can have double quotes: [name1="val 1" "name 2"=val2 ...] // resulting pair strips quotes: {name1}={val 1},{name 2}={val2} // Returns NULL if parse error. Free this up with slPairFreeValsAndList. { char *s = skipLeadingSpaces(str); // Would like to remove this and tighten up the standard someday. if (isEmpty(s)) return NULL; struct slPair *list = NULL; char name[1024]; char val[1024]; char buf[1024]; bool inQuote = FALSE; char *b = buf; char sep = '='; char c = ' '; int mode = 0; while(1) { c = *s++; if (mode == 0 || mode == 2) // reading name or val { boolean term = FALSE; if (respectQuotes && b == buf && !inQuote && c == '"') inQuote = TRUE; else if (inQuote && c == '"') term = TRUE; else if ((c == sep || c == 0) && !inQuote) { term = TRUE; --s; // rewind } else if (c == ' ' && !inQuote) { warn("slPairListFromString: Unexpected whitespace in %s", str); return NULL; } else if (c == 0 && inQuote) { warn("slPairListFromString: Unterminated quote in %s", str); return NULL; } else { *b++ = c; if ((b - buf) > sizeof buf) { warn("slPairListFromString: pair name or value too long in %s", str); return NULL; } } if (term) { inQuote = FALSE; *b = 0; if (mode == 0) { safecpy(name, sizeof name, buf); if (strlen(name)<1) { warn("slPairListFromString: Pair name cannot be empty in %s", str); return NULL; } // Shall we check for name being alphanumeric, at least for the respectQuotes=FALSE case? } else // mode == 2 { safecpy(val, sizeof val, buf); if (!respectQuotes && (hasWhiteSpace(name) || hasWhiteSpace(val))) // should never happen { warn("slPairListFromString() Unexpected white space in name=value pair: [%s]=[%s] in string=[%s]\n", name, val, str); break; } slPairAdd(&list, name, cloneString(val)); } ++mode; } } else if (mode == 1) // read required "=" sign { if (c != '=') { warn("slPairListFromString: Expected character = after name in %s", str); return NULL; } ++mode; sep = ' '; b = buf; } else // (mode == 3) reading optional separating space { if (c == 0) break; if (c != ' ') { mode = 0; --s; b = buf; sep = '='; } } } slReverse(&list); return list; } char *slPairListToString(struct slPair *list,boolean quoteIfSpaces) // Returns an allocated string of pairs in form of [name1=val1 name2=val2 ...] // If requested, will wrap name or val in quotes if contain spaces: [name1="val 1" "name 2"=val2] { // Don't rely on dyString. We should do the accounting ourselves and not create extra dependencies. int count = 0; struct slPair *pair = list; for (;pair != NULL; pair = pair->next) { assert(pair->name != NULL && pair->val != NULL); // Better assert and get this over with, // complete with stack count += strlen(pair->name); count += strlen((char *)(pair->val)); count += 2; // = and ' ' delimit if (quoteIfSpaces) { if (hasWhiteSpace(pair->name)) count += 2; // " and " if (hasWhiteSpace((char *)(pair->val))) count += 2; // " and " } } if (count == 0) return NULL; char *str = needMem(count+5); // A bit of slop char *strPtr = str; for (pair = list; pair != NULL; pair = pair->next, strPtr += strlen(strPtr)) { if (pair != list) // Not first cycle *strPtr++ = ' '; if (hasWhiteSpace(pair->name)) { if (quoteIfSpaces) sprintf(strPtr,"\"%s\"=",pair->name); else { warn("slPairListToString() Unexpected white space in name: [%s]\n", pair->name); sprintf(strPtr,"%s=",pair->name); // warn but still make string } } else sprintf(strPtr,"%s=",pair->name); strPtr += strlen(strPtr); if (hasWhiteSpace((char *)(pair->val))) { if (quoteIfSpaces) sprintf(strPtr,"\"%s\"",(char *)(pair->val)); else { warn("slPairListToString() Unexpected white space in val: [%s]\n", (char *)(pair->val)); sprintf(strPtr,"%s",(char *)(pair->val)); // warn but still make string } } else sprintf(strPtr,"%s",(char *)(pair->val)); } return str; } char *slPairNameToString(struct slPair *list, char delimiter,boolean quoteIfSpaces) // Return string created by joining all names (ignoring vals) with the delimiter. // If requested, will wrap name in quotes if contain spaces: [name1,"name 2" ...] { int elCount = 0; int count = 0; struct slPair *pair = list; for (; pair != NULL; pair = pair->next, elCount++) { assert(pair->name != NULL); count += strlen(pair->name); if (quoteIfSpaces && hasWhiteSpace(pair->name)) count += 2; } count += elCount; if (count == 0) return NULL; char *str = needMem(count+5); // A bit of slop char *strPtr = str; for (pair = list; pair != NULL; pair = pair->next, strPtr += strlen(strPtr)) { if (pair != list) *strPtr++ = delimiter; if (hasWhiteSpace(pair->name)) { if (quoteIfSpaces) sprintf(strPtr,"\"%s\"",pair->name); else { if (delimiter == ' ') // if delimied by commas, this is entirely okay! warn("slPairListToString() Unexpected white space in name delimied by space: " "[%s]\n", pair->name); sprintf(strPtr,"%s",pair->name); // warn but still make string } } else sprintf(strPtr,"%s",pair->name); } return str; } int slPairCmpCase(const void *va, const void *vb) /* Compare two slPairs, ignore case. */ { const struct slPair *a = *((struct slPair **)va); const struct slPair *b = *((struct slPair **)vb); return strcasecmp(a->name, b->name); } void slPairSortCase(struct slPair **pList) /* Sort slPair list, ignore case. */ { slSort(pList, slPairCmpCase); } int slPairCmp(const void *va, const void *vb) /* Compare two slPairs. */ { const struct slPair *a = *((struct slPair **)va); const struct slPair *b = *((struct slPair **)vb); return strcmp(a->name, b->name); } int slPairValCmpCase(const void *va, const void *vb) /* Case insensitive compare two slPairs on their values (must be string). */ { const struct slPair *a = *((struct slPair **)va); const struct slPair *b = *((struct slPair **)vb); return strcasecmp((char *)(a->val), (char *)(b->val)); } int slPairValCmp(const void *va, const void *vb) /* Compare two slPairs on their values (must be string). */ { const struct slPair *a = *((struct slPair **)va); const struct slPair *b = *((struct slPair **)vb); return strcmp((char *)(a->val), (char *)(b->val)); } void slPairValSortCase(struct slPair **pList) /* Sort slPair list on values (must be string), ignore case. */ { slSort(pList, slPairValCmpCase); } void slPairValSort(struct slPair **pList) /* Sort slPair list on values (must be string). */ { slSort(pList, slPairValCmp); } int slPairIntCmp(const void *va, const void *vb) // Compare two slPairs on their integer values. { const struct slPair *a = *((struct slPair **)va); const struct slPair *b = *((struct slPair **)vb); return ((char *)(a->val) - (char *)(b->val)); // cast works and val is 0 vased integer } void slPairIntSort(struct slPair **pList) // Sort slPair list on integer values. { slSort(pList, slPairIntCmp); } int slPairAtoiCmp(const void *va, const void *vb) // Compare two slPairs on their strings interpreted as integer values. { const struct slPair *a = *((struct slPair **)va); const struct slPair *b = *((struct slPair **)vb); return (atoi((char *)(a->val)) - atoi((char *)(b->val))); } void slPairValAtoiSort(struct slPair **pList) // Sort slPair list on string values interpreted as integers. { slSort(pList, slPairAtoiCmp); } void gentleFree(void *pt) { if (pt != NULL) freeMem((char*)pt); } int differentWord(char *s1, char *s2) /* strcmp ignoring case - returns zero if strings are * the same (ignoring case) otherwise returns difference * between first non-matching characters. */ { char c1, c2; for (;;) { c1 = toupper(*s1++); c2 = toupper(*s2++); if (c1 != c2) /* Takes care of end of string in one but not the other too */ return c2-c1; if (c1 == 0) /* Take care of end of string in both. */ return 0; } } int differentStringNullOk(char *a, char *b) /* Returns 0 if two strings (either of which may be NULL) * are the same. Otherwise it returns a positive or negative * number depending on the alphabetical order of the two * strings. * This is basically a strcmp that can handle NULLs in * the input. If used in a sort the NULLs will end * up before any of the cases with data. */ { if (a == b) return FALSE; else if (a == NULL) return -1; else if (b == NULL) return 1; else return strcmp(a,b) != 0; } boolean startsWith(const char *start, const char *string) /* Returns TRUE if string begins with start. */ { char c; int i; for (i=0; ;i += 1) { if ((c = start[i]) == 0) return TRUE; if (string[i] != c) return FALSE; } } boolean startsWithWord(char *firstWord, char *line) /* Return TRUE if first white-space-delimited word in line * is same as firstWord. Comparison is case sensitive. */ { int len = strlen(firstWord); int i; for (i=0; i= haystack; pos -= 1) { if (memcmp(needle, pos, nSize) == 0) return pos; } return NULL; } char *stringBetween(char *start, char *end, char *haystack) /* Return string between start and end strings, or NULL if * none found. The first such instance is returned. * String must be freed by caller. */ { char *pos, *p; int len; if ((p = stringIn(start, haystack)) != NULL) { pos = p + strlen(start); if ((p = stringIn(end, pos)) != NULL) { len = p - pos; pos = cloneMem(pos, len + 1); pos[len] = 0; return pos; } } return NULL; } boolean endsWith(char *string, char *end) /* Returns TRUE if string ends with end. */ { int sLen, eLen, offset; sLen = strlen(string); eLen = strlen(end); offset = sLen - eLen; if (offset < 0) return FALSE; return sameString(string+offset, end); } char lastChar(char *s) /* Return last character in string. */ { if (s == NULL || s[0] == 0) return 0; return s[strlen(s)-1]; } void trimLastChar(char *s) /* Erase last character in string. */ { int len = strlen(s); if (len > 0) s[len-1] = 0; } char *lastNonwhitespaceChar(char *s) // Return pointer to last character in string that is not whitespace. { if (s == NULL || s[0] == 0) return NULL; char *sPos = s + (strlen(s) - 1); for (;sPos >= s;sPos--) { if (!isspace(*sPos)) return sPos; } return NULL; } char *matchingCharBeforeInLimits(char *limit, char *s, char c) /* Look for character c sometime before s, but going no further than limit. * Return NULL if not found. */ { while (--s >= limit) if (*s == c) return s; return NULL; } char *memMatch(char *needle, int nLen, char *haystack, int hLen) /* Returns first place where needle (of nLen chars) matches * haystack (of hLen chars) */ { char c = *needle++; nLen -= 1; hLen -= nLen; while (--hLen >= 0) { if (*haystack++ == c && memcmp(needle, haystack, nLen) == 0) { return haystack-1; } } return NULL; } void toUpperN(char *s, int n) /* Convert a section of memory to upper case. */ { int i; for (i=0; i=sz) return -1; for(p=strstr(string,oldStr);p!=NULL;p=strstr(p+strlen(newStr),oldStr)) { memmove(p+strlen(newStr),p+strlen(oldStr),strlen(p+strlen(oldStr))+1); // NULL at end is also moved! memcpy(p,newStr,strlen(newStr)); } return count; } char *strLower(char *s) /* Convert entire string to lower case */ { char c; char *ss=s; for (;;) { if ((c = *ss) == 0) break; *ss++ = tolower(c); } return s; } char * memSwapChar(char *s, int len, char oldChar, char newChar) /* Substitute newChar for oldChar throughout memory of given length. */ { int ix=0; for (;ix= 0 && bNum >= 0) { int diff = atoi(a) - atoi(b); if (diff != 0) return diff; a += aNum; b += bNum; } /* Count number of non-digits at start. */ int aNonNum = countLeadingNondigits(a); int bNonNum = countLeadingNondigits(b); // If different sizes of non-numerical part, then don't match, let strcmp sort out how if (aNonNum != bNonNum) return strcmp(a,b); // If no characters left then they are the same! else if (aNonNum == 0) return 0; // Non-numerical part is the same length and non-zero. See if it is identical. Return if not. else { int diff = memcmp(a,b,aNonNum); if (diff != 0) return diff; a += aNonNum; b += bNonNum; } } } int cmpWordsWithEmbeddedNumbers(const char *a, const char *b) /* Case insensitive version of cmpStringsWithEmbeddedNumbers. */ { char *A = cloneString(a); char *B = cloneString(b); int diff = cmpStringsWithEmbeddedNumbers(strUpper(A), strUpper(B)); freeMem(A); freeMem(B); return diff; } int countSame(char *a, char *b) /* Count number of characters that from start in a,b that are same. */ { char c; int i; int count = 0; for (i=0; ; ++i) { c = a[i]; if (b[i] != c) break; if (c == 0) break; ++count; } return count; } /* int chopString(in, sep, outArray, outSize); */ /* This chops up the input string (cannabilizing it) * into an array of zero terminated strings in * outArray. It returns the number of strings. * If you pass in NULL for outArray, it will just * return the number of strings that it *would* * chop. * GOTCHA: since multiple separators are skipped * and treated as one, it is impossible to parse * a list with an empty string. * e.g. cat\t\tdog returns only cat and dog but no empty string */ int chopString(char *in, char *sep, char *outArray[], int outSize) { int recordCount = 0; for (;;) { if (outArray != NULL && recordCount >= outSize) break; /* Skip initial separators. */ in += strspn(in, sep); if (*in == 0) break; if (outArray != NULL) outArray[recordCount] = in; recordCount += 1; in += strcspn(in, sep); if (*in == 0) break; if (outArray != NULL) *in = 0; in += 1; } return recordCount; } int chopByWhite(char *in, char *outArray[], int outSize) /* Like chopString, but specialized for white space separators. * See the GOTCHA in chopString */ { int recordCount = 0; char c; for (;;) { if (outArray != NULL && recordCount >= outSize) break; /* Skip initial separators. */ while (isspace(*in)) ++in; if (*in == 0) break; /* Store start of word and look for end of word. */ if (outArray != NULL) outArray[recordCount] = in; recordCount += 1; for (;;) { if ((c = *in) == 0) break; if (isspace(c)) break; ++in; } if (*in == 0) break; /* Tag end of word with zero. */ if (outArray != NULL) *in = 0; /* And skip over the zero. */ in += 1; } return recordCount; } int chopByWhiteRespectDoubleQuotes(char *in, char *outArray[], int outSize) /* Like chopString, but specialized for white space separators. * Further, any doubleQuotes (") are respected. * If doubleQuote is encloses whole string, then they are removed: * "Fred and Ethyl" results in word [Fred and Ethyl] * If doubleQuotes exist inside string they are retained: * Fred" and Ethyl" results in word [Fred" and Ethyl"] * Special note "" is a valid, though empty word. */ { int recordCount = 0; char c; char *quoteBegins = NULL; boolean quoting = FALSE; for (;;) { if (outArray != NULL && recordCount >= outSize) break; /* Skip initial separators. */ while (isspace(*in)) ++in; if (*in == 0) break; /* Store start of word and look for end of word. */ if (outArray != NULL) { outArray[recordCount] = in; if (*in == '"') quoteBegins = (in+1); else quoteBegins = NULL; } recordCount += 1; quoting = FALSE; for (;;) { if ((c = *in) == 0) break; if (quoting) { if (c == '"') { quoting = FALSE; if (quoteBegins != NULL) // implies out array { if ((c = *(in+1) == 0 )|| isspace(c)) // whole word is quoted. { outArray[recordCount-1] = quoteBegins; // Fix beginning of word quoteBegins = NULL; break; } } } } else { quoting = (c == '"'); if (isspace(c)) break; } ++in; } if (*in == 0) break; /* Tag end of word with zero. */ if (outArray != NULL) *in = 0; /* And skip over the zero. */ in += 1; } return recordCount; } int chopByChar(char *in, char chopper, char *outArray[], int outSize) /* Chop based on a single character. */ { int i; char c; if (*in == 0) return 0; for (i=0; (i=0; --i) { c = s[i]; if (isspace(c)) s[i] = 0; else break; } } /* Remove white space from a string */ void eraseWhiteSpace(char *s) { char *in, *out; char c; in = out = s; for (;;) { c = *in++; if (c == 0) break; if (!isspace(c)) *out++ = c; } *out++ = 0; } /* Remove non-alphanumeric chars from string */ void eraseNonAlphaNum(char *s) { char *in, *out; char c; in = out = s; for (;;) { c = *in++; if (c == 0) break; if (isalnum(c)) *out++ = c; } *out = 0; } char *trimSpaces(char *s) /* Remove leading and trailing white space. */ { if (s != NULL) { s = skipLeadingSpaces(s); eraseTrailingSpaces(s); } return s; } void repeatCharOut(FILE *f, char c, int count) /* Write character to file repeatedly. */ { while (--count >= 0) fputc(c, f); } void spaceOut(FILE *f, int count) /* Put out some spaces to file. */ { repeatCharOut(f, ' ', count); } void starOut(FILE *f, int count) /* Put out some asterisks to file. */ { repeatCharOut(f, '*', count); } boolean hasWhiteSpace(char *s) /* Return TRUE if there is white space in string. */ { char c; while ((c = *s++) != 0) if (isspace(c)) return TRUE; return FALSE; } char *firstWordInLine(char *line) /* Returns first word in line if any (white space separated). * Puts 0 in place of white space after word. */ { char *e; line = skipLeadingSpaces(line); if ((e = skipToSpaces(line)) != NULL) *e = 0; return line; } char *cloneFirstWord(char *line) /* Clone first word in line */ { char *startFirstWord = skipLeadingSpaces(line); if (startFirstWord == NULL) return NULL; char *endFirstWord = skipToSpaces(startFirstWord); if (endFirstWord == NULL) return cloneString(startFirstWord); else return cloneStringZ(startFirstWord, endFirstWord - startFirstWord); } char *lastWordInLine(char *line) /* Returns last word in line if any (white space separated). * Returns NULL if string is empty. Removes any terminating white space * from line. */ { char *s = line; char *word = NULL, *wordEnd = NULL; for (;;) { s = skipLeadingSpaces(s); if (s == NULL || s[0] == 0) break; word = s; s = wordEnd = skipToSpaces(s); if (s == NULL) break; } if (wordEnd != NULL) *wordEnd = 0; return word; } char *nextWord(char **pLine) /* Return next word in *pLine and advance *pLine to next * word. */ { char *s = *pLine, *e; if (s == NULL || s[0] == 0) return NULL; s = skipLeadingSpaces(s); if (s[0] == 0) return NULL; e = skipToSpaces(s); if (e != NULL) *e++ = 0; *pLine = e; return s; } char *nextWordRespectingQuotes(char **pLine) // return next word but respects single or double quotes surrounding sets of words. { char *s = *pLine, *e; if (s == NULL || s[0] == 0) return NULL; s = skipLeadingSpaces(s); if (s[0] == 0) return NULL; if (s[0] == '"') { e = skipBeyondDelimit(s+1,'"'); if (e != NULL && !isspace(e[0])) e = skipToSpaces(s); } else if (s[0] == '\'') { e = skipBeyondDelimit(s+1,'\''); if (e != NULL && !isspace(e[0])) e = skipToSpaces(s); } else e = skipToSpaces(s); if (e != NULL) *e++ = 0; *pLine = e; return s; } char *nextTabWord(char **pLine) /* Return next tab-separated word. */ { char *s = *pLine; char *e; if (s == NULL || *s == '\n' || *s == 0) { *pLine = NULL; return NULL; } e = strchr(s, '\t'); if (e == NULL) { e = strchr(s, '\n'); if (e != NULL) *e = 0; *pLine = NULL; } else { *e++ = 0; *pLine = e; } return s; } char *cloneFirstWordByDelimiter(char *line,char delimit) /* Returns a cloned first word, not harming the memory passed in */ { if (line == NULL || *line == 0) return NULL; line = skipLeadingSpaces(line); if (*line == 0) return NULL; int size=0; char *e; for (e=line;*e!=0;e++) { if (*e==delimit) break; else if (delimit == ' ' && isspace(*e)) break; size++; } if (size == 0) return NULL; char *new = needMem(size + 2); // Null terminated by 2 memcpy(new, line, size); return new; } char *cloneNextWordByDelimiter(char **line,char delimit) /* Returns a cloned first word, advancing the line pointer but not harming memory passed in */ { char *new = cloneFirstWordByDelimiter(*line,delimit); if (new != NULL) { *line = skipLeadingSpaces(*line); *line += strlen(new); if ( **line != 0) (*line)++; } return new; } char *nextStringInList(char **pStrings) /* returns pointer to the first string and advances pointer to next in list of strings dilimited by 1 null and terminated by 2 nulls. */ { if (pStrings == NULL || *pStrings == NULL || **pStrings == 0) return NULL; char *p=*pStrings; *pStrings += strlen(p)+1; return p; } int cntStringsInList(char *pStrings) /* returns count of strings in a list of strings dilimited by 1 null and terminated by 2 nulls. */ { int cnt=0; char *p = pStrings; while (nextStringInList(&p) != NULL) cnt++; return cnt; } int stringArrayIx(char *string, char *array[], int arraySize) /* Return index of string in array or -1 if not there. */ { int i; for (i=0; i 255) { warn("String too long in writeString (%d chars):\n%s", len, s); len = 255; } bLen = len; writeOne(f, bLen); mustWrite(f, s, len); } char *readString(FILE *f) /* Read a string (written with writeString) into * memory. freeMem the result when done. */ { UBYTE bLen; int len; char *s; if (!readOne(f, bLen)) return NULL; len = bLen; s = needMem(len+1); if (len > 0) mustRead(f, s, len); return s; } char *mustReadString(FILE *f) /* Read a string. Squawk and die at EOF or if any problem. */ { char *s = readString(f); if (s == NULL) errAbort("Couldn't read string"); return s; } boolean fastReadString(FILE *f, char buf[256]) /* Read a string into buffer, which must be long enough * to hold it. String is in 'writeString' format. */ { UBYTE bLen; int len; if (!readOne(f, bLen)) return FALSE; if ((len = bLen)> 0) mustRead(f, buf, len); buf[len] = 0; return TRUE; } void msbFirstWriteBits64(FILE *f, bits64 x) /* Write out 64 bit number in manner that is portable across architectures */ { int i; UBYTE buf[8]; for (i=7; i>=0; --i) { buf[i] = (UBYTE)(x&0xff); x >>= 8; } mustWrite(f, buf, 8); } bits64 msbFirstReadBits64(FILE *f) /* Write out 64 bit number in manner that is portable across architectures */ { int i; UBYTE buf[8]; bits64 x = 0; mustRead(f, buf, 8); for (i=0; i<8; ++i) { x <<= 8; x |= buf[i]; } return x; } void mustGetLine(FILE *file, char *buf, int charCount) /* Read at most charCount-1 bytes from file, but stop after newline if one is * encountered. The string in buf is '\0'-terminated. (See man 3 fgets.) * Die if there is an error. */ { char *success = fgets(buf, charCount, file); if (success == NULL && charCount > 0) buf[0] = '\0'; if (ferror(file)) errAbort("mustGetLine: fgets failed: %s", strerror(ferror(file))); } int mustOpenFd(char *fileName, int flags) /* Open a file descriptor (see man 2 open) or squawk and die. */ { if (sameString(fileName, "stdin")) return STDIN_FILENO; if (sameString(fileName, "stdout")) return STDOUT_FILENO; // mode is necessary when O_CREAT is given, ignored otherwise int mode = 00664; int fd = open(fileName, flags, mode); if (fd < 0) { char *modeName = ""; if ((flags & (O_WRONLY | O_CREAT | O_TRUNC)) == (O_WRONLY | O_CREAT | O_TRUNC)) modeName = " to create and truncate"; else if ((flags & (O_WRONLY | O_CREAT)) == (O_WRONLY | O_CREAT)) modeName = " to create"; else if ((flags & O_WRONLY) == O_WRONLY) modeName = " to write"; else if ((flags & O_RDWR) == O_RDWR) modeName = " to append"; else modeName = " to read"; errnoAbort("mustOpenFd: Can't open %s%s", fileName, modeName); } return fd; } void mustReadFd(int fd, void *buf, size_t size) /* Read size bytes from a file or squawk and die. */ { ssize_t actualSize; char *cbuf = buf; // using a loop because linux was not returning all data in a single request when request size exceeded 2GB. while (size > 0) { actualSize = read(fd, cbuf, size); if (actualSize < 0) errnoAbort("Error reading %lld bytes", (long long)size); if (actualSize == 0) errAbort("End of file reading %llu bytes (got %lld)", (unsigned long long)size, (long long)actualSize); cbuf += actualSize; size -= actualSize; } } void mustWriteFd(int fd, void *buf, size_t size) /* Write size bytes to file descriptor fd or die. (See man 2 write.) */ { ssize_t result = write(fd, buf, size); if (result < size) { if (result < 0) errnoAbort("mustWriteFd: write failed"); else errAbort("mustWriteFd only wrote %lld of %lld bytes. Likely the disk is full.", (long long)result, (long long)size); } } off_t mustLseek(int fd, off_t offset, int whence) /* Seek to given offset, relative to whence (see man lseek) in file descriptor fd or errAbort. * Return final offset (e.g. if this is just an (fd, 0, SEEK_CUR) query for current position). */ { off_t ret = lseek(fd, offset, whence); if (ret < 0) errnoAbort("lseek(%d, %lld, %s (%d)) failed", fd, (long long)offset, ((whence == SEEK_SET) ? "SEEK_SET" : (whence == SEEK_CUR) ? "SEEK_CUR" : (whence == SEEK_END) ? "SEEK_END" : "invalid 'whence' value"), whence); return ret; } void mustCloseFd(int *pFd) /* Close file descriptor *pFd if >= 0, abort if there's an error, set *pFd = -1. */ { if (pFd != NULL && *pFd >= 0) { if (close(*pFd) < 0) errnoAbort("close failed"); *pFd = -1; } } char *addSuffix(char *head, char *suffix) /* Return a needMem'd string containing "headsuffix". Should be free'd when finished. */ { char *ret = NULL; int size = strlen(head) + strlen(suffix) +1; ret = needMem(sizeof(char)*size); snprintf(ret, size, "%s%s", head, suffix); return ret; } void chopSuffix(char *s) /* Remove suffix (last . in string and beyond) if any. */ { char *e = strrchr(s, '.'); if (e != NULL) *e = 0; } void chopSuffixAt(char *s, char c) /* Remove end of string from first occurrence of char c. * chopSuffixAt(s, '.') is equivalent to regular chopSuffix. */ { char *e = strrchr(s, c); if (e != NULL) *e = 0; } char *chopPrefixAt(char *s, char c) /* Like chopPrefix, but can chop on any character, not just '.' */ { char *e = strchr(s, c); if (e == NULL) return s; *e++ = 0; return e; } char *chopPrefix(char *s) /* This will replace the first '.' in a string with * 0, and return the character after this. If there * is no '.' in the string this will just return the * unchanged s passed in. */ { return chopPrefixAt(s, '.'); } boolean carefulCloseWarn(FILE **pFile) /* Close file if open and null out handle to it. * Return FALSE and print a warning message if there * is a problem.*/ { FILE *f; boolean ok = TRUE; if ((pFile != NULL) && ((f = *pFile) != NULL)) { if (f != stdin && f != stdout) { if (fclose(f) != 0) { errnoWarn("fclose failed"); ok = FALSE; } } *pFile = NULL; } return ok; } void carefulClose(FILE **pFile) /* Close file if open and null out handle to it. * Warn and abort if there's a problem. */ { if (!carefulCloseWarn(pFile)) noWarnAbort(); } char *firstWordInFile(char *fileName, char *wordBuf, int wordBufSize) /* Read the first word in file into wordBuf. */ { FILE *f = mustOpen(fileName, "r"); mustGetLine(f, wordBuf, wordBufSize); fclose(f); return trimSpaces(wordBuf); } int fileOffsetSizeCmp(const void *va, const void *vb) /* Help sort fileOffsetSize by offset. */ { const struct fileOffsetSize *a = *((struct fileOffsetSize **)va); const struct fileOffsetSize *b = *((struct fileOffsetSize **)vb); if (a->offset > b->offset) return 1; else if (a->offset == b->offset) return 0; else return -1; } struct fileOffsetSize *fileOffsetSizeMerge(struct fileOffsetSize *inList) /* Returns a new list which is inList transformed to have adjacent blocks * merged. Best to use this with a sorted list. */ { struct fileOffsetSize *newList = NULL, *newEl = NULL, *oldEl, *nextOld; for (oldEl = inList; oldEl != NULL; oldEl = nextOld) { nextOld = oldEl->next; if (nextOld != NULL && nextOld->offset < oldEl->offset) errAbort("Unsorted inList in fileOffsetSizeMerge %llu %llu", oldEl->offset, nextOld->offset); if (newEl == NULL || newEl->offset + newEl->size < oldEl->offset) { newEl = CloneVar(oldEl); slAddHead(&newList, newEl); } else { newEl->size = oldEl->offset + oldEl->size - newEl->offset; } } slReverse(&newList); return newList; } void fileOffsetSizeFindGap(struct fileOffsetSize *list, struct fileOffsetSize **pBeforeGap, struct fileOffsetSize **pAfterGap) /* Starting at list, find all items that don't have a gap between them and the previous item. * Return at gap, or at end of list, returning pointers to the items before and after the gap. */ { struct fileOffsetSize *pt, *next; for (pt = list; ; pt = next) { next = pt->next; if (next == NULL || next->offset != pt->offset + pt->size) { *pBeforeGap = pt; *pAfterGap = next; return; } } } void mustSystem(char *cmd) /* Execute cmd using "sh -c" or die. (See man 3 system.) fail on errors */ { if (cmd == NULL) // don't allow (system() supports testing for shell this way) errAbort("mustSystem: called with NULL command."); int status = system(cmd); if (status == -1) errnoAbort("error starting command: %s", cmd); else if (WIFSIGNALED(status)) errAbort("command terminated by signal %d: %s", WTERMSIG(status), cmd); else if (WIFEXITED(status)) { if (WEXITSTATUS(status) != 0) errAbort("command exited with %d: %s", WEXITSTATUS(status), cmd); } else errAbort("bug: invalid exit status for command: %s", cmd); } int roundingScale(int a, int p, int q) /* returns rounded a*p/q */ { if (a > 100000 || p > 100000) { double x = a; x *= p; x /= q; return round(x); } else return (a*p + q/2)/q; } int intAbs(int a) /* Return integer absolute value */ { return (a >= 0 ? a : -a); } int rangeIntersection(int start1, int end1, int start2, int end2) /* Return amount of bases two ranges intersect over, 0 or negative if no * intersection. */ { int s = max(start1,start2); int e = min(end1,end2); return e-s; } int positiveRangeIntersection(int start1, int end1, int start2, int end2) /* Return number of bases in intersection of two ranges, or * zero if they don't intersect. */ { int ret = rangeIntersection(start1,end1,start2,end2); if (ret < 0) ret = 0; return ret; } bits64 byteSwap64(bits64 a) /* Return byte-swapped version of a */ { union {bits64 whole; UBYTE bytes[8];} u,v; u.whole = a; v.bytes[0] = u.bytes[7]; v.bytes[1] = u.bytes[6]; v.bytes[2] = u.bytes[5]; v.bytes[3] = u.bytes[4]; v.bytes[4] = u.bytes[3]; v.bytes[5] = u.bytes[2]; v.bytes[6] = u.bytes[1]; v.bytes[7] = u.bytes[0]; return v.whole; } bits64 readBits64(FILE *f, boolean isSwapped) /* Read and optionally byte-swap 64 bit entity. */ { bits64 val; mustReadOne(f, val); if (isSwapped) val = byteSwap64(val); return val; } bits64 fdReadBits64(int fd, boolean isSwapped) /* Read and optionally byte-swap 64 bit entity. */ { bits64 val; mustReadOneFd(fd, val); if (isSwapped) val = byteSwap64(val); return val; } bits64 memReadBits64(char **pPt, boolean isSwapped) /* Read and optionally byte-swap 64 bit entity from memory buffer pointed to by * *pPt, and advance *pPt past read area. */ { bits64 val; memcpy(&val, *pPt, sizeof(val)); if (isSwapped) val = byteSwap64(val); *pPt += sizeof(val); return val; } bits32 byteSwap32(bits32 a) /* Return byte-swapped version of a */ { union {bits32 whole; UBYTE bytes[4];} u,v; u.whole = a; v.bytes[0] = u.bytes[3]; v.bytes[1] = u.bytes[2]; v.bytes[2] = u.bytes[1]; v.bytes[3] = u.bytes[0]; return v.whole; } bits32 readBits32(FILE *f, boolean isSwapped) /* Read and optionally byte-swap 32 bit entity. */ { bits32 val; mustReadOne(f, val); if (isSwapped) val = byteSwap32(val); return val; } bits32 fdReadBits32(int fd, boolean isSwapped) /* Read and optionally byte-swap 32 bit entity. */ { bits32 val; mustReadOneFd(fd, val); if (isSwapped) val = byteSwap32(val); return val; } bits32 memReadBits32(char **pPt, boolean isSwapped) /* Read and optionally byte-swap 32 bit entity from memory buffer pointed to by * *pPt, and advance *pPt past read area. */ { bits32 val; memcpy(&val, *pPt, sizeof(val)); if (isSwapped) val = byteSwap32(val); *pPt += sizeof(val); return val; } bits16 byteSwap16(bits16 a) /* Return byte-swapped version of a */ { union {bits16 whole; UBYTE bytes[2];} u,v; u.whole = a; v.bytes[0] = u.bytes[1]; v.bytes[1] = u.bytes[0]; return v.whole; } bits16 readBits16(FILE *f, boolean isSwapped) /* Read and optionally byte-swap 16 bit entity. */ { bits16 val; mustReadOne(f, val); if (isSwapped) val = byteSwap16(val); return val; } bits16 fdReadBits16(int fd, boolean isSwapped) /* Read and optionally byte-swap 16 bit entity. */ { bits16 val; mustReadOneFd(fd, val); if (isSwapped) val = byteSwap16(val); return val; } bits16 memReadBits16(char **pPt, boolean isSwapped) /* Read and optionally byte-swap 16 bit entity from memory buffer pointed to by * *pPt, and advance *pPt past read area. */ { bits16 val; memcpy(&val, *pPt, sizeof(val)); if (isSwapped) val = byteSwap16(val); *pPt += sizeof(val); return val; } double byteSwapDouble(double a) /* Return byte-swapped version of a */ { union {double whole; UBYTE bytes[8];} u,v; u.whole = a; v.bytes[0] = u.bytes[7]; v.bytes[1] = u.bytes[6]; v.bytes[2] = u.bytes[5]; v.bytes[3] = u.bytes[4]; v.bytes[4] = u.bytes[3]; v.bytes[5] = u.bytes[2]; v.bytes[6] = u.bytes[1]; v.bytes[7] = u.bytes[0]; return v.whole; } double readDouble(FILE *f, boolean isSwapped) /* Read and optionally byte-swap double-precision floating point entity. */ { double val; mustReadOne(f, val); if (isSwapped) val = byteSwapDouble(val); return val; } double memReadDouble(char **pPt, boolean isSwapped) /* Read and optionally byte-swap double-precision floating point entity * from memory buffer pointed to by *pPt, and advance *pPt past read area. */ { double val; memcpy(&val, *pPt, sizeof(val)); if (isSwapped) val = byteSwapDouble(val); *pPt += sizeof(val); return val; } float byteSwapFloat(float a) /* Return byte-swapped version of a */ { union {float whole; UBYTE bytes[4];} u,v; u.whole = a; v.bytes[0] = u.bytes[3]; v.bytes[1] = u.bytes[2]; v.bytes[2] = u.bytes[1]; v.bytes[3] = u.bytes[0]; return v.whole; } float readFloat(FILE *f, boolean isSwapped) /* Read and optionally byte-swap single-precision floating point entity. */ { float val; mustReadOne(f, val); if (isSwapped) val = byteSwapFloat(val); return val; } float memReadFloat(char **pPt, boolean isSwapped) /* Read and optionally byte-swap single-precision floating point entity * from memory buffer pointed to by *pPt, and advance *pPt past read area. */ { float val; memcpy(&val, *pPt, sizeof(val)); if (isSwapped) val = byteSwapFloat(val); *pPt += sizeof(val); return val; } void removeReturns(char *dest, char *src) /* Removes the '\r' character from a string. * The source and destination strings can be the same, if there are * no other threads */ { int i = 0; int j = 0; /* until the end of the string */ for (;;) { /* skip the returns */ while(src[j] == '\r') j++; /* copy the characters */ dest[i] = src[j]; /* check to see if done */ if(src[j] == '\0') break; /* advance the counters */ i++; j++; } } char* readLine(FILE* fh) /* Read a line of any size into dynamic memory, return null on EOF */ { int bufCapacity = 256; int bufSize = 0; char* buf = needMem(bufCapacity); int ch; /* loop until EOF of EOLN */ while (((ch = getc(fh)) != EOF) && (ch != '\n')) { /* expand if almost full, always keep one extra char for * zero termination */ if (bufSize >= bufCapacity-2) { bufCapacity *= 2; buf = realloc(buf, bufCapacity); if (buf == NULL) { errAbort("Out of memory in readline - request size %d bytes", bufCapacity); } } buf[bufSize++] = ch; } /* only return EOF if no data was read */ if ((ch == EOF) && (bufSize == 0)) { freeMem(buf); return NULL; } buf[bufSize] = '\0'; return buf; } boolean fileExists(char *fileName) /* Return TRUE if file exists (may replace this with non- * portable faster way some day). */ { /* To make piping easier stdin and stdout always exist. */ if (sameString(fileName, "stdin")) return TRUE; if (sameString(fileName, "stdout")) return TRUE; return fileSize(fileName) != -1; } /* Friendly name for strstrNoCase */ char *containsStringNoCase(char *haystack, char *needle) { return strstrNoCase(haystack, needle); } char *strstrNoCase(char *haystack, char *needle) /* A case-insensitive strstr function Will also robustly handle null strings param haystack - The string to be searched param needle - The string to look for in the haystack string return - The position of the first occurence of the desired substring or -1 if it is not found */ { char *haystackCopy = NULL; char *needleCopy = NULL; int index = 0; int haystackLen = 0; int needleLen = 0; char *p, *q; if (NULL == haystack || NULL == needle) { return NULL; } haystackLen = strlen(haystack); needleLen = strlen(needle); haystackCopy = (char*) needMem(haystackLen + 1); needleCopy = (char*) needMem(needleLen + 1); for(index = 0; index < haystackLen; index++) { haystackCopy[index] = tolower(haystack[index]); } haystackCopy[haystackLen] = 0; /* Null terminate */ for(index = 0; index < needleLen; index++) { needleCopy[index] = tolower(needle[index]); } needleCopy[needleLen] = 0; /* Null terminate */ p=strstr(haystackCopy, needleCopy); q=haystackCopy; freeMem(haystackCopy); freeMem(needleCopy); if(p==NULL) return NULL; return p-q+haystack; } int vasafef(char* buffer, int bufSize, char *format, va_list args) /* Format string to buffer, vsprintf style, only with buffer overflow * checking. The resulting string is always terminated with zero byte. */ { int sz = vsnprintf(buffer, bufSize, format, args); /* note that some version return -1 if too small */ if ((sz < 0) || (sz >= bufSize)) { buffer[bufSize-1] = (char) 0; errAbort("buffer overflow, size %d, format: %s, buffer: '%s'", bufSize, format, buffer); } return sz; } int safef(char* buffer, int bufSize, char *format, ...) /* Format string to buffer, vsprintf style, only with buffer overflow * checking. The resulting string is always terminated with zero byte. */ { int sz; va_list args; va_start(args, format); sz = vasafef(buffer, bufSize, format, args); va_end(args); return sz; } void safecpy(char *buf, size_t bufSize, const char *src) /* copy a string to a buffer, with bounds checking.*/ { size_t slen = strlen(src); if (slen > bufSize-1) errAbort("buffer overflow, size %lld, string size: %lld", (long long)bufSize, (long long)slen); strcpy(buf, src); } void safencpy(char *buf, size_t bufSize, const char *src, size_t n) /* copy n characters from a string to a buffer, with bounds checking. * Unlike strncpy, always null terminates the result */ { if (n > bufSize-1) errAbort("buffer overflow, size %lld, substring size: %lld", (long long)bufSize, (long long)n); // strlen(src) can take a long time when src is for example a pointer into a chromosome sequence. // Instead of setting slen to max(strlen(src), n), just stop counting length at n. size_t slen = 0; while (src[slen] != '\0' && slen < n) slen++; strncpy(buf, src, n); buf[slen] = '\0'; } void safecat(char *buf, size_t bufSize, const char *src) /* Append a string to a buffer, with bounds checking.*/ { size_t blen = strlen(buf); size_t slen = strlen(src); if (blen+slen > bufSize-1) errAbort("buffer overflow, size %lld, new string size: %lld", (long long)bufSize, (long long)(blen+slen)); strcat(buf, src); } void safencat(char *buf, size_t bufSize, const char *src, size_t n) /* append n characters from a string to a buffer, with bounds checking. */ { size_t blen = strlen(buf); if (blen+n > bufSize-1) errAbort("buffer overflow, size %lld, new string size: %lld", (long long)bufSize, (long long)(blen+n)); size_t slen = strlen(src); if (slen > n) slen = n; strncat(buf, src, n); buf[blen+slen] = '\0'; } static char *naStr = "n/a"; static char *emptyStr = ""; char *naForNull(char *s) /* Return 'n/a' if s is NULL, otherwise s. */ { if (s == NULL) s = naStr; return s; } char *naForEmpty(char *s) /* Return n/a if s is "" or NULL, otherwise s. */ { if (s == NULL || s[0] == 0) s = naStr; return s; } char *emptyForNull(char *s) /* Return "" if s is NULL, otherwise s. */ { if (s == NULL) s = emptyStr; return s; } char *nullIfAllSpace(char *s) /* Return NULL if s is all spaces, otherwise s. */ { s = skipLeadingSpaces(s); if (s != NULL) if (s[0] == 0) s = NULL; return s; } char *trueFalseString(boolean b) /* Return "true" or "false" */ { return (b ? "true" : "false"); } void uglyTime(char *label, ...) /* Print label and how long it's been since last call. Call with * a NULL label to initialize. */ { static long lastTime = 0; long time = clock1000(); va_list args; va_start(args, label); if (label != NULL) { fprintf(stdout, ""); vfprintf(stdout, label, args); fprintf(stdout, ": %ld millis
    \n", time - lastTime); } lastTime = time; va_end(args); } void makeDirs(char* path) /* make a directory, including parent directories */ { char pathBuf[PATH_LEN]; char* next = pathBuf; strcpy(pathBuf, path); if (*next == '/') next++; while((*next != '\0') && (next = strchr(next, '/')) != NULL) { *next = '\0'; makeDir(pathBuf); *next = '/'; next++; } makeDir(pathBuf); } char *skipNumeric(char *s) /* Return first char of s that's not a digit */ { while (isdigit(*s)) ++s; return s; } char *skipToNumeric(char *s) /* skip up to where numeric digits appear */ { while (*s != 0 && !isdigit(*s)) ++s; return s; } char *splitOffNonNumeric(char *s) /* Split off non-numeric part, e.g. mm of mm8. Result should be freed when done */ { return cloneStringZ(s,skipToNumeric(s)-s); } char *splitOffNumber(char *db) /* Split off number part, e.g. 8 of mm8. Result should be freed when done */ { return cloneString(skipToNumeric(db)); } #ifndef WIN32 time_t mktimeFromUtc (struct tm *t) /* Return time_t for tm in UTC (GMT) * Useful for stuff like converting to time_t the * last-modified HTTP response header * which is always GMT. Returns -1 on failure of mktime */ { time_t time; char *tz; char save_tz[100]; tz=getenv("TZ"); if (tz) safecpy(save_tz, sizeof(save_tz), tz); setenv("TZ", "GMT0", 1); tzset(); t->tm_isdst = 0; time=mktime(t); if (tz) setenv("TZ", save_tz, 1); else unsetenv("TZ"); tzset(); return (time); } time_t dateToSeconds(const char *date,const char*format) // Convert a string date to time_t { struct tm storage={0,0,0,0,0,0,0,0,0}; if (strptime(date,format,&storage)==NULL) return 0; else return mktime(&storage); } boolean dateIsOld(const char *date,const char*format) // Is this string date older than now? { time_t test = dateToSeconds(date,format); time_t now = clock1(); return (test < now); } boolean dateIsOlderBy(const char *date,const char*format, time_t seconds) // Is this string date older than now by this many seconds? { time_t test = dateToSeconds(date,format); time_t now = clock1(); return (test + seconds < now); } static int daysOfMonth(struct tm *tp) /* Returns the days of the month given the year */ { int days=0; switch(tp->tm_mon) { case 3: case 5: case 8: case 10: days = 30; break; case 1: days = 28; if ( (tp->tm_year % 4) == 0 && ((tp->tm_year % 20) != 0 || (tp->tm_year % 100) == 0) ) days = 29; break; default: days = 31; break; } return days; } static void dateAdd(struct tm *tp,int addYears,int addMonths,int addDays) /* Add years,months,days to a date */ { tp->tm_mday += addDays; tp->tm_mon += addMonths; tp->tm_year += addYears; int dom=28; while ( (tp->tm_mon >11 || tp->tm_mon <0) || (tp->tm_mday>dom || tp->tm_mday<1) ) { if (tp->tm_mon>11) // First month: tm.tm_mon is 0-11 range { tp->tm_year += (tp->tm_mon / 12); tp->tm_mon = (tp->tm_mon % 12); } else if (tp->tm_mon<0) { tp->tm_year += (tp->tm_mon / 12) - 1; tp->tm_mon = (tp->tm_mon % 12) + 12; } else { dom = daysOfMonth(tp); if (tp->tm_mday>dom) { tp->tm_mday -= dom; tp->tm_mon += 1; dom = daysOfMonth(tp); } else if (tp->tm_mday < 1) { tp->tm_mon -= 1; dom = daysOfMonth(tp); tp->tm_mday += dom; } } } } char *dateAddTo(char *date,char *format,int addYears,int addMonths,int addDays) /* Add years,months,days to a formatted date and returns the new date as a cloned string * format is a strptime/strftime format: %F = yyyy-mm-dd */ { char *newDate = needMem(12); struct tm tp; if (strptime(date,format, &tp)) { dateAdd(&tp,addYears,addMonths,addDays); // tp.tm_year only contains years since 1900 strftime(newDate,12,format,&tp); } return cloneString(newDate); // newDate is never freed! } #endif boolean haplotype(const char *name) /* Is this name a haplotype name ? _hap or _alt in the name */ { if (stringIn("_hap", name) || stringIn("_alt", name)) return TRUE; else return FALSE; } rtracklayer/src/ucsc/common.h0000644000175400017540000014257413556116552017336 0ustar00biocbuildbiocbuild/* Common.h - functions that are commonly used. Includes * routines for managing singly linked lists, some basic * string manipulation stuff, and other stuff of the * short but useful nature. * * This file is copyright 2002-2005 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef COMMON_H /* Wrapper to avoid including this twice. */ #define COMMON_H /* Some stuff to support large files in Linux. */ #ifndef _LARGEFILE_SOURCE #define _LARGEFILE_SOURCE 1 #endif #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif #ifndef _FILE_OFFSET_BITS #define _FILE_OFFSET_BITS 64 #endif /* Some stuff for safer pthreads. */ #ifndef _REENTRANT #define _REENTRANT #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if defined(MACHTYPE_ppc) #include #endif #if defined(__APPLE__) #if defined(__i686__) /* The i686 apple math library defines warn. */ #define warn jkWarn #endif #endif #ifdef __CYGWIN32__ #include #endif #ifndef NAN #define NAN (0.0 / 0.0) #endif #ifndef WIFEXITED #define WIFEXITED(stat) (((*((int *) &(stat))) & 0xff) == 0) #endif #ifndef WEXITSTATUS #define WEXITSTATUS(stat) (short)(((*((int *) &(stat))) >> 8) & 0xffff) #endif #ifndef WIFSIGNALED #define WIFSIGNALED(stat) (((*((int *) &(stat)))) && ((*((int *) &(stat))) == ((*((int *) &(stat))) &0x00ff))) #endif #ifndef WTERMSIG #define WTERMSIG(stat) ((*((int *) &(stat))) & 0x7f) #endif #ifndef WIFSTOPPED #define WIFSTOPPED(stat) (((*((int *) &(stat))) & 0xff) == 0177) #endif #ifndef WSTOPSIG #define WSTOPSIG(stat) (((*((int *) &(stat))) >> 8) & 0xff) #endif #ifndef HUGE #define HUGE MAXFLOAT #endif /* Let's pretend C has a boolean type. */ #define TRUE 1 #define FALSE 0 #define boolean int #ifndef __cplusplus #ifndef bool #define bool char #endif #endif /* Some other type synonyms */ #define UBYTE unsigned char /* Wants to be unsigned 8 bits. */ #define BYTE signed char /* Wants to be signed 8 bits. */ #define UWORD unsigned short /* Wants to be unsigned 16 bits. */ #define WORD short /* Wants to be signed 16 bits. */ #define bits64 unsigned long long /* Wants to be unsigned 64 bits. */ #define bits32 unsigned /* Wants to be unsigned 32 bits. */ #define bits16 unsigned short /* Wants to be unsigned 16 bits. */ #define bits8 unsigned char /* Wants to be unsigned 8 bits. */ #define signed32 int /* Wants to be signed 32 bits. */ #define bits8 unsigned char /* Wants to be unsigned 8 bits. */ #define BIGNUM 0x3fffffff /* A really big number */ #define BIGDOUBLE 1.7E+308 /* Close to biggest double-precision number */ #define LIMIT_2or8GB (2147483647 * ((sizeof(size_t)/4)*(sizeof(size_t)/4))) /* == 2 Gb for 32 bit machines, 8 Gb for 64 bit machines */ #define LIMIT_2or6GB (2147483647 + (2147483647 * ((sizeof(size_t)/4)-1)) + \ (2147483647 * ((sizeof(size_t)/4)-1))) /* == 2 Gb for 32 bit machines, 6 Gb for 64 bit machines */ /* Default size of directory path, file name and extension string buffers */ #define PATH_LEN 512 #define FILENAME_LEN 128 #define FILEEXT_LEN 64 /* inline functions: To declare a function inline, place the entire function * in a header file and prefix it with the INLINE macro. If used with a * compiler that doesn't support inline, change the INLINE marco to be simply * `static'. */ #ifndef INLINE #define INLINE static inline #endif /* stdargs compatibility: in a unix universe a long time ago, types of va_list * were passed by value. It was assume one could do things like: * * va_start(args); * vfprintf(fh1, fmt, args); * vfprintf(fh2, fmt, args); * va_end(args); * * and life would good. However this is not true on some modern systems (for * instance gcc/glibc on x86_64), where va_args can be a pointer to some type * of object). The second call to vfprintf() would then crash, since the * first call modified the object that va_args was pointing to. C99 adds a * va_copy macro that to address this issue. Many non-C99 system include this * macro, sometimes called __va_copy. Here we ensure that va_copy is defined. * If if doesn't exist, we try to define it in terms of __va_copy. If that is * not available, we make the assumption that va_list can be copied by value * and create our own. Our implementation is the same as used on Solaris. */ #if defined(__va_copy) && !defined(va_copy) # define va_copy __va_copy #endif #if !defined(va_copy) # define va_copy(to, from) ((to) = (from)) #endif /* Cast a pointer to a long long. Use to printf format points as long-longs * in a 32/64bit portable manner. Format should use %llx for the result. * Needed because casting a pointer to a different sized number cause a * warning with gcc */ #define ptrToLL(p) ((long long)((size_t)p)) /* How big is this array? */ #define ArraySize(a) (sizeof(a)/sizeof((a)[0])) #define uglyf printf /* debugging printf */ #define uglyAbort errAbort /* debugging error abort. */ #define uglyOut stdout /* debugging fprintf target. */ void *needMem(size_t size); /* Need mem calls abort if the memory allocation fails. The memory * is initialized to zero. */ void *needLargeMem(size_t size); /* This calls abort if the memory allocation fails. The memory is * not initialized to zero. */ void *needLargeZeroedMem(size_t size); /* Request a large block of memory and zero it. */ void *needLargeMemResize(void* vp, size_t size); /* Adjust memory size on a block, possibly relocating it. If vp is NULL, * a new memory block is allocated. Memory not initted. */ void *needLargeZeroedMemResize(void* vp, size_t oldSize, size_t newSize); /* Adjust memory size on a block, possibly relocating it. If vp is NULL, a * new memory block is allocated. If block is grown, new memory is zeroed. */ void *needHugeMem(size_t size); /* No checking on size. Memory not initted to 0. */ void *needHugeZeroedMem(size_t size); /* Request a large block of memory and zero it. */ void *needHugeMemResize(void* vp, size_t size); /* Adjust memory size on a block, possibly relocating it. If vp is NULL, * a new memory block is allocated. No checking on size. Memory not * initted. */ void *needHugeZeroedMemResize(void* vp, size_t oldSize, size_t newSize); /* Adjust memory size on a block, possibly relocating it. If vp is NULL, a * new memory block is allocated. No checking on size. If block is grown, * new memory is zeroed. */ void *needMoreMem(void *old, size_t copySize, size_t newSize); /* Allocate a new buffer, copy old buffer to it, free old buffer. */ void *cloneMem(void *pt, size_t size); /* Allocate a new buffer of given size, and copy pt to it. */ #define CloneVar(pt) cloneMem(pt, sizeof((pt)[0])) /* Allocate copy of a structure. */ void *wantMem(size_t size); /* Want mem just calls malloc - no zeroing of memory, no * aborting if request fails. */ void freeMem(void *pt); /* Free memory will check for null before freeing. */ void freez(void *ppt); /* Pass address of pointer. Will free pointer and set it * to NULL. Typical use: * s = needMem(1024); * ... * freez(&s); */ #define AllocVar(pt) (pt = needMem(sizeof(*pt))) /* Shortcut to allocating a single variable on the heap and * assigning pointer to it. */ #define AllocArray(pt, size) (pt = needLargeZeroedMem(sizeof(*pt) * (size))) #define AllocA(type) needMem(sizeof(type)) /* Shortcut to allocating a variable on heap of a specific type. */ #define AllocN(type,count) ((type*)needLargeZeroedMem(sizeof(type) * (count))) /* Shortcut to allocating an array on the heap of a specific type. */ #define ExpandArray(array, oldCount, newCount) \ (array = needMoreMem((array), (oldCount)*sizeof((array)[0]), (newCount)*sizeof((array)[0]))) /* Expand size of dynamically allocated array. */ #define CopyArray(source, dest,count) memcpy(dest,source,(count)*sizeof(dest[0])) /* Copy count elements of array from source to dest. */ #define CloneArray(a, count) cloneMem(a, (count)*sizeof(a[0])) /* Make new dynamic array initialized with count elements of a */ void errAbort(char *format, ...) /* Abort function, with optional (printf formatted) error message. */ #if defined(__GNUC__) __attribute__((format(printf, 1, 2))) #endif ; void errnoAbort(char *format, ...) /* Prints error message from UNIX errno first, then does errAbort. */ #if defined(__GNUC__) __attribute__((format(printf, 1, 2))) #endif ; #define internalErr() errAbort("Internal error %s %d", __FILE__, __LINE__) /* Generic internal error message */ void warn(char *format, ...) /* Issue a warning message. */ #if defined(__GNUC__) __attribute__((format(printf, 1, 2))) #endif ; void warnWithBackTrace(char *format, ...) /* Issue a warning message and append backtrace. */ #if defined(__GNUC__) __attribute__((format(printf, 1, 2))) #endif ; void verbose(int verbosity, char *format, ...) /* Write printf formatted message to log (which by * default is stdout) if global verbose variable * is set to verbosity or higher. Default level is 1. */ #if defined(__GNUC__) __attribute__((format(printf, 2, 3))) #endif ; void verboseTimeInit(void); /* Initialize or reinitialize the previous time for use by verboseTime. */ void verboseTime(int verbosity, char *label, ...) /* Print label and how long it's been since last call. Start time can be * initialized with verboseTimeInit, otherwise the elapsed time will be * zero. */ #if defined(__GNUC__) __attribute__((format(printf, 2, 3))) #endif ; void verboseDot(); /* Write I'm alive dot (at verbosity level 1) */ int verboseLevel(); /* Get verbosity level. */ void verboseSetLevel(int verbosity); /* Set verbosity level in log. 0 for no logging, * higher number for increasing verbosity. */ INLINE void zeroBytes(void *vpt, int count) /* fill a specified area of memory with zeroes */ { memset(vpt, '\0', count); } #define ZeroVar(v) zeroBytes(v, sizeof(*v)) void reverseBytes(char *bytes, long length); /* Reverse the order of the bytes. */ void reverseInts(int *a, int length); /* Reverse the order of the integer array. */ void reverseUnsigned(unsigned *a, int length); /* Reverse the order of the unsigned array. */ void reverseDoubles(double *a, int length); /* Reverse the order of the double array. */ void reverseStrings(char **a, int length); /* Reverse the order of the char* array. */ void swapBytes(char *a, char *b, int length); /* Swap buffers a and b. */ /******* Some things to manage simple lists - structures that begin ****** ******* with a pointer to the next element in the list. ******/ struct slList { struct slList *next; }; int slCount(const void *list); /* Return # of elements in list. */ void *slElementFromIx(void *list, int ix); /* Return the ix'th element in list. Returns NULL * if no such element. */ int slIxFromElement(void *list, void *el); /* Return index of el in list. Returns -1 if not on list. */ INLINE void slAddHead(void *listPt, void *node) /* Add new node to start of list. * Usage: * slAddHead(&list, node); * where list and nodes are both pointers to structure * that begin with a next pointer. */ { struct slList **ppt = (struct slList **)listPt; struct slList *n = (struct slList *)node; n->next = *ppt; *ppt = n; } INLINE void slSafeAddHead(void *listPt, void *node) /* Add new node to start of list. Now that slAddHead is an inline instead of * a macro, this function is obsolete. */ { slAddHead(listPt, node); } void slAddTail(void *listPt, void *node); /* Add new node to tail of list. * Usage: * slAddTail(&list, node); * where list and nodes are both pointers to structure * that begin with a next pointer. This is sometimes * convenient but relatively slow. For longer lists * it's better to slAddHead, and slReverse when done. */ void *slPopHead(void *listPt); /* Return head of list and remove it from list. (Fast) */ void *slPopTail(void *listPt); /* Return tail of list and remove it from list. (Not so fast) */ void *slCat(void *a, void *b); /* Return concatenation of lists a and b. * Example Usage: * struct slName *a = getNames("a"); * struct slName *b = getNames("b"); * struct slName *ab = slCat(a,b) * After this it is no longer safe to use a or b. */ void *slLastEl(void *list); /* Returns last element in list or NULL if none. */ void slReverse(void *listPt); /* Reverse order of a list. * Usage: * slReverse(&list); */ typedef int CmpFunction(const void *elem1, const void *elem2); void slSort(void *pList, CmpFunction *compare); /* Sort a singly linked list with Qsort and a temporary array. * The arguments to the compare function in real, non-void, life * are pointers to pointers. */ void slUniqify(void *pList, CmpFunction *compare, void (*free)()); /* Return sorted list with duplicates removed. * Compare should be same type of function as slSort's compare (taking * pointers to pointers to elements. Free should take a simple * pointer to dispose of duplicate element, and can be NULL. */ void slSortMerge(void *pA, void *b, CmpFunction *compare); // Merges and sorts a pair of singly linked lists using slSort. void slSortMergeUniq(void *pA, void *b, CmpFunction *compare, void (*free)()); // Merges and sorts a pair of singly linked lists leaving only unique // items via slUniqufy. duplicate itens are defined by the compare routine // returning 0. If free is provided, items dropped from list can disposed of. boolean slRemoveEl(void *vpList, void *vToRemove); /* Remove element from singly linked list. Usage: * slRemove(&list, el); * Returns TRUE if element in list. */ void slFreeList(void *listPt); /* Free all elements in list and set list pointer to null. * Usage: * slFreeList(&list); */ /******* slInt - an int on a list - the first of many singly linked list structures *******/ struct slInt /* List of integers. */ { struct slInt *next; /* Next in list. */ int val; /* Integer value. */ }; struct slInt *slIntNew(int x); #define newSlInt slIntNew /* Return a new double. */ int slIntCmp(const void *va, const void *vb); /* Compare two slInts. */ int slIntCmpRev(const void *va, const void *vb); /* Compare two slInts in reverse direction. */ struct slInt * slIntFind(struct slInt *list, int target); /* Find target in slInt list or return NULL */ struct slUnsigned /* List of unsigned */ { struct slUnsigned *next; /* Next in list */ unsigned val; /* Unsigned value */ }; struct slUnsigned *slUnsignedNew(unsigned x); /* Return a new slUnsigned. */ /******* slDouble - a double on a list *******/ struct slDouble /* List of double-precision numbers. */ { struct slDouble *next; /* Next in list. */ double val; /* Double-precision value. */ }; struct slDouble *slDoubleNew(double x); #define newSlDouble slDoubleNew /* Return a new int. */ int slDoubleCmp(const void *va, const void *vb); /* Compare two slDoubles. */ double slDoubleMedian(struct slDouble *list); /* Return median value on list. */ /******* slName - a zero terminated string on a list *******/ struct slName /* List of names. The name array is allocated to accommodate full name */ { struct slName *next; /* Next in list. */ char name[1]; /* Allocated at run time to length of string. */ }; struct slName *newSlName(char *name); #define slNameNew newSlName /* Return a new slName. */ #define slNameFree freez /* Free a single slName */ #define slNameFreeList slFreeList /* Free a list of slNames */ struct slName *slNameNewN(char *name, int size); /* Return new slName of given size. */ int slNameCmpCase(const void *va, const void *vb); /* Compare two slNames, ignore case. */ int slNameCmp(const void *va, const void *vb); /* Compare two slNames. */ int slNameCmpStringsWithEmbeddedNumbers(const void *va, const void *vb); /* Compare strings such as gene names that may have embedded numbers, * so that bmp4a comes before bmp14a */ void slNameSortCase(struct slName **pList); /* Sort slName list, ignore case. */ void slNameSort(struct slName **pList); /* Sort slName list. */ boolean slNameInList(struct slName *list, char *string); /* Return true if string is in name list -- case insensitive. */ boolean slNameInListUseCase(struct slName *list, char *string); /* Return true if string is in name list -- case sensitive. */ void *slNameFind(void *list, char *string); /* Return first element of slName list (or any other list starting * with next/name fields) that matches string. */ int slNameFindIx(struct slName *list, char *string); /* Return index of first element of slName list (or any other * list starting with next/name fields) that matches string. * ... Return -1 if not found. */ char *slNameStore(struct slName **pList, char *string); /* Put string into list if it's not there already. * Return the version of string stored in list. */ struct slName *slNameAddHead(struct slName **pList, char *name); /* Add name to start of list and return it. */ struct slName *slNameAddTail(struct slName **pList, char *name); /* Add name to end of list (not efficient for long lists), * and return it. */ struct slName *slNameCloneList(struct slName *list); /* Return clone of list. */ struct slName *slNameListFromString(char *s, char delimiter); /* Return list of slNames gotten from parsing delimited string. * The final delimiter is optional. a,b,c and a,b,c, are equivalent * for comma-delimited lists. */ #define slNameListFromComma(s) slNameListFromString(s, ',') /* Parse out comma-separated list. */ struct slName *slNameListOfUniqueWords(char *text,boolean respectQuotes); // Return list of unique words found by parsing string delimited by whitespace. // If respectQuotes then ["Lucy and Ricky" 'Fred and Ethyl'] will yield 2 slNames no quotes struct slName *slNameListFromStringArray(char *stringArray[], int arraySize); /* Return list of slNames from an array of strings of length arraySize. * If a string in the array is NULL, the array will be treated as * NULL-terminated. */ char *slNameListToString(struct slName *list, char delimiter); /* Return string created by joining all names with the delimiter. */ struct slName *slNameLoadReal(char *fileName); /* load file lines that are not blank or start with a '#' into a slName * list */ struct slName *slNameIntersection(struct slName *a, struct slName *b); /* return intersection of two slName lists. */ /******* slRef - a void pointer on a list *******/ struct slRef /* Singly linked list of generic references. */ { struct slRef *next; /* Next in list. */ void *val; /* A reference to something. */ }; struct slRef *slRefNew(void *val); /* Create new slRef element. */ struct slRef *refOnList(struct slRef *refList, void *val); /* Return ref if val is already on list, otherwise NULL. */ void refAdd(struct slRef **pRefList, void *val); /* Add reference to list. */ void refAddUnique(struct slRef **pRefList, void *val); /* Add reference to list if not already on list. */ void slRefFreeListAndVals(struct slRef **pList); /* Free up (with simple freeMem()) each val on list, and the list itself as well. */ struct slRef *refListFromSlList(void *list); /* Make a reference list that mirrors a singly-linked list. */ /******* slPair - a name/value pair on list where value not always a string *******/ struct slPair /* A name/value pair. */ { struct slPair *next; /* Next in list. */ char *name; /* Name of item. */ void *val; /* Pointer to item data. */ }; struct slPair *slPairNew(char *name, void *val); /* Allocate new name/value pair. */ void slPairAdd(struct slPair **pList, char *name, void *val); /* Add new slPair to head of list. */ void slPairFree(struct slPair **pEl); /* Free up struct and name. (Don't free up values.) */ void slPairFreeList(struct slPair **pList); /* Free up list. (Don't free up values.) */ void slPairFreeVals(struct slPair *list); /* Free up all values on list. */ void slPairFreeValsAndList(struct slPair **pList); /* Free up all values on list and list itself */ struct slPair *slPairFind(struct slPair *list, char *name); /* Return list element of given name, or NULL if not found. */ void *slPairFindVal(struct slPair *list, char *name); /* Return value associated with name in list, or NULL if not found. */ struct slPair *slPairListFromString(char *str,boolean respectQuotes); // Return slPair list parsed from list in string like: [name1=val1 name2=val2 ...] // if respectQuotes then string can have double quotes: [name1="val 1" "name 2"=val2 ...] // resulting pair strips quotes: {name1}={val 1},{name 2}={val2} // Returns NULL if parse error. Free this up with slPairFreeValsAndList. #define slPairFromString(s) slPairListFromString(s,FALSE) char *slPairListToString(struct slPair *list,boolean quoteIfSpaces); // Returns an allocated string of pairs in form of [name1=val1 name2=val2 ...] // If requested, will wrap name or val in quotes if contain spaces: [name1="val 1" "name 2"=val2] char *slPairNameToString(struct slPair *list, char delimiter,boolean quoteIfSpaces); // Return string created by joining all names (ignoring vals) with the delimiter. // If requested, will wrap name in quotes if contain spaces: [name1,"name 2" ...] int slPairCmpCase(const void *va, const void *vb); /* Compare two slPairs, ignore case. */ void slPairSortCase(struct slPair **pList); /* Sort slPair list, ignore case. */ int slPairCmp(const void *va, const void *vb); /* Compare two slPairs. */ int slPairValCmpCase(const void *va, const void *vb); /* Case insensitive compare two slPairs on their values (must be string). */ int slPairValCmp(const void *va, const void *vb); /* Compare two slPairs on their values (must be string). */ void slPairValSortCase(struct slPair **pList); /* Sort slPair list on values (must be string), ignore case. */ void slPairValSort(struct slPair **pList); /* Sort slPair list on values (must be string). */ int slPairIntCmp(const void *va, const void *vb); // Compare two slPairs on their integer values. void slPairIntSort(struct slPair **pList); // Sort slPair list on integer values. int slPairAtoiCmp(const void *va, const void *vb); // Compare two slPairs on their strings interpreted as integer values. void slPairValAtoiSort(struct slPair **pList); // Sort slPair list on string values interpreted as integers. /******* Some old stuff maybe we could trim. *******/ void gentleFree(void *pt); /* check pointer for NULL before freeing. * (Actually plain old freeMem does that these days.) */ /******* Some math stuff *******/ void doubleSort(int count, double *array); /* Sort an array of doubles. */ double doubleMedian(int count, double *array); /* Return median value in array. This will sort * the array as a side effect. */ void doubleBoxWhiskerCalc(int count, double *array, double *retMin, double *retQ1, double *retMedian, double *retQ3, double *retMax); /* Calculate what you need to draw a box and whiskers plot from an array of doubles. */ void slDoubleBoxWhiskerCalc(struct slDouble *list, double *retMin, double *retQ1, double *retMedian, double *retQ3, double *retMax); /* Calculate what you need to draw a box and whiskers plot from a list of slDoubles. */ int intMedian(int count, int *array); /* Return median value in array. This will sort * the array as a side effect. */ void intSort(int count, int *array); /* Sort an array of ints. */ /******* Some stuff for processing strings. *******/ char *cloneStringZ(const char *s, int size); /* Make a zero terminated copy of string in memory */ char *cloneString(const char *s); /* Make copy of string in dynamic memory */ char *cloneLongString(char *s); /* Make clone of long string. */ char *catTwoStrings(char *a, char *b); /* Allocate new string that is a concatenation of two strings. */ int differentWord(char *s1, char *s2); /* strcmp ignoring case - returns zero if strings are * the same (ignoring case) otherwise returns difference * between first non-matching characters. */ #define sameWord(a,b) (!differentWord(a,b)) /* Return TRUE if two strings are same ignoring case */ #define differentString(a,b) (strcmp(a,b)) /* Returns FALSE if two strings same. */ int differentStringNullOk(char *a, char *b); /* Returns 0 if two strings (either of which may be NULL) * are the same. Otherwise it returns a positive or negative * number depending on the alphabetical order of the two * strings. * This is basically a strcmp that can handle NULLs in * the input. If used in a sort the NULLs will end * up before any of the cases with data. */ #define sameOk(a,b) (differentStringNullOk(a,b) == 0) /* returns TRUE if two strings same, NULLs OK */ #define sameString(a,b) (strcmp(a,b)==0) /* Returns TRUE if two strings same. */ #define sameStringN(a,b,c) (strncmp(a,b,c)==0) /* Returns TRUE if two strings start with the same c characters. */ #define isEmpty(string) ((string) == NULL || (string)[0] == 0) #define isNotEmpty(string) (! isEmpty(string)) int cmpStringsWithEmbeddedNumbers(const char *a, const char *b); /* Compare strings such as gene names that may have embedded numbers, * so that bmp4a comes before bmp14a */ int cmpWordsWithEmbeddedNumbers(const char *a, const char *b); /* Case insensitive version of cmpStringsWithEmbeddedNumbers. */ boolean startsWith(const char *start, const char *string); /* Returns TRUE if string begins with start. */ boolean startsWithWord(char *firstWord, char *line); /* Return TRUE if first white-space-delimited word in line * is same as firstWord. Comparison is case sensitive. */ boolean startsWithWordByDelimiter(char *firstWord,char delimit, char *line); /* Return TRUE if first word in line is same as firstWord as delimited by delimit. Comparison is case sensitive. Delimit of ' ' uses isspace() */ #define stringIn(needle, haystack) strstr(haystack, needle) /* Returns position of needle in haystack or NULL if it's not there. */ /* char *stringIn(char *needle, char *haystack); */ char *rStringIn(char *needle, char *haystack); /* Return last position of needle in haystack, or NULL if it's not there. */ char *stringBetween(char *start, char *end, char *haystack); /* Return string between start and end strings, or NULL if * none found. The first such instance is returned. * String must be freed by caller. */ char * findWordByDelimiter(char *word,char delimit, char *line); /* Return pointer to first word in line matching 'word' and delimited by 'delimit'. Comparison is case sensitive. Delimit of ' ' uses isspace() */ boolean endsWith(char *string, char *end); /* Returns TRUE if string ends with end. */ char lastChar(char *s); /* Return last character in string. */ void trimLastChar(char *s); /* Erase last character in string. */ char *lastNonwhitespaceChar(char *s); // Return pointer to last character in string that is not whitespace. char *matchingCharBeforeInLimits(char *limit, char *s, char c); /* Look for character c sometime before s, but going no further than limit. * Return NULL if not found. */ boolean wildMatch(const char *wildCard, const char *string); /* does a case insensitive wild card match with a string. * * matches any string or no character. * ? matches any single character. * anything else etc must match the character exactly. */ boolean sqlMatchLike(char *wildCard, char *string); /* Match using % and _ wildcards. */ boolean anyWild(const char *string); /* Return TRUE if any wild card characters in string. */ char *memMatch(char *needle, int nLen, char *haystack, int hLen); /* Returns first place where needle (of nLen chars) matches * haystack (of hLen chars) */ void toUpperN(char *s, int n); /* Convert a section of memory to upper case. */ void toLowerN(char *s, int n); /* Convert a section of memory to lower case. */ void toggleCase(char *s, int size); /* toggle upper and lower case chars in string. */ char *strUpper(char *s); #define touppers(s) (void)strUpper(s) /* Convert entire string to upper case. */ char *strLower(char *s); #define tolowers(s) (void)strLower(s) /* Convert entire string to lower case */ char *replaceChars(char *string, char *oldStr, char *newStr); /* Replaces the old with the new. The old and new string need not be of equal size Can take any length string. Return value needs to be freeMem'd. */ int strSwapStrs(char *string, int sz,char *oldStr, char *newStr); /* Swaps all occurrences of the oldStr with the newStr in string. Need not be same size Swaps in place but restricted by sz. Returns count of swaps or -1 for sz failure.*/ char * memSwapChar(char *s, int len, char oldChar, char newChar); /* Substitute newChar for oldChar throughout memory of given length. old or new may be null */ #define strSwapChar(s,old,new) memSwapChar((s),strlen(s),(old),(new)) #define subChar(s,old,new) (void)memSwapChar((s),strlen(s),(old),(new)) /* Substitute newChar for oldChar throughout string s. */ void stripChar(char *s, char c); /* Remove all occurences of c from s. */ char *stripEnclosingChar(char *inout,char encloser); // Removes enclosing char if found at both beg and end, preserving pointer // Note: handles brackets '(','{' and '[' by complement at end #define stripEnclosingDoubleQuotes(inout) stripEnclosingChar((inout),'"') #define stripEnclosingSingleQuotes(inout) stripEnclosingChar((inout),'\'') void stripString(char *s, char *strip); /* Remove all occurences of strip from s. */ int countCase(char *s,boolean upper); // Count letters with case (upper or lower) int countChars(char *s, char c); /* Return number of characters c in string s. */ int countCharsN(char *s, char c, int size); /* Return number of characters c in string s of given size. */ int countLeadingChars(char *s, char c); /* Count number of characters c at start of string. */ int countLeadingDigits(const char *s); /* Return number of leading digits in s */ int countLeadingNondigits(const char *s); /* Count number of leading non-digit characters in s. */ int countSame(char *a, char *b); /* Count number of characters that from start in a,b that are same. */ int countSeparatedItems(char *string, char separator); /* Count number of items in string you would parse out with given * separator, assuming final separator is optional. */ int chopString(char *in, char *sep, char *outArray[], int outSize); /* int chopString(in, sep, outArray, outSize); */ /* This chops up the input string (cannabilizing it) * into an array of zero terminated strings in * outArray. It returns the number of strings. * If you pass in NULL for outArray, it will just * return the number of strings that it *would* * chop. */ extern char crLfChopper[]; extern char whiteSpaceChopper[]; /* Some handy predefined separators. */ int chopByWhite(char *in, char *outArray[], int outSize); /* Like chopString, but specialized for white space separators. */ #define chopLine(line, words) chopByWhite(line, words, ArraySize(words)) /* Chop line by white space. */ int chopByWhiteRespectDoubleQuotes(char *in, char *outArray[], int outSize); /* Like chopString, but specialized for white space separators. * Further, any doubleQuotes (") are respected. * If doubleQuote encloses whole string, then they are removed: * "Fred and Ethyl" results in word [Fred and Ethyl] * If doubleQuotes exist inside string they are retained: * Fred "and Ethyl" results in word [Fred "and Ethyl"] * Special note "" is a valid, though empty word. */ int chopByChar(char *in, char chopper, char *outArray[], int outSize); /* Chop based on a single character. */ #define chopTabs(string, words) chopByChar(string, '\t', words, ArraySize(words)) /* Chop string by tabs. */ #define chopCommas(string, words) chopByChar(string, ',', words, ArraySize(words)) /* Chop string by commas. */ char *skipBeyondDelimit(char *s,char delimit); /* Returns NULL or pointer to first char beyond one (or more contiguous) delimit char. If delimit is ' ' then skips beyond first patch of whitespace. */ char *skipLeadingSpaces(char *s); /* Return first white space or NULL if none.. */ char *skipToSpaces(char *s); /* Return first white space. */ void eraseTrailingSpaces(char *s); /* Replace trailing white space with zeroes. */ void eraseWhiteSpace(char *s); /* Remove white space from a string */ void eraseNonAlphaNum(char *s); /* Remove non-alphanumeric chars from string */ char *trimSpaces(char *s); /* Remove leading and trailing white space. */ void repeatCharOut(FILE *f, char c, int count); /* Write character to file repeatedly. */ void spaceOut(FILE *f, int count); /* Put out some spaces to file. */ void starOut(FILE *f, int count); /* Put out some asterisks to file. */ boolean hasWhiteSpace(char *s); /* Return TRUE if there is white space in string. */ char *firstWordInLine(char *line); /* Returns first word in line if any (white space separated). * Puts 0 in place of white space after word. */ char *lastWordInLine(char *line); /* Returns last word in line if any (white space separated). * Returns NULL if string is empty. Removes any terminating white space * from line. */ char *nextWord(char **pLine); /* Return next word in *pLine and advance *pLine to next * word. Returns NULL when no more words. */ char *nextWordRespectingQuotes(char **pLine); // return next word but respects single or double quotes surrounding sets of words. char *cloneFirstWord(char *line); /* Clone first word in line */ char *nextTabWord(char **pLine); /* Return next tab-separated word. */ char *cloneFirstWordByDelimiter(char *line,char delimit); /* Returns a cloned first word, not harming the memory passed in Delimiter of ' ' will delimit by isspace() */ #define cloneFirstWordInLine(line) cloneFirstWordByDelimiter((line),' ') #define cloneFirstWordByTab(line) cloneFirstWordByDelimiter((line),'\t') /* Returns a cloned first word, not harming the memory passed in */ char *cloneNextWordByDelimiter(char **line,char delimit); /* Returns a cloned first word, advancing the line pointer but not harming memory passed in. Delimit ' ' uses isspace() */ #define cloneNextWord(line) cloneNextWordByDelimiter((line),' ') #define cloneNextWordByTab(line) cloneNextWordByDelimiter((line),'\t') char *nextStringInList(char **pStrings); /* returns pointer to the first string and advances pointer to next in list of strings dilimited by 1 null and terminated by 2 nulls. */ int cntStringsInList(char *pStrings); /* returns count of strings in a list of strings dilimited by 1 null and terminated by 2 nulls. */ int stringArrayIx(char *string, char *array[], int arraySize); /* Return index of string in array or -1 if not there. */ int ptArrayIx(void *pt, void *array, int arraySize); /* Return index of pt in array or -1 if not there. */ #define stringIx(string, array) stringArrayIx( (string), (array), ArraySize(array)) /* Some stuff that is left out of GNU .h files!? */ #ifndef SEEK_SET #define SEEK_SET 0 #endif #ifndef SEEK_CUR #define SEEK_CUR 1 #endif #ifndef SEEK_END #define SEEK_END 2 #endif #ifndef FILEPATH_H void splitPath(char *path, char dir[PATH_LEN], char name[FILENAME_LEN], char extension[FILEEXT_LEN]); /* Split a full path into components. The dir component will include the * trailing / if any. The extension component will include the starting * . if any. Pass in NULL for dir, name, or extension if you don't care about * that part. */ #endif /* FILEPATH_H */ char *addSuffix(char *head, char *suffix); /* Return a needMem'd string containing "headsuffix". Should be free'd when finished. */ void chopSuffix(char *s); /* Remove suffix (last . in string and beyond) if any. */ void chopSuffixAt(char *s, char c); /* Remove end of string from last occurrence of char c. * chopSuffixAt(s, '.') is equivalent to regular chopSuffix. */ char *chopPrefix(char *s); /* This will replace the first '.' in a string with * 0, and return the character after this. If there * is no '.' in the string this will just return the * unchanged s passed in. */ char *chopPrefixAt(char *s, char c); /* Like chopPrefix, but can chop on any character, not just '.' */ FILE *mustOpen(char *fileName, char *mode); /* Open a file - or squawk and die. */ void mustWrite(FILE *file, void *buf, size_t size); /* Write to file or squawk and die. */ #define writeOne(file, var) mustWrite((file), &(var), sizeof(var)) /* Write out one variable to file. */ void mustRead(FILE *file, void *buf, size_t size); /* Read size bytes from a file or squawk and die. */ #define mustReadOne(file, var) mustRead((file), &(var), sizeof(var)) /* Read one variable from file or die. */ void mustGetLine(FILE *file, char *buf, int charCount); /* Read at most charCount-1 bytes from file, but stop after newline if one is * encountered. The string in buf is '\0'-terminated. (See man 3 fgets.) * Die if there is an error. */ int mustOpenFd(char *fileName, int flags); /* Open a file descriptor (see man 2 open) or squawk and die. */ void mustReadFd(int fd, void *buf, size_t size); /* Read size bytes from a file descriptor or squawk and die. */ void mustWriteFd(int fd, void *buf, size_t size); /* Write size bytes to file descriptor fd or die. (See man 2 write.) */ off_t mustLseek(int fd, off_t offset, int whence); /* Seek to given offset, relative to whence (see man lseek) in file descriptor fd or errAbort. * Return final offset (e.g. if this is just an (fd, 0, SEEK_CUR) query for current position). */ void mustCloseFd(int *pFd); /* Close file descriptor *pFd if >= 0, abort if there's an error, set *pFd = -1. */ #define writeOneFd(fd, var) mustWriteFd((fd), &(var), sizeof(var)) /* Write out one variable to file descriptor fd. */ #define readOne(file, var) (fread(&(var), sizeof(var), 1, (file)) == 1) /* Read one variable from file. Returns FALSE if can't do it. */ #define readOneFd(fd, var) (read((fd), &(var), sizeof(var)) == sizeof(var)) /* Read one variable from file. Returns FALSE if can't do it. */ #define mustReadOneFd(fd, var) mustReadFd((fd), &(var), sizeof(var)) /* Read one variable from file or die. */ #define memReadOne(pPt, var) memRead((pPt), &(var), sizeof(var)) /* Read one variable from memory. */ void writeString(FILE *f, char *s); /* Write a 255 or less character string to a file. * This will write the length of the string in the first * byte then the string itself. */ char *readString(FILE *f); /* Read a string (written with writeString) into * memory. freeMem the result when done. Returns * NULL at EOF. */ char *mustReadString(FILE *f); /* Read a string. Squawk and die at EOF or if any problem. */ boolean fastReadString(FILE *f, char buf[256]); /* Read a string into buffer, which must be long enough * to hold it. String is in 'writeString' format. * Returns FALSE at EOF. */ void msbFirstWriteBits64(FILE *f, bits64 x); /* Write out 64 bit number in manner that is portable across architectures */ bits64 msbFirstReadBits64(FILE *f); /* Write out 64 bit number in manner that is portable across architectures */ void carefulClose(FILE **pFile); /* Close file if open and null out handle to it. */ boolean carefulCloseWarn(FILE **pFile); /* Close file if open and null out handle to it. * Return FALSE and print a warning message if there * is a problem.*/ char *firstWordInFile(char *fileName, char *wordBuf, int wordBufSize); /* Read the first word in file into wordBuf. */ struct fileOffsetSize /* A piece of a file. */ { struct fileOffsetSize *next; /* Next in list. */ bits64 offset; /* Start offset of block. */ bits64 size; /* Size of block. */ }; int fileOffsetSizeCmp(const void *va, const void *vb); /* Help sort fileOffsetSize by offset. */ struct fileOffsetSize *fileOffsetSizeMerge(struct fileOffsetSize *inList); /* Returns a new list which is inList transformed to have adjacent blocks * merged. Best to use this with a sorted list. */ void fileOffsetSizeFindGap(struct fileOffsetSize *list, struct fileOffsetSize **pBeforeGap, struct fileOffsetSize **pAfterGap); /* Starting at list, find all items that don't have a gap between them and the previous item. * Return at gap, or at end of list, returning pointers to the items before and after the gap. */ void mustSystem(char *cmd); /* Execute cmd using "sh -c" or die. (See man 3 system.) fail on errors */ int roundingScale(int a, int p, int q); /* returns rounded a*p/q */ int intAbs(int a); /* Return integer absolute value */ #define logBase2(x)(log(x)/log(2)) /* return log base two of number */ #define round(a) ((int)((a)+0.5)) /* Round floating point val to nearest integer. */ #define roundll(a) ((long long)((a)+0.5)) /* Round floating point val to nearest long long. */ #ifndef min #define min(a,b) ( (a) < (b) ? (a) : (b) ) /* Return min of a and b. */ #endif #ifndef max #define max(a,b) ( (a) > (b) ? (a) : (b) ) /* Return max of a and b. */ #endif int rangeIntersection(int start1, int end1, int start2, int end2); /* Return amount of bases two ranges intersect over, 0 or negative if no * intersection. */ int positiveRangeIntersection(int start1, int end1, int start2, int end2); /* Return amount of bases two ranges intersect over, 0 if no * intersection. */ INLINE void memRead(char **pPt, void *buf, int size) /* Copy memory from *pPt to buf, and advance *pPt by size. */ { memcpy(buf, *pPt, size); *pPt += size; } INLINE void memWrite(char **pPt, void *buf, int size) /* Copy memory from buf to *pPt and advance *pPt by size. */ { memcpy(*pPt, buf, size); *pPt += size; } #define memWriteOne(pPt, var) memWrite((pPt), &(var), sizeof(var)) /* Write out one variable to memory stream. */ INLINE void memWriteFloat(char **pPt, float val) /* Write out floating point val to file. Mostly to convert from double... */ { memWriteOne(pPt, val); } bits64 byteSwap64(bits64 a); /* Swap from intel to sparc order of a 64 bit quantity. */ bits64 readBits64(FILE *f, boolean isSwapped); /* Read and optionally byte-swap 64 bit entity. */ bits64 fdReadBits64(int fd, boolean isSwapped); /* Read and optionally byte-swap 64 bit entity. */ bits64 memReadBits64(char **pPt, boolean isSwapped); /* Read and optionally byte-swap 64 bit entity from memory buffer pointed to by * *pPt, and advance *pPt past read area. */ bits32 byteSwap32(bits32 a); /* Swap from intel to sparc order of a 32 bit quantity. */ bits32 readBits32(FILE *f, boolean isSwapped); /* Read and optionally byte-swap 32 bit entity. */ bits32 fdReadBits32(int fd, boolean isSwapped); /* Read and optionally byte-swap 32 bit entity. */ bits32 memReadBits32(char **pPt, boolean isSwapped); /* Read and optionally byte-swap 32 bit entity from memory buffer pointed to by * *pPt, and advance *pPt past read area. */ bits16 byteSwap16(bits16 a); /* Swap from intel to sparc order of a 16 bit quantity. */ bits16 readBits16(FILE *f, boolean isSwapped); /* Read and optionally byte-swap 16 bit entity. */ bits16 fdReadBits16(int fd, boolean isSwapped); /* Read and optionally byte-swap 16 bit entity. */ bits16 memReadBits16(char **pPt, boolean isSwapped); /* Read and optionally byte-swap 32 bit entity from memory buffer pointed to by * *pPt, and advance *pPt past read area. */ double byteSwapDouble(double a); /* Return byte-swapped version of a */ double readDouble(FILE *f, boolean isSwapped); /* Read and optionally byte-swap double-precision floating point entity. */ double memReadDouble(char **pPt, boolean isSwapped); /* Read and optionally byte-swap double-precision floating point entity * from memory buffer pointed to by *pPt, and advance *pPt past read area. */ float byteSwapFloat(float a); /* Return byte-swapped version of a */ float readFloat(FILE *f, boolean isSwapped); /* Read and optionally byte-swap single-precision floating point entity. */ float memReadFloat(char **pPt, boolean isSwapped); /* Read and optionally byte-swap single-precision floating point entity * from memory buffer pointed to by *pPt, and advance *pPt past read area. */ void removeReturns(char* dest, char* src); /* Removes the '\r' character from a string. * the source and destination strings can be the same, * if there are no threads */ int intExp(char *text); /* Convert text to integer expression and evaluate. * Throws if it finds a non-number. */ double doubleExp(char *text); /* Convert text to floating point expression and * evaluate. */ char* readLine(FILE* fh); /* Read a line of any size into dynamic memory, return null on EOF */ off_t fileSize(char *fileName); /* The size of a file. */ boolean fileExists(char *fileName); /* Does a file exist? */ /* Friendly name for strstrNoCase */ char *containsStringNoCase(char *haystack, char *needle); char *strstrNoCase(char *haystack, char *needle); /* A case-insensitive strstr */ int vasafef(char* buffer, int bufSize, char *format, va_list args); /* Format string to buffer, vsprintf style, only with buffer overflow * checking. The resulting string is always terminated with zero byte. */ int safef(char* buffer, int bufSize, char *format, ...) /* Format string to buffer, vsprintf style, only with buffer overflow * checking. The resulting string is always terminated with zero byte. */ #ifdef __GNUC__ __attribute__((format(printf, 3, 4))) #endif ; void safecpy(char *buf, size_t bufSize, const char *src); /* copy a string to a buffer, with bounds checking.*/ void safencpy(char *buf, size_t bufSize, const char *src, size_t n); /* copy n characters from a string to a buffer, with bounds checking. * Unlike strncpy, always null terminates the result */ void safecat(char *buf, size_t bufSize, const char *src); /* Append a string to a buffer, with bounds checking.*/ void safencat(char *buf, size_t bufSize, const char *src, size_t n); /* append n characters from a string to a buffer, with bounds checking. */ char *naForNull(char *s); /* Return 'n/a' if s is NULL, otherwise s. */ char *naForEmpty(char *s); /* Return n/a if s is "" or NULL, otherwise s. */ char *emptyForNull(char *s); /* Return "" if s is NULL, otherwise s. */ char *nullIfAllSpace(char *s); /* Return NULL if s is all spaces, otherwise s. */ char *trueFalseString(boolean b); /* Return "true" or "false" */ void uglyTime(char *label, ...); /* Print label and how long it's been since last call. Call with * a NULL label to initialize. */ /* In case the development environment does not supply INFINITY */ #if !defined(INFINITY) #define INFINITY (1.0/0.0) #endif void makeDirs(char* path); /* make a directory, including parent directories */ char *skipNumeric(char *s); /* Return first char of s that's not a digit */ char *skipToNumeric(char *s); /* skip up to where numeric digits appear */ char *splitOffNonNumeric(char *s); /* Split off non-numeric part, e.g. mm of mm8. Result should be freed when done */ char *splitOffNumber(char *db); /* Split off number part, e.g. 8 of mm8. Result should be freed when done */ void childExecFailedExit(char *msg); /* Child exec failed, so quit without atexit cleanup */ void vaDumpStack(char *format, va_list args); /* debugging function to run the pstack program on the current process. In * prints a message, following by a new line, and then the stack track. Just * prints errors to stderr rather than aborts. For debugging purposes * only. */ void dumpStack(char *format, ...) /* debugging function to run the pstack program on the current process. In * prints a message, following by a new line, and then the stack track. Just * prints errors to stderr rather than aborts. For debugging purposes * only. */ #if defined(__GNUC__) __attribute__((format(printf, 1, 2))) #endif ; // SETTING_ON set of macros are frequently used comparisons of string values for boolean questions. // Notice the subtle difference between NOT_ON and IS_OFF. // NOT_ON could be NULL but IS_OFF must be explicitly set #define SETTING_IS_ON(setting) ( setting && (sameWord(setting,"on") || sameWord(setting,"true") \ || sameWord(setting,"yes") || sameWord(setting,"enabled") \ || atoi(setting) != 0) ) #define SETTING_NOT_ON(setting) (!SETTING_IS_ON(setting)) #define SETTING_IS_OFF(setting) ( setting && (sameWord(setting,"off") \ || sameWord(setting,"false") || sameWord(setting,"no") \ || sameWord(setting,"disabled") || sameWord(setting,"0")) ) // Standard bit mask macros #define BITS_ADD( flags,bits) ((flags) = ((flags) | (bits))) #define BITS_REMOVE( flags,bits) ((flags) = ((flags) & ~(bits))) #define BITS_ARE_ON( flags,bits) (((flags) & (bits)) == (bits)) #define BITS_ARE_OFF(flags,bits) (((flags) & (bits)) == 0) // It is sometimes useful to distinguish between 3 "boolean" states: TRUE, FALSE and UNKNOWN enum enumBool { beUnknown=0, // Not yet set ebYes=1, // already set to TRUE ebNo=-1 // already set to FALSE }; #define SET_TO_YES(ebool) { (ebool) = ebYes; } #define SET_TO_NO(ebool) { (ebool) = ebNo; } #define IS_YES(ebool) ((ebool) == ebYes) #define IS_NO(ebool) ((ebool) == ebNo) #define IS_KNOWN(ebool) (IS_YES(ebool) || IS_NO(ebool)) #define IS_TRUE IS_YES #define IS_FALSE IS_NO time_t mktimeFromUtc (struct tm *t); /* Return time_t for tm in UTC (GMT) * Useful for stuff like converting to time_t the * last-modified HTTP response header * which is always GMT. Returns -1 on failure of mktime */ time_t dateToSeconds(const char *date,const char*format); // Convert a string date to time_t boolean dateIsOld(const char *date,const char*format); // Is this string date older than now? boolean dateIsOlderBy(const char *date,const char*format, time_t seconds); // Is this string date older than now by this many seconds? char *dateAddTo(char *date,char *format,int addYears,int addMonths,int addDays); /* Add years,months,days to a formatted date and returns the new date as a cloned string * format is a strptime/strftime format: %F = yyyy-mm-dd */ boolean haplotype(const char *name); /* Is this name a haplotype name ? _hap or _alt in the name */ #endif /* COMMON_H */ rtracklayer/src/ucsc/dlist.c0000644000175400017540000001557513556116552017160 0ustar00biocbuildbiocbuild/* dlist.c - Doubly-linked list routines. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include "common.h" #include "dlist.h" void dlListInit(struct dlList *dl) /* Initialize list to be empty */ { dl->head = (struct dlNode *)(&dl->nullMiddle); dl->nullMiddle = NULL; dl->tail = (struct dlNode *)(&dl->head); } struct dlList *newDlList() /* Return a new doubly linked list. */ { struct dlList *dl; AllocVar(dl); dl->head = (struct dlNode *)(&dl->nullMiddle); dl->tail = (struct dlNode *)(&dl->head); return dl; } void dlListReset(struct dlList *dl) /* Reset a list to the empty state (does not free values) */ { struct dlNode *node, *next; for (node = dl->head; node->next != NULL; node = next) { next = node->next; freeMem(node); } dl->head = (struct dlNode *)(&dl->nullMiddle); dl->nullMiddle = NULL; dl->tail = (struct dlNode *)(&dl->head); } void freeDlList(struct dlList **pList) /* Free up a doubly linked list and it's nodes (but not the node values). */ { struct dlList *list = *pList; if (list != NULL) { dlListReset(list); freez(pList); } } void freeDlListAndVals(struct dlList **pList) /* Free all values in doubly linked list and the list itself. (Just calls * freeMem on all values. */ { struct dlList *list = *pList; if (list != NULL) { struct dlNode *node; for (node = list->head; node->next != NULL; node = node->next) freeMem(node->val); freeDlList(pList); } } void dlInsertBetween(struct dlNode *before, struct dlNode *after, struct dlNode *newNode) { before->next = newNode; newNode->prev = before; newNode->next = after; after->prev = newNode; } void dlAddBefore(struct dlNode *anchor, struct dlNode *newNode) /* Add a node to list before anchor member. */ { dlInsertBetween(anchor->prev, anchor, newNode); } void dlAddAfter(struct dlNode *anchor, struct dlNode *newNode) /* Add a node to list after anchor member. */ { dlInsertBetween(anchor, anchor->next, newNode); } void dlAddHead(struct dlList *list, struct dlNode *newNode) /* Add a node to head of list. */ { struct dlNode *head = list->head; dlInsertBetween(head->prev, head, newNode); } void dlAddTail(struct dlList *list, struct dlNode *newNode) /* Add a node to tail of list. */ { struct dlNode *tail = list->tail; dlInsertBetween(tail, tail->next, newNode); } struct dlNode *dlAddValBefore(struct dlNode *anchor, void *val) /* Create a node containing val and add to list before anchor member. */ { struct dlNode *node = AllocA(struct dlNode); node->val = val; dlAddBefore(anchor, node); return node; } struct dlNode *dlAddValAfter(struct dlNode *anchor, void *val) /* Create a node containing val and add to list after anchor member. */ { struct dlNode *node = AllocA(struct dlNode); node->val = val; dlAddAfter(anchor, node); return node; } struct dlNode *dlAddValHead(struct dlList *list, void *val) /* Create a node containing val and add to head of list. */ { struct dlNode *node = AllocA(struct dlNode); node->val = val; dlAddHead(list, node); return node; } struct dlNode *dlAddValTail(struct dlList *list, void *val) /* Create a node containing val and add to tail of list. */ { struct dlNode *node = AllocA(struct dlNode); node->val = val; dlAddTail(list, node); return node; } void dlRemove(struct dlNode *node) /* Removes a node from list. Node is not freed. */ { struct dlNode *before = node->prev; struct dlNode *after = node->next; before->next = after; after->prev = before; node->prev = NULL; node->next = NULL; } void dlRemoveHead(struct dlList *list) /* Removes head from list. Node is not freed. */ { dlRemove(list->head); } void dlRemoveTail(struct dlList *list) /* Remove tail from list. Node is not freed. */ { dlRemove(list->tail); } struct dlNode *dlPopHead(struct dlList *list) /* Remove first node from list and return it. */ { struct dlNode *node = list->head; if (node->next == NULL) return NULL; dlRemove(node); return node; } struct dlNode *dlPopTail(struct dlList *list) /* Remove last node from list and return it. */ { struct dlNode *node = list->tail; if (node->prev == NULL) return NULL; dlRemove(node); return node; } void dlDelete(struct dlNode **nodePtr) /* Removes a node from list and frees it. */ { struct dlNode *node = *nodePtr; if (node != NULL) { dlRemove(node); freeMem(node); } } int dlCount(struct dlList *list) /* Return length of list. */ { return slCount(list->head) - 1; } struct dlSorter /* Helper structure for sorting dlNodes preserving order */ { struct dlNode *node; }; static int (*compareFunc)(const void *elem1, const void *elem2); /* Node comparison pointer, just used by dlSortNodes and helpers. */ static int dlNodeCmp(const void *elem1, const void *elem2) /* Compare two dlSorters indirectly, by calling compareFunc. */ { struct dlSorter *a = (struct dlSorter *)elem1; struct dlSorter *b = (struct dlSorter *)elem2; return compareFunc(&a->node->val, &b->node->val); } void dlSort(struct dlList *list, int (*compare )(const void *elem1, const void *elem2)) /* Sort a singly linked list with Qsort and a temporary array. * The arguments to the compare function in real, non-void, life * are pointers to pointers of the type that is in the val field of * the nodes of the list. */ { int len = dlCount(list); if (len > 1) { /* Move val's onto an array, sort, and then put back into list. */ struct dlSorter *sorter = needLargeMem(len * sizeof(sorter[0])), *s; struct dlNode *node; int i; for (i=0, node = list->head; inext) { s = &sorter[i]; s->node = node; } compareFunc = compare; qsort(sorter, len, sizeof(sorter[0]), dlNodeCmp); dlListInit(list); for (i=0; ihead; else return list->head->prev; } struct dlNode *dlGetAfterTail(struct dlList *list) /* Get the node after the tail of the list */ { if (dlEmpty(list)) return list->tail; else return list->tail->next; } void *dlListToSlList(struct dlList *dList) /* Return slList from dlList. */ { struct slList *list = NULL, *el; struct dlNode *node; for (node = dList->tail; node->prev != NULL; node = node->prev) { el = node->val; slAddHead(&list, el); } return list; } void dlCat(struct dlList *a, struct dlList *b) /* Move items from b to end of a. */ { struct dlNode *node; while ((node = dlPopHead(b)) != NULL) dlAddTail(a, node); } struct dlNode *dlValInList(struct dlList *list, void *val) /* Return node on list if any that has associated val. */ { struct dlNode *node; for (node = list->head; !dlEnd(node); node = node->next) if (node->val == val) return node; return NULL; } rtracklayer/src/ucsc/dlist.h0000644000175400017540000001000313556116552017142 0ustar00biocbuildbiocbuild/* dlist.h - Headers for generic doubly-linked list routines. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef DLIST_H #define DLIST_H #ifndef COMMON_H #include "common.h" #endif struct dlNode /* An element on a doubly linked list. */ { struct dlNode *next; struct dlNode *prev; void *val; }; struct dlList /* A doubly linked list. */ { struct dlNode *head; struct dlNode *nullMiddle; struct dlNode *tail; }; #define dlEnd(node) (node->next == NULL) /* True if node past end. */ #define dlStart(node) (node->prev == NULL) /* True if node before start. */ /* Iterate on a doubly linked list as so: for (el = list->head; !dlEnd(el); el = el->next) val = el->val; or for (el = list->tail; !dlStart(el); el = el->prev) val = el->val; */ struct dlList *newDlList(); /* Return a new doubly linked list. */ #define dlListNew newDlList /* Add object-first synonym. */ void dlListInit(struct dlList *dl); /* Initialize list to be empty */ void dlListReset(struct dlList *dl); /* Reset a list to the empty state (does not free values) */ void freeDlList(struct dlList **pList); /* Free up a doubly linked list and it's nodes (but not the node values). */ #define dlListFree freeDlList void freeDlListAndVals(struct dlList **pList); /* Free all values in doubly linked list and the list itself. (Just calls * freeMem on all values. */ #define dlListFreeAndVals freeDlListAndVals void dlAddBefore(struct dlNode *anchor, struct dlNode *newNode); /* Add a node to list before anchor member. */ void dlAddAfter(struct dlNode *anchor, struct dlNode *newNode); /* Add a node to list after anchor member. */ void dlAddHead(struct dlList *list, struct dlNode *newNode); /* Add a node to head of list. */ void dlAddTail(struct dlList *list, struct dlNode *newNode); /* Add a node to tail of list. */ struct dlNode *dlAddValBefore(struct dlNode *anchor, void *val); /* Create a node containing val and add to list before anchor member. */ struct dlNode *dlAddValAfter(struct dlNode *anchor, void *val); /* Create a node containing val and add to list after anchor member. */ struct dlNode *dlAddValHead(struct dlList *list, void *val); /* Create a node containing val and add to head of list. */ struct dlNode *dlAddValTail(struct dlList *list, void *val); /* Create a node containing val and add to tail of list. */ void dlRemove(struct dlNode *node); /* Removes a node from list. Node is not freed. */ void dlRemoveHead(struct dlList *list); /* Removes head from list. Node is not freed. */ void dlRemoveTail(struct dlList *list); /* Remove tail from list. Node is not freed. */ struct dlNode *dlPopHead(struct dlList *list); /* Remove first node from list and return it. */ struct dlNode *dlPopTail(struct dlList *list); /* Remove last node from list and return it. */ void dlDelete(struct dlNode **nodePtr); /* Removes a node from list and frees it. */ int dlCount(struct dlList *list); /* Return length of list. */ boolean dlEmpty(struct dlList *list); /* Return TRUE if list is empty. */ #define dlIsEmpty(list) ((list)->head->next == NULL) /* Return TRUE if list is empty. Macro version of above. */ struct dlNode *dlGetBeforeHead(struct dlList *list); /* Get the node before the head of the list */ struct dlNode *dlGetAfterTail(struct dlList *list); /* Get the node after the tail of the list */ void dlSort(struct dlList *list, int (*compare )(const void *elem1, const void *elem2)); /* Sort a doubly linked list with Qsort and a temporary array. * The arguments to the compare function in real, non-void, life * are pointers to pointers of the type that is in the val field of * the nodes of the list. */ void *dlListToSlList(struct dlList *dList); /* Return slList from dlList. */ void dlCat(struct dlList *a, struct dlList *b); /* Move items from b to end of a. */ struct dlNode *dlValInList(struct dlList *list, void *val); /* Return node on list if any that has associated val. */ #endif /* DLIST_H */ rtracklayer/src/ucsc/dnaseq.c0000644000175400017540000000765313556116552017312 0ustar00biocbuildbiocbuild/* dnaSeq.c - stuff to manage DNA sequences. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include "common.h" #include "dnaseq.h" #include "bits.h" #include "hash.h" #include "obscure.h" struct dnaSeq *newDnaSeq(DNA *dna, int size, char *name) /* Create a new DNA seq. */ { struct dnaSeq *seq; seq = needMem(sizeof(*seq)); if (name != NULL) seq->name = cloneString(name); seq->dna = dna; seq->size = size; seq->mask = NULL; return seq; } struct dnaSeq *cloneDnaSeq(struct dnaSeq *orig) /* Duplicate dna sequence in RAM. */ { struct dnaSeq *seq = CloneVar(orig); seq->name = cloneString(seq->name); seq->dna = needHugeMem(seq->size+1); memcpy(seq->dna, orig->dna, seq->size+1); seq->mask = NULL; if (orig->mask != NULL) { seq->mask = bitClone(orig->mask, seq->size); } return seq; } void freeDnaSeq(struct dnaSeq **pSeq) /* Free up DNA seq. (And unlink underlying resource node.) */ { struct dnaSeq *seq = *pSeq; if (seq == NULL) return; freeMem(seq->name); freeMem(seq->dna); bitFree(&seq->mask); freez(pSeq); } void freeDnaSeqList(struct dnaSeq **pSeqList) /* Free up list of DNA sequences. */ { struct dnaSeq *seq, *next; for (seq = *pSeqList; seq != NULL; seq = next) { next = seq->next; freeDnaSeq(&seq); } *pSeqList = NULL; } boolean seqIsLower(bioSeq *seq) /* Return TRUE if sequence is all lower case. */ { int size = seq->size, i; char *poly = seq->dna; for (i=0; idna, seq->size); } aaSeq *translateSeqN(struct dnaSeq *inSeq, unsigned offset, unsigned inSize, boolean stop) /* Return a translated sequence. Offset is position of first base to * translate. If size is 0 then use length of inSeq. */ { aaSeq *seq; DNA *dna = inSeq->dna; AA *pep, aa; int i, lastCodon; int actualSize = 0; assert(offset <= inSeq->size); if ((inSize == 0) || (inSize > (inSeq->size - offset))) inSize = inSeq->size - offset; lastCodon = offset + inSize - 3; AllocVar(seq); seq->dna = pep = needLargeMem(inSize/3+1); for (i=offset; i <= lastCodon; i += 3) { aa = lookupCodon(dna+i); if (aa == 0) { if (stop) break; else aa = 'Z'; } *pep++ = aa; ++actualSize; } *pep = 0; assert(actualSize <= inSize/3+1); seq->size = actualSize; seq->name = cloneString(inSeq->name); return seq; } aaSeq *translateSeq(struct dnaSeq *inSeq, unsigned offset, boolean stop) /* Return a translated sequence. Offset is position of first base to * translate. If stop is TRUE then stop at first stop codon. (Otherwise * represent stop codons as 'Z'). */ { return translateSeqN(inSeq, offset, 0, stop); } bioSeq *whichSeqIn(bioSeq **seqs, int seqCount, char *letters) /* Figure out which if any sequence letters is in. */ { aaSeq *seq; int i; for (i=0; idna <= letters && letters < seq->dna + seq->size) return seq; } internalErr(); return NULL; } Bits *maskFromUpperCaseSeq(bioSeq *seq) /* Allocate a mask for sequence and fill it in based on * sequence case. */ { int size = seq->size, i; char *poly = seq->dna; Bits *b = bitAlloc(size); for (i=0; inext) hashAddUnique(hash, seq->name, seq); return hash; } int dnaSeqCmpName(const void *va, const void *vb) /* Compare to sort based on sequence name. */ { const struct dnaSeq *a = *((struct dnaSeq **)va); const struct dnaSeq *b = *((struct dnaSeq **)vb); return strcmp(a->name, b->name); } rtracklayer/src/ucsc/dnaseq.h0000644000175400017540000000433113556116552017305 0ustar00biocbuildbiocbuild/* dnaSeq - stuff to manage DNA sequences. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef DNASEQ_H #define DNASEQ_H #ifndef DNAUTIL_H #include "dnautil.h" #endif #ifndef BITS_H #include "bits.h" #endif struct dnaSeq /* A dna sequence in one-character per base format. */ { struct dnaSeq *next; /* Next in list. */ char *name; /* Name of sequence. */ DNA *dna; /* Sequence base by base. */ int size; /* Size of sequence. */ Bits* mask; /* Repeat mask (optional) */ }; typedef struct dnaSeq bioSeq; /* Preferred use if either DNA or protein. */ typedef struct dnaSeq aaSeq; /* Preferred use if protein. */ struct dnaSeq *newDnaSeq(DNA *dna, int size, char *name); /* Create a new DNA seq. */ struct dnaSeq *cloneDnaSeq(struct dnaSeq *seq); /* Duplicate dna sequence in RAM. */ void freeDnaSeq(struct dnaSeq **pSeq); /* Free up DNA seq. */ #define dnaSeqFree freeDnaSeq void freeDnaSeqList(struct dnaSeq **pSeqList); /* Free up list of DNA sequences. */ #define dnaSeqFreeList freeDnaSeqList aaSeq *translateSeqN(struct dnaSeq *inSeq, unsigned offset, unsigned size, boolean stop); /* Return a translated sequence. Offset is position of first base to * translate. If size is 0 then use length of inSeq. */ aaSeq *translateSeq(struct dnaSeq *inSeq, unsigned offset, boolean stop); /* Return a translated sequence. Offset is position of first base to * translate. If stop is TRUE then stop at first stop codon. (Otherwise * represent stop codons as 'Z'). */ boolean seqIsDna(bioSeq *seq); /* Make educated guess whether sequence is DNA or protein. */ boolean seqIsLower(bioSeq *seq); /* Return TRUE if sequence is all lower case. */ bioSeq *whichSeqIn(bioSeq **seqs, int seqCount, char *letters); /* Figure out which if any sequence letters is in. */ Bits *maskFromUpperCaseSeq(bioSeq *seq); /* Allocate a mask for sequence and fill it in based on * sequence case. */ struct hash *dnaSeqHash(struct dnaSeq *seqList); /* Return hash of sequences keyed by name. */ int dnaSeqCmpName(const void *va, const void *vb); /* Compare to sort based on sequence name. */ #endif /* DNASEQ_H */ rtracklayer/src/ucsc/dnautil.c0000644000175400017540000006311213556116552017467 0ustar00biocbuildbiocbuild/* Some stuff that you'll likely need in any program that works with * DNA. Includes stuff for amino acids as well. * * Assumes that DNA is stored as a character. * The DNA it generates will include the bases * as lowercase tcag. It will generally accept * uppercase as well, and also 'n' or 'N' or '-' * for unknown bases. * * Amino acids are stored as single character upper case. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include "common.h" #include "dnautil.h" struct codonTable /* The dread codon table. */ { DNA *codon; /* Lower case. */ AA protCode; /* Upper case. The "Standard" code */ AA mitoCode; /* Upper case. Vertebrate Mitochondrial translations */ }; struct codonTable codonTable[] = /* The master codon/protein table. */ { {"ttt", 'F', 'F',}, {"ttc", 'F', 'F',}, {"tta", 'L', 'L',}, {"ttg", 'L', 'L',}, {"tct", 'S', 'S',}, {"tcc", 'S', 'S',}, {"tca", 'S', 'S',}, {"tcg", 'S', 'S',}, {"tat", 'Y', 'Y',}, {"tac", 'Y', 'Y',}, {"taa", 0, 0,}, {"tag", 0, 0,}, {"tgt", 'C', 'C',}, {"tgc", 'C', 'C',}, {"tga", 0, 'W',}, {"tgg", 'W', 'W',}, {"ctt", 'L', 'L',}, {"ctc", 'L', 'L',}, {"cta", 'L', 'L',}, {"ctg", 'L', 'L',}, {"cct", 'P', 'P',}, {"ccc", 'P', 'P',}, {"cca", 'P', 'P',}, {"ccg", 'P', 'P',}, {"cat", 'H', 'H',}, {"cac", 'H', 'H',}, {"caa", 'Q', 'Q',}, {"cag", 'Q', 'Q',}, {"cgt", 'R', 'R',}, {"cgc", 'R', 'R',}, {"cga", 'R', 'R',}, {"cgg", 'R', 'R',}, {"att", 'I', 'I',}, {"atc", 'I', 'I',}, {"ata", 'I', 'M',}, {"atg", 'M', 'M',}, {"act", 'T', 'T',}, {"acc", 'T', 'T',}, {"aca", 'T', 'T',}, {"acg", 'T', 'T',}, {"aat", 'N', 'N',}, {"aac", 'N', 'N',}, {"aaa", 'K', 'K',}, {"aag", 'K', 'K',}, {"agt", 'S', 'S',}, {"agc", 'S', 'S',}, {"aga", 'R', 0,}, {"agg", 'R', 0,}, {"gtt", 'V', 'V',}, {"gtc", 'V', 'V',}, {"gta", 'V', 'V',}, {"gtg", 'V', 'V',}, {"gct", 'A', 'A',}, {"gcc", 'A', 'A',}, {"gca", 'A', 'A',}, {"gcg", 'A', 'A',}, {"gat", 'D', 'D',}, {"gac", 'D', 'D',}, {"gaa", 'E', 'E',}, {"gag", 'E', 'E',}, {"ggt", 'G', 'G',}, {"ggc", 'G', 'G',}, {"gga", 'G', 'G',}, {"ggg", 'G', 'G',}, }; /* A table that gives values 0 for t 1 for c 2 for a 3 for g * (which is order aa's are in biochemistry codon tables) * and gives -1 for all others. */ int ntVal[256]; int ntValLower[256]; /* NT values only for lower case. */ int ntValUpper[256]; /* NT values only for upper case. */ int ntVal5[256]; int ntValNoN[256]; /* Like ntVal, but with T_BASE_VAL in place of -1 for nonexistent ones. */ DNA valToNt[(N_BASE_VAL|MASKED_BASE_BIT)+1]; /* convert tables for bit-4 indicating masked */ int ntValMasked[256]; DNA valToNtMasked[256]; static boolean inittedNtVal = FALSE; static void initNtVal() { if (!inittedNtVal) { int i; for (i=0; i= 3) { int c = ntVal[(int)dna[pos-3]]; if (c == A_BASE_VAL || c == G_BASE_VAL) return TRUE; } return FALSE; } boolean isReallyStopCodon(char *dna, boolean selenocysteine) /* Return TRUE if it's really a stop codon, even considering * possibilility of selenocysteine. */ { if (selenocysteine) { /* Luckily the mitochondria *also* replaces TGA with * something else, even though it isn't selenocysteine */ return lookupMitoCodon(dna) == 0; } else { return lookupCodon(dna) == 0; } } /* Returns one letter code for protein, * 0 for stop codon or X for bad input, * Vertebrate Mitochondrial Code */ AA lookupMitoCodon(DNA *dna) { int ix; int i; char c; if (!inittedNtVal) initNtVal(); ix = 0; for (i=0; i<3; ++i) { int bv = ntVal[(int)dna[i]]; if (bv<0) return 'X'; ix = (ix<<2) + bv; } c = codonTable[ix].mitoCode; c = toupper(c); return c; } Codon codonVal(DNA *start) /* Return value from 0-63 of codon starting at start. * Returns -1 if not a codon. */ { int v1,v2,v3; if ((v1 = ntVal[(int)start[0]]) < 0) return -1; if ((v2 = ntVal[(int)start[1]]) < 0) return -1; if ((v3 = ntVal[(int)start[2]]) < 0) return -1; return ((v1<<4) + (v2<<2) + v3); } DNA *valToCodon(int val) /* Return codon corresponding to val (0-63) */ { assert(val >= 0 && val < 64); return codonTable[val].codon; } void dnaTranslateSome(DNA *dna, char *out, int outSize) /* Translate DNA upto a stop codon or until outSize-1 amino acids, * whichever comes first. Output will be zero terminated. */ { int i; int dnaSize; int protSize = 0; outSize -= 1; /* Room for terminal zero */ dnaSize = strlen(dna); for (i=0; i= outSize) break; if ((out[protSize++] = lookupCodon(dna+i)) == 0) break; } out[protSize] = 0; } /* A little array to help us decide if a character is a * nucleotide, and if so convert it to lower case. */ char ntChars[256]; static void initNtChars() { static boolean initted = FALSE; if (!initted) { zeroBytes(ntChars, sizeof(ntChars)); ntChars['a'] = ntChars['A'] = 'a'; ntChars['c'] = ntChars['C'] = 'c'; ntChars['g'] = ntChars['G'] = 'g'; ntChars['t'] = ntChars['T'] = 't'; ntChars['n'] = ntChars['N'] = 'n'; ntChars['u'] = ntChars['U'] = 'u'; ntChars['-'] = 'n'; initted = TRUE; } } char ntMixedCaseChars[256]; static void initNtMixedCaseChars() { static boolean initted = FALSE; if (!initted) { zeroBytes(ntMixedCaseChars, sizeof(ntMixedCaseChars)); ntMixedCaseChars['a'] = 'a'; ntMixedCaseChars['A'] = 'A'; ntMixedCaseChars['c'] = 'c'; ntMixedCaseChars['C'] = 'C'; ntMixedCaseChars['g'] = 'g'; ntMixedCaseChars['G'] = 'G'; ntMixedCaseChars['t'] = 't'; ntMixedCaseChars['T'] = 'T'; ntMixedCaseChars['n'] = 'n'; ntMixedCaseChars['N'] = 'N'; ntMixedCaseChars['u'] = 'u'; ntMixedCaseChars['U'] = 'U'; ntMixedCaseChars['-'] = 'n'; initted = TRUE; } } /* Another array to help us do complement of DNA */ DNA ntCompTable[256]; static boolean inittedCompTable = FALSE; static void initNtCompTable() { zeroBytes(ntCompTable, sizeof(ntCompTable)); ntCompTable[' '] = ' '; ntCompTable['-'] = '-'; ntCompTable['='] = '='; ntCompTable['a'] = 't'; ntCompTable['c'] = 'g'; ntCompTable['g'] = 'c'; ntCompTable['t'] = 'a'; ntCompTable['u'] = 'a'; ntCompTable['n'] = 'n'; ntCompTable['-'] = '-'; ntCompTable['.'] = '.'; ntCompTable['A'] = 'T'; ntCompTable['C'] = 'G'; ntCompTable['G'] = 'C'; ntCompTable['T'] = 'A'; ntCompTable['U'] = 'A'; ntCompTable['N'] = 'N'; ntCompTable['R'] = 'Y'; ntCompTable['Y'] = 'R'; ntCompTable['M'] = 'K'; ntCompTable['K'] = 'M'; ntCompTable['S'] = 'S'; ntCompTable['W'] = 'W'; ntCompTable['V'] = 'B'; ntCompTable['H'] = 'D'; ntCompTable['D'] = 'H'; ntCompTable['B'] = 'V'; ntCompTable['X'] = 'N'; ntCompTable['r'] = 'y'; ntCompTable['y'] = 'r'; ntCompTable['s'] = 's'; ntCompTable['w'] = 'w'; ntCompTable['m'] = 'k'; ntCompTable['k'] = 'm'; ntCompTable['v'] = 'b'; ntCompTable['h'] = 'd'; ntCompTable['d'] = 'h'; ntCompTable['b'] = 'v'; ntCompTable['x'] = 'n'; ntCompTable['('] = ')'; ntCompTable[')'] = '('; inittedCompTable = TRUE; } /* Complement DNA (not reverse). */ void complement(DNA *dna, long length) { int i; if (!inittedCompTable) initNtCompTable(); for (i=0; i= 0; i--) { char *allele = alleles[i]; int alLen = strlen(allele); if (isAllNt(allele, alLen)) reverseComplement(allele, alLen); if (i != alCount-1) safecat(outStr, len+1, "/"); safecat(outStr, len+1, allele); } if (startsWith("-/", alleleStr)) { // Keep "-/" at the beginning: memmove(outStr+2, outStr, len-2); outStr[0] = '-'; outStr[1] = '/'; } return outStr; } int cmpDnaStrings(DNA *a, DNA *b) /* Compare using screwy non-alphabetical DNA order TCGA */ { for (;;) { DNA aa = *a++; DNA bb = *b++; if (aa != bb) return ntVal[(int)aa] - ntVal[(int)bb]; if (aa == 0) break; } return 0; } /* Convert T's to U's */ void toRna(DNA *dna) { DNA c; for (;;) { c = *dna; if (c == 't') *dna = 'u'; else if (c == 'T') *dna = 'U'; else if (c == 0) break; ++dna; } } char *skipIgnoringDash(char *a, int size, bool skipTrailingDash) /* Count size number of characters, and any * dash characters. */ { while (size > 0) { if (*a++ != '-') --size; } if (skipTrailingDash) while (*a == '-') ++a; return a; } int countNonDash(char *a, int size) /* Count number of non-dash characters. */ { int count = 0; int i; for (i=0; i 4) { count += 1; x >>= 2; } return count; } long dnaOrAaFilteredSize(char *raw, char filter[256]) /* Return how long DNA will be after non-DNA is filtered out. */ { char c; long count = 0; dnaUtilOpen(); while ((c = *raw++) != 0) { if (filter[(int)c]) ++count; } return count; } void dnaOrAaFilter(char *in, char *out, char filter[256]) /* Run chars through filter. */ { char c; dnaUtilOpen(); while ((c = *in++) != 0) { if ((c = filter[(int)c]) != 0) *out++ = c; } *out++ = 0; } long dnaFilteredSize(char *rawDna) /* Return how long DNA will be after non-DNA is filtered out. */ { return dnaOrAaFilteredSize(rawDna, ntChars); } void dnaFilter(char *in, DNA *out) /* Filter out non-DNA characters and change to lower case. */ { dnaOrAaFilter(in, out, ntChars); } void dnaFilterToN(char *in, DNA *out) /* Change all non-DNA characters to N. */ { DNA c; initNtChars(); while ((c = *in++) != 0) { if ((c = ntChars[(int)c]) != 0) *out++ = c; else *out++ = 'n'; } *out++ = 0; } void dnaMixedCaseFilter(char *in, DNA *out) /* Filter out non-DNA characters but leave case intact. */ { dnaOrAaFilter(in, out, ntMixedCaseChars); } long aaFilteredSize(char *raw) /* Return how long aa will be after non-aa chars is filtered out. */ { return dnaOrAaFilteredSize(raw, aaChars); } void aaFilter(char *in, DNA *out) /* Filter out non-aa characters and change to upper case. */ { dnaOrAaFilter(in, out, aaChars); } void upperToN(char *s, int size) /* Turn upper case letters to N's. */ { char c; int i; for (i=0; i= 0) { if ((val = ntVal[(int)*dna++]) >= 0) ++histogram[val]; } } bits64 basesToBits64(char *dna, int size) /* Convert dna of given size (up to 32) to binary representation */ { if (size > 32) errAbort("basesToBits64 called on %d bases, can only go up to 32", size); bits64 result = 0; int i; for (i=0; i= 0) { bVal = ntValNoN[(int)*in++]; out <<= 2; out += bVal; } return out; } bits16 packDna8(DNA *in) /* Pack 8 bases into a short word */ { bits16 out = 0; int count = 8; int bVal; while (--count >= 0) { bVal = ntValNoN[(int)*in++]; out <<= 2; out += bVal; } return out; } UBYTE packDna4(DNA *in) /* Pack 4 bases into a UBYTE */ { UBYTE out = 0; int count = 4; int bVal; while (--count >= 0) { bVal = ntValNoN[(int)*in++]; out <<= 2; out += bVal; } return out; } void unpackDna(bits32 *tiles, int tileCount, DNA *out) /* Unpack DNA. Expands to 16x tileCount in output. */ { int i, j; bits32 tile; for (i=0; i=0; --j) { out[j] = valToNt[tile & 0x3]; tile >>= 2; } out += 16; } } void unpackDna4(UBYTE *tiles, int byteCount, DNA *out) /* Unpack DNA. Expands to 4x byteCount in output. */ { int i, j; UBYTE tile; for (i=0; i=0; --j) { out[j] = valToNt[tile & 0x3]; tile >>= 2; } out += 4; } } static void checkSizeTypes() /* Make sure that some of our predefined types are the right size. */ { assert(sizeof(UBYTE) == 1); assert(sizeof(WORD) == 2); assert(sizeof(bits32) == 4); assert(sizeof(bits16) == 2); } int intronOrientationMinSize(DNA *iStart, DNA *iEnd, int minIntronSize) /* Given a gap in genome from iStart to iEnd, return * Return 1 for GT/AG intron between left and right, -1 for CT/AC, 0 for no * intron. Assumes DNA is lower cased. */ { if (iEnd - iStart < minIntronSize) return 0; if (iStart[0] == 'g' && iStart[1] == 't' && iEnd[-2] == 'a' && iEnd[-1] == 'g') { return 1; } else if (iStart[0] == 'c' && iStart[1] == 't' && iEnd[-2] == 'a' && iEnd[-1] == 'c') { return -1; } else return 0; } int intronOrientation(DNA *iStart, DNA *iEnd) /* Given a gap in genome from iStart to iEnd, return * Return 1 for GT/AG intron between left and right, -1 for CT/AC, 0 for no * intron. Assumes DNA is lower cased. */ { return intronOrientationMinSize(iStart, iEnd, 32); } int dnaScore2(DNA a, DNA b) /* Score match between two bases (relatively crudely). */ { if (a == 'n' || b == 'n') return 0; if (a == b) return 1; else return -1; } int dnaOrAaScoreMatch(char *a, char *b, int size, int matchScore, int mismatchScore, char ignore) /* Compare two sequences (without inserts or deletions) and score. */ { int i; int score = 0; for (i=0; i 0) { lineSize = lettersLeft; if (lineSize > maxPerLine) lineSize = maxPerLine; mustWrite(f, letters, lineSize); fputc('\n', f); letters += lineSize; lettersLeft -= lineSize; } } static int findTailPolyAMaybeMask(DNA *dna, int size, boolean doMask, boolean loose) /* Identify PolyA at end; mask to 'n' if specified. This allows a few * non-A's as noise to be trimmed too. Returns number of bases trimmed. * Leaves first two bases of PolyA in case there's a taa stop codon. */ { int i; int score = 10; int bestScore = 10; int bestPos = -1; int trimSize = 0; for (i=size-1; i>=0; --i) { DNA b = dna[i]; if (b == 'n' || b == 'N') continue; if (score > 20) score = 20; if (b == 'a' || b == 'A') { score += 1; if (score >= bestScore) { bestScore = score; bestPos = i; } else if (loose && score >= (bestScore - 8)) { /* If loose, keep extending even if score isn't back up to best. */ bestPos = i; } } else { score -= 10; } if (score < 0) { break; } } if (bestPos >= 0) { trimSize = size - bestPos - 2; // Leave two for aa in taa stop codon if (trimSize > 0) { if (doMask) for (i=size - trimSize; i 20) score = 20; if (b == 't' || b == 'T') { score += 1; if (score >= bestScore) { bestScore = score; bestPos = i; } else if (loose && score >= (bestScore - 8)) { /* If loose, keep extending even if score isn't back up to best. */ bestPos = i; } } else { score -= 10; } if (score < 0) { break; } } if (bestPos >= 0) { trimSize = bestPos+1 - 2; // Leave two for aa in taa stop codon if (trimSize > 0) { if (doMask) memset(dna, 'n', trimSize); } else trimSize = 0; } return trimSize; } int headPolyTSizeLoose(DNA *dna, int size) /* Return size of PolyT at start (if present). This allows a few non-T's as * noise to be trimmed too, but skips last two tt for revcomp'd taa stop * codon. * It is less conservative in extending the polyA region than maskHeadPolyT. */ { return findHeadPolyTMaybeMask(dna, size, FALSE, TRUE); } int maskHeadPolyT(DNA *dna, int size) /* Convert PolyT at start. This allows a few non-T's as noise to be * trimmed too. Returns number of bases trimmed. */ { return findHeadPolyTMaybeMask(dna, size, TRUE, FALSE); } boolean isDna(char *poly, int size) /* Return TRUE if letters in poly are at least 90% ACGTNU- */ { int i; int dnaCount = 0; dnaUtilOpen(); for (i=0; i= round(0.9 * size)); } boolean isAllDna(char *poly, int size) /* Return TRUE if size is great than 1 and letters in poly are 100% ACGTNU- */ { if (size <= 1) return FALSE; return isAllNt(poly, size); } /* Tables to convert from 0-20 to ascii single letter representation * of proteins. */ int aaVal[256]; AA valToAa[21]; AA aaChars[256]; /* 0 except for value aa characters. Converts to upper case rest. */ struct aminoAcidTable /* A little info about each amino acid. */ { int ix; char letter; char abbreviation[3]; char *name; }; struct aminoAcidTable aminoAcidTable[] = { {0, 'A', "ala", "alanine"}, {1, 'C', "cys", "cysteine"}, {2, 'D', "asp", "aspartic acid"}, {3, 'E', "glu", "glutamic acid"}, {4, 'F', "phe", "phenylalanine"}, {5, 'G', "gly", "glycine"}, {6, 'H', "his", "histidine"}, {7, 'I', "ile", "isoleucine"}, {8, 'K', "lys", "lysine"}, {9, 'L', "leu", "leucine"}, {10, 'M', "met", "methionine"}, {11, 'N', "asn", "asparagine"}, {12, 'P', "pro", "proline"}, {13, 'Q', "gln", "glutamine"}, {14, 'R', "arg", "arginine"}, {15, 'S', "ser", "serine"}, {16, 'T', "thr", "threonine"}, {17, 'V', "val", "valine"}, {18, 'W', "trp", "tryptophan"}, {19, 'Y', "tyr", "tyrosine"}, {20, 'X', "ter", "termination"}, }; char *aaAbbr(int i) /* return pointer to AA abbrevation */ { return(aminoAcidTable[i].abbreviation); } char aaLetter(int i) /* return AA letter */ { return(aminoAcidTable[i].letter); } static void initAaVal() /* Initialize aaVal and valToAa tables. */ { int i; char c, lowc; for (i=0; istring = needMem(initialBufSize+1); ds->bufSize = initialBufSize; return ds; } void freeDyString(struct dyString **pDs) /* Free up dynamic string. */ { struct dyString *ds; if ((ds = *pDs) != NULL) { freeMem(ds->string); freez(pDs); } } char *dyStringCannibalize(struct dyString **pDy) /* Kill dyString, but return the string it is wrapping * (formerly dy->string). This should be free'd at your * convenience. */ { char *s; struct dyString *ds = *pDy; assert(ds != NULL); s = ds->string; freez(pDy); return s; } void freeDyStringList(struct dyString **pDs) /* free up a list of dyStrings */ { struct dyString *ds, *next; for(ds = *pDs; ds != NULL; ds = next) { next = ds->next; freeDyString(&ds); } *pDs = NULL; } static void dyStringExpandBuf(struct dyString *ds, int newSize) /* Expand buffer to new size. */ { ds->string = needMoreMem(ds->string, ds->stringSize+1, newSize+1); ds->bufSize = newSize; } void dyStringBumpBufSize(struct dyString *ds, int size) /* Force dyString buffer to be at least given size. */ { if (ds->bufSize < size) dyStringExpandBuf(ds, size); } void dyStringAppendN(struct dyString *ds, char *string, int stringSize) /* Append string of given size to end of string. */ { int oldSize = ds->stringSize; int newSize = oldSize + stringSize; char *buf; if (newSize > ds->bufSize) { int newAllocSize = newSize + oldSize; int oldSizeTimesOneAndAHalf = oldSize * 1.5; if (newAllocSize < oldSizeTimesOneAndAHalf) newAllocSize = oldSizeTimesOneAndAHalf; dyStringExpandBuf(ds,newAllocSize); } buf = ds->string; memcpy(buf+oldSize, string, stringSize); ds->stringSize = newSize; buf[newSize] = 0; } char dyStringAppendC(struct dyString *ds, char c) /* Append char to end of string. */ { char *s; if (ds->stringSize >= ds->bufSize) dyStringExpandBuf(ds, ds->bufSize+256); s = ds->string + ds->stringSize++; *s++ = c; *s = 0; return c; } void dyStringAppendMultiC(struct dyString *ds, char c, int n) /* Append N copies of char to end of string. */ { int oldSize = ds->stringSize; int newSize = oldSize + n; int newAllocSize = newSize + oldSize; char *buf; if (newSize > ds->bufSize) dyStringExpandBuf(ds,newAllocSize); buf = ds->string; memset(buf+oldSize, c, n); ds->stringSize = newSize; buf[newSize] = 0; } void dyStringAppend(struct dyString *ds, char *string) /* Append zero terminated string to end of dyString. */ { dyStringAppendN(ds, string, strlen(string)); } void dyStringAppendEscapeQuotes(struct dyString *dy, char *string, char quot, char esc) /* Append escaped-for-quotation version of string to dy. */ { char c; char *s = string; while ((c = *s++) != 0) { if (c == quot) dyStringAppendC(dy, esc); dyStringAppendC(dy, c); } } void dyStringVaPrintf(struct dyString *ds, char *format, va_list args) /* VarArgs Printf to end of dyString. */ { /* attempt to format the string in the current space. If there * is not enough room, increase the buffer size and try again */ int avail, sz; while (TRUE) { va_list argscp; va_copy(argscp, args); avail = ds->bufSize - ds->stringSize; if (avail <= 0) { /* Don't pass zero sized buffers to vsnprintf, because who knows * if the library function will handle it. */ dyStringExpandBuf(ds, ds->bufSize+ds->bufSize); avail = ds->bufSize - ds->stringSize; } sz = vsnprintf(ds->string + ds->stringSize, avail, format, argscp); va_end(argscp); /* note that some version return -1 if too small */ if ((sz < 0) || (sz >= avail)) dyStringExpandBuf(ds, ds->bufSize+ds->bufSize); else { ds->stringSize += sz; break; } } } void dyStringPrintf(struct dyString *ds, char *format, ...) /* Printf to end of dyString. */ { va_list args; va_start(args, format); dyStringVaPrintf(ds, format, args); va_end(args); } struct dyString *dyStringCreate(char *format, ...) /* Create a dyString with a printf style initial content */ { int len = strlen(format) * 3; struct dyString *ds = newDyString(len); va_list args; va_start(args, format); dyStringVaPrintf(ds, format, args); va_end(args); return ds; } struct dyString * dyStringSub(char *orig, char *in, char *out) /* Make up a duplicate of orig with all occurences of in substituted * with out. */ { int inLen = strlen(in), outLen = strlen(out), origLen = strlen(orig); struct dyString *dy = newDyString(origLen + 2*outLen); char *s, *e; if (orig == NULL) return NULL; for (s = orig; ;) { e = stringIn(in, s); if (e == NULL) { e = orig + origLen; dyStringAppendN(dy, s, e - s); break; } else { dyStringAppendN(dy, s, e - s); dyStringAppendN(dy, out, outLen); s = e + inLen; } } return dy; } void dyStringResize(struct dyString *ds, int newSize) /* resize a string, if the string expands, blanks are appended */ { int oldSize = ds->stringSize; if (newSize > oldSize) { /* grow */ if (newSize > ds->bufSize) dyStringExpandBuf(ds, newSize + ds->stringSize); memset(ds->string+newSize, ' ', newSize); } ds->string[newSize] = '\0'; ds->stringSize = newSize; } void dyStringQuoteString(struct dyString *dy, char quotChar, char *text) /* Append quotChar-quoted text (with any internal occurrences of quotChar * \-escaped) onto end of dy. */ { char c; dyStringAppendC(dy, quotChar); while ((c = *text++) != 0) { if (c == quotChar) dyStringAppendC(dy, '\\'); dyStringAppendC(dy, c); } dyStringAppendC(dy, quotChar); } rtracklayer/src/ucsc/dystring.h0000644000175400017540000000610113556116552017672 0ustar00biocbuildbiocbuild/* dystring - dynamically resizing string. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef DYSTRING_H /* Wrapper to avoid including this twice. */ #define DYSTRING_H #include "common.h" struct dyString /* Dynamically resizable string that you can do formatted * output to. */ { struct dyString *next; /* Next in list. */ char *string; /* Current buffer. */ int bufSize; /* Size of buffer. */ int stringSize; /* Size of string. */ }; struct dyString *newDyString(int initialBufSize); /* Allocate dynamic string with initial buffer size. (Pass zero for default) */ #define dyStringNew newDyString void freeDyString(struct dyString **pDs); /* Free up dynamic string. */ #define dyStringFree(a) freeDyString(a); void freeDyStringList(struct dyString **pDs); /* Free up a list of dynamic strings */ #define dyStringFreeList(a) freeDyStringList(a); void dyStringAppend(struct dyString *ds, char *string); /* Append zero terminated string to end of dyString. */ void dyStringAppendN(struct dyString *ds, char *string, int stringSize); /* Append string of given size to end of string. */ char dyStringAppendC(struct dyString *ds, char c); /* Append char to end of string. */ void dyStringAppendMultiC(struct dyString *ds, char c, int n); /* Append N copies of char to end of string. */ void dyStringAppendEscapeQuotes(struct dyString *dy, char *string, char quot, char esc); /* Append escaped-for-quotation version of string to dy. */ #define dyStringWriteOne(dy, var) dyStringAppendN(dy, (char *)(&var), sizeof(var)) /* Write one variable (binary!) to dyString - for cases when want to treat string like * a file stream. */ void dyStringVaPrintf(struct dyString *ds, char *format, va_list args); /* VarArgs Printf to end of dyString. */ void dyStringPrintf(struct dyString *ds, char *format, ...) /* Printf to end of dyString. */ #ifdef __GNUC__ __attribute__((format(printf, 2, 3))) #endif ; struct dyString *dyStringCreate(char *format, ...); /* Create a dyString with a printf style initial content */ #define dyStringClear(ds) (ds->string[0] = ds->stringSize = 0) /* Clear string. */ struct dyString * dyStringSub(char *orig, char *in, char *out); /* Make up a duplicate of orig with all occurences of in substituted * with out. */ void dyStringBumpBufSize(struct dyString *ds, int size); /* Force dyString buffer to be at least given size. */ char *dyStringCannibalize(struct dyString **pDy); /* Kill dyString, but return the string it is wrapping * (formerly dy->string). This should be free'd at your * convenience. */ #define dyStringContents(ds) (ds)->string /* return raw string. */ #define dyStringLen(ds) ds->stringSize /* return raw string length. */ void dyStringResize(struct dyString *ds, int newSize); /* resize a string, if the string expands, blanks are appended */ void dyStringQuoteString(struct dyString *dy, char quotChar, char *text); /* Append quotChar-quoted text (with any internal occurrences of quotChar * \-escaped) onto end of dy. */ #endif /* DYSTRING_H */ rtracklayer/src/ucsc/errAbort.c0000644000175400017540000002631113556116552017607 0ustar00biocbuildbiocbuild/* errAbort.c - our error handler. * * This maintains two stacks - a warning message printer * stack, and a "abort handler" stack. * * Note that the abort function always calls the warn handler first. * This is so that the message gets sent. * * By default the warnings will go to stderr, and * aborts will exit the program. You can push a * function on to the appropriate stack to change * this behavior. The top function on the stack * gets called. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ // developer: this include is for an occasionally useful means of getting stack info without // crashing // however, it is not supported on cygwin. Conditionally compile this in when desired. //#define BACKTRACE_EXISTS #ifdef BACKTRACE_EXISTS #include #endif///def BACKTRACE_EXISTS #include #include "common.h" #include "hash.h" #include "dystring.h" #include "errAbort.h" #define maxWarnHandlers 20 #define maxAbortHandlers 12 struct perThreadAbortVars /* per thread variables for abort and warn */ { boolean debugPushPopErr; // generate stack dump on push/pop error boolean errAbortInProgress; /* Flag to indicate that an error abort is in progress. * Needed so that a warn handler can tell if it's really * being called because of a warning or an error. */ WarnHandler warnArray[maxWarnHandlers]; int warnIx; AbortHandler abortArray[maxAbortHandlers]; int abortIx; }; static struct perThreadAbortVars *getThreadVars(); // forward declaration static void defaultVaWarn(char *format, va_list args) /* Default error message handler. */ { if (format != NULL) { fflush(stdout); vfprintf(stderr, format, args); fprintf(stderr, "\n"); fflush(stderr); } } static void silentVaWarn(char *format, va_list args) /* Warning handler that just hides it. Useful sometimes when high level code * expects low level code may fail (as in finding a file on the net) but doesn't * want user to be bothered about it. */ { } void vaWarn(char *format, va_list args) /* Call top of warning stack to issue warning. */ { struct perThreadAbortVars *ptav = getThreadVars(); ptav->warnArray[ptav->warnIx](format, args); } void warn(char *format, ...) /* Issue a warning message. */ { va_list args; va_start(args, format); vaWarn(format, args); va_end(args); } void warnWithBackTrace(char *format, ...) /* Issue a warning message and append backtrace. */ { va_list args; va_start(args, format); struct dyString *dy = newDyString(255); dyStringAppend(dy, format); #define STACK_LIMIT 20 char **strings = NULL; int count = 0; // developer: this is an occasionally useful means of getting stack info without crashing // however, it is not supported on cygwin. Conditionally compile this in when desired. // The define is at top to include execinfo.h #ifdef BACKTRACE_EXISTS void *buffer[STACK_LIMIT]; count = backtrace(buffer, STACK_LIMIT); strings = backtrace_symbols(buffer, count); #endif///def BACKTRACE_EXISTS if (strings == NULL) dyStringAppend(dy,"\nno backtrace_symbols available in errabort::warnWithBackTrace()."); else { int ix = 1; dyStringAppend(dy,"\nBACKTRACE (use on cmdLine):"); if (strings[1] != NULL) { strSwapChar(strings[1],' ','\0'); dyStringPrintf(dy,"\naddr2line -Cfise %s",strings[1]); strings[1] += strlen(strings[1]) + 1; } for (; ix < count && strings[ix] != NULL; ix++) { strings[ix] = skipBeyondDelimit(strings[ix],'['); strSwapChar(strings[ix],']','\0'); dyStringPrintf(dy," %s",strings[ix]); } free(strings); } vaWarn(dyStringCannibalize(&dy), args); va_end(args); } void errnoWarn(char *format, ...) /* Prints error message from UNIX errno first, then does rest of warning. */ { char fbuf[512]; va_list args; va_start(args, format); sprintf(fbuf, "%s\n%s", strerror(errno), format); vaWarn(fbuf, args); va_end(args); } void pushWarnHandler(WarnHandler handler) /* Set abort handler */ { struct perThreadAbortVars *ptav = getThreadVars(); if (ptav->warnIx >= maxWarnHandlers-1) { #ifndef WIN32 if (ptav->debugPushPopErr) dumpStack("pushWarnHandler overflow"); #endif errAbort("Too many pushWarnHandlers, can only handle %d\n", maxWarnHandlers-1); } ptav->warnArray[++ptav->warnIx] = handler; } void popWarnHandler() /* Revert to old warn handler. */ { struct perThreadAbortVars *ptav = getThreadVars(); if (ptav->warnIx <= 0) { #ifndef WIN32 if (ptav->debugPushPopErr) dumpStack("popWarnHandler underflow"); #endif errAbort("Too few popWarnHandlers"); } --ptav->warnIx; } static void defaultAbort() /* Default error handler exits program. */ { if ((getenv("ERRASSERT") != NULL) || (getenv("ERRABORT") != NULL)) abort(); else exit(-1); } void noWarnAbort() /* Abort without message. */ { struct perThreadAbortVars *ptav = getThreadVars(); ptav->abortArray[ptav->abortIx](); exit(-1); /* This is just to make compiler happy. * We have already exited or longjmped by now. */ } void vaErrAbort(char *format, va_list args) /* Abort function, with optional (vprintf formatted) error message. */ { /* flag is needed because both errAbort and warn generate message * using the warn handler, however sometimes one needed to know * (like when logging), if it's an error or a warning. This is far from * perfect, as this isn't cleared if the error handler continues, * as with an exception mechanism. */ struct perThreadAbortVars *ptav = getThreadVars(); ptav->errAbortInProgress = TRUE; vaWarn(format, args); noWarnAbort(); } void errAbort(char *format, ...) /* Abort function, with optional (printf formatted) error message. */ { va_list args; va_start(args, format); vaErrAbort(format, args); va_end(args); } void errnoAbort(char *format, ...) /* Prints error message from UNIX errno first, then does errAbort. */ { char fbuf[512]; va_list args; va_start(args, format); sprintf(fbuf, "%s\n%s", strerror(errno), format); vaErrAbort(fbuf, args); va_end(args); } void pushAbortHandler(AbortHandler handler) /* Set abort handler */ { struct perThreadAbortVars *ptav = getThreadVars(); if (ptav->abortIx >= maxAbortHandlers-1) { #ifndef WIN32 if (ptav->debugPushPopErr) dumpStack("pushAbortHandler overflow"); #endif errAbort("Too many pushAbortHandlers, can only handle %d", maxAbortHandlers-1); } ptav->abortArray[++ptav->abortIx] = handler; } void popAbortHandler() /* Revert to old abort handler. */ { struct perThreadAbortVars *ptav = getThreadVars(); if (ptav->abortIx <= 0) { #ifndef WIN32 if (ptav->debugPushPopErr) dumpStack("popAbortHandler underflow"); #endif errAbort("Too many popAbortHandlers\n"); } --ptav->abortIx; } static void debugAbort() /* Call the debugger. */ { fflush(stdout); assert(FALSE); defaultAbort(); } void pushDebugAbort() /* Push abort handler that will invoke debugger. */ { pushAbortHandler(debugAbort); } static void warnAbortHandler(char *format, va_list args) /* warn handler that also aborts. */ { defaultVaWarn(format, args); noWarnAbort(); } void pushWarnAbort() /* Push handler that will abort on warnings. */ { pushWarnHandler(warnAbortHandler); } void pushSilentWarnHandler() /* Set warning handler to be quiet. Do a popWarnHandler to restore. */ { pushWarnHandler(silentVaWarn); } void errAbortDebugnPushPopErr() /* generate stack dump if there is a error in the push/pop functions */ { struct perThreadAbortVars *ptav = getThreadVars(); ptav->debugPushPopErr = TRUE; } boolean isErrAbortInProgress() /* Flag to indicate that an error abort is in progress. * Needed so that a warn handler can tell if it's really * being called because of a warning or an error. */ { struct perThreadAbortVars *ptav = getThreadVars(); return ptav->errAbortInProgress; } static struct perThreadAbortVars *getThreadVars() /* Return a pointer to the perThreadAbortVars for the current pthread. */ { pthread_t pid = pthread_self(); // pthread_t can be a pointer or a number, implementation-dependent. // Test for out-of-memory condition causing re-entrancy into this function that would block // on its own main mutex ptavMutex. Do this by looking for its own pid. // Some care must be exercised in testing and comparing the threads pid against one in-use. // We need yet another mutex and a boolean to tell us when the pidInUse value may be safely compared to pid. // Use a boolean since there is no known unused value for pthread_t variable. NULL and -1 are not portable. static boolean pidInUseValid = FALSE; // tells when pidInUse contains a valid pid that can be compared. static pthread_t pidInUse; // there is no "unused" value to which we can initialize this. static pthread_mutex_t pidInUseMutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_lock( &pidInUseMutex ); // If this pid equals pidInUse, then this function has been re-entered due to severe out-of-memory error. // But we only compare them when pidInUseValid is TRUE. if (pidInUseValid && pthread_equal(pid, pidInUse)) { // Avoid deadlock on self by exiting immediately. // Use pthread_equal because directly comparing two pthread_t vars is not allowed. // This re-entrancy only happens when it has aborted already due to out of memory // which should be a rare occurrence. char *errMsg = "errAbort re-entered due to out-of-memory condition. Exiting.\n"; write(STDERR_FILENO, errMsg, strlen(errMsg)); exit(1); // out of memory is a serious problem, exit immediately, but allow atexit cleanup. } pthread_mutex_unlock( &pidInUseMutex ); // This is the main mutex we really care about. // It controls access to the hash where thread-specific data is stored. static pthread_mutex_t ptavMutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_lock( &ptavMutex ); // safely tell threads that pidInUse // is valid and correctly set and may be compared to pid pthread_mutex_lock( &pidInUseMutex ); pidInUse = pthread_self(); // setting it directly to pid is not allowed. pidInUseValid = TRUE; pthread_mutex_unlock( &pidInUseMutex ); // This means that if we crash due to out-of-memory below, // it will be able to detect the re-entrancy and handle it above. static struct hash *perThreadVars = NULL; if (perThreadVars == NULL) perThreadVars = hashNew(0); // convert the pid into a string for the hash key char pidStr[64]; safef(pidStr, sizeof(pidStr), "%lld", ptrToLL(pid)); struct hashEl *hel = hashLookup(perThreadVars, pidStr); if (hel == NULL) { // if it is the first time, initialization the perThreadAbortVars struct perThreadAbortVars *ptav; AllocVar(ptav); ptav->debugPushPopErr = FALSE; ptav->errAbortInProgress = FALSE; ptav->warnIx = 0; ptav->warnArray[0] = defaultVaWarn; ptav->abortIx = 0; ptav->abortArray[0] = defaultAbort; hel = hashAdd(perThreadVars, pidStr, ptav); } // safely tell other threads that pidInUse // is no longer valid and may not be compared to pid pthread_mutex_lock( &pidInUseMutex ); pidInUseValid = FALSE; pthread_mutex_unlock( &pidInUseMutex ); // unlock our mutex controlling the hash of thread-specific data pthread_mutex_unlock( &ptavMutex ); return (struct perThreadAbortVars *)(hel->val); } rtracklayer/src/ucsc/errAbort.h0000644000175400017540000000472513556116552017621 0ustar00biocbuildbiocbuild/* ErrAbort.h - our error handler. * * This maintains two stacks - a warning message printer * stack, and a "abort handler" stack. * * By default the warnings will go to stderr, and * aborts will exit the program. You can push a * function on to the appropriate stack to change * this behavior. The top function on the stack * gets called. * * Most functions in this library will call errAbort() * if they run out of memory. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef ERRABORT_H #define ERRABORT_H boolean isErrAbortInProgress(); /* Flag to indicate that an error abort is in progress. * Needed so that a warn handler can tell if it's really * being called because of a warning or an error. */ void errAbort(char *format, ...) /* Abort function, with optional (printf formatted) error message. */ #if defined(__GNUC__) __attribute__((format(printf, 1, 2))) #endif ; void vaErrAbort(char *format, va_list args); /* Abort function, with optional (vprintf formatted) error message. */ void errnoAbort(char *format, ...) /* Prints error message from UNIX errno first, then does errAbort. */ #if defined(__GNUC__) __attribute__((format(printf, 1, 2))) #endif ; typedef void (*AbortHandler)(); /* Function that can abort. */ void pushAbortHandler(AbortHandler handler); /* Set abort handler */ void popAbortHandler(); /* Revert to old abort handler. */ void noWarnAbort(); /* Abort without message. */ void pushDebugAbort(); /* Push abort handler that will invoke debugger. */ void vaWarn(char *format, va_list args); /* Call top of warning stack to issue warning. */ void warn(char *format, ...) /* Issue a warning message. */ #if defined(__GNUC__) __attribute__((format(printf, 1, 2))) #endif ; void errnoWarn(char *format, ...) /* Prints error message from UNIX errno first, then does rest of warning. */ #if defined(__GNUC__) __attribute__((format(printf, 1, 2))) #endif ; typedef void (*WarnHandler)(char *format, va_list args); /* Function that can warn. */ void pushWarnHandler(WarnHandler handler); /* Set warning handler */ void popWarnHandler(); /* Revert to old warn handler. */ void pushWarnAbort(); /* Push handler that will abort on warnings. */ void pushSilentWarnHandler(); /* Set warning handler to be quiet. Do a popWarnHandler to restore. */ void errAbortDebugnPushPopErr(); /* generate stack dump if there is a error in the push/pop functions */ #endif /* ERRABORT_H */ rtracklayer/src/ucsc/errCatch.h0000644000175400017540000000375513556116552017576 0ustar00biocbuildbiocbuild/* errCatch - help catch errors so that errAborts aren't * fatal, and warn's don't necessarily get printed immediately. * Note that error conditions caught this way will tend to * leak resources unless there are additional wrappers. * * Typical usage is * errCatch = errCatchNew(); * if (errCatchStart(errCatch)) * doFlakyStuff(); * errCatchEnd(errCatch); * if (errCatch->gotError) * warn("Flaky stuff failed: %s", errCatch->message->string); * errCatchFree(&errCatch); * cleanupFlakyStuff(); */ #ifndef ERRCATCH_H #define ERRCATCH_H #ifndef DYSTRING_H #include "dystring.h" #endif struct errCatch /* Something to help catch errors. */ { struct errCatch *next; /* Next in stack. */ jmp_buf jmpBuf; /* Where to jump back to for recovery. */ struct dyString *message; /* Error message if any */ boolean gotError; /* Some sort of error was caught. */ boolean gotWarning; /* Some sort of error warning was raised. */ }; struct errCatch *errCatchNew(); /* Return new error catching structure. */ void errCatchFree(struct errCatch **pErrCatch); /* Free up resources associated with errCatch */ #define errCatchStart(e) (errCatchPushHandlers(e) && setjmp(e->jmpBuf) == 0) /* Little wrapper around setjmp. This returns TRUE * on the main execution thread, FALSE after abort. */ boolean errCatchPushHandlers(struct errCatch *errCatch); /* Push error handlers. Not usually called directly. * but rather through errCatchStart() macro. Always * returns TRUE. */ void errCatchEnd(struct errCatch *errCatch); /* Restore error handlers and pop self off of catching stack. */ void errCatchReWarn(struct errCatch *errCatch); /* Re-warn any warnings that happened even though no abort happened * to make them visible. */ boolean errCatchFinish(struct errCatch **pErrCatch); /* Finish up error catching. Report error if there is a * problem and return FALSE. If no problem return TRUE. * This handles errCatchEnd and errCatchFree. */ #endif /* ERRCATCH_H */ rtracklayer/src/ucsc/hash.c0000644000175400017540000004577713556116552016773 0ustar00biocbuildbiocbuild/* Hash.c - implements hashing. See hash.h for usage comments. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include "common.h" #include "localmem.h" #include "hash.h" #include "obscure.h" #include "dystring.h" /* * Hash a string key. This code is taken from Tcl interpreter. I was borrowed * after discovering a lot of collisions and poor utilization of the table * when hashing accessions. * * This function was compared to Bob Jenkins' lookup2 hash function and * (http://burtleburtle.net/bob/hash/) and Paul Hsieh's SuperFast * hash function (http://www.azillionmonkeys.com/qed/hash.html). * Both of those functions provided better utilization of the table, * but were also more expensive, so the Tcl function was used. * If hashing of binary keys is implemented, SuperFast hash should * be considered. * * for an explanation of this function, see HashStringKey() in the * Tcl source file, generic/tclHash.c, available from * http://tcl.sourceforge.net/. * * The Tcl code is: * Copyright (c) 1991-1993 The Regents of the University of California. * Copyright (c) 1994 Sun Microsystems, Inc. * * See the file "license.terms" (in the Tcl distribution) for complete * license (which is a BSD-style license). * * Since hashCrc() is in use elsewhere, * a new function hashString() was created for use in hash table. * -- markd */ bits32 hashString(char *string) /* Compute a hash value of a string. */ { char *keyStr = string; unsigned int result = 0; int c; while ((c = *keyStr++) != '\0') { result += (result<<3) + c; } return result; } bits32 hashCrc(char *string) /* Returns a CRC value on string. */ { unsigned char *us = (unsigned char *)string; unsigned char c; bits32 shiftAcc = 0; bits32 addAcc = 0; while ((c = *us++) != 0) { shiftAcc <<= 2; shiftAcc += c; addAcc += c; } return shiftAcc + addAcc; } struct hashEl *hashLookup(struct hash *hash, char *name) /* Looks for name in hash table. Returns associated element, * if found, or NULL if not. If there are multiple entries * for name, the last one added is returned (LIFO behavior). */ { struct hashEl *el = hash->table[hashString(name)&hash->mask]; while (el != NULL) { if (strcmp(el->name, name) == 0) break; el = el->next; } return el; } struct hashEl *hashLookupUpperCase(struct hash *hash, char *name) /* Lookup upper cased name in hash. (Assumes all elements of hash * are themselves already in upper case.) */ { char s[256]; safef(s, sizeof(s), "%s", name); touppers(s); return hashLookup(hash, s); } struct hashEl *hashLookupNext(struct hashEl *hashEl) /* Find the next occurance of name that may occur in the table multiple times, * or NULL if not found. Use hashLookup to find the first occurrence. Elements * are returned in LIFO order. */ { struct hashEl *el = hashEl->next; while (el != NULL) { if (strcmp(el->name, hashEl->name) == 0) break; el = el->next; } return el; } struct hashEl *hashAddN(struct hash *hash, char *name, int nameSize, void *val) /* Add name of given size to hash (no need to be zero terminated) */ { struct hashEl *el; if (hash->lm) el = lmAlloc(hash->lm, sizeof(*el)); else AllocVar(el); el->hashVal = hashString(name); int hashVal = el->hashVal & hash->mask; if (hash->lm) { el->name = lmAlloc(hash->lm, nameSize+1); memcpy(el->name, name, nameSize); } else el->name = cloneStringZ(name, nameSize); el->val = val; el->next = hash->table[hashVal]; hash->table[hashVal] = el; hash->elCount += 1; if (hash->autoExpand && hash->elCount > (int)(hash->size * hash->expansionFactor)) { /* double the size */ hashResize(hash, digitsBaseTwo(hash->size)); } return el; } struct hashEl *hashAdd(struct hash *hash, char *name, void *val) /* Add new element to hash table. If an item with name, already exists, a new * item is added in a LIFO manner. The last item added for a given name is * the one returned by the hashLookup functions. hashLookupNext must be used * to find the preceding entries for a name. */ { return hashAddN(hash, name, strlen(name), val); } boolean hashMayRemove(struct hash *hash, char *name) /* Remove item of the given name from hash table, if present. * Return true if it was present */ { return (hashRemove(hash, name) != NULL); } void hashMustRemove(struct hash *hash, char *name) /* Remove item of the given name from hash table, or error * if not present */ { if (hashRemove(hash, name) == NULL) errAbort("attempt to remove non-existant %s from hash", name); } void freeHashEl(struct hashEl *hel) /* Free hash element. Use only on non-local memory version. */ { freeMem(hel->name); freeMem(hel); } void *hashRemove(struct hash *hash, char *name) /* Remove item of the given name from hash table. * Returns value of removed item, or NULL if not in the table. * If their are multiple entries for name, the last one added * is removed (LIFO behavior). */ { struct hashEl *hel; void *ret; struct hashEl **pBucket = &hash->table[hashString(name)&hash->mask]; for (hel = *pBucket; hel != NULL; hel = hel->next) if (sameString(hel->name, name)) break; if (hel == NULL) return NULL; ret = hel->val; if (slRemoveEl(pBucket, hel)) { hash->elCount -= 1; if (!hash->lm) freeHashEl(hel); } return ret; } struct hashEl *hashAddUnique(struct hash *hash, char *name, void *val) /* Add new element to hash table. Squawk and die if not unique */ { if (hashLookup(hash, name) != NULL) errAbort("%s duplicated, aborting", name); return hashAdd(hash, name, val); } struct hashEl *hashAddSaveName(struct hash *hash, char *name, void *val, char **saveName) /* Add new element to hash table. Save the name of the element, which is now * allocated in the hash table, to *saveName. A typical usage would be: * AllocVar(el); * hashAddSaveName(hash, name, el, &el->name); */ { struct hashEl *hel = hashAdd(hash, name, val); *saveName = hel->name; return hel; } struct hashEl *hashStore(struct hash *hash, char *name) /* If element in hash already return it, otherwise add it * and return it. */ { struct hashEl *hel; if ((hel = hashLookup(hash, name)) != NULL) return hel; return hashAdd(hash, name, NULL); } char *hashStoreName(struct hash *hash, char *name) /* If element in hash already return it, otherwise add it * and return it. */ { struct hashEl *hel; if (name == NULL) return NULL; if ((hel = hashLookup(hash, name)) != NULL) return hel->name; return hashAdd(hash, name, NULL)->name; } int hashIntVal(struct hash *hash, char *name) /* Return integer value associated with name in a simple * hash of ints. */ { void *val = hashMustFindVal(hash, name); return ptToInt(val); } int hashIntValDefault(struct hash *hash, char *name, int defaultInt) /* Return integer value associated with name in a simple * hash of ints or defaultInt if not found. */ { struct hashEl *hel = hashLookup(hash, name); if(hel == NULL) return defaultInt; return ptToInt(hel->val); } void *hashMustFindVal(struct hash *hash, char *name) /* Lookup name in hash and return val. Abort if not found. */ { struct hashEl *hel = hashLookup(hash, name); if (hel == NULL) errAbort("hashMustFindVal: '%s' not found", name); return hel->val; } void *hashFindVal(struct hash *hash, char *name) /* Look up name in hash and return val or NULL if not found. */ { struct hashEl *hel = hashLookup(hash, name); if (hel == NULL) return NULL; return hel->val; } void *hashOptionalVal(struct hash *hash, char *name, void *usual) /* Look up name in hash and return val, or usual if not found. */ { struct hashEl *hel = hashLookup(hash, name); if (hel == NULL) return usual; else return hel->val; } void *hashFindValUpperCase(struct hash *hash, char *name) /* Lookup upper cased name in hash and return val or return NULL if not found. * (Assumes all elements of hash are themselves already in upper case.) */ { struct hashEl *hel = hashLookupUpperCase(hash, name); if (hel == NULL) return NULL; return hel->val; } char *hashMustFindName(struct hash *hash, char *name) /* Return name as stored in hash table (in hel->name). * Abort if not found. */ { struct hashEl *hel = hashLookup(hash, name); if (hel == NULL) errAbort("hashMustFindName: '%s' not found", name); return hel->name; } struct hashEl *hashAddInt(struct hash *hash, char *name, int val) /* Store integer value in hash */ { char *pt = NULL; return hashAdd(hash, name, pt + val); } void hashIncInt(struct hash *hash, char *name) /* Increment integer value in hash */ { struct hashEl *hel = hashLookup(hash, name); if (hel == NULL) { hashAddInt(hash, name, 1); } else { hel->val = ((char *)hel->val)+1; /* The much simpler ++hel->val works for gnu C, but really adding one to a void pointer * I think is not well defined. */ } } long long hashIntSum(struct hash *hash) /* Return sum of all the ints in a hash of ints. */ { long long sum = 0; int i; struct hashEl *hel; for (i=0; isize; ++i) { for (hel = hash->table[i]; hel != NULL; hel = hel->next) { int num = ptToInt(hel->val); sum += (long long)num; } } return sum; } struct hash *newHashExt(int powerOfTwoSize, boolean useLocalMem) /* Returns new hash table. Uses local memory optionally. */ { struct hash *hash = needMem(sizeof(*hash)); int memBlockPower = 16; if (powerOfTwoSize == 0) powerOfTwoSize = 12; assert(powerOfTwoSize <= hashMaxSize && powerOfTwoSize > 0); hash->powerOfTwoSize = powerOfTwoSize; hash->size = (1<lm = lmInit(1<mask = hash->size-1; AllocArray(hash->table, hash->size); hash->autoExpand = TRUE; hash->expansionFactor = defaultExpansionFactor; /* Expand when elCount > size*expansionFactor */ return hash; } void hashResize(struct hash *hash, int powerOfTwoSize) /* Resize the hash to a new size */ { int oldHashSize = hash->size; struct hashEl **oldTable = hash->table; if (powerOfTwoSize == 0) powerOfTwoSize = 12; assert(powerOfTwoSize <= hashMaxSize && powerOfTwoSize > 0); hash->powerOfTwoSize = powerOfTwoSize; hash->size = (1<mask = hash->size-1; AllocArray(hash->table, hash->size); int i; struct hashEl *hel, *next; for (i=0; inext; int hashVal = hel->hashVal & hash->mask; hel->next = hash->table[hashVal]; hash->table[hashVal] = hel; } } /* restore original list order */ for (i=0; isize; ++i) { struct hashEl *hel = hash->table[i]; if (hel != NULL && hel->next != NULL) slReverse(&hash->table[i]); } freeMem(oldTable); hash->numResizes++; } struct hash *hashFromSlNameList(void *list) /* Create a hash out of a list of slNames. */ { struct hash *hash = NULL; struct slName *namedList = list, *item; if (!list) return NULL; hash = newHash(0); for (item = namedList; item != NULL; item = item->next) hashAdd(hash, item->name, item); return hash; } struct hash *hashSetFromSlNameList(void *list) /* Create a hashSet (hash with only keys) out of a list of slNames. */ { struct hash *hash = NULL; struct slName *namedList = list, *item; if (!list) return NULL; hash = newHash(0); for (item = namedList; item != NULL; item = item->next) hashAdd(hash, item->name, NULL); return hash; } void hashTraverseEls(struct hash *hash, void (*func)(struct hashEl *hel)) /* Apply func to every element of hash with hashEl as parameter. */ { int i; struct hashEl *hel; for (i=0; isize; ++i) { for (hel = hash->table[i]; hel != NULL; hel = hel->next) func(hel); } } void hashTraverseVals(struct hash *hash, void (*func)(void *val)) /* Apply func to every element of hash with hashEl->val as parameter. */ { int i; struct hashEl *hel; for (i=0; isize; ++i) { for (hel = hash->table[i]; hel != NULL; hel = hel->next) func(hel->val); } } int hashElCmp(const void *va, const void *vb) /* Compare two hashEl by name. */ { const struct hashEl *a = *((struct hashEl **)va); const struct hashEl *b = *((struct hashEl **)vb); return strcmp(a->name, b->name); } int hashElCmpWithEmbeddedNumbers(const void *va, const void *vb) /* Compare two hashEl by name sorting including numbers within name, * suitable for chromosomes, genes, etc. */ { const struct hashEl *a = *((struct hashEl **)va); const struct hashEl *b = *((struct hashEl **)vb); return cmpStringsWithEmbeddedNumbers(a->name, b->name); } void *hashElFindVal(struct hashEl *list, char *name) /* Look up name in hashEl list and return val or NULL if not found. */ { struct hashEl *el; for (el = list; el != NULL; el = el->next) { if (strcmp(el->name, name) == 0) return el->val; } return NULL; } struct hashEl *hashElListHash(struct hash *hash) /* Return a list of all elements of hash. Free return with hashElFreeList. */ { int i; struct hashEl *hel, *dupe, *list = NULL; for (i=0; isize; ++i) { for (hel = hash->table[i]; hel != NULL; hel = hel->next) { dupe = CloneVar(hel); slAddHead(&list, dupe); } } return list; } void hashElFree(struct hashEl **pEl) /* Free hash el list returned from hashListAll. (Don't use * this internally.) */ { freez(pEl); } void hashElFreeList(struct hashEl **pList) /* Free hash el list returned from hashListAll. (Don't use * this internally. */ { slFreeList(pList); } struct hashCookie hashFirst(struct hash *hash) /* Return an object to use by hashNext() to traverse the hash table. * The first call to hashNext will return the first entry in the table. */ { struct hashCookie cookie; cookie.hash = hash; cookie.idx = 0; cookie.nextEl = NULL; /* find first entry */ for (cookie.idx = 0; (cookie.idx < hash->size) && (hash->table[cookie.idx] == NULL); cookie.idx++) continue; /* empty body */ if (cookie.idx < hash->size) cookie.nextEl = hash->table[cookie.idx]; return cookie; } struct hashEl* hashNext(struct hashCookie *cookie) /* Return the next entry in the hash table, or NULL if no more. Do not modify * hash table while this is being used. */ { /* NOTE: if hashRemove were coded to track the previous entry during the * search and then use it to do the remove, it would be possible to * remove the entry returned by this method */ struct hashEl *retEl = cookie->nextEl; if (retEl == NULL) return NULL; /* no more */ /* find next entry */ cookie->nextEl = retEl->next; if (cookie->nextEl == NULL) { for (cookie->idx++; (cookie->idx < cookie->hash->size) && (cookie->hash->table[cookie->idx] == NULL); cookie->idx++) continue; /* empty body */ if (cookie->idx < cookie->hash->size) cookie->nextEl = cookie->hash->table[cookie->idx]; } return retEl; } void* hashNextVal(struct hashCookie *cookie) /* Return the next value in the hash table, or NULL if no more. Do not modify * hash table while this is being used. */ { struct hashEl *hel = hashNext(cookie); if (hel == NULL) return NULL; else return hel->val; } char *hashNextName(struct hashCookie *cookie) /* Return the next name in the hash table, or NULL if no more. Do not modify * hash table while this is being used. */ { struct hashEl *hel = hashNext(cookie); if (hel == NULL) return NULL; else return hel->name; } void freeHash(struct hash **pHash) /* Free up hash table. */ { struct hash *hash = *pHash; if (hash == NULL) return; if (hash->lm) lmCleanup(&hash->lm); else { int i; struct hashEl *hel, *next; for (i=0; isize; ++i) { for (hel = hash->table[i]; hel != NULL; hel = next) { next = hel->next; freeHashEl(hel); } } } freeMem(hash->table); freez(pHash); } void freeHashAndVals(struct hash **pHash) /* Free up hash table and all values associated with it. * (Just calls freeMem on each hel->val) */ { struct hash *hash; if ((hash = *pHash) != NULL) { hashTraverseVals(hash, freeMem); freeHash(pHash); } } void hashFreeWithVals(struct hash **pHash, void (freeFunc)()) /* Free up hash table and all values associated with it. freeFunc is a * function to free an entry, should take a pointer to a pointer to an * entry. */ { struct hash *hash = *pHash; if (hash != NULL) { struct hashCookie cookie = hashFirst(hash); struct hashEl *hel; while ((hel = hashNext(&cookie)) != NULL) freeFunc(&hel->val); hashFree(pHash); } } void hashFreeList(struct hash **pList) /* Free up a list of hashes. */ { struct hash *el, *next; for (el = *pList; el != NULL; el = next) { next = el->next; hashFree(&el); } *pList = NULL; } static int bucketLen(struct hashEl *hel) /* determine how many elements are in a hash bucket */ { int nel = 0; for (; hel != NULL; hel = hel->next) nel++; return nel; } void hashHisto(struct hash *hash, char *fname) /* Output bucket usage counts to a file for producing a histogram */ { FILE* fh = mustOpen(fname, "w"); int i; for (i=0; isize; ++i) fprintf(fh, "%d\n", bucketLen(hash->table[i])); carefulClose(&fh); } void hashPrintStats(struct hash *hash, char *label, FILE *fh) /* print statistic about a hash table */ { // count up usage int i, occupiedCnt = 0, maxBucket = 0; for (i=0; isize; ++i) { if (hash->table[i] != NULL) occupiedCnt++; int sz = bucketLen(hash->table[i]); maxBucket = max(maxBucket, sz); } fprintf(fh, "hashTable\t%s\n", label); fprintf(fh, "tableSize\t%d\t%d\n", hash->size, hash->powerOfTwoSize); fprintf(fh, "numElements\t%d\n", hash->elCount); fprintf(fh, "occupied\t%d\t%0.4f\n", occupiedCnt, ((hash->size == 0) ? 0.0 : ((float)occupiedCnt)/hash->size)); fprintf(fh, "maxBucket\t%d\n", maxBucket); fprintf(fh, "numResizes\t%d\n", hash->numResizes); fprintf(fh, "\n"); } struct hashEl *hashReplace(struct hash *hash, char *name, void *val) /* Replace an existing element in hash table, or add it if not present. */ { if (hashLookup(hash, name)) hashRemove(hash, name); return hashAdd(hash, name, val); } char *hashToRaString(struct hash *hash) /* Convert hash to string in ra format. */ { struct hashEl *el, *list = hashElListHash(hash); struct dyString *dy = dyStringNew(0); slSort(&list, hashElCmp); for (el = list; el != NULL; el = el->next) { dyStringAppend(dy, el->name); dyStringAppendC(dy, ' '); dyStringAppend(dy, el->val); dyStringAppendC(dy, '\n'); } hashElFreeList(&list); return dyStringCannibalize(&dy); } int hashNumEntries(struct hash *hash) /* count the number of entries in a hash */ { int n = 0, i; for (i=0; isize; ++i) n += bucketLen(hash->table[i]); return n; } struct hash *hashFromString(char *string) /* parse a whitespace-separated string with tuples in the format name=val or * name="val" to a hash name->val */ { if (string==NULL) return NULL; struct slPair *keyVals = slPairListFromString(string, TRUE); if (keyVals==NULL) return NULL; struct hash *nameToVal = newHash(0); struct slPair *kv; for (kv = keyVals; kv != NULL; kv = kv->next) hashAdd(nameToVal, kv->name, kv->val); return nameToVal; } rtracklayer/src/ucsc/hash.h0000644000175400017540000002531713556116552016764 0ustar00biocbuildbiocbuild/* Hash - a simple hash table that provides name/value pairs. * The most common usage is to create a hash as so: * struct hash *hash = hashNew(0); * to add elements to a hash as so: * hashAdd(hash, name, value); * and to retrieve a named element as so: * value = hashFindVal(hash, name); * The hashFindVal function will return NULL if the name does not * appear in the hash. Alternatively you can use: * value = hashMustFindVal(hash, name); * which will abort if name is not in the hash. When done with a hash do: * hashFree(&hash); * * The hash does support multiple values for the same key. To use * this functionality, try the loop: * struct hashEl *hel; * for (hel = hashLookup(hash, name); hel != NULL; hel = hashLookupNext(hel)) * { * value = hel->val; * // Further processing here. * The order of elements retrieved this way will be most-recently-added first. * The hashLookup function is _slightly_ faster than the hashFindVal function, * so sometimes it is used just to test for the presence of an element in the * hash when not interested in the value associated with it. * * One can iterate through all the elements in a hash in three ways. One can * get a list of all things in the hash as so: * struct hashEl *hel, *helList = hashElListHash(hash); * for (hel = helList; hel != NULL; hel = hel->next) * { * value = hel->val; * // Further processing of value here. * } * hashElFreeList(&helList); * One can avoid the overhead of creating a list by using an iterator object * and function: * struct hashEl *hel; * struct hashCookie cookie = hashFirst(hash); * while ((hel = hashNext(&cookie)) != NULL) * { * value = hel->val; * Finally one can use hashTraverseEls or hashTraverseVals with a callback * function that takes a hashEl, or the void *value as parameter respectively. * * There are various other functions involving hashes in this module as well * that provide various short cuts. For information on these and additional * details of the functions described, please read the full hash.h file, and * if so inclined the hash.c file as well. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef HASH_H #define HASH_H struct hashEl /* An element in a hash list. */ { struct hashEl *next; char *name; void *val; bits32 hashVal; }; struct hash { struct hash *next; /* Next in list. */ bits32 mask; /* Mask hashCrc with this to get it to fit table. */ struct hashEl **table; /* Hash buckets. */ int powerOfTwoSize; /* Size of table as a power of two. */ int size; /* Size of table. */ struct lm *lm; /* Local memory pool. */ int elCount; /* Count of elements. */ boolean autoExpand; /* Automatically expand hash */ float expansionFactor; /* Expand when elCount > size*expansionFactor */ int numResizes; /* number of times resize was called */ }; #define defaultExpansionFactor 1.0 #define hashMaxSize 28 struct hashCookie /* used by hashFirst/hashNext in tracking location in traversing hash */ { struct hash *hash; /* hash we are associated with */ int idx; /* current index in hash */ struct hashEl *nextEl; /* current element in hash */ }; bits32 hashString(char *string); /* Compute a hash value of a string. */ bits32 hashCrc(char *string); /* Returns a CRC value on string. */ struct hashEl *hashLookup(struct hash *hash, char *name); /* Looks for name in hash table. Returns associated element, * if found, or NULL if not. If there are multiple entries * for name, the last one added is returned (LIFO behavior). */ struct hashEl *hashLookupUpperCase(struct hash *hash, char *name); /* Lookup upper cased name in hash. (Assumes all elements of hash * are themselves already in upper case.) */ struct hashEl *hashLookupNext(struct hashEl *hashEl); /* Find the next occurance of name that may occur in the table multiple times, * or NULL if not found. Use hashLookup to find the first occurrence. Elements * are returned in LIFO order. */ struct hashEl *hashAdd(struct hash *hash, char *name, void *val); /* Add new element to hash table. If an item with name, already exists, a new * item is added in a LIFO manner. The last item added for a given name is * the one returned by the hashLookup functions. hashLookupNext must be used * to find the preceding entries for a name. */ struct hashEl *hashAddN(struct hash *hash, char *name, int nameSize, void *val); /* Add name of given size to hash (no need to be zero terminated) */ void *hashRemove(struct hash *hash, char *name); /* Remove item of the given name from hash table. * Returns value of removed item, or NULL if not in the table. * If their are multiple entries for name, the last one added * is removed (LIFO behavior). */ struct hashEl *hashAddUnique(struct hash *hash, char *name, void *val); /* Add new element to hash table. Squawk and die if is already in table. */ struct hashEl *hashAddSaveName(struct hash *hash, char *name, void *val, char **saveName); /* Add new element to hash table. Save the name of the element, which is now * allocated in the hash table, to *saveName. A typical usage would be: * AllocVar(el); * hashAddSaveName(hash, name, el, &el->name); */ struct hashEl *hashStore(struct hash *hash, char *name); /* If element in hash already return it, otherwise add it * and return it. */ char *hashStoreName(struct hash *hash, char *name); /* Put name into hash table. */ char *hashMustFindName(struct hash *hash, char *name); /* Return name as stored in hash table (in hel->name). * Abort if not found. */ void *hashMustFindVal(struct hash *hash, char *name); /* Lookup name in hash and return val. Abort if not found. */ void *hashFindVal(struct hash *hash, char *name); /* Look up name in hash and return val or NULL if not found. */ void *hashOptionalVal(struct hash *hash, char *name, void *usual); /* Look up name in hash and return val, or usual if not found. */ void *hashFindValUpperCase(struct hash *hash, char *name); /* Lookup upper cased name in hash and return val or return NULL if not found. * (Assumes all elements of hash are themselves already in upper case.) */ struct hashEl *hashAddInt(struct hash *hash, char *name, int val); /* Store integer value in hash */ void hashIncInt(struct hash *hash, char *name); /* Increment integer value in hash */ int hashIntVal(struct hash *hash, char *name); /* Return integer value associated with name in a simple * hash of ints. */ int hashIntValDefault(struct hash *hash, char *name, int defaultInt); /* Return integer value associated with name in a simple * hash of ints or defaultInt if not found. */ long long hashIntSum(struct hash *hash); /* Return sum of all the ints in a hash of ints. */ void hashTraverseEls(struct hash *hash, void (*func)(struct hashEl *hel)); /* Apply func to every element of hash with hashEl as parameter. */ void hashTraverseVals(struct hash *hash, void (*func)(void *val)); /* Apply func to every element of hash with hashEl->val as parameter. */ struct hashEl *hashElListHash(struct hash *hash); /* Return a list of all elements of hash. Free return with hashElFreeList. */ int hashElCmp(const void *va, const void *vb); /* Compare two hashEl by name. */ int hashElCmpWithEmbeddedNumbers(const void *va, const void *vb); /* Compare two hashEl by name sorting including numbers within name, * suitable for chromosomes, genes, etc. */ void *hashElFindVal(struct hashEl *list, char *name); /* Look up name in hashEl list and return val or NULL if not found. */ void hashElFree(struct hashEl **pEl); /* Free hash el list returned from hashListAll. */ void hashElFreeList(struct hashEl **pList); /* Free hash el list returned from hashListAll. (Don't use * this internally. */ struct hashCookie hashFirst(struct hash *hash); /* Return an object to use by hashNext() to traverse the hash table. * The first call to hashNext will return the first entry in the table. */ struct hashEl* hashNext(struct hashCookie *cookie); /* Return the next entry in the hash table, or NULL if no more. Do not modify * hash table while this is being used. (see note in code if you want to fix * this) */ void *hashNextVal(struct hashCookie *cookie); /* Return the next value in the hash table, or NULL if no more. Do not modify * hash table while this is being used. */ char *hashNextName(struct hashCookie *cookie); /* Return the next name in the hash table, or NULL if no more. Do not modify * hash table while this is being used. */ struct hash *newHashExt(int powerOfTwoSize, boolean useLocalMem); /* Returns new hash table. Uses local memory optionally. */ #define hashNewExt(a) newHashExt(a) /* Synonym */ #define newHash(a) newHashExt(a, TRUE) /* Returns new hash table using local memory. */ #define hashNew(a) newHash(a) /* Synonym */ void hashResize(struct hash *hash, int powerOfTwoSize); /* Resize the hash to a new size */ struct hash *hashFromSlNameList(void *list); /* Create a hash out of a list of slNames. */ struct hash *hashSetFromSlNameList(void *list); /* Create a hashSet (hash without values) out of a list of slNames. */ void freeHash(struct hash **pHash); /* Free up hash table. */ #define hashFree(a) freeHash(a) /* Synonym */ void freeHashAndVals(struct hash **pHash); /* Free up hash table and all values associated with it. * (Just calls freeMem on each hel->val) */ void hashFreeWithVals(struct hash **pHash, void (freeFunc)()); /* Free up hash table and all values associated with it. freeFunc is a * function to free an entry, should take a pointer to a pointer to an * entry. */ void hashFreeList(struct hash **pList); /* Free up a list of hashes. */ void hashHisto(struct hash *hash, char *fname); /* Output bucket usage counts to a file for producing a histogram */ void hashPrintStats(struct hash *hash, char *label, FILE *fh); /* print statistic about a hash table */ struct hashEl *hashReplace(struct hash *hash, char *name, void *val); /* Replace an existing element in hash table, or add it if not present. */ boolean hashMayRemove(struct hash *hash, char *name); /* Remove item of the given name from hash table, if present. * Return true if it was present */ void hashMustRemove(struct hash *hash, char *name); /* Remove item of the given name from hash table, or error * if not present */ char *hashToRaString(struct hash *hash); /* Convert hash to string in ra format. */ int hashNumEntries(struct hash *hash); /* count the number of entries in a hash */ struct hash *hashFromString(char *string); /* parse a whitespace-separated string with tuples in the format name=val or * name="val" to a hash name->val */ #endif /* HASH_H */ rtracklayer/src/ucsc/hmmstats.c0000644000175400017540000000211213556116552017660 0ustar00biocbuildbiocbuild/* hmmstats.c - Stuff for doing statistical analysis in general and * hidden Markov models in particular. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include "common.h" #include "hmmstats.h" int scaledLog(double val) /* Return scaled log of val. */ { return round(logScaleFactor * log(val)); } double oneOverSqrtTwoPi = 0.39894228; double simpleGaussean(double x) /* Gaussean distribution with standard deviation 1 and mean 0. */ { return oneOverSqrtTwoPi * exp(-0.5*x*x ); } double gaussean(double x, double mean, double sd) /* Gaussean distribution with mean and standard deviation at point x */ { x -= mean; x /= sd; return oneOverSqrtTwoPi * exp(-0.5*x*x) / sd; } double calcVarianceFromSums(double sum, double sumSquares, bits64 n) /* Calculate variance. */ { double var = sumSquares - sum*sum/n; if (n > 1) var /= n-1; return var; } double calcStdFromSums(double sum, double sumSquares, bits64 n) /* Calculate standard deviation. */ { return sqrt(calcVarianceFromSums(sum, sumSquares, n)); } rtracklayer/src/ucsc/hmmstats.h0000644000175400017540000000213313556116552017670 0ustar00biocbuildbiocbuild/***************************************************************************** * Copyright (C) 2000 Jim Kent. This source code may be freely used * * for personal, academic, and non-profit purposes. Commercial use * * permitted only by explicit agreement with Jim Kent (jim_kent@pacbell.net) * *****************************************************************************/ /* hmmstats.h - Stuff for doing statistical analysis in general and * hidden Markov models in particular. */ #ifndef HMMSTATS_H #define HMMSTATS_H int scaledLog(double val); /* Return scaled log of val. */ #define logScaleFactor 1000 /* Amount we scale logs by. */ double simpleGaussean(double x); /* Gaussean distribution with standard deviation 1 and mean 0. */ double gaussean(double x, double mean, double sd); /* Gaussean distribution with mean and standard deviation at point x */ double calcVarianceFromSums(double sum, double sumSquares, bits64 n); /* Calculate variance. */ double calcStdFromSums(double sum, double sumSquares, bits64 n); /* Calculate standard deviation. */ #endif /* HMMSTATS_H */ rtracklayer/src/ucsc/htmshell.h0000644000175400017540000001441313556116552017654 0ustar00biocbuildbiocbuild/* Htmshell.h - stuff to make it easier to generate HTML files on * the fly. Typically included with cheapcgi.h in almost any * CGI program. * * To use this generally you should call the function htmShell() * very early inside of main(). You pass htmShell() a routine * which does most of the work of your web server-side applet. * * These routines will throw errors, which are caught by * htmShell, which then returns. For the most part you just * want an error to cause an error message to be printed and * then terminate your CGI program, so this works fine. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ void htmlSetCookie(char* name, char* value, char* expires, char* path, char* domain, boolean isSecure); /* create a cookie with the given stats */ void htmlParagraph(char *line, ...); /* Print a line in it's own paragraph. */ void htmlVaParagraph(char *line, va_list args); /* Print a line in it's own paragraph. */ void htmlCenterParagraph(char *line, ...); /* Center a line in it's own paragraph. */ void htmlHorizontalLine(); /* Print a horizontal line. */ void htmlNbSpaces(int count); /* Print a number of non-breaking spaces. */ void htmHorizontalLine(FILE *f); /* Print a horizontal line. */ void htmTextOut(FILE *f, char *s); /* Print out string to file, if necessary replacing > with > and the like */ void htmlTextOut(char *s); /* Print out string, if necessary replacing > with > and the like */ char *htmlTextStripTags(char *s); /* Returns a cloned string with all html tags stripped out */ char *htmlTextReplaceTagsWithChar(char *s, char ch); /* Returns a cloned string with all html tags replaced with given char (useful for tokenizing) */ char *htmlEncodeText(char *s, boolean tagsOkay); /* Returns a cloned string with quotes replaced by html codes. Changes ',",\n and if not tagsOkay >,<,& to code equivalents. This differs from cgiEncode as it handles text that will be displayed in an html page or tooltip style title. */ #define htmlEncode(s) htmlEncodeText(s,FALSE) char *attributeEncode(char *str); // encode double and single quotes in a string to be used as an element attribute void htmlMemDeath(); /* Complain about lack of memory and abort. */ void htmlStart(char *title); /* Write the start of a cgi-generated html file */ void htmStart(FILE *f, char *title); /* Write the start of a stand alone .html file. */ void printBodyTag(FILE *f); // print starting BODY tag, including any appropriate attributes (class, background and bgcolor). void htmStartWithHead(FILE *f, char *head, char *title); /* Write the start of a stand alone .html file, plus head info */ void htmStartDirDepth(FILE *f, char *title, int dirDepth); /* Write the start of a stand alone .html file. dirDepth is the number of levels * beneath apache root that caller's HTML will appear to the web client. * E.g. if writing HTML from cgi-bin, dirDepth is 1; if trash/body/, 2. */ void htmlEnd(); /* Write the end of a cgi-generated html file */ void htmEnd(FILE *f); /* Write the end of a stand-alone html file */ extern char *htmlStyleUndecoratedLink; /* Style that gets rid of underline of links. */ void htmlSetStyle(char *style); /* Set document wide style. A favorite style to * use for many purposes is htmlStyleUndecoratedLink * which will remove underlines from links. * Needs to be called before htmlStart or htmShell. */ void htmlSetStyleSheet(char *styleSheet); /* Set document wide style sheet by adding css name to HEAD part. * Needs to be called before htmlStart or htmShell. */ void htmlSetFormClass(char *formClass); /* Set class in the BODY part. */ void htmlSetStyleTheme(char *style); /* Set theme style, these styles can overwrite document wide styles. * Needs to be called before htmlStart or htmShell. */ void htmlSetBackground(char *imageFile); /* Set background image - needs to be called before htmlStart * or htmShell. */ void htmlSetBgColor(int color); /* Set background color - needs to be called before htmlStart * or htmShell. */ void htmlBadVar(char *varName); /* Complain about input variables. */ void htmlImage(char *fileName, int width, int height); /* Display centered image file. */ jmp_buf htmlRecover; /* Error recovery jump. Exposed for cart's use. */ void htmlVaWarn(char *format, va_list args); /* Write an error message. (Generally you just call warn() or errAbort(). * This is exposed mostly for the benefit of the cart.) */ char *htmlWarnStartPattern(); /* Return starting pattern for warning message. */ char *htmlWarnEndPattern(); /* Return ending pattern for warning message. */ void htmlWarnBoxSetup(FILE *f); /* Creates an invisible, empty warning box than can be filled with errors * and then made visible. */ void htmlAbort(); /* Terminate HTML file. Exposed for cart's use. */ void htmlPushEarlyHandlers(); /* Push stuff to close out web page to make sensible error * message during initialization. */ /* Wrap error recovery around call to doMiddle. */ void htmErrOnlyShell(void (*doMiddle)()); /* Wrap error recovery and and input processing around call to doMiddle. */ void htmEmptyShell(void (*doMiddle)(), char *method); /* Wrap an html file around the passed in function. * The passed in function is already in the body. It * should just make paragraphs and return. * Method should be "query" or "get" or "post" (or NULL * if you don't care).. */ void htmShell( char *title, void (*doMiddle)(), char *method); /* Wrap an html file around the passed in function. * The passed in function is already in the body. It * should just make paragraphs and return. * Method should be "query" or "get" or "post". param title - The HTML page title param head - The head text: can be a refresh directive or javascript param method - The function pointer to execute in the middle param method - The browser request method to use */ void htmShellWithHead( char *title, char *head, void (*doMiddle)(), char *method); /* tell htmlOut to not escape special HTML chars '<', '>' */ void htmlNoEscape(); /* tell htmlOut to escape special HTML chars '<', '>' */ void htmlDoEscape(); /* Include an HTML file in a CGI. * The file path is relative to the web server document root */ void htmlIncludeWebFile(char *file); /* Include an HTML file in a CGI */ void htmlIncludeFile(char *path); rtracklayer/src/ucsc/https.c0000644000175400017540000001725013556116552017173 0ustar00biocbuildbiocbuild/* Connect via https. */ /* Copyright (C) 2012 The Regents of the University of California * See README in this or parent directory for licensing information. */ #ifdef USE_SSL #include "openssl/ssl.h" #include "openssl/err.h" #include #include #include #include "common.h" #include "errAbort.h" #include "net.h" static pthread_mutex_t *mutexes = NULL; static unsigned long openssl_id_callback(void) { return ((unsigned long)pthread_self()); } static void openssl_locking_callback(int mode, int n, const char * file, int line) { if (mode & CRYPTO_LOCK) pthread_mutex_lock(&mutexes[n]); else pthread_mutex_unlock(&mutexes[n]); } void openssl_pthread_setup(void) { int i; int numLocks = CRYPTO_num_locks(); AllocArray(mutexes, numLocks); for (i = 0; i < numLocks; i++) pthread_mutex_init(&mutexes[i], NULL); CRYPTO_set_id_callback(openssl_id_callback); CRYPTO_set_locking_callback(openssl_locking_callback); } struct netConnectHttpsParams /* params to pass to thread */ { pthread_t thread; char *hostName; int port; int sv[2]; /* the pair of socket descriptors */ }; static void xerrno(char *msg) { fprintf(stderr, "%s : %s\n", strerror(errno), msg); fflush(stderr); } static void xerr(char *msg) { fprintf(stderr, "%s\n", msg); fflush(stderr); } void openSslInit() /* do only once */ { static boolean done = FALSE; static pthread_mutex_t osiMutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_lock( &osiMutex ); if (!done) { SSL_library_init(); ERR_load_crypto_strings(); ERR_load_SSL_strings(); OpenSSL_add_all_algorithms(); openssl_pthread_setup(); done = TRUE; } pthread_mutex_unlock( &osiMutex ); } void *netConnectHttpsThread(void *threadParam) /* use a thread to run socket back to user */ { /* child */ struct netConnectHttpsParams *params = threadParam; pthread_detach(params->thread); // this thread will never join back with it's progenitor int fd=0; char hostnameProto[256]; BIO *sbio; SSL_CTX *ctx; SSL *ssl; openSslInit(); ctx = SSL_CTX_new(SSLv23_client_method()); fd_set readfds; fd_set writefds; int err; struct timeval tv; /* TODO checking certificates char *certFile = NULL; char *certPath = NULL; if (certFile || certPath) { SSL_CTX_load_verify_locations(ctx,certFile,certPath); #if (OPENSSL_VERSION_NUMBER < 0x0090600fL) SSL_CTX_set_verify_depth(ctx,1); #endif } // verify paths and mode. */ sbio = BIO_new_ssl_connect(ctx); BIO_get_ssl(sbio, &ssl); if(!ssl) { xerr("Can't locate SSL pointer"); goto cleanup; } /* Don't want any retries since we are non-blocking bio now */ //SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY); safef(hostnameProto,sizeof(hostnameProto),"%s:%d",params->hostName,params->port); BIO_set_conn_hostname(sbio, hostnameProto); BIO_set_nbio(sbio, 1); /* non-blocking mode */ while (1) { if (BIO_do_connect(sbio) == 1) { break; /* Connected */ } if (! BIO_should_retry(sbio)) { xerr("BIO_do_connect() failed"); char s[256]; safef(s, sizeof s, "SSL error: %s", ERR_reason_error_string(ERR_get_error())); xerr(s); goto cleanup; } fd = BIO_get_fd(sbio, NULL); if (fd == -1) { xerr("unable to get BIO descriptor"); goto cleanup; } FD_ZERO(&readfds); FD_ZERO(&writefds); if (BIO_should_read(sbio)) { FD_SET(fd, &readfds); } else if (BIO_should_write(sbio)) { FD_SET(fd, &writefds); } else { /* BIO_should_io_special() */ FD_SET(fd, &readfds); FD_SET(fd, &writefds); } tv.tv_sec = (long) (DEFAULTCONNECTTIMEOUTMSEC/1000); // timeout default 10 seconds tv.tv_usec = (long) (((DEFAULTCONNECTTIMEOUTMSEC/1000)-tv.tv_sec)*1000000); err = select(fd + 1, &readfds, &writefds, NULL, &tv); if (err < 0) { xerr("select() error"); goto cleanup; } if (err == 0) { char s[256]; safef(s, sizeof s, "connection timeout to %s", params->hostName); xerr(s); goto cleanup; } } /* TODO checking certificates if (certFile || certPath) if (!check_cert(ssl, host)) return -1; */ /* we need to wait on both the user's socket and the BIO SSL socket * to see if we need to ferry data from one to the other */ char sbuf[32768]; // socket buffer sv[1] to user char bbuf[32768]; // bio buffer int srd = 0; int swt = 0; int brd = 0; int bwt = 0; while (1) { // Do NOT move this outside the while loop. /* Get underlying file descriptor, needed for select call */ fd = BIO_get_fd(sbio, NULL); if (fd == -1) { xerr("BIO doesn't seem to be initialized in https, unable to get descriptor."); goto cleanup; } FD_ZERO(&readfds); FD_ZERO(&writefds); if (brd == 0) FD_SET(fd, &readfds); if (swt < srd) FD_SET(fd, &writefds); if (srd == 0) FD_SET(params->sv[1], &readfds); tv.tv_sec = (long) (DEFAULTCONNECTTIMEOUTMSEC/1000); // timeout default 10 seconds tv.tv_usec = (long) (((DEFAULTCONNECTTIMEOUTMSEC/1000)-tv.tv_sec)*1000000); err = select(max(fd,params->sv[1]) + 1, &readfds, &writefds, NULL, &tv); /* Evaluate select() return code */ if (err < 0) { xerr("error during select()"); goto cleanup; } else if (err == 0) { /* Timed out - just quit */ xerr("https timeout expired"); goto cleanup; } else { if (FD_ISSET(params->sv[1], &readfds)) { swt = 0; srd = read(params->sv[1], sbuf, 32768); if (srd == -1) { if (errno != 104) // udcCache often closes causing "Connection reset by peer" xerrno("error reading https socket"); goto cleanup; } if (srd == 0) break; // user closed socket, we are done } if (FD_ISSET(fd, &writefds)) { int swtx = BIO_write(sbio, sbuf+swt, srd-swt); if (swtx <= 0) { if (!BIO_should_write(sbio)) { ERR_print_errors_fp(stderr); xerr("Error writing SSL connection"); goto cleanup; } } else { swt += swtx; if (swt >= srd) { swt = 0; srd = 0; } } } if (FD_ISSET(fd, &readfds)) { bwt = 0; brd = BIO_read(sbio, bbuf, 32768); if (brd <= 0) { if (BIO_should_read(sbio)) { brd = 0; continue; } else { if (brd == 0) break; ERR_print_errors_fp(stderr); xerr("Error reading SSL connection"); goto cleanup; } } // write the https data received immediately back on socket to user, and it's ok if it blocks. while(bwt < brd) { int bwtx = write(params->sv[1], bbuf+bwt, brd-bwt); if (bwtx == -1) { if ((errno != 104) // udcCache often closes causing "Connection reset by peer" && (errno != 32)) // udcCache often closes causing "Broken pipe" xerrno("error writing https data back to user socket"); goto cleanup; } bwt += bwtx; } brd = 0; bwt = 0; } } } cleanup: BIO_free_all(sbio); close(params->sv[1]); /* we are done with it */ return NULL; } int netConnectHttps(char *hostName, int port) /* Return socket for https connection with server or -1 if error. */ { fflush(stdin); fflush(stdout); fflush(stderr); struct netConnectHttpsParams *params; AllocVar(params); params->hostName = cloneString(hostName); params->port = port; socketpair(AF_UNIX, SOCK_STREAM, 0, params->sv); int rc; rc = pthread_create(¶ms->thread, NULL, netConnectHttpsThread, (void *)params); if (rc) { errAbort("Unexpected error %d from pthread_create(): %s",rc,strerror(rc)); } /* parent */ return params->sv[0]; } #else #include #include "common.h" #include "errAbort.h" int netConnectHttps(char *hostName, int port) /* Start https connection with server or die. */ { errAbort("No openssl available in netConnectHttps for %s : %d", hostName, port); return -1; /* will never get to here, make compiler happy */ } #endif rtracklayer/src/ucsc/https.h0000644000175400017540000000032113556116552017167 0ustar00biocbuildbiocbuild/* Connect via https. */ #ifndef NET_HTTPS_H #define NET_HTTPS_H int netConnectHttps(char *hostName, int port); /* Return socket for https connection with server or -1 if error. */ #endif//ndef NET_HTTPS_H rtracklayer/src/ucsc/internet.c0000644000175400017540000000722713556116552017664 0ustar00biocbuildbiocbuild#ifndef WIN32 /* internet - some stuff to make it easier to use * internet sockets and the like. */ /* Copyright (C) 2011 The Regents of the University of California * See README in this or parent directory for licensing information. */ #include "common.h" #include "internet.h" boolean internetIsDottedQuad(char *s) /* Returns TRUE if it looks like s is a dotted quad. */ { int i; if (!isdigit(s[0])) return FALSE; for (i=0; i<3; ++i) { s = strchr(s, '.'); if (s == NULL) return FALSE; s += 1; if (!isdigit(s[0])) return FALSE; } return TRUE; } bits32 internetHostIp(char *hostName) /* Get IP v4 address (in host byte order) for hostName. * Warn and return 0 if there's a problem. */ { bits32 ret; if (internetIsDottedQuad(hostName)) { internetDottedQuadToIp(hostName, &ret); } else { /* getaddrinfo is thread-safe and widely supported */ struct addrinfo hints, *res; struct in_addr addr; int err; zeroBytes(&hints, sizeof(hints)); hints.ai_family = AF_INET; if ((err = getaddrinfo(hostName, NULL, &hints, &res)) != 0) { warn("getaddrinfo() error on hostName=%s: %s\n", hostName, gai_strerror(err)); return 0; } addr = ((struct sockaddr_in *)(res->ai_addr))->sin_addr; ret = ntohl((uint32_t)addr.s_addr); freeaddrinfo(res); } return ret; } boolean internetFillInAddress(char *hostName, int port, struct sockaddr_in *address) /* Fill in address. Return FALSE if can't. */ { ZeroVar(address); address->sin_family = AF_INET; address->sin_port = htons(port); if (hostName == NULL) address->sin_addr.s_addr = INADDR_ANY; else { if ((address->sin_addr.s_addr = htonl(internetHostIp(hostName))) == 0) return FALSE; } return TRUE; } boolean internetIpToDottedQuad(bits32 ip, char dottedQuad[17]) /* Convert IP4 address in host byte order to dotted quad * notation. Warn and return FALSE if there's a * problem. */ { #ifndef __CYGWIN32__ struct in_addr ia; zeroBytes(dottedQuad, 17); ZeroVar(&ia); ia.s_addr = htonl(ip); if (inet_ntop(AF_INET, &ia, dottedQuad, 16) == NULL) { warn("conversion problem on 0x%x in internetIpToDottedQuad: %s", ip, strerror(errno)); return FALSE; } return TRUE; #else warn("Sorry, internetIpToDottedQuad not supported in Windows."); return FALSE; #endif } boolean internetDottedQuadToIp(char *dottedQuad, bits32 *retIp) /* Convert dotted quad format address to IP4 address in * host byte order. Warn and return FALSE if there's a * problem. */ { #ifndef __CYGWIN32__ struct in_addr ia; if (inet_pton(AF_INET, dottedQuad, &ia) < 0) { warn("internetDottedQuadToIp problem on %s: %s", dottedQuad, strerror(errno)); return FALSE; } *retIp = ntohl(ia.s_addr); return TRUE; #else warn("Sorry, internetDottedQuadToIp not supported in Windows."); return FALSE; #endif } void internetParseDottedQuad(char *dottedQuad, unsigned char quad[4]) /* Parse dotted quads into quad */ { char *s = dottedQuad; int i; if (!internetIsDottedQuad(s)) errAbort("%s is not a dotted quad", s); for (i=0; i<4; ++i) { quad[i] = atoi(s); s = strchr(s, '.') + 1; } } void internetUnpackIp(bits32 packed, unsigned char unpacked[4]) /* Convert from 32 bit to 4-byte format with most significant * byte first. */ { int i; for (i=3; i>=0; --i) { unpacked[i] = (packed&0xff); packed >>= 8; } } boolean internetIpInSubnet(unsigned char unpackedIp[4], unsigned char subnet[4]) /* Return true if unpacked IP address is in subnet. */ { int i; for (i=0; i<4; ++i) { unsigned char c = subnet[i]; if (c == 255) return TRUE; if (c != unpackedIp[i]) return FALSE; } return TRUE; } #endif rtracklayer/src/ucsc/internet.h0000644000175400017540000000271613556116552017667 0ustar00biocbuildbiocbuild/* internet - some stuff for routines that use the internet * and aren't afraid to include some internet specific structures * and the like. See also net for stuff that is higher level. */ #ifndef INTERNET_H #include #include #include #include bits32 internetHostIp(char *hostName); /* Get IP v4 address (in host byte order) for hostName. * Warn and return 0 if there's a problem. */ boolean internetFillInAddress(char *hostName, int port, struct sockaddr_in *address); /* Fill in address. Warn and return FALSE if can't. */ boolean internetIpToDottedQuad(bits32 ip, char dottedQuad[17]); /* Convert IP4 address in host byte order to dotted quad * notation. Warn and return FALSE if there's a * problem. */ boolean internetDottedQuadToIp(char *dottedQuad, bits32 *retIp); /* Convert dotted quad format address to IP4 address in * host byte order. Warn and return FALSE if there's a * problem. */ boolean internetIsDottedQuad(char *s); /* Returns TRUE if it looks like s is a dotted quad. */ void internetParseDottedQuad(char *dottedQuad, unsigned char quad[4]); /* Parse dotted quads into quad */ void internetUnpackIp(bits32 packed, unsigned char unpacked[4]); /* Convert from 32 bit to 4-byte format with most significant * byte first. */ boolean internetIpInSubnet(unsigned char unpackedIp[4], unsigned char subnet[4]); /* Return true if unpacked IP address is in subnet. */ #endif /* INTERNET_H */ rtracklayer/src/ucsc/linefile.c0000644000175400017540000011304513556116552017617 0ustar00biocbuildbiocbuild/* lineFile - stuff to rapidly read text files and parse them into * lines. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include "common.h" #include "hash.h" #include #include #include "dystring.h" #include "errAbort.h" #include "linefile.h" #include "pipeline.h" #include "localmem.h" #include "cheapcgi.h" #include "udc.h" char *getFileNameFromHdrSig(char *m) /* Check if header has signature of supported compression stream, and return a phoney filename for it, or NULL if no sig found. */ { char buf[20]; char *ext=NULL; if (startsWith("\x1f\x8b",m)) ext = "gz"; else if (startsWith("\x1f\x9d\x90",m)) ext = "Z"; else if (startsWith("BZ",m)) ext = "bz2"; else if (startsWith("PK\x03\x04",m)) ext = "zip"; if (ext==NULL) return NULL; safef(buf, sizeof(buf), LF_BOGUS_FILE_PREFIX "%s", ext); return cloneString(buf); } static char **getDecompressor(char *fileName) /* if a file is compressed, return the command to decompress the * approriate format, otherwise return NULL */ { static char *GZ_READ[] = {"gzip", "-dc", NULL}; static char *Z_READ[] = {"gzip", "-dc", NULL}; static char *BZ2_READ[] = {"bzip2", "-dc", NULL}; static char *ZIP_READ[] = {"gzip", "-dc", NULL}; char **result = NULL; char *fileNameDecoded = cloneString(fileName); if (startsWith("http://" , fileName) || startsWith("https://", fileName) || startsWith("ftp://", fileName)) cgiDecode(fileName, fileNameDecoded, strlen(fileName)); if (endsWith(fileNameDecoded, ".gz")) result = GZ_READ; else if (endsWith(fileNameDecoded, ".Z")) result = Z_READ; else if (endsWith(fileNameDecoded, ".bz2")) result = BZ2_READ; else if (endsWith(fileNameDecoded, ".zip")) result = ZIP_READ; freeMem(fileNameDecoded); return result; } static void metaDataAdd(struct lineFile *lf, char *line) /* write a line of metaData to output file * internal function called by lineFileNext */ { struct metaOutput *meta = NULL; if (lf->isMetaUnique) { /* suppress repetition of comments */ if (hashLookup(lf->metaLines, line)) { return; } hashAdd(lf->metaLines, line, NULL); } for (meta = lf->metaOutput ; meta != NULL ; meta = meta->next) if (line != NULL && meta->metaFile != NULL) fprintf(meta->metaFile,"%s\n", line); } static void metaDataFree(struct lineFile *lf) /* free saved comments */ { if (lf->isMetaUnique && lf->metaLines) freeHash(&lf->metaLines); } void lineFileSetMetaDataOutput(struct lineFile *lf, FILE *f) /* set file to write meta data to, * should be called before reading from input file */ { struct metaOutput *meta = NULL; if (lf == NULL) return; AllocVar(meta); meta->next = NULL; meta->metaFile = f; slAddHead(&lf->metaOutput, meta); } void lineFileSetUniqueMetaData(struct lineFile *lf) /* suppress duplicate lines in metadata */ { lf->isMetaUnique = TRUE; lf->metaLines = hashNew(8); } static char * headerBytes(char *fileName, int numbytes) /* Return specified number of header bytes from file * if file exists as a string which should be freed. */ { int fd,bytesread=0; char *result = NULL; if ((fd = open(fileName, O_RDONLY)) >= 0) { result=needMem(numbytes+1); if ((bytesread=read(fd,result,numbytes)) < numbytes) freez(&result); /* file too short? can read numbytes */ else result[numbytes]=0; close(fd); } return result; } #ifndef WIN32 struct lineFile *lineFileDecompress(char *fileName, bool zTerm) /* open a linefile with decompression */ { struct pipeline *pl; struct lineFile *lf; char *testName = NULL; char *testbytes = NULL; /* the header signatures for .gz, .bz2, .Z, * .zip are all 2-4 bytes only */ if (fileName==NULL) return NULL; testbytes=headerBytes(fileName,4); if (!testbytes) return NULL; /* avoid error from pipeline */ testName=getFileNameFromHdrSig(testbytes); freez(&testbytes); if (!testName) return NULL; /* avoid error from pipeline */ pl = pipelineOpen1(getDecompressor(fileName), pipelineRead|pipelineSigpipe, fileName, NULL); lf = lineFileAttach(fileName, zTerm, pipelineFd(pl)); lf->pl = pl; return lf; } struct lineFile *lineFileDecompressFd(char *name, bool zTerm, int fd) /* open a linefile with decompression from a file or socket descriptor */ { struct pipeline *pl; struct lineFile *lf; pl = pipelineOpenFd1(getDecompressor(name), pipelineRead|pipelineSigpipe, fd, STDERR_FILENO); lf = lineFileAttach(name, zTerm, pipelineFd(pl)); lf->pl = pl; return lf; } struct lineFile *lineFileDecompressMem(bool zTerm, char *mem, long size) /* open a linefile with decompression from a memory stream */ { struct pipeline *pl; struct lineFile *lf; char *fileName = getFileNameFromHdrSig(mem); if (fileName==NULL) return NULL; pl = pipelineOpenMem1(getDecompressor(fileName), pipelineRead|pipelineSigpipe, mem, size, STDERR_FILENO); lf = lineFileAttach(fileName, zTerm, pipelineFd(pl)); lf->pl = pl; return lf; } #endif struct lineFile *lineFileAttach(char *fileName, bool zTerm, int fd) /* Wrap a line file around an open'd file. */ { struct lineFile *lf; AllocVar(lf); lf->fileName = cloneString(fileName); lf->fd = fd; lf->bufSize = 64*1024; lf->zTerm = zTerm; lf->buf = needMem(lf->bufSize+1); return lf; } struct lineFile *lineFileOnString(char *name, bool zTerm, char *s) /* Wrap a line file object around string in memory. This buffer * have zeroes written into it and be freed when the line file * is closed. */ { struct lineFile *lf; AllocVar(lf); lf->fileName = cloneString(name); lf->fd = -1; lf->bufSize = lf->bytesInBuf = strlen(s); lf->zTerm = zTerm; lf->buf = s; return lf; } #if (defined USE_TABIX && defined KNETFILE_HOOKS && !defined USE_SAMTABIX) // UCSC aliases for backwards compatibility with independently patched & linked samtools and tabix: #define bgzf_tell ti_bgzf_tell #define bgzf_read ti_bgzf_read #endif struct lineFile *lineFileTabixMayOpen(char *fileOrUrl, bool zTerm) /* Wrap a line file around a data file that has been compressed and indexed * by the tabix command line program. The index file .tbi must be * readable in addition to fileOrUrl. If there's a problem, warn & return NULL. * This works only if kent/src has been compiled with USE_TABIX=1 and linked * with the tabix C library. */ { #ifdef USE_TABIX if (fileOrUrl == NULL) errAbort("lineFileTabixMayOpen: fileOrUrl is NULL"); int tbiNameSize = strlen(fileOrUrl) + strlen(".tbi") + 1; char tbiName[tbiNameSize]; safef(tbiName, sizeof(tbiName), "%s.tbi", fileOrUrl); tabix_t *tabix = ti_open(fileOrUrl, tbiName); if (tabix == NULL) { warn("Unable to open \"%s\"", fileOrUrl); return NULL; } if ((tabix->idx = ti_index_load(tbiName)) == NULL) { warn("Unable to load tabix index from \"%s\"", tbiName); ti_close(tabix); tabix = NULL; return NULL; } struct lineFile *lf = needMem(sizeof(struct lineFile)); lf->fileName = cloneString(fileOrUrl); lf->fd = -1; lf->bufSize = 64 * 1024; lf->buf = needMem(lf->bufSize); lf->zTerm = zTerm; lf->tabix = tabix; lf->tabixIter = ti_iter_first(); return lf; #else // no USE_TABIX warn(COMPILE_WITH_TABIX, "lineFileTabixMayOpen"); return NULL; #endif // no USE_TABIX } boolean lineFileSetTabixRegion(struct lineFile *lf, char *seqName, int start, int end) /* Assuming lf was created by lineFileTabixMayOpen, tell tabix to seek to the specified region * and return TRUE (or if there are no items in region, return FALSE). */ { #ifdef USE_TABIX if (lf->tabix == NULL) errAbort("lineFileSetTabixRegion: lf->tabix is NULL. Did you open lf with lineFileTabixMayOpen?"); if (seqName == NULL) return FALSE; int tabixSeqId = ti_get_tid(lf->tabix->idx, seqName); if (tabixSeqId < 0 && startsWith("chr", seqName)) // We will get some files that have chr-less Ensembl chromosome names: tabixSeqId = ti_get_tid(lf->tabix->idx, seqName+strlen("chr")); if (tabixSeqId < 0) return FALSE; ti_iter_t iter = ti_queryi(lf->tabix, tabixSeqId, start, end); if (iter == NULL) return FALSE; if (lf->tabixIter != NULL) ti_iter_destroy(lf->tabixIter); lf->tabixIter = iter; lf->bufOffsetInFile = bgzf_tell(lf->tabix->fp); lf->bytesInBuf = 0; lf->lineIx = -1; lf->lineStart = 0; lf->lineEnd = 0; return TRUE; #else // no USE_TABIX warn(COMPILE_WITH_TABIX, "lineFileSetTabixRegion"); return FALSE; #endif // no USE_TABIX } struct lineFile *lineFileUdcMayOpen(char *fileOrUrl, bool zTerm) /* Create a line file object with an underlying UDC cache. NULL if not found. */ { if (fileOrUrl == NULL) errAbort("lineFileUdcMayOpen: fileOrUrl is NULL"); struct udcFile *udcFile = udcFileMayOpen(fileOrUrl, NULL); if (udcFile == NULL) return NULL; struct lineFile *lf; AllocVar(lf); lf->fileName = cloneString(fileOrUrl); lf->fd = -1; lf->bufSize = 0; lf->buf = NULL; lf->zTerm = zTerm; lf->udcFile = udcFile; return lf; } void lineFileExpandBuf(struct lineFile *lf, int newSize) /* Expand line file buffer. */ { assert(newSize > lf->bufSize); lf->buf = needMoreMem(lf->buf, lf->bytesInBuf, newSize); lf->bufSize = newSize; } struct lineFile *lineFileStdin(bool zTerm) /* Wrap a line file around stdin. */ { return lineFileAttach("stdin", zTerm, fileno(stdin)); } struct lineFile *lineFileMayOpen(char *fileName, bool zTerm) /* Try and open up a lineFile. */ { if (sameString(fileName, "stdin")) return lineFileStdin(zTerm); #ifndef WIN32 else if (getDecompressor(fileName) != NULL) return lineFileDecompress(fileName, zTerm); #endif else { int fd = open(fileName, O_RDONLY); if (fd == -1) return NULL; return lineFileAttach(fileName, zTerm, fd); } } struct lineFile *lineFileOpen(char *fileName, bool zTerm) /* Open up a lineFile or die trying. */ { struct lineFile *lf = lineFileMayOpen(fileName, zTerm); if (lf == NULL) errAbort("Couldn't open %s , %s", fileName, strerror(errno)); return lf; } void lineFileReuse(struct lineFile *lf) /* Reuse current line. */ { lf->reuse = TRUE; } INLINE void noTabixSupport(struct lineFile *lf, char *where) { #ifdef USE_TABIX if (lf->tabix != NULL) lineFileAbort(lf, "%s: not implemented for lineFile opened with lineFileTabixMayOpen.", where); #endif // USE_TABIX } void lineFileSeek(struct lineFile *lf, off_t offset, int whence) /* Seek to read next line from given position. */ { noTabixSupport(lf, "lineFileSeek"); if (lf->checkSupport) lf->checkSupport(lf, "lineFileSeek"); if (lf->pl != NULL) errnoAbort("Can't lineFileSeek on a compressed file: %s", lf->fileName); lf->reuse = FALSE; if (lf->udcFile) { udcSeek(lf->udcFile, offset); return; } lf->lineStart = lf->lineEnd = lf->bytesInBuf = 0; if ((lf->bufOffsetInFile = lseek(lf->fd, offset, whence)) == -1) errnoAbort("Couldn't lineFileSeek %s", lf->fileName); } void lineFileRewind(struct lineFile *lf) /* Return lineFile to start. */ { lineFileSeek(lf, 0, SEEK_SET); lf->lineIx = 0; } int lineFileLongNetRead(int fd, char *buf, int size) /* Keep reading until either get no new characters or * have read size */ { int oneSize, totalRead = 0; while (size > 0) { oneSize = read(fd, buf, size); if (oneSize <= 0) break; totalRead += oneSize; buf += oneSize; size -= oneSize; } return totalRead; } static void determineNlType(struct lineFile *lf, char *buf, int bufSize) /* determine type of newline used for the file, assumes buffer not empty */ { char *c = buf; if (bufSize==0) return; if (lf->nlType != nlt_undet) return; /* if already determined just exit */ lf->nlType = nlt_unix; /* start with default of unix lf type */ while (c < buf+bufSize) { if (*c=='\r') { lf->nlType = nlt_mac; if (++c < buf+bufSize) if (*c == '\n') lf->nlType = nlt_dos; return; } if (*(c++) == '\n') { return; } } } boolean lineFileNext(struct lineFile *lf, char **retStart, int *retSize) /* Fetch next line from file. */ { char *buf = lf->buf; int bytesInBuf = lf->bytesInBuf; int endIx = lf->lineEnd; boolean gotLf = FALSE; int newStart; if (lf->reuse) { lf->reuse = FALSE; if (retSize != NULL) *retSize = lf->lineEnd - lf->lineStart; *retStart = buf + lf->lineStart; if (lf->metaOutput && *retStart[0] == '#') metaDataAdd(lf, *retStart); return TRUE; } if (lf->nextCallBack) return lf->nextCallBack(lf, retStart, retSize); if (lf->udcFile) { lf->bufOffsetInFile = udcTell(lf->udcFile); char *line = udcReadLine(lf->udcFile); if (line==NULL) return FALSE; int lineSize = strlen(line); lf->bytesInBuf = lineSize; lf->lineIx = -1; lf->lineStart = 0; lf->lineEnd = lineSize; *retStart = line; freeMem(lf->buf); lf->buf = line; lf->bufSize = lineSize; return TRUE; } #ifdef USE_TABIX if (lf->tabix != NULL && lf->tabixIter != NULL) { // Just use line-oriented ti_read: int lineSize = 0; const char *line = ti_read(lf->tabix, lf->tabixIter, &lineSize); if (line == NULL) return FALSE; lf->bufOffsetInFile = -1; lf->bytesInBuf = lineSize; lf->lineIx = -1; lf->lineStart = 0; lf->lineEnd = lineSize; if (lineSize > lf->bufSize) // shouldn't be! but just in case: lineFileExpandBuf(lf, lineSize * 2); safecpy(lf->buf, lf->bufSize, line); *retStart = lf->buf; if (retSize != NULL) *retSize = lineSize; return TRUE; } #endif // USE_TABIX determineNlType(lf, buf+endIx, bytesInBuf); /* Find next end of line in buffer. */ switch(lf->nlType) { case nlt_unix: case nlt_dos: for (endIx = lf->lineEnd; endIx < bytesInBuf; ++endIx) { if (buf[endIx] == '\n') { gotLf = TRUE; endIx += 1; break; } } break; case nlt_mac: for (endIx = lf->lineEnd; endIx < bytesInBuf; ++endIx) { if (buf[endIx] == '\r') { gotLf = TRUE; endIx += 1; break; } } break; case nlt_undet: break; } /* If not in buffer read in a new buffer's worth. */ while (!gotLf) { int oldEnd = lf->lineEnd; int sizeLeft = bytesInBuf - oldEnd; int bufSize = lf->bufSize; int readSize = bufSize - sizeLeft; if (oldEnd > 0 && sizeLeft > 0) { memmove(buf, buf+oldEnd, sizeLeft); } lf->bufOffsetInFile += oldEnd; if (lf->fd >= 0) readSize = lineFileLongNetRead(lf->fd, buf+sizeLeft, readSize); #ifdef USE_TABIX else if (lf->tabix != NULL && readSize > 0) { readSize = bgzf_read(lf->tabix->fp, buf+sizeLeft, readSize); if (readSize < 1) return FALSE; } #endif // USE_TABIX else readSize = 0; if ((readSize == 0) && (endIx > oldEnd)) { endIx = sizeLeft; buf[endIx] = 0; lf->bytesInBuf = newStart = lf->lineStart = 0; lf->lineEnd = endIx; ++lf->lineIx; if (retSize != NULL) *retSize = endIx - newStart; *retStart = buf + newStart; if (*retStart[0] == '#') metaDataAdd(lf, *retStart); return TRUE; } else if (readSize <= 0) { lf->bytesInBuf = lf->lineStart = lf->lineEnd = 0; return FALSE; } bytesInBuf = lf->bytesInBuf = readSize + sizeLeft; lf->lineEnd = 0; determineNlType(lf, buf+endIx, bytesInBuf); /* Look for next end of line. */ switch(lf->nlType) { case nlt_unix: case nlt_dos: for (endIx = sizeLeft; endIx bufSize) { if (bufSize >= 512*1024*1024) { errAbort("Line too long (more than %d chars) line %d of %s", lf->bufSize, lf->lineIx+1, lf->fileName); } else { lineFileExpandBuf(lf, bufSize*2); buf = lf->buf; } } } if (lf->zTerm) { buf[endIx-1] = 0; if ((lf->nlType == nlt_dos) && (buf[endIx-2]=='\r')) { buf[endIx-2] = 0; } } lf->lineStart = newStart = lf->lineEnd; lf->lineEnd = endIx; ++lf->lineIx; if (retSize != NULL) *retSize = endIx - newStart; *retStart = buf + newStart; if (*retStart[0] == '#') metaDataAdd(lf, *retStart); return TRUE; } void lineFileVaAbort(struct lineFile *lf, char *format, va_list args) /* Print file name, line number, and error message, and abort. */ { struct dyString *dy = dyStringNew(0); dyStringPrintf(dy, "Error line %d of %s: ", lf->lineIx, lf->fileName); dyStringVaPrintf(dy, format, args); errAbort("%s", dy->string); dyStringFree(&dy); } void lineFileAbort(struct lineFile *lf, char *format, ...) /* Print file name, line number, and error message, and abort. */ { va_list args; va_start(args, format); lineFileVaAbort(lf, format, args); va_end(args); } void lineFileUnexpectedEnd(struct lineFile *lf) /* Complain about unexpected end of file. */ { errAbort("Unexpected end of file in %s", lf->fileName); } void lineFileNeedNext(struct lineFile *lf, char **retStart, int *retSize) /* Fetch next line from file. Squawk and die if it's not there. */ { if (!lineFileNext(lf, retStart, retSize)) lineFileUnexpectedEnd(lf); } void lineFileClose(struct lineFile **pLf) /* Close up a line file. */ { struct lineFile *lf; if ((lf = *pLf) != NULL) { #ifndef WIN32 struct pipeline *pl = lf->pl; if (pl != NULL) { pipelineWait(pl); pipelineFree(&lf->pl); } else #endif if (lf->fd > 0 && lf->fd != fileno(stdin)) { close(lf->fd); freeMem(lf->buf); } #ifdef USE_TABIX else if (lf->tabix != NULL) { if (lf->tabixIter != NULL) ti_iter_destroy(lf->tabixIter); ti_close(lf->tabix); } #endif // USE_TABIX else if (lf->udcFile != NULL) udcFileClose(&lf->udcFile); if (lf->closeCallBack) lf->closeCallBack(lf); freeMem(lf->fileName); metaDataFree(lf); freez(pLf); } } void lineFileCloseList(struct lineFile **pList) /* Close up a list of line files. */ { struct lineFile *el, *next; for (el = *pList; el != NULL; el = next) { next = el->next; lineFileClose(&el); } *pList = NULL; } void lineFileExpectWords(struct lineFile *lf, int expecting, int got) /* Check line has right number of words. */ { if (expecting != got) errAbort("Expecting %d words line %d of %s got %d", expecting, lf->lineIx, lf->fileName, got); } void lineFileExpectAtLeast(struct lineFile *lf, int expecting, int got) /* Check line has right number of words. */ { if (got < expecting) errAbort("Expecting at least %d words line %d of %s got %d", expecting, lf->lineIx, lf->fileName, got); } void lineFileShort(struct lineFile *lf) /* Complain that line is too short. */ { errAbort("Short line %d of %s", lf->lineIx, lf->fileName); } void lineFileReuseFull(struct lineFile *lf) // Reuse last full line read. Unlike lineFileReuse, // lineFileReuseFull only works with previous lineFileNextFull call { assert(lf->fullLine != NULL); lf->fullLineReuse = TRUE; } boolean lineFileNextFull(struct lineFile *lf, char **retFull, int *retFullSize, char **retRaw, int *retRawSize) // Fetch next line from file joining up any that are continued by ending '\' // If requested, and was joined, the unjoined raw lines are also returned // NOTE: comment lines can't be continued! ("# comment \ \n more comment" is 2 lines.) { // May have requested reusing the last full line. if (lf->fullLineReuse) { lf->fullLineReuse = FALSE; assert(lf->fullLine != NULL); *retFull = dyStringContents(lf->fullLine); if (retFullSize) *retFullSize = dyStringLen(lf->fullLine); if (retRaw != NULL) { assert(lf->rawLines != NULL); *retRaw = dyStringContents(lf->rawLines); if (retRawSize) *retRawSize = dyStringLen(lf->rawLines); } return TRUE; } // Empty pointers *retFull = NULL; if (retRaw != NULL) *retRaw = NULL; // Prepare lf buffers if (lf->fullLine == NULL) { lf->fullLine = dyStringNew(1024); lf->rawLines = dyStringNew(1024); // Better to always create it than test every time } else { dyStringClear(lf->fullLine); dyStringClear(lf->rawLines); } char *line; while (lineFileNext(lf, &line, NULL)) { char *start = skipLeadingSpaces(line); // Will the next line continue this one? char *end = start; if (*start == '#') // Comment lines can't be continued! end = start + strlen(start); else { while (*end != '\0') // walking forward for efficiency (avoid strlens()) { for (;*end != '\0' && *end != '\\'; end++) ; // Tight loop to find '\' if (*end == '\0') break; // This could be a continuation char *slash = end; if (*(++end) == '\\') // escaped continue; end = skipLeadingSpaces(end); if (*end == '\0') // Just whitespace after '\', so true continuation mark { if (retRaw != NULL) // Only if actually requested. { dyStringAppendN(lf->rawLines,line,(end - line)); dyStringAppendC(lf->rawLines,'\n'); // New lines delimit raw lines. } end = slash; // Don't need to zero, because of appending by length break; } } } // Stitch together full lines if (dyStringLen(lf->fullLine) == 0) dyStringAppendN(lf->fullLine,line,(end - line)); // includes first line's whitespace else if (start < end) // don't include continued line's leading spaces dyStringAppendN(lf->fullLine,start,(end - start)); if (*end == '\\') continue; // Got a full line now! *retFull = dyStringContents(lf->fullLine); if (retFullSize) *retFullSize = dyStringLen(lf->fullLine); if (retRaw != NULL && dyStringLen(lf->rawLines) > 0) // Only if actually requested & continued { // This is the final line which doesn't have a continuation char dyStringAppendN(lf->rawLines,line,(end - line)); *retRaw = dyStringContents(lf->rawLines); if (retRawSize) *retRawSize = dyStringLen(lf->rawLines); } return TRUE; } return FALSE; } boolean lineFileNextReal(struct lineFile *lf, char **retStart) /* Fetch next line from file that is not blank and * * does not start with a '#'. */ { char *s, c; while (lineFileNext(lf, retStart, NULL)) { s = skipLeadingSpaces(*retStart); c = s[0]; if (c != 0 && c != '#') return TRUE; } return FALSE; } boolean lineFileNextFullReal(struct lineFile *lf, char **retStart) // Fetch next line from file that is not blank and does not start with a '#'. // Continuation lines (ending in '\') are joined into a single line. { while (lineFileNextFull(lf, retStart, NULL, NULL, NULL)) { char *clippedText = skipLeadingSpaces(*retStart); if (clippedText[0] != '\0' && clippedText[0] != '#') return TRUE; } return FALSE; } int lineFileChopNext(struct lineFile *lf, char *words[], int maxWords) /* Return next non-blank line that doesn't start with '#' chopped into words. */ { int lineSize, wordCount; char *line; while (lineFileNext(lf, &line, &lineSize)) { if (line[0] == '#') continue; wordCount = chopByWhite(line, words, maxWords); if (wordCount != 0) return wordCount; } return 0; } int lineFileChopCharNext(struct lineFile *lf, char sep, char *words[], int maxWords) /* Return next non-blank line that doesn't start with '#' chopped into words delimited by sep. */ { int lineSize, wordCount; char *line; while (lineFileNext(lf, &line, &lineSize)) { if (line[0] == '#') continue; wordCount = chopByChar(line, sep, words, maxWords); if (wordCount != 0) return wordCount; } return 0; } int lineFileChopNextTab(struct lineFile *lf, char *words[], int maxWords) /* Return next non-blank line that doesn't start with '#' chopped into words * on tabs */ { int lineSize, wordCount; char *line; while (lineFileNext(lf, &line, &lineSize)) { if (line[0] == '#') continue; wordCount = chopByChar(line, '\t', words, maxWords); if (wordCount != 0) return wordCount; } return 0; } boolean lineFileNextCharRow(struct lineFile *lf, char sep, char *words[], int wordCount) /* Return next non-blank line that doesn't start with '#' chopped into words * delimited by sep. Returns FALSE at EOF. Aborts on error. */ { int wordsRead; wordsRead = lineFileChopCharNext(lf, sep, words, wordCount); if (wordsRead == 0) return FALSE; if (wordsRead < wordCount) lineFileExpectWords(lf, wordCount, wordsRead); return TRUE; } boolean lineFileNextRow(struct lineFile *lf, char *words[], int wordCount) /* Return next non-blank line that doesn't start with '#' chopped into words. * Returns FALSE at EOF. Aborts on error. */ { int wordsRead; wordsRead = lineFileChopNext(lf, words, wordCount); if (wordsRead == 0) return FALSE; if (wordsRead < wordCount) lineFileExpectWords(lf, wordCount, wordsRead); return TRUE; } boolean lineFileNextRowTab(struct lineFile *lf, char *words[], int wordCount) /* Return next non-blank line that doesn't start with '#' chopped into words * at tabs. Returns FALSE at EOF. Aborts on error. */ { int wordsRead; wordsRead = lineFileChopNextTab(lf, words, wordCount); if (wordsRead == 0) return FALSE; if (wordsRead < wordCount) lineFileExpectWords(lf, wordCount, wordsRead); return TRUE; } int lineFileNeedFullNum(struct lineFile *lf, char *words[], int wordIx) /* Make sure that words[wordIx] is an ascii integer, and return * binary representation of it. Require all chars in word to be digits.*/ { char *c; for (c = words[wordIx]; *c; c++) { if (*c == '-' || isdigit(*c)) /* NOTE: embedded '-' will be caught by lineFileNeedNum */ continue; errAbort("Expecting integer field %d line %d of %s, got %s", wordIx+1, lf->lineIx, lf->fileName, words[wordIx]); } return lineFileNeedNum(lf, words, wordIx); } int lineFileNeedNum(struct lineFile *lf, char *words[], int wordIx) /* Make sure that words[wordIx] is an ascii integer, and return * binary representation of it. Conversion stops at first non-digit char. */ { char *ascii = words[wordIx]; char c = ascii[0]; if (c != '-' && !isdigit(c)) errAbort("Expecting number field %d line %d of %s, got %s", wordIx+1, lf->lineIx, lf->fileName, ascii); return atoi(ascii); } int lineFileCheckAllIntsNoAbort(char *s, void *val, boolean isSigned, int byteCount, char *typeString, boolean noNeg, char *errMsg, int errMsgSize) /* Convert string to (signed) integer of the size specified. * Unlike atol assumes all of string is number, no trailing trash allowed. * Returns 0 if conversion possible, and value is returned in 'val' * Otherwise 1 for empty string or trailing chars, and 2 for numeric overflow, * and 3 for (-) sign in unsigned number. * Error messages if any are written into the provided buffer. * Pass NULL val if you only want validation. * Use noNeg if negative values are not allowed despite the type being signed, * returns 4. */ { unsigned long long res = 0, oldRes = 0; boolean isMinus = FALSE; if ((byteCount != 1) && (byteCount != 2) && (byteCount != 4) && (byteCount != 8)) errAbort("Unexpected error: Invalid byte count for integer size in lineFileCheckAllIntsNoAbort, expected 1 2 4 or 8, got %d.", byteCount); unsigned long long limit = 0xFFFFFFFFFFFFFFFFULL >> (8*(8-byteCount)); if (isSigned) limit >>= 1; char *p, *p0 = s; if (*p0 == '-') { if (isSigned) { if (noNeg) { safef(errMsg, errMsgSize, "Negative value not allowed"); return 4; } p0++; ++limit; isMinus = TRUE; } else { safef(errMsg, errMsgSize, "Unsigned %s may not begin with minus sign (-)", typeString); return 3; } } p = p0; while ((*p >= '0') && (*p <= '9')) { res *= 10; if (res < oldRes) { safef(errMsg, errMsgSize, "%s%s overflowed", isSigned ? "signed ":"", typeString); return 2; } oldRes = res; res += *p - '0'; if (res < oldRes) { safef(errMsg, errMsgSize, "%s%s overflowed", isSigned ? "signed ":"", typeString); return 2; } if (res > limit) { safef(errMsg, errMsgSize, "%s%s overflowed, limit=%s%llu", isSigned ? "signed ":"", typeString, isMinus ? "-" : "", limit); return 2; } oldRes = res; p++; } /* test for invalid character, empty, or just a minus */ if (*p != '\0') { safef(errMsg, errMsgSize, "Trailing characters parsing %s%s", isSigned ? "signed ":"", typeString); return 1; } if (p == p0) { safef(errMsg, errMsgSize, "Empty string parsing %s%s", isSigned ? "signed ":"", typeString); return 1; } if (!val) return 0; // only validation required switch (byteCount) { case 1: if (isSigned) { if (isMinus) *(char *)val = -res; else *(char *)val = res; } else *(unsigned char *)val = res; break; case 2: if (isSigned) { if (isMinus) *(short *)val = -res; else *(short *)val = res; } else *(unsigned short *)val = res; break; case 4: if (isSigned) { if (isMinus) *(int *)val = -res; else *(int *)val = res; } else *(unsigned *)val = res; break; case 8: if (isSigned) { if (isMinus) *(long long *)val = -res; else *(long long *) val =res; } else *(unsigned long long *)val = res; break; } return 0; } void lineFileAllInts(struct lineFile *lf, char *words[], int wordIx, void *val, boolean isSigned, int byteCount, char *typeString, boolean noNeg) /* Returns long long integer from converting the input string. Aborts on error. */ { char *s = words[wordIx]; char errMsg[256]; int res = lineFileCheckAllIntsNoAbort(s, val, isSigned, byteCount, typeString, noNeg, errMsg, sizeof errMsg); if (res > 0) { errAbort("%s in field %d line %d of %s, got %s", errMsg, wordIx+1, lf->lineIx, lf->fileName, s); } } int lineFileAllIntsArray(struct lineFile *lf, char *words[], int wordIx, void *array, int arraySize, boolean isSigned, int byteCount, char *typeString, boolean noNeg) /* Convert comma separated list of numbers to an array. Pass in * array and max size of array. Aborts on error. Returns number of elements in parsed array. */ { char *s = words[wordIx]; char errMsg[256]; unsigned count = 0; char *cArray = array; for (;;) { char *e; if (s == NULL || s[0] == 0 || count == arraySize) break; e = strchr(s, ','); if (e) *e = 0; int res = lineFileCheckAllIntsNoAbort(s, cArray, isSigned, byteCount, typeString, noNeg, errMsg, sizeof errMsg); if (res > 0) { errAbort("%s in column %d of array field %d line %d of %s, got %s", errMsg, count, wordIx+1, lf->lineIx, lf->fileName, s); } if (cArray) // NULL means validation only. cArray += byteCount; count++; if (e) // restore input string *e++ = ','; s = e; } return count; } double lineFileNeedDouble(struct lineFile *lf, char *words[], int wordIx) /* Make sure that words[wordIx] is an ascii double value, and return * binary representation of it. */ { char *valEnd; char *val = words[wordIx]; double doubleValue; doubleValue = strtod(val, &valEnd); if ((*val == '\0') || (*valEnd != '\0')) errAbort("Expecting double field %d line %d of %s, got %s", wordIx+1, lf->lineIx, lf->fileName, val); return doubleValue; } void lineFileSkip(struct lineFile *lf, int lineCount) /* Skip a number of lines. */ { int i, lineSize; char *line; for (i=0; ifileName); } } char *lineFileSkipToLineStartingWith(struct lineFile *lf, char *start, int maxCount) /* Skip to next line that starts with given string. Return NULL * if no such line found, otherwise return the line. */ { char *line; while (lineFileNext(lf, &line, NULL) && --maxCount >= 0) { if (startsWith(start, line)) return line; } return NULL; } char *lineFileReadAll(struct lineFile *lf) /* Read remainder of lineFile and return it as a string. */ { struct dyString *dy = dyStringNew(1024*4); lf->zTerm = 0; int size; char *line; while (lineFileNext(lf, &line, &size)) dyStringAppendN(dy, line, size); return dyStringCannibalize(&dy); } boolean lineFileParseHttpHeader(struct lineFile *lf, char **hdr, boolean *chunked, int *contentLength) /* Extract HTTP response header from lf into hdr, tell if it's * "Transfer-Encoding: chunked" or if it has a contentLength. */ { struct dyString *header = newDyString(1024); char *line; int lineSize; if (chunked != NULL) *chunked = FALSE; if (contentLength != NULL) *contentLength = -1; dyStringClear(header); if (lineFileNext(lf, &line, &lineSize)) { if (startsWith("HTTP/", line)) { char *version, *code; dyStringAppendN(header, line, lineSize-1); dyStringAppendC(header, '\n'); version = nextWord(&line); code = nextWord(&line); if (code == NULL) { warn("%s: Expecting HTTP/ header line, got this: %s\n", lf->fileName, header->string); *hdr = cloneString(header->string); dyStringFree(&header); return FALSE; } if (!sameString(code, "200")) { warn("%s: Errored HTTP response header: %s %s %s\n", lf->fileName, version, code, line); *hdr = cloneString(header->string); dyStringFree(&header); return FALSE; } while (lineFileNext(lf, &line, &lineSize)) { /* blank line means end of HTTP header */ if ((line[0] == '\r' && line[1] == 0) || line[0] == 0) break; if (strstr(line, "Transfer-Encoding: chunked") && chunked != NULL) *chunked = TRUE; dyStringAppendN(header, line, lineSize-1); dyStringAppendC(header, '\n'); if (strstr(line, "Content-Length:")) { code = nextWord(&line); code = nextWord(&line); if (contentLength != NULL) *contentLength = atoi(code); } } } else { /* put the line back, don't put it in header/hdr */ lineFileReuse(lf); warn("%s: Expecting HTTP/ header line, got this: %s\n", lf->fileName, header->string); *hdr = cloneString(header->string); dyStringFree(&header); return FALSE; } } else { *hdr = cloneString(header->string); dyStringFree(&header); return FALSE; } *hdr = cloneString(header->string); dyStringFree(&header); return TRUE; } /* lineFileParseHttpHeader */ struct dyString *lineFileSlurpHttpBody(struct lineFile *lf, boolean chunked, int contentLength) /* Return a dyString that contains the http response body in lf. Handle * chunk-encoding and content-length. */ { struct dyString *body = newDyString(64*1024); char *line; int lineSize; dyStringClear(body); if (chunked) { /* Handle "Transfer-Encoding: chunked" body */ /* Procedure from RFC2068 section 19.4.6 */ char *csword; unsigned chunkSize = 0; unsigned size; do { /* Read line that has chunk size (in hex) as first word. */ if (lineFileNext(lf, &line, NULL)) csword = nextWord(&line); else break; if (sscanf(csword, "%x", &chunkSize) < 1) { warn("%s: chunked transfer-encoding chunk size parse error.\n", lf->fileName); break; } /* If chunk size is 0, read in a blank line & then we're done. */ if (chunkSize == 0) { lineFileNext(lf, &line, NULL); if (line == NULL || (line[0] != '\r' && line[0] != 0)) warn("%s: chunked transfer-encoding: expected blank line, got %s\n", lf->fileName, line); break; } /* Read (and save) lines until we have read in chunk. */ for (size = 0; size < chunkSize; size += lineSize) { if (! lineFileNext(lf, &line, &lineSize)) break; dyStringAppendN(body, line, lineSize-1); dyStringAppendC(body, '\n'); } /* Read blank line - or extra CRLF inserted in the middle of the * current line, in which case we need to trim it. */ if (size > chunkSize) { body->stringSize -= (size - chunkSize); body->string[body->stringSize] = 0; } else if (size == chunkSize) { lineFileNext(lf, &line, NULL); if (line == NULL || (line[0] != '\r' && line[0] != 0)) warn("%s: chunked transfer-encoding: expected blank line, got %s\n", lf->fileName, line); } } while (chunkSize > 0); /* Try to read in next line. If it's an HTTP header, put it back. */ /* If there is a next line but it's not an HTTP header, it's a footer. */ if (lineFileNext(lf, &line, NULL)) { if (startsWith("HTTP/", line)) lineFileReuse(lf); else { /* Got a footer -- keep reading until blank line */ warn("%s: chunked transfer-encoding: got footer %s, discarding it.\n", lf->fileName, line); while (lineFileNext(lf, &line, NULL)) { if ((line[0] == '\r' && line[1] == 0) || line[0] == 0) break; warn("discarding footer line: %s\n", line); } } } } else if (contentLength >= 0) { /* Read in known length */ int size; for (size = 0; size < contentLength; size += lineSize) { if (! lineFileNext(lf, &line, &lineSize)) break; dyStringAppendN(body, line, lineSize-1); dyStringAppendC(body, '\n'); } } else { /* Read in to end of file (assume it's not a persistent connection) */ while (lineFileNext(lf, &line, &lineSize)) { dyStringAppendN(body, line, lineSize-1); dyStringAppendC(body, '\n'); } } return(body); } /* lineFileSlurpHttpBody */ void lineFileRemoveInitialCustomTrackLines(struct lineFile *lf) /* remove initial browser and track lines */ { char *line; while (lineFileNextReal(lf, &line)) { if (!(startsWith("browser", line) || startsWith("track", line) )) { verbose(2, "found line not browser or track: %s\n", line); lineFileReuse(lf); break; } verbose(2, "skipping %s\n", line); } } rtracklayer/src/ucsc/linefile.h0000644000175400017540000003062213556116552017623 0ustar00biocbuildbiocbuild/* lineFile - stuff to rapidly read text files and parse them into * lines. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef LINEFILE_H #define LINEFILE_H #include "dystring.h" #include "udc.h" #ifdef USE_TABIX #include "tabix.h" #endif #define LF_BOGUS_FILE_PREFIX "somefile." enum nlType { nlt_undet, /* undetermined */ nlt_unix, /* lf */ nlt_dos, /* crlf */ nlt_mac /* cr */ }; struct metaOutput /* struct to store list of file handles to output meta data to * meta data is text after # */ { struct metaOutput *next; /* next file handle */ FILE *metaFile; /* file to write metadata to */ }; struct lineFile /* Structure to handle fast, line oriented * fileIo. */ { struct lineFile *next; /* Might need to be on a list. */ char *fileName; /* Name of file. */ int fd; /* File handle. -1 for 'memory' files. */ int bufSize; /* Size of buffer. */ off_t bufOffsetInFile; /* Offset in file of first buffer byte. */ int bytesInBuf; /* Bytes read into buffer. */ int reserved; /* Reserved (zero for now). */ int lineIx; /* Current line. */ int lineStart; /* Offset of line in buffer. */ int lineEnd; /* End of line in buffer. */ bool zTerm; /* Replace '\n' with zero? */ enum nlType nlType; /* type of line endings: dos, unix, mac or undet */ bool reuse; /* Set if reusing input. */ char *buf; /* Buffer. */ struct pipeline *pl; /* pipeline if reading compressed */ struct metaOutput *metaOutput; /* list of FILE handles to write metaData to */ bool isMetaUnique; /* if set, do not repeat comments in output */ struct hash *metaLines; /* save lines to suppress repetition */ #ifdef USE_TABIX tabix_t *tabix; /* A tabix-compressed file and its binary index file (.tbi) */ ti_iter_t tabixIter; /* An iterator to get decompressed indexed lines of text */ #endif struct udcFile *udcFile; /* udc file if using caching */ struct dyString *fullLine; // Filled with full line when a lineFileNextFull is called struct dyString *rawLines; // Filled with raw lines used to create the full line boolean fullLineReuse; // If TRUE, next call to lineFileNextFull will get // already built fullLine void *dataForCallBack; // ptr to data needed for callbacks void(*checkSupport)(struct lineFile *lf, char *where); // check if operation supported boolean(*nextCallBack)(struct lineFile *lf, char **retStart, int *retSize); // next line callback void(*closeCallBack)(struct lineFile *lf); // close callback }; char *getFileNameFromHdrSig(char *m); /* Check if header has signature of supported compression stream, and return a phoney filename for it, or NULL if no sig found. */ struct lineFile *lineFileDecompressFd(char *name, bool zTerm, int fd); /* open a linefile with decompression from a file or socket descriptor */ struct lineFile *lineFileDecompressMem(bool zTerm, char *mem, long size); /* open a linefile with decompression from a memory stream */ struct lineFile *lineFileMayOpen(char *fileName, bool zTerm); /* Try and open up a lineFile. If fileName ends in .gz, .Z, or .bz2, * it will be read from a decompress pipeline. */ struct lineFile *lineFileUdcMayOpen(char *fileName, bool zTerm); /* Open a lineFile through the UDC */ struct lineFile *lineFileOpen(char *fileName, bool zTerm); /* Open up a lineFile or die trying If fileName ends in .gz, .Z, or .bz2, * it will be read from a decompress pipeline.. */ struct lineFile *lineFileAttach(char *fileName, bool zTerm, int fd); /* Wrap a line file around an open'd file. */ struct lineFile *lineFileStdin(bool zTerm); /* Wrap a line file around stdin. */ struct lineFile *lineFileOnString(char *name, bool zTerm, char *s); /* Wrap a line file object around string in memory. This buffer * have zeroes written into it if zTerm is non-zero. It will * be freed when the line file is closed. */ struct lineFile *lineFileOnBigBed(char *bigBedFileName); /* Wrap a line file object around a BigBed. */ void lineFileClose(struct lineFile **pLf); /* Close up a line file. */ void lineFileCloseList(struct lineFile **pList); /* Close up a list of line files. */ boolean lineFileNext(struct lineFile *lf, char **retStart, int *retSize); /* Fetch next line from file. */ boolean lineFileNextFull(struct lineFile *lf, char **retFull, int *retFullSize, char **retRaw, int *retRawSize); // Fetch next line from file joining up any that are continued by ending '\' // If requested, and was joined, the unjoined raw lines are also returned // NOTE: comment lines can't be continued! ("# comment \ \n more comment" is 2 lines.) boolean lineFileNextReal(struct lineFile *lf, char **retStart); /* Fetch next line from file that is not blank and * does not start with a '#'. */ boolean lineFileNextFullReal(struct lineFile *lf, char **retStart); // Fetch next line from file that is not blank and does not start with a '#'. // Continuation lines (ending in '\') are joined into a single line. void lineFileNeedNext(struct lineFile *lf, char **retStart, int *retSize); /* Fetch next line from file. Squawk and die if it's not there. */ void lineFileReuse(struct lineFile *lf); /* Reuse current line. */ void lineFileReuseFull(struct lineFile *lf); // Reuse last full line read. Unlike lineFileReuse, // lineFileReuseFull only works with previous lineFileNextFull call #define lineFileString(lf) ((lf)->buf + (lf)->lineStart) /* Current string in line file. */ #define lineFileTell(lf) ((lf)->bufOffsetInFile + (lf)->lineStart) /* Current offset (of string start) in file. */ void lineFileSeek(struct lineFile *lf, off_t offset, int whence); /* Seek to read next line from given position. */ void lineFileRewind(struct lineFile *lf); /* Return lineFile to start. */ void lineFileAbort(struct lineFile *lf, char *format, ...) /* Print file name, line number, and error message, and abort. */ #if defined(__GNUC__) __attribute__((format(printf, 2, 3))) #endif ; void lineFileVaAbort(struct lineFile *lf, char *format, va_list args); /* Print file name, line number, and error message, and abort. */ void lineFileUnexpectedEnd(struct lineFile *lf); /* Complain about unexpected end of file. */ void lineFileExpectWords(struct lineFile *lf, int expecting, int got); /* Check line has right number of words. */ void lineFileExpectAtLeast(struct lineFile *lf, int expecting, int got); /* Check line has right number of words. */ void lineFileShort(struct lineFile *lf); /* Complain that line is too short. */ boolean lineFileNextRow(struct lineFile *lf, char *words[], int wordCount); /* Return next non-blank line that doesn't start with '#' chopped into words. * Returns FALSE at EOF. Aborts on error. */ #define lineFileRow(lf, words) lineFileNextRow(lf, words, ArraySize(words)) /* Read in line chopped into fixed size word array. */ boolean lineFileNextCharRow(struct lineFile *lf, char sep, char *words[], int wordCount); /* Return next non-blank line that doesn't start with '#' chopped into words * delimited by sep. Returns FALSE at EOF. Aborts on error. */ boolean lineFileNextRowTab(struct lineFile *lf, char *words[], int wordCount); /* Return next non-blank line that doesn't start with '#' chopped into words * at tabs. Returns FALSE at EOF. Aborts on error. */ #define lineFileRowTab(lf, words) \ lineFileNextRowTab(lf, words, ArraySize(words)) /* Read in line chopped by tab into fixed size word array. */ int lineFileChopNext(struct lineFile *lf, char *words[], int maxWords); /* Return next non-blank line that doesn't start with '#' chopped into words. */ #define lineFileChop(lf, words) lineFileChopNext(lf, words, ArraySize(words)) /* Ease-of-usef macro for lineFileChopNext above. */ int lineFileChopCharNext(struct lineFile *lf, char sep, char *words[], int maxWords); /* Return next non-blank line that doesn't start with '#' chopped into words delimited by sep. */ int lineFileChopNextTab(struct lineFile *lf, char *words[], int maxWords); /* Return next non-blank line that doesn't start with '#' chopped into words * on tabs */ #define lineFileChopTab(lf, words) lineFileChopNextTab(lf, words, ArraySize(words)) /* Ease-of-usef macro for lineFileChopNext above. */ int lineFileCheckAllIntsNoAbort(char *s, void *val, boolean isSigned, int byteCount, char *typeString, boolean noNeg, char *errMsg, int errMsgSize); /* Convert string to (signed) integer of the size specified. * Unlike atol assumes all of string is number, no trailing trash allowed. * Returns 0 if conversion possible, and value is returned in 'val' * Otherwise 1 for empty string or trailing chars, and 2 for numeric overflow, * and 3 for (-) sign in unsigned number. * Error messages if any are written into the provided buffer. * Pass NULL val if you only want validation. * Use noNeg if negative values are not allowed despite the type being signed, * returns 4. */ void lineFileAllInts(struct lineFile *lf, char *words[], int wordIx, void *val, boolean isSigned, int byteCount, char *typeString, boolean noNeg); /* Returns long long integer from converting the input string. Aborts on error. */ int lineFileAllIntsArray(struct lineFile *lf, char *words[], int wordIx, void *array, int arraySize, boolean isSigned, int byteCount, char *typeString, boolean noNeg); /* Convert comma separated list of numbers to an array. Pass in * array and max size of array. Aborts on error. Returns number of elements in parsed array. */ int lineFileNeedNum(struct lineFile *lf, char *words[], int wordIx); /* Make sure that words[wordIx] is an ascii integer, and return * binary representation of it. */ int lineFileNeedFullNum(struct lineFile *lf, char *words[], int wordIx); /* Make sure that words[wordIx] is an ascii integer, and return * binary representation of it. Require all chars in word to be digits.*/ double lineFileNeedDouble(struct lineFile *lf, char *words[], int wordIx); /* Make sure that words[wordIx] is an ascii double value, and return * binary representation of it. */ void lineFileSkip(struct lineFile *lf, int lineCount); /* Skip a number of lines. */ char *lineFileSkipToLineStartingWith(struct lineFile *lf, char *start, int maxCount); /* Skip to next line that starts with given string. Return NULL * if no such line found, otherwise return the line. */ char *lineFileReadAll(struct lineFile *lf); /* Read remainder of lineFile and return it as a string. */ boolean lineFileParseHttpHeader(struct lineFile *lf, char **hdr, boolean *chunked, int *contentLength); /* Extract HTTP response header from lf into hdr, tell if it's * "Transfer-Encoding: chunked" or if it has a contentLength. */ struct dyString *lineFileSlurpHttpBody(struct lineFile *lf, boolean chunked, int contentLength); /* Return a dyString that contains the http response body in lf. Handle * chunk-encoding and content-length. */ void lineFileSetMetaDataOutput(struct lineFile *lf, FILE *f); /* set file to write meta data to, * should be called before reading from input file */ void lineFileSetUniqueMetaData(struct lineFile *lf); /* suppress duplicate lines in metadata */ void lineFileExpandBuf(struct lineFile *lf, int newSize); /* Expand line file buffer. */ void lineFileRemoveInitialCustomTrackLines(struct lineFile *lf); /* remove initial browser and track lines */ /*----- Optionally-compiled wrapper on tabix (compression + indexing): -----*/ #define COMPILE_WITH_TABIX "%s: Sorry, this functionality is available only when\n" \ "you have installed the tabix library from\n" \ "http://samtools.sourceforge.net/ and rebuilt kent/src with USE_TABIX=1\n" \ "(see http://genomewiki.ucsc.edu/index.php/Build_Environment_Variables)." struct lineFile *lineFileTabixMayOpen(char *fileOrUrl, bool zTerm); /* Wrap a line file around a data file that has been compressed and indexed * by the tabix command line program. The index file .tbi must be * readable in addition to fileName. If there's a problem, warn & return NULL. * This works only if kent/src has been compiled with USE_TABIX=1 and linked * with the tabix C library. */ boolean lineFileSetTabixRegion(struct lineFile *lf, char *seqName, int start, int end); /* Assuming lf was created by lineFileTabixMayOpen, tell tabix to seek to the specified region * and return TRUE (or if there are no items in region, return FALSE). */ #endif /* LINEFILE_H */ rtracklayer/src/ucsc/localmem.c0000644000175400017540000001117313556116552017620 0ustar00biocbuildbiocbuild/* LocalMem.c - local memory routines. * * These routines are meant for the sort of scenario where * a lot of little to medium size pieces of memory are * allocated, and then disposed of all at once. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include "common.h" #include "localmem.h" struct lm { struct lmBlock *blocks; size_t blockSize; size_t allignMask; size_t allignAdd; }; struct lmBlock { struct lmBlock *next; char *free; char *end; char *extra; }; static struct lmBlock *newBlock(struct lm *lm, size_t reqSize) /* Allocate a new block of at least reqSize */ { size_t size = (reqSize > lm->blockSize ? reqSize : lm->blockSize); size_t fullSize = size + sizeof(struct lmBlock); struct lmBlock *mb = needLargeZeroedMem(fullSize); if (mb == NULL) errAbort("Couldn't allocate %lld bytes", (long long)fullSize); mb->free = (char *)(mb+1); mb->end = ((char *)mb) + fullSize; mb->next = lm->blocks; lm->blocks = mb; return mb; } struct lm *lmInit(int blockSize) /* Create a local memory pool. */ { struct lm *lm; int aliSize = sizeof(long); if (aliSize < sizeof(double)) aliSize = sizeof(double); if (aliSize < sizeof(void *)) aliSize = sizeof(void *); lm = needMem(sizeof(*lm)); lm->blocks = NULL; if (blockSize <= 0) blockSize = (1<<14); /* 16k default. */ lm->blockSize = blockSize; lm->allignAdd = (aliSize-1); lm->allignMask = ~lm->allignAdd; newBlock(lm, blockSize); return lm; } void lmCleanup(struct lm **pLm) /* Clean up a local memory pool. */ { struct lm *lm = *pLm; if (lm == NULL) return; slFreeList(&lm->blocks); freeMem(lm); *pLm = NULL; } size_t lmAvailable(struct lm *lm) // Returns currently available memory in pool { struct lmBlock *mb = lm->blocks; return (mb->end - mb->free); } size_t lmSize(struct lm *lm) // Returns current size of pool, even for memory already allocated { size_t fullSize = 0; struct lmBlock *mb = lm->blocks; for (;mb != NULL;mb = mb->next) fullSize += (mb->end - (char *)(mb+1)); return fullSize; } void *lmAlloc(struct lm *lm, size_t size) /* Allocate memory from local pool. */ { struct lmBlock *mb = lm->blocks; void *ret; size_t memLeft = mb->end - mb->free; if (memLeft < size) mb = newBlock(lm, size); ret = mb->free; mb->free += ((size+lm->allignAdd)&lm->allignMask); if (mb->free > mb->end) mb->free = mb->end; return ret; } void *lmAllocMoreMem(struct lm *lm, void *pt, size_t oldSize, size_t newSize) /* Adjust memory size on a block, possibly relocating it. If block is grown, * new memory is zeroed. */ { struct lmBlock *mb = lm->blocks; // rare case that pointer is to last lm alloc, but still try. // Note this is the one place where the pointer gets reused and it is known to be in this lm if ((char *)pt + oldSize == mb->free && (char *)pt + newSize <= mb->end) { if (newSize > oldSize) // only move the free pointer on more mem mb->free = pt + newSize; return pt; } void *new = lmAlloc(lm, newSize); memcpy(new, pt, oldSize); return new; } void *lmCloneMem(struct lm *lm, void *pt, size_t size) /* Return a local mem copy of memory block. */ { void *d = lmAlloc(lm, size); memcpy(d, pt, size); return d; } char *lmCloneStringZ(struct lm *lm, char *string, int size) /* Return local mem copy of string. */ { if (string == NULL) return NULL; else { char *s = lmAlloc(lm, size+1); memcpy(s, string, size); return s; } } char *lmCloneString(struct lm *lm, char *string) /* Return local mem copy of string. */ { if (string == NULL) return NULL; else return lmCloneStringZ(lm, string, strlen(string)); } char *lmCloneFirstWord(struct lm *lm, char *line) /* Clone first word in line */ { char *startFirstWord = skipLeadingSpaces(line); if (startFirstWord == NULL) return NULL; char *endFirstWord = skipToSpaces(startFirstWord); if (endFirstWord == NULL) return lmCloneString(lm, startFirstWord); else return lmCloneStringZ(lm, startFirstWord, endFirstWord - startFirstWord); } char *lmCloneSomeWord(struct lm *lm, char *line, int wordIx) /* Return a clone of the given space-delimited word within line. Returns NULL if * not that many words in line. */ { if (wordIx < 0) return NULL; int i; for (i=0; iname, name); return n; } rtracklayer/src/ucsc/localmem.h0000644000175400017540000000436013556116552017625 0ustar00biocbuildbiocbuild/* LocalMem.h - local memory routines. * * These routines are meant for the sort of scenario where * a lot of little to medium size pieces of memory are * allocated, and then disposed of all at once. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef LOCALMEM_H #define LOCALMEM_H struct lm *lmInit(int blockSize); /* Create a local memory pool. Parameters are: * blockSize - how much system memory to allocate at a time. Can * pass in zero and a reasonable default will be used. */ void lmCleanup(struct lm **pLm); /* Clean up a local memory pool. */ size_t lmAvailable(struct lm *lm); // Returns currently available memory in pool size_t lmSize(struct lm *lm); // Returns current size of pool, even for memory already allocated void *lmAlloc(struct lm *lm, size_t size); /* Allocate memory from local pool. */ void *lmAllocMoreMem(struct lm *lm, void *pt, size_t oldSize, size_t newSize); /* Adjust memory size on a block, possibly relocating it. If block is grown, * new memory is zeroed. NOTE: in RARE cases, same pointer may be returned. */ void *lmCloneMem(struct lm *lm, void *pt, size_t size); /* Return a local mem copy of memory block. */ char *lmCloneStringZ(struct lm *lm, char *string, int size); /* Return local mem copy of string of given size, adding null terminator. */ char *lmCloneString(struct lm *lm, char *string); /* Return local mem copy of string. */ char *lmCloneFirstWord(struct lm *lm, char *line); /* Clone first word in line */ char *lmCloneSomeWord(struct lm *lm, char *line, int wordIx); /* Return a clone of the given space-delimited word within line. Returns NULL if * not that many words in line. */ struct slName *lmSlName(struct lm *lm, char *name); /* Return slName in memory. */ #define lmAllocVar(lm, pt) (pt = lmAlloc(lm, sizeof(*pt))); /* Shortcut to allocating a single variable in local mem and * assigning pointer to it. */ #define lmCloneVar(lm, pt) lmCloneMem(lm, pt, sizeof((pt)[0])) /* Allocate copy of a structure. */ #define lmAllocArray(lm, pt, size) (pt = lmAlloc(lm, sizeof(*pt) * (size))) /* Shortcut to allocating an array in local mem and * assigning pointer to it. */ #endif//ndef LOCALMEM_H rtracklayer/src/ucsc/memalloc.c0000644000175400017540000003376613556116552017634 0ustar00biocbuildbiocbuild/* memalloc.c - Routines to allocate and deallocate dynamic memory. * This lets you have a stack of memory handlers. The default * memory handler is a thin shell around malloc/free. You can * substitute routines that do more integrety checking with * pushCarefulMem(), or routines of your own devising with * pushMemHandler(). * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include #include "common.h" #include "obscure.h" #include "memalloc.h" #include "dlist.h" static void *defaultAlloc(size_t size) /* Default allocator. */ { return malloc(size); } static void defaultFree(void *vpt) /* Default deallocator. */ { free(vpt); } static void *defaultRealloc(void *vpt, size_t size) /* Default deallocator. */ { return realloc(vpt, size); } static struct memHandler defaultMemHandler = /* Default memory handler. */ { NULL, defaultAlloc, defaultFree, defaultRealloc, }; static struct memHandler *mhStack = &defaultMemHandler; struct memHandler *pushMemHandler(struct memHandler *newHandler) /* Use newHandler for memory requests until matching popMemHandler. * Returns previous top of memory handler stack. */ { struct memHandler *oldHandler = mhStack; slAddHead(&mhStack, newHandler); return oldHandler; } struct memHandler *popMemHandler() /* Removes top element from memHandler stack and returns it. */ { struct memHandler *oldHandler = mhStack; if (mhStack == &defaultMemHandler) errAbort("Too many popMemHandlers()"); mhStack = mhStack->next; return oldHandler; } void setDefaultMemHandler() /* Sets memHandler to the default. */ { mhStack = &defaultMemHandler; } /* 128*8*1024*1024 == 1073741824 == 2^30 on 32 bit machines,size_t == 4 bytes*/ /* on 64 bit machines, size_t = 8 bytes, 2^30 * 2 * 2 * 2 * 2 = 2^34 == 16 Gb */ static size_t maxAlloc = (size_t)128*8*1024*1024*(sizeof(size_t)/4)*(sizeof(size_t)/4)*(sizeof(size_t)/4*(sizeof(size_t)/4)); void setMaxAlloc(size_t s) /* Set large allocation limit. */ { maxAlloc = s; } void *needLargeMem(size_t size) /* This calls abort if the memory allocation fails. The memory is * not initialized to zero. */ { void *pt; if (size == 0 || size >= maxAlloc) errAbort("needLargeMem: trying to allocate %llu bytes (limit: %llu)", (unsigned long long)size, (unsigned long long)maxAlloc); if ((pt = mhStack->alloc(size)) == NULL) errAbort("needLargeMem: Out of memory - request size %llu bytes, errno: %d\n", (unsigned long long)size, errno); return pt; } void *needLargeZeroedMem(size_t size) /* Request a large block of memory and zero it. */ { void *v; v = needLargeMem(size); memset(v, 0, size); return v; } void *needLargeMemResize(void* vp, size_t size) /* Adjust memory size on a block, possibly relocating it. If vp is NULL, * a new memory block is allocated. Memory not initted. */ { void *pt; if (size == 0 || size >= maxAlloc) errAbort("needLargeMemResize: trying to allocate %llu bytes (limit: %llu)", (unsigned long long)size, (unsigned long long)maxAlloc); if ((pt = mhStack->realloc(vp, size)) == NULL) errAbort("needLargeMemResize: Out of memory - request size %llu bytes, errno: %d\n", (unsigned long long)size, errno); return pt; } void *needLargeZeroedMemResize(void* vp, size_t oldSize, size_t newSize) /* Adjust memory size on a block, possibly relocating it. If vp is NULL, a * new memory block is allocated. If block is grown, new memory is zeroed. */ { void *v = needLargeMemResize(vp, newSize); if (newSize > oldSize) memset(((char*)v)+oldSize, 0, newSize-oldSize); return v; } void *needHugeMem(size_t size) /* No checking on size. Memory not initted. */ { void *pt; if (size == 0) errAbort("needHugeMem: trying to allocate 0 bytes"); if ((pt = mhStack->alloc(size)) == NULL) errAbort("needHugeMem: Out of huge memory - request size %llu bytes, errno: %d\n", (unsigned long long)size, errno); return pt; } void *needHugeZeroedMem(size_t size) /* Request a large block of memory and zero it. */ { void *v; v = needHugeMem(size); memset(v, 0, size); return v; } void *needHugeMemResize(void* vp, size_t size) /* Adjust memory size on a block, possibly relocating it. If vp is NULL, * a new memory block is allocated. No checking on size. Memory not * initted. */ { void *pt; if ((pt = mhStack->realloc(vp, size)) == NULL) errAbort("needHugeMemResize: Out of memory - request resize %llu bytes, errno: %d\n", (unsigned long long)size, errno); return pt; } void *needHugeZeroedMemResize(void* vp, size_t oldSize, size_t newSize) /* Adjust memory size on a block, possibly relocating it. If vp is NULL, a * new memory block is allocated. No checking on size. If block is grown, * new memory is zeroed. */ { void *v; v = needHugeMemResize(vp, newSize); if (newSize > oldSize) memset(((char*)v)+oldSize, 0, newSize-oldSize); return v; } #define NEEDMEM_LIMIT 500000000 void *needMem(size_t size) /* Need mem calls abort if the memory allocation fails. The memory * is initialized to zero. */ { void *pt; if (size == 0 || size > NEEDMEM_LIMIT) errAbort("needMem: trying to allocate %llu bytes (limit: %llu)", (unsigned long long)size, (unsigned long long)NEEDMEM_LIMIT); if ((pt = mhStack->alloc(size)) == NULL) errAbort("needMem: Out of memory - request size %llu bytes, errno: %d\n", (unsigned long long)size, errno); memset(pt, 0, size); return pt; } void *needMoreMem(void *old, size_t oldSize, size_t newSize) /* Adjust memory size on a block, possibly relocating it. If vp is NULL, a * new memory block is allocated. No checking on size. If block is grown, * new memory is zeroed. */ { return needLargeZeroedMemResize(old, oldSize, newSize); } void *wantMem(size_t size) /* Want mem just calls malloc - no zeroing of memory, no * aborting if request fails. */ { return mhStack->alloc(size); } void freeMem(void *pt) /* Free memory will check for null before freeing. */ { if (pt != NULL) mhStack->free(pt); } void freez(void *vpt) /* Pass address of pointer. Will free pointer and set it * to NULL. */ { void **ppt = (void **)vpt; void *pt = *ppt; *ppt = NULL; freeMem(pt); } static pthread_mutex_t carefulMutex = PTHREAD_MUTEX_INITIALIZER; static int carefulAlignSize; /* Alignment size for machine - 8 bytes for DEC alpha, 4 for Sparc. */ static int carefulAlignAdd; /* Do aliSize = *(unaliSize+carefulAlignAdd)&carefulAlignMask); */ #if __WORDSIZE == 64 static bits64 carefulAlignMask; /* to make sure requests are aligned. */ #elif __WORDSIZE == 32 static bits32 carefulAlignMask; /* to make sure requests are aligned. */ #else static bits32 carefulAlignMask; /* to make sure requests are aligned. */ #endif static struct memHandler *carefulParent; static size_t carefulMaxToAlloc; static size_t carefulAlloced; struct carefulMemBlock /* Keep one of these for each outstanding memory block. It's a doubly linked list. */ { struct carefulMemBlock *next; struct carefulMemBlock *prev; int size; int startCookie; }; int cmbStartCookie = 0x78753421; char cmbEndCookie[4] = {0x44, 0x33, 0x7F, 0x42}; struct dlList *cmbAllocedList; static void carefulMemInit(size_t maxToAlloc) /* Initialize careful memory system */ { carefulMaxToAlloc = maxToAlloc; cmbAllocedList = newDlList(); carefulAlignSize = sizeof(double); if (sizeof(void *) > carefulAlignSize) carefulAlignSize = sizeof(void *); if (sizeof(long) > carefulAlignSize) carefulAlignSize = sizeof(long); if (sizeof(off_t) > carefulAlignSize) carefulAlignSize = sizeof(off_t); if (sizeof(long long) > carefulAlignSize) carefulAlignSize = sizeof(long long); carefulAlignAdd = carefulAlignSize-1; carefulAlignMask = ~carefulAlignAdd; } static void *carefulAlloc(size_t size) /* Allocate extra memory for cookies and list node, and then * return memory block. */ { pthread_mutex_lock( &carefulMutex ); struct carefulMemBlock *cmb; char *pEndCookie; size_t newAlloced = size + carefulAlloced; size_t aliSize; if (newAlloced > carefulMaxToAlloc) { char maxAlloc[32]; char allocRequest[32]; sprintLongWithCommas(maxAlloc, (long long)carefulMaxToAlloc); sprintLongWithCommas(allocRequest, (long long)newAlloced); pthread_mutex_unlock( &carefulMutex ); errAbort("carefulAlloc: Allocated too much memory - more than %s bytes (%s)", maxAlloc, allocRequest); } carefulAlloced = newAlloced; aliSize = ((size + sizeof(*cmb) + 4 + carefulAlignAdd)&carefulAlignMask); cmb = carefulParent->alloc(aliSize); cmb->size = size; cmb->startCookie = cmbStartCookie; pEndCookie = (char *)(cmb+1); pEndCookie += size; memcpy(pEndCookie, cmbEndCookie, sizeof(cmbEndCookie)); dlAddHead(cmbAllocedList, (struct dlNode *)cmb); pthread_mutex_unlock( &carefulMutex ); return (void *)(cmb+1); } static void carefulFree(void *vpt) /* Check cookies and free. */ { pthread_mutex_lock( &carefulMutex ); struct carefulMemBlock *cmb = ((struct carefulMemBlock *)vpt)-1; size_t size = cmb->size; char *pEndCookie; carefulAlloced -= size; pEndCookie = (((char *)(cmb+1)) + size); if (cmb->startCookie != cmbStartCookie) { pthread_mutex_unlock( &carefulMutex ); errAbort("Bad start cookie %x freeing %llx\n", cmb->startCookie, ptrToLL(vpt)); } if (memcmp(pEndCookie, cmbEndCookie, sizeof(cmbEndCookie)) != 0) { pthread_mutex_unlock( &carefulMutex ); errAbort("Bad end cookie %x%x%x%x freeing %llx\n", pEndCookie[0], pEndCookie[1], pEndCookie[2], pEndCookie[3], ptrToLL(vpt)); } dlRemove((struct dlNode *)cmb); carefulParent->free(cmb); pthread_mutex_unlock( &carefulMutex ); } static void *carefulRealloc(void *vpt, size_t size) /* realloc a careful memblock block. */ { unsigned char* newBlk = carefulAlloc(size); if (vpt != NULL) { struct carefulMemBlock *cmb = ((struct carefulMemBlock *)vpt)-1; memcpy(newBlk, vpt, cmb->size); carefulFree(vpt); } return newBlk; } void carefulCheckHeap() /* Walk through allocated memory and make sure that all cookies are * in place. */ { int maxPieces = 10000000; /* Assume no more than this many pieces allocated. */ struct carefulMemBlock *cmb; char *pEndCookie; size_t size; char errMsg[1024]; boolean errFound = FALSE; if (carefulParent == NULL) return; pthread_mutex_lock( &carefulMutex ); for (cmb = (struct carefulMemBlock *)(cmbAllocedList->head); cmb->next != NULL; cmb = cmb->next) { size = cmb->size; pEndCookie = (((char *)(cmb+1)) + size); if (cmb->startCookie != cmbStartCookie) { safef(errMsg, sizeof errMsg, "Bad start cookie %x checking %llx\n", cmb->startCookie, ptrToLL(cmb+1)); errFound = TRUE; break; } if (memcmp(pEndCookie, cmbEndCookie, sizeof(cmbEndCookie)) != 0) { safef(errMsg, sizeof errMsg, "Bad end cookie %x%x%x%x checking %llx\n", pEndCookie[0], pEndCookie[1], pEndCookie[2], pEndCookie[3], ptrToLL(cmb+1)); errFound = TRUE; break; } if (--maxPieces == 0) { safef(errMsg, sizeof errMsg, "Loop or more than 10000000 pieces in memory list"); errFound = TRUE; break; } } pthread_mutex_unlock( &carefulMutex ); if (errFound) errAbort("%s", errMsg); } int carefulCountBlocksAllocated() /* How many memory items are allocated? */ { pthread_mutex_lock( &carefulMutex ); int result = dlCount(cmbAllocedList); pthread_mutex_unlock( &carefulMutex ); return result; } size_t carefulTotalAllocated() /* Return total bases allocated */ { pthread_mutex_lock( &carefulMutex ); size_t result = carefulAlloced; pthread_mutex_unlock( &carefulMutex ); return result; } static struct memHandler carefulMemHandler = /* Default memory handler. */ { NULL, carefulAlloc, carefulFree, carefulRealloc, }; void pushCarefulMemHandler(size_t maxAlloc) /* Push the careful (paranoid, conservative, checks everything) * memory handler top of the memHandler stack and use it. */ { carefulMemInit(maxAlloc); carefulParent = pushMemHandler(&carefulMemHandler); } struct memTracker /* A structure to keep track of memory. */ { struct memTracker *next; /* Next in list. */ struct dlList *list; /* List of allocated blocks. */ struct memHandler *parent; /* Underlying memory handler. */ struct memHandler *handler; /* Memory handler. */ }; static struct memTracker *memTracker = NULL; /* Head in memTracker list. */ static void *memTrackerAlloc(size_t size) /* Allocate extra memory for cookies and list node, and then * return memory block. */ { struct dlNode *node; size += sizeof (*node); node = memTracker->parent->alloc(size); if (node == NULL) return node; dlAddTail(memTracker->list, node); return (void*)(node+1); } static void memTrackerFree(void *vpt) /* Check cookies and free. */ { struct dlNode *node = vpt; node -= 1; dlRemove(node); memTracker->parent->free(node); } static void *memTrackerRealloc(void *vpt, size_t size) /* Resize a memory block from memTrackerAlloc. */ { if (vpt == NULL) return memTrackerAlloc(size); else { struct dlNode *node = ((struct dlNode *)vpt)-1; size += sizeof(*node); dlRemove(node); node = memTracker->parent->realloc(node, size); if (node == NULL) return node; dlAddTail(memTracker->list, node); return (void*)(node+1); } } void memTrackerStart() /* Push memory handler that will track blocks allocated so that * they can be automatically released with memTrackerEnd(). You * can have memTrackerStart one after the other, but memTrackerStart/End * need to nest. */ { struct memTracker *mt; if (memTracker != NULL) errAbort("multiple memTrackerStart calls"); AllocVar(mt); AllocVar(mt->handler); mt->handler->alloc = memTrackerAlloc; mt->handler->free = memTrackerFree; mt->handler->realloc = memTrackerRealloc; mt->list = dlListNew(); mt->parent = pushMemHandler(mt->handler); memTracker = mt; } void memTrackerEnd() /* Free any remaining blocks and pop tracker memory handler. */ { struct memTracker *mt = memTracker; if (mt == NULL) errAbort("memTrackerEnd without memTrackerStart"); memTracker = NULL; popMemHandler(); dlListFree(&mt->list); freeMem(mt->handler); freeMem(mt); } rtracklayer/src/ucsc/memalloc.h0000644000175400017540000000322513556116552017624 0ustar00biocbuildbiocbuild/* Let the user redirect where memory allocation/deallocation * happens. 'careful' routines help debug scrambled heaps. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef MEMALLOC_H #define MEMALLOC_H struct memHandler { struct memHandler *next; void * (*alloc)(size_t size); void (*free)(void *vpt); void * (*realloc)(void* vpt, size_t size); }; struct memHandler *pushMemHandler(struct memHandler *newHandler); /* Use newHandler for memory requests until matching popMemHandler. * Returns previous top of memory handler stack. */ struct memHandler *popMemHandler(); /* Removes top element from memHandler stack and returns it. */ void setDefaultMemHandler(); /* Sets memHandler to the default. */ void pushCarefulMemHandler(size_t maxAlloc); /* Push the careful (paranoid, conservative, checks everything) * memory handler top of the memHandler stack and use it. */ void carefulCheckHeap(); /* Walk through allocated memory and make sure that all cookies are * in place. Only walks through what's been done since * pushCarefulMemHandler(). */ int carefulCountBlocksAllocated(); /* How many memory items are allocated? (Since called * pushCarefulMemHandler(). */ size_t carefulTotalAllocated(); /* Return total bases allocated */ void setMaxAlloc(size_t s); /* Set large allocation limit. */ void memTrackerStart(); /* Push memory handler that will track blocks allocated so that * they can be automatically released with memTrackerEnd(). */ void memTrackerEnd(); /* Free any remaining blocks and pop tracker memory handler. */ #endif /* MEMALLOC_H */ rtracklayer/src/ucsc/net.c0000644000175400017540000015165113556116552016623 0ustar00biocbuildbiocbuild/* net.c some stuff to wrap around net communications. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include "common.h" #include #ifndef WIN32 #include #include #include #include #include #include "internet.h" #include "errAbort.h" #include "hash.h" #include "net.h" #include "linefile.h" #include "base64.h" #include "cheapcgi.h" #include "https.h" #include "sqlNum.h" #include "obscure.h" /* Brought errno in to get more useful error messages */ extern int errno; static int netStreamSocket() /* Create a TCP/IP streaming socket. Complain and return something * negative if can't */ { int sd = socket(AF_INET, SOCK_STREAM, 0); if (sd < 0) warn("Couldn't make AF_INET socket."); return sd; } static int setSocketNonBlocking(int sd, boolean set) /* Use socket control flags to set O_NONBLOCK if set==TRUE, * or clear it if set==FALSE. * Return -1 if there are any errors, 0 if successful. */ { long fcntlFlags; // Set or clear non-blocking if ((fcntlFlags = fcntl(sd, F_GETFL, NULL)) < 0) { warn("Error fcntl(..., F_GETFL) (%s)", strerror(errno)); return -1; } if (set) fcntlFlags |= O_NONBLOCK; else fcntlFlags &= (~O_NONBLOCK); if (fcntl(sd, F_SETFL, fcntlFlags) < 0) { warn("Error fcntl(..., F_SETFL) (%s)", strerror(errno)); return -1; } return 0; } int setReadWriteTimeouts(int sd, int seconds) /* Set read and write timeouts on socket sd * Return -1 if there are any errors, 0 if successful. */ { struct timeval timeout; timeout.tv_sec = seconds; timeout.tv_usec = 0; if (setsockopt(sd, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(timeout)) < 0) { warn("setsockopt failed setting socket receive timeout\n"); return -1; } if (setsockopt(sd, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof(timeout)) < 0) { warn("setsockopt failed setting socket send timeout\n"); return -1; } return 0; } static struct timeval tvMinus(struct timeval a, struct timeval b) /* Return the result of a - b; this handles wrapping of milliseconds. * result.tv_usec will always be positive. * result.tv_sec will be negative if b > a. */ { // subtract b from a. if (a.tv_usec < b.tv_usec) { a.tv_usec += 1000000; a.tv_sec--; } a.tv_usec -= b.tv_usec; a.tv_sec -= b.tv_sec; return a; } static int netConnectWithTimeout(char *hostName, int port, long msTimeout) /* In order to avoid a very long default timeout (several minutes) for hosts that will * not answer the port, we are forced to connect non-blocking. * After the connection has been established, we return to blocking mode. * Also closes sd if error. */ { int sd; struct sockaddr_in sai; /* Some system socket info. */ int res; fd_set mySet; if (hostName == NULL) { warn("NULL hostName in netConnect"); return -1; } if (!internetFillInAddress(hostName, port, &sai)) return -1; if ((sd = netStreamSocket()) < 0) return sd; // Set socket to nonblocking so we can manage our own timeout time. if (setSocketNonBlocking(sd, TRUE) < 0) { close(sd); return -1; } // Trying to connect with timeout res = connect(sd, (struct sockaddr*) &sai, sizeof(sai)); if (res < 0) { if (errno == EINPROGRESS) { struct timeval startTime; gettimeofday(&startTime, NULL); struct timeval remainingTime; remainingTime.tv_sec = (long) (msTimeout/1000); remainingTime.tv_usec = (long) (((msTimeout/1000)-remainingTime.tv_sec)*1000000); while (1) { FD_ZERO(&mySet); FD_SET(sd, &mySet); // use tempTime (instead of using remainingTime directly) because on some platforms select() may modify the time val. struct timeval tempTime = remainingTime; res = select(sd+1, NULL, &mySet, &mySet, &tempTime); if (res < 0) { if (errno == EINTR) // Ignore the interrupt { // Subtract the elapsed time from remaining time since some platforms need this. struct timeval newTime; gettimeofday(&newTime, NULL); struct timeval elapsedTime = tvMinus(newTime, startTime); remainingTime = tvMinus(remainingTime, elapsedTime); if (remainingTime.tv_sec < 0) // means our timeout has more than expired { remainingTime.tv_sec = 0; remainingTime.tv_usec = 0; } startTime = newTime; } else { warn("Error in select() during TCP non-blocking connect %d - %s", errno, strerror(errno)); close(sd); return -1; } } else if (res > 0) { // Socket selected for write when it is ready int valOpt; socklen_t lon; // But check the socket for any errors lon = sizeof(valOpt); if (getsockopt(sd, SOL_SOCKET, SO_ERROR, (void*) (&valOpt), &lon) < 0) { warn("Error in getsockopt() %d - %s", errno, strerror(errno)); close(sd); return -1; } // Check the value returned... if (valOpt) { warn("Error in TCP non-blocking connect() %d - %s", valOpt, strerror(valOpt)); close(sd); return -1; } break; } else { warn("TCP non-blocking connect() to %s timed-out in select() after %ld milliseconds - Cancelling!", hostName, msTimeout); close(sd); return -1; } } } else { warn("TCP non-blocking connect() error %d - %s", errno, strerror(errno)); close(sd); return -1; } } // Set to blocking mode again if (setSocketNonBlocking(sd, FALSE) < 0) { close(sd); return -1; } if (setReadWriteTimeouts(sd, DEFAULTREADWRITETTIMEOUTSEC) < 0) { close(sd); return -1; } return sd; } int netConnect(char *hostName, int port) /* Start connection with a server. */ { return netConnectWithTimeout(hostName, port, DEFAULTCONNECTTIMEOUTMSEC); // 10 seconds connect timeout } int netMustConnect(char *hostName, int port) /* Start connection with server or die. */ { int sd = netConnect(hostName, port); if (sd < 0) noWarnAbort(); return sd; } int netMustConnectTo(char *hostName, char *portName) /* Start connection with a server and a port that needs to be converted to integer */ { if (!isdigit(portName[0])) errAbort("netConnectTo: ports must be numerical, not %s", portName); return netMustConnect(hostName, atoi(portName)); } int netAcceptingSocketFrom(int port, int queueSize, char *host) /* Create a socket that can accept connections from a * IP address on the current machine if the current machine * has multiple IP addresses. */ { struct sockaddr_in sai; int sd; int flag = 1; netBlockBrokenPipes(); if ((sd = netStreamSocket()) < 0) return sd; if (!internetFillInAddress(host, port, &sai)) return -1; if (setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(int))) return -1; if (bind(sd, (struct sockaddr*)&sai, sizeof(sai)) == -1) { warn("Couldn't bind socket to %d: %s", port, strerror(errno)); close(sd); return -1; } listen(sd, queueSize); return sd; } int netAcceptingSocket(int port, int queueSize) /* Create a socket that can accept connections from * anywhere. */ { return netAcceptingSocketFrom(port, queueSize, NULL); } int netAccept(int sd) /* Accept incoming connection from socket descriptor. */ { socklen_t fromLen; return accept(sd, NULL, &fromLen); } int netAcceptFrom(int acceptor, unsigned char subnet[4]) /* Wait for incoming connection from socket descriptor * from IP address in subnet. Subnet is something * returned from netParseSubnet or internetParseDottedQuad. * Subnet may be NULL. */ { struct sockaddr_in sai; /* Some system socket info. */ ZeroVar(&sai); sai.sin_family = AF_INET; for (;;) { socklen_t addrSize = sizeof(sai); int sd = accept(acceptor, (struct sockaddr *)&sai, &addrSize); if (sd >= 0) { if (subnet == NULL) return sd; else { unsigned char unpacked[4]; internetUnpackIp(ntohl(sai.sin_addr.s_addr), unpacked); if (internetIpInSubnet(unpacked, subnet)) { return sd; } else { close(sd); } } } } } FILE *netFileFromSocket(int socket) /* Wrap a FILE around socket. This should be fclose'd * and separately the socket close'd. */ { FILE *f; if ((socket = dup(socket)) < 0) errnoAbort("Couldn't dupe socket in netFileFromSocket"); f = fdopen(socket, "r+"); if (f == NULL) errnoAbort("Couldn't fdopen socket in netFileFromSocket"); return f; } static boolean plumberInstalled = FALSE; void netBlockBrokenPipes() /* Make it so a broken pipe doesn't kill us. */ { if (!plumberInstalled) { signal(SIGPIPE, SIG_IGN); /* Block broken pipe signals. */ plumberInstalled = TRUE; } } ssize_t netReadAll(int sd, void *vBuf, ssize_t size) /* Read given number of bytes into buffer. * Don't give up on first read! */ { char *buf = vBuf; ssize_t totalRead = 0; int oneRead; if (!plumberInstalled) netBlockBrokenPipes(); while (totalRead < size) { oneRead = read(sd, buf + totalRead, size - totalRead); if (oneRead < 0) return oneRead; if (oneRead == 0) break; totalRead += oneRead; } return totalRead; } ssize_t netMustReadAll(int sd, void *vBuf, ssize_t size) /* Read given number of bytes into buffer or die. * Don't give up if first read is short! */ { ssize_t ret = netReadAll(sd, vBuf, size); if (ret < 0) errnoAbort("Couldn't finish netReadAll"); return ret; } static void notGoodSubnet(char *sns) /* Complain about subnet format. */ { errAbort("'%s' is not a properly formatted subnet. Subnets must consist of\n" "one to three dot-separated numbers between 0 and 255", sns); } void netParseSubnet(char *in, unsigned char out[4]) /* Parse subnet, which is a prefix of a normal dotted quad form. * Out will contain 255's for the don't care bits. */ { out[0] = out[1] = out[2] = out[3] = 255; if (in != NULL) { char *snsCopy = strdup(in); char *words[5]; int wordCount, i; wordCount = chopString(snsCopy, ".", words, ArraySize(words)); if (wordCount > 3 || wordCount < 1) notGoodSubnet(in); for (i=0; i 255) notGoodSubnet(in); out[i] = x; } freez(&snsCopy); } } static void parseByteRange(char *url, ssize_t *rangeStart, ssize_t *rangeEnd, boolean terminateAtByteRange) /* parse the byte range information from url */ { char *x; /* default to no byte range specified */ *rangeStart = -1; *rangeEnd = -1; x = strrchr(url, ';'); if (x) { if (startsWith(";byterange=", x)) { char *y=strchr(x, '='); ++y; char *z=strchr(y, '-'); if (z) { ++z; if (terminateAtByteRange) *x = 0; // TODO: use something better than atoll() ? *rangeStart = atoll(y); if (z[0] != '\0') *rangeEnd = atoll(z); } } } } void cgiDecodeFull(char *in, char *out, int inLength) /* Out will be a cgi-decoded version of in (no space from plus!). * Out will be a little shorter than in typically, and * can be the same buffer. */ { char c; int i; for (i=0; i= sizeof(buf)) errAbort("Url too long: '%s'", url); strcpy(buf, url); url = buf; /* Find out protocol - default to http. */ s = trimSpaces(url); s = stringIn("://", url); if (s == NULL) { strcpy(parsed->protocol, "http"); s = url; } else { *s = 0; tolowers(url); safecpy(parsed->protocol, sizeof(parsed->protocol), url); s += 3; } /* Split off file part. */ parsed->byteRangeStart = -1; /* default to no byte range specified */ parsed->byteRangeEnd = -1; u = strchr(s, '/'); if (u == NULL) strcpy(parsed->file, "/"); else { parseByteRange(u, &parsed->byteRangeStart, &parsed->byteRangeEnd, TRUE); if (sameWord(parsed->protocol,"http") || sameWord(parsed->protocol,"https")) { // http servers expect the URL request to be URL-encoded already. /* need to encode spaces, but not ! other characters */ char *t=replaceChars(u," ","%20"); safecpy(parsed->file, sizeof(parsed->file), t); freeMem(t); } *u = 0; // terminate the host:port string if (sameWord(parsed->protocol,"ftp")) { ++u; // that first slash is not considered part of the ftp path // decode now because the FTP server does NOT expect URL-encoding. cgiDecodeFull(u,parsed->file,strlen(u)); // decodes %FF but not + } } /* Split off user part */ v = strchr(s, '@'); if (v == NULL) { if (sameWord(parsed->protocol,"http") || sameWord(parsed->protocol,"https")) { strcpy(parsed->user, ""); strcpy(parsed->password, ""); } if (sameWord(parsed->protocol,"ftp")) { strcpy(parsed->user, "anonymous"); strcpy(parsed->password, "x@genome.ucsc.edu"); } } else { *v = 0; /* split off password part */ w = strchr(s, ':'); if (w == NULL) { safecpy(parsed->user, sizeof(parsed->user), s); strcpy(parsed->password, ""); } else { *w = 0; safecpy(parsed->user, sizeof(parsed->user), s); safecpy(parsed->password, sizeof(parsed->password), w+1); } cgiDecode(parsed->user,parsed->user,strlen(parsed->user)); cgiDecode(parsed->password,parsed->password,strlen(parsed->password)); s = v+1; } /* Save port if it's there. If not default to 80. */ t = strchr(s, ':'); if (t == NULL) { if (sameWord(parsed->protocol,"http")) strcpy(parsed->port, "80"); if (sameWord(parsed->protocol,"https")) strcpy(parsed->port, "443"); if (sameWord(parsed->protocol,"ftp")) strcpy(parsed->port, "21"); } else { *t++ = 0; if (!isdigit(t[0])) errAbort("Non-numeric port name %s", t); safecpy(parsed->port, sizeof(parsed->port), t); } /* What's left is the host. */ safecpy(parsed->host, sizeof(parsed->host), s); } char *urlFromNetParsedUrl(struct netParsedUrl *npu) /* Build URL from netParsedUrl structure */ { struct dyString *dy = newDyString(512); dyStringAppend(dy, npu->protocol); dyStringAppend(dy, "://"); if (npu->user[0] != 0) { char *encUser = cgiEncode(npu->user); dyStringAppend(dy, encUser); freeMem(encUser); if (npu->password[0] != 0) { dyStringAppend(dy, ":"); char *encPassword = cgiEncode(npu->password); dyStringAppend(dy, encPassword); freeMem(encPassword); } dyStringAppend(dy, "@"); } dyStringAppend(dy, npu->host); /* do not include port if it is the default */ if (!( (sameString(npu->protocol, "ftp" ) && sameString("21", npu->port)) || (sameString(npu->protocol, "http" ) && sameString("80", npu->port)) || (sameString(npu->protocol, "https") && sameString("443",npu->port)) )) { dyStringAppend(dy, ":"); dyStringAppend(dy, npu->port); } dyStringAppend(dy, npu->file); if (npu->byteRangeStart != -1) { dyStringPrintf(dy, ";byterange=%lld-", (long long)npu->byteRangeStart); if (npu->byteRangeEnd != -1) dyStringPrintf(dy, "%lld", (long long)npu->byteRangeEnd); } /* Clean up and return handle. */ return dyStringCannibalize(&dy); } int netWaitForData(int sd, int microseconds) /* Wait for descriptor to have some data to read, up to given number of * microseconds. Returns amount of data there or zero if timed out. */ { struct timeval tv; fd_set set; int readyCount; for (;;) { if (microseconds >= 1000000) { tv.tv_sec = microseconds/1000000; tv.tv_usec = microseconds%1000000; } else { tv.tv_sec = 0; tv.tv_usec = microseconds; } FD_ZERO(&set); FD_SET(sd, &set); readyCount = select(sd+1, &set, NULL, NULL, &tv); if (readyCount < 0) { if (errno == EINTR) /* Select interrupted, not timed out. */ continue; else warn("select failure %s", strerror(errno)); } else { return readyCount; /* Zero readyCount indicates time out */ } } } static boolean readReadyWait(int sd, int microseconds) /* Wait for descriptor to have some data to read, up to given number of * number of microseconds. Returns true if there is data, false if timed out. */ { int readyCount = netWaitForData(sd, microseconds); return readyCount > 0; /* Zero readyCount indicates time out */ } static void sendFtpCommandOnly(int sd, char *cmd) /* send command to ftp server */ { mustWriteFd(sd, cmd, strlen(cmd)); } #define NET_FTP_TIMEOUT 1000000 static boolean receiveFtpReply(int sd, char *cmd, struct dyString **retReply, int *retCode) /* send command to ftp server and check resulting reply code, * warn and return FALSE if not desired reply. If retReply is non-NULL, store reply text there. */ { char *startLastLine = NULL; struct dyString *rs = newDyString(4*1024); while (1) { int readSize = 0; while (1) { char buf[4*1024]; if (!readReadyWait(sd, NET_FTP_TIMEOUT)) { warn("ftp server response timed out > %d microsec", NET_FTP_TIMEOUT); return FALSE; } if ((readSize = read(sd, buf, sizeof(buf))) == 0) break; dyStringAppendN(rs, buf, readSize); if (endsWith(rs->string,"\n")) break; } /* find the start of the last line in the buffer */ startLastLine = rs->string+strlen(rs->string)-1; if (startLastLine >= rs->string) if (*startLastLine == '\n') --startLastLine; while ((startLastLine >= rs->string) && (*startLastLine != '\n')) --startLastLine; ++startLastLine; if (strlen(startLastLine)>4) if ( isdigit(startLastLine[0]) && isdigit(startLastLine[1]) && isdigit(startLastLine[2]) && startLastLine[3]==' ') break; if (readSize == 0) break; // EOF /* must be some text info we can't use, ignore it till we get status code */ } int reply = atoi(startLastLine); if ((reply < 200) || (reply > 399)) { warn("ftp server error on cmd=[%s] response=[%s]",cmd,rs->string); return FALSE; } if (retReply) *retReply = rs; else dyStringFree(&rs); if (retCode) *retCode = reply; return TRUE; } static boolean sendFtpCommand(int sd, char *cmd, struct dyString **retReply, int *retCode) /* send command to ftp server and check resulting reply code, * warn and return FALSE if not desired reply. If retReply is non-NULL, store reply text there. */ { sendFtpCommandOnly(sd, cmd); return receiveFtpReply(sd, cmd, retReply, retCode); } static int parsePasvPort(char *rs) /* parse PASV reply to get the port and return it */ { char *words[7]; int wordCount; char *rsStart = strchr(rs,'('); char *rsEnd = strchr(rs,')'); int result = 0; rsStart++; *rsEnd=0; wordCount = chopString(rsStart, ",", words, ArraySize(words)); if (wordCount != 6) errAbort("PASV reply does not parse correctly"); result = atoi(words[4])*256+atoi(words[5]); return result; } static long long parseFtpSIZE(char *rs) /* parse reply to SIZE and return it */ { char *words[3]; int wordCount; char *rsStart = rs; long long result = 0; wordCount = chopString(rsStart, " ", words, ArraySize(words)); if (wordCount != 2) errAbort("SIZE reply does not parse correctly"); result = atoll(words[1]); return result; } static time_t parseFtpMDTM(char *rs) /* parse reply to MDTM and return it * 200 YYYYMMDDhhmmss */ { char *words[3]; int wordCount = chopString(rs, " ", words, ArraySize(words)); if (wordCount != 2) errAbort("MDTM reply should have 2 words but has %d", wordCount); #define EXPECTED_MDTM_FORMAT "YYYYmmddHHMMSS" if (strlen(words[1]) < strlen(EXPECTED_MDTM_FORMAT)) errAbort("MDTM reply word [%s] shorter than " EXPECTED_MDTM_FORMAT, words[1]); // man strptime -> // "There should be whitespace or other alphanumeric characters between any two field descriptors." // There are no separators in the MDTM timestamp, so make a spread-out version for strptime: char spread[] = "YYYY mm dd HH MM SS"; char *from = words[1]; char *to = spread; *to++ = *from++; *to++ = *from++; *to++ = *from++; *to++ = *from++; *to++ = '-'; *to++ = *from++; *to++ = *from++; *to++ = '-'; *to++ = *from++; *to++ = *from++; *to++ = ' '; *to++ = *from++; *to++ = *from++; *to++ = ':'; *to++ = *from++; *to++ = *from++; *to++ = ':'; *to++ = *from++; *to++ = *from++; *to++ = 0; struct tm tm; if (strptime(spread, "%Y-%m-%d %H:%M:%S", &tm) == NULL) errAbort("unable to parse MDTM string [%s]", spread); // Not set by strptime(); tells mktime() to determine whether daylight saving time is in effect: tm.tm_isdst = -1; time_t t = mktime(&tm); if (t == -1) errAbort("mktime failed while parsing strptime'd MDTM string [%s]", words[1]); return t; } static int openFtpControlSocket(char *host, int port, char *user, char *password) /* Open a socket to host,port; authenticate anonymous ftp; set type to I; * return socket desc or -1 if there was an error. */ { int sd = netConnect(host, port); if (sd < 0) return -1; /* First read the welcome msg */ if (readReadyWait(sd, NET_FTP_TIMEOUT)) sendFtpCommand(sd, "", NULL, NULL); char cmd[256]; int retCode = 0; safef(cmd,sizeof(cmd),"USER %s\r\n", user); if (!sendFtpCommand(sd, cmd, NULL, &retCode)) { close(sd); return -1; } if (retCode == 331) { safef(cmd,sizeof(cmd),"PASS %s\r\n", password); if (!sendFtpCommand(sd, cmd, NULL, NULL)) { close(sd); return -1; } } if (!sendFtpCommand(sd, "TYPE I\r\n", NULL, NULL)) { close(sd); return -1; } /* 200 Type set to I */ /* (send the data as binary, so can support compressed files) */ return sd; } boolean netGetFtpInfo(char *url, long long *retSize, time_t *retTime) /* Return date in UTC and size of ftp url file */ { /* Parse the URL and connect. */ struct netParsedUrl npu; netParseUrl(url, &npu); if (!sameString(npu.protocol, "ftp")) errAbort("netGetFtpInfo: url (%s) is not for ftp.", url); // TODO maybe remove this workaround where udc cache wants info on URL "/" ? if (sameString(npu.file,"/")) { *retSize = 0; *retTime = time(NULL); return TRUE; } int sd = openFtpControlSocket(npu.host, atoi(npu.port), npu.user, npu.password); if (sd < 0) return FALSE; char cmd[256]; safef(cmd,sizeof(cmd),"SIZE %s\r\n", npu.file); struct dyString *rs = NULL; if (!sendFtpCommand(sd, cmd, &rs, NULL)) { close(sd); return FALSE; } *retSize = parseFtpSIZE(rs->string); /* 200 12345 */ dyStringFree(&rs); safef(cmd,sizeof(cmd),"MDTM %s\r\n", npu.file); if (!sendFtpCommand(sd, cmd, &rs, NULL)) { close(sd); return FALSE; } *retTime = parseFtpMDTM(rs->string); /* 200 YYYYMMDDhhmmss */ dyStringFree(&rs); close(sd); return TRUE; } struct netConnectFtpParams /* params to pass to thread */ { pthread_t thread; int pipefd[2]; int sd; int sdata; struct netParsedUrl npu; }; static void *sendFtpDataToPipeThread(void *threadParams) /* This is to be executed by the child process after the fork in netGetOpenFtpSockets. * It keeps the ftp control socket alive while reading from the ftp data socket * and writing to the pipe to the parent process, which closes the ftp sockets * and reads from the pipe. */ { struct netConnectFtpParams *params = threadParams; pthread_detach(params->thread); // this thread will never join back with it's progenitor char buf[32768]; int rd = 0; long long dataPos = 0; if (params->npu.byteRangeStart != -1) dataPos = params->npu.byteRangeStart; while((rd = read(params->sdata, buf, 32768)) > 0) { if (params->npu.byteRangeEnd != -1 && (dataPos + rd) > params->npu.byteRangeEnd) rd = params->npu.byteRangeEnd - dataPos + 1; int wt = write(params->pipefd[1], buf, rd); if (wt == -1 && params->npu.byteRangeEnd != -1) { // errAbort in child process is messy; let reader complain if // trouble. If byterange was open-ended, we will hit this point // when the parent stops reading and closes the pipe. errnoWarn("error writing ftp data to pipe"); break; } dataPos += rd; if (params->npu.byteRangeEnd != -1 && dataPos >= params->npu.byteRangeEnd) break; } if (rd == -1) // Again, avoid abort in child process. errnoWarn("error reading ftp socket"); close(params->pipefd[1]); /* we are done with it */ close(params->sd); close(params->sdata); return NULL; } static int netGetOpenFtpSockets(char *url, int *retCtrlSd) /* Return a socket descriptor for url data (url can end in ";byterange:start-end", * or -1 if error. * If retCtrlSd is non-null, keep the control socket alive and set *retCtrlSd. * Otherwise, create a pipe and fork to keep control socket alive in the child * process until we are done fetching data. */ { char cmd[256]; /* Parse the URL and connect. */ struct netParsedUrl npu; netParseUrl(url, &npu); if (!sameString(npu.protocol, "ftp")) errAbort("netGetOpenFtpSockets: url (%s) is not for ftp.", url); int sd = openFtpControlSocket(npu.host, atoi(npu.port), npu.user, npu.password); if (sd == -1) return -1; struct dyString *rs = NULL; if (!sendFtpCommand(sd, "PASV\r\n", &rs, NULL)) { close(sd); return -1; } /* 227 Entering Passive Mode (128,231,210,81,222,250) */ if (npu.byteRangeStart != -1) { safef(cmd,sizeof(cmd),"REST %lld\r\n", (long long) npu.byteRangeStart); if (!sendFtpCommand(sd, cmd, NULL, NULL)) { close(sd); return -1; } } /* RETR for files, LIST for directories ending in / */ safef(cmd,sizeof(cmd),"%s %s\r\n",((npu.file[strlen(npu.file)-1]) == '/') ? "LIST" : "RETR", npu.file); sendFtpCommandOnly(sd, cmd); int sdata = netConnect(npu.host, parsePasvPort(rs->string)); dyStringFree(&rs); if (sdata < 0) { close(sd); return -1; } int secondsWaited = 0; while (TRUE) { if (secondsWaited >= 10) { warn("ftp server error on cmd=[%s] timed-out waiting for data or error", cmd); close(sd); close(sdata); return -1; } if (readReadyWait(sdata, NET_FTP_TIMEOUT)) break; // we have some data if (readReadyWait(sd, 0)) /* wait in microsec */ { // this can see an error like bad filename if (!receiveFtpReply(sd, cmd, NULL, NULL)) { close(sd); close(sdata); return -1; } } ++secondsWaited; } if (retCtrlSd != NULL) { *retCtrlSd = sd; return sdata; } else { /* Because some FTP servers will kill the data connection * as soon as the control connection closes, * we have to develop a workaround using a partner process. */ fflush(stdin); fflush(stdout); fflush(stderr); struct netConnectFtpParams *params; AllocVar(params); params->sd = sd; params->sdata = sdata; params->npu = npu; /* make a pipe (fds go in pipefd[0] and pipefd[1]) */ if (pipe(params->pipefd) != 0) errAbort("netGetOpenFtpSockets: failed to create pipe: %s", strerror(errno)); int rc; rc = pthread_create(¶ms->thread, NULL, sendFtpDataToPipeThread, (void *)params); if (rc) { errAbort("Unexpected error %d from pthread_create(): %s",rc,strerror(rc)); } return params->pipefd[0]; } } int connectNpu(struct netParsedUrl npu, char *url) /* Connect using NetParsedUrl. */ { int sd = -1; if (sameString(npu.protocol, "http")) { sd = netConnect(npu.host, atoi(npu.port)); } else if (sameString(npu.protocol, "https")) { sd = netConnectHttps(npu.host, atoi(npu.port)); } else { errAbort("netHttpConnect: url (%s) is not for http.", url); return -1; /* never gets here, fixes compiler complaint */ } return sd; } void setAuthorization(struct netParsedUrl npu, char *authHeader, struct dyString *dy) /* Set the specified authorization header with BASIC auth base64-encoded user and password */ { if (!sameString(npu.user,"")) { char up[256]; char *b64up = NULL; safef(up, sizeof(up), "%s:%s", npu.user, npu.password); b64up = base64Encode(up, strlen(up)); dyStringPrintf(dy, "%s: Basic %s\r\n", authHeader, b64up); freez(&b64up); } } int netHttpConnect(char *url, char *method, char *protocol, char *agent, char *optionalHeader) /* Parse URL, connect to associated server on port, and send most of * the request to the server. If specified in the url send user name * and password too. Typically the "method" will be "GET" or "POST" * and the agent will be the name of your program or * library. optionalHeader may be NULL or contain additional header * lines such as cookie info. * Proxy support via hg.conf httpProxy or env var http_proxy * Return data socket, or -1 if error.*/ { struct netParsedUrl npu; struct netParsedUrl pxy; struct dyString *dy = newDyString(512); int sd = -1; /* Parse the URL and connect. */ netParseUrl(url, &npu); char *proxyUrl = getenv("http_proxy"); if (proxyUrl) { netParseUrl(proxyUrl, &pxy); sd = connectNpu(pxy, url); } else { sd = connectNpu(npu, url); } if (sd < 0) return -1; /* Ask remote server for a file. */ char *urlForProxy = NULL; if (proxyUrl) { /* trim off the byterange part at the end of url because proxy does not understand it. */ urlForProxy = cloneString(url); char *x = strrchr(urlForProxy, ';'); if (x && startsWith(";byterange=", x)) *x = 0; } dyStringPrintf(dy, "%s %s %s\r\n", method, proxyUrl ? urlForProxy : npu.file, protocol); freeMem(urlForProxy); dyStringPrintf(dy, "User-Agent: %s\r\n", agent); /* do not need the 80 since it is the default */ if ((sameString(npu.protocol, "http" ) && sameString("80", npu.port)) || (sameString(npu.protocol, "https") && sameString("443",npu.port))) dyStringPrintf(dy, "Host: %s\r\n", npu.host); else dyStringPrintf(dy, "Host: %s:%s\r\n", npu.host, npu.port); setAuthorization(npu, "Authorization", dy); if (proxyUrl) setAuthorization(pxy, "Proxy-Authorization", dy); dyStringAppend(dy, "Accept: */*\r\n"); if (npu.byteRangeStart != -1) { if (npu.byteRangeEnd != -1) dyStringPrintf(dy, "Range: bytes=%lld-%lld\r\n" , (long long)npu.byteRangeStart , (long long)npu.byteRangeEnd); else dyStringPrintf(dy, "Range: bytes=%lld-\r\n" , (long long)npu.byteRangeStart); } if (optionalHeader) dyStringAppend(dy, optionalHeader); /* finish off the header with final blank line */ dyStringAppend(dy, "\r\n"); mustWriteFd(sd, dy->string, dy->stringSize); /* Clean up and return handle. */ dyStringFree(&dy); return sd; } int netOpenHttpExt(char *url, char *method, char *optionalHeader) /* Return a file handle that will read the url. optionalHeader * may by NULL or may contain cookies and other info. */ { return netHttpConnect(url, method, "HTTP/1.0", "genome.ucsc.edu/net.c", optionalHeader); } static int netGetOpenHttp(char *url) /* Return a file handle that will read the url. */ { return netOpenHttpExt(url, "GET", NULL); } int netUrlHeadExt(char *url, char *method, struct hash *hash) /* Go get head and return status. Return negative number if * can't get head. If hash is non-null, fill it with header * lines with upper cased keywords for case-insensitive lookup, * including hopefully CONTENT-TYPE: . */ { int sd = netOpenHttpExt(url, method, NULL); int status = EIO; if (sd >= 0) { char *line, *word; struct lineFile *lf = lineFileAttach(url, TRUE, sd); if (lineFileNext(lf, &line, NULL)) { if (startsWith("HTTP/", line)) { word = nextWord(&line); word = nextWord(&line); if (word != NULL && isdigit(word[0])) { status = atoi(word); if (hash != NULL) { while (lineFileNext(lf, &line, NULL)) { word = nextWord(&line); if (word == NULL) break; hashAdd(hash, strUpper(word), cloneString(skipLeadingSpaces(line))); } } } } } lineFileClose(&lf); } else status = errno; return status; } int netUrlHead(char *url, struct hash *hash) /* Go get head and return status. Return negative number if * can't get head. If hash is non-null, fill it with header * lines with upper cased keywords for case-insensitive lookup, * including hopefully CONTENT-TYPE: . */ { return netUrlHeadExt(url, "HEAD", hash); } long long netUrlSizeByRangeResponse(char *url) /* Use byteRange as a work-around alternate method to get file size (content-length). * Return negative number if can't get. */ { long long retVal = -1; char rangeUrl[2048]; safef(rangeUrl, sizeof(rangeUrl), "%s;byterange=0-0", url); struct hash *hash = newHash(0); int status = netUrlHeadExt(rangeUrl, "GET", hash); if (status == 206) { char *rangeString = hashFindValUpperCase(hash, "Content-Range:"); if (rangeString) { /* input pattern: Content-Range: bytes 0-99/2738262 */ char *slash = strchr(rangeString,'/'); if (slash) { retVal = atoll(slash+1); } } } hashFree(&hash); return retVal; } int netUrlOpenSockets(char *url, int *retCtrlSocket) /* Return socket descriptor (low-level file handle) for read()ing url data, * or -1 if error. * If retCtrlSocket is non-NULL and url is FTP, set *retCtrlSocket * to the FTP control socket which is left open for a persistent connection. * close(result) (and close(*retCtrlSocket) if applicable) when done. * If url is missing :// then it's just treated as a file. */ { if (stringIn("://", url) == NULL) return open(url, O_RDONLY); else { if (startsWith("http://",url) || startsWith("https://",url)) return netGetOpenHttp(url); else if (startsWith("ftp://",url)) return netGetOpenFtpSockets(url, retCtrlSocket); else errAbort("Sorry, can only netUrlOpen http, https and ftp currently, not '%s'", url); } return -1; } int netUrlOpen(char *url) /* Return socket descriptor (low-level file handle) for read()ing url data, * or -1 if error. Just close(result) when done. */ { return netUrlOpenSockets(url, NULL); } struct dyString *netSlurpFile(int sd) /* Slurp file into dynamic string and return. */ { char buf[4*1024]; int readSize; struct dyString *dy = newDyString(4*1024); /* Slurp file into dy and return. */ while ((readSize = read(sd, buf, sizeof(buf))) > 0) dyStringAppendN(dy, buf, readSize); return dy; } struct dyString *netSlurpUrl(char *url) /* Go grab all of URL and return it as dynamic string. */ { int sd = netUrlOpen(url); if (sd < 0) errAbort("netSlurpUrl: failed to open socket for [%s]", url); struct dyString *dy = netSlurpFile(sd); close(sd); return dy; } static void parseContentRange(char *x, ssize_t *rangeStart, ssize_t *rangeEnd) /* parse the content range information from response header value "bytes 763400000-763400112/763400113" */ { /* default to no byte range specified */ *rangeStart = -1; *rangeEnd = -1; if (startsWith("bytes ", x)) { char *y=strchr(x, ' '); ++y; char *z=strchr(y, '-'); if (z) { ++z; // TODO: use something better than atoll() ? *rangeStart = atoll(y); if (z[0] != '\0') *rangeEnd = atoll(z); } } } boolean netSkipHttpHeaderLinesWithRedirect(int sd, char *url, char **redirectedUrl) /* Skip http header lines. Return FALSE if there's a problem. * The input is a standard sd or fd descriptor. * This is meant to be able work even with a re-passable stream handle, * e.g. can pass it to the pipes routines, which means we can't * attach a linefile since filling its buffer reads in more than just the http header. * Handles 300, 301, 302, 303, 307 http redirects by setting *redirectedUrl to * the new location. */ { char buf[2000]; char *line = buf; int maxbuf = sizeof(buf); int i=0; char c = ' '; int nread = 0; char *sep = NULL; char *headerName = NULL; char *headerVal = NULL; boolean redirect = FALSE; boolean byteRangeUsed = (strstr(url,";byterange=") != NULL); ssize_t byteRangeStart = -1; ssize_t byteRangeEnd = -1; boolean foundContentRange = FALSE; ssize_t contentRangeStart = -1; ssize_t contentRangeEnd = -1; boolean mustUseProxy = FALSE; /* User must use proxy 305 error*/ char *proxyLocation = NULL; boolean mustUseProxyAuth = FALSE; /* User must use proxy authentication 407 error*/ if (byteRangeUsed) { parseByteRange(url, &byteRangeStart, &byteRangeEnd, FALSE); } while(TRUE) { i = 0; while (TRUE) { nread = read(sd, &c, 1); /* one char at a time, but http headers are small */ if (nread != 1) { if (nread == -1) warn("Error (%s) reading http header on %s", strerror(errno), url); else if (nread == 0) warn("Error unexpected end of input reading http header on %s", url); else warn("Error reading http header on %s", url); return FALSE; /* err reading descriptor */ } if (c == 10) break; if (c != 13) buf[i++] = c; if (i >= maxbuf) { warn("http header line too long > %d chars.",maxbuf); return FALSE; } } buf[i] = 0; /* add string terminator */ if (sameString(line,"")) { break; /* End of Header found */ } if (startsWith("HTTP/", line)) { char *code; nextWord(&line); code = nextWord(&line); if (code == NULL) { warn("Strange http header on %s", url); return FALSE; } if (startsWith("30", code) && isdigit(code[2]) && ((code[2] >= '0' && code[2] <= '3') || code[2] == '7') && code[3] == 0) { redirect = TRUE; } else if (sameString(code, "305")) { mustUseProxy = TRUE; } else if (sameString(code, "407")) { mustUseProxyAuth = TRUE; } else if (byteRangeUsed /* hack for Apache bug 2.2.20 and 2.2.21 2011-10-21 should be OK to remove after one year. */ && !(sameString(code, "200") && byteRangeStart == 0 && byteRangeEnd == -1)) { if (!sameString(code, "206")) { if (sameString(code, "200")) warn("Byte-range request was ignored by server. "); warn("Expected Partial Content 206. %s: %s %s", url, code, line); return FALSE; } } else if (sameString(code, "404")) { warn("404 file not found on %s", url); return FALSE; } else if (!sameString(code, "200")) { warn("Expected 200 %s: %s %s", url, code, line); return FALSE; } line = buf; /* restore it */ } headerName = line; sep = strchr(line,':'); if (sep) { *sep = 0; headerVal = skipLeadingSpaces(++sep); } else { headerVal = NULL; } if (sameWord(headerName,"Location")) { if (redirect) *redirectedUrl = cloneString(headerVal); if (mustUseProxy) proxyLocation = cloneString(headerVal); } if (sameWord(headerName,"Content-Range")) { if (byteRangeUsed) { foundContentRange = TRUE; parseContentRange(headerVal, &contentRangeStart, &contentRangeEnd); if ((contentRangeStart != byteRangeStart) || (byteRangeEnd != -1 && (contentRangeEnd != byteRangeEnd))) { char bre[256]; safef(bre, sizeof bre, "%lld", (long long)byteRangeEnd); if (byteRangeEnd == -1) bre[0] = 0; warn("Found Content-Range: %s. Expected bytes %lld-%s. Improper caching of 206 reponse byte-ranges?", headerVal, (long long) byteRangeStart, bre); return FALSE; } } } } if (mustUseProxy || mustUseProxyAuth) { warn("%s: %s error. Use Proxy%s. Location = %s", url, mustUseProxy ? "" : " Authentication", mustUseProxy ? "305" : "407", proxyLocation ? proxyLocation : "not given"); return FALSE; } if (byteRangeUsed && !foundContentRange /* hack for Apache bug 2.2.20 and 2.2.21 2011-10-21 should be OK to remove after one year. */ && !(byteRangeStart == 0 && byteRangeEnd == -1)) { char bre[256]; safef(bre, sizeof bre, "%lld", (long long)byteRangeEnd); if (byteRangeEnd == -1) bre[0] = 0; warn("Expected response header Content-Range: %lld-%s", (long long) byteRangeStart, bre); return FALSE; } return TRUE; } boolean netSkipHttpHeaderLinesHandlingRedirect(int sd, char *url, int *redirectedSd, char **redirectedUrl) /* Skip http headers lines, returning FALSE if there is a problem. Generally called as * netSkipHttpHeaderLine(sd, url, &sd, &url); * where sd is a socket (file) opened with netUrlOpen(url), and url is in dynamic memory. * If the http header indicates that the file has moved, then it will update the *redirectedSd and * *redirectedUrl with the new socket and URL, first closing sd. * If for some reason you want to detect whether the forwarding has occurred you could * call this as: * char *newUrl = NULL; * int newSd = 0; * netSkipHttpHeaderLine(sd, url, &newSd, &newUrl); * if (newUrl != NULL) * // Update sd with newSd, free url if appropriate and replace it with newUrl, etc. * // free newUrl when finished. * This routine handles up to 5 steps of redirection. * The logic to this routine is also complicated a little to make it work in a pipe, which means we * can't attach a lineFile since filling the lineFile buffer reads in more than just the http header. */ { int redirectCount = 0; while (TRUE) { /* url needed for err msgs, and to return redirect location */ char *newUrl = NULL; boolean success = netSkipHttpHeaderLinesWithRedirect(sd, url, &newUrl); if (success && !newUrl) /* success after 0 to 5 redirects */ { if (redirectCount > 0) { *redirectedSd = sd; *redirectedUrl = url; } else { *redirectedSd = -1; *redirectedUrl = NULL; } return TRUE; } close(sd); if (redirectCount > 0) freeMem(url); if (success) { /* we have a new url to try */ ++redirectCount; if (redirectCount > 5) { warn("code 30x redirects: exceeded limit of 5 redirects, %s", newUrl); success = FALSE; } else if (!startsWith("http://",newUrl) && !startsWith("https://",newUrl)) { warn("redirected to non-http(s): %s", newUrl); success = FALSE; } else { struct netParsedUrl npu, newNpu; /* Parse the old URL to make parts available for graft onto the redirected url. */ /* This makes redirection work with byterange urls and user:password@ */ netParseUrl(url, &npu); netParseUrl(newUrl, &newNpu); boolean updated = FALSE; if (npu.byteRangeStart != -1) { newNpu.byteRangeStart = npu.byteRangeStart; newNpu.byteRangeEnd = npu.byteRangeEnd; updated = TRUE; } if ((npu.user[0] != 0) && (newNpu.user[0] == 0)) { safecpy(newNpu.user, sizeof newNpu.user, npu.user); safecpy(newNpu.password, sizeof newNpu.password, npu.password); updated = TRUE; } if (updated) { freeMem(newUrl); newUrl = urlFromNetParsedUrl(&newNpu); } sd = netUrlOpen(newUrl); if (sd < 0) { warn("Couldn't open %s", newUrl); success = FALSE; } } } if (!success) { /* failure after 0 to 5 redirects */ if (redirectCount > 0) freeMem(newUrl); return FALSE; } url = newUrl; } return FALSE; } struct lineFile *netLineFileMayOpen(char *url) /* Return a lineFile attached to url. http skips header. * Supports some compression formats. Prints warning message, but * does not abort, just returning NULL if there's a problem. */ { int sd = netUrlOpen(url); if (sd < 0) { warn("Couldn't open %s", url); return NULL; } else { struct lineFile *lf = NULL; char *newUrl = NULL; int newSd = 0; if (startsWith("http://",url) || startsWith("https://",url)) { if (!netSkipHttpHeaderLinesHandlingRedirect(sd, url, &newSd, &newUrl)) { return NULL; } if (newUrl != NULL) { /* Update sd with newSd, replace it with newUrl, etc. */ sd = newSd; url = newUrl; } } char *urlDecoded = cloneString(url); cgiDecode(url, urlDecoded, strlen(url)); boolean isCompressed = (endsWith(urlDecoded,".gz") || endsWith(urlDecoded,".Z") || endsWith(urlDecoded,".bz2")); freeMem(urlDecoded); if (isCompressed) { lf = lineFileDecompressFd(url, TRUE, sd); /* url needed only for compress type determination */ } else { lf = lineFileAttach(url, TRUE, sd); } if (newUrl) freeMem(newUrl); return lf; } } int netUrlMustOpenPastHeader(char *url) /* Get socket descriptor for URL. Process header, handling any forwarding and * the like. Do errAbort if there's a problem, which includes anything but a 200 * return from http after forwarding. */ { int sd = netUrlOpen(url); if (sd < 0) noWarnAbort(); int newSd = 0; if (startsWith("http://",url) || startsWith("https://",url)) { char *newUrl = NULL; if (!netSkipHttpHeaderLinesHandlingRedirect(sd, url, &newSd, &newUrl)) noWarnAbort(); if (newUrl != NULL) { sd = newSd; freeMem(newUrl); } } return sd; } struct lineFile *netLineFileSilentOpen(char *url) /* Open a lineFile on a URL. Just return NULL without any user * visible warning message if there's a problem. */ { pushSilentWarnHandler(); struct lineFile *lf = netLineFileMayOpen(url); popWarnHandler(); return lf; } char *netReadTextFileIfExists(char *url) /* Read entire URL and return it as a string. URL should be text (embedded zeros will be * interpreted as end of string). If the url doesn't exist or has other problems, * returns NULL. */ { struct lineFile *lf = netLineFileSilentOpen(url); if (lf == NULL) return NULL; char *text = lineFileReadAll(lf); lineFileClose(&lf); return text; } struct lineFile *netLineFileOpen(char *url) /* Return a lineFile attached to url. This one * will skip any headers. Free this with * lineFileClose(). */ { struct lineFile *lf = netLineFileMayOpen(url); if (lf == NULL) noWarnAbort(); return lf; } boolean netSendString(int sd, char *s) /* Send a string down a socket - length byte first. */ { int length = strlen(s); UBYTE len; if (length > 255) errAbort("Trying to send a string longer than 255 bytes (%d bytes)", length); len = length; if (write(sd, &len, 1)<0) { warn("Couldn't send string to socket"); return FALSE; } if (write(sd, s, length)<0) { warn("Couldn't send string to socket"); return FALSE; } return TRUE; } boolean netSendLongString(int sd, char *s) /* Send a long string down socket: two bytes for length. */ { unsigned length = strlen(s); UBYTE b[2]; if (length >= 64*1024) { warn("Trying to send a string longer than 64k bytes (%d bytes)", length); return FALSE; } b[0] = (length>>8); b[1] = (length&0xff); if (write(sd, b, 2) < 0) { warn("Couldn't send long string to socket"); return FALSE; } if (write(sd, s, length)<0) { warn("Couldn't send long string to socket"); return FALSE; } return TRUE; } boolean netSendHugeString(int sd, char *s) /* Send a long string down socket: four bytes for length. */ { unsigned long length = strlen(s); unsigned long l = length; UBYTE b[4]; int i; for (i=3; i>=0; --i) { b[i] = l & 0xff; l >>= 8; } if (write(sd, b, 4) < 0) { warn("Couldn't send huge string to socket"); return FALSE; } if (write(sd, s, length) < 0) { warn("Couldn't send huge string to socket"); return FALSE; } return TRUE; } char *netGetString(int sd, char buf[256]) /* Read string into buf and return it. If buf is NULL * an internal buffer will be used. Print warning message * and return NULL if any problem. */ { static char sbuf[256]; UBYTE len = 0; int length; int sz; if (buf == NULL) buf = sbuf; sz = netReadAll(sd, &len, 1); if (sz == 0) return NULL; if (sz < 0) { warn("Couldn't read string length"); return NULL; } length = len; if (length > 0) if (netReadAll(sd, buf, length) < 0) { warn("Couldn't read string body"); return NULL; } buf[length] = 0; return buf; } char *netGetLongString(int sd) /* Read string and return it. freeMem * the result when done. */ { UBYTE b[2]; char *s = NULL; int length = 0; int sz; b[0] = b[1] = 0; sz = netReadAll(sd, b, 2); if (sz == 0) return NULL; if (sz < 0) { warn("Couldn't read long string length"); return NULL; } length = (b[0]<<8) + b[1]; s = needMem(length+1); if (length > 0) if (netReadAll(sd, s, length) < 0) { warn("Couldn't read long string body"); return NULL; } s[length] = 0; return s; } char *netGetHugeString(int sd) /* Read string and return it. freeMem * the result when done. */ { UBYTE b[4]; char *s = NULL; unsigned long length = 0; int sz, i; sz = netReadAll(sd, b, 4); if (sz == 0) return NULL; if (sz < 4) { warn("Couldn't read huge string length"); return NULL; } for (i=0; i<4; ++i) { length <<= 8; length += b[i]; } s = needMem(length+1); if (length > 0) { if (netReadAll(sd, s, length) < 0) { warn("Couldn't read huge string body"); return NULL; } } s[length] = 0; return s; } char *netRecieveString(int sd, char buf[256]) /* Read string into buf and return it. If buf is NULL * an internal buffer will be used. Abort if any problem. */ { char *s = netGetString(sd, buf); if (s == NULL) noWarnAbort(); return s; } char *netRecieveLongString(int sd) /* Read string and return it. freeMem * the result when done. Abort if any problem*/ { char *s = netGetLongString(sd); if (s == NULL) noWarnAbort(); return s; } char *netRecieveHugeString(int sd) /* Read string and return it. freeMem * the result when done. Abort if any problem*/ { char *s = netGetHugeString(sd); if (s == NULL) noWarnAbort(); return s; } struct lineFile *netHttpLineFileMayOpen(char *url, struct netParsedUrl **npu) /* Parse URL and open an HTTP socket for it but don't send a request yet. */ { int sd; struct lineFile *lf; /* Parse the URL and try to connect. */ AllocVar(*npu); netParseUrl(url, *npu); if (!sameString((*npu)->protocol, "http")) errAbort("netHttpLineFileMayOpen: url (%s) is not for http.", url); sd = netConnect((*npu)->host, atoi((*npu)->port)); if (sd < 0) return NULL; /* Return handle. */ lf = lineFileAttach(url, TRUE, sd); return lf; } /* netHttpLineFileMayOpen */ void netHttpGet(struct lineFile *lf, struct netParsedUrl *npu, boolean keepAlive) /* Send a GET request, possibly with Keep-Alive. */ { struct dyString *dy = newDyString(512); /* Ask remote server for the file/query. */ dyStringPrintf(dy, "GET %s HTTP/1.1\r\n", npu->file); dyStringPrintf(dy, "User-Agent: genome.ucsc.edu/net.c\r\n"); dyStringPrintf(dy, "Host: %s:%s\r\n", npu->host, npu->port); if (!sameString(npu->user,"")) { char up[256]; char *b64up = NULL; safef(up,sizeof(up), "%s:%s", npu->user, npu->password); b64up = base64Encode(up, strlen(up)); dyStringPrintf(dy, "Authorization: Basic %s\r\n", b64up); freez(&b64up); } dyStringAppend(dy, "Accept: */*\r\n"); if (keepAlive) { dyStringAppend(dy, "Connection: Keep-Alive\r\n"); dyStringAppend(dy, "Connection: Persist\r\n"); } else dyStringAppend(dy, "Connection: close\r\n"); dyStringAppend(dy, "\r\n"); mustWriteFd(lf->fd, dy->string, dy->stringSize); /* Clean up. */ dyStringFree(&dy); } /* netHttpGet */ int netHttpGetMultiple(char *url, struct slName *queries, void *userData, void (*responseCB)(void *userData, char *req, char *hdr, struct dyString *body)) /* Given an URL which is the base of all requests to be made, and a * linked list of queries to be appended to that base and sent in as * requests, send the requests as a batch and read the HTTP response * headers and bodies. If not all the requests get responses (i.e. if * the server is ignoring Keep-Alive or is imposing a limit), try again * until we can't connect or until all requests have been served. * For each HTTP response, do a callback. */ { struct slName *qStart; struct slName *qPtr; struct lineFile *lf; struct netParsedUrl *npu; struct dyString *dyQ = newDyString(512); struct dyString *body; char *base; char *hdr; int qCount; int qTotal; int numParseFailures; int contentLength; boolean chunked; boolean done; boolean keepAlive; /* Find out how many queries we'll need to do so we know how many times * it's OK to run into end of file in case server ignores Keep-Alive. */ qTotal = 0; for (qPtr = queries; qPtr != NULL; qPtr = qPtr->next) { qTotal++; } done = FALSE; qCount = 0; numParseFailures = 0; qStart = queries; while ((! done) && (qStart != NULL)) { lf = netHttpLineFileMayOpen(url, &npu); if (lf == NULL) { done = TRUE; break; } base = cloneString(npu->file); /* Send all remaining requests with keep-alive. */ for (qPtr = qStart; qPtr != NULL; qPtr = qPtr->next) { dyStringClear(dyQ); dyStringAppend(dyQ, base); dyStringAppend(dyQ, qPtr->name); strcpy(npu->file, dyQ->string); keepAlive = (qPtr->next == NULL) ? FALSE : TRUE; netHttpGet(lf, npu, keepAlive); } /* Get as many responses as we can; call responseCB() and * advance qStart for each. */ for (qPtr = qStart; qPtr != NULL; qPtr = qPtr->next) { if (lineFileParseHttpHeader(lf, &hdr, &chunked, &contentLength)) { body = lineFileSlurpHttpBody(lf, chunked, contentLength); dyStringClear(dyQ); dyStringAppend(dyQ, base); dyStringAppend(dyQ, qPtr->name); responseCB(userData, dyQ->string, hdr, body); qStart = qStart->next; qCount++; } else { if (numParseFailures++ > qTotal) { done = TRUE; } break; } } } return qCount; } /* netHttpMultipleQueries */ #endif boolean hasProtocol(char *urlOrPath) /* Return TRUE if it looks like it has http://, ftp:// etc. */ { return stringIn("://", urlOrPath) != NULL; } rtracklayer/src/ucsc/net.h0000644000175400017540000002576313556116552016634 0ustar00biocbuildbiocbuild/* Net.h some stuff to wrap around net communications. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef NET_H #define NET_H #include "linefile.h" #include "dystring.h" #define DEFAULTCONNECTTIMEOUTMSEC 10000 /* default connect timeout for tcp in milliseconds */ #define DEFAULTREADWRITETTIMEOUTSEC 120 /* default read/write timeout for tcp in seconds */ int setReadWriteTimeouts(int sd, int seconds); /* Set read and write timeouts on socket sd * Return -1 if there are any errors, 0 if successful. */ /* add a failure to connFailures[] * which can save time and avoid more timeouts */ int netConnect(char *hostName, int port); /* Start connection with a server having resolved port. Return < 0 if error. */ int netMustConnect(char *hostName, int port); /* Start connection with server or die. */ int netMustConnectTo(char *hostName, char *portName); /* Start connection with a server and a port that needs to be converted to integer */ int netAcceptingSocket(int port, int queueSize); /* Create a socket for to accept connections. */ int netAcceptingSocketFrom(int port, int queueSize, char *host); /* Create a socket that can accept connections from a * IP address on the current machine if the current machine * has multiple IP addresses. */ int netAccept(int sd); /* Accept incoming connection from socket descriptor. */ int netAcceptFrom(int sd, unsigned char subnet[4]); /* Wait for incoming connection from socket descriptor * from IP address in subnet. Subnet is something * returned from netParseDottedQuad. */ FILE *netFileFromSocket(int socket); /* Wrap a FILE around socket. This should be fclose'd * and separately the socket close'd. */ int netWaitForData(int sd, int microseconds); /* Wait for descriptor to have some data to read, up to given number of * microseconds. Returns amount of data there or zero if timed out. */ void netBlockBrokenPipes(); /* Make it so a broken pipe doesn't kill us. */ ssize_t netReadAll(int sd, void *vBuf, ssize_t size); /* Read given number of bytes into buffer. * Don't give up on first read! */ ssize_t netMustReadAll(int sd, void *vBuf, ssize_t size); /* Read given number of bytes into buffer or die. * Don't give up if first read is short! */ boolean netSendString(int sd, char *s); /* Send a string down a socket - length byte first. */ boolean netSendLongString(int sd, char *s); /* Send a string down a socket - up to 64k characters. */ boolean netSendHugeString(int sd, char *s); /* Send a string down a socket - up to 4G characters. */ char *netRecieveString(int sd, char buf[256]); /* Read string into buf and return it. If buf is NULL * an internal buffer will be used. Abort if any problem. */ char *netRecieveLongString(int sd); /* Read string up to 64k and return it. freeMem * the result when done. Abort if any problem*/ char *netRecieveHugeString(int sd); /* Read string up to 4G and return it. freeMem * the result when done. Abort if any problem*/ char *netGetString(int sd, char buf[256]); /* Read string into buf and return it. If buf is NULL * an internal buffer will be used. Print warning message * and return NULL if any problem. */ char *netGetLongString(int sd); /* Read string up to 64k and return it. freeMem * the result when done. Print warning message and * return NULL if any problem. */ char *netGetHugeString(int sd); /* Read string up to 4 gig and return it. freeMem * the result when done. Print warning message and * return NULL if any problem. */ void netCatchPipes(); /* Set up to catch broken pipe signals. */ boolean netPipeIsBroken(); /* Return TRUE if pipe is broken */ void netClearPipeFlag(); /* Clear broken pipe flag. */ void netParseSubnet(char *in, unsigned char out[4]); /* Parse subnet, which is a prefix of a normal dotted quad form. * Out will contain 255's for the don't care bits. */ struct netParsedUrl /* A parsed URL. */ { char protocol[16]; /* Protocol - http or ftp, etc. */ char user[128]; /* User name (optional) */ char password[128]; /* Password (optional) */ char host[128]; /* Name of host computer - www.yahoo.com, etc. */ char port[16]; /* Port, usually 80 or 8080. */ char file[1024]; /* Remote file name/query string, starts with '/' */ ssize_t byteRangeStart; /* Start of byte range, use -1 for none */ ssize_t byteRangeEnd; /* End of byte range use -1 for none */ }; void netParseUrl(char *url, struct netParsedUrl *parsed); /* Parse a URL into components. A full URL is made up as so: * http://user:password@hostName:port/file;byterange=0-499 * User and password may be cgi-encoded. * This is set up so that the http:// and the port are optional. */ char *urlFromNetParsedUrl(struct netParsedUrl *npu); /* Build URL from netParsedUrl structure */ int netUrlOpen(char *url); /* Return socket descriptor (low-level file handle) for read()ing url data, * or -1 if error. Just close(result) when done. Errors from this routine * from web urls are rare, because this just opens up enough to read header, * which may just say "file not found." Consider using netUrlMustOpenPastHeader * instead .*/ int netUrlMustOpenPastHeader(char *url); /* Get socket descriptor for URL. Process header, handling any forwarding and * the like. Do errAbort if there's a problem, which includes anything but a 200 * return from http after forwarding. */ int netUrlOpenSockets(char *url, int *retCtrlSocket); /* Return socket descriptor (low-level file handle) for read()ing url data, * or -1 if error. * If retCtrlSocket is non-NULL and url is FTP, set *retCtrlSocket * to the FTP control socket which is left open for a persistent connection. * close(result) (and close(*retCtrlSocket) if applicable) when done. */ struct hash; int netUrlHeadExt(char *url, char *method, struct hash *hash); /* Go get head and return status. Return negative number if * can't get head. If hash is non-null, fill it with header * lines with upper cased keywords for case-insensitive lookup, * including hopefully CONTENT-TYPE: . */ int netUrlHead(char *url, struct hash *hash); /* Go get head and return status. Return negative number if * can't get head. If hash is non-null, fill it with header * lines with upper cased keywords for case-insensitive lookup, * including hopefully CONTENT-TYPE: . */ long long netUrlSizeByRangeResponse(char *url); /* Use byteRange as a work-around alternate method to get file size (content-length). * Return negative number if can't get. */ struct lineFile *netLineFileOpen(char *url); /* Return a lineFile attached to url. This one * will skip any headers. Free this with * lineFileClose(). */ struct lineFile *netLineFileMayOpen(char *url); /* Same as netLineFileOpen, but warns and returns * null rather than aborting on problems. */ struct lineFile *netLineFileSilentOpen(char *url); /* Open a lineFile on a URL. Just return NULL without any user * visible warning message if there's a problem. */ struct dyString *netSlurpFile(int sd); /* Slurp file into dynamic string and return. Result will include http headers and * the like. */ struct dyString *netSlurpUrl(char *url); /* Go grab all of URL and return it as dynamic string. Result will include http headers * and the like. This will errAbort if there's a problem. */ char *netReadTextFileIfExists(char *url); /* Read entire URL and return it as a string. URL should be text (embedded zeros will be * interpreted as end of string). If the url doesn't exist or has other problems, * returns NULL. Does *not* include http headers. */ struct lineFile *netHttpLineFileMayOpen(char *url, struct netParsedUrl **npu); /* Parse URL and open an HTTP socket for it but don't send a request yet. */ void netHttpGet(struct lineFile *lf, struct netParsedUrl *npu, boolean keepAlive); /* Send a GET request, possibly with Keep-Alive. */ int netOpenHttpExt(char *url, char *method, char *optionalHeader); /* Return a file handle that will read the url. optionalHeader * may by NULL or may contain cookies and other info. */ int netHttpConnect(char *url, char *method, char *protocol, char *agent, char *optionalHeader); /* Parse URL, connect to associated server on port, and send most of * the request to the server. If specified in the url send user name * and password too. Typically the "method" will be "GET" or "POST" * and the agent will be the name of your program or * library. optionalHeader may be NULL or contain additional header * lines such as cookie info. * Proxy support via hg.conf httpProxy or env var http_proxy * Return data socket, or -1 if error.*/ int netHttpGetMultiple(char *url, struct slName *queries, void *userData, void (*responseCB)(void *userData, char *req, char *hdr, struct dyString *body)); /* Given an URL which is the base of all requests to be made, and a * linked list of queries to be appended to that base and sent in as * requests, send the requests as a batch and read the HTTP response * headers and bodies. If not all the requests get responses (i.e. if * the server is ignoring Keep-Alive or is imposing a limit), try again * until we can't connect or until all requests have been served. * For each HTTP response, do a callback. */ boolean netSkipHttpHeaderLinesWithRedirect(int sd, char *url, char **redirectedUrl); /* Skip http header lines. Return FALSE if there's a problem. * The input is a standard sd or fd descriptor. * This is meant to be able work even with a re-passable stream handle, * e.g. can pass it to the pipes routines, which means we can't * attach a linefile since filling its buffer reads in more than just the http header. * Handles 300, 301, 302, 303, 307 http redirects by setting *redirectedUrl to * the new location. */ boolean netSkipHttpHeaderLinesHandlingRedirect(int sd, char *url, int *redirectedSd, char **redirectedUrl); /* Skip http headers lines, returning FALSE if there is a problem. Generally called as * netSkipHttpHeaderLine(sd, url, &sd, &url); * where sd is a socket (file) opened with netUrlOpen(url), and url is in dynamic memory. * If the http header indicates that the file has moved, then it will update the *redirectedSd and * *redirectedUrl with the new socket and URL, first closing sd. * If for some reason you want to detect whether the forwarding has occurred you could * call this as: * char *newUrl = NULL; * int newSd = 0; * netSkipHttpHeaderLine(sd, url, &newSd, &newUrl); * if (newUrl != NULL) * // Update sd with newSd, free url if appropriate and replace it with newUrl, etc. * // free newUrl when finished. * This routine handles up to 5 steps of redirection. * The logic to this routine is also complicated a little to make it work in a pipe, which means we * can't attach a lineFile since filling the lineFile buffer reads in more than just the http header. */ boolean netGetFtpInfo(char *url, long long *retSize, time_t *retTime); /* Return date in UTC and size of ftp url file */ boolean hasProtocol(char *urlOrPath); /* Return TRUE if it looks like it has http://, ftp:// etc. */ #endif /* NET_H */ rtracklayer/src/ucsc/obscure.c0000644000175400017540000004411013556116552017466 0ustar00biocbuildbiocbuild/* Obscure stuff that is handy every now and again. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include "common.h" #include #include "portable.h" #include "localmem.h" #include "hash.h" #include "obscure.h" #include "linefile.h" static int _dotForUserMod = 100; /* How often does dotForUser() output a dot. */ long incCounterFile(char *fileName) /* Increment a 32 bit value on disk. */ { long val = 0; FILE *f = fopen(fileName, "r+b"); if (f != NULL) { mustReadOne(f, val); rewind(f); } else { f = fopen(fileName, "wb"); } ++val; if (f != NULL) { fwrite(&val, sizeof(val), 1, f); if (fclose(f) != 0) errnoAbort("fclose failed"); } return val; } int digitsBaseTwo(unsigned long x) /* Return base two # of digits. */ { int digits = 0; while (x) { digits += 1; x >>= 1; } return digits; } int digitsBaseTen(int x) /* Return number of digits base 10. */ { int digCount = 1; if (x < 0) { digCount = 2; x = -x; } while (x >= 10) { digCount += 1; x /= 10; } return digCount; } void writeGulp(char *file, char *buf, int size) /* Write out a bunch of memory. */ { FILE *f = mustOpen(file, "w"); mustWrite(f, buf, size); carefulClose(&f); } void readInGulp(char *fileName, char **retBuf, size_t *retSize) /* Read whole file in one big gulp. */ { size_t size = (size_t)fileSize(fileName); char *buf; FILE *f = mustOpen(fileName, "rb"); *retBuf = buf = needLargeMem(size+1); mustRead(f, buf, size); buf[size] = 0; /* Just in case it needs zero termination. */ fclose(f); if (retSize != NULL) *retSize = size; } void readAllWords(char *fileName, char ***retWords, int *retWordCount, char **retBuf) /* Read in whole file and break it into words. You need to freeMem both * *retWordCount and *retBuf when done. */ { int wordCount; char *buf = NULL; char **words = NULL; size_t bufSize; readInGulp(fileName, &buf, &bufSize); wordCount = chopByWhite(buf, NULL, 0); if (wordCount != 0) { words = needMem(wordCount * sizeof(words[0])); chopByWhite(buf, words, wordCount); } *retWords = words; *retWordCount = wordCount; *retBuf = buf; } int countWordsInFile(char *fileName) /* Count number of words in file. */ { struct lineFile *lf = lineFileOpen(fileName, TRUE); char *line; int wordCount = 0; while (lineFileNext(lf, &line, NULL)) wordCount += chopByWhite(line, NULL, 0); lineFileClose(&lf); return wordCount; } struct hash *hashWordsInFile(char *fileName, int hashSize) /* Create a hash of space delimited words in file. */ { struct hash *hash = newHash(hashSize); struct lineFile *lf = lineFileOpen(fileName, TRUE); char *line, *word; while (lineFileNext(lf, &line, NULL)) { while ((word = nextWord(&line)) != NULL) hashAdd(hash, word, NULL); } lineFileClose(&lf); return hash; } struct hash *hashNameIntFile(char *fileName) /* Given a two column file (name, integer value) return a * hash keyed by name with integer values */ { struct lineFile *lf = lineFileOpen(fileName, TRUE); char *row[2]; struct hash *hash = hashNew(16); while (lineFileRow(lf, row)) hashAddInt(hash, row[0], lineFileNeedNum(lf, row, 1)); lineFileClose(&lf); return hash; } struct hash *hashTwoColumnFile(char *fileName) /* Given a two column file (key, value) return a hash. */ { struct lineFile *lf = lineFileOpen(fileName, TRUE); char *row[2]; struct hash *hash = hashNew(16); while (lineFileRow(lf, row)) { char *name = row[0]; char *value = lmCloneString(hash->lm, row[1]); hashAdd(hash, name, value); } lineFileClose(&lf); return hash; } struct slName *readAllLines(char *fileName) /* Read all lines of file into a list. (Removes trailing carriage return.) */ { struct lineFile *lf = lineFileOpen(fileName, TRUE); struct slName *list = NULL, *el; char *line; while (lineFileNext(lf, &line, NULL)) { el = newSlName(line); slAddHead(&list, el); } lineFileClose(&lf); slReverse(&list); return list; } void copyFile(char *source, char *dest) /* Copy file from source to dest. */ { int bufSize = 64*1024; char *buf = needMem(bufSize); int bytesRead; int s, d; s = open(source, O_RDONLY); if (s < 0) errAbort("Couldn't open %s. %s\n", source, strerror(errno)); d = creat(dest, 0777); if (d < 0) { close(s); errAbort("Couldn't open %s. %s\n", dest, strerror(errno)); } while ((bytesRead = read(s, buf, bufSize)) > 0) { if (write(d, buf, bytesRead) < 0) errAbort("Write error on %s. %s\n", dest, strerror(errno)); } close(s); if (close(d) != 0) errnoAbort("close failed"); freeMem(buf); } void copyOpenFile(FILE *inFh, FILE *outFh) /* copy an open stdio file */ { int c; while ((c = fgetc(inFh)) != EOF) fputc(c, outFh); if (ferror(inFh)) errnoAbort("file read failed"); if (ferror(outFh)) errnoAbort("file write failed"); } void cpFile(int s, int d) /* Copy from source file to dest until reach end of file. */ { int bufSize = 64*1024, readSize; char *buf = needMem(bufSize); for (;;) { readSize = read(s, buf, bufSize); if (readSize > 0) mustWriteFd(d, buf, readSize); if (readSize <= 0) break; } freeMem(buf); } void *intToPt(int i) /* Convert integer to pointer. Use when really want to store an * int in a pointer field. */ { char *pt = NULL; return pt+i; } int ptToInt(void *pt) /* Convert pointer to integer. Use when really want to store a * pointer in an int. */ { char *a = NULL, *b = pt; return b - a; } void *sizetToPt(size_t i) /* Convert size_t to pointer. Use when really want to store a * size_t in a pointer. */ { char *pt = NULL; return pt+i; } size_t ptToSizet(void *pt) /* Convert pointer to size_t. Use when really want to store a * pointer in a size_t. */ { char *a = NULL, *b = pt; return b - a; } boolean parseQuotedStringNoEscapes( char *in, char *out, char **retNext) /* Read quoted string from in (which should begin with first quote). * Write unquoted string to out, which may be the same as in. * Return pointer to character past end of string in *retNext. * Return FALSE if can't find end. * Unlike parseQuotedString() do not treat backslash as an escape * character, merely pass it on through. */ { char c, *s = in; int quoteChar = *s++; for (;;) { c = *s++; if (c == 0) { warn("Unmatched %c", quoteChar); return FALSE; } else if (c == quoteChar) break; else *out++ = c; } *out = 0; if (retNext != NULL) *retNext = s; return TRUE; } boolean parseQuotedString( char *in, char *out, char **retNext) /* Read quoted string from in (which should begin with first quote). * Write unquoted string to out, which may be the same as in. * Return pointer to character past end of string in *retNext. * Return FALSE if can't find end. */ { char c, *s = in; int quoteChar = *s++; boolean escaped = FALSE; for (;;) { c = *s++; if (c == 0) { warn("Unmatched %c", quoteChar); return FALSE; } if (escaped) { if (c == '\\' || c == quoteChar) *out++ = c; else { *out++ = '\\'; *out++ = c; } escaped = FALSE; } else { if (c == '\\') escaped = TRUE; else if (c == quoteChar) break; else *out++ = c; } } *out = 0; if (retNext != NULL) *retNext = s; return TRUE; } char *nextQuotedWord(char **pLine) /* Generalization of nextWord. Returns next quoted * string or if no quotes next word. Updates *pLine * to point past word that is returned. Does not return * quotes. */ { char *line, c; line = skipLeadingSpaces(*pLine); if (line == NULL || line[0] == 0) return NULL; c = *line; if (c == '"' || c == '\'') { if (!parseQuotedString(line, line, pLine)) return NULL; return line; } else { return nextWord(pLine); } } void escCopy(char *in, char *out, char toEscape, char escape) /* Copy in to out, escaping as needed. Out better be big enough. * (Worst case is strlen(in)*2 + 1.) */ { char c; for (;;) { c = *in++; if (c == toEscape) *out++ = escape; *out++ = c; if (c == 0) break; } } char *makeEscapedString(char *in, char toEscape) /* Return string that is a copy of in, but with all * toEscape characters preceded by '\' * When done freeMem result. */ { int newSize = strlen(in) + countChars(in, toEscape); char *out = needMem(newSize+1); escCopy(in, out, toEscape, '\\'); return out; } char *makeQuotedString(char *in, char quoteChar) /* Create a string surrounded by quoteChar, with internal * quoteChars escaped. freeMem result when done. */ { int newSize = 2 + strlen(in) + countChars(in, quoteChar); char *out = needMem(newSize+1); out[0] = quoteChar; escCopy(in, out+1, quoteChar, '\\'); out[newSize-1] = quoteChar; return out; } struct hash *hashThisEqThatLine(char *line, int lineIx, boolean firstStartsWithLetter) /* Return a symbol table from a line of form: * 1-this1=val1 2-this='quoted val2' var3="another val" * If firstStartsWithLetter is true, then the left side of the equals must start with * a letter. */ { char *dupe = cloneString(line); char *s = dupe, c; char *var, *val; struct hash *hash = newHash(8); for (;;) { if ((var = skipLeadingSpaces(s)) == NULL) break; if ((c = *var) == 0) break; if (firstStartsWithLetter && !isalpha(c)) errAbort("line %d of custom input: variable needs to start with letter '%s'", lineIx, var); val = strchr(var, '='); if (val == NULL) { errAbort("line %d of var %s in custom input: %s \n missing = in var/val pair", lineIx, var, line); } *val++ = 0; c = *val; if (c == '\'' || c == '"') { if (!parseQuotedString(val, val, &s)) errAbort("line %d of input: missing closing %c", lineIx, c); } else { s = skipToSpaces(val); if (s != NULL) *s++ = 0; } hashAdd(hash, var, cloneString(val)); } freez(&dupe); return hash; } struct hash *hashVarLine(char *line, int lineIx) /* Return a symbol table from a line of form: * var1=val1 var2='quoted val2' var3="another val" */ { return hashThisEqThatLine(line, lineIx, TRUE); } struct slName *stringToSlNames(char *string) /* Convert string to a list of slNames separated by * white space, but allowing multiple words in quotes. * Quotes if any are stripped. */ { struct slName *list = NULL, *name; char *dupe = cloneString(string); char c, *s = dupe, *e; for (;;) { if ((s = skipLeadingSpaces(s)) == NULL) break; if ((c = *s) == 0) break; if (c == '\'' || c == '"') { if (!parseQuotedString(s, s, &e)) errAbort("missing closing %c in %s", c, string); } else { e = skipToSpaces(s); if (e != NULL) *e++ = 0; } name = slNameNew(s); slAddHead(&list, name); s = e; } freeMem(dupe); slReverse(&list); return list; } struct slName *charSepToSlNames(char *string, char c) /* Convert character-separated list of items to slName list. * Note that the last occurence of c is optional. (That * is for a comma-separated list a,b,c and a,b,c, are * equivalent. */ { struct slName *list = NULL, *el; char *s, *e; s = string; while (s != NULL && s[0] != 0) { e = strchr(s, c); if (e == NULL) { el = slNameNew(s); slAddHead(&list, el); break; } else { el = slNameNewN(s, e - s); slAddHead(&list, el); s = e+1; } } slReverse(&list); return list; } struct slName *commaSepToSlNames(char *commaSep) /* Convert comma-separated list of items to slName list. */ { return charSepToSlNames(commaSep, ','); } void sprintLongWithCommas(char *s, long long l) /* Print out a long number with commas a thousands, millions, etc. */ { long long trillions, billions, millions, thousands; if (l >= 1000000000000LL) { trillions = l/1000000000000LL; l -= trillions * 1000000000000LL; billions = l/1000000000; l -= billions * 1000000000; millions = l/1000000; l -= millions * 1000000; thousands = l/1000; l -= thousands * 1000; sprintf(s, "%lld,%03lld,%03lld,%03lld,%03lld", trillions, billions, millions, thousands, l); } else if (l >= 1000000000) { billions = l/1000000000; l -= billions * 1000000000; millions = l/1000000; l -= millions * 1000000; thousands = l/1000; l -= thousands * 1000; sprintf(s, "%lld,%03lld,%03lld,%03lld", billions, millions, thousands, l); } else if (l >= 1000000) { millions = l/1000000; l -= millions * (long long)1000000; thousands = l/1000; l -= thousands * 1000; sprintf(s, "%lld,%03lld,%03lld", millions, thousands, l); } else if (l >= 1000) { thousands = l/1000; l -= thousands * 1000; sprintf(s, "%lld,%03lld", thousands, l); } else sprintf(s, "%lld", l); } void printLongWithCommas(FILE *f, long long l) /* Print out a long number with commas at thousands, millions, etc. */ { char ascii[32]; sprintLongWithCommas(ascii, l); fprintf(f, "%s", ascii); } void sprintWithGreekByte(char *s, int slength, long long size) /* Numbers formatted with PB, TB, GB, MB, KB, B */ { char *greek[] = {"B", "KB", "MB", "GB", "TB", "PB"}; int i = 0; long long d = 1; while ((size/d) >= 1024) { ++i; d *= 1024; } double result = ((double)size)/d; if (result < 10) safef(s,slength,"%3.1f %s",((double)size)/d, greek[i]); else safef(s,slength,"%3.0f %s",((double)size)/d, greek[i]); } void shuffleArrayOfChars(char *array, int arraySize) /* Shuffle array of characters of given size given number of times. */ { char c; int i, randIx; /* Randomly permute an array using the method from Cormen, et al */ for (i=0; i 1) { struct slList *el; struct slList **array; int i; array = needLargeMem(count * sizeof(*array)); for (el = list, i=0; el != NULL; el = el->next, i++) array[i] = el; for (i=0; i<4; ++i) shuffleArrayOfPointers(array, count); list = NULL; for (i=0; inext = list; list = array[i]; } freeMem(array); slReverse(&list); *pL = list; } } void *slListRandomReduce(void *list, double reduceRatio) /* Reduce list to approximately reduceRatio times original size. Destroys original list. */ { if (reduceRatio >= 1.0) return list; int threshold = RAND_MAX * reduceRatio; struct slList *newList = NULL, *next, *el; for (el = list; el != NULL; el = next) { next = el->next; if (rand() <= threshold) { slAddHead(&newList, el); } } return newList; } void *slListRandomSample(void *list, int maxCount) /* Return a sublist of list with at most maxCount. Destroy list in process */ { if (list == NULL) return list; int initialCount = slCount(list); if (initialCount <= maxCount) return list; double reduceRatio = (double)maxCount/initialCount; if (reduceRatio < 0.9) { double conservativeReduceRatio = reduceRatio * 1.05; list = slListRandomReduce(list, conservativeReduceRatio); } int midCount = slCount(list); if (midCount <= maxCount) return list; shuffleList(list); struct slList *lastEl = slElementFromIx(list, maxCount-1); lastEl->next = NULL; return list; } char *stripCommas(char *position) /* make a new string with commas stripped out */ { char *newPos = cloneString(position); char *nPtr = newPos; if (position == NULL) return NULL; while((*nPtr = *position++)) if (*nPtr != ',') nPtr++; return newPos; } void dotForUserInit(int dotMod) /* Set how often dotForUser() outputs a dot. */ { assert(dotMod > 0); _dotForUserMod = dotMod; } void dotForUser() /* Write out a dot every _dotForUserMod times this is called. */ { static int dot = -10; /* Check to see if dot has been initialized. */ if(dot == - 10) dot = _dotForUserMod; if (--dot <= 0) { putc('.', stderr); fflush(stderr); dot = _dotForUserMod; } } void spaceToUnderbar(char *s) /* Convert white space to underbar. */ { char c; while ((c = *s) != 0) { if (isspace(c)) *s = '_'; ++s; } } void printVmPeak() /* print to stderr peak Vm memory usage (if /proc/ business exists) */ { pid_t pid = getpid(); char temp[256]; safef(temp, sizeof(temp), "/proc/%d/status", (int) pid); struct lineFile *lf = lineFileMayOpen(temp, TRUE); if (lf) { char *line; while (lineFileNextReal(lf, &line)) { if (stringIn("VmPeak", line)) { fprintf(stderr, "# pid=%d: %s\n", pid, line); break; } } lineFileClose(&lf); } else fprintf(stderr, "# printVmPeak: %s - not available\n", temp); fflush(stderr); } boolean nameInCommaList(char *name, char *commaList) /* Return TRUE if name is in comma separated list. */ { if (commaList == NULL) return FALSE; int nameLen = strlen(name); for (;;) { char c = *commaList; if (c == 0) return FALSE; if (memcmp(name, commaList, nameLen) == 0) { c = commaList[nameLen]; if (c == 0 || c == ',') return TRUE; } commaList = strchr(commaList, ','); if (commaList == NULL) return FALSE; commaList += 1; } } rtracklayer/src/ucsc/obscure.h0000644000175400017540000001522513556116552017500 0ustar00biocbuildbiocbuild/* Obscure.h - stuff that's relatively rarely used * but still handy. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef OBSCURE_H #define OBSCURE_H long incCounterFile(char *fileName); /* Increment a 32 bit value on disk. */ int digitsBaseTwo(unsigned long x); /* Return base two # of digits. */ int digitsBaseTen(int x); /* Return number of digits base 10. */ void sprintLongWithCommas(char *s, long long l); /* Print out a long number with commas a thousands, millions, etc. */ void printLongWithCommas(FILE *f, long long l); /* Print out a long number with commas a thousands, millions, etc. */ void sprintWithGreekByte(char *s, int slength, long long size); /* Numbers formatted with PB, TB, GB, MB, KB, B */ void writeGulp(char *file, char *buf, int size); /* Write out a bunch of memory. */ void readInGulp(char *fileName, char **retBuf, size_t *retSize); /* Read whole file in one big gulp. */ void readAllWords(char *fileName, char ***retWords, int *retWordCount, char **retBuf); /* Read in whole file and break it into words. You need to freeMem both * *retWordCount and *retBuf when done. */ int countWordsInFile(char *fileName); /* Count number of words in file. */ struct slName *readAllLines(char *fileName); /* Read all lines of file into a list. (Removes trailing carriage return.) */ void copyFile(char *source, char *dest); /* Copy file from source to dest. */ void copyOpenFile(FILE *inFh, FILE *outFh); /* copy an open stdio file */ void cpFile(int s, int d); /* Copy from source file to dest until reach end of file. */ void *intToPt(int i); /* Convert integer to pointer. Use when really want to store an * int in a pointer field. */ int ptToInt(void *pt); /* Convert pointer to integer. Use when really want to store a * pointer in an int. */ void *sizetToPt(size_t i); /* Convert size_t to pointer. Use when really want to store a * size_t in a pointer. */ size_t ptToSizet(void *pt); /* Convert pointer to size_t. Use when really want to store a * pointer in a size_t. */ boolean parseQuotedStringNoEscapes( char *in, char *out, char **retNext); /* Read quoted string from in (which should begin with first quote). * Write unquoted string to out, which may be the same as in. * Return pointer to character past end of string in *retNext. * Return FALSE if can't find end. * Unlike parseQuotedString() do not treat backslash as an escape * character, merely pass it on through. */ boolean parseQuotedString( char *in, char *out, char **retNext); /* Read quoted string from in (which should begin with first quote). * Write unquoted string to out, which may be the same as in. * Return pointer to character past end of string in *retNext. * Return FALSE if can't find end. */ char *nextQuotedWord(char **pLine); /* Generalization of nextWord. Returns next quoted * string or if no quotes next word. Updates *pLine * to point past word that is returned. Does not return * quotes. */ char *makeQuotedString(char *in, char quoteChar); /* Create a string surrounded by quoteChar, with internal * quoteChars escaped. freeMem result when done. */ char *makeEscapedString(char *in, char toEscape); /* Return string that is a copy of in, but with all * toEscape characters preceded by '\' * When done freeMem result. */ void escCopy(char *in, char *out, char toEscape, char escape); /* Copy in to out, escaping as needed. Out better be big enough. * (Worst case is strlen(in)*2 + 1.) */ struct slName *stringToSlNames(char *string); /* Convert string to a list of slNames separated by * white space, but allowing multiple words in quotes. * Quotes if any are stripped. */ struct slName *commaSepToSlNames(char *commaSep); /* Convert comma-separated list of items to slName list. */ struct slName *charSepToSlNames(char *string, char c); /* Convert character-separated list of items to slName list. * Note that the last occurence of c is optional. (That * is for a comma-separated list a,b,c and a,b,c, are * equivalent. */ struct hash *hashVarLine(char *line, int lineIx); /* Return a symbol table from a line of form: * var1=val1 var2='quoted val2' var3="another val" */ struct hash *hashThisEqThatLine(char *line, int lineIx, boolean firstStartsWithLetter); /* Return a symbol table from a line of form: * 1-this1=val1 2-this='quoted val2' var3="another val" * If firstStartsWithLetter is true, then the left side of the equals must start with * and equals. */ struct hash *hashWordsInFile(char *fileName, int hashSize); /* Create a hash of space delimited words in file. * hashSize is as in hashNew() - pass 0 for default. */ struct hash *hashNameIntFile(char *fileName); /* Given a two column file (name, integer value) return a * hash keyed by name with integer values */ struct hash *hashTwoColumnFile(char *fileName); /* Given a two column file (key, value) return a hash. */ void shuffleArrayOfChars(char *array, int arraySize); /* Shuffle array of characters of given size given number of times. */ void shuffleArrayOfInts(int *array, int arraySize); /* Shuffle array of ints of given size given number of times. */ void shuffleArrayOfPointers(void *pointerArray, int arraySize); /* Shuffle array of pointers of given size given number of times. */ void shuffleList(void *pList); /* Randomize order of slList. Usage: * shuffleList(&list) * where list is a pointer to a structure that * begins with a next field. */ void *slListRandomReduce(void *list, double reduceRatio); /* Reduce list to approximately reduceRatio times original size. Destroys original list. */ void *slListRandomSample(void *list, int maxCount); /* Return a sublist of list with at most maxCount. Destroy list in process */ char *stripCommas(char *position); /* make a new string with commas stripped out */ void dotForUserInit(int dotMod); /* Set how often dotForUser() outputs a dot. */ void dotForUser(); /* Write out a dot every _dotForUserMod times this is called. */ void spaceToUnderbar(char *s); /* Convert white space to underbar. */ void rangeRoundUp(double start, double end, double *retStart, double *retEnd); /* Round start and end so that they cover a slightly bigger range, but with more round * numbers. For instance 0.23:9.89 becomes 0:10 */ void rangeFromMinMaxMeanStd(double minVal, double maxVal, double mean, double std, double *retStart, double *retEnd); /* Given some basic statistical properties, set a range that will be good on a wide * range of biological data. */ void printVmPeak(); /* print to stderr peak Vm memory usage (if /proc/ business exists) */ boolean nameInCommaList(char *name, char *commaList); /* Return TRUE if name is in comma separated list. */ #endif /* OBSCURE_H */ rtracklayer/src/ucsc/options.h0000644000175400017540000000733613556116552017535 0ustar00biocbuildbiocbuild/* Stuff to process options out of command line. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef OPTIONS_H #define OPTIONS_H #include "common.h" /* Types for options */ #define OPTION_BOOLEAN 0x01 #define OPTION_STRING 0x02 #define OPTION_INT 0x04 #define OPTION_FLOAT 0x10 #define OPTION_LONG_LONG 0x20 #define OPTION_MULTI 0x40 #define OPTION_DOUBLE 0x80 /* Mask for option types (excluding OPTION_MULTI) */ #define OPTION_TYPE_MASK (OPTION_BOOLEAN|OPTION_STRING|OPTION_INT|OPTION_FLOAT|OPTION_LONG_LONG|OPTION_DOUBLE) struct optionSpec /* Specification of a single option. An array of these are passed * to optionInit() to validate options. */ { char *name; /* option name */ unsigned flags; /* Flags for option, specifies types */ }; char *optionVal(char *name, char *defaultVal); /* Return named option if in options hash, otherwise default. */ int optionInt(char *name, int defaultVal); /* Return integer value of named option, or default value * if not set. */ long long optionLongLong(char *name, long long defaultVal); /* Return long long value of named option, or default value * if not set. */ float optionFloat(char *name, float defaultVal); /* Return floating point value or default value if not set. */ struct slName *optionMultiVal(char *name, struct slName *defaultVal); /* Returns a list of the values assocated with a named option if in options hash, otherwise default. */ double optionDouble(char *name, double defaultVal); /* Return double value or default value if not set */ boolean optionExists(char *name); /* Return TRUE if option has been set. */ void optionMustExist(char *name); /* Abort if option has not been set. */ void optionInit(int *pArgc, char *argv[], struct optionSpec *optionSpecs); /* Read options in command line into options hash. * Options come in three forms: * -option words starting with dash * option=val words with = in the middle * -option=val combining the two. * The resulting hash will be keyed by the option name with the val * string for value. For '-option' types the value is 'on'. * The words in argv are parsed in assending order. If a word of * "--" is encountered, argument parsing stops. * If optionSpecs is not NULL, it is an array of optionSpec that are * used to validate the options. An option must exist in the array * and the value must be convertable to the type specified in flags. * Boolean options have must no value, all other options must have one. * Array is terminated by a optionSpec with a NULL name. * If array NULL, no validation is done. */ void optionHash(int *pArgc, char *argv[]); /* Read options in command line into options hash. * Options come in three forms: * -option words starting with dash * option=val words with = in the middle * -option=val combining the two. * The resulting hash will be keyed by the option name with the val * string for value. For '-option' types the value is 'on'. * The words in argv are parsed in assending order. If a word of * "--" is encountered, argument parsing stops. */ void optionHashSome(int *pArgc, char *argv[], boolean justFirst); /* Set up option hash from command line, optionally only adding * up to first non-optional word. */ struct hash *optionParseIntoHash(int *pArgc, char *argv[], boolean justFirst); /* Read options in argc/argv into a hash of your own choosing. */ struct hash *optionParseIntoHashExceptNumbers(int *pArgc, char *argv[], boolean justFirst); /* Read options in argc/argv into a hash (except negative numbers) of your own choosing. */ void optionFree(); /* free the option hash */ #endif /* OPTIONS_H */ rtracklayer/src/ucsc/os.c0000644000175400017540000000017413556116552016447 0ustar00biocbuildbiocbuild/* Added by rtracklayer to condition on the platform */ #ifdef WIN32 #include "oswin9x.c" #else #include "osunix.c" #endif rtracklayer/src/ucsc/osunix.c0000644000175400017540000004047413556116552017362 0ustar00biocbuildbiocbuild/* Some wrappers around operating-system specific stuff. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include "common.h" #include #include #include #include #include #include #include "portable.h" #include "portimpl.h" #include "_portimpl.h" #include #include #include off_t fileSize(char *pathname) /* get file size for pathname. return -1 if not found */ { struct stat mystat; ZeroVar(&mystat); if (stat(pathname,&mystat)==-1) { return -1; } return mystat.st_size; } long long freeSpaceOnFileSystem(char *path) /* Given a path to a file or directory on a file system, return free space * in bytes. */ { struct statvfs fi; int err = statvfs(path,&fi); if (err < 0) errnoAbort("freeSpaceOnFileSystem could not statvfs"); return (long long)fi.f_bsize * fi.f_bavail; } long clock1000() /* A millisecond clock. */ { struct timeval tv; static long origSec; gettimeofday(&tv, NULL); if (origSec == 0) origSec = tv.tv_sec; return (tv.tv_sec-origSec)*1000 + tv.tv_usec / 1000; } void sleep1000(int milli) /* Sleep for given number of 1000ths of second */ { if (milli > 0) { struct timeval tv; tv.tv_sec = milli/1000; tv.tv_usec = (milli%1000)*1000; select(0, NULL, NULL, NULL, &tv); } } long clock1() /* A seconds clock. */ { struct timeval tv; gettimeofday(&tv, NULL); return tv.tv_sec; } void uglyfBreak() /* Go into debugger. */ { static char *nullPt = NULL; nullPt[0] = 0; } char *getCurrentDir() /* Return current directory. Abort if it fails. */ { static char dir[PATH_LEN]; if (getcwd( dir, sizeof(dir) ) == NULL ) errnoAbort("getCurrentDir: can't get current directory"); return dir; } void setCurrentDir(char *newDir) /* Set current directory. Abort if it fails. */ { if (chdir(newDir) != 0) errnoAbort("setCurrentDir: can't to set current directory: %s", newDir); } boolean maybeSetCurrentDir(char *newDir) /* Change directory, return FALSE (and set errno) if fail. */ { return chdir(newDir) == 0; } struct slName *listDir(char *dir, char *pattern) /* Return an alphabetized list of all files that match * the wildcard pattern in directory. */ { struct slName *list = NULL, *name; struct dirent *de; DIR *d; if ((d = opendir(dir)) == NULL) return NULL; while ((de = readdir(d)) != NULL) { char *fileName = de->d_name; if (differentString(fileName, ".") && differentString(fileName, "..")) { if (pattern == NULL || wildMatch(pattern, fileName)) { name = newSlName(fileName); slAddHead(&list, name); } } } closedir(d); slNameSort(&list); return list; } struct slName *listDirRegEx(char *dir, char *regEx, int flags) /* Return an alphabetized list of all files that match * the regular expression pattern in directory. * See REGCOMP(3) for flags (e.g. REG_ICASE) */ { struct slName *list = NULL, *name; struct dirent *de; DIR *d; regex_t re; int err = regcomp(&re, regEx, flags | REG_NOSUB); if(err) errAbort("regcomp failed; err: %d", err); if ((d = opendir(dir)) == NULL) return NULL; while ((de = readdir(d)) != NULL) { char *fileName = de->d_name; if (differentString(fileName, ".") && differentString(fileName, "..")) { if (!regexec(&re, fileName, 0, NULL, 0)) { name = newSlName(fileName); slAddHead(&list, name); } } } closedir(d); regfree(&re); slNameSort(&list); return list; } boolean makeDir(char *dirName) /* Make dir. Returns TRUE on success. Returns FALSE * if failed because directory exists. Prints error * message and aborts on other error. */ { int err; if ((err = mkdir(dirName, 0777)) < 0) { if (errno != EEXIST) { perror(""); errAbort("Couldn't make directory %s", dirName); } return FALSE; } return TRUE; } struct fileInfo *listDirXExt(char *dir, char *pattern, boolean fullPath, boolean ignoreStatFailures) /* Return list of files matching wildcard pattern with * extra info. If full path is true then the path will be * included in the name of each file. */ { struct fileInfo *list = NULL, *el; struct dirent *de; DIR *d; int dirNameSize = strlen(dir); int fileNameOffset = dirNameSize+1; char pathName[512]; if ((d = opendir(dir)) == NULL) return NULL; memcpy(pathName, dir, dirNameSize); pathName[dirNameSize] = '/'; while ((de = readdir(d)) != NULL) { char *fileName = de->d_name; if (differentString(fileName, ".") && differentString(fileName, "..")) { if (pattern == NULL || wildMatch(pattern, fileName)) { struct stat st; bool isDir = FALSE; int statErrno = 0; strcpy(pathName+fileNameOffset, fileName); if (stat(pathName, &st) < 0) { if (ignoreStatFailures) statErrno = errno; else errAbort("stat failed in listDirX"); } if (S_ISDIR(st.st_mode)) isDir = TRUE; if (fullPath) fileName = pathName; el = newFileInfo(fileName, st.st_size, isDir, statErrno, st.st_atime); slAddHead(&list, el); } } } closedir(d); slSort(&list, cmpFileInfo); return list; } struct fileInfo *listDirX(char *dir, char *pattern, boolean fullPath) /* Return list of files matching wildcard pattern with * extra info. If full path is true then the path will be * included in the name of each file. */ { return listDirXExt(dir, pattern, fullPath, FALSE); } time_t fileModTime(char *pathName) /* Return file last modification time. The units of * these may vary from OS to OS, but you can depend on * later files having a larger time. */ { struct stat st; if (stat(pathName, &st) < 0) errAbort("stat failed in fileModTime: %s", pathName); return st.st_mtime; } char *getHost() /* Return host name. */ { static char *hostName = NULL; static char buf[128]; if (hostName == NULL) { hostName = getenv("HTTP_HOST"); if (hostName == NULL) { hostName = getenv("HOST"); if (hostName == NULL) { if (hostName == NULL) { static struct utsname unamebuf; if (uname(&unamebuf) >= 0) hostName = unamebuf.nodename; else hostName = "unknown"; } } } strncpy(buf, hostName, sizeof(buf)); chopSuffix(buf); hostName = buf; } return hostName; } char *mysqlHost() /* Return host computer on network for mySQL database. */ { boolean gotIt = FALSE; static char *host = NULL; if (!gotIt) { static char hostBuf[128]; gotIt = TRUE; if (fileExists("mysqlHost")) { return (host = firstWordInFile("mysqlHost", hostBuf, sizeof(hostBuf))); } else return (host = getenv("MYSQLHOST")); } return host; } char *semiUniqName(char *base) /* Figure out a name likely to be unique. * Name will have no periods. Returns a static * buffer, so best to clone result unless using * immediately. */ { int pid = getpid(); int num = time(NULL)&0xFFFFF; char host[512]; strcpy(host, getHost()); char *s = strchr(host, '.'); if (s != NULL) *s = 0; subChar(host, '-', '_'); subChar(host, ':', '_'); static char name[PATH_LEN]; safef(name, sizeof(name), "%s_%s_%x_%x", base, host, pid, num); return name; } char *rTempName(char *dir, char *base, char *suffix) /* Make a temp name that's almost certainly unique. */ { char *x; static char fileName[PATH_LEN]; int i; char *lastSlash = (lastChar(dir) == '/' ? "" : "/"); for (i=0;;++i) { x = semiUniqName(base); safef(fileName, sizeof(fileName), "%s%s%s%d%s", dir, lastSlash, x, i, suffix); if (!fileExists(fileName)) break; } return fileName; } void mustRename(char *oldName, char *newName) /* Rename file or die trying. */ { int err = rename(oldName, newName); if (err < 0) errnoAbort("Couldn't rename %s to %s", oldName, newName); } void mustRemove(char *path) /* Remove file or die trying */ { int err = remove(path); if (err < 0) errnoAbort("Couldn't remove %s", path); } static void eatSlashSlashInPath(char *path) /* Convert multiple // to single // */ { char *s, *d; s = d = path; char c, lastC = 0; while ((c = *s++) != 0) { if (c == '/' && lastC == c) continue; *d++ = c; lastC = c; } *d = 0; } static void eatExcessDotDotInPath(char *path) /* If there's a /.. in path take it out. Turns * 'this/long/../dir/file' to 'this/dir/file * and * 'this/../file' to 'file' * * and * 'this/long/..' to 'this' * and * 'this/..' to '' * and * /this/..' to '/' */ { /* Take out each /../ individually */ for (;;) { /* Find first bit that needs to be taken out. */ char *excess= strstr(path, "/../"); char *excessEnd = excess+4; if (excess == NULL || excess == path) break; /* Look for a '/' before this */ char *excessStart = matchingCharBeforeInLimits(path, excess, '/'); if (excessStart == NULL) /* Preceding '/' not found */ excessStart = path; else excessStart += 1; strcpy(excessStart, excessEnd); } /* Take out final /.. if any */ if (endsWith(path, "/..")) { if (!sameString(path, "/..")) /* We don't want to turn this to blank. */ { int len = strlen(path); char *excessStart = matchingCharBeforeInLimits(path, path+len-3, '/'); if (excessStart == NULL) /* Preceding '/' not found */ excessStart = path; else excessStart += 1; *excessStart = 0; } } } char *simplifyPathToDir(char *path) /* Return path with ~ and .. taken out. Also any // or trailing /. * freeMem result when done. */ { /* Expand ~ if any with result in newPath */ char newPath[PATH_LEN]; int newLen = 0; char *s = path; if (*s == '~') { char *homeDir = getenv("HOME"); if (homeDir == NULL) errAbort("No HOME environment var defined after ~ in simplifyPathToDir"); ++s; if (*s == '/') /* ~/something */ { ++s; safef(newPath, sizeof(newPath), "%s/", homeDir); } else /* ~something */ { safef(newPath, sizeof(newPath), "%s/../", homeDir); } newLen = strlen(newPath); } int remainingLen = strlen(s); if (newLen + remainingLen >= sizeof(newPath)) errAbort("path too big in simplifyPathToDir"); strcpy(newPath+newLen, s); /* Remove //, .. and trailing / */ eatSlashSlashInPath(newPath); eatExcessDotDotInPath(newPath); int lastPos = strlen(newPath)-1; if (lastPos > 0 && newPath[lastPos] == '/') newPath[lastPos] = 0; return cloneString(newPath); } #ifdef DEBUG void simplifyPathToDirSelfTest() { /* First test some cases which should remain the same. */ assert(sameString(simplifyPathToDir(""),"")); assert(sameString(simplifyPathToDir("a"),"a")); assert(sameString(simplifyPathToDir("a/b"),"a/b")); assert(sameString(simplifyPathToDir("/"),"/")); assert(sameString(simplifyPathToDir("/.."),"/..")); assert(sameString(simplifyPathToDir("/../a"),"/../a")); /* Now test removing trailing slash. */ assert(sameString(simplifyPathToDir("a/"),"a")); assert(sameString(simplifyPathToDir("a/b/"),"a/b")); /* Test .. removal. */ assert(sameString(simplifyPathToDir("a/.."),"")); assert(sameString(simplifyPathToDir("a/../"),"")); assert(sameString(simplifyPathToDir("a/../b"),"b")); assert(sameString(simplifyPathToDir("/a/.."),"/")); assert(sameString(simplifyPathToDir("/a/../"),"/")); assert(sameString(simplifyPathToDir("/a/../b"),"/b")); assert(sameString(simplifyPathToDir("a/b/.."),"a")); assert(sameString(simplifyPathToDir("a/b/../"),"a")); assert(sameString(simplifyPathToDir("a/b/../c"),"a/c")); assert(sameString(simplifyPathToDir("a/../b/../c"),"c")); assert(sameString(simplifyPathToDir("a/../b/../c/.."),"")); assert(sameString(simplifyPathToDir("/a/../b/../c/.."),"/")); /* Test // removal */ assert(sameString(simplifyPathToDir("//"),"/")); assert(sameString(simplifyPathToDir("//../"),"/..")); assert(sameString(simplifyPathToDir("a//b///c"),"a/b/c")); assert(sameString(simplifyPathToDir("a/b///"),"a/b")); } #endif /* DEBUG */ char *getUser() /* Get user name */ { uid_t uid = geteuid(); struct passwd *pw = getpwuid(uid); if (pw == NULL) errnoAbort("getUser: can't get user name for uid %d", (int)uid); return pw->pw_name; } int mustFork() /* Fork or abort. */ { int childId = fork(); if (childId == -1) errnoAbort("mustFork: Unable to fork"); return childId; } int rawKeyIn() /* Read in an unbuffered, unechoed character from keyboard. */ { struct termios attr; tcflag_t old; char c; /* Set terminal to non-echoing non-buffered state. */ if (tcgetattr(STDIN_FILENO, &attr) != 0) errAbort("Couldn't do tcgetattr"); old = attr.c_lflag; attr.c_lflag &= ~ICANON; attr.c_lflag &= ~ECHO; if (tcsetattr(STDIN_FILENO, TCSANOW, &attr) == -1) errAbort("Couldn't do tcsetattr"); /* Read one byte */ if (read(STDIN_FILENO,&c,1) != 1) errnoAbort("rawKeyIn: I/O error"); /* Put back terminal to how it was. */ attr.c_lflag = old; if (tcsetattr(STDIN_FILENO, TCSANOW, &attr) == -1) errAbort("Couldn't do tcsetattr2"); return c; } boolean isPipe(int fd) /* determine in an open file is a pipe */ { struct stat buf; if (fstat(fd, &buf) < 0) errnoAbort("isPipe: fstat failed"); return S_ISFIFO(buf.st_mode); } void childExecFailedExit(char *msg) /* Child exec failed, so quit without atexit cleanup */ { fprintf(stderr, "child exec failed: %s\n", msg); fflush(stderr); _exit(1); // Let the parent know that the child failed by returning 1. /* Explanation: _exit() is not the normal exit(). _exit() avoids the usual atexit() cleanup. The MySQL library that we link to uses atexit() cleanup to close any open MySql connections. However, because the child's mysql connections are shared by the parent, this causes the parent MySQL connections to become invalid, and causes the puzzling "MySQL has gone away" error in the parent when it tries to use its now invalid MySQL connections. */ } static void execPStack(pid_t ppid) /* exec pstack on the specified pid */ { char *cmd[3], pidStr[32]; safef(pidStr, sizeof(pidStr), "%ld", (long)ppid); cmd[0] = "pstack"; cmd[1] = pidStr; cmd[2] = NULL; // redirect stdout to stderr if (dup2(2, 1) < 0) errAbort("dup2 failed"); execvp(cmd[0], cmd); childExecFailedExit(cmd[0]); // cannot use the normal errAbort. } void vaDumpStack(char *format, va_list args) /* debugging function to run the pstack program on the current process. In * prints a message, following by a new line, and then the stack track. Just * prints errors to stderr rather than aborts. For debugging purposes * only. */ { static boolean inDumpStack = FALSE; // don't allow re-entry if called from error handler if (inDumpStack) return; inDumpStack = TRUE; fflush(stdout); // clear buffer before forking vfprintf(stderr, format, args); fputc('\n', stderr); fflush(stderr); pid_t ppid = getpid(); pid_t pid = fork(); if (pid < 0) { perror("can't fork pstack"); return; } if (pid == 0) execPStack(ppid); int wstat; if (waitpid(pid, &wstat, 0) < 0) perror("waitpid on pstack failed"); else { if (WIFEXITED(wstat)) { if (WEXITSTATUS(wstat) != 0) fprintf(stderr, "pstack failed\n"); } else if (WIFSIGNALED(wstat)) fprintf(stderr, "pstack signaled %d\n", WTERMSIG(wstat)); } inDumpStack = FALSE; } void dumpStack(char *format, ...) /* debugging function to run the pstack program on the current process. In * prints a message, following by a new line, and then the stack track. Just * prints errors to stderr rather than aborts. For debugging purposes * only. */ { va_list args; va_start(args, format); vaDumpStack(format, args); va_end(args); } boolean maybeTouchFile(char *fileName) /* If file exists, set its access and mod times to now. If it doesn't exist, create it. * Return FALSE if we have a problem doing so (e.g. when qateam is gdb'ing and code tries * to touch some file owned by www). */ { if (fileExists(fileName)) { struct utimbuf ut; ut.actime = ut.modtime = clock1(); int ret = utime(fileName, &ut); if (ret != 0) { warn("utime(%s) failed (ownership?)", fileName); return FALSE; } } else { FILE *f = fopen(fileName, "w"); if (f == NULL) return FALSE; else carefulClose(&f); } return TRUE; } boolean isRegularFile(char *fileName) /* Return TRUE if fileName is a regular file. */ { struct stat st; if (stat(fileName, &st) < 0) return FALSE; if (S_ISREG(st.st_mode)) return TRUE; return FALSE; } void makeSymLink(char *oldName, char *newName) /* Return a symbolic link from newName to oldName or die trying */ { int err = symlink(oldName, newName); if (err < 0) errnoAbort("Couldn't make symbolic link from %s to %s\n", oldName, newName); } rtracklayer/src/ucsc/oswin9x.c0000644000175400017540000001133213556116552017444 0ustar00biocbuildbiocbuild/* Stuff that's specific for Win95 goes here. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include #include "common.h" #include #include #include "portable.h" #include "_portimpl.h" /* for cmpFileInfo */ static char const rcsid[] = "$Id: oswin9x.c,v 1.9 2008/06/27 18:46:53 markd Exp $"; boolean isRegularFile(char *fileName) { DWORD dwAttrib = GetFileAttributes((LPCTSTR)fileName); return (dwAttrib != INVALID_FILE_ATTRIBUTES && !(dwAttrib & FILE_ATTRIBUTE_DIRECTORY)); } /* Return how long the named file is in bytes. * Return -1 if no such file. */ off_t fileSize(char *fileName) { int fd; long size; fd = _open(fileName, _O_RDONLY, 0); if (fd < 0) return -1; size = _lseek(fd, 0L, SEEK_END); _close(fd); return size; } time_t fileModTime(char *pathName) /* Return file last modification time. The units of * these may vary from OS to OS, but you can depend on * later files having a larger time. */ { struct _finddata_t fileInfo; if (_findfirst( pathName, &fileInfo) == -1L) errAbort("_findFirst failed in fileModTime: %s", pathName); return fileInfo.time_write; } void sleep1000(int milli) /* Sleep for given number of 1000ths of second */ { if (milli > 0) { Sleep(milli); } } long clock1000() /* A millisecond clock. */ { return clock() /* 1000/CLOCKS_PER_SEC */; /* CLOCKS_PER_SEC == 1000 for windows */ } long clock1() /* Second clock. */ { return clock()/CLOCKS_PER_SEC; } void uglyfBreak() /* Go into debugger. */ { /* __asm { int 3 } */ } char *getCurrentDir() /* Return current directory. */ { static char dir[_MAX_PATH]; if( _getcwd( dir, _MAX_PATH ) == NULL ) errnoAbort("can't get current directory"); return dir; } void setCurrentDir(char *newDir) /* Set current directory. Abort if it fails. */ { if (_chdir(newDir) != 0) errnoAbort("can't to set current directory: %s", newDir); } boolean maybeSetCurrentDir(char *newDir) /* Change directory, return FALSE (and set errno) if fail. */ { return _chdir(newDir) == 0; } struct slName *listDir(char *dir, char *pattern) /* Return an alphabetized list of all files that match * the wildcard pattern in directory. */ { long hFile; struct _finddata_t fileInfo; struct slName *list = NULL, *name; boolean otherDir = FALSE; char *currentDir; if (dir == NULL || sameString(".", dir) || sameString("", dir)) dir = ""; else { currentDir = getCurrentDir(); setCurrentDir(dir); otherDir = TRUE; } if (pattern == NULL) pattern = "*"; if( (hFile = _findfirst( pattern, &fileInfo)) == -1L ) return NULL; do { if (!sameString(".", fileInfo.name) && !sameString("..", fileInfo.name)) { name = newSlName(fileInfo.name); slAddHead(&list, name); } } while( _findnext( hFile, &fileInfo) == 0 ); _findclose( hFile ); if (otherDir) setCurrentDir(currentDir); slNameSort(&list); return list; } boolean makeDir(char *dirName) /* Make dir. Returns TRUE on success. Returns FALSE * if failed because directory exists. Prints error * message and aborts on other error. */ { if (!CreateDirectory(dirName, NULL)) { perror(""); errAbort("Couldn't make directory %s", dirName); return FALSE; } return TRUE; } struct fileInfo *listDirX(char *dir, char *pattern, boolean fullPath) /* Return list of files matching wildcard pattern with * extra info. If full path is true then the path will be * included in the name of each file. */ { struct fileInfo *list = NULL, *el; long hFile; struct _finddata_t fileInfo; boolean otherDir = FALSE; char *currentDir; int dirNameSize = strlen(dir); int fileNameOffset = dirNameSize+1; char pathName[512]; if (dir == NULL || sameString(".", dir) || sameString("", dir)) dir = ""; else { currentDir = getCurrentDir(); setCurrentDir(dir); otherDir = TRUE; } if (pattern == NULL) pattern = "*"; if( (hFile = _findfirst( pattern, &fileInfo)) == -1L ) return NULL; memcpy(pathName, dir, dirNameSize); pathName[dirNameSize] = '/'; do { if (!sameString(".", fileInfo.name) && !sameString("..", fileInfo.name)) { char *fileName = fileInfo.name; strcpy(pathName+fileNameOffset, fileName); if (fullPath) fileName = pathName; el = newFileInfo(fileInfo.name, fileInfo.size, fileInfo.attrib & _A_SUBDIR, 0, fileInfo.time_access); slAddHead(&list, el); } } while( _findnext( hFile, &fileInfo) == 0 ); _findclose( hFile ); if (otherDir) setCurrentDir(currentDir); slSort(&list, cmpFileInfo); return list; } rtracklayer/src/ucsc/pipeline.c0000644000175400017540000005224013556116552017634 0ustar00biocbuildbiocbuild#ifndef WIN32 /* pipeline.c - create a process pipeline that can be used for reading or * writing */ /* Copyright (C) 2013 The Regents of the University of California * See README in this or parent directory for licensing information. */ #include "pipeline.h" #include "common.h" #include "sqlNum.h" #include "dystring.h" #include "errAbort.h" #include "portable.h" #include "linefile.h" #include #include #include #include enum procState /* process state, in order of transition */ { procStateNew, // plProc object created procStateRun, // proccess running procStateDone // process finished (ok or failed) }; struct plProc /* A single process in a pipeline */ { struct plProc *next; /* order list of processes */ struct pipeline *pl; /* pipeline we are associated with */ char **cmd; /* null-terminated command for this process */ pid_t pid; /* pid for process, -1 if not running */ enum procState state; /* state of process */ int status; /* status from wait */ }; struct pipeline /* Object for a process pipeline and associated open file. Pipeline process * consist of a process group leader and then all of the child process. The * group leader does no work, just wait on processes to complete and report * errors to the top level process. This object is create in the calling * process, and then passed down, but not shared, via forks. */ { struct plProc *procs; /* list of processes */ int numRunning; /* number of processes running */ pid_t groupLeader; /* process group id, or -1 if not set. This is pid of group leader */ char *procName; /* name to use in error messages. */ int pipeFd; /* fd of pipe to/from process, -1 if none */ unsigned options; /* options */ FILE* pipeFh; /* optional stdio around pipe */ char* stdioBuf; /* optional stdio buffer */ struct lineFile *pipeLf; /* optional lineFile around pipe */ }; /* file buffer size */ #define FILE_BUF_SIZE 64*1024 static int pipeCreate(int *writeFd) /* create a pipe or die, return readFd */ { int pipeFds[2]; if (pipe(pipeFds) < 0) errnoAbort("can't create pipe"); *writeFd = pipeFds[1]; return pipeFds[0]; } static void safeClose(int *fdPtr) /* Close with error checking. *fdPtr == -1 indicated already closed */ { int fd = *fdPtr; if (fd != -1) { if (close(fd) < 0) errnoAbort("close failed on fd %d", fd); *fdPtr = -1; } } static void closeNonStdDescriptors(void) /* close non-standard file descriptors */ { long maxFd = sysconf(_SC_OPEN_MAX); if (maxFd < 0) maxFd = 4096; // shouldn't really happen int fd; for (fd = STDERR_FILENO+1; fd < maxFd; fd++) close(fd); } static char* joinCmd(char **cmd) /* join an cmd vector into a space separated string */ { struct dyString *str = dyStringNew(512); int i; for (i = 0; cmd[i] != NULL; i++) { if (i > 0) dyStringAppend(str, " "); dyStringAppend(str, cmd[i]); } return dyStringCannibalize(&str); } static char* joinCmds(char ***cmds) /* join an cmds vetor into a space and pipe separated string */ { struct dyString *str = dyStringNew(512); int i, j; for (i = 0; cmds[i] != NULL; i++) { if (i > 0) dyStringAppend(str, " | "); for (j = 0; cmds[i][j] != NULL; j++) { if (j > 0) dyStringAppend(str, " "); dyStringAppend(str, cmds[i][j]); } } return dyStringCannibalize(&str); } static char** cloneCmdVector(char **cmd) /* make a copy of the vector */ { int i, cmdLen = 0; for (i = 0; cmd[i] != NULL; i++) cmdLen++; char **cmd2 = needMem((cmdLen+1)*sizeof(char*)); for (i = 0; i < cmdLen; i++) cmd2[i] = cloneString(cmd[i]); cmd2[cmdLen] = NULL; return cmd2; } static struct plProc* plProcNew(char **cmd, struct pipeline *pl) /* create a new plProc object for a command. */ { struct plProc* proc; AllocVar(proc); proc->pl = pl; proc->cmd = cloneCmdVector(cmd); proc->state = procStateNew; return proc; } static void plProcFree(struct plProc *proc) /* free a plProc object. */ { int i; for (i = 0; proc->cmd[i] != NULL; i++) freeMem(proc->cmd[i]); freeMem(proc->cmd); freeMem(proc); } static void plProcStateTrans(struct plProc *proc, enum procState newState) /* do state transition for process changing it to a new state */ { // States must transition in order. New state must immediately follow the // current state. if (newState != proc->state+1) errAbort("invalid state transition: %d -> %d", proc->state, newState); proc->state = newState; } static void plProcSetup(struct plProc* proc, int stdinFd, int stdoutFd, int stderrFd) /* setup signal, error handling, and file descriptors after fork */ { /* Optionally treat a closed pipe as an EOF rather than getting SIGPIPE */ if (signal(SIGPIPE, ((proc->pl->options & pipelineSigpipe) ? SIG_DFL : SIG_IGN)) == SIG_ERR) errnoAbort("error ignoring SIGPIPE"); if (setpgid(getpid(), proc->pl->groupLeader) != 0) errnoAbort("error from setpgid(%d, %d)", getpid(), proc->pl->groupLeader); /* child, first setup stdio files */ if (stdinFd != STDIN_FILENO) { if (dup2(stdinFd, STDIN_FILENO) < 0) errnoAbort("can't dup2 to stdin"); } if (stdoutFd != STDOUT_FILENO) { if (dup2(stdoutFd, STDOUT_FILENO) < 0) errnoAbort("can't dup2 to stdout"); } if (stderrFd != STDERR_FILENO) { if (dup2(stderrFd, STDERR_FILENO) < 0) errnoAbort("can't dup2 to stderr"); } closeNonStdDescriptors(); } static void plProcExecChild(struct plProc* proc, int stdinFd, int stdoutFd, int stderrFd) /* child part of process startup. */ { plProcSetup(proc, stdinFd, stdoutFd, stderrFd); execvp(proc->cmd[0], proc->cmd); errnoAbort("exec failed: %s", proc->cmd[0]); } static void plProcMemWrite(struct plProc* proc, int stdoutFd, int stderrFd, void *otherEndBuf, size_t otherEndBufSize) /* implements child process to write memory buffer to pipeline after * fork */ { plProcSetup(proc, STDIN_FILENO, stdoutFd, stderrFd); ssize_t wrCnt = write(STDOUT_FILENO, otherEndBuf, otherEndBufSize); if (wrCnt < 0) errnoAbort("pipeline input buffer write failed"); else if (wrCnt != otherEndBufSize) errAbort("pipeline input buffer short write %lld, expected %lld", (long long)wrCnt, (long long)otherEndBufSize); else { close(STDOUT_FILENO); exit(0); } } static void plProcHandleSignaled(struct plProc* proc, int status) /* handle one of the processes terminating on a signal */ { assert(WIFSIGNALED(proc->status)); if (!((WTERMSIG(proc->status) == SIGPIPE) && (proc->pl->options & pipelineSigpipe))) { errAbort("process terminated on signal %d: \"%s\" in pipeline \"%s\"", WTERMSIG(proc->status), joinCmd(proc->cmd), proc->pl->procName); } } static void plProcHandleExited(struct plProc* proc, int status) /* handle one of the processes terminating on an exit */ { assert(WIFEXITED(proc->status)); if (WEXITSTATUS(proc->status) != 0) { // only print an error message if aborting if (!(proc->pl->options & pipelineNoAbort)) fprintf(stderr, "process exited with %d: \"%s\" in pipeline \"%s\"\n", WEXITSTATUS(proc->status), joinCmd(proc->cmd), proc->pl->procName); exit(WEXITSTATUS(proc->status)); // pass back exit code } } static void plProcHandleTerminate(struct plProc* proc, int status) /* handle one of the processes terminating, save exit status */ { proc->pid = -1; proc->status = status; plProcStateTrans(proc, procStateDone); if (WIFSIGNALED(proc->status)) plProcHandleSignaled(proc, status); else plProcHandleExited(proc, status); } static struct pipeline* pipelineNew(char ***cmds, unsigned options) /* create a new pipeline object. Doesn't start processes */ { static char *memPseudoCmd[] = {"[mem]", NULL}; struct pipeline *pl; int iCmd; AllocVar(pl); pl->groupLeader = -1; pl->pipeFd = -1; pl->options = options; pl->procName = joinCmds(cmds); if (cmds[0] == NULL) errAbort("no commands in pipeline"); if (options & pipelineMemInput) { /* add proc for forked process to write memory to pipeline */ slAddTail(&pl->procs, plProcNew(memPseudoCmd, pl)); } for(iCmd = 0; cmds[iCmd] != NULL; iCmd++) slAddTail(&pl->procs, plProcNew(cmds[iCmd], pl)); return pl; } void pipelineFree(struct pipeline **plPtr) /* free a pipeline object */ { struct pipeline *pl = *plPtr; if (pl != NULL) { struct plProc *proc = pl->procs; while (proc != NULL) { struct plProc *delProc = proc; proc = proc->next; plProcFree(delProc); } freez(&pl->procName); freez(&pl->stdioBuf); freez(plPtr); } } static struct plProc *pipelineFindProc(struct pipeline *pl, pid_t pid) /* find a plProc by pid */ { struct plProc *proc; for (proc = pl->procs; proc != NULL; proc = proc->next) if (proc->pid == pid) return proc; errAbort("pid not found in pipeline: %d", (int)pid); return 0; // never reached } static void execProcChild(struct pipeline* pl, struct plProc *proc, int procStdinFd, int procStdoutFd, int stderrFd, void *otherEndBuf, size_t otherEndBufSize) /* handle child process setup after fork. This does not return */ { if (otherEndBuf != NULL) plProcMemWrite(proc, procStdoutFd, stderrFd, otherEndBuf, otherEndBufSize); else plProcExecChild(proc, procStdinFd, procStdoutFd, stderrFd); } static int pipelineExecProc(struct pipeline* pl, struct plProc *proc, int prevStdoutFd, int stdinFd, int stdoutFd, int stderrFd, void *otherEndBuf, size_t otherEndBufSize) /* start a process in the pipeline, return the stdout fd of the process */ { /* determine stdin/stdout to use */ int procStdinFd, procStdoutFd; if (proc == pl->procs) procStdinFd = stdinFd; /* first process in pipeline */ else procStdinFd = prevStdoutFd; if (proc->next == NULL) procStdoutFd = stdoutFd; /* last process in pipeline */ else prevStdoutFd = pipeCreate(&procStdoutFd); /* start process */ if ((proc->pid = fork()) < 0) errnoAbort("can't fork"); if (proc->pid == 0) execProcChild(pl, proc, procStdinFd, procStdoutFd, stderrFd, otherEndBuf, otherEndBufSize); /* record that we did this */ plProcStateTrans(proc, procStateRun); pl->numRunning++; /* don't leave intermediate pipes open in parent */ if (proc != pl->procs) safeClose(&procStdinFd); if (proc->next != NULL) safeClose(&procStdoutFd); return prevStdoutFd; } static void pipelineGroupExec(struct pipeline* pl, int stdinFd, int stdoutFd, int stderrFd, void *otherEndBuf, size_t otherEndBufSize) /* Start all processes in a pipeline, stdinFd and stdoutFd are the ends of * the pipeline, stderrFd is applied to all processed */ { struct plProc *proc; int prevStdoutFd = -1; for (proc = pl->procs; proc != NULL; proc = proc->next) { prevStdoutFd = pipelineExecProc(pl, proc, prevStdoutFd, stdinFd, stdoutFd, stderrFd, otherEndBuf, otherEndBufSize); otherEndBuf = NULL; /* only for first process (read pipes) */ otherEndBufSize = 0; } } static void waitOnOne(struct pipeline *pl) /* wait on one process to finish */ { int status; pid_t pid = waitpid(-pl->groupLeader, &status, 0); if (pid < 0) errnoAbort("waitpid failed"); plProcHandleTerminate(pipelineFindProc(pl, pid), status); pl->numRunning--; assert(pl->numRunning >= 0); } static void groupWait(struct pipeline *pl) /* Wait for pipeline to complete */ { /* wait on all processes to complete */ while (pl->numRunning > 0) waitOnOne(pl); } static void groupLeaderRun(struct pipeline* pl, int stdinFd, int stdoutFd, int stderrFd, void *otherEndBuf, size_t otherEndBufSize) /* group leader process */ { pl->groupLeader = getpid(); if (setpgid(pl->groupLeader, pl->groupLeader) != 0) errnoAbort("error from child setpgid(%d, %d)", pl->groupLeader, pl->groupLeader); pipelineGroupExec(pl, stdinFd, stdoutFd, stderrFd, otherEndBuf, otherEndBufSize); // only keep stderr open close(STDIN_FILENO); close(STDOUT_FILENO); closeNonStdDescriptors(); groupWait(pl); exit(0); } static int groupLeaderWait(struct pipeline *pl) /* Wait for group leader to complete. If pipelineNoAbort was specified, return * the exit code of the first group process exit non-zero, or zero if none * failed. */ { int status; pid_t pid = waitpid(-pl->groupLeader, &status, 0); if (pid < 0) errnoAbort("waitpid failed"); if (WIFSIGNALED(status)) errAbort("process pipeline terminated on signal %d", WTERMSIG(status)); assert(WIFEXITED(status)); if ((WEXITSTATUS(status) != 0) && !(pl->options & pipelineNoAbort)) errAbort("pipeline exited with %d", WEXITSTATUS(status)); return WEXITSTATUS(status); } static void pipelineExec(struct pipeline* pl, int stdinFd, int stdoutFd, int stderrFd, void *otherEndBuf, size_t otherEndBufSize) /* Fork the group leader, which then launches all processes in a pipeline, * stdinFd and stdoutFd are the ends of the pipeline, stderrFd is applied to * all processes, including group leader */ { assert(pl->groupLeader < 0); // should not be set if ((pl->groupLeader = fork()) < 0) errnoAbort("can't fork"); if (pl->groupLeader == 0) { groupLeaderRun(pl, stdinFd, stdoutFd, stderrFd, otherEndBuf, otherEndBufSize); exit(1); // doesn't return to here } else { // parent also must also setpgid to prevent race condition if (setpgid(pl->groupLeader, pl->groupLeader) != 0) errnoAbort("error from parent setpgid(%d, %d)", pl->groupLeader, pl->groupLeader); } } static int openRead(char *fname) /* open a file for reading */ { int fd = open(fname, O_RDONLY); if (fd < 0) errnoAbort("can't open for read access: %s", fname); return fd; } static int openWrite(char *fname, boolean append) /* open a file for write access */ { int flags = O_WRONLY|O_CREAT; if (append) flags |= O_APPEND; else flags |= O_TRUNC; int fd = open(fname, flags, 0666); if (fd < 0) errnoAbort("can't open for write access: %s", fname); return fd; } static void pipelineStartRead(struct pipeline *pl, int stdinFd, int stderrFd, void *otherEndBuf, size_t otherEndBufSize) /* start a read pipeline */ { int pipeWrFd; pl->pipeFd = pipeCreate(&pipeWrFd); pipelineExec(pl, stdinFd, pipeWrFd, stderrFd, otherEndBuf, otherEndBufSize); safeClose(&pipeWrFd); } static void pipelineStartWrite(struct pipeline *pl, int stdoutFd, int stderrFd) /* start a write pipeline */ { int pipeRdFd = pipeCreate(&pl->pipeFd); pipelineExec(pl, pipeRdFd, stdoutFd, stderrFd, NULL, 0); safeClose(&pipeRdFd); } static void checkOpts(unsigned opts) /* check option set for consistency */ { if (((opts & (pipelineRead|pipelineWrite)) == 0) || ((opts & (pipelineRead|pipelineWrite)) == (pipelineRead|pipelineWrite))) errAbort("must specify one of pipelineRead or pipelineWrite to pipelineOpen"); if ((opts & pipelineAppend) && ((opts & pipelineWrite) == 0)) errAbort("pipelineAppend is valid only in conjunction with pipelineWrite"); } struct pipeline *pipelineOpenFd(char ***cmds, unsigned opts, int otherEndFd, int stderrFd) /* Create a pipeline from an array of commands. See pipeline.h for * full documentation. */ { struct pipeline *pl; checkOpts(opts); pl = pipelineNew(cmds, opts); if (opts & pipelineRead) pipelineStartRead(pl, otherEndFd, stderrFd, NULL, 0); else pipelineStartWrite(pl, otherEndFd, stderrFd); return pl; } struct pipeline *pipelineOpen(char ***cmds, unsigned opts, char *otherEndFile, char *stderrFile) /* Create a pipeline from an array of commands. See pipeline.h for * full documentation */ { int otherEndFd; int stderrFd = (stderrFile == NULL) ? STDERR_FILENO : openWrite(stderrFile, FALSE); checkOpts(opts); boolean append = ((opts & pipelineAppend) != 0); if (opts & pipelineRead) otherEndFd = (otherEndFile == NULL) ? STDIN_FILENO : openRead(otherEndFile); else otherEndFd = (otherEndFile == NULL) ? STDOUT_FILENO : openWrite(otherEndFile, append); struct pipeline *pl = pipelineOpenFd(cmds, opts, otherEndFd, stderrFd); safeClose(&otherEndFd); if (stderrFile != NULL) safeClose(&stderrFd); return pl; } struct pipeline *pipelineOpenMem(char ***cmds, unsigned opts, void *otherEndBuf, size_t otherEndBufSize, int stderrFd) /* Create a pipeline from an array of commands, with the pipeline input/output * in a memory buffer. See pipeline.h for full documentation. Currently only * input to a read pipeline is supported */ { struct pipeline *pl; checkOpts(opts); if (opts & pipelineWrite) errAbort("pipelineOpenMem only supports read pipelines at this time"); opts |= pipelineMemInput; pl = pipelineNew(cmds, opts); pipelineStartRead(pl, STDIN_FILENO, stderrFd, otherEndBuf, otherEndBufSize); return pl; } struct pipeline *pipelineOpenFd1(char **cmd, unsigned opts, int otherEndFd, int stderrFd) /* like pipelineOpenFd(), only takes a single command */ { char **cmds[2]; cmds[0] = cmd; cmds[1] = NULL; return pipelineOpenFd(cmds, opts, otherEndFd, stderrFd); } struct pipeline *pipelineOpen1(char **cmd, unsigned opts, char *otherEndFile, char *stderrFile) /* like pipelineOpen(), only takes a single command */ { char **cmds[2]; cmds[0] = cmd; cmds[1] = NULL; return pipelineOpen(cmds, opts, otherEndFile, stderrFile); } struct pipeline *pipelineOpenMem1(char **cmd, unsigned opts, void *otherEndBuf, size_t otherEndBufSize, int stderrFd) /* like pipelineOpenMem(), only takes a single command */ { char **cmds[2]; cmds[0] = cmd; cmds[1] = NULL; return pipelineOpenMem(cmds, opts, otherEndBuf, otherEndBufSize, stderrFd); } char *pipelineDesc(struct pipeline *pl) /* Get the description of a pipeline for use in error messages */ { return pl->procName; } int pipelineFd(struct pipeline *pl) /* Get the file descriptor for a pipeline */ { return pl->pipeFd; } FILE *pipelineFile(struct pipeline *pl) /* Get a FILE object wrapped around the pipeline. Do not close the FILE, is * owned by the pipeline object. A FILE is created on first call to this * function. Subsequent calls return the same FILE.*/ { if (pl->pipeFh == NULL) { /* create FILE* on first access */ char *mode = (pl->options & pipelineRead) ? "r" : "w"; if (pl->pipeLf != NULL) errAbort("can't call pipelineFile after having associated a lineFile with a pipeline"); pl->pipeFh = fdopen(pl->pipeFd, mode); if (pl->pipeFh == NULL) errnoAbort("fdopen failed for: %s", pl->procName); pl->stdioBuf = needLargeMem(FILE_BUF_SIZE); setvbuf(pl->pipeFh, pl->stdioBuf, _IOFBF, FILE_BUF_SIZE); } return pl->pipeFh; } struct lineFile *pipelineLineFile(struct pipeline *pl) /* Get a lineFile object wrapped around the pipeline. Do not close the * lineFile, is owned by the pipeline object. A lineFile is created on first * call to this function. Subsequent calls return the same object.*/ { if (pl->pipeLf == NULL) { /* create line on first acess */ if (pl->pipeFh != NULL) errAbort("can't call pipelineLineFile after having associated a FILE with a pipeline"); if (pl->options & pipelineWrite) errAbort("can't associated a lineFile with a write pipeline"); pl->pipeLf = lineFileAttach(pipelineDesc(pl), TRUE, pl->pipeFd); } return pl->pipeLf; } static void closePipelineFile(struct pipeline *pl) /* close a pipeline with a FILE associated with it */ { if (pl->options & pipelineWrite) { fflush(pl->pipeFh); if (ferror(pl->pipeFh)) errAbort("write failed to pipeline: %s ", pl->procName); } else if (ferror(pl->pipeFh)) errAbort("read failed from pipeline: %s ", pl->procName); if (fclose(pl->pipeFh) == EOF) errAbort("close failed on pipeline: %s ", pl->procName); pl->pipeFh = NULL; } static void closePipeline(struct pipeline *pl) /* Close the pipe file */ { if (pl->pipeFh != NULL) closePipelineFile(pl); else if (pl->pipeLf != NULL) lineFileClose(&pl->pipeLf); else { if (close(pl->pipeFd) < 0) errAbort("close failed on pipeline: %s ", pl->procName); } pl->pipeFd = -1; } int pipelineWait(struct pipeline *pl) /* Wait for processes in a pipeline to complete; normally aborts if any * process exists non-zero. If pipelineNoAbort was specified, return the exit * code of the first process exit non-zero, or zero if none failed. */ { /* must close before waiting to so processes get pipe EOF */ closePipeline(pl); return groupLeaderWait(pl); } void pipelineSetNoAbort(struct pipeline *pl) /* Make it so pipeline won't abort on error - can be done after the fact. * (This is needed to close a pipelined lineFile early.) */ { pl->options |= pipelineNoAbort; } void pipelineDumpCmds(char ***cmds) /* Dump out pipeline-formatted commands to stdout for debugging. */ { char **cmd; boolean first = TRUE; while ((cmd = *cmds++) != NULL) { char *word; if (first) first = FALSE; else printf("| "); while ((word = *cmd++) != NULL) printf("%s ", word); } printf("
    \n"); } /* * Local Variables: * c-file-style: "jkent-c" * End: */ #endif rtracklayer/src/ucsc/pipeline.h0000644000175400017540000001443513556116552017645 0ustar00biocbuildbiocbuild/* pipeline.h - create a process pipeline that can be used for reading or * writing. These pipeline objects don't go through the shell, so they * avoid many of the obscure problems associated with system() and popen(). * * Read pipelines are pipelines where a program reads output written by the * pipeline, and write pipelines are where the program writes data to the * pipeline. The type of pipeline is specified in the set of option flags * passed to pipelineOpen(). The file at the other end of the pipeline is * specified in the otherEndFile argument of pipelineOpen(), as shown here: * * pipelineRead: * * otherEndFile --> cmd[0] --> ... --> cmd[n] --> pipelineLf() etc. * * pipelineWrite: * * pipeLineFile() --> cmd[0] --> ... --> cmd[n] --> otherEndFile * * Specify otherEndFile as "/dev/null" for no input or no output (or to * discard output). If otherEndFile is NULL, then either stdin or stdout are * inherited from the current process. * * I/O to the pipeline is done by using the result of pipelineFd(), * pipelineFile(), or pipelineLineFile(). * * An example that reads a compressed file, sorting it numerically by the * first column: * * static char *cmd1[] = {"gzip", "-dc", NULL}; * static char *cmd2[] = {"sort", "-k", "1,1n", NULL}; * static char **cmds[] = {cmd1, cmd2, NULL}; * * struct pipeline *pl = pipelineOpen(cmds, pipelineRead, inFilePath, stderrFd); * struct lineFile *lf = pipelineLineFile(pl); * char *line; * * while (lineFileNext(lf, &line, NULL)) * { * ... * } * pipelineWait(pl); * pipelineFree(&pl); * * A similar example that generates data and writes a compressed file, sorting * it numerically by the first column: * * * static char *cmd1[] = {"sort", "-k", "1,1n", NULL}; * static char *cmd2[] = {"gzip", "-c3", NULL}; * static char **cmds[] = {cmd1, cmd2, NULL}; * * struct pipeline *pl = pipelineOpen(cmds, pipelineWrite, outFilePath, stderrFd); * char *line; * * while ((line = makeNextRow()) != NULL) * fprintf(fh, "%s\n", line); * * pipelineWait(pl); * pipelineFree(&pl); * * To append to an output file, use pipelineWrite|pipelineAppend: * * struct pipeline *pl = pipelineOpen(cmds, pipelineWrite|pipelineAppend, outFilePath, stderrFd); */ #ifndef PIPELINE_H #define PIPELINE_H #include struct linefile; struct pipeline; enum pipelineOpts /* pipeline options bitset */ { pipelineRead = 0x01, /* read from pipeline */ pipelineWrite = 0x02, /* write to pipeline */ pipelineNoAbort = 0x04, /* don't abort if a process exits non-zero, * wait will return exit code instead. * Still aborts if process signals. */ pipelineMemInput = 0x08, /* pipeline takes input from memory (internal) */ pipelineAppend = 0x10, /* Append to output file (used only with pipelineWrite) */ pipelineSigpipe = 0x20 /* enable sigpipe in the children and don't treat as an error in the parent */ }; struct pipeline *pipelineOpenFd(char ***cmds, unsigned opts, int otherEndFd, int stderrFd); /* Create a pipeline from an array of commands. Each command is an array of * arguments. Shell expansion is not done on the arguments. If pipelineRead * is specified, the output of the pipeline is readable from the pipeline * object. If pipelineWrite is specified, the input of the pipeline is * writable from the pipeline object. */ struct pipeline *pipelineOpen(char ***cmds, unsigned opts, char *otherEndFile, char *stderrFile); /* Create a pipeline from an array of commands. Each command is an array of * arguments. Shell expansion is not done on the arguments. If pipelineRead * is specified, the output of the pipeline is readable from the pipeline * object. If pipelineWrite is specified, the input of the pipeline is * writable from the pipeline object. If stderrFile is NULL, stderr is inherited, * otherwise it is redirected to this file. */ void pipelineDumpCmds(char ***cmds); /* Dump out pipeline-formatted commands to stdout for debugging. */ struct pipeline *pipelineOpenMem(char ***cmds, unsigned opts, void *otherEndBuf, size_t otherEndBufSize, int stderrFd); /* Create a pipeline from an array of commands, with the pipeline input/output * in a memory buffer. See pipeline.h for full documentation. Currently only * input to a read pipeline is supported */ struct pipeline *pipelineOpenFd1(char **cmd, unsigned opts, int otherEndFd, int stderrFd); /* like pipelineOpenFd(), only takes a single command */ struct pipeline *pipelineOpen1(char **cmd, unsigned opts, char *otherEndFile, char *stderrFile); /* like pipelineOpen(), only takes a single command */ struct pipeline *pipelineOpenMem1(char **cmd, unsigned opts, void *otherEndBuf, size_t otherEndBufSize, int stderrFd); /* like pipelineOpenMem(), only takes a single command */ char *pipelineDesc(struct pipeline *pl); /* Get the desciption of a pipeline for use in error messages */ int pipelineFd(struct pipeline *pl); /* Get the file descriptor for a pipeline */ FILE *pipelineFile(struct pipeline *pl); /* Get a FILE object wrapped around the pipeline. Do not close the FILE, is * owned by the pipeline object. A FILE is created on first call to this * function. Subsequent calls return the same FILE.*/ struct lineFile *pipelineLineFile(struct pipeline *pl); /* Get a lineFile object wrapped around the pipeline. Do not close the * lineFile, is owned by the pipeline object. A lineFile is created on first * call to this function. Subsequent calls return the same object.*/ int pipelineWait(struct pipeline *pl); /* Wait for processes in a pipeline to complete; normally aborts if any * process exists non-zero. If pipelineNoAbort was specified, return the exit * code of the first process exit non-zero, or zero if none failed. */ void pipelineFree(struct pipeline **plPtr); /* free a pipeline object */ #endif /* * Local Variables: * c-file-style: "jkent-c" * End: */ rtracklayer/src/ucsc/portable.h0000644000175400017540000001211213556116552017636 0ustar00biocbuildbiocbuild/* portable.h - wrappers around things that vary from server * to server and operating system to operating system. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef PORTABLE_H #define PORTABLE_H #include #include struct slName *listDir(char *dir, char *pattern); /* Return an alphabetized list of all files that match * the wildcard pattern in directory. */ struct slName *listDirRegEx(char *dir, char *regEx, int flags); /* Return an alphabetized list of all files that match * the regular expression pattern in directory. * See REGCOMP(3) for flags (e.g. REG_ICASE) */ struct fileInfo /* Info about a file. */ { struct fileInfo *next; /* Next in list. */ off_t size; /* Size in bytes. */ bool isDir; /* True if file is a directory. */ int statErrno; /* Result of stat (e.g. bad symlink). */ time_t lastAccess; /* Last access time. */ char name[1]; /* Allocated at run time. */ }; struct fileInfo *newFileInfo(char *name, off_t size, bool isDir, int statErrno, time_t lastAccess); /* Return a new fileInfo. */ struct fileInfo *listDirXExt(char *dir, char *pattern, boolean fullPath, boolean ignoreStatFailures); /* Return list of files matching wildcard pattern with * extra info. If full path is true then the path will be * included in the name of each file. You can free the * resulting list with slFreeList. */ struct fileInfo *listDirX(char *dir, char *pattern, boolean fullPath); /* Return list of files matching wildcard pattern with * extra info. If full path is true then the path will be * included in the name of each file. You can free the * resulting list with slFreeList. */ char *getCurrentDir(); /* Return current directory. Abort if it fails. */ void setCurrentDir(char *newDir); /* Set current directory. Abort if it fails. */ boolean maybeSetCurrentDir(char *newDir); /* Change directory, return FALSE (and set errno) if fail. */ boolean makeDir(char *dirName); /* Make dir. Returns TRUE on success. Returns FALSE * if failed because directory exists. Prints error * message and aborts on other error. */ void makeDirsOnPath(char *pathName); /* Create directory specified by pathName. If pathName contains * slashes, create directory at each level of path if it doesn't * already exist. Abort with error message if there's a problem. * (It's not considered a problem for the directory to already * exist. ) */ char *simplifyPathToDir(char *path); /* Return path with ~ (for home) and .. taken out. freeMem result when done. */ long clock1000(); /* 1000 hz clock */ void sleep1000(int milli); /* Sleep for given number of milliseconds. */ long clock1(); /* A 1 hz clock. */ char *rTempName(char *dir, char *base, char *suffix); /* Make a temp name that's almost certainly unique. */ /* This structure helps us generate temp names and use * them. Since different servers locate where the cgi * runs from differently, and where the generated html * file runs from - this is necessary for portable code. */ struct tempName { char forCgi[128]; char forHtml[128]; }; void makeTempName(struct tempName *tn, char *base, char *suffix); /* Make a good name for a temp file. */ void mustRename(char *oldName, char *newName); /* Rename file or die trying. */ void mustRemove(char *path); /* Remove file or die trying */ char *semiUniqName(char *base); /* Figure out a name likely to be unique. * Name will have no periods. Returns a static * buffer, so best to clone result unless using * immediately. */ char *cgiDir(); /* Return directory to look for cgi in. */ char *trashDir(); /* Return directory for relative path to trash from cgi binaries */ void mkdirTrashDirectory(char *prefix); /* create the specified trash directory if it doesn't exist */ double machineSpeed(); /* Return relative speed of machine. UCSC CSE dept. 1999 web server is 1.0 */ char *mysqlHost(); /* Return host computer on network for mySQL database. */ char *getHost(); /* Get name of this machine. */ void uglyfBreak(); /* Invoke the debugger. */ char *getUser(); /* Get user name */ void envUpdate(char *name, char *value); /* Update an environment string */ int mustFork(); /* Fork or abort. */ int rawKeyIn(); /* Read in an unbuffered, unechoed character from keyboard. */ time_t fileModTime(char *pathName); /* Return file last modification time. The units of * these may vary from OS to OS, but you can depend on * later files having a larger time. */ boolean isPipe(int fd); /* determine in an open file is a pipe */ boolean maybeTouchFile(char *fileName); /* If file exists, set its access and mod times to now. If it doesn't exist, create it. * Return FALSE if we have a problem doing so. */ boolean isRegularFile(char *fileName); /* Return TRUE if fileName is a regular file. */ void makeSymLink(char *oldName, char *newName); /* Return a symbolic link from newName to oldName or die trying */ long long freeSpaceOnFileSystem(char *path); /* Given a path to a file or directory on a file system, return free space * in bytes. */ #endif /* PORTABLE_H */ rtracklayer/src/ucsc/portimpl.h0000644000175400017540000000253613556116552017705 0ustar00biocbuildbiocbuild/***************************************************************************** * Copyright (C) 2000 Jim Kent. This source code may be freely used * * for personal, academic, and non-profit purposes. Commercial use * * permitted only by explicit agreement with Jim Kent (jim_kent@pacbell.net) * *****************************************************************************/ /* Implement portable stuff.... */ /* There is one of the following structures for each web server * we support. During run time looking at the environment variable * SERVER_SOFTWARE we decide which of these to use. */ struct webServerSpecific { char *name; /* Make a good name for a temp file. */ void (*makeTempName)(struct tempName *tn, char *base, char *suffix); /* Return directory to look for cgi in. */ char * (*cgiDir)(); #ifdef NEVER /* Return cgi suffix. */ char * (*cgiSuffix)(); #endif /* NEVER */ /* Return relative speed of CPU. (UCSC CSE 1999 FTP machine is 1.0) */ double (*speed)(); /* The relative path to trash directory for CGI binaries */ char * (*trashDir)(); }; extern struct webServerSpecific wssMicrosoftII, wssMicrosoftPWS, wssDefault, wssLinux, wssCommandLine, wssBrcMcw; char *rTempName(char *dir, char *base, char *suffix); /* Make a temp name that's almost certainly unique. */ rtracklayer/src/ucsc/rangeTree.c0000644000175400017540000002350113556116552017741 0ustar00biocbuildbiocbuild/* rangeTree - This module is a way of keeping track of * non-overlapping ranges (half-open intervals). It is * based on the self-balancing rbTree code. Use it in * place of a bitmap when the total number of ranges * is significantly smaller than the number of bits would * be. * Beware the several static/global variables which can be * changed by various function calls. */ /* Copyright (C) 2013 The Regents of the University of California * See README in this or parent directory for licensing information. */ #include "common.h" #include "limits.h" #include "localmem.h" #include "obscure.h" #include "rbTree.h" #include "rangeTree.h" int rangeCmp(void *va, void *vb) /* Return -1 if a before b, 0 if a and b overlap, * and 1 if a after b. */ { struct range *a = va; struct range *b = vb; if (a->end <= b->start) return -1; else if (b->end <= a->start) return 1; else return 0; } static void *sumInt(void *a, void *b) /* Local function used by rangeTreeAddValCount, which sums two ints a and b, * referenced by void pointers, returning the result in a */ { int *i = a, *j = b; *i += *j; return a; } struct range *rangeTreeAddVal(struct rbTree *tree, int start, int end, void *val, void *(*mergeVals)(void *existingVal, void *newVal) ) /* Add range to tree, merging with existing ranges if need be. * If this is a new range, set the value to this val. * If there are existing items for this range, and if mergeVals function is not null, * apply mergeVals to the existing values and this new val, storing the result as the val * for this range (see rangeTreeAddValCount() and rangeTreeAddValList() below for examples). */ { struct range *r, *existing; r = lmAlloc(tree->lm, sizeof(*r)); /* alloc new zeroed range */ r->start = start; r->end = end; r->val = val; while ((existing = rbTreeRemove(tree, r)) != NULL) { r->start = min(r->start, existing->start); r->end = max(r->end, existing->end); if (mergeVals) r->val = mergeVals(existing->val, r->val); } rbTreeAdd(tree, r); return r; } struct range *rangeTreeAdd(struct rbTree *tree, int start, int end) /* Add range to tree, merging with existing ranges if need be. */ { return rangeTreeAddVal(tree, start, end, NULL, NULL); } struct range *rangeTreeAddValCount(struct rbTree *tree, int start, int end) /* Add range to tree, merging with existing ranges if need be. * Set range val to count of elements in the range. Counts are pointers to * ints allocated in tree localmem */ { int *a = lmAlloc(tree->lm, sizeof(*a)); /* keep the count in localmem */ *a = 1; return rangeTreeAddVal(tree, start, end, (void *)a, sumInt); } struct range *rangeTreeAddValList(struct rbTree *tree, int start, int end, void *val) /* Add range to tree, merging with existing ranges if need be. * Add val to the list of values (if any) in each range. * val must be valid argument to slCat (ie, be a struct with a 'next' pointer as its first member) */ { return rangeTreeAddVal(tree, start, end, val, slCat); } void rangeTreeAddToCoverageDepth(struct rbTree *tree, int start, int end) /* Add area from start to end to a tree that is being built up to store the * depth of coverage. Recover coverage back out by looking at ptToInt(range->val) * on tree elements. */ { struct range q; q.start = start; q.end = end; struct range *r, *existing = rbTreeFind(tree, &q); if (existing == NULL) { lmAllocVar(tree->lm, r); r->start = start; r->end = end; r->val = intToPt(1); rbTreeAdd(tree, r); } else { if (existing->start <= start && existing->end >= end) /* The existing one completely encompasses us */ { /* Make a new section for the bit before start. */ if (existing->start < start) { lmAllocVar(tree->lm, r); r->start = existing->start; r->end = start; r->val = existing->val; existing->start = start; rbTreeAdd(tree, r); } /* Make a new section for the bit after end. */ if (existing->end > end) { lmAllocVar(tree->lm, r); r->start = end; r->end = existing->end; r->val = existing->val; existing->end = end; rbTreeAdd(tree, r); } /* Increment existing section in overlapping area. */ existing->val = (char *)(existing->val) + 1; } else /* In general case fetch list of regions that overlap us. Remaining cases to handle are: r >> e rrrrrrrrrrrrrrrrrrrr eeeeeeeeee e < r rrrrrrrrrrrrrrr eeeeeeeeeeee r < e rrrrrrrrrrrr eeeeeeeeeeeee */ { struct range *existingList = rangeTreeAllOverlapping(tree, start, end); #ifdef DEBUG /* Make sure that list is really sorted for debugging... */ int lastStart = existingList->start; for (r = existingList; r != NULL; r = r->next) { int start = r->start; if (start < lastStart) internalErr(); } #endif /* DEBUG */ int s = start, e = end; for (existing = existingList; existing != NULL; existing = existing->next) { /* Deal with start of new range that comes before existing */ if (s < existing->start) { lmAllocVar(tree->lm, r); r->start = s; r->end = existing->start; r->val = intToPt(1); s = existing->start; rbTreeAdd(tree, r); } else if (s > existing->start) { lmAllocVar(tree->lm, r); r->start = existing->start; r->end = s; r->val = existing->val; existing->start = s; rbTreeAdd(tree, r); } existing->val = (char *)(existing->val) + 1; s = existing->end; } if (s < e) /* Deal with end of new range that doesn't overlap with anything. */ { lmAllocVar(tree->lm, r); r->start = s; r->end = e; r->val = intToPt(1); rbTreeAdd(tree, r); } } } } boolean rangeTreeOverlaps(struct rbTree *tree, int start, int end) /* Return TRUE if start-end overlaps anything in tree */ { struct range tempR; tempR.start = start; tempR.end = end; tempR.val = NULL; return rbTreeFind(tree, &tempR) != NULL; } static struct range *rangeList; static void rangeListAdd(void *v) /* Callback to add item to range list. */ { struct range *r = v; slAddHead(&rangeList, r); } struct range *rangeTreeList(struct rbTree *tree) /* Return list of all ranges in tree in order. Not thread safe. * No need to free this when done, memory is local to tree. */ { rangeList = NULL; rbTreeTraverse(tree, rangeListAdd); slReverse(&rangeList); return rangeList; } struct range *rangeTreeFindEnclosing(struct rbTree *tree, int start, int end) /* Find item in range tree that encloses range between start and end * if there is any such item. */ { struct range tempR, *r; tempR.start = start; tempR.end = end; r = rbTreeFind(tree, &tempR); if (r != NULL && r->start <= start && r->end >= end) { r->next = NULL; /* this can be set by previous calls to the List functions */ return r; } return NULL; } struct range *rangeTreeAllOverlapping(struct rbTree *tree, int start, int end) /* Return list of all items in range tree that overlap interval start-end. * Do not free this list, it is owned by tree. However it is only good until * next call to rangeTreeFindInRange or rangeTreeList. Not thread safe. */ { struct range tempR; tempR.start = start; tempR.end = end; rangeList = NULL; rbTreeTraverseRange(tree, &tempR, &tempR, rangeListAdd); slReverse(&rangeList); return rangeList; } struct range *rangeTreeMaxOverlapping(struct rbTree *tree, int start, int end) /* Return item that overlaps most with start-end. Not thread safe. Trashes list used * by rangeTreeAllOverlapping. */ { struct range *range, *best = NULL; int bestOverlap = 0; for (range = rangeTreeAllOverlapping(tree, start, end); range != NULL; range = range->next) { int overlap = rangeIntersection(range->start, range->end, start, end); if (overlap > bestOverlap) { bestOverlap = overlap; best = range; } } if (best) best->next = NULL; /* could be set by calls to List functions */ return best; } /* A couple of variables used to calculate total overlap. */ static int totalOverlap; static int overlapStart, overlapEnd; static void addOverlap(void *v) /* Callback to add item to range list. */ { struct range *r = v; totalOverlap += positiveRangeIntersection(r->start, r->end, overlapStart, overlapEnd); } int rangeTreeOverlapSize(struct rbTree *tree, int start, int end) /* Return the total size of intersection between interval * from start to end, and items in range tree. Sadly not * thread-safe. * On 32 bit machines be careful not to overflow * range of start, end or total size return value. */ { struct range tempR; tempR.start = overlapStart = start; tempR.end = overlapEnd = end; totalOverlap = 0; rbTreeTraverseRange(tree, &tempR, &tempR, addOverlap); return totalOverlap; } int rangeTreeOverlapTotalSize(struct rbTree *tree) /* Return the total size of all ranges in range tree. * Sadly not thread-safe. * On 32 bit machines be careful not to overflow * range of start, end or total size return value. */ { return rangeTreeOverlapSize(tree, INT_MIN, INT_MAX); } void rangeTreeSumRangeCallback(void *item, void *context) /* This is a callback for rbTreeTraverse with context. It just adds up * end-start */ { struct range *range = item; long long *pSum = context; *pSum += range->end - range->start; } long long rangeTreeSumRanges(struct rbTree *tree) /* Return sum of end-start of all items. */ { long long sum = 0; rbTreeTraverseWithContext(tree, rangeTreeSumRangeCallback, &sum); return sum; } struct rbTree *rangeTreeNew() /* Create a new, empty, rangeTree. */ { return rbTreeNew(rangeCmp); } struct rbTree *rangeTreeNewDetailed(struct lm *lm, struct rbTreeNode *stack[128]) /* Allocate rangeTree on an existing local memory & stack. This is for cases * where you want a lot of trees, and don't want the overhead for each one. * Note, to clean these up, just do freez(&rbTree) rather than rbFreeTree(&rbTree). */ { return rbTreeNewDetailed(rangeCmp, lm, stack); } rtracklayer/src/ucsc/rangeTree.h0000644000175400017540000001057413556116552017754 0ustar00biocbuildbiocbuild/* rangeTree - This module is a way of keeping track of * non-overlapping ranges (half-open intervals). It is * based on the self-balancing rbTree code. Use it in * place of a bitmap when the total number of ranges * is significantly smaller than the number of bits would * be. */ #ifndef RANGETREE_H #define RANGETREE_H #ifndef RBTREE_H #include "rbTree.h" #endif struct range /* An interval in a list of intervals. */ { struct range *next; int start,end; /* Zero based half open interval. */ void *val; /* Some value associated with range. */ }; struct rbTree *rangeTreeNew(); /* Create a new, empty, rangeTree. Free with rbFreeTree. */ #define rangeTreeFree(a) rbTreeFree(a) /* Free up range tree. */ int rangeCmp(void *va, void *vb); /* Return -1 if a before b, 0 if a and b overlap, * and 1 if a after b. */ struct range *rangeTreeAddVal(struct rbTree *tree, int start, int end, void *val, void *(*mergeVals)(void *existingVal, void *newVal) ); /* Add range to tree, merging with existing ranges if need be. * If this is a new range, set the value to this val. * If there are existing items for this range, and if mergeVals function is not null, * apply mergeVals to the existing values and this new val, storing the result as the val * for this range (see rangeTreeAddValCount() and rangeTreeAddValList() below for examples). */ struct range *rangeTreeAdd(struct rbTree *tree, int start, int end); /* Add range to tree, merging with existing ranges if need be. */ struct range *rangeTreeAddValCount(struct rbTree *tree, int start, int end); /* Add range to tree, merging with existing ranges if need be. * Set range val to count of elements in the range. Counts are pointers to * ints allocated in tree localmem */ struct range *rangeTreeAddValList(struct rbTree *tree, int start, int end, void *val); /* Add range to tree, merging with existing ranges if need be. * Add val to the list of values (if any) in each range. * val must be valid argument to slCat (ie, be a struct with a 'next' pointer as its first member) */ void rangeTreeAddToCoverageDepth(struct rbTree *tree, int start, int end); /* Add area from start to end to a tree that is being built up to store the * depth of coverage. Recover coverage back out by looking at ptToInt(range->val) * on tree elements. */ boolean rangeTreeOverlaps(struct rbTree *tree, int start, int end); /* Return TRUE if start-end overlaps anything in tree */ int rangeTreeOverlapSize(struct rbTree *tree, int start, int end); /* Return the total size of intersection between interval * from start to end, and items in range tree. Sadly not * thread-safe. * On 32 bit machines be careful not to overflow * range of start, end or total size return value. */ int rangeTreeOverlapTotalSize(struct rbTree *tree); /* Return the total size of all ranges in range tree. * Sadly not thread-safe. * On 32 bit machines be careful not to overflow * range of start, end or total size return value. */ struct range *rangeTreeFindEnclosing(struct rbTree *tree, int start, int end); /* Find item in range tree that encloses range between start and end * if there is any such item. */ struct range *rangeTreeAllOverlapping(struct rbTree *tree, int start, int end); /* Return list of all items in range tree that overlap interval start-end. * Do not free this list, it is owned by tree. However it is only good until * next call to rangeTreeFindInRange or rangTreeList. Not thread safe. */ struct range *rangeTreeMaxOverlapping(struct rbTree *tree, int start, int end); /* Return item that overlaps most with start-end. Not thread safe. Trashes list used * by rangeTreeAllOverlapping. */ void rangeTreeSumRangeCallback(void *item, void *context); /* This is a callback for rbTreeTraverse with context. It just adds up * end-start */ long long rangeTreeSumRanges(struct rbTree *tree); /* Return sum of end-start of all items. */ struct range *rangeTreeList(struct rbTree *tree); /* Return list of all ranges in tree in order. Not thread safe. * No need to free this when done, memory is local to tree. */ struct rbTree *rangeTreeNewDetailed(struct lm *lm, struct rbTreeNode *stack[128]); /* Allocate rangeTree on an existing local memory & stack. This is for cases * where you want a lot of trees, and don't want the overhead for each one. * Note, to clean these up, just do freez(&rbTree) rather than rbFreeTree(&rbTree). */ #endif /* RANGETREE_H */ rtracklayer/src/ucsc/rbTree.c0000644000175400017540000004220413556116552017251 0ustar00biocbuildbiocbuild/* rbTree - rbTreeRed-rbTreeBlack Tree - a type of binary tree which * automatically keeps relatively balanced during * inserts and deletions. * original author: Shane Saunders * adapted into local conventions: Jim Kent */ #include "common.h" #include "localmem.h" #include "rbTree.h" static struct rbTreeNode *restructure(struct rbTree *t, int tos, struct rbTreeNode *x, struct rbTreeNode *y, struct rbTreeNode *z) /* General restructuring function - checks for all * restructuring cases. Call when insert has messed up tree. * Sadly delete has to do even more work. */ { struct rbTreeNode *parent, *midNode; if(y == x->left) { if(z == y->left) { /* in-order: z, y, x */ midNode = y; y->left = z; x->left = y->right; y->right = x; } else { /* in-order: y, z, x */ midNode = z; y->right = z->left; z->left = y; x->left = z->right; z->right = x; } } else { if(z == y->left) { /* in-order: x, z, y */ midNode = z; x->right = z->left; z->left = x; y->left = z->right; z->right = y; } else { /* in-order: x, y, z */ midNode = y; x->right = y->left; y->left = x; y->right = z; } } if(tos != 0) { parent = t->stack[tos-1]; if(x == parent->left) parent->left = midNode; else parent->right = midNode; } else t->root = midNode; return midNode; } struct rbTree *rbTreeNewDetailed(int (*compare)(void *, void *), struct lm *lm, struct rbTreeNode *stack[128]) /* Allocate rbTree on an existing local memory & stack. This is for cases * where you want a lot of trees, and don't want the overhead for each one. * Note, to clean these up, just do freez(&rbTree) rather than rbFreeTree(&rbTree). */ { struct rbTree *t; AllocVar(t); t->root = NULL; t->compare = compare; t->lm = lm; t->stack = stack; t->n = 0; return t; } struct rbTree *rbTreeNew(int (*compare)(void *, void *)) /* rbTreeNew() - Allocates space for a red-black tree and returns a pointer * to it. The function compare compares they keys of two items, and returns a * negative, zero, or positive integer depending on whether the first item is * less than, equal to, or greater than the second. */ { /* The stack keeps us from having to keep explicit * parent, grandparent, greatgrandparent variables. * It needs to be big enough for the maximum depth * of tree. Since the whole point of rb trees is * that they are self-balancing, this is not all * that deep, just 2*log2(N). Therefore a stack of * 128 is good for up to 2^64 items in stack, which * should keep us for the next couple of decades... */ struct lm *lm = lmInit(0); struct rbTreeNode **stack = lmAlloc(lm, 128 * sizeof(stack[0])); return rbTreeNewDetailed(compare, lm, stack); } void rbTreeFree(struct rbTree **pTree) /* rbTreeFree() - Frees space used by the red-black tree pointed to by t. */ { struct rbTree *tree = *pTree; if (tree != NULL) { lmCleanup(&tree->lm); freez(pTree); } } void rbTreeFreeList(struct rbTree **pList) /* Free up a list of rbTrees. */ { struct rbTree *tree, *next; for (tree = *pList; tree != NULL; tree = next) { next = tree->next; rbTreeFree(&tree); } } void *rbTreeAdd(struct rbTree *t, void *item) /* rbTreeAdd() - Inserts an item into the red-black tree pointed to by t, * according the the value its key. The key of an item in the red-black * tree must be unique among items in the tree. If an item with the same key * already exists in the tree, a pointer to that item is returned. Otherwise, * NULL is returned, indicating insertion was successful. */ { struct rbTreeNode *x, *p, *q, *m, **attachX; int (* compare)(void *, void *); int cmpResult; rbTreeColor col; struct rbTreeNode **stack = NULL; int tos; tos = 0; if((p = t->root) != NULL) { compare = t->compare; stack = t->stack; /* Repeatedly explore either the left branch or the right branch * depending on the value of the key, until an empty branch is chosen. */ for(;;) { stack[tos++] = p; cmpResult = compare(item, p->item); if(cmpResult < 0) { p = p->left; if(!p) { p = stack[--tos]; attachX = &p->left; break; } } else if(cmpResult > 0) { p = p->right; if(!p) { p = stack[--tos]; attachX = &p->right; break; } } else { return p->item; } } col = rbTreeRed; } else { attachX = &t->root; col = rbTreeBlack; } /* Allocate new node and place it in tree. */ if ((x = t->freeList) != NULL) t->freeList = x->right; else lmAllocVar(t->lm, x); x->left = x->right = NULL; x->item = item; x->color = col; *attachX = x; t->n++; /* Restructuring or recolouring will be needed if node x and its parent, p, * are both red. */ if(tos > 0) { while(p->color == rbTreeRed) { /* Double red problem. */ /* Obtain a pointer to p's parent, m, and sibling, q. */ m = stack[--tos]; q = p == m->left ? m->right : m->left; /* Determine whether restructuring or recolouring is needed. */ if(!q || q->color == rbTreeBlack) { /* Sibling is black. ==> Perform restructuring. */ /* Restructure according to the left to right order, of nodes * m, p, and x. */ m = restructure(t, tos, m, p, x); m->color = rbTreeBlack; m->left->color = m->right->color = rbTreeRed; /* Restructuring eliminates the double red problem. */ break; } /* else just need to flip color */ /* Sibling is also red. ==> Perform recolouring. */ p->color = rbTreeBlack; q->color = rbTreeBlack; if(tos == 0) break; /* The root node always remains black. */ m->color = rbTreeRed; /* Continue, checking colouring higher up. */ x = m; p = stack[--tos]; } } return NULL; } void *rbTreeFind(struct rbTree *t, void *item) /* rbTreeFind() - Find an item in the red-black tree with the same key as the * item pointed to by `item'. Returns a pointer to the item found, or NULL * if no item was found. */ { struct rbTreeNode *p, *nextP; int (*compare)(void *, void *) = t->compare; int cmpResult; /* Repeatedly explore either the left or right branch, depending on the * value of the key, until the correct item is found. */ for (p = t->root; p != NULL; p = nextP) { cmpResult = compare(item, p->item); if(cmpResult < 0) nextP = p->left; else if(cmpResult > 0) nextP = p->right; else return p->item; } return NULL; } void *rbTreeRemove(struct rbTree *t, void *item) /* rbTreeRemove() - Delete an item in the red-black tree with the same key as * the item pointed to by `item'. Returns a pointer to the deleted item, * and NULL if no item was found. */ { struct rbTreeNode *p, *r, *x, *y, *z, *b, *newY; struct rbTreeNode *m; rbTreeColor removeCol; void *returnItem; int (* compare)(void *, void *); int cmpResult; struct rbTreeNode **stack; int i, tos; /* Attempt to locate the item to be deleted. */ if((p = t->root)) { compare = t->compare; stack = t->stack; tos = 0; for(;;) { stack[tos++] = p; cmpResult = compare(item, p->item); if(cmpResult < 0) p = p->left; else if(cmpResult > 0) p = p->right; else /* Item found. */ break; if(!p) return NULL; } } else return NULL; /* p points to the node to be deleted, and is currently on the top of the * stack. */ if(!p->left) { tos--; /* Adjust tos to remove p. */ /* Right child replaces p. */ if(tos == 0) { r = t->root = p->right; x = y = NULL; } else { x = stack[--tos]; if(p == x->left) { r = x->left = p->right; y = x->right; } else { r = x->right = p->right; y = x->left; } } removeCol = p->color; } else if(!p->right) { tos--; /* Adjust tos to remove p. */ /* Left child replaces p. */ if(tos == 0) { r = t->root = p->left; x = y = NULL; } else { x = stack[--tos]; if(p == x->left) { r = x->left = p->left; y = x->right; } else { r = x->right = p->left; y = x->left; } } removeCol = p->color; } else { /* Save p's stack position. */ i = tos-1; /* Minimum child, m, in the right subtree replaces p. */ m = p->right; do { stack[tos++] = m; m = m->left; } while(m); m = stack[--tos]; /* Update either the left or right child pointers of p's parent. */ if(i == 0) { t->root = m; } else { x = stack[i-1]; /* p's parent. */ if(p == x->left) { x->left = m; } else { x->right = m; } } /* Update the tree part m is removed from, and assign m the child * pointers of p (only if m is not the right child of p). */ stack[i] = m; /* Node m replaces node p on the stack. */ x = stack[--tos]; r = m->right; if(tos != i) { /* x is equal to the parent of m. */ y = x->right; x->left = r; m->right = p->right; } else { /* m was the right child of p, and x is equal to m. */ y = p->left; } m->left = p->left; /* We treat node m as the node which has been removed. */ removeCol = m->color; m->color = p->color; } /* Get return value and reuse the space used by node p. */ returnItem = p->item; p->right = t->freeList; t->freeList = p; t->n--; /* The pointers x, y, and r point to nodes which may be involved in * restructuring and recolouring. * x - the parent of the removed node. * y - the sibling of the removed node. * r - the node which replaced the removed node. * From the above code, the next entry off the stack will be the parent of * node x. */ /* The number of black nodes on paths to all external nodes (NULL child * pointers) must remain the same for all paths. Restructuring or * recolouring of nodes may be necessary to enforce this. */ if(removeCol == rbTreeBlack) { /* Removal of a black node requires some adjustment. */ if(!r || r->color == rbTreeBlack) { /* A black node replaced the deleted black node. Note that * external nodes (NULL child pointers) are always black, so * if r is NULL it is treated as a black node. */ /* This causes a double-black problem, since node r would need to * be coloured double-black in order for the black color on * paths through r to remain the same as for other paths. */ /* If r is the root node, the double-black color is not necessary * to maintain the color balance. Otherwise, some adjustment of * nearby nodes is needed in order to eliminate the double-black * problem. NOTE: x points to the parent of r. */ if(x) for(;;) { /* There are three adjustment cases: * 1. r's sibling, y, is black and has a red child, z. * 2. r's sibling, y, is black and has two black children. * 3. r's sibling, y, is red. */ if(y->color == rbTreeBlack) { /* Note the conditional evaluation for assigning z. */ if(((z = y->left) && z->color == rbTreeRed) || ((z = y->right) && z->color == rbTreeRed)) { /* Case 1: perform a restructuring of nodes x, y, and * z. */ b = restructure(t, tos, x, y, z); b->color = x->color; b->left->color = b->right->color = rbTreeBlack; break; } else { /* Case 2: recolour node y red. */ y->color = rbTreeRed; if(x->color == rbTreeRed) { x->color = rbTreeBlack; break; } /* else */ if(tos == 0) break; /* Root level reached. */ /* else */ r = x; x = stack[--tos]; /* x <- parent of x. */ y = x->left == r ? x->right : x->left; } } else { /* Case 3: Restructure nodes x, y, and z, where: * - If node y is the left child of x, then z is the left * child of y. Otherwise z is the right child of y. */ if(x->left == y) { newY = y->right; z = y->left; } else { newY = y->left; z = y->right; } restructure(t, tos, x, y, z); y->color = rbTreeBlack; x->color = rbTreeRed; /* Since x has moved down a place in the tree, and y is the * new the parent of x, the stack must be adjusted so that * the parent of x is correctly identified in the next call * to restructure(). */ stack[tos++] = y; /* After restructuring, node r has a black sibling, newY, * so either case 1 or case 2 applies. If case 2 applies * the double-black problem does not reappear. */ y = newY; /* Note the conditional evaluation for assigning z. */ if(((z = y->left) && z->color == rbTreeRed) || ((z = y->right) && z->color == rbTreeRed)) { /* Case 1: perform a restructuring of nodes x, y, and * z. */ b = restructure(t, tos, x, y, z); b->color = rbTreeRed; /* Since node x was red. */ b->left->color = b->right->color = rbTreeBlack; } else { /* Case 2: recolour node y red. */ /* Note that node y is black and node x is red. */ y->color = rbTreeRed; x->color = rbTreeBlack; } break; } } } else { /* A red node replaced the deleted black node. */ /* In this case we can simply color the red node black. */ r->color = rbTreeBlack; } } return returnItem; } /* Some variables to help recursively dump tree. */ static int dumpLevel; /* Indentation level. */ static FILE *dumpFile; /* Output file */ static void (*dumpIt)(void *item, FILE *f); /* Item dumper. */ static void rTreeDump(struct rbTreeNode *n) /* Recursively dump. */ { if (n == NULL) return; spaceOut(dumpFile, ++dumpLevel * 3); fprintf(dumpFile, "%c ", (n->color == rbTreeRed ? 'r' : 'b')); dumpIt(n->item, dumpFile); fprintf(dumpFile, "\n"); rTreeDump(n->left); rTreeDump(n->right); --dumpLevel; } void rbTreeDump(struct rbTree *tree, FILE *f, void (*dumpItem)(void *item, FILE *f)) /* Dump out rb tree to file, mostly for debugging. */ { dumpFile = f; dumpLevel = 0; dumpIt = dumpItem; fprintf(f, "rbTreeDump\n"); rTreeDump(tree->root); } /* Variables to help recursively traverse tree. */ static void (*doIt)(void *item); static void *minIt, *maxIt; static int (*compareIt)(void *, void *); static void rTreeTraverseRange(struct rbTreeNode *n) /* Recursively traverse tree in range applying doIt. */ { if (n != NULL) { int minCmp = compareIt(n->item, minIt); int maxCmp = compareIt(n->item, maxIt); if (minCmp >= 0) rTreeTraverseRange(n->left); if (minCmp >= 0 && maxCmp <= 0) doIt(n->item); if (maxCmp <= 0) rTreeTraverseRange(n->right); } } static void rTreeTraverse(struct rbTreeNode *n) /* Recursively traverse full tree applying doIt. */ { if (n != NULL) { rTreeTraverse(n->left); doIt(n->item); rTreeTraverse(n->right); } } void rbTreeTraverseRange(struct rbTree *tree, void *minItem, void *maxItem, void (*doItem)(void *item)) /* Apply doItem function to all items in tree such that * minItem <= item <= maxItem */ { doIt = doItem; minIt = minItem; maxIt = maxItem; compareIt = tree->compare; rTreeTraverseRange(tree->root); } void rbTreeTraverse(struct rbTree *tree, void (*doItem)(void *item)) /* Apply doItem function to all items in tree */ { doIt = doItem; rTreeTraverse(tree->root); } struct rTreeContext /* Context for traversing a tree when you want to be fully thread safe and reentrant. */ { void *context; /* Some context carried from user and passed to doIt. */ void (*doItem)(void *item, void *context); }; static void rTreeTraverseWithContext(struct rbTreeNode *n, struct rTreeContext *context) /* Traverse tree with a little context so don't need little static variables that * prevent reentrancy of callback functions. */ { if (n != NULL) { rTreeTraverseWithContext(n->left, context); context->doItem(n->item, context->context); rTreeTraverseWithContext(n->right, context); } } void rbTreeTraverseWithContext(struct rbTree *tree, void (*doItem)(void *item, void *context), void *context) /* Traverse tree calling doItem on every item with context pointer passed through to doItem. * This often avoids having to declare global or static variables for the doItem callback to use. */ { struct rTreeContext ctx; ctx.context = context; ctx.doItem = doItem; rTreeTraverseWithContext(tree->root, &ctx); } struct slRef *itList; /* List of items that rbTreeItemsInRange returns. */ static void addRef(void *item) /* Add item it itList. */ { refAdd(&itList, item); } struct slRef *rbTreeItemsInRange(struct rbTree *tree, void *minItem, void *maxItem) /* Return a sorted list of references to items in tree between range. * slFreeList this list when done. */ { itList = NULL; rbTreeTraverseRange(tree, minItem, maxItem, addRef); slReverse(&itList); return itList; } static void addRefWithContext(void *item, void *context) /* Add item it itList. */ { struct slRef **pList = context; refAdd(pList, item); } struct slRef *rbTreeItems(struct rbTree *tree) /* Return sorted list of items. slFreeList this when done.*/ { struct slRef *list = NULL; rbTreeTraverseWithContext(tree, addRefWithContext, &list); slReverse(&list); return list; } int rbTreeCmpString(void *a, void *b) /* Set up rbTree so as to work on strings. */ { return strcmp(a, b); } int rbTreeCmpWord(void *a, void *b) /* Set up rbTree so as to work on case-insensitive strings. */ { return differentWord(a,b); } rtracklayer/src/ucsc/rbTree.h0000644000175400017540000000773013556116552017263 0ustar00biocbuildbiocbuild/* rbTree - rbTreeRed-rbTreeBlack Tree - a type of binary tree which * automatically keeps relatively balanced during * inserts and deletions. * original author: Shane Saunders * adapted into local conventions: Jim Kent */ #ifndef RBTREE_H #define RBTREE_H typedef enum {rbTreeRed,rbTreeBlack} rbTreeColor; /* Structure type for nodes in the red-black tree. */ struct rbTreeNode { struct rbTreeNode *left, *right; /* Children. */ rbTreeColor color; /* Heart of algorithm. */ void *item; /* Item stored in tree */ }; /* Structure type for the red-black tree. */ struct rbTree { struct rbTree *next; /* Next tree in list. */ struct rbTreeNode *root; /* Root of tree */ int n; /* Number of items in tree. */ int (* compare)(void *, void *);/* Comparison function */ struct rbTreeNode **stack; /* Ancestor stack. */ struct lm *lm; /* Local memory pool. */ struct rbTreeNode *freeList; /* List of nodes to reuse. */ }; struct rbTree *rbTreeNew(int (*compare)(void *, void *)); /* Allocates space for a red-black tree and returns a pointer * to it. The function compare compares they keys of two items, and returns a * negative, zero, or positive integer depending on whether the first item is * less than, equal to, or greater than the second. */ void rbTreeFree(struct rbTree **pTree); /* Frees space used by the red-black tree pointed to by t. */ void rbTreeFreeList(struct rbTree **pList); /* Free up a list of rbTrees. */ struct rbTree *rbTreeNewDetailed(int (*compare)(void *, void *), struct lm *lm, struct rbTreeNode *stack[128]); /* Allocate rbTree on an existing local memory & stack. This is for cases * where you want a lot of trees, and don't want the overhead for each one. * Note, to clean these up, just do freez(&rbTree) rather than rbFreeTree(&rbTree). */ void *rbTreeAdd(struct rbTree *t, void *item); /* Inserts an item into the red-black tree pointed to by t, * according the the value its key. The key of an item in the red-black * tree must be unique among items in the tree. If an item with the same key * already exists in the tree, a pointer to that item is returned. Otherwise, * NULL is returned, indicating insertion was successful. */ void *rbTreeFind(struct rbTree *t, void *item); /* Find an item in the red-black tree with the same key as the * item pointed to by `item'. Returns a pointer to the item found, or NULL * if no item was found. */ void *rbTreeRemove(struct rbTree *t, void *item); /* rbTreeRemove() - Delete an item in the red-black tree with the same key as * the item pointed to by `item'. Returns a pointer to the deleted item, * and NULL if no item was found. */ void rbTreeTraverseRange(struct rbTree *tree, void *minItem, void *maxItem, void (*doItem)(void *item)); /* Apply doItem function to all items in tree such that * minItem <= item <= maxItem */ struct slRef *rbTreeItemsInRange(struct rbTree *tree, void *minItem, void *maxItem); /* Return a sorted list of references to items in tree between range. * slFreeList this list when done. */ void rbTreeTraverse(struct rbTree *tree, void (*doItem)(void *item)); /* Apply doItem function to all items in tree */ void rbTreeTraverseWithContext(struct rbTree *tree, void (*doItem)(void *item, void *context), void *context); /* Traverse tree calling doItem on every item with context pointer passed through to doItem. * This often avoids having to declare global or static variables for the doItem callback to use. */ struct slRef *rbTreeItems(struct rbTree *tree); /* Return sorted list of items. slFreeList this when done.*/ void rbTreeDump(struct rbTree *tree, FILE *f, void (*dumpItem)(void *item, FILE *f)); /* Dump out rb tree to file, mostly for debugging. */ int rbTreeCmpString(void *a, void *b); /* Set up rbTree so as to work on strings. */ int rbTreeCmpWord(void *a, void *b); /* Set up rbTree so as to work on case-insensitive strings. */ #endif /* RBTREE_H */ rtracklayer/src/ucsc/sig.h0000644000175400017540000000625213556116552016620 0ustar00biocbuildbiocbuild/***************************************************************************** * Copyright (C) 2000 Jim Kent. This source code may be freely used * * for personal, academic, and non-profit purposes. Commercial use * * permitted only by explicit agreement with Jim Kent (jim_kent@pacbell.net) * *****************************************************************************/ /* Sig.h - signatures that start various binary files. */ #ifndef SIG_H #define SIG_H #define aliSig 0xCDAB8245 /* Binary alignment file. */ #define alxSig 0xA1B1C1D3 /* Index into binary alignment file, sorted by start base offset. */ #define pgoSig 0x690 /* Index into GDF file, sorted by start base offset. Signature is 32 bit. */ #define cdoSig 0xCD01 /* Index into c2g text file, sorted by start base offset. 32 bit signature. */ #define xaoSig 0xA0B0C0D0 /* Index into xeno alignment, sorted by start base offset. 32 bit signature. */ #define glSig 0xF1E2D3C4 /* Binary gene file, sorted by chromosome and then starting offset. */ /* IX sig is int ixSig[4] = {0x693F8ED1, 0x7EDA1C32, 0x4BA58983, 0x277CB89C,}; * These are made by snofMake, and are indexes sorted by name. */ /* XI - same as IX but on big-endian (or is it little-endian) archetectures. */ #define nt4Signature 0x12345678 /* Signature at the beginning of an nt4 file - 2 bit a nucleotide binary file. */ #define lm2Signature 0x12131416 /* Signature at the beginning of a lm2 file - a 2nd order markov model for nucleotides. */ #define oocSig 0x584155f2 /* Signature of file that contains over-represented oligomers for patSpace * algorithm. */ #define oocSigSwapped 0xf2554158 /* Signature of file that contains over-represented oligomers for patSpace * algorithm. */ #define fofSig 0x13410da8 /* Signature into fof type index file (that can index multiple external files). */ #define nibSig 0x6BE93D3A /* Signature into nib file (4 bits per nucleotide DNA file) */ #define qacSig 0x32b67998 /* Signature of qac file (compressed quality file) */ #define caqSig 0x9879b632 /* Signature of byte-swapped qac file. */ #define twoBitSig 0x1A412743 /* Signature into 2bit file (2 bits per nucleotide DNA file) plus * information on N and masked bases. */ #define twoBitSwapSig 0x4327411A /* Signature of byte-swapped two-bit file. */ #define chromGraphSig 0x4528421C /* Signature of chromGraph binary data file */ #define chromGraphSwapSig 0x1C422845 /* Signature of byte-swapped chromGraph binary data file */ #define genomeRangeTreeSig 0xf7fb8104 /* Signature of genomeRangeTree binary data file */ #define genomeRangeTreeSwapSig 0x0481fbf7 /* Signature of genomeRangeTree binary data file */ #define bptSig 0x78CA8C91 /* Signature of generic b+ tree index file. */ #define bptSwapped 0x918CCA78 /* Signature of generic b+ tree index file. */ #define cirTreeSig 0x2468ACE0 /* Signature of a chromosome id r-tree index file. */ #define crTreeSig 0x2369ADE1 /* Signature of a chromosome r-tree index file. */ #define bigWigSig 0x888FFC26 /* Signature for a big wig file. */ #define bigBedSig 0x8789F2EB /* Signature for a big bed file. */ #define udcBitmapSig 0x4187E2F6 /* Signature for a url data cache bitmap file. */ #endif /* SIG_H */ rtracklayer/src/ucsc/sqlNum.c0000644000175400017540000001504213556116552017305 0ustar00biocbuildbiocbuild/* sqlnum.c - Routines to convert from ascii to integer * representation of numbers. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include "common.h" #include "sqlNum.h" /* The sqlInList functions allow for fast thread-safe processing of dynamic arrays in sqlList */ unsigned sqlUnsigned(char *s) /* Convert series of digits to unsigned integer about * twice as fast as atoi (by not having to skip white * space or stop except at the null byte.) */ { unsigned res = 0; char *p = s; char c; while (((c = *(p++)) >= '0') && (c <= '9')) { res *= 10; res += c - '0'; } --p; /* test for invalid character or empty */ if ((c != '\0') || (p == s)) errAbort("invalid unsigned integer: \"%s\"", s); return res; } unsigned sqlUnsignedInList(char **pS) /* Convert series of digits to unsigned integer about * twice as fast as atoi (by not having to skip white * space or stop except at the null byte.) * All of string is number. Number may be delimited by a comma. * Returns the position of the delimiter or the terminating 0. */ { char *s = *pS; unsigned res = 0; char *p = s; char c; while (((c = *(p++)) >= '0') && (c <= '9')) { res *= 10; res += c - '0'; } --p; if (!(c == '\0' || c == ',') || (p == s)) { char *e = strchr(s, ','); if (e) *e = 0; errAbort("invalid unsigned integer: \"%s\"", s); } *pS = p; return res; } unsigned long sqlUnsignedLong(char *s) /* Convert series of digits to unsigned long about * twice as fast as atol (by not having to skip white * space or stop except at the null byte.) */ { unsigned long res = 0; char *p = s; char c; while (((c = *(p++)) >= '0') && (c <= '9')) { res *= 10; res += c - '0'; } --p; if ((c != '\0') || (p == s)) errAbort("invalid unsigned long: \"%s\"", s); return res; } unsigned long sqlUnsignedLongInList(char **pS) /* Convert series of digits to unsigned long about * twice as fast as atol (by not having to skip white * space or stop except at the null byte.) * All of string is number. Number may be delimited by a comma. * Returns the position of the delimiter or the terminating 0. */ { char *s = *pS; unsigned long res = 0; char *p = s; char c; while (((c = *(p++)) >= '0') && (c <= '9')) { res *= 10; res += c - '0'; } --p; if (!(c == '\0' || c == ',') || (p == s)) { char *e = strchr(s, ','); if (e) *e = 0; errAbort("invalid unsigned long: \"%s\"", s); } *pS = p; return res; } int sqlSigned(char *s) /* Convert string to signed integer. Unlike atol assumes * all of string is number. */ { int res = 0; char *p, *p0 = s; if (*p0 == '-') p0++; p = p0; while ((*p >= '0') && (*p <= '9')) { res *= 10; res += *p - '0'; p++; } /* test for invalid character, empty, or just a minus */ if ((*p != '\0') || (p == p0)) errAbort("invalid signed integer: \"%s\"", s); if (*s == '-') return -res; else return res; } int sqlSignedInList(char **pS) /* Convert string to signed integer. Unlike atol assumes * all of string is number. Number may be delimited by a comma. * Returns the position of the delimiter or the terminating 0. */ { char *s = *pS; int res = 0; char *p, *p0 = s; if (*p0 == '-') p0++; p = p0; while ((*p >= '0') && (*p <= '9')) { res *= 10; res += *p - '0'; p++; } /* test for invalid character, empty, or just a minus */ if (!(*p == '\0' || *p == ',') || (p == p0)) { char *e = strchr(s, ','); if (e) *e = 0; errAbort("invalid signed integer: \"%s\"", s); } *pS = p; if (*s == '-') return -res; else return res; } long long sqlLongLong(char *s) /* Convert string to a long long. Unlike atol assumes all of string is * number. */ { long long res = 0; char *p, *p0 = s; if (*p0 == '-') p0++; p = p0; while ((*p >= '0') && (*p <= '9')) { res *= 10; res += *p - '0'; p++; } /* test for invalid character, empty, or just a minus */ if ((*p != '\0') || (p == p0)) errAbort("invalid signed long long: \"%s\"", s); if (*s == '-') return -res; else return res; } long long sqlLongLongInList(char **pS) /* Convert string to a long long. Unlike atol, assumes * all of string is number. Number may be delimited by a comma. * Returns the position of the delimiter or the terminating 0. */ { char *s = *pS; long long res = 0; char *p, *p0 = s; if (*p0 == '-') p0++; p = p0; while ((*p >= '0') && (*p <= '9')) { res *= 10; res += *p - '0'; p++; } /* test for invalid character, empty, or just a minus */ if (!(*p == '\0' || *p == ',') || (p == p0)) { char *e = strchr(s, ','); if (e) *e = 0; errAbort("invalid signed long long: \"%s\"", s); } *pS = p; if (*s == '-') return -res; else return res; } float sqlFloat(char *s) /* Convert string to a float. Assumes all of string is number * and aborts on an error. */ { char* end; /* used to have an ifdef here to use strtof() but that doesn't * actually exist on all systems and since strtod() does, may as * well use it since it will do the job here. */ float val = (float) strtod(s, &end); if ((end == s) || (*end != '\0')) errAbort("invalid float: %s", s); return val; } float sqlFloatInList(char **pS) /* Convert string to a float. Assumes all of string is number * and aborts on an error. * Number may be delimited by a comma. * Returns the position of the delimiter or the terminating 0. */ { char *s = *pS; char* end; /* used to have an ifdef here to use strtof() but that doesn't * actually exist on all systems and since strtod() does, may as * well use it since it will do the job here. */ float val = (float) strtod(s, &end); if ((end == s) || !(*end == '\0' || *end == ',')) { char *e = strchr(s, ','); if (e) *e = 0; errAbort("invalid float: %s", s); } *pS = end; return val; } double sqlDouble(char *s) /* Convert string to a double. Assumes all of string is number * and aborts on an error. */ { char* end; double val = strtod(s, &end); if ((end == s) || (*end != '\0')) errAbort("invalid double: %s", s); return val; } double sqlDoubleInList(char **pS) /* Convert string to a double. Assumes all of string is number * and aborts on an error. * Number may be delimited by a comma. * Returns the position of the delimiter or the terminating 0. */ { char *s = *pS; char* end; double val = strtod(s, &end); if ((end == s) || !(*end == '\0' || *end == ',')) { char *e = strchr(s, ','); if (e) *e = 0; errAbort("invalid double: %s", s); } *pS = end; return val; } rtracklayer/src/ucsc/sqlNum.h0000644000175400017540000000611613556116552017314 0ustar00biocbuildbiocbuild/* sqlNum.h - routines to convert from ascii to * unsigned/integer a bit more quickly than atoi. * Called sqlNum because it was first developed for use with * SQL databases, which tend to require a lot of conversion from * string to binary representation of numbers. In particular the * code generator AutoSQL puts in lots of calls to these routines * into it's parsers. Other parser in the source tree have come * to use these too though since they are fast and have good error * checking. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #ifndef SQLNUM_H #define SQLNUM_H /* get off_t */ #include unsigned sqlUnsigned(char *s); /* Convert series of digits to unsigned integer about * twice as fast as atoi (by not having to skip white * space or stop except at the null byte.) */ unsigned sqlUnsignedInList(char **pS); /* Convert series of digits to unsigned integer about * twice as fast as atoi (by not having to skip white * space or stop except at the null byte.) * All of string is number. Number may be delimited by a comma. * Returns the position of the delimiter or the terminating 0. */ unsigned long sqlUnsignedLong(char *s); /* Convert series of digits to unsigned long about * twice as fast as atol (by not having to skip white * space or stop except at the null byte.) */ unsigned long sqlUnsignedLongInList(char **pS); /* Convert series of digits to unsigned long about * twice as fast as atol (by not having to skip white * space or stop except at the null byte.) * All of string is number. Number may be delimited by a comma. * Returns the position of the delimiter or the terminating 0. */ int sqlSigned(char *s); /* Convert string to signed integer. Unlike atol assumes * all of string is number. */ int sqlSignedInList(char **pS); /* Convert string to signed integer. Unlike atol assumes * all of string is number. Number may be delimited by a comma. * Returns the position of the delimiter or the terminating 0. */ long long sqlLongLong(char *s); /* Convert string to a long long. Unlike atol assumes all of string is * number. */ long long sqlLongLongInList(char **pS); /* Convert string to a long long. Unlike atol, assumes * all of string is number. Number may be delimited by a comma. * Returns the position of the delimiter or the terminating 0. */ float sqlFloat(char *s); /* Convert string to a float. Assumes all of string is number * and aborts on an error. */ float sqlFloatInList(char **pS); /* Convert string to a float. Assumes all of string is number * and aborts on an error. * Number may be delimited by a comma. * Returns the position of the delimiter or the terminating 0. */ double sqlDouble(char *s); /* Convert string to a double. Assumes all of string is number * and aborts on an error. */ double sqlDoubleInList(char **pS); /* Convert string to a double. Assumes all of string is number * and aborts on an error. * Number may be delimited by a comma. * Returns the position of the delimiter or the terminating 0. */ #endif /* SQLNUM_H */ rtracklayer/src/ucsc/twoBit.c0000644000175400017540000007304413556116552017304 0ustar00biocbuildbiocbuild/* Copyright (C) 2014 The Regents of the University of California * See README in this or parent directory for licensing information. */ #include "common.h" #include "hash.h" #include "dnaseq.h" #include "dnautil.h" #include "sig.h" #include "localmem.h" #include "linefile.h" #include "obscure.h" #include "bPlusTree.h" #include "twoBit.h" #include "udc.h" #include "net.h" #include "portable.h" #include /* following are the wrap functions for the UDC and stdio functoins * that read twoBit files. All of these are to get around the C compiler * complaining about the automatic cast of a void * to FILE * or * struct udcFile *. */ /* first the UDC wrappers */ static void udcSeekCurWrap(void *file, bits64 offset) { udcSeekCur((struct udcFile *)file, offset); } static void udcSeekWrap(void *file, bits64 offset) { udcSeek((struct udcFile *)file, offset); } static void udcMustReadWrap(void *file, void *buf, size_t size) { udcMustRead((struct udcFile *)file, buf, size); } static void udcFileCloseWrap(void *pFile) { udcFileClose((struct udcFile **)pFile); } static bits32 udcReadBits32Wrap(void *f, boolean isSwapped) { return udcReadBits32((struct udcFile *)f, isSwapped); } static boolean udcFastReadStringWrap(void *f, char buf[256]) { return udcFastReadString((struct udcFile *)f, buf); } /* now the stdio wrappers */ static void seekCurWrap(void *file, bits64 offset) { fseek((FILE *)file, offset, SEEK_CUR); } static void seekWrap(void *file, bits64 offset) { fseek((FILE *)file, offset, SEEK_SET); } static void mustReadWrap(void *file, void *buf, size_t size) { mustRead((FILE *)file, buf, size); } static void fileCloseWrap(void *pFile) { carefulClose((FILE **)pFile); } static bits32 readBits32Wrap(void *f, boolean isSwapped) { return readBits32((FILE *)f, isSwapped); } static boolean fastReadStringWrap(void *f, char buf[256]) { return fastReadString((FILE *)f, buf); } static void setFileFuncs( struct twoBitFile *tbf, boolean useUdc) /* choose the proper function pointers depending on whether * this open twoBit is using stdio or UDC */ { if (useUdc) { tbf->ourSeekCur = udcSeekCurWrap; tbf->ourSeek = udcSeekWrap; tbf->ourReadBits32 = udcReadBits32Wrap; tbf->ourFastReadString = udcFastReadStringWrap; tbf->ourClose = udcFileCloseWrap; tbf->ourMustRead = udcMustReadWrap; } else { tbf->ourSeekCur = seekCurWrap; tbf->ourSeek = seekWrap; tbf->ourReadBits32 = readBits32Wrap; tbf->ourFastReadString = fastReadStringWrap; tbf->ourClose = fileCloseWrap; tbf->ourMustRead = mustReadWrap; } } static int countBlocksOfN(char *s, int size) /* Count number of blocks of N's (or n's) in s. */ { int i; boolean isN, lastIsN = FALSE; char c; int blockCount = 0; for (i=0; i> 2); } struct twoBit *twoBitFromDnaSeq(struct dnaSeq *seq, boolean doMask) /* Convert dnaSeq representation in memory to twoBit representation. * If doMask is true interpret lower-case letters as masked. */ { int ubyteSize = packedSize(seq->size); UBYTE *pt; struct twoBit *twoBit; DNA last4[4]; /* Holds few bases. */ DNA *dna; int i, end; /* Allocate structure and fill in name. */ AllocVar(twoBit); pt = AllocArray(twoBit->data, ubyteSize); twoBit->name = cloneString(seq->name); twoBit->size = seq->size; /* Convert to 4-bases per byte representation. */ dna = seq->dna; end = seq->size - 4; for (i=0; isize-i); *pt = packDna4(last4); /* Deal with blocks of N. */ twoBit->nBlockCount = countBlocksOfN(dna, seq->size); if (twoBit->nBlockCount > 0) { AllocArray(twoBit->nStarts, twoBit->nBlockCount); AllocArray(twoBit->nSizes, twoBit->nBlockCount); storeBlocksOfN(dna, seq->size, twoBit->nStarts, twoBit->nSizes); } /* Deal with masking */ if (doMask) { twoBit->maskBlockCount = countBlocksOfLower(dna, seq->size); if (twoBit->maskBlockCount > 0) { AllocArray(twoBit->maskStarts, twoBit->maskBlockCount); AllocArray(twoBit->maskSizes, twoBit->maskBlockCount); storeBlocksOfLower(dna, seq->size, twoBit->maskStarts, twoBit->maskSizes); } } return twoBit; } static int twoBitSizeInFile(struct twoBit *twoBit) /* Figure out size structure will take in file. */ { return packedSize(twoBit->size) + sizeof(twoBit->size) + sizeof(twoBit->nBlockCount) + sizeof(twoBit->nStarts[0]) * twoBit->nBlockCount + sizeof(twoBit->nSizes[0]) * twoBit->nBlockCount + sizeof(twoBit->maskBlockCount) + sizeof(twoBit->maskStarts[0]) * twoBit->maskBlockCount + sizeof(twoBit->maskSizes[0]) * twoBit->maskBlockCount + sizeof(twoBit->reserved); } void twoBitWriteOne(struct twoBit *twoBit, FILE *f) /* Write out one twoBit sequence to binary file. * Note this does not include the name, which is * stored only in index. */ { writeOne(f, twoBit->size); writeOne(f, twoBit->nBlockCount); if (twoBit->nBlockCount > 0) { fwrite(twoBit->nStarts, sizeof(twoBit->nStarts[0]), twoBit->nBlockCount, f); fwrite(twoBit->nSizes, sizeof(twoBit->nSizes[0]), twoBit->nBlockCount, f); } writeOne(f, twoBit->maskBlockCount); if (twoBit->maskBlockCount > 0) { fwrite(twoBit->maskStarts, sizeof(twoBit->maskStarts[0]), twoBit->maskBlockCount, f); fwrite(twoBit->maskSizes, sizeof(twoBit->maskSizes[0]), twoBit->maskBlockCount, f); } writeOne(f, twoBit->reserved); mustWrite(f, twoBit->data, packedSize(twoBit->size)); } void twoBitWriteHeader(struct twoBit *twoBitList, FILE *f) /* Write out header portion of twoBit file, including initial * index */ { bits32 sig = twoBitSig; bits32 version = 0; bits32 seqCount = slCount(twoBitList); bits32 reserved = 0; bits32 offset = 0; struct twoBit *twoBit; long long counter = 0; /* check for 32 bit overflow */ /* Write out fixed parts of header. */ writeOne(f, sig); writeOne(f, version); writeOne(f, seqCount); writeOne(f, reserved); /* Figure out location of first byte past index. * Each index entry contains 4 bytes of offset information * and the name of the sequence, which is variable length. */ offset = sizeof(sig) + sizeof(version) + sizeof(seqCount) + sizeof(reserved); for (twoBit = twoBitList; twoBit != NULL; twoBit = twoBit->next) { int nameLen = strlen(twoBit->name); if (nameLen > 255) errAbort("name %s too long", twoBit->name); offset += nameLen + 1 + sizeof(bits32); } /* Write out index. */ for (twoBit = twoBitList; twoBit != NULL; twoBit = twoBit->next) { int size = twoBitSizeInFile(twoBit); writeString(f, twoBit->name); writeOne(f, offset); offset += size; counter += (long long)size; if (counter > UINT_MAX ) errAbort("Error in faToTwoBit, index overflow at %s. The 2bit format " "does not support indexes larger than %dGb, \n" "please split up into smaller files.\n", twoBit->name, UINT_MAX/1000000000); } } void twoBitClose(struct twoBitFile **pTbf) /* Free up resources associated with twoBitFile. */ { struct twoBitFile *tbf = *pTbf; if (tbf != NULL) { freez(&tbf->fileName); (*tbf->ourClose)(&tbf->f); hashFree(&tbf->hash); /* The indexList is allocated out of the hash's memory pool. */ bptFileClose(&tbf->bpt); freez(pTbf); } } boolean twoBitSigRead(struct twoBitFile *tbf, boolean *isSwapped) /* read twoBit signature, return FALSE if not good * set isSwapped to TRUE if twoBit file is byte swapped */ { bits32 sig; *isSwapped = FALSE; (*tbf->ourMustRead)(tbf->f, &sig, sizeof(sig)); if (sig == twoBitSwapSig) *isSwapped = TRUE; else if (sig != twoBitSig) return FALSE; return TRUE; } static struct twoBitFile *getTbfAndOpen(char *fileName, boolean useUdc) { struct twoBitFile *tbf; AllocVar(tbf); setFileFuncs(tbf, useUdc); if (useUdc) tbf->f = udcFileOpen(fileName, NULL); else tbf->f = mustOpen(fileName, "rb"); return tbf; } static struct twoBitFile *twoBitOpenReadHeader(char *fileName, boolean useUdc) /* Open file, read in header but not index. * Squawk and die if there is a problem. */ { struct twoBitFile *tbf; boolean isSwapped = FALSE; tbf = getTbfAndOpen(fileName, useUdc); /* Allocate header verify signature, and read in * the constant-length bits. */ if (!twoBitSigRead(tbf, &isSwapped)) errAbort("%s doesn't have a valid twoBitSig", fileName); tbf->isSwapped = isSwapped; tbf->fileName = cloneString(fileName); tbf->version = (*tbf->ourReadBits32)(tbf->f, isSwapped); if (tbf->version != 0) { errAbort("Can only handle version 0 of this file. This is version %d", (int)tbf->version); } tbf->seqCount = (*tbf->ourReadBits32)(tbf->f, isSwapped); tbf->reserved = (*tbf->ourReadBits32)(tbf->f, isSwapped); return tbf; } struct twoBitFile *twoBitOpen(char *fileName) /* Open file, read in header and index. * Squawk and die if there is a problem. */ { boolean useUdc = FALSE; if (hasProtocol(fileName)) useUdc = TRUE; struct twoBitFile *tbf = twoBitOpenReadHeader(fileName, useUdc); struct twoBitIndex *index; boolean isSwapped = tbf->isSwapped; int i; struct hash *hash; void *f = tbf->f; /* Read in index. */ hash = tbf->hash = hashNew(digitsBaseTwo(tbf->seqCount)); for (i=0; iseqCount; ++i) { char name[256]; if (!(*tbf->ourFastReadString)(f, name)) errAbort("%s is truncated", fileName); lmAllocVar(hash->lm, index); index->offset = (*tbf->ourReadBits32)(f, isSwapped); hashAddSaveName(hash, name, index, &index->name); slAddHead(&tbf->indexList, index); } slReverse(&tbf->indexList); return tbf; } struct twoBitFile *twoBitOpenExternalBptIndex(char *twoBitName, char *bptName) /* Open file, read in header, but not regular index. Instead use * bpt index. Beware if you use this the indexList field will be NULL * as will the hash. */ { struct twoBitFile *tbf = twoBitOpenReadHeader(twoBitName, FALSE); tbf->bpt = bptFileOpen(bptName); if (tbf->seqCount != tbf->bpt->itemCount) errAbort("%s and %s don't have same number of sequences!", twoBitName, bptName); return tbf; } static int findGreatestLowerBound(int blockCount, bits32 *pos, int val) /* Find index of greatest element in posArray that is less * than or equal to val using a binary search. */ { int startIx=0, endIx=blockCount-1, midIx; int posVal; for (;;) { if (startIx == endIx) { posVal = pos[startIx]; if (posVal <= val || startIx == 0) return startIx; else return startIx-1; } midIx = ((startIx + endIx)>>1); posVal = pos[midIx]; if (posVal < val) startIx = midIx+1; else endIx = midIx; } } static void twoBitSeekTo(struct twoBitFile *tbf, char *name) /* Seek to start of named record. Abort if can't find it. */ { if (tbf->bpt) { bits32 offset; if (!bptFileFind(tbf->bpt, name, strlen(name), &offset, sizeof(offset))) errAbort("%s is not in %s", name, tbf->bpt->fileName); (*tbf->ourSeek)(tbf->f, offset); } else { struct twoBitIndex *index = hashFindVal(tbf->hash, name); if (index == NULL) errAbort("%s is not in %s", name, tbf->fileName); (*tbf->ourSeek)(tbf->f, index->offset); } } static void readBlockCoords(struct twoBitFile *tbf, boolean isSwapped, bits32 *retBlockCount, bits32 **retBlockStarts, bits32 **retBlockSizes) /* Read in blockCount, starts and sizes from file. (Same structure used for * both blocks of N's and masked blocks.) */ { bits32 blkCount = (*tbf->ourReadBits32)(tbf->f, isSwapped); *retBlockCount = blkCount; if (blkCount == 0) { *retBlockStarts = NULL; *retBlockSizes = NULL; } else { bits32 *nStarts, *nSizes; AllocArray(nStarts, blkCount); AllocArray(nSizes, blkCount); (*tbf->ourMustRead)(tbf->f, nStarts, sizeof(nStarts[0]) * blkCount); (*tbf->ourMustRead)(tbf->f, nSizes, sizeof(nSizes[0]) * blkCount); if (isSwapped) { int i; for (i=0; iisSwapped; struct twoBit *twoBit; AllocVar(twoBit); twoBit->name = cloneString(name); void *f = tbf->f; /* Find offset in index and seek to it */ twoBitSeekTo(tbf, name); /* Read in seqSize. */ twoBit->size = (*tbf->ourReadBits32)(f, isSwapped); /* Read in blocks of N. */ readBlockCoords(tbf, isSwapped, &(twoBit->nBlockCount), &(twoBit->nStarts), &(twoBit->nSizes)); /* Read in masked blocks. */ readBlockCoords(tbf, isSwapped, &(twoBit->maskBlockCount), &(twoBit->maskStarts), &(twoBit->maskSizes)); /* Reserved word. */ twoBit->reserved = (*tbf->ourReadBits32)(f, isSwapped); /* Read in data. */ packByteCount = packedSize(twoBit->size); twoBit->data = needLargeMem(packByteCount); (*tbf->ourMustRead)(f, twoBit->data, packByteCount); return twoBit; } struct twoBit *twoBitFromFile(char *fileName) /* Get twoBit list of all sequences in twoBit file. */ { struct twoBitFile *tbf = twoBitOpen(fileName); struct twoBitIndex *index; struct twoBit *twoBitList = NULL; for (index = tbf->indexList; index != NULL; index = index->next) { struct twoBit *twoBit = twoBitOneFromFile(tbf, index->name); slAddHead(&twoBitList, twoBit); } twoBitClose(&tbf); slReverse(&twoBitList); return twoBitList; } void twoBitFree(struct twoBit **pTwoBit) /* Free up a two bit structure. */ { struct twoBit *twoBit = *pTwoBit; if (twoBit != NULL) { freeMem(twoBit->nStarts); freeMem(twoBit->nSizes); freeMem(twoBit->maskStarts); freeMem(twoBit->maskSizes); freeMem(twoBit->data); freez(pTwoBit); } } void twoBitFreeList(struct twoBit **pList) /* Free a list of dynamically allocated twoBit's */ { struct twoBit *el, *next; for (el = *pList; el != NULL; el = next) { next = el->next; twoBitFree(&el); } *pList = NULL; } struct dnaSeq *twoBitReadSeqFragExt(struct twoBitFile *tbf, char *name, int fragStart, int fragEnd, boolean doMask, int *retFullSize) /* Read part of sequence from .2bit file. To read full * sequence call with start=end=0. Sequence will be lower * case if doMask is false, mixed case (repeats in lower) * if doMask is true. */ { struct dnaSeq *seq; bits32 seqSize; bits32 nBlockCount, maskBlockCount; bits32 *nStarts = NULL, *nSizes = NULL; bits32 *maskStarts = NULL, *maskSizes = NULL; boolean isSwapped = tbf->isSwapped; void *f = tbf->f; int i; int packByteCount, packedStart, packedEnd, remainder, midStart, midEnd; int outSize; UBYTE *packed, *packedAlloc; DNA *dna; /* Find offset in index and seek to it */ dnaUtilOpen(); twoBitSeekTo(tbf, name); /* Read in seqSize. */ seqSize = (*tbf->ourReadBits32)(f, isSwapped); if (fragEnd == 0) fragEnd = seqSize; if (fragEnd > seqSize) errAbort("twoBitReadSeqFrag in %s end (%d) >= seqSize (%d)", name, fragEnd, seqSize); outSize = fragEnd - fragStart; if (outSize < 1) errAbort("twoBitReadSeqFrag in %s start (%d) >= end (%d)", name, fragStart, fragEnd); /* Read in blocks of N. */ readBlockCoords(tbf, isSwapped, &nBlockCount, &nStarts, &nSizes); /* Read in masked blocks. */ readBlockCoords(tbf, isSwapped, &maskBlockCount, &maskStarts, &maskSizes); /* Skip over reserved word. */ (*tbf->ourReadBits32)(f, isSwapped); /* Allocate dnaSeq, and fill in zero tag at end of sequence. */ AllocVar(seq); if (outSize == seqSize) seq->name = cloneString(name); else { char buf[256*2]; safef(buf, sizeof(buf), "%s:%d-%d", name, fragStart, fragEnd); seq->name = cloneString(buf); } seq->size = outSize; dna = seq->dna = needLargeMem(outSize+1); seq->dna[outSize] = 0; /* Skip to bits we need and read them in. */ packedStart = (fragStart>>2); packedEnd = ((fragEnd+3)>>2); packByteCount = packedEnd - packedStart; packed = packedAlloc = needLargeMem(packByteCount); (*tbf->ourSeekCur)(f, packedStart); (*tbf->ourMustRead)(f, packed, packByteCount); /* Handle case where everything is in one packed byte */ if (packByteCount == 1) { int pOff = (packedStart<<2); int pStart = fragStart - pOff; int pEnd = fragEnd - pOff; UBYTE partial = *packed; assert(pEnd <= 4); assert(pStart >= 0); for (i=pStart; i> (6-i-i)) & 3]; } else { /* Handle partial first packed byte. */ midStart = fragStart; remainder = (fragStart&3); if (remainder > 0) { UBYTE partial = *packed++; int partCount = 4 - remainder; for (i=partCount-1; i>=0; --i) { dna[i] = valToNt[partial&3]; partial >>= 2; } midStart += partCount; dna += partCount; } /* Handle middle bytes. */ remainder = fragEnd&3; midEnd = fragEnd - remainder; for (i=midStart; i>= 2; dna[2] = valToNt[b&3]; b >>= 2; dna[1] = valToNt[b&3]; b >>= 2; dna[0] = valToNt[b&3]; dna += 4; } if (remainder >0) { UBYTE part = *packed; part >>= (8-remainder-remainder); for (i=remainder-1; i>=0; --i) { dna[i] = valToNt[part&3]; part >>= 2; } } } freez(&packedAlloc); if (nBlockCount > 0) { int startIx = findGreatestLowerBound(nBlockCount, nStarts, fragStart); for (i=startIx; i= fragEnd) break; if (s < fragStart) s = fragStart; if (e > fragEnd) e = fragEnd; if (s < e) memset(seq->dna + s - fragStart, 'n', e - s); } } if (doMask) { toUpperN(seq->dna, seq->size); if (maskBlockCount > 0) { int startIx = findGreatestLowerBound(maskBlockCount, maskStarts, fragStart); for (i=startIx; i= fragEnd) break; if (s < fragStart) s = fragStart; if (e > fragEnd) e = fragEnd; if (s < e) toLowerN(seq->dna + s - fragStart, e - s); } } } freez(&nStarts); freez(&nSizes); freez(&maskStarts); freez(&maskSizes); if (retFullSize != NULL) *retFullSize = seqSize; return seq; } struct dnaSeq *twoBitReadSeqFrag(struct twoBitFile *tbf, char *name, int fragStart, int fragEnd) /* Read part of sequence from .2bit file. To read full * sequence call with start=end=0. Note that sequence will * be mixed case, with repeats in lower case and rest in * upper case. */ { return twoBitReadSeqFragExt(tbf, name, fragStart, fragEnd, TRUE, NULL); } struct dnaSeq *twoBitReadSeqFragLower(struct twoBitFile *tbf, char *name, int fragStart, int fragEnd) /* Same as twoBitReadSeqFrag, but sequence is returned in lower case. */ { return twoBitReadSeqFragExt(tbf, name, fragStart, fragEnd, FALSE, NULL); } int twoBitSeqSize(struct twoBitFile *tbf, char *name) /* Return size of sequence in two bit file in bases. */ { twoBitSeekTo(tbf, name); return (*tbf->ourReadBits32)(tbf->f, tbf->isSwapped); } long long twoBitTotalSize(struct twoBitFile *tbf) /* Return total size of all sequences in two bit file. */ { struct twoBitIndex *index; long long totalSize = 0; for (index = tbf->indexList; index != NULL; index = index->next) { (*tbf->ourSeek)(tbf->f, index->offset); totalSize += (*tbf->ourReadBits32)(tbf->f, tbf->isSwapped); } return totalSize; } struct dnaSeq *twoBitLoadAll(char *spec) /* Return list of all sequences matching spec, which is in * the form: * * file/path/input.2bit[:seqSpec1][,seqSpec2,...] * * where seqSpec is either * seqName * or * seqName:start-end */ { struct twoBitSpec *tbs = twoBitSpecNew(spec); struct twoBitFile *tbf = twoBitOpen(tbs->fileName); struct dnaSeq *list = NULL; if (tbs->seqs != NULL) { struct twoBitSeqSpec *tbss; for (tbss = tbs->seqs; tbss != NULL; tbss = tbss->next) slSafeAddHead(&list, twoBitReadSeqFrag(tbf, tbss->name, tbss->start, tbss->end)); } else { struct twoBitIndex *index; for (index = tbf->indexList; index != NULL; index = index->next) slSafeAddHead(&list, twoBitReadSeqFrag(tbf, index->name, 0, 0)); } slReverse(&list); twoBitClose(&tbf); twoBitSpecFree(&tbs); return list; } struct slName *twoBitSeqNames(char *fileName) /* Get list of all sequences in twoBit file. */ { struct twoBitFile *tbf = twoBitOpen(fileName); struct twoBitIndex *index; struct slName *name, *list = NULL; for (index = tbf->indexList; index != NULL; index = index->next) { name = slNameNew(index->name); slAddHead(&list, name); } twoBitClose(&tbf); slReverse(&list); return list; } boolean twoBitIsFile(char *fileName) /* Return TRUE if file is in .2bit format. */ { boolean useUdc = FALSE; if (hasProtocol(fileName)) useUdc = TRUE; else if (!isRegularFile(fileName)) return FALSE; struct twoBitFile *tbf = getTbfAndOpen(fileName, useUdc); boolean isSwapped; boolean isTwoBit = twoBitSigRead(tbf, &isSwapped); (*tbf->ourClose)(&tbf->f); return isTwoBit; } boolean twoBitParseRange(char *rangeSpec, char **retFile, char **retSeq, int *retStart, int *retEnd) /* Parse out something in format * file/path/name:seqName:start-end * or * file/path/name:seqName * or * file/path/name:seqName1,seqName2,seqName3,... * This will destroy the input 'rangeSpec' in the process. Returns FALSE if * it doesn't fit this format, setting retFile to rangeSpec, and retSet to * null. If it is the shorter form then start and end will both be returned * as zero, which is ok by twoBitReadSeqFrag. Any of the return arguments * maybe NULL. */ { char *s, *e; int n; /* default returns */ if (retFile != NULL) *retFile = rangeSpec; if (retSeq != NULL) *retSeq = NULL; if (retStart != NULL) *retStart = 0; if (retEnd != NULL) *retEnd = 0; /* start with final name */ s = strrchr(rangeSpec, '/'); if (s == NULL) s = rangeSpec; else s++; /* Grab seqName, zero terminate fileName. */ s = strchr(s, ':'); if (s == NULL) return FALSE; *s++ = 0; if (retSeq != NULL) *retSeq = s; /* Grab start, zero terminate seqName. */ s = strchr(s, ':'); if (s == NULL) return TRUE; /* no range spec */ *s++ = 0; n = strtol(s, &e, 0); if (*e != '-') return FALSE; /* not a valid range */ if (retStart != NULL) *retStart = n; s = e+1; /* Grab end. */ n = strtol(s, &e, 0); if (*e != '\0') return FALSE; /* not a valid range */ if (retEnd != NULL) *retEnd = n; return TRUE; } boolean twoBitIsRange(char *rangeSpec) /* Return TRUE if it looks like a two bit range specifier. */ { char *dupe = cloneString(rangeSpec); char *file, *seq; int start, end; boolean isRange = twoBitParseRange(dupe, &file, &seq, &start, &end); if (isRange) isRange = twoBitIsFile(file); freeMem(dupe); return isRange; } boolean twoBitIsFileOrRange(char *spec) /* Return TRUE if it is a two bit file or subrange. */ { return twoBitIsFile(spec) || twoBitIsRange(spec); } static struct twoBitSeqSpec *parseSeqSpec(char *seqSpecStr) /* parse one sequence spec */ { boolean isOk = TRUE; char *s, *e; struct twoBitSeqSpec *seq; AllocVar(seq); seq->name = cloneString(seqSpecStr); /* Grab start */ s = strchr(seq->name, ':'); if (s == NULL) return seq; /* no range spec */ *s++ = 0; seq->start = strtol(s, &e, 0); if (*e != '-') isOk = FALSE; else { /* Grab end */ s = e+1; seq->end = strtol(s, &e, 0); if (*e != '\0') isOk = FALSE; } if (!isOk || (seq->end < seq->start)) errAbort("invalid twoBit sequence specification: \"%s\"", seqSpecStr); return seq; } boolean twoBitIsSpec(char *spec) /* Return TRUE spec is a valid 2bit spec (see twoBitSpecNew) */ { struct twoBitSpec *tbs = twoBitSpecNew(spec); boolean isSpec = (tbs != NULL); twoBitSpecFree(&tbs); return isSpec; } struct twoBitSpec *twoBitSpecNew(char *specStr) /* Parse a .2bit file and sequence spec into an object. * The spec is a string in the form: * * file/path/input.2bit[:seqSpec1][,seqSpec2,...] * * where seqSpec is either * seqName * or * seqName:start-end * * free result with twoBitSpecFree(). */ { char *s, *e; int i, numSeqs; char **seqSpecs; struct twoBitSpec *spec; AllocVar(spec); spec->fileName = cloneString(specStr); /* start with final file name */ s = strrchr(spec->fileName, '/'); if (s == NULL) s = spec->fileName; else s++; /* find end of file name and zero-terminate */ e = strchr(s, ':'); if (e == NULL) s = NULL; /* just file name */ else { *e++ = '\0'; s = e; } if (!twoBitIsFile(spec->fileName)) { twoBitSpecFree(&spec); return NULL; /* not a 2bit file */ } if (s != NULL) { /* chop seqs at commas and parse */ numSeqs = chopString(s, ",", NULL, 0); AllocArray(seqSpecs, numSeqs); chopString(s, ",", seqSpecs, numSeqs); for (i = 0; i< numSeqs; i++) slSafeAddHead(&spec->seqs, parseSeqSpec(seqSpecs[i])); slReverse(&spec->seqs); } return spec; } struct twoBitSpec *twoBitSpecNewFile(char *twoBitFile, char *specFile) /* parse a file containing a list of specifications for sequences in the * specified twoBit file. Specifications are one per line in forms: * seqName * or * seqName:start-end */ { struct lineFile *lf = lineFileOpen(specFile, TRUE); char *line; struct twoBitSpec *spec; AllocVar(spec); spec->fileName = cloneString(twoBitFile); while (lineFileNextReal(lf, &line)) slSafeAddHead(&spec->seqs, parseSeqSpec(trimSpaces(line))); slReverse(&spec->seqs); lineFileClose(&lf); return spec; } void twoBitSpecFree(struct twoBitSpec **specPtr) /* free a twoBitSpec object */ { struct twoBitSpec *spec = *specPtr; if (spec != NULL) { struct twoBitSeqSpec *seq; while ((seq = slPopHead(&spec->seqs)) != NULL) { freeMem(seq->name); freeMem(seq); } freeMem(spec->fileName); freeMem(spec); *specPtr = NULL; } } void twoBitOutNBeds(struct twoBitFile *tbf, char *seqName, FILE *outF) /* output a series of bed3's that enumerate the number of N's in a sequence*/ { int nBlockCount; twoBitSeekTo(tbf, seqName); (*tbf->ourReadBits32)(tbf->f, tbf->isSwapped); /* Read in blocks of N. */ nBlockCount = (*tbf->ourReadBits32)(tbf->f, tbf->isSwapped); if (nBlockCount > 0) { bits32 *nStarts = NULL, *nSizes = NULL; int i; AllocArray(nStarts, nBlockCount); AllocArray(nSizes, nBlockCount); (*tbf->ourMustRead)(tbf->f, nStarts, sizeof(nStarts[0]) * nBlockCount); (*tbf->ourMustRead)(tbf->f, nSizes, sizeof(nSizes[0]) * nBlockCount); if (tbf->isSwapped) { for (i=0; iourReadBits32)(tbf->f, tbf->isSwapped); /* Read in blocks of N. */ nBlockCount = (*tbf->ourReadBits32)(tbf->f, tbf->isSwapped); if (nBlockCount > 0) { bits32 *nStarts = NULL, *nSizes = NULL; int i; AllocArray(nStarts, nBlockCount); AllocArray(nSizes, nBlockCount); (*tbf->ourMustRead)(tbf->f, nStarts, sizeof(nStarts[0]) * nBlockCount); (*tbf->ourMustRead)(tbf->f, nSizes, sizeof(nSizes[0]) * nBlockCount); if (tbf->isSwapped) { for (i=0; iindexList; index != NULL; index = index->next) { int size = twoBitSeqSizeNoNs(tbf, index->name); totalSize += size; } return totalSize; } boolean twoBitIsSequence(struct twoBitFile *tbf, char *chromName) /* Return TRUE if chromName is in 2bit file. */ { return (hashFindVal(tbf->hash, chromName) != NULL); } rtracklayer/src/ucsc/twoBit.h0000644000175400017540000001632213556116552017305 0ustar00biocbuildbiocbuild/* twoBit - DNA sequence represented as two bits per pixel * with associated list of regions containing N's, and * masked regions. */ #ifndef TWOBIT_H #define TWOBIT_H struct twoBit /* Two bit representation of DNA. */ { struct twoBit *next; /* Next sequence in list */ char *name; /* Name of sequence. */ UBYTE *data; /* DNA at two bits per base. */ bits32 size; /* Size of this sequence. */ bits32 nBlockCount; /* Count of blocks of Ns. */ bits32 *nStarts; /* Starts of blocks of Ns. */ bits32 *nSizes; /* Sizes of blocks of Ns. */ bits32 maskBlockCount; /* Count of masked blocks. */ bits32 *maskStarts; /* Starts of masked regions. */ bits32 *maskSizes; /* Sizes of masked regions. */ bits32 reserved; /* Reserved for future expansion. */ }; struct twoBitIndex /* An entry in twoBit index. */ { struct twoBitIndex *next; /* Next in list. */ char *name; /* Name - allocated in hash */ bits32 offset; /* Offset in file. */ }; struct twoBitFile /* Holds header and index info from .2bit file. */ { struct twoBitFile *next; char *fileName; /* Name of this file, for error reporting. */ void *f; /* Open file. */ boolean isSwapped; /* Is byte-swapping needed. */ bits32 version; /* Version of .2bit file */ bits32 seqCount; /* Number of sequences. */ bits32 reserved; /* Reserved, always zero for now. */ struct twoBitIndex *indexList; /* List of sequence. */ struct hash *hash; /* Hash of sequences. */ struct bptFile *bpt; /* Alternative index. */ /* the routines we use to access the twoBit. * These may be UDC routines, or stdio */ void (*ourSeek)(void *file, bits64 offset); void (*ourSeekCur)(void *file, bits64 offset); bits32 (*ourReadBits32)(void *f, boolean isSwapped); void (*ourClose)(void *pFile); boolean (*ourFastReadString)(void *f, char buf[256]); void (*ourMustRead)(void *file, void *buf, size_t size); }; struct twoBitSpec /* parsed .2bit file and sequence specs */ { char *fileName; /* path to file */ struct twoBitSeqSpec *seqs; /* list of sequences and subsequences */ }; struct twoBitSeqSpec /* specification for a seq or subsequence in a .2bit file */ { struct twoBitSeqSpec *next; char *name; /* name of sequence */ bits32 start; /* start of subsequence 0 */ bits32 end; /* end of subsequence; * 0 if not a subsequence */ }; struct twoBitFile *twoBitOpen(char *fileName); /* Open file, read in header and index. * Squawk and die if there is a problem. */ struct twoBitFile *twoBitOpenExternalBptIndex(char *twoBitName, char *bptName); /* Open file, read in header, but not regular index. Instead use * bpt index. Beware if you use this the indexList field will be NULL * as will the hash. */ void twoBitClose(struct twoBitFile **pTbf); /* Free up resources associated with twoBitFile. */ int twoBitSeqSize(struct twoBitFile *tbf, char *name); /* Return size of sequence in two bit file in bases. */ long long twoBitTotalSize(struct twoBitFile *tbf); /* Return total size of all sequences in two bit file. */ struct dnaSeq *twoBitReadSeqFragExt(struct twoBitFile *tbf, char *name, int fragStart, int fragEnd, boolean doMask, int *retFullSize); /* Read part of sequence from .2bit file. To read full * sequence call with start=end=0. Sequence will be lower * case if doMask is false, mixed case (repeats in lower) * if doMask is true. */ struct dnaSeq *twoBitReadSeqFrag(struct twoBitFile *tbf, char *name, int fragStart, int fragEnd); /* Read part of sequence from .2bit file. To read full * sequence call with start=end=0. Note that sequence will * be mixed case, with repeats in lower case and rest in * upper case. */ struct dnaSeq *twoBitReadSeqFragLower(struct twoBitFile *tbf, char *name, int fragStart, int fragEnd); /* Same as twoBitReadSeqFrag, but sequence is returned in lower case. */ struct dnaSeq *twoBitLoadAll(char *spec); /* Return list of all sequences matching spec, which is in * the form: * * file/path/input.2bit[:seqSpec1][,seqSpec2,...] * * where seqSpec is either * seqName * or * seqName:start-end */ struct slName *twoBitSeqNames(char *fileName); /* Get list of all sequences in twoBit file. */ struct twoBit *twoBitFromDnaSeq(struct dnaSeq *seq, boolean doMask); /* Convert dnaSeq representation in memory to twoBit representation. * If doMask is true interpret lower-case letters as masked. */ struct twoBit *twoBitFromFile(char *fileName); /* Get twoBit list of all sequences in twoBit file. */ struct twoBit *twoBitOneFromFile(struct twoBitFile *tbf, char *name); /* Get single sequence as two bit. */ void twoBitFree(struct twoBit **pTwoBit); /* Free up a two bit structure. */ void twoBitFreeList(struct twoBit **pList); /* Free a list of dynamically allocated twoBit's */ void twoBitWriteOne(struct twoBit *twoBit, FILE *f); /* Write out one twoBit sequence to binary file. * Note this does not include the name, which is * stored only in index. */ void twoBitWriteHeader(struct twoBit *twoBitList, FILE *f); /* Write out header portion of twoBit file, including initial * index */ boolean twoBitIsFile(char *fileName); /* Return TRUE if file is in .2bit format. */ boolean twoBitParseRange(char *rangeSpec, char **retFile, char **retSeq, int *retStart, int *retEnd); /* Parse out something in format * file/path/name:seqName:start-end * or * file/path/name:seqName * This will destroy the input 'rangeSpec' in the process. * Returns FALSE if it doesn't fit this format. * If it is the shorter form then start and end will both * be returned as zero, which is ok by twoBitReadSeqFrag. */ boolean twoBitIsRange(char *rangeSpec); /* Return TRUE if it looks like a two bit range specifier. */ boolean twoBitIsFileOrRange(char *spec); /* Return TRUE if it is a two bit file or subrange. */ boolean twoBitIsSpec(char *spec); /* Return TRUE spec is a valid 2bit spec (see twoBitSpecNew) */ struct twoBitSpec *twoBitSpecNew(char *specStr); /* Parse a .2bit file and sequence spec into an object. * The spec is a string in the form: * * file/path/input.2bit[:seqSpec1][,seqSpec2,...] * * where seqSpec is either * seqName * or * seqName:start-end * * free result with twoBitSpecFree(). */ struct twoBitSpec *twoBitSpecNewFile(char *twoBitFile, char *specFile); /* parse a file containing a list of specifications for sequences in the * specified twoBit file. Specifications are one per line in forms: * seqName * or * seqName:start-end */ void twoBitSpecFree(struct twoBitSpec **specPtr); /* free a twoBitSpec object */ void twoBitOutNBeds(struct twoBitFile *tbf, char *seqName, FILE *outF); /* output a series of bed3's that enumerate the number of N's in a sequence*/ int twoBitSeqSizeNoNs(struct twoBitFile *tbf, char *seqName); /* return the length of the sequence, not counting N's */ long long twoBitTotalSizeNoN(struct twoBitFile *tbf); /* return the size of the all the sequence in file, not counting N's*/ boolean twoBitIsSequence(struct twoBitFile *tbf, char *chromName); /* Return TRUE if chromName is in 2bit file. */ #endif /* TWOBIT_H */ rtracklayer/src/ucsc/udc.c0000644000175400017540000014264613556116552016614 0ustar00biocbuildbiocbuild/*** rtracklayer has #ifndef WIN32'd the http/ftp stuff here, as well as the entire net.c and internet.c files. ***/ /* udc - url data cache - a caching system that keeps blocks of data fetched from URLs in * sparse local files for quick use the next time the data is needed. * * This cache is enormously simplified by there being no local _write_ to the cache, * just reads. * * The overall strategy of the implementation is to have a root cache directory * with a subdir for each file being cached. The directory for a single cached file * contains two files - "bitmap" and "sparseData" that contains information on which * parts of the URL are cached and the actual cached data respectively. The subdirectory name * associated with the file is constructed from the URL in a straightforward manner. * http://genome.ucsc.edu/cgi-bin/hgGateway * gets mapped to: * rootCacheDir/http/genome.ucsc.edu/cgi-bin/hgGateway/ * The URL protocol is the first directory under the root, and the remainder of the * URL, with some necessary escaping, is used to define the rest of the cache directory * structure, with each '/' after the protocol line translating into another directory * level. * * The bitmap file contains time stamp and size data as well as an array with one bit * for each block of the file that has been fetched. Currently the block size is 8K. */ #define _XOPEN_SOURCE #ifdef __sun # define _XPG6 #endif #include #include "common.h" #include "hash.h" #include "obscure.h" #include "bits.h" #include "linefile.h" #include "portable.h" #include "sig.h" #include "net.h" #include "cheapcgi.h" #include "udc.h" #define udcBlockSize (8*1024) /* All fetch requests are rounded up to block size. */ #define udcMaxBytesPerRemoteFetch (udcBlockSize * 32) /* Very large remote reads are broken down into chunks this size. */ struct connInfo /* Socket descriptor and associated info, for keeping net connections open. */ { int socket; /* Socket descriptor for data connection (or 0). */ bits64 offset; /* Current file offset of socket. */ int ctrlSocket; /* (FTP only) Control socket descriptor or 0. */ }; typedef int (*UdcDataCallback)(char *url, bits64 offset, int size, void *buffer, struct connInfo *ci); /* Type for callback function that fetches file data. */ struct udcRemoteFileInfo /* Information about a remote file. */ { bits64 updateTime; /* Last update in seconds since 1970 */ bits64 size; /* Remote file size */ struct connInfo ci; /* Connection info for open net connection */ }; typedef boolean (*UdcInfoCallback)(char *url, struct udcRemoteFileInfo *retInfo); /* Type for callback function that fetches file timestamp and size. */ struct udcProtocol /* Something to handle a communications protocol like http, https, ftp, local file i/o, etc. */ { struct udcProtocol *next; /* Next in list */ UdcDataCallback fetchData; /* Data fetcher */ UdcInfoCallback fetchInfo; /* Timestamp & size fetcher */ }; struct udcFile /* A file handle for our caching system. */ { struct udcFile *next; /* Next in list. */ char *url; /* Name of file - includes protocol */ char *protocol; /* The URL up to the first colon. http: etc. */ struct udcProtocol *prot; /* Protocol specific data and methods. */ time_t updateTime; /* Last modified timestamp. */ bits64 size; /* Size of file. */ bits64 offset; /* Current offset in file. */ char *cacheDir; /* Directory for cached file parts. */ char *bitmapFileName; /* Name of bitmap file. */ char *sparseFileName; /* Name of sparse data file. */ int fdSparse; /* File descriptor for sparse data file. */ boolean sparseReadAhead; /* Read-ahead has something in the buffer */ char *sparseReadAheadBuf; /* Read-ahead buffer, if any */ bits64 sparseRAOffset; /* Read-ahead buffer offset */ struct udcBitmap *bits; /* udcBitMap */ bits64 startData; /* Start of area in file we know to have data. */ bits64 endData; /* End of area in file we know to have data. */ bits32 bitmapVersion; /* Version of associated bitmap we were opened with. */ struct connInfo connInfo; /* Connection info for open net connection. */ }; struct udcBitmap /* The control structure including the bitmap of blocks that are cached. */ { struct udcBitmap *next; /* Next in list. */ bits32 blockSize; /* Number of bytes per block of file. */ bits64 remoteUpdate; /* Remote last update time. */ bits64 fileSize; /* File size */ bits32 version; /* Version - increments each time cache is stale. */ bits64 localUpdate; /* Time we last fetched new data into cache. */ bits64 localAccess; /* Time we last accessed data. */ boolean isSwapped; /* If true need to swap all bytes on read. */ int fd; /* File descriptor for file with current block. */ }; static char *bitmapName = "bitmap"; static char *sparseDataName = "sparseData"; #define udcBitmapHeaderSize (64) static int cacheTimeout = 0; #define MAX_SKIP_TO_SAVE_RECONNECT (udcMaxBytesPerRemoteFetch / 2) static void readAndIgnore(int sd, bits64 size) /* Read size bytes from sd and return. */ { static char *buf = NULL; if (buf == NULL) buf = needMem(udcBlockSize); bits64 remaining = size, total = 0; while (remaining > 0) { bits64 chunkSize = min(remaining, udcBlockSize); ssize_t rd = read(sd, buf, chunkSize); if (rd < 0) errnoAbort("readAndIgnore: error reading socket after %lld bytes", total); remaining -= rd; total += rd; } if (total < size) errAbort("readAndIgnore: got EOF at %lld bytes (wanted %lld)", total, size); } #ifndef WIN32 static int connInfoGetSocket(struct connInfo *ci, char *url, bits64 offset, int size) /* If ci has an open socket and the given offset matches ci's current offset, * reuse ci->socket. Otherwise close the socket, open a new one, and update ci, * or return -1 if there is an error opening a new one. */ { if (ci != NULL && ci->socket > 0 && ci->offset != offset) { bits64 skipSize = (offset - ci->offset); if (skipSize > 0 && skipSize <= MAX_SKIP_TO_SAVE_RECONNECT) { verbose(2, "!! skipping %lld bytes @%lld to avoid reconnect\n", skipSize, ci->offset); readAndIgnore(ci->socket, skipSize); ci->offset = offset; } else { verbose(2, "Offset mismatch (ci %lld != new %lld), reopening.\n", ci->offset, offset); mustCloseFd(&(ci->socket)); if (ci->ctrlSocket > 0) mustCloseFd(&(ci->ctrlSocket)); ZeroVar(ci); } } int sd; if (ci == NULL || ci->socket <= 0) { char rangeUrl[2048]; if (ci == NULL) { safef(rangeUrl, sizeof(rangeUrl), "%s;byterange=%lld-%lld", url, offset, (offset + size - 1)); sd = netUrlOpen(rangeUrl); } else { safef(rangeUrl, sizeof(rangeUrl), "%s;byterange=%lld-", url, offset); sd = ci->socket = netUrlOpenSockets(rangeUrl, &(ci->ctrlSocket)); ci->offset = offset; } if (sd < 0) return -1; if (startsWith("http", url)) { char *newUrl = NULL; int newSd = 0; if (!netSkipHttpHeaderLinesHandlingRedirect(sd, rangeUrl, &newSd, &newUrl)) return -1; if (newUrl) { freeMem(newUrl); sd = newSd; if (ci != NULL) ci->socket = newSd; } } } else sd = ci->socket; return sd; } #endif /********* Section for local file protocol **********/ static char *assertLocalUrl(char *url) /* Make sure that url is local and return bits past the protocol. */ { if (startsWith("local:", url)) url += 6; if (url[0] != '/') errAbort("Local urls must start at /"); if (stringIn("..", url) || stringIn("~", url) || stringIn("//", url) || stringIn("/./", url) || endsWith("/.", url)) { errAbort("relative paths not allowed in local urls (%s)", url); } return url; } static int udcDataViaLocal(char *url, bits64 offset, int size, void *buffer, struct connInfo *ci) /* Fetch a block of data of given size into buffer using the http: protocol. * Returns number of bytes actually read. Does an errAbort on * error. Typically will be called with size in the 8k - 64k range. */ { /* Need to check time stamp here. */ verbose(2, "reading remote data - %d bytes at %lld - on %s\n", size, offset, url); url = assertLocalUrl(url); FILE *f = mustOpen(url, "rb"); fseek(f, offset, SEEK_SET); int sizeRead = fread(buffer, 1, size, f); if (ferror(f)) { warn("udcDataViaLocal failed to fetch %d bytes at %lld", size, offset); errnoAbort("file %s", url); } carefulClose(&f); return sizeRead; } static boolean udcInfoViaLocal(char *url, struct udcRemoteFileInfo *retInfo) /* Fill in *retTime with last modified time for file specified in url. * Return FALSE if file does not even exist. */ { verbose(2, "checking remote info on %s\n", url); url = assertLocalUrl(url); struct stat status; int ret = stat(url, &status); if (ret < 0) return FALSE; retInfo->updateTime = status.st_mtime; retInfo->size = status.st_size; return TRUE; } /********* Section for transparent file protocol **********/ static int udcDataViaTransparent(char *url, bits64 offset, int size, void *buffer, struct connInfo *ci) /* Fetch a block of data of given size into buffer using the http: protocol. * Returns number of bytes actually read. Does an errAbort on * error. Typically will be called with size in the 8k - 64k range. */ { internalErr(); /* Should not get here. */ return size; } static boolean udcInfoViaTransparent(char *url, struct udcRemoteFileInfo *retInfo) /* Fill in *retInfo with last modified time for file specified in url. * Return FALSE if file does not even exist. */ { internalErr(); /* Should not get here. */ return FALSE; } /********* Section for slow local file protocol - simulates network... **********/ static int udcDataViaSlow(char *url, bits64 offset, int size, void *buffer, struct connInfo *ci) /* Fetch a block of data of given size into buffer using the http: protocol. * Returns number of bytes actually read. Does an errAbort on * error. Typically will be called with size in the 8k - 64k range. */ { verbose(2, "slow reading remote data - %d bytes at %lld - on %s\n", size, offset, url); sleep1000(500); char *fileName = url + 5; /* skip over 'slow:' */ FILE *f = mustOpen(fileName, "rb"); fseek(f, offset, SEEK_SET); char *pt = buffer; int i, step=1024; int sizeRead = 0; for (i=0; i step) readChunk = step; int oneReadSize = fread(pt, 1, readChunk, f); verbose(2, "slowly read %d bytes\n", oneReadSize); if (ferror(f)) { warn("udcDataViaSlow failed to fetch %d bytes at %lld", size, offset); errnoAbort("file %s", fileName); } pt += step; sizeRead += oneReadSize; } carefulClose(&f); return sizeRead; } static boolean udcInfoViaSlow(char *url, struct udcRemoteFileInfo *retInfo) /* Fill in *retTime with last modified time for file specified in url. * Return FALSE if file does not even exist. */ { char *fileName = url + 5; /* skip over 'slow:' */ verbose(2, "slow checking remote info on %s\n", url); sleep1000(500); struct stat status; int ret = stat(fileName, &status); if (ret < 0) return FALSE; retInfo->updateTime = status.st_mtime; retInfo->size = status.st_size; return TRUE; } #ifndef WIN32 /********* Section for http protocol **********/ int udcDataViaHttpOrFtp(char *url, bits64 offset, int size, void *buffer, struct connInfo *ci) /* Fetch a block of data of given size into buffer using url's protocol, * which must be http, https or ftp. Returns number of bytes actually read. * Does an errAbort on error. * Typically will be called with size in the 8k-64k range. */ { if (startsWith("http://",url) || startsWith("https://",url) || startsWith("ftp://",url)) verbose(2, "reading http/https/ftp data - %d bytes at %lld - on %s\n", size, offset, url); else errAbort("Invalid protocol in url [%s] in udcDataViaFtp, only http, https, or ftp supported", url); int sd = connInfoGetSocket(ci, url, offset, size); if (sd < 0) errAbort("Can't get data socket for %s", url); int rd = 0, total = 0, remaining = size; char *buf = (char *)buffer; while ((remaining > 0) && ((rd = read(sd, buf, remaining)) > 0)) { total += rd; buf += rd; remaining -= rd; } if (rd == -1) errnoAbort("udcDataViaHttpOrFtp: error reading socket"); if (ci == NULL) mustCloseFd(&sd); else ci->offset += total; return total; } boolean udcInfoViaHttp(char *url, struct udcRemoteFileInfo *retInfo) /* Gets size and last modified time of URL * and returns status of HEAD GET. */ { verbose(2, "checking http remote info on %s\n", url); struct hash *hash = newHash(0); int status = netUrlHead(url, hash); if (status != 200) // && status != 302 && status != 301) return FALSE; char *sizeString = hashFindValUpperCase(hash, "Content-Length:"); if (sizeString == NULL) { /* try to get remote file size by an alternate method */ long long retSize = netUrlSizeByRangeResponse(url); if (retSize < 0) { hashFree(&hash); errAbort("No Content-Length: returned in header for %s, can't proceed, sorry", url); } retInfo->size = retSize; } else { retInfo->size = atoll(sizeString); } char *lastModString = hashFindValUpperCase(hash, "Last-Modified:"); if (lastModString == NULL) { // Date is a poor substitute! It will always appear that the cache is stale. // But at least we can read files from dropbox.com. lastModString = hashFindValUpperCase(hash, "Date:"); if (lastModString == NULL) { hashFree(&hash); errAbort("No Last-Modified: or Date: returned in header for %s, can't proceed, sorry", url); } } struct tm tm; time_t t; // Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT // This will always be GMT if (strptime(lastModString, "%a, %d %b %Y %H:%M:%S %Z", &tm) == NULL) { /* Handle error */; hashFree(&hash); errAbort("unable to parse last-modified string [%s]", lastModString); } t = mktimeFromUtc(&tm); if (t == -1) { /* Handle error */; hashFree(&hash); errAbort("mktimeFromUtc failed while converting last-modified string [%s] from UTC time", lastModString); } retInfo->updateTime = t; hashFree(&hash); return status; } /********* Section for ftp protocol **********/ // fetchData method: See udcDataViaHttpOrFtp above. boolean udcInfoViaFtp(char *url, struct udcRemoteFileInfo *retInfo) /* Gets size and last modified time of FTP URL */ { verbose(2, "checking ftp remote info on %s\n", url); long long size = 0; time_t t, tUtc; struct tm *tm = NULL; // TODO: would be nice to add int *retCtrlSocket to netGetFtpInfo so we can stash // in retInfo->connInfo and keep socket open. boolean ok = netGetFtpInfo(url, &size, &tUtc); if (!ok) return FALSE; // Convert UTC to localtime tm = localtime(&tUtc); t = mktimeFromUtc(tm); if (t == -1) { /* Handle error */; errAbort("mktimeFromUtc failed while converting FTP UTC last-modified time %ld to local time", (long) tUtc); } retInfo->size = size; retInfo->updateTime = t; return TRUE; } #endif /********* Non-protocol-specific bits **********/ boolean udcFastReadString(struct udcFile *f, char buf[256]) /* Read a string into buffer, which must be long enough * to hold it. String is in 'writeString' format. */ { UBYTE bLen; int len; if (!udcReadOne(f, bLen)) return FALSE; if ((len = bLen)> 0) udcMustRead(f, buf, len); buf[len] = 0; return TRUE; } void msbFirstWriteBits64(FILE *f, bits64 x); static char *fileNameInCacheDir(struct udcFile *file, char *fileName) /* Return the name of a file in the cache dir, from the cache root directory on down. * Do a freeMem on this when done. */ { int dirLen = strlen(file->cacheDir); int nameLen = strlen(fileName); char *path = needMem(dirLen + nameLen + 2); memcpy(path, file->cacheDir, dirLen); path[dirLen] = '/'; memcpy(path+dirLen+1, fileName, nameLen); return path; } static void udcNewCreateBitmapAndSparse(struct udcFile *file, bits64 remoteUpdate, bits64 remoteSize, bits32 version) /* Create a new bitmap file around the given remoteUpdate time. */ { int fd = mustOpenFd(file->bitmapFileName, O_WRONLY | O_CREAT | O_TRUNC); bits32 sig = udcBitmapSig; bits32 blockSize = udcBlockSize; bits64 reserved64 = 0; bits32 reserved32 = 0; int blockCount = (remoteSize + udcBlockSize - 1)/udcBlockSize; int bitmapSize = bitToByteSize(blockCount); /* Write out fixed part of header. */ writeOneFd(fd, sig); writeOneFd(fd, blockSize); writeOneFd(fd, remoteUpdate); writeOneFd(fd, remoteSize); writeOneFd(fd, version); writeOneFd(fd, reserved32); writeOneFd(fd, reserved64); writeOneFd(fd, reserved64); writeOneFd(fd, reserved64); writeOneFd(fd, reserved64); long long offset = mustLseek(fd, 0, SEEK_CUR); if (offset != udcBitmapHeaderSize) errAbort("offset in fd=%d, f=%s is %lld, not expected udcBitmapHeaderSize %d", fd, file->bitmapFileName, offset, udcBitmapHeaderSize); /* Write out initial all-zero bitmap, using sparse-file method: write 0 to final address. */ unsigned char zero = 0; mustLseek(fd, bitmapSize-1, SEEK_CUR); mustWriteFd(fd, &zero, 1); /* Clean up bitmap file and name. */ mustCloseFd(&fd); /* Create an empty data file. */ fd = mustOpenFd(file->sparseFileName, O_WRONLY | O_CREAT | O_TRUNC); mustCloseFd(&fd); } static struct udcBitmap *udcBitmapOpen(char *fileName) /* Open up a bitmap file and read and verify header. Return NULL if file doesn't * exist, abort on error. */ { /* Open file, returning NULL if can't. */ int fd = open(fileName, O_RDWR); if (fd < 0) { if (errno == ENOENT) return NULL; else errnoAbort("Can't open(%s, O_RDWR)", fileName); } /* Get status info from file. */ struct stat status; fstat(fd, &status); if (status.st_size < udcBitmapHeaderSize) // check for truncated invalid bitmap files. { close(fd); return NULL; // returning NULL will cause the fresh creation of bitmap and sparseData files. } /* Read signature and decide if byte-swapping is needed. */ // TODO: maybe buffer the I/O for performance? Don't read past header - // fd offset needs to point to first data block when we return. bits32 magic; boolean isSwapped = FALSE; mustReadOneFd(fd, magic); if (magic != udcBitmapSig) { magic = byteSwap32(magic); isSwapped = TRUE; if (magic != udcBitmapSig) errAbort("%s is not a udcBitmap file", fileName); } /* Allocate bitmap object, fill it in, and return it. */ struct udcBitmap *bits; AllocVar(bits); bits->blockSize = fdReadBits32(fd, isSwapped); bits->remoteUpdate = fdReadBits64(fd, isSwapped); bits->fileSize = fdReadBits64(fd, isSwapped); bits->version = fdReadBits32(fd, isSwapped); fdReadBits32(fd, isSwapped); fdReadBits64(fd, isSwapped); fdReadBits64(fd, isSwapped); fdReadBits64(fd, isSwapped); fdReadBits64(fd, isSwapped); bits->localUpdate = status.st_mtime; bits->localAccess = status.st_atime; bits->isSwapped = isSwapped; bits->fd = fd; return bits; } static void udcBitmapClose(struct udcBitmap **pBits) /* Free up resources associated with udcBitmap. */ { struct udcBitmap *bits = *pBits; if (bits != NULL) { mustCloseFd(&(bits->fd)); freez(pBits); } } static struct udcProtocol *udcProtocolNew(char *upToColon) /* Build up a new protocol around a string such as "http" or "local" */ { struct udcProtocol *prot; AllocVar(prot); if (sameString(upToColon, "local")) { prot->fetchData = udcDataViaLocal; prot->fetchInfo = udcInfoViaLocal; } else if (sameString(upToColon, "slow")) { prot->fetchData = udcDataViaSlow; prot->fetchInfo = udcInfoViaSlow; } #ifndef WIN32 else if (sameString(upToColon, "http") || sameString(upToColon, "https")) { prot->fetchData = udcDataViaHttpOrFtp; prot->fetchInfo = udcInfoViaHttp; } else if (sameString(upToColon, "ftp")) { prot->fetchData = udcDataViaHttpOrFtp; prot->fetchInfo = udcInfoViaFtp; } #endif else if (sameString(upToColon, "transparent")) { prot->fetchData = udcDataViaTransparent; prot->fetchInfo = udcInfoViaTransparent; } else { errAbort("Unrecognized protocol %s in udcProtNew", upToColon); } return prot; } static void udcProtocolFree(struct udcProtocol **pProt) /* Free up protocol resources. */ { freez(pProt); } static void setInitialCachedDataBounds(struct udcFile *file, boolean useCacheInfo) /* Open up bitmap file and read a little bit of it to see if cache is stale, * and if not to see if the initial part is cached. Sets the data members * startData, and endData. If the case is stale it makes fresh empty * cacheDir/sparseData and cacheDir/bitmap files. */ { bits32 version = 0; /* Get existing bitmap, and if it's stale clean up. */ struct udcBitmap *bits = udcBitmapOpen(file->bitmapFileName); if (bits != NULL) { if (useCacheInfo) { file->size = bits->fileSize; file->updateTime = bits->remoteUpdate; } version = bits->version; if (bits->remoteUpdate != file->updateTime || bits->fileSize != file->size || !fileExists(file->sparseFileName)) { verbose(2, "removing stale version (%lld! = %lld or %lld! = %lld or %s doesn't exist), " "new version %d\n", bits->remoteUpdate, (long long)file->updateTime, bits->fileSize, file->size, file->sparseFileName, version); udcBitmapClose(&bits); remove(file->bitmapFileName); remove(file->sparseFileName); ++version; } } else verbose(2, "bitmap file %s does not already exist, creating.\n", file->bitmapFileName); /* If no bitmap, then create one, and also an empty sparse data file. */ if (bits == NULL) { udcNewCreateBitmapAndSparse(file, file->updateTime, file->size, version); bits = udcBitmapOpen(file->bitmapFileName); if (bits == NULL) errAbort("Unable to open bitmap file %s", file->bitmapFileName); } file->bitmapVersion = bits->version; /* Read in a little bit from bitmap while we have it open to see if we have anything cached. */ if (file->size > 0) { Bits b; off_t wasAt = lseek(bits->fd, 0, SEEK_CUR); mustReadOneFd(bits->fd, b); int endBlock = (file->size + udcBlockSize - 1)/udcBlockSize; if (endBlock > 8) endBlock = 8; int initialCachedBlocks = bitFindClear(&b, 0, endBlock); file->endData = initialCachedBlocks * udcBlockSize; mustLseek(bits->fd, wasAt, SEEK_SET); } file->bits = bits; } static boolean qEscaped(char c) /* Returns TRUE if character needs to be escaped in q-encoding. */ { if (isalnum(c)) return c == 'Q'; else return c != '_' && c != '-' && c != '/' && c != '.'; } static char *qEncode(char *input) /* Do a simple encoding to convert input string into "normal" characters. * Abnormal letters, and '!' get converted into Q followed by two hexadecimal digits. */ { /* First go through and figure out encoded size. */ int size = 0; char *s, *d, c; s = input; while ((c = *s++) != 0) { if (qEscaped(c)) size += 3; else size += 1; } /* Allocate and fill in output. */ char *output = needMem(size+1); s = input; d = output; while ((c = *s++) != 0) { if (qEscaped(c)) { sprintf(d, "Q%02X", (unsigned)c); d += 3; } else *d++ = c; } return output; } void udcParseUrlFull(char *url, char **retProtocol, char **retAfterProtocol, char **retColon, char **retAuth) /* Parse the URL into components that udc treats separately. * *retAfterProtocol is Q-encoded to keep special chars out of filenames. * Free all *ret's except *retColon when done. */ { char *protocol, *afterProtocol; char *colon = strchr(url, ':'); if (!colon) { *retColon = NULL; return; } int colonPos = colon - url; protocol = cloneStringZ(url, colonPos); afterProtocol = url + colonPos + 1; while (afterProtocol[0] == '/') afterProtocol += 1; char *userPwd = strchr(afterProtocol, '@'); if (userPwd) { if (retAuth) { char auth[1024]; safencpy(auth, sizeof(auth), afterProtocol, userPwd+1-afterProtocol); *retAuth = qEncode(auth); } char *afterHost = strchr(afterProtocol, '/'); if (!afterHost) { afterHost = afterProtocol+strlen(afterProtocol); } if (userPwd < afterHost) afterProtocol = userPwd + 1; } else if (retAuth) *retAuth = NULL; afterProtocol = qEncode(afterProtocol); *retProtocol = protocol; *retAfterProtocol = afterProtocol; *retColon = colon; } void udcParseUrl(char *url, char **retProtocol, char **retAfterProtocol, char **retColon) /* Parse the URL into components that udc treats separately. * *retAfterProtocol is Q-encoded to keep special chars out of filenames. * Free *retProtocol and *retAfterProtocol but not *retColon when done. */ { udcParseUrlFull(url, retProtocol, retAfterProtocol, retColon, NULL); } void udcPathAndFileNames(struct udcFile *file, char *cacheDir, char *protocol, char *afterProtocol) /* Initialize udcFile path and names */ { int len = strlen(cacheDir) + 1 + strlen(protocol) + 1 + strlen(afterProtocol) + 1; file->cacheDir = needMem(len); safef(file->cacheDir, len, "%s/%s/%s", cacheDir, protocol, afterProtocol); /* Create file names for bitmap and data portions. */ file->bitmapFileName = fileNameInCacheDir(file, bitmapName); file->sparseFileName = fileNameInCacheDir(file, sparseDataName); } static long long int udcSizeAndModTimeFromBitmap(char *bitmapFileName, time_t *retTime) /* Look up the file size from the local cache bitmap file, or -1 if there * is no cache for url. If retTime is non-null, store the remote update time in it. */ { long long int ret = -1; struct udcBitmap *bits = udcBitmapOpen(bitmapFileName); if (bits != NULL) { ret = bits->fileSize; if (retTime) *retTime = bits->remoteUpdate; } udcBitmapClose(&bits); return ret; } struct udcFile *udcFileMayOpen(char *url, char *cacheDir) /* Open up a cached file. cacheDir may be null in which case udcDefaultDir() will be * used. Return NULL if file doesn't exist. */ { if (cacheDir == NULL) cacheDir = udcDefaultDir(); verbose(2, "udcfileOpen(%s, %s)\n", url, cacheDir); /* Parse out protocol. Make it "transparent" if none specified. */ char *protocol = NULL, *afterProtocol = NULL, *colon; boolean isTransparent = FALSE; udcParseUrl(url, &protocol, &afterProtocol, &colon); #ifndef WIN32 /* force WIN32 to use transparent (local file) loading */ if (!colon) #endif { freeMem(protocol); protocol = cloneString("transparent"); freeMem(afterProtocol); afterProtocol = cloneString(url); isTransparent = TRUE; } struct udcProtocol *prot; prot = udcProtocolNew(protocol); /* Figure out if anything exists. */ boolean useCacheInfo = FALSE; struct udcRemoteFileInfo info; ZeroVar(&info); if (!isTransparent) { useCacheInfo = (udcCacheAge(url, cacheDir) < udcCacheTimeout()); if (!useCacheInfo) { if (!prot->fetchInfo(url, &info)) { udcProtocolFree(&prot); freeMem(protocol); freeMem(afterProtocol); return NULL; } } } /* Allocate file object and start filling it in. */ struct udcFile *file; AllocVar(file); file->url = cloneString(url); file->protocol = protocol; file->prot = prot; if (isTransparent) { /* If transparent dummy up things so that the "sparse" file pointer is actually * the file itself, which appears to be completely loaded in cache. */ int flags = O_RDONLY; #ifdef WIN32 flags |= O_BINARY; #endif int fd = file->fdSparse = mustOpenFd(url, flags); struct stat status; fstat(fd, &status); file->startData = 0; file->endData = file->size = status.st_size; } else { udcPathAndFileNames(file, cacheDir, protocol, afterProtocol); if (!useCacheInfo) { file->updateTime = info.updateTime; file->size = info.size; memcpy(&(file->connInfo), &(info.ci), sizeof(struct connInfo)); // update cache file mod times, so if we're caching we won't do this again // until the timeout has expired again: #ifndef WIN32 if (udcCacheTimeout() > 0 && fileExists(file->bitmapFileName)) (void)maybeTouchFile(file->bitmapFileName); #endif } /* Make directory. */ makeDirsOnPath(file->cacheDir); /* Figure out a little bit about the extent of the good cached data if any. Open bits bitmap. */ setInitialCachedDataBounds(file, useCacheInfo); file->fdSparse = mustOpenFd(file->sparseFileName, O_RDWR); } freeMem(afterProtocol); return file; } struct udcFile *udcFileOpen(char *url, char *cacheDir) /* Open up a cached file. cacheDir may be null in which case udcDefaultDir() will be * used. Abort if if file doesn't exist. */ { struct udcFile *udcFile = udcFileMayOpen(url, cacheDir); if (udcFile == NULL) errAbort("Couldn't open %s", url); return udcFile; } struct slName *udcFileCacheFiles(char *url, char *cacheDir) /* Return low-level list of files used in cache. */ { char *protocol, *afterProtocol, *colon; struct udcFile *file; udcParseUrl(url, &protocol, &afterProtocol, &colon); if (colon == NULL) return NULL; AllocVar(file); udcPathAndFileNames(file, cacheDir, protocol, afterProtocol); struct slName *list = NULL; slAddHead(&list, slNameNew(file->bitmapFileName)); slAddHead(&list, slNameNew(file->sparseFileName)); slReverse(&list); freeMem(file->cacheDir); freeMem(file->bitmapFileName); freeMem(file->sparseFileName); freeMem(file); freeMem(protocol); freeMem(afterProtocol); return list; } void udcFileClose(struct udcFile **pFile) /* Close down cached file. */ { struct udcFile *file = *pFile; if (file != NULL) { if (file->connInfo.socket != 0) mustCloseFd(&(file->connInfo.socket)); if (file->connInfo.ctrlSocket != 0) mustCloseFd(&(file->connInfo.ctrlSocket)); freeMem(file->url); freeMem(file->protocol); udcProtocolFree(&file->prot); freeMem(file->cacheDir); freeMem(file->bitmapFileName); freeMem(file->sparseFileName); freeMem(file->sparseReadAheadBuf); mustCloseFd(&(file->fdSparse)); udcBitmapClose(&file->bits); } freez(pFile); } static void qDecode(const char *input, char *buf, size_t size) /* Reverse the qEncode performed on afterProcotol above into buf or abort. */ { safecpy(buf, size, input); char c, *r = buf, *w = buf; while ((c = *r++) != '\0') { if (c == 'Q') { int q; if (sscanf(r, "%02X", &q)) { *w++ = (char)q; r += 2; } else errAbort("qDecode: input \"%s\" does not appear to be properly formatted " "starting at \"%s\"", input, r); } else *w++ = c; } *w = '\0'; } char *udcPathToUrl(const char *path, char *buf, size_t size, char *cacheDir) /* Translate path into an URL, store in buf, return pointer to buf if successful * and NULL if not. */ { if (cacheDir == NULL) cacheDir = udcDefaultDir(); int offset = 0; if (startsWith(cacheDir, (char *)path)) offset = strlen(cacheDir); if (path[offset] == '/') offset++; char protocol[16]; strncpy(protocol, path+offset, sizeof(protocol)); protocol[ArraySize(protocol)-1] = '\0'; char *p = strchr(protocol, '/'); if (p == NULL) { errAbort("unable to parse protocol (first non-'%s' directory) out of path '%s'\n", cacheDir, path); return NULL; } *p++ = '\0'; char afterProtocol[4096]; qDecode(path+1+strlen(protocol)+1, afterProtocol, sizeof(afterProtocol)); safef(buf, size, "%s://%s", protocol, afterProtocol); return buf; } long long int udcSizeFromCache(char *url, char *cacheDir) /* Look up the file size from the local cache bitmap file, or -1 if there * is no cache for url. */ { long long int ret = -1; if (cacheDir == NULL) cacheDir = udcDefaultDir(); struct slName *sl, *slList = udcFileCacheFiles(url, cacheDir); for (sl = slList; sl != NULL; sl = sl->next) if (endsWith(sl->name, bitmapName)) { ret = udcSizeAndModTimeFromBitmap(sl->name, NULL); break; } slNameFreeList(&slList); return ret; } unsigned long udcCacheAge(char *url, char *cacheDir) /* Return the age in seconds of the oldest cache file. If a cache file is * missing, return the current time (seconds since the epoch). */ { unsigned long now = clock1(), oldestTime = now; if (cacheDir == NULL) cacheDir = udcDefaultDir(); struct slName *sl, *slList = udcFileCacheFiles(url, cacheDir); if (slList == NULL) return now; for (sl = slList; sl != NULL; sl = sl->next) if (endsWith(sl->name, bitmapName)) { if (fileExists(sl->name)) oldestTime = min(fileModTime(sl->name), oldestTime); else return now; } return (now - oldestTime); } static void readBitsIntoBuf(int fd, int headerSize, int bitStart, int bitEnd, Bits **retBits, int *retPartOffset) /* Do some bit-to-byte offset conversions and read in all the bytes that * have information in the bits we're interested in. */ { int byteStart = bitStart/8; int byteEnd = bitToByteSize(bitEnd); int byteSize = byteEnd - byteStart; Bits *bits = needLargeMem(byteSize); mustLseek(fd, headerSize + byteStart, SEEK_SET); mustReadFd(fd, bits, byteSize); *retBits = bits; *retPartOffset = byteStart*8; } static boolean allBitsSetInFile(int bitStart, int bitEnd, int partOffset, Bits *bits) /* Return TRUE if all bits in file between start and end are set. */ { int partBitStart = bitStart - partOffset; int partBitEnd = bitEnd - partOffset; int nextClearBit = bitFindClear(bits, partBitStart, partBitEnd); boolean allSet = (nextClearBit >= partBitEnd); return allSet; } // For tests/udcTest.c debugging: not declared in udc.h, but not static either: boolean udcCheckCacheBits(struct udcFile *file, int startBlock, int endBlock) /* Warn and return TRUE if any bit in (startBlock,endBlock] is not set. */ { boolean gotUnset = FALSE; struct udcBitmap *bitmap = udcBitmapOpen(file->bitmapFileName); int partOffset; Bits *bits; readBitsIntoBuf(bitmap->fd, udcBitmapHeaderSize, startBlock, endBlock, &bits, &partOffset); int partBitStart = startBlock - partOffset; int partBitEnd = endBlock - partOffset; int nextClearBit = bitFindClear(bits, partBitStart, partBitEnd); while (nextClearBit < partBitEnd) { int clearBlock = nextClearBit + partOffset; warn("... udcFile 0x%04lx: bit for block %d (%lld..%lld] is not set", (unsigned long)file, clearBlock, ((long long)clearBlock * udcBlockSize), (((long long)clearBlock+1) * udcBlockSize)); gotUnset = TRUE; int nextSetBit = bitFindSet(bits, nextClearBit, partBitEnd); nextClearBit = bitFindClear(bits, nextSetBit, partBitEnd); } return gotUnset; } static void fetchMissingBlocks(struct udcFile *file, struct udcBitmap *bits, int startBlock, int blockCount, int blockSize) /* Fetch missing blocks from remote and put them into file. errAbort if trouble. */ { bits64 startPos = (bits64)startBlock * blockSize; bits64 endPos = startPos + (bits64)blockCount * blockSize; if (endPos > file->size) endPos = file->size; if (endPos > startPos) { bits64 readSize = endPos - startPos; void *buf = needLargeMem(readSize); int actualSize = file->prot->fetchData(file->url, startPos, readSize, buf, &(file->connInfo)); if (actualSize != readSize) errAbort("unable to fetch %lld bytes from %s @%lld (got %d bytes)", readSize, file->url, startPos, actualSize); mustLseek(file->fdSparse, startPos, SEEK_SET); mustWriteFd(file->fdSparse, buf, readSize); freez(&buf); } } static boolean fetchMissingBits(struct udcFile *file, struct udcBitmap *bits, bits64 start, bits64 end, bits64 *retFetchedStart, bits64 *retFetchedEnd) /* Scan through relevant parts of bitmap, fetching blocks we don't already have. */ { /* Fetch relevant part of bitmap into memory */ int partOffset; Bits *b; int startBlock = start / bits->blockSize; int endBlock = (end + bits->blockSize - 1) / bits->blockSize; readBitsIntoBuf(bits->fd, udcBitmapHeaderSize, startBlock, endBlock, &b, &partOffset); if (allBitsSetInFile(startBlock, endBlock, partOffset, b)) { // it is already in the cache freeMem(b); return TRUE; } /* Loop around first skipping set bits, then fetching clear bits. */ boolean dirty = FALSE; int s = startBlock - partOffset; int e = endBlock - partOffset; for (;;) { int nextClearBit = bitFindClear(b, s, e); if (nextClearBit >= e) break; int nextSetBit = bitFindSet(b, nextClearBit, e); int clearSize = nextSetBit - nextClearBit; fetchMissingBlocks(file, bits, nextClearBit + partOffset, clearSize, bits->blockSize); bitSetRange(b, nextClearBit, clearSize); dirty = TRUE; if (nextSetBit >= e) break; s = nextSetBit; } if (dirty) { /* Update bitmap on disk.... */ int byteStart = startBlock/8; int byteEnd = bitToByteSize(endBlock); int byteSize = byteEnd - byteStart; mustLseek(bits->fd, byteStart + udcBitmapHeaderSize, SEEK_SET); mustWriteFd(bits->fd, b, byteSize); } freeMem(b); *retFetchedStart = startBlock * bits->blockSize; *retFetchedEnd = endBlock * bits->blockSize; return FALSE; } static boolean rangeIntersectOrTouch64(bits64 start1, bits64 end1, bits64 start2, bits64 end2) /* Return true if two 64-bit ranges intersect or touch. */ { // cannot use the version of this function that is in common.c since it only handles integers. bits64 s = max(start1,start2); bits64 e = min(end1,end2); return e >= s; } static void udcFetchMissing(struct udcFile *file, struct udcBitmap *bits, bits64 start, bits64 end) /* Fetch missing pieces of data from file */ { /* Call lower level routine fetch remote data that is not already here. */ bits64 fetchedStart, fetchedEnd; if (fetchMissingBits(file, bits, start, end, &fetchedStart, &fetchedEnd)) return; /* Update file startData/endData members to include new data (and old as well if * the new data overlaps the old). */ if (rangeIntersectOrTouch64(file->startData, file->endData, fetchedStart, fetchedEnd)) { if (fetchedStart > file->startData) fetchedStart = file->startData; if (fetchedEnd < file->endData) fetchedEnd = file->endData; } file->startData = fetchedStart; file->endData = fetchedEnd; } static boolean udcCachePreload(struct udcFile *file, bits64 offset, bits64 size) /* Make sure that given data is in cache - fetching it remotely if need be. * Return TRUE on success. */ { boolean ok = TRUE; /* We'll break this operation into blocks of a reasonable size to allow * other processes to get cache access, since we have to lock the cache files. */ bits64 s,e, endPos=offset+size; for (s = offset; s < endPos; s = e) { /* Figure out bounds of this section. */ e = s + udcMaxBytesPerRemoteFetch; if (e > endPos) e = endPos; struct udcBitmap *bits = file->bits; if (bits->version == file->bitmapVersion) { udcFetchMissing(file, bits, s, e); } else { ok = FALSE; verbose(2, "udcCachePreload version check failed %d vs %d", bits->version, file->bitmapVersion); } if (!ok) break; } return ok; } #define READAHEADBUFSIZE 4096 bits64 udcRead(struct udcFile *file, void *buf, bits64 size) /* Read a block from file. Return amount actually read. */ { /* Figure out region of file we're going to read, and clip it against file size. */ bits64 start = file->offset; if (start > file->size) return 0; bits64 end = start + size; if (end > file->size) end = file->size; size = end - start; char *cbuf = buf; /* use read-ahead buffer if present */ bits64 bytesRead = 0; bits64 raStart; bits64 raEnd; while(TRUE) { if (file->sparseReadAhead) { raStart = file->sparseRAOffset; raEnd = raStart+READAHEADBUFSIZE; if (start >= raStart && start < raEnd) { // copy bytes out of rabuf bits64 endInBuf = min(raEnd, end); bits64 sizeInBuf = endInBuf - start; memcpy(cbuf, file->sparseReadAheadBuf + (start-raStart), sizeInBuf); cbuf += sizeInBuf; bytesRead += sizeInBuf; start = raEnd; size -= sizeInBuf; file->offset += sizeInBuf; if (size == 0) break; } file->sparseReadAhead = FALSE; mustLseek(file->fdSparse, start, SEEK_SET); } bits64 saveEnd = end; if (size < READAHEADBUFSIZE) { file->sparseReadAhead = TRUE; if (!file->sparseReadAheadBuf) file->sparseReadAheadBuf = needMem(READAHEADBUFSIZE); file->sparseRAOffset = start; size = READAHEADBUFSIZE; end = start + size; if (end > file->size) { end = file->size; size = end - start; } } /* If we're outside of the window of file we already know is good, then have to * consult cache on disk, and maybe even fetch data remotely! */ if (start < file->startData || end > file->endData) { if (!udcCachePreload(file, start, size)) { verbose(2, "udcCachePreload failed"); bytesRead = 0; break; } /* Currently only need fseek here. Would be safer, but possibly * slower to move fseek so it is always executed in front of read, in * case other code is moving around file pointer. */ mustLseek(file->fdSparse, start, SEEK_SET); } if (file->sparseReadAhead) { mustReadFd(file->fdSparse, file->sparseReadAheadBuf, size); end = saveEnd; size = end - start; } else { mustReadFd(file->fdSparse, cbuf, size); file->offset += size; bytesRead += size; break; } } return bytesRead; } void udcMustRead(struct udcFile *file, void *buf, bits64 size) /* Read a block from file. Abort if any problem, including EOF before size is read. */ { bits64 sizeRead = udcRead(file, buf, size); if (sizeRead < size) errAbort("udc couldn't read %llu bytes from %s, did read %llu", size, file->url, sizeRead); } int udcGetChar(struct udcFile *file) /* Get next character from file or die trying. */ { UBYTE b; udcMustRead(file, &b, 1); return b; } bits64 udcReadBits64(struct udcFile *file, boolean isSwapped) /* Read and optionally byte-swap 64 bit entity. */ { bits64 val; udcMustRead(file, &val, sizeof(val)); if (isSwapped) val = byteSwap64(val); return val; } bits32 udcReadBits32(struct udcFile *file, boolean isSwapped) /* Read and optionally byte-swap 32 bit entity. */ { bits32 val; udcMustRead(file, &val, sizeof(val)); if (isSwapped) val = byteSwap32(val); return val; } bits16 udcReadBits16(struct udcFile *file, boolean isSwapped) /* Read and optionally byte-swap 16 bit entity. */ { bits16 val; udcMustRead(file, &val, sizeof(val)); if (isSwapped) val = byteSwap16(val); return val; } float udcReadFloat(struct udcFile *file, boolean isSwapped) /* Read and optionally byte-swap floating point number. */ { float val; udcMustRead(file, &val, sizeof(val)); if (isSwapped) val = byteSwapFloat(val); return val; } double udcReadDouble(struct udcFile *file, boolean isSwapped) /* Read and optionally byte-swap double-precision floating point number. */ { double val; udcMustRead(file, &val, sizeof(val)); if (isSwapped) val = byteSwapDouble(val); return val; } char *udcReadLine(struct udcFile *file) /* Fetch next line from udc cache or NULL. */ { char shortBuf[2], *longBuf = NULL, *buf = shortBuf; int i, bufSize = sizeof(shortBuf); for (i=0; ; ++i) { /* See if need to expand buffer, which is initially on stack, but if it gets big goes into * heap. */ if (i >= bufSize) { int newBufSize = bufSize*2; char *newBuf = needLargeMem(newBufSize); memcpy(newBuf, buf, bufSize); freeMem(longBuf); buf = longBuf = newBuf; bufSize = newBufSize; } char c; bits64 sizeRead = udcRead(file, &c, 1); if (sizeRead == 0) return NULL; buf[i] = c; if (c == '\n') { buf[i] = 0; break; } } char *retString = cloneString(buf); freeMem(longBuf); return retString; } char *udcReadStringAndZero(struct udcFile *file) /* Read in zero terminated string from file. Do a freeMem of result when done. */ { char shortBuf[2], *longBuf = NULL, *buf = shortBuf; int i, bufSize = sizeof(shortBuf); for (i=0; ; ++i) { /* See if need to expand buffer, which is initially on stack, but if it gets big goes into * heap. */ if (i >= bufSize) { int newBufSize = bufSize*2; char *newBuf = needLargeMem(newBufSize); memcpy(newBuf, buf, bufSize); freeMem(longBuf); buf = longBuf = newBuf; bufSize = newBufSize; } char c = udcGetChar(file); buf[i] = c; if (c == 0) break; } char *retString = cloneString(buf); freeMem(longBuf); return retString; } char *udcFileReadAll(char *url, char *cacheDir, size_t maxSize, size_t *retSize) /* Read a complete file via UDC. The cacheDir may be null in which case udcDefaultDir() * will be used. If maxSize is non-zero, check size against maxSize * and abort if it's bigger. Returns file data (with an extra terminal for the * common case where it's treated as a C string). If retSize is non-NULL then * returns size of file in *retSize. Do a freeMem or freez of the returned buffer * when done. */ { struct udcFile *file = udcFileOpen(url, cacheDir); size_t size = file->size; if (maxSize != 0 && size > maxSize) errAbort("%s is %lld bytes, but maxSize to udcFileReadAll is %lld", url, (long long)size, (long long)maxSize); char *buf = needLargeMem(size+1); udcMustRead(file, buf, size); buf[size] = 0; // add trailing zero for string processing udcFileClose(&file); if (retSize != NULL) *retSize = size; return buf; } struct lineFile *udcWrapShortLineFile(char *url, char *cacheDir, size_t maxSize) /* Read in entire short (up to maxSize) url into memory and wrap a line file around it. * The cacheDir may be null in which case udcDefaultDir() will be used. If maxSize * is zero then a default value (currently 64 meg) will be used. */ { if (maxSize == 0) maxSize = 64 * 1024 * 1024; char *buf = udcFileReadAll(url, cacheDir, maxSize, NULL); return lineFileOnString(url, TRUE, buf); } void udcSeekCur(struct udcFile *file, bits64 offset) /* Seek to a particular position in file. */ { file->offset += offset; mustLseek(file->fdSparse, offset, SEEK_CUR); } void udcSeek(struct udcFile *file, bits64 offset) /* Seek to a particular position in file. */ { file->offset = offset; mustLseek(file->fdSparse, offset, SEEK_SET); } bits64 udcTell(struct udcFile *file) /* Return current file position. */ { return file->offset; } static long bitRealDataSize(char *fileName) /* Return number of real bytes indicated by bitmaps */ { struct udcBitmap *bits = udcBitmapOpen(fileName); int blockSize = bits->blockSize; long byteSize = 0; int blockCount = (bits->fileSize + blockSize - 1)/blockSize; if (blockCount > 0) { int bitmapSize = bitToByteSize(blockCount); Bits *b = needLargeMem(bitmapSize); mustReadFd(bits->fd, b, bitmapSize); int bitsSet = bitCountRange(b, 0, blockCount); byteSize = (long)bitsSet*blockSize; freez(&b); } udcBitmapClose(&bits); return byteSize; } static bits64 rCleanup(time_t deleteTime, boolean testOnly) /* Delete any bitmap or sparseData files last accessed before deleteTime */ { struct fileInfo *file, *fileList = listDirX(".", "*", FALSE); bits64 results = 0; for (file = fileList; file != NULL; file = file->next) { if (file->isDir) { setCurrentDir(file->name); bits64 oneResult = rCleanup(deleteTime, testOnly); setCurrentDir(".."); if (oneResult > 0) { if (!testOnly) remove(file->name); results += oneResult; results += file->size; } } else if (sameString(file->name, bitmapName)) { if (file->size > udcBitmapHeaderSize) /* prevent failure on bitmap files of size 0 or less than header size */ verbose(2, "%ld (%ld) %s/%s\n", bitRealDataSize(file->name), (long)file->size, getCurrentDir(), file->name); if (file->lastAccess < deleteTime) { /* Remove all files when get bitmap, so that can ensure they are deleted in * right order. */ results += file->size; if (!testOnly) { remove(bitmapName); remove(sparseDataName); } } } else if (sameString(file->name, sparseDataName)) { if (results > 0) results += file->size; } } return results; } bits64 udcCleanup(char *cacheDir, double maxDays, boolean testOnly) /* Remove cached files older than maxDays old. If testOnly is set * no clean up is done, but the size of the files that would be * cleaned up is still. */ { time_t maxSeconds = maxDays * 24 * 60 * 60; char *curPath = cloneString(getCurrentDir()); setCurrentDir(cacheDir); time_t deleteTime = time(NULL) - maxSeconds; bits64 result = rCleanup(deleteTime, testOnly); setCurrentDir(curPath); return result; } static char *defaultDir = "/tmp/udcCache"; char *udcDefaultDir() /* Get default directory for cache */ { return defaultDir; } void udcSetDefaultDir(char *path) /* Set default directory for cache */ { defaultDir = cloneString(path); } int udcCacheTimeout() /* Get cache timeout (if local cache files are newer than this many seconds, * we won't ping the remote server to check the file size and update time). */ { return cacheTimeout; } void udcSetCacheTimeout(int timeout) /* Set cache timeout (if local cache files are newer than this many seconds, * we won't ping the remote server to check the file size and update time). */ { cacheTimeout = timeout; } time_t udcUpdateTime(struct udcFile *udc) /* return udc->updateTime */ { if (sameString("transparent", udc->protocol)) { struct stat status; int ret = stat(udc->url, &status); if (ret < 0) return 0; else return status.st_mtime; } return udc->updateTime; } off_t udcFileSize(char *url) /* fetch file size from given URL or local path * returns -1 if not found. */ { if (udcIsLocal(url)) return fileSize(url); off_t ret = -1; #ifdef WIN32 errAbort("udc/udcFileSize: invalid protocol for url %s, only file:// URLs are supported on Windows", url); #else // don't go to the network if we can avoid it int cacheSize = udcSizeFromCache(url, NULL); if (cacheSize!=-1) return cacheSize; struct udcRemoteFileInfo info; if (startsWith("http://",url) || startsWith("https://",url)) { if (udcInfoViaHttp(url, &info)) ret = info.size; } else if (startsWith("ftp://",url)) { if (udcInfoViaFtp(url, &info)) ret = info.size; } else errAbort("udc/udcFileSize: invalid protocol for url %s, can only do http/https/ftp", url); #endif return ret; } boolean udcIsLocal(char *url) /* return true if file is not a http or ftp file, just a local file */ { // copied from above char *protocol = NULL, *afterProtocol = NULL, *colon; udcParseUrl(url, &protocol, &afterProtocol, &colon); freez(&protocol); freez(&afterProtocol); return colon==NULL; } boolean udcExists(char *url) /* return true if a local or remote file exists */ { return udcFileSize(url)!=-1; } rtracklayer/src/ucsc/udc.h0000644000175400017540000001615313556116552016612 0ustar00biocbuildbiocbuild/* udc - url data cache - a caching system that keeps blocks of data fetched from URLs in * sparse local files for quick use the next time the data is needed. * * This cache is enormously simplified by there being no local _write_ to the cache, * just reads. * * The overall strategy of the implementation is to have a root cache directory * with a subdir for each file being cached. The directory for a single cached file * contains two files - "bitmap" and "sparseData" that contains information on which * parts of the URL are cached and the actual cached data respectively. The subdirectory name * associated with the file is constructed from the URL in a straightforward manner. * http://genome.ucsc.edu/cgi-bin/hgGateway * gets mapped to: * rootCacheDir/http/genome.ucsc.edu/cgi-bin/hgGateway/ * The URL protocol is the first directory under the root, and the remainder of the * URL, with some necessary escaping, is used to define the rest of the cache directory * structure, with each '/' after the protocol line translating into another directory * level. * * The bitmap file contains time stamp and size data as well as an array with one bit * for each block of the file that has been fetched. Currently the block size is 8K. */ #ifndef UDC_H #define UDC_H struct udcFile; /* Handle to a cached file. Inside of structure mysterious unless you are udc.c. */ struct udcFile *udcFileMayOpen(char *url, char *cacheDir); /* Open up a cached file. cacheDir may be null in which case udcDefaultDir() will be * used. Return NULL if file doesn't exist. */ struct udcFile *udcFileOpen(char *url, char *cacheDir); /* Open up a cached file. cacheDir may be null in which case udcDefaultDir() will be * used. Abort if if file doesn't exist. */ void udcFileClose(struct udcFile **pFile); /* Close down cached file. */ bits64 udcRead(struct udcFile *file, void *buf, bits64 size); /* Read a block from file. Return amount actually read. */ #define udcReadOne(file, var) udcRead(file, &(var), sizeof(var)) /* Read one variable from file or die. */ void udcMustRead(struct udcFile *file, void *buf, bits64 size); /* Read a block from file. Abort if any problem, including EOF before size is read. */ #define udcMustReadOne(file, var) udcMustRead(file, &(var), sizeof(var)) /* Read one variable from file or die. */ bits64 udcReadBits64(struct udcFile *file, boolean isSwapped); /* Read and optionally byte-swap 64 bit entity. */ bits32 udcReadBits32(struct udcFile *file, boolean isSwapped); /* Read and optionally byte-swap 32 bit entity. */ bits16 udcReadBits16(struct udcFile *file, boolean isSwapped); /* Read and optionally byte-swap 16 bit entity. */ float udcReadFloat(struct udcFile *file, boolean isSwapped); /* Read and optionally byte-swap floating point number. */ double udcReadDouble(struct udcFile *file, boolean isSwapped); /* Read and optionally byte-swap double-precision floating point number. */ int udcGetChar(struct udcFile *file); /* Get next character from file or die trying. */ char *udcReadLine(struct udcFile *file); /* Fetch next line from udc cache. */ char *udcReadStringAndZero(struct udcFile *file); /* Read in zero terminated string from file. Do a freeMem of result when done. */ char *udcFileReadAll(char *url, char *cacheDir, size_t maxSize, size_t *retSize); /* Read a complete file via UDC. The cacheDir may be null in which case udcDefaultDir() * will be used. If maxSize is non-zero, check size against maxSize * and abort if it's bigger. Returns file data (with an extra terminal for the * common case where it's treated as a C string). If retSize is non-NULL then * returns size of file in *retSize. Do a freeMem or freez of the returned buffer * when done. */ struct lineFile *udcWrapShortLineFile(char *url, char *cacheDir, size_t maxSize); /* Read in entire short (up to maxSize) url into memory and wrap a line file around it. * The cacheDir may be null in which case udcDefaultDir() will be used. If maxSize * is zero then a default value (currently 64 meg) will be used. */ void udcSeek(struct udcFile *file, bits64 offset); /* Seek to a particular (absolute) position in file. */ void udcSeekCur(struct udcFile *file, bits64 offset); /* Seek to a particular (from current) position in file. */ bits64 udcTell(struct udcFile *file); /* Return current file position. */ bits64 udcCleanup(char *cacheDir, double maxDays, boolean testOnly); /* Remove cached files older than maxDays old. If testOnly is set * no clean up is done, but the size of the files that would be * cleaned up is still. */ void udcParseUrl(char *url, char **retProtocol, char **retAfterProtocol, char **retColon); /* Parse the URL into components that udc treats separately. * *retAfterProtocol is Q-encoded to keep special chars out of filenames. * Free all *ret's except *retColon when done. */ void udcParseUrlFull(char *url, char **retProtocol, char **retAfterProtocol, char **retColon, char **retAuth); /* Parse the URL into components that udc treats separately. * *retAfterProtocol is Q-encoded to keep special chars out of filenames. * Free all *ret's except *retColon when done. */ char *udcDefaultDir(); /* Get default directory for cache. Use this for the udcFileOpen call if you * don't have anything better.... */ void udcSetDefaultDir(char *path); /* Set default directory for cache */ #define udcDevicePrefix "udc:" /* Prefix used by convention to indicate a file should be accessed via udc. This is * followed by the local path name or a url, so in common practice you see things like: * udc:http://genome.ucsc.edu/goldenPath/hg18/tracks/someTrack.bb */ struct slName *udcFileCacheFiles(char *url, char *cacheDir); /* Return low-level list of files used in cache. */ char *udcPathToUrl(const char *path, char *buf, size_t size, char *cacheDir); /* Translate path into an URL, store in buf, return pointer to buf if successful * and NULL if not. */ long long int udcSizeFromCache(char *url, char *cacheDir); /* Look up the file size from the local cache bitmap file, or -1 if there * is no cache for url. */ unsigned long udcCacheAge(char *url, char *cacheDir); /* Return the age in seconds of the oldest cache file. If a cache file is * missing, return the current time (seconds since the epoch). */ int udcCacheTimeout(); /* Get cache timeout (if local cache files are newer than this many seconds, * we won't ping the remote server to check the file size and update time). */ void udcSetCacheTimeout(int timeout); /* Set cache timeout (if local cache files are newer than this many seconds, * we won't ping the remote server to check the file size and update time). */ time_t udcUpdateTime(struct udcFile *udc); /* return udc->updateTime */ boolean udcFastReadString(struct udcFile *f, char buf[256]); /* Read a string into buffer, which must be long enough * to hold it. String is in 'writeString' format. */ off_t udcFileSize(char *url); /* fetch remote or loca file size from given URL or path */ boolean udcExists(char *url); /* return true if a remote or local file exists */ boolean udcIsLocal(char *url); /* return true if url is not a http or ftp file, just a normal local file path */ #endif /* UDC_H */ rtracklayer/src/ucsc/verbose.c0000644000175400017540000000660113556116552017474 0ustar00biocbuildbiocbuild/* verbose.c - write out status messages according to the * current verbosity level. These messages go to stderr. */ /* Copyright (C) 2011 The Regents of the University of California * See README in this or parent directory for licensing information. */ #include "common.h" #include "portable.h" #include "verbose.h" static int logVerbosity = 1; /* The level of log verbosity. 0 is silent. */ static FILE *logFile; /* File to log to. */ static boolean checkedDotsEnabled = FALSE; /* have we check for dot output * being enabled? */ static boolean dotsEnabled = FALSE; /* is dot output enabled? */ void verboseVa(int verbosity, char *format, va_list args) /* Log with at given verbosity vprintf formatted args. */ { if (verbosity <= logVerbosity) { if (logFile == NULL) logFile = stderr; vfprintf(logFile, format, args); fflush(logFile); } } void verbose(int verbosity, char *format, ...) /* Write printf formatted message to log (which by * default is stderr) if global verbose variable * is set to verbosity or higher. */ { va_list args; va_start(args, format); verboseVa(verbosity, format, args); va_end(args); } static long lastTime = -1; // previous call time. void verboseTimeInit(void) /* Initialize or reinitialize the previous time for use by verboseTime. */ { lastTime = clock1000(); } void verboseTime(int verbosity, char *label, ...) /* Print label and how long it's been since last call. Start time can be * initialized with verboseTimeInit, otherwise the elapsed time will be * zero. */ { assert(label != NULL); // original version allowed this, but breaks some GCCs if (lastTime < 0) verboseTimeInit(); long time = clock1000(); va_list args; va_start(args, label); verboseVa(verbosity, label, args); verbose(verbosity, ": %ld millis\n", time - lastTime); lastTime = time; va_end(args); } boolean verboseDotsEnabled() /* check if outputting of happy dots are enabled. They will be enabled if the * verbosity is > 0, stderr is a tty and we don't appear to be running an * emacs shell. */ { if (!checkedDotsEnabled) { if (logFile == NULL) logFile = stderr; dotsEnabled = (logVerbosity > 0) && isatty(fileno(logFile)); if (dotsEnabled) { /* check for an possible emacs shell */ char *emacs = getenv("emacs"); char *term = getenv("TERM"); if ((emacs != NULL) && (emacs[0] == 't')) dotsEnabled = FALSE; else if ((term != NULL) && sameString(term, "dumb")) dotsEnabled = FALSE; } checkedDotsEnabled = TRUE; } return dotsEnabled; } void verboseDot() /* Write I'm alive dot (at verbosity level 1) */ { if (verboseDotsEnabled()) verbose(1, "."); } void verboseSetLevel(int verbosity) /* Set verbosity level in log. 0 for no logging, * higher number for increasing verbosity. */ { logVerbosity = verbosity; checkedDotsEnabled = FALSE; /* force rechecking of dots enabled */ } int verboseLevel(void) /* Get verbosity level. */ { return logVerbosity; } void verboseSetLogFile(char *name) /* Set logFile for verbose messages overrides stderr. */ { if (sameString(name, "stdout")) logFile = stdout; else if (sameString(name, "stderr")) logFile = stderr; else logFile = mustOpen(name, "w"); } FILE *verboseLogFile() /* Get the verbose log file. */ { if (logFile == NULL) logFile = stderr; return logFile; } rtracklayer/src/ucsc/verbose.h0000644000175400017540000000302013556116552017471 0ustar00biocbuildbiocbuild/* verbose.h - write out status messages according to the * current verbosity level. These messages go to stderr. */ #ifndef VERBOSE_H #define VERBOSE_H void verbose(int verbosity, char *format, ...) /* Write printf formatted message to log (which by * default is stderr) if global verbose variable * is set to verbosity or higher. */ #if defined(__GNUC__) __attribute__((format(printf, 2, 3))) #endif ; void verboseVa(int verbosity, char *format, va_list args); /* Log with at given verbosity vprintf formatted args. */ void verboseTimeInit(void); /* Initialize or reinitialize the previous time for use by verboseTime. */ void verboseTime(int verbosity, char *label, ...) /* Print label and how long it's been since last call. Start time can be * initialized with verboseTimeInit, otherwise the elapsed time will be * zero. */ #if defined(__GNUC__) __attribute__((format(printf, 2, 3))) #endif ; void verboseDot(); /* Write I'm alive dot (at verbosity level 1) */ boolean verboseDotsEnabled(); /* check if outputting of happy dots are enabled. They will be enabled if the * verbosity is > 0, stderr is a tty and we don't appear to be running an * emacs shell. */ int verboseLevel(void); /* Get verbosity level. */ void verboseSetLevel(int verbosity); /* Set verbosity level in log. 0 for no logging, * higher number for increasing verbosity. */ void verboseSetLogFile(char *name); /* Set logFile for verbose messages overrides stderr. */ FILE *verboseLogFile(); /* Get the verbose log file. */ #endif /* VERBOSE_H */ rtracklayer/src/ucsc/wildcmp.c0000644000175400017540000000445613556116552017474 0ustar00biocbuildbiocbuild/* Wildcard matching. * * This file is copyright 2002 Jim Kent, but license is hereby * granted for all use - public, private or commercial. */ #include "common.h" static int subMatch(const char *str, const char *wild, char single, char multi) /* Returns number of characters that match between str and wild up * to the next wildcard in wild (or up to end of string.). */ { int len = 0; for(;;) { if(toupper(*str++) != toupper(*wild++) ) return(0); ++len; char c = *wild; if (c == 0 || c == single || c == multi) return len; } } boolean anyWild(const char *string) /* Return TRUE if any wild card characters in string. */ { char c; while ((c = *string++) != 0) { if (c == '?' || c == '*') return TRUE; } return FALSE; } static boolean globMatch(const char *wildCard, const char *string, char single, char multi) /* does a case sensitive wild card match with a string. * * matches any string or no character. * ? matches any single character. * anything else etc must match the character exactly. */ { boolean matchStar = 0; int starMatchSize; char c; for(;;) { NEXT_WILD: c = *wildCard; if (c == 0) { if(matchStar) { while(*string++) ; return TRUE; } else if(*string) return FALSE; else return TRUE; } else if (c == multi) { matchStar = TRUE; } else if (c == single) { if(*string == 0) return FALSE; /* out of string, no match for ? */ ++string; } else { if(matchStar) { for(;;) { if(*string == 0) /* if out of string no match */ return FALSE; /* note matchStar is re-used here for substring * after star match length */ if((starMatchSize = subMatch(string,wildCard,single,multi)) != 0) { string += starMatchSize; wildCard += starMatchSize; matchStar = FALSE; goto NEXT_WILD; } ++string; } } /* default: they must be equal or no match */ if(toupper(*string) != toupper(*wildCard)) return FALSE; ++string; } ++wildCard; } } boolean wildMatch(const char *wildCard, const char *string) /* Match using * and ? wildcards. */ { return globMatch(wildCard, string, '?', '*'); } boolean sqlMatchLike(char *wildCard, char *string) /* Match using % and _ wildcards. */ { return globMatch(wildCard, string, '_', '%'); } rtracklayer/src/ucsc/zlibFace.c0000644000175400017540000000551113556116552017545 0ustar00biocbuildbiocbuild/* Wrappers around zlib to make interfacing to it a bit easier. */ /* Copyright (C) 2009 The Regents of the University of California * See README in this or parent directory for licensing information. */ #include "common.h" #include static char *zlibErrorMessage(int err) /* Convert error code to errorMessage */ { switch (err) { case Z_STREAM_END: return "zlib stream end"; case Z_NEED_DICT: return "zlib need dictionary"; case Z_ERRNO: return "zlib errno"; case Z_STREAM_ERROR: return "zlib data error"; case Z_DATA_ERROR: return "zlib data error"; case Z_MEM_ERROR: return "zlib mem error"; case Z_BUF_ERROR: return "zlib buf error"; case Z_VERSION_ERROR: return "zlib version error"; case Z_OK: return NULL; default: { static char msg[128]; safef(msg, sizeof(msg), "zlib error code %d", err); return msg; } } } size_t zCompress( void *uncompressed, /* Start of area to compress. */ size_t uncompressedSize, /* Size of area to compress. */ void *compBuf, /* Where to put compressed bits */ size_t compBufSize) /* Size of compressed bits - calculate using zCompBufSize */ /* Compress data from memory to memory. Returns size after compression. */ { uLongf compSize = compBufSize; int err = compress((Bytef*)compBuf, &compSize, (Bytef*)uncompressed, (uLong)uncompressedSize); if (err != 0) errAbort("Couldn't zCompress %lld bytes: %s", (long long)uncompressedSize, zlibErrorMessage(err)); return compSize; } size_t zCompBufSize(size_t uncompressedSize) /* Return size of buffer needed to compress something of given size uncompressed. */ { return 1.001*uncompressedSize + 13; } size_t zUncompress( void *compressed, /* Compressed area */ size_t compressedSize, /* Size after compression */ void *uncompBuf, /* Where to put uncompressed bits */ size_t uncompBufSize) /* Max size of uncompressed bits. */ /* Uncompress data from memory to memory. Returns size after decompression. */ { uLongf uncSize = uncompBufSize; int err = uncompress(uncompBuf, &uncSize, compressed, compressedSize); if (err != 0) errAbort("Couldn't zUncompress %lld bytes: %s", (long long)compressedSize, zlibErrorMessage(err)); return uncSize; } void zSelfTest(int count) /* Run an internal diagnostic. */ { bits32 testData[count]; int uncSize = count*sizeof(bits32); int i; for (i=0; i 0)); } /* Utility for collapsing elements of a CharacterList */ /* Assumes that 'x' is a 'list' */ SEXP CharacterList_pasteCollapse(SEXP x, SEXP sep) { SEXP ans; if (TYPEOF(x) != VECSXP) error("CharacterList_collapse: expected a list"); PROTECT(ans = allocVector(STRSXP, length(x))); for (int i = 0; i < length(x); i++) SET_STRING_ELT(ans, i, _STRSXP_collapse(VECTOR_ELT(x, i), sep)); UNPROTECT(1); return ans; } rtracklayer/src/utils.h0000644000175400017540000000016713556116552016240 0ustar00biocbuildbiocbuild#ifndef UTILS_H #define UTILS_H #include "rtracklayer.h" SEXP CharacterList_pasteCollapse(SEXP x, SEXP sep); #endif rtracklayer/tests/0000755000175400017540000000000013556116552015276 5ustar00biocbuildbiocbuildrtracklayer/tests/rtracklayer_unit_tests.R0000644000175400017540000000013313556116552022222 0ustar00biocbuildbiocbuildrequire("rtracklayer") || stop("unable to load rtracklayer package") rtracklayer:::.test() rtracklayer/vignettes/0000755000175400017540000000000013556147727016154 5ustar00biocbuildbiocbuildrtracklayer/vignettes/example.bed0000644000175400017540000000131413556116552020252 0ustar00biocbuildbiocbuild##Example 5 from Custom Annotation Tracks User's Guide track name="ItemRGBDemo" description="Item RGB demonstration" visibility=2 itemRgb="On" priority=1 useScore="0" color="0,60,120" colorByStrand="0,0,255 255,0,0" group="user" offset=0 url="http://genome.ucsc.edu/" htmlUrl="http://genome.ucsc.edu/goldenPath/help/ct_description.txt" chr7 127471196 127472363 Pos1 0 + 127471196 127472363 255,0,0 3 300,200,100 0,500,1067 chr7 127472363 127473530 Pos2 2 + 127472363 127473530 255,0,0 2 250,500 0,667 chr7 127473530 127474697 Neg1 0 - 127473530 127474697 255,0,0 1 1167 0 chr16 127474697 127475864 Pos3 5 + 127474697 127475864 255,0,0 1 1167 0 chr16 127475864 127477031 Neg2 5 - 127475864 127477031 0,0,255 1 1167 0 rtracklayer/vignettes/rtracklayer.Rnw0000644000175400017540000006634313556116552021173 0ustar00biocbuildbiocbuild\documentclass{article} %\VignetteIndexEntry{rtracklayer} \usepackage[usenames,dvipsnames]{color} \usepackage[colorlinks=true, linkcolor=Blue, urlcolor=Blue, citecolor=Blue]{hyperref} \newcommand{\Rfunction}[1]{{\texttt{#1}}} \newcommand{\Robject}[1]{{\texttt{#1}}} \newcommand{\Rpackage}[1]{{\textit{#1}}} \newcommand{\Rmethod}[1]{{\texttt{#1}}} \newcommand{\Rfunarg}[1]{{\texttt{#1}}} \newcommand{\Rclass}[1]{{\textit{#1}}} \newcommand{\Rcode}[1]{{\texttt{#1}}} \newcommand{\software}[1]{\textsf{#1}} \newcommand{\R}{\software{R}} \newcommand{\IRanges}{\Rpackage{IRanges}} \title{The \textbf{rtracklayer} package} \author{Michael Lawrence} \begin{document} \maketitle <>= options(width=70) @ \tableofcontents \section{Introduction} The \textbf{rtracklayer} package is an interface (or \emph{layer}) between \textbf{R} and genome browsers. Its main purpose is the visualization of genomic annotation \emph{tracks}, whether generated through experimental data analysis performed in R or loaded from an external data source. The features of \textbf{rtracklayer} may be divided into two categories: 1) the import/export of track data and 2) the control and querying of external genome browser sessions and views. The basic track data structure in Bioconductor is the \Rclass{GRanges} class, defined in the \Rpackage{GenomicRanges} package. \textbf{rtracklayer} supports the import and export of tracks from and to files in various formats, see Section~\ref{sec:import-export}. All positions in a \Rclass{GRanges} should be 1-based, as in R itself. The \textbf{rtracklayer} package currently interfaces with the \textbf{UCSC} web-based genome browser. Other packages may provide drivers for other genome browsers through a plugin system. With \textbf{rtracklayer}, the user may start a genome browser session, create and manipulate genomic views, and import/export tracks and sequences to and from a browser. Please note that not all features are necessarily supported by every browser interface. The rest of this vignette will consist of a number of case studies. First, we consider an experiment investigating microRNA regulation of gene expression, where the microRNA target sites are the primary genomic features of interest. \section{Gene expression and microRNA target sites} This section will demonstrate the features of \textbf{rtracklayer} on a microarray dataset from a larger experiment investigating the regulation of human stem cell differentiation by microRNAs. The transcriptome of the cells was measured before and after differentiation by HG-U133plus2 Affymetrix GeneChip arrays. We begin our demonstration by constructing an annotation dataset from the experimental data, and then illustrate the use of the genome browser interface to display interesting genomic regions in the UCSC browser. \subsection{Creating a target site track} For the analysis of the stem cell microarray data, we are interested in the genomic regions corresponding to differentially expressed genes that are known to be targeted by a microRNA. We will represent this information as an annotation track, so that we may view it in the UCSC genome browser. \subsubsection{Constructing the \Rclass{GRanges}} In preparation for creating the microRNA target track, we first used \textbf{limma} to detect the differentially expressed genes in the microarray experiment. The locations of the microRNA target sites were obtained from MiRBase. The code below stores information about the target sites on differentially expressed genes in the \textit{data.frame} called \texttt{targets}, which can also be obtained by entering \texttt{data(targets)} when \textbf{rtracklayer} is loaded. % <>= library("humanStemCell") data(fhesc) library("genefilter") filtFhesc <- nsFilter(fhesc)[[1]] library("limma") design <- model.matrix(~filtFhesc$Diff) hesclim <- lmFit(filtFhesc, design) hesceb <- eBayes(hesclim) tab <- topTable(hesceb, coef = 2, adjust.method = "BH", n = 7676) tab2 <- tab[(tab$logFC > 1) & (tab$adj.P.Val < 0.01),] affyIDs <- rownames(tab2) library("microRNA") data(hsTargets) library("hgu133plus2.db") entrezIDs <- mappedRkeys(hgu133plus2ENTREZID[affyIDs]) library("org.Hs.eg.db") mappedEntrezIDs <- entrezIDs[entrezIDs %in% mappedkeys(org.Hs.egENSEMBLTRANS)] ensemblIDs <- mappedRkeys(org.Hs.egENSEMBLTRANS[mappedEntrezIDs]) targetMatches <- match(ensemblIDs, hsTargets$target, 0) ## same as data(targets) targets <- hsTargets[targetMatches,] targets$chrom <- paste("chr", targets$chrom, sep = "") @ % The following code creates the track from the \texttt{targets} dataset: % <>= library(rtracklayer) library(GenomicRanges) ## call data(targets) if skipping first block head(targets) targetRanges <- IRanges(targets$start, targets$end) targetTrack <- with(targets, GRangesForUCSCGenome("hg18", chrom, targetRanges, strand, name, target)) @ % The \Rfunction{GRangesForUCSCGenome} function constructs a \Rclass{GRanges} object for the named genome. The strand information, the name of the microRNA and the Ensembl ID of the targeted transcript are stored in the \Rclass{GRanges}. The chromosome for each site is passed as the \texttt{chrom} argument. The chromosome names and lengths for the genome are taken from the UCSC database and stored in the \Rclass{GRanges} along with the genome identifier. We can retrieve them as follows: <>= genome(targetTrack) head(seqlengths(targetTrack)) @ % While this extra information is not strictly needed to upload data to UCSC, calling \Rfunction{GRangesForUCSCGenome} is an easy way to formally associate interval data to a UCSC genome build. This ensures, for example, that the data will always be uploaded to the correct genome, regardless of browser state. It also immediately validates whether the intervals fall within the bounds of the genome. For cases where one is not interacting with the UCSC genome browser, and in particular when network access is unavailable, the \Rfunction{GRangesForBSGenome} function behaves the same, except it finds an installed \Rpackage{BSGenome} package and loads it to retrieve the chromosome information. \subsubsection{Accessing track information} The track information is now stored in the R session as a \Rclass{GRanges} object. It holds the chromosme, start, end and strand for each feature, along with any number of data columns. The primary feature attributes are the \texttt{start}, \texttt{end}, \texttt{seqnames} and \texttt{strand}. There are accessors for each of these, named accordingly. For example, the following code retrieves the chromosome names and then start positions for each feature in the track. % <>= head(seqnames(targetTrack)) head(start(targetTrack)) @ % \paragraph{Exercises} \begin{enumerate} \item Get the strand of each feature in the track \item Calculate the length of each feature \item Reconstruct (partially) the \texttt{targets} \Rclass{data.frame} \end{enumerate} <>= head(strand(targetTrack)) head(width(targetTrack)) data.frame(chrom = as.factor(seqnames(targetTrack)), start = start(targetTrack), end = end(targetTrack), strand = as.factor(strand(targetTrack))) @ \subsubsection{Subsetting a \textit{GRanges}} It is often helpful to extract subsets from \Rclass{GRanges} instances, especially when uploading to a genome browser. The data can be subset though a matrix-style syntax by feature and column. The conventional \texttt{[} method is employed for subsetting, where the first parameter, \textit{i}, indexes the features and \textit{j} indexes the data columns. Both \textit{i} and \textit{j} may contain numeric, logical and character indices, which behave as expected. % <>= ## get the first 10 targets first10 <- targetTrack[1:10] ## get pos strand targets posTargets <- targetTrack[strand(targetTrack) == "+"] ## get the targets on chr1 chr1Targets <- targetTrack[seqnames(targetTrack) == "chr1"] @ % \paragraph{Exercises} \begin{enumerate} \item Subset the track for all features on the negative strand of chromosome 2. \end{enumerate} <>= negChr2Targets <- targetTrack[strand(targetTrack) == "-" & seqnames(targetTrack) == "chr2"] @ \subsubsection{Exporting and importing tracks} \label{sec:import-export} Import and export of \Rclass{GRanges} instances is supported in the following formats: Browser Extended Display (BED), versions 1, 2 and 3 of the General Feature Format (GFF), and Wiggle (WIG). Support for additional formats may be provided by other packages through a plugin system. To save the microRNA target track created above in a format understood by other tools, we could export it as BED. This is done with the \texttt{export} function, which accepts a filename or any R connection object as its target. If a target is not given, the serialized string is returned. The desired format is derived, by default, from the extension of the filename. Use the \texttt{format} parameter to explicitly specify a format. <>= export(targetTrack, "targets.bed") @ To read the data back in a future session, we could use the \texttt{import} function. The source of the data may be given as a connection, a filename or a character vector containing the data. Like the \texttt{export} function, the format is determined from the filename, by default. <>= restoredTrack <- import("targets.bed") @ % The \Robject{restoredTrack} object is of class \Rclass{GRanges}. % \paragraph{Exercises} \begin{enumerate} \item Output the track to a file in the ``gff'' format. \item Read the track back into R. \item Export the track as a character vector. \end{enumerate} <>= export(targetTrack, "targets.gff") targetGff <- import("targets.gff") targetChar <- export(targetTrack, format = "gff1") @ \subsection{Viewing the targets in a genome browser} For the next step in our example, we will load the track into a genome browser for visualization with other genomic annotations. The \textbf{rtracklayer} package is capable of interfacing with any genome browser for which a driver exists. In this case, we will interact with the web-based \textbf{UCSC} browser, but the same code should work for any browser. \subsubsection{Starting a session} The first step towards interfacing with a browser is to start a browser session, represented in R as a \textit{BrowserSession} object. A \textit{BrowserSession} is primarily a container of tracks and genomic views. The following code creates a \textit{BrowserSession} for the \textbf{UCSC} browser: <>= session <- browserSession("UCSC") @ Note that the name of any other supported browser could have been given here instead of ``UCSC''. To see the names of supported browsers, enter: <>= genomeBrowsers() @ \subsubsection{Laying the track} Before a track can be viewed on the genome, it must be loaded into the session using the \texttt{track<-} function, as demonstrated below: <>= track(session, "targets") <- targetTrack @ The \textit{name} argument should be a character vector that will help identify the track within \texttt{session}. Note that the invocation of \texttt{track<-} above does not specify an upload format. Thus, the default, ``auto'', is used. Since the track does not contain any data values, the track is uploaded as BED. To make this explicit, we could pass ``bed'' as the \textit{format} parameter. \paragraph{Exercises} \begin{enumerate} \item Lay a track with the first 100 features of \texttt{targetTrack} \end{enumerate} Here we use the short-cut \texttt{\$} syntax for storing the track. <>= session$target100 <- targetTrack[1:100] @ \subsubsection{Viewing the track} For \textbf{UCSC}, a view roughly corresponds to one tab or window in the web browser. The target sites are distributed throughout the genome, so we will only be able to view a few features at a time. In this case, we will view only the first feature in the track. A convenient way to focus a view on a particular set of features is to subset the track and pass the range of the subtrack to the constructor of the view. Below we take a track subset that contains only the first feature. <>= subTargetTrack <- targetTrack[1] # get first feature @ Now we call the \texttt{browserView} function to construct the view and pass the subtrack, zoomed out by a factor of 10, as the segment to view. By passing the name of the targets track in the \textit{pack} parameter, we instruct the browser to use the ``pack'' mode for viewing the track. This results in the name of the microRNA appearing next to the target site glyph. <>= view <- browserView(session, subTargetTrack * -10, pack = "targets") @ If multiple ranges are provided, multiple views are launched: <>= view <- browserView(session, targetTrack[1:5] * -10, pack = "targets") @ \paragraph{Exercises} \begin{enumerate} \item Create a new view with the same region as \texttt{view}, except zoomed out 2X. \item Create a view with the ``targets'' track displayed in ``full'' mode, instead of ``packed''. \end{enumerate} <>= viewOut <- browserView(session, range(view) * -2) viewFull <- browserView(session, full = "targets") @ \subsubsection{A shortcut} There is also a shortcut to the above steps. The \texttt{browseGenome} function creates a session for a specified browser, loads one or more tracks into the session and creates a view of a given genome segment. In the following code, we create a new \textbf{UCSC} session, load the track and view the first two features, all in one call: <>= browseGenome(targetTrack, range = subTargetTrack * -10) @ It is even simpler to view the subtrack in \textbf{UCSC} by relying on parameter defaults: <>= browseGenome(subTargetTrack) @ \subsubsection{Downloading Tracks from your Web Browser} @ It is possible to query the browser to obtain the names of the loaded tracks and to download the tracks into R. To list the tracks loaded in the browser, enter the following: % <>= loaded_tracks <- trackNames(session) @ % One may download any of the tracks, such as the ``targets'' track that was loaded previously in this example. % <>= subTargetTrack <- track(session, "targets") @ % The returned object is a \Rclass{GRanges}, even if the data was originally uploaded as another object. By default, the segment of the track downloaded is the current default genome segment associated with the session. One may download track data for any genome segment, such as those on a particular chromosome. Note that this does not distinguish by strand; we are only indicating a position on the genome. % <>= chr1Targets <- track(session, "targets", chr1Targets) @ \paragraph{Exercises} \begin{enumerate} \item Get the SNP under the first target, displayed in \texttt{view}. \item Get the UCSC gene for the same target. \end{enumerate} <>= region <- range(subTargetTrack) + 500 targetSNP <- track(session, "snp130", region) as.data.frame(targetSNP) targetGene <- track(session, "knownGene", region) as.data.frame(targetGene) @ \subsubsection{Accessing view state} The \texttt{view} variable is an instance of \textit{BrowserView}, which provides an interface for getting and setting view attributes. Note that for the UCSC browser, changing the view state opens a new view, as a new page must be opened in the web browser. To programmatically query the segment displayed by a view, use the \texttt{range} method for a \textit{BrowserView}. % <>= segment <- range(view) @ % Similarly, one may get and set the names of the visible tracks in the view. <>= visible_tracks <- trackNames(view) trackNames(view) <- visible_tracks @ The visibility mode (hide, dense, pack, squish, full) of the tracks may be retrieved with the \texttt{ucscTrackModes} method. % <>= modes <- ucscTrackModes(view) @ % The returned value, \texttt{modes}, is of class \textit{UCSCTrackModes}. The modes may be accessed using the \texttt{[} function. Here, we set the mode of our ``targets'' track to ``full'' visibility. <>= modes["targets"] modes["targets"] <- "full" ucscTrackModes(view) <- modes @ Existing browser views for a session may be retrieved by calling the \texttt{browserViews} method on the \textit{browserSession} instance. % <>= views <- browserViews(session) length(views) @ % \paragraph{Exercises} \begin{enumerate} \item Retrieve target currently visible in the view. \item Limit the view to display only the SNP, UCSC gene and target track. \item Hide the UCSC gene track. \end{enumerate} <>= viewTarget <- track(session, "targets", range(view)) trackNames(view) <- c("snp130", "knownGene", "targets") ucscTrackModes(view)["knownGene"] <- "hide" @ \section{CPNE1 expression and HapMap SNPs} Included with the \textbf{rtracklayer} package is a track object (created by the \textbf{GGtools} package) with features from a subset of the SNPs on chromosome 20 from 60 HapMap founders in the CEU cohort. Each SNP has an associated data value indicating its association with the expression of the CPNE1 gene according to a Cochran-Armitage 1df test. The top 5000 scoring SNPs were selected for the track. We load the track presently. <>= library(rtracklayer) data(cpneTrack) @ \subsection{Loading and manipulating the track} The data values for a track are stored in the metadata columns of the \textit{GRanges} instance. Often, a track contains a single column of numeric values, conventionally known as the \textit{score}. The \texttt{score} function retrieves the metadata column named \textit{score} or, if one does not exist, the first metadata column in the \textit{GRanges}, as long as it is numeric. Otherwise, \texttt{NULL} is returned. <>= head(score(cpneTrack)) @ % Sometimes, it may be convenient to extract the track information as a % \textit{data.frame}. The \textit{trackData} function does this by % combining the \textit{featureData} matrix with the \textit{dataVals}. % It also adds a column named \textit{featMid}, which gives the % mid-points (the mean of the start and end positions) of each feature % in the track. Here is an example of using \textit{trackData} to plot % the test value for each SNP vs. its position. One use of extracting the data values is to plot the data. <>= plot(start(cpneTrack), score(cpneTrack)) @ \subsection{Browsing the SNPs} We now aim to view some of the SNPs in the UCSC browser. Unlike the microRNA target site example above, this track has quantitative information, which requires special consideration for visualization. \subsubsection{Laying a WIG track} To view the SNP locations as a track in a genome browser, we first need to upload the track to a fresh session. In the code below, we use the \texttt{[[<-} alias of \texttt{track<-}. <>= session <- browserSession() session$cpne <- cpneTrack @ % Note that because \texttt{cpneTrack} contains data values and its features do not overlap, it is uploaded to the browser in the WIG format. One limitation of the WIG format is that it is not possible to encode strand information. Thus, each strand needs to have its own track, and \textbf{rtracklayer} does this automatically, unless only one strand is represented in the track (as in this case). One could pass ``bed'' to the \textit{format} parameter of \texttt{track<-} to prevent the split, but tracks uploaded as BED are much more limited compared to WIG tracks in terms of visualization options. To form the labels for the WIG subtracks, `` p'' is concatenated onto the plus track and `` m'' onto the minus track. Features with missing track information are placed in a track named with the `` na'' postfix. It is important to note that the subtracks must be identified individually when, for example, downloading the track or changing track visibility. \subsubsection{Plotting the SNP track} To plot the data values for the SNP's in a track, we need to create a \textit{browserView}. We will view the region spanning the first 5 SNPs in the track, which will be displayed in the ``full'' mode. % <>= view <- browserView(session, range(cpneTrack[1:5,]), full = "cpne") @ % The UCSC browser will plot the data values as bars. There are several options available for tweaking the plot, as described in the help for the \textit{GraphTrackLine} class. These need to be specified laying the track, so we will lay a new track named ``cpne2''. First, we will turn the \textit{autoScale} option off, so that the bars will be scaled globally, rather than locally to the current view. Then we could turn on the \textit{yLineOnOff} option to add horizontal line that could represent some sort of cut-off. The position of the line is specified by \textit{yLineMark}. We set it arbitrarily to the 25\% quantile. % <>= track(session, "cpne2", autoScale = FALSE, yLineOnOff = TRUE, yLineMark = quantile(score(cpneTrack), .25)) <- cpneTrack view <- browserView(session, range(cpneTrack[1:5,]), full = "cpne2") @ % \section{Binding sites for NRSF} \label{sec:binding} Another common type of genomic feature is transcription factor binding sites. Here we will use the \textbf{Biostrings} package to search for matches to the binding motif for NRSF, convert the result to a track, and display a portion of it in the \textbf{UCSC} browser. \subsection{Creating the binding site track} We will use the \textbf{Biostrings} package to search human chromosome 1 for NRSF binding sites. The binding sequence motif is assumed to be \textit{TCAGCACCATGGACAG}, though in reality it is more variable. To perform the search, we run \textit{matchPattern} on the positive strand of chromosome 1. % <>= library(BSgenome.Hsapiens.UCSC.hg19) nrsfHits <- matchPattern("TCAGCACCATGGACAG", Hsapiens[["chr1"]]) length(nrsfHits) # number of hits @ % We then convert the hits, stored as a \textit{Views} object, to a \textit{GRanges} instance. % <>= nrsfTrack <- GenomicData(ranges(nrsfHits), strand="+", chrom="chr1", genome = "hg19") @ % \Rfunction{GenomicData} is a convenience function that constructs a \Rclass{GRanges} object. \subsection{Browsing the binding sites} Now that the NRSF binding sites are stored as a track, we can upload them to the UCSC browser and view them. Below, load the track and we view the region around the first hit in a single call to \texttt{browseGenome}. % <>= session <- browseGenome(nrsfTrack, range = range(nrsfTrack[1]) * -10) @ % We observe significant conservation across mammal species in the region of the motif. \section{Downloading tracks from UCSC} \Rclass{rtracklayer} can be used to download annotation tracks from the UCSC table browser, thus providing a convenient programmatic alternative to the web interface available at \url{http://genome.ucsc.edu/cgi-bin/hgTables}. \textbf{Note} that not all tables are output in parseable form, and that \textbf{UCSC will truncate responses} if they exceed certain limits (usually around 100,000 records). The safest (and most efficient) bet for large queries is to download the file via FTP and query it locally. \subsection{Example 1: the RepeatMasker Track} This simple example identifies repeat-masked regions in and around the transcription start site (TSS) of the human E2F3 gene, in hg19: <>= library (rtracklayer) mySession = browserSession("UCSC") genome(mySession) <- "hg19" e2f3.tss.grange <- GRanges("chr6", IRanges(20400587, 20403336)) tbl.rmsk <- getTable( ucscTableQuery(mySession, track="rmsk", range=e2f3.tss.grange, table="rmsk")) @ There are several important points to understand about this example: \begin{enumerate} \item The \Rcode{ucscTableQuery} used above is a proxy for, and provides communication with, the remote UCSC table browser (see \url{http://genome.ucsc.edu/cgi-bin/hgTables}). \item You must know the name of the track and table (or sub-track) that you want. The way to do this is explained in detail below, in section 5.3. \item If the track contains multiple tables (which is the case for many ENCODE tracks, for instance), then you must also specify that table name. \item When the track contains a single table only, you may omit the \Rcode{table} parameter, or reuse the track name (as we did above). \item If you omit the range parameter, the full track table is returned, covering the entire genome. \item The amount of time required to download a track is roughly a function of the number of features in the track, which is in turn a function of the density of those features, and the length of the genomic range you request. To download the entire RepeatMasker track, for all of h19, would take a very long time, and is a task poorly suited to rtracklayer. By contrast, one full-genome DNaseI track takes less than a minute (see below). \end{enumerate} \subsection{Example 2: DNaseI hypersensitivity regions in the K562 Cell Line} The ENCODE project (\url{http://encodeproject.org/ENCODE}) provides many hundreds of annotation tracks to the UCSC table browser. One of these describes DNaseI hypersensitivity for K562 cells (an immortalized erythroleukemia line) measured at the University of Washington using 'Digital Genome Footprinting' (see \url{http://www.ncbi.nlm.nih.gov/pubmed?term=19305407}). Obtain DNaseI hypersensitive regions near the E2F3 TSS, and for all of hg19: <>= track.name <- "wgEncodeUwDgf" table.name <- "wgEncodeUwDgfK562Hotspots" e2f3.grange <- GRanges("chr6", IRanges(20400587, 20403336)) mySession <- browserSession () tbl.k562.dgf.e2f3 <- getTable(ucscTableQuery (mySession, track=track.name, range=e2f3.grange, table=table.name)) tbl.k562.dgf.hg19 <- getTable(ucscTableQuery (mySession, track=track.name, table=table.name)) @ \subsection{Discovering Which Tracks and Tables are Available from UCSC} As the examples above demonstrate, you must know the exact UCSC-style name for the track and table you wish to download. You may browse these interactively at \url{http://genome.ucsc.edu/cgi-bin/hgTables?org=Human&db=hg19} or programmatically, as we demonstrate here. <>= mySession <- browserSession () genome(mySession) <- "hg19" # 177 tracks in October 2012 track.names <- trackNames(ucscTableQuery(mySession)) # chose a few tracks at random from this set, and discover how # many tables they hold tracks <- track.names [c (99, 81, 150, 96, 90)] sapply(tracks, function(track) { length(tableNames(ucscTableQuery(mySession, track=track))) }) @ \section{Conclusion} These case studies have demonstrated a few of the most important features of \textbf{rtracklayer}. Please see the package documentation for more details. The following is the session info that generated this vignette: <>= sessionInfo() @ \end{document}