From 24a0a429d0c139bcc4b379e04e108cf24e791094 Mon Sep 17 00:00:00 2001 From: melsiddieg Date: Wed, 26 Apr 2017 13:59:15 +0300 Subject: [PATCH] latest version of cellbaseR --- clients/R/Bioc_Sub.Rproj | 18 + clients/R/DESCRIPTION | 79 +- clients/R/NAMESPACE | 46 +- clients/R/R/AllClasses.R | 48 +- clients/R/R/AllGenerics.R | 115 +- clients/R/R/AnnotateVcf-methods.R | 34 + clients/R/R/CellBaseParam-methods.R | 8 +- clients/R/R/CellBaseR-methods.R | 92 +- clients/R/R/cellbase.R | 9 +- clients/R/R/commons.R | 186 +- clients/R/R/getCellbase-methods.R | 45 + clients/R/R/getChromosomeInfo-methods.R | 34 + clients/R/R/getClinical-methods.R | 41 + clients/R/R/getGene-methods.R | 44 + clients/R/R/getMeta-methods.R | 35 + clients/R/R/getProtein-methods.R | 42 + clients/R/R/getRegion-methods.R | 43 + clients/R/R/getSnp-methods.R | 42 + clients/R/R/getTf-methods.R | 44 + clients/R/R/getTranscript-methods.R | 34 + clients/R/R/getVariant-methods.R | 49 + clients/R/R/getXref-methods.R | 43 + clients/R/R/show-methods.R | 35 +- clients/R/R/tools.R | 91 +- clients/R/R/user.R | 198 ++ clients/R/README.md | 3 + clients/R/dbsnp_gene258.txt | 2322 +++++++++++++++++ .../extdata/hapmap_exome_chr22_500.vcf.gz | Bin 0 -> 125911 bytes .../extdata/hapmap_exome_chr22_500.vcf.gz.tbi | Bin 0 -> 1894 bytes clients/R/man/AnnotateVcf-CellBaseR-method.Rd | 44 + clients/R/man/CellBaseParam-class.Rd | 18 +- clients/R/man/CellBaseParam.Rd | 11 +- clients/R/man/CellBaseR-class.Rd | 13 +- clients/R/man/CellBaseR.Rd | 34 +- clients/R/man/cellbaseR-package.Rd | 10 +- clients/R/man/createGeneModel.Rd | 17 +- clients/R/man/getCaddScores.Rd | 25 + clients/R/man/getCellBase-CellBaseR-method.Rd | 46 + clients/R/man/getCellBaseResourceHelp.Rd | 34 + .../man/getChromosomeInfo-CellBaseR-method.Rd | 40 + clients/R/man/getClinical-CellBaseR-method.Rd | 38 + clients/R/man/getClinicalByGene.Rd | 25 + clients/R/man/getClinicalByRegion.Rd | 25 + clients/R/man/getConservationByRegion.Rd | 25 + clients/R/man/getGene-CellBaseR-method.Rd | 39 + clients/R/man/getGeneInfo.Rd | 25 + clients/R/man/getMeta-CellBaseR-method.Rd | 36 + clients/R/man/getProtein-CellBaseR-method.Rd | 36 + clients/R/man/getProteinInfo.Rd | 25 + clients/R/man/getRegion-CellBaseR-method.Rd | 42 + clients/R/man/getRegulatoryByRegion.Rd | 25 + clients/R/man/getSnp-CellBaseR-method.Rd | 43 + clients/R/man/getSnpByGene.Rd | 26 + clients/R/man/getTf-CellBaseR-method.Rd | 43 + clients/R/man/getTfbsByRegion.Rd | 25 + .../R/man/getTranscript-CellBaseR-method.Rd | 40 + clients/R/man/getTranscriptByGene.Rd | 25 + clients/R/man/getVariant-CellBaseR-method.Rd | 44 + clients/R/man/getVariantAnnotation.Rd | 26 + clients/R/man/getXref-CellBaseR-method.Rd | 42 + clients/R/vignettes/cellbaseR.Rmd | 108 +- 61 files changed, 4378 insertions(+), 457 deletions(-) create mode 100644 clients/R/Bioc_Sub.Rproj create mode 100644 clients/R/R/AnnotateVcf-methods.R create mode 100644 clients/R/R/getCellbase-methods.R create mode 100644 clients/R/R/getChromosomeInfo-methods.R create mode 100644 clients/R/R/getClinical-methods.R create mode 100644 clients/R/R/getGene-methods.R create mode 100644 clients/R/R/getMeta-methods.R create mode 100644 clients/R/R/getProtein-methods.R create mode 100644 clients/R/R/getRegion-methods.R create mode 100644 clients/R/R/getSnp-methods.R create mode 100644 clients/R/R/getTf-methods.R create mode 100644 clients/R/R/getTranscript-methods.R create mode 100644 clients/R/R/getVariant-methods.R create mode 100644 clients/R/R/getXref-methods.R create mode 100644 clients/R/R/user.R create mode 100644 clients/R/dbsnp_gene258.txt create mode 100644 clients/R/inst/extdata/hapmap_exome_chr22_500.vcf.gz create mode 100644 clients/R/inst/extdata/hapmap_exome_chr22_500.vcf.gz.tbi create mode 100644 clients/R/man/AnnotateVcf-CellBaseR-method.Rd create mode 100644 clients/R/man/getCaddScores.Rd create mode 100644 clients/R/man/getCellBase-CellBaseR-method.Rd create mode 100644 clients/R/man/getCellBaseResourceHelp.Rd create mode 100644 clients/R/man/getChromosomeInfo-CellBaseR-method.Rd create mode 100644 clients/R/man/getClinical-CellBaseR-method.Rd create mode 100644 clients/R/man/getClinicalByGene.Rd create mode 100644 clients/R/man/getClinicalByRegion.Rd create mode 100644 clients/R/man/getConservationByRegion.Rd create mode 100644 clients/R/man/getGene-CellBaseR-method.Rd create mode 100644 clients/R/man/getGeneInfo.Rd create mode 100644 clients/R/man/getMeta-CellBaseR-method.Rd create mode 100644 clients/R/man/getProtein-CellBaseR-method.Rd create mode 100644 clients/R/man/getProteinInfo.Rd create mode 100644 clients/R/man/getRegion-CellBaseR-method.Rd create mode 100644 clients/R/man/getRegulatoryByRegion.Rd create mode 100644 clients/R/man/getSnp-CellBaseR-method.Rd create mode 100644 clients/R/man/getSnpByGene.Rd create mode 100644 clients/R/man/getTf-CellBaseR-method.Rd create mode 100644 clients/R/man/getTfbsByRegion.Rd create mode 100644 clients/R/man/getTranscript-CellBaseR-method.Rd create mode 100644 clients/R/man/getTranscriptByGene.Rd create mode 100644 clients/R/man/getVariant-CellBaseR-method.Rd create mode 100644 clients/R/man/getVariantAnnotation.Rd create mode 100644 clients/R/man/getXref-CellBaseR-method.Rd diff --git a/clients/R/Bioc_Sub.Rproj b/clients/R/Bioc_Sub.Rproj new file mode 100644 index 0000000000..eaa6b8186b --- /dev/null +++ b/clients/R/Bioc_Sub.Rproj @@ -0,0 +1,18 @@ +Version: 1.0 + +RestoreWorkspace: Default +SaveWorkspace: Default +AlwaysSaveHistory: Default + +EnableCodeIndexing: Yes +UseSpacesForTab: Yes +NumSpacesForTab: 2 +Encoding: UTF-8 + +RnwWeave: Sweave +LaTeX: pdfLaTeX + +BuildType: Package +PackageUseDevtools: Yes +PackageInstallArgs: --no-multiarch --with-keep.source +PackageRoxygenize: rd,collate,namespace diff --git a/clients/R/DESCRIPTION b/clients/R/DESCRIPTION index 5967c9344a..0328e38363 100644 --- a/clients/R/DESCRIPTION +++ b/clients/R/DESCRIPTION @@ -2,62 +2,33 @@ Package: cellbaseR Type: Package Date: 2016-04-17 Title: Querying annotation data from the high performance Cellbase web - services -Version: 0.99.0 + services +Version: 0.99.39 Author: Mohammed OE Abdallah Maintainer: Mohammed OE Abdallah -Description: - This R package makes use of the exhaustive RESTful Web service API that has been - implemented for the Cellabase database. It enable researchers to query and - obtain a wealth of biological information from a single database saving a lot - of time. Another benefit is that researchers can easily make queries about - different biological topics and link all this information together as all - information is integrated. +URL: https://github.com/melsiddieg/cellbaseR +Description: This R package makes use of the exhaustive RESTful Web + service API that has been implemented for the Cellabase + database. It enable researchers to query and obtain a wealth of + biological information from a single database saving a lot of + time. Another benefit is that researchers can easily make + queries about different biological topics and link all this + information together as all information is integrated. License: Apache License (== 2.0) -Depends: - R(>= 3.3), - RCurl -Imports: - methods, - jsonlite, - data.table, - pbapply, - tidyr, - R.utils, - Rsamtools, - BiocParallel, - Gviz, - foreach, - utils, - parallel, doMC, doParallel -RoxygenNote: 5.0.1.9000 -biocViews: Annotation +Depends: R(>= 3.4) +Imports: methods, jsonlite, httr, data.table, pbapply, tidyr, R.utils, + Rsamtools, BiocParallel, foreach, utils, parallel, doParallel +Suggests: BiocStyle, knitr, rmarkdown, Gviz, VariantAnnotation +RoxygenNote: 6.0.1 +biocViews: Annotation, VariantAnnotation Lazy: TRUE -Collate: - 'commons.R' - 'AllClasses.R' - 'AllGenerics.R' - 'CellBaseParam-methods.R' - 'CellBaseR-methods.R' - 'cbAnnotateVcf-methods.R' - 'cbChromosomeInfoClient-methods.R' - 'cbClinicalClient-methods.R' - 'cbData-methods.R' - 'cbGeneClient-methods.R' - 'cbGet-methods.R' - 'cbProteinClient-methods.R' - 'cbRegionClient-methods.R' - 'cbSnpClient-methods.R' - 'cbSpeciesClient-methods.R' - 'cbTfbsClient-methods.R' - 'cbTranscriptClient-methods.R' - 'cbVariantClient-methods.R' - 'cbXrefClient-methods.R' - 'cellbase.R' - 'show-methods.R' - 'tools.R' +LazyData: TRUE +Collate: 'commons.R' 'AllClasses.R' 'AllGenerics.R' + 'AnnotateVcf-methods.R' 'CellBaseParam-methods.R' + 'CellBaseR-methods.R' 'cellbase.R' 'getCellbase-methods.R' + 'getChromosomeInfo-methods.R' 'getClinical-methods.R' + 'getGene-methods.R' 'getMeta-methods.R' 'getProtein-methods.R' + 'getRegion-methods.R' 'getSnp-methods.R' 'getTf-methods.R' + 'getTranscript-methods.R' 'getVariant-methods.R' + 'getXref-methods.R' 'show-methods.R' 'tools.R' 'user.R' VignetteBuilder: knitr -Suggests: - BiocStyle, - knitr, - rmarkdown diff --git a/clients/R/NAMESPACE b/clients/R/NAMESPACE index 22c1a93b08..9504529812 100644 --- a/clients/R/NAMESPACE +++ b/clients/R/NAMESPACE @@ -2,36 +2,44 @@ export(CellBaseParam) export(CellBaseR) -export(cbHelp) export(createGeneModel) +export(getCaddScores) +export(getCellBaseResourceHelp) +export(getClinicalByGene) +export(getClinicalByRegion) +export(getConservationByRegion) +export(getGeneInfo) +export(getProteinInfo) +export(getRegulatoryByRegion) +export(getSnpByGene) +export(getTfbsByRegion) +export(getTranscriptByGene) +export(getVariantAnnotation) exportClasses(CellBaseParam) exportClasses(CellBaseR) -exportClasses(CellBaseResponse) -exportMethods(cbAnnotateVcf) -exportMethods(cbChromosomeInfoClient) -exportMethods(cbClinicalClient) -exportMethods(cbData) -exportMethods(cbGeneClient) -exportMethods(cbGet) -exportMethods(cbProteinClient) -exportMethods(cbRegionClient) -exportMethods(cbSnpClient) -exportMethods(cbSpeciesClient) -exportMethods(cbTfbsClient) -exportMethods(cbTranscriptClient) -exportMethods(cbVariantClient) -exportMethods(cbXrefClient) +exportMethods(AnnotateVcf) +exportMethods(getCellBase) +exportMethods(getChromosomeInfo) +exportMethods(getClinical) +exportMethods(getGene) +exportMethods(getMeta) +exportMethods(getProtein) +exportMethods(getRegion) +exportMethods(getSnp) +exportMethods(getTf) +exportMethods(getTranscript) +exportMethods(getVariant) +exportMethods(getXref) import(BiocParallel) -import(RCurl) import(Rsamtools) import(data.table) -import(doMC) import(doParallel) import(foreach) +import(httr) import(jsonlite) import(methods) import(parallel) import(pbapply) -importFrom(Gviz,GeneRegionTrack) +import(utils) importFrom(R.utils,countLines) importFrom(tidyr,unnest) diff --git a/clients/R/R/AllClasses.R b/clients/R/R/AllClasses.R index 3ee7ba4ddf..69e0318568 100644 --- a/clients/R/R/AllClasses.R +++ b/clients/R/R/AllClasses.R @@ -1,13 +1,12 @@ ################################################################################ -#' This class defines the CellBaseR object +#' CellBaseR Class #' @include commons.R -#' This is an S4 class which defines the CellBaseR object +#' +#' @description This is an S4 class which defines the CellBaseR object #' @details This S4 class holds the default configuration required by CellBaseR #' methods to connect to the cellbase web #' services. By default it is configured to query human data based on the GRCh37 -#' genome assembly. Please, visit https://github.com/opencb/cellbase/wiki and -#' http://bioinfo.hpc.cam.ac.uk/cellbase/webservices/ for more details on -#' following parameters. +#' genome assembly. #' @slot host a character specifying the host url. Default #' "http://bioinfo.hpc.cam.ac.uk/cellbase/webservices/rest/" #' @slot version a character specifying the API version. Default "v4" @@ -18,35 +17,27 @@ #' queries will be sent to the server in batches. This slot indicates the size #' of these batches. Default 200 #' @slot num_threads the number of threads. Default 8 +#' @seealso \url{https://github.com/opencb/cellbase/wiki} +#' and the RESTful API documentation +#' \url{http://bioinfo.hpc.cam.ac.uk/cellbase/webservices/} #' @export setClass("CellBaseR", - slots = c(host="character", version="character", species="character", - batch_size="numeric", num_threads="numeric"), - prototype = prototype(host="http://bioinfodev.hpc.cam.ac.uk/cellbase-dev-v4.0/webservices/rest/", - version = "v4/",species="hsapiens/", batch_size=200, num_threads=8) + slots = c(host="character", version="character", species="character", + batch_size="numeric", num_threads="numeric"), + prototype = prototype( + host="http://bioinfo.hpc.cam.ac.uk/cellbase/webservices/webservices/rest/", + version = "v4/",species="hsapiens/", batch_size=200L, num_threads=8L) ) -################################################################################ -#' The CellBaseResponse class defintion -#' -#' This class holds the response data from CellBaseR Methods -#' @details This class stores a response of CellBaseR query methods. An object -#' of class CellBaseResponse is automatically generated when you call any of -#' CellbaseR methods. -#' @slot cbData an R dataframe which contains the result field within the -#' response object returned by CellBase web services. -#' @export -CellBaseResponse <-setClass("CellBaseResponse", slots=c(cbData="data.frame")) ############################################################################### -#' This Class defines a CellBaseParam object +#' CellBaseParam Class #' -#' This class defines a CellBaseParam object to hold filtering parameters -#' @details This class stores filtering parameters to be used by CellBaseR query -#' methods. Not all the slots will be -#' used by all query methods, please have a look at -#' http://bioinfo.hpc.cam.ac.uk/cellbase/webservices/ and the -#' Reference Manual for more information. +#' @description This class defines a CellBaseParam object to hold filtering +#' parameters. +#' @details This class stores parameters used for filtering the CellBaseR query +#' and is avaialable for all query methods. CellBaseParam object is used to +#' control what results are returned from the' CellBaseR methods #' @slot genome A character the genome build to query, e.g.GRCh37(default) #' @slot gene A character vector denoting the gene/s to be queried #' @slot region A character vector denoting the region/s to be queried must be @@ -57,6 +48,9 @@ CellBaseResponse <-setClass("CellBaseResponse", slots=c(cbData="data.frame")) #' @slot include A character vector denoting the fields to be returned #' @slot exclude A character vector denoting the fields to be excluded #' @slot limit A number limiting the number of results to be returned +#' @seealso \url{https://github.com/opencb/cellbase/wiki} +#' and the RESTful API documentation +#' \url{http://bioinfo.hpc.cam.ac.uk/cellbase/webservices/} #' @export setClass("CellBaseParam",slots = c(genome="character", gene="character", region="character", rs="character", diff --git a/clients/R/R/AllGenerics.R b/clients/R/R/AllGenerics.R index f549d60a0c..e0399e573d 100644 --- a/clients/R/R/AllGenerics.R +++ b/clients/R/R/AllGenerics.R @@ -1,91 +1,78 @@ # CellBaseR methods #'@include commons.R -################################################################################ -################################################################################ -setGeneric("cbClinicalClient", function(object, filters,...) -standardGeneric("cbClinicalClient")) +############################################################################### +############################################################################### +setGeneric("getClinical", function(object, param) +standardGeneric("getClinical")) -setGeneric("cbGeneClient", function(object,ids,resource,filters=NULL, ...) -standardGeneric("cbGeneClient")) +setGeneric("getGene", function(object,ids,resource,param=NULL) +standardGeneric("getGene")) -################################################################################ +############################################################################### -################################################################################ -setGeneric("cbRegionClient", function(object,ids,resource,filters, ...) -standardGeneric("cbRegionClient")) +############################################################################### +setGeneric("getRegion", function(object,ids,resource,param=NULL) +standardGeneric("getRegion")) -################################################################################ +############################################################################### -################################################################################ -setGeneric("cbSnpClient", function(object,ids,resource,filters=NULL, ...) -standardGeneric("cbSnpClient")) +############################################################################### +setGeneric("getSnp", function(object,ids,resource,param=NULL) +standardGeneric("getSnp")) -################################################################################ +############################################################################### -######################################################################################################################## -setGeneric("cbVariantClient", function(object,ids,resource,filters=NULL, ...) -standardGeneric("cbVariantClient")) +############################################################################### +setGeneric("getVariant", function(object,ids,resource,param=NULL) +standardGeneric("getVariant")) -######################################################################################################################## +############################################################################### -setGeneric("cbGet", function(object, category, subcategory, ids, resource, filters=NULL,...) -standardGeneric("cbGet")) +setGeneric("getCellBase", function(object, category, subcategory, ids, resource, + param=NULL) +standardGeneric("getCellBase")) -######################################################################################################################## +############################################################################### -######################################################################################################################## -setGeneric("cbTfbsClient", function(object,ids,resource,filters=NULL, ...) -standardGeneric("cbTfbsClient")) +############################################################################### +setGeneric("getTf", function(object,ids,resource,param=NULL) +standardGeneric("getTf")) -######################################################################################################################## +############################################################################### -######################################################################################################################## -setGeneric("cbTranscriptClient", function(object,ids,resource,filters=NULL, ...) -standardGeneric("cbTranscriptClient")) +############################################################################### +setGeneric("getTranscript", function(object,ids,resource,param=NULL) +standardGeneric("getTranscript")) -######################################################################################################################## +############################################################################## -######################################################################################################################## -setGeneric("cbXrefClient", function(object,ids,resource,filters=NULL, ...) -standardGeneric("cbXrefClient")) +############################################################################## +setGeneric("getXref", function(object,ids,resource,param=NULL) +standardGeneric("getXref")) -######################################################################################################################## +############################################################################## -######################################################################################################################## -setGeneric("cbProteinClient", function(object,ids,resource,filters=NULL, ...) -standardGeneric("cbProteinClient")) +############################################################################## +setGeneric("getProtein", function(object,ids,resource,param=NULL) +standardGeneric("getProtein")) -######################################################################################################################## -################################################################################ -setGeneric("cbChromosomeInfoClient", function(object,ids,resource,filters=NULL, ...) -standardGeneric("cbChromosomeInfoClient")) +############################################################################### +############################################################################### +setGeneric("getChromosomeInfo", function(object,ids,resource,param=NULL) +standardGeneric("getChromosomeInfo")) -################################################################################ -#' A method for getting the avaiable species from the cellbase web services -#' -#' This method is for getting species data from the cellbase web services. -#' @details Please, for details on possible values for the -#' parameters and additional filters of this function refer to -#' https://github.com/opencb/cellbase/wiki and the RESTful -#' http://bioinfo.hpc.cam.ac.uk/cellbase/webservices/ -#' @param object an object of class CellBaseR -#' @return an object of class CellBaseResponse which holds a dataframe with the -#' results of the query -#' @examples -#' cb <- CellBaseR() -#' res <- cbSpeciesClient(object=cb) -setGeneric("cbSpeciesClient", function(object) -standardGeneric("cbSpeciesClient")) +############################################################################### -################################################################################ -setGeneric("cbAnnotateVcf", function(object,file, ...) -standardGeneric("cbAnnotateVcf")) +setGeneric("getMeta", function(object, resource) +standardGeneric("getMeta")) + +############################################################################### +setGeneric("AnnotateVcf", function(object, file, batch_size, + num_threads, + BPPARAM=bpparam()) +standardGeneric("AnnotateVcf")) -# CellBaseResponse methods -################################################################################ -setGeneric("cbData", function(object) -standardGeneric("cbData")) diff --git a/clients/R/R/AnnotateVcf-methods.R b/clients/R/R/AnnotateVcf-methods.R new file mode 100644 index 0000000000..36c90fb7ce --- /dev/null +++ b/clients/R/R/AnnotateVcf-methods.R @@ -0,0 +1,34 @@ +################################################################################ +#' AnnotateVcf +#' +#' This method is a convience method to annotate bgzipped tabix-indexed vcf +#' files. It should be ideal for annotating small to medium sized +#' vcf files. +#' @include AllClasses.R AllGenerics.R +#' @aliases AnnotateVcf +#' @param object an object of class CellBaseR +#' @param file Path to a bgzipped and tabix indexed vcf file +#' @param batch_size intger if multiple queries are raised by a single method +#' call, e.g. getting annotation info for several genes, +#' queries will be sent to the server in batches. This slot indicates the size +#' of each batch, e.g. 200 +#' @param num_threads number of asynchronus batches to be sent to the server +#' @param BPPARAM a BiocParallel class object +#' @return a dataframe with the results of the query +#' @examples +#' cb <- CellBaseR() +#' fl <- system.file("extdata", "hapmap_exome_chr22_500.vcf.gz", +#' package = "cellbaseR" ) +#' res <- AnnotateVcf(object=cb, file=fl, BPPARAM = bpparam(workers=2)) +#' @seealso \url{https://github.com/opencb/cellbase/wiki} +#' and the RESTful API documentation +#' \url{http://bioinfo.hpc.cam.ac.uk/cellbase/webservices/} +#' @export +setMethod("AnnotateVcf", "CellBaseR", definition = function(object, file, + batch_size, + num_threads, + BPPARAM=bpparam()){ + result <- Annovcf(object=object, file=file, batch_size, num_threads, + BPPARAM=bpparam()) + return(result) +}) diff --git a/clients/R/R/CellBaseParam-methods.R b/clients/R/R/CellBaseParam-methods.R index dff61870ff..f52d4e84c3 100644 --- a/clients/R/R/CellBaseParam-methods.R +++ b/clients/R/R/CellBaseParam-methods.R @@ -1,6 +1,6 @@ -#' A constructor function for CellBaseParam +#' A Constructor for the CellBaseParam Object #' -#'use the CellBaseParam object to control what results are returned from the +#'CellBaseParam object is used to control what results are returned from the #'CellBaseR methods #' @param genome A character denoting the genome build to query,eg, GRCh37 #' (default),or GRCh38 @@ -13,10 +13,12 @@ #' @param include A character vector denoting the fields to be returned #' @param exclude A character vector denoting the fields to be excluded #' @param limit A number limiting the number of results to be returned +#' @return an object of class CellBaseParam #' @examples #' cbParam <- CellBaseParam(genome="GRCh38",gene=c("TP73","TET1")) #' print(cbParam) -#' @seealso for more information about the cellbase webservices see +#' @seealso \url{https://github.com/opencb/cellbase/wiki} +#' and the RESTful API documentation #' \url{http://bioinfo.hpc.cam.ac.uk/cellbase/webservices/} #' @export CellBaseParam <- function(genome=character(), gene=character(), diff --git a/clients/R/R/CellBaseR-methods.R b/clients/R/R/CellBaseR-methods.R index 104b4328ac..45dfc26974 100644 --- a/clients/R/R/CellBaseR-methods.R +++ b/clients/R/R/CellBaseR-methods.R @@ -1,61 +1,69 @@ -### CellbaseR constructor function +#' CellbaseR constructor function #' @aliases CellBaseR -#' @title A constructor function for CellBaseR object +#' @title CellBaseR #' -#' @description This is a constructor function for CellBaseR object +#' @description This is a constructor function for the CellBaseR object #' @details #' This class defines the CellBaseR object. It holds the default #' configuration required by CellBaseR methods to connect to the #' cellbase web services. By defult it is configured to query human -#' data based on the GRCh37 genome assembly. Please, visit -#' https://github.com/opencb/cellbase/wiki and -#' bioinfodev.hpc.cam.ac.uk/cellbase/webservices/ for more details on -#' following parameters. -#' run cbSpeciesClient to see avaiable species and their corresponding data +#' data based on the GRCh37 genome assembly. #' @import methods #' @param host A character the default host url for cellbase webservices, #' e.g. "http://bioinfo.hpc.cam.ac.uk/cellbase/webservices/rest/" #' @param version A character the cellbae API version, e.g. "V4" -#' @param species a character specifying the species to be queried, e.g. "hsapiens" -#' @param batch_size intger if multiple queries are raised by a single method call, e.g. getting annotation info for several genes, -#' queries will be sent to the server in batches. This slot indicates the size of each batch, e.g. 200 -#' @param num_threads integer number of asynchronus batches to be sent to the server +#' @param species a character specifying the species to be queried, e.g. +#' "hsapiens" +#' @param batch_size intger if multiple queries are raised by a single method +#' call, e.g. getting annotation info for several genes, queries will be sent +#' to the server in batches.This slot indicates the size of each batch,e.g. 200 +#' @param num_threads integer number of batches to be sent to the server #' @return An object of class CellBaseR +#' @seealso \url{https://github.com/opencb/cellbase/wiki} +#' and the RESTful API documentation +#' \url{http://bioinfo.hpc.cam.ac.uk/cellbase/webservices/} #' @examples #' cb <- CellBaseR() #' print(cb) #' @export -CellBaseR <- function(host=NULL, version=NULL, species=NULL, - batch_size=NULL, num_threads=NULL ){ - if(!is.null(host)){ - host <- paste0(host, "/") - }else { - host <-"http://bioinfodev.hpc.cam.ac.uk/cellbase-dev-v4.0/webservices/rest/" - } +CellBaseR <- function(host="http://bioinfo.hpc.cam.ac.uk/cellbase/webservices/rest/" + , version='v4', species='hsapiens', + batch_size=200L, num_threads=8L){ + + available_species=c("hsapiens","mmusculus","drerio","rnorvegicus", + "ptroglodytes","ggorilla","pabelii","mmulatta", + "csabaeus","sscrofa","cfamiliaris","ecaballus", + "ocuniculus","ggallus","btaurus","fcatus", + "cintestinalis","oaries","olatipes","ttruncatus", + "lafricana","cjacchus","nleucogenys","aplatyrhynchos", + "falbicollis","celegans","dmelanogaster","dsimulans", + "dyakuba","agambiae","adarlingi","nvectensis", + "spurpuratus","bmori","aaegypti","apisum","scerevisiae" + ,"spombe","afumigatus","aniger","anidulans","aoryzae", + "foxysporum","pgraminis","ptriticina","moryzae", + "umaydis","ssclerotiorum","cneoformans","ztritici", + "pfalciparum","lmajor","ddiscoideum","glamblia", + "pultimum","alaibachii","athaliana","alyrata", + "bdistachyon","osativa","gmax","vvinifera","zmays", + "hvulgare","macuminata","sbicolor","sitalica", + "taestivum","brapa","ptrichocarpa","slycopersicum", + "stuberosum","smoellendorffii","creinhardtii", + "cmerolae") + if(species%in% available_species){ + species<-species + } else{ + stop("please enter a valid species name\n + see ?getMeta examples to see the aviable species") + } - if(!is.null(species)){ - species<-paste0(species,"/") - }else{ - species <-"hsapiens/" - } - - if(!is.null(version)){ - version <- paste0(version,"/") - }else{ - version <- "v4/" - } - - if(!is.null(batch_size)){ - batch_size <- batch_size - }else{ - batch_size <- 200L - } - - if(!is.null(num_threads)){ - num_threads <- num_threads - }else{ - num_threads <- 8L - } + version <- paste0(version,"/") + + # Get the API list + cbDocsUrl <- paste0(host, "swagger.json") + Datp <- fromJSON(cbDocsUrl) + tags <- Datp$tags + paths <- Datp$paths + api <- lapply(paths, function(x)x$get) new("CellBaseR", host=host, version=version,species=species, batch_size=batch_size, num_threads=num_threads ) diff --git a/clients/R/R/cellbase.R b/clients/R/R/cellbase.R index bfbb85abdc..4ce42a7b18 100644 --- a/clients/R/R/cellbase.R +++ b/clients/R/R/cellbase.R @@ -1,5 +1,5 @@ #' Documentation for the cellbaseR package -#' @title CellbaseR +#' @title cellbaseR #' @description Querying annotation data from the high performance Cellbase web #' services #' @author Mohammed OE Abdallah @@ -15,17 +15,16 @@ #' are parsed into R data.frames and other common R data strctures so users can #' readily get into downstream anaysis. #' @import methods -#' @import jsonlite -#' @import RCurl +#' @import jsonlite #' @import pbapply #' @import data.table #' @import BiocParallel #' @importFrom tidyr unnest #' @importFrom R.utils countLines -#' @importFrom Gviz GeneRegionTrack #' @import Rsamtools #' @import foreach #' @import parallel #' @import doParallel -#' @import doMC +#' @import httr +#' @import utils "_PACKAGE" \ No newline at end of file diff --git a/clients/R/R/commons.R b/clients/R/R/commons.R index 0835d0d17b..7f879c5d1d 100644 --- a/clients/R/R/commons.R +++ b/clients/R/R/commons.R @@ -1,22 +1,31 @@ -utils::globalVariables(c("name", "j")) -################################################################################ +utils::globalVariables(c("name", "j", "registerDoMC")) +############################################################################### # we need to adjust the output for the protein and Genomesequence methods # -fetchCellbase <- function(file=NULL,host=host, version=version, meta=meta, - species=species, categ, subcateg,ids, resource,filters=NULL, - batch_size=NULL,num_threads=NULL,...){ +fetchCellbase <- function(object=object, file=NULL, meta=meta, + species=species, categ, subcateg,ids, resource,param=NULL, + batch_size=NULL, num_threads=NULL){ + host <- object@host + species <- object@species + # Get the parametrs - if(species=="hsapiens/"){ + if(species=="hsapiens"){ batch_size <- batch_size + version <- object@version + }else{ batch_size <- 50 + version <- "latest/" } + num_threads <- num_threads + if(is.null(categ)){ categ <- "" }else{ categ <- paste0(categ,"/",sep="") } + if(is.null(subcateg)){ subcateg <- "" }else{ @@ -35,20 +44,22 @@ fetchCellbase <- function(file=NULL,host=host, version=version, meta=meta, cat("\nreading the file....\n") ids <- readIds(file,batch_size = batch_size,num_threads = num_threads) } + + # in case a vcf file has been specified if(!is.null(file)){ container=list() grls <- createURL(file=file, host=host, version=version, species=species, categ=categ, subcateg=subcateg, - ids=ids, resource=resource,...) + ids=ids, resource=resource) cat("\ngetting the data....\n") - content <- callREST(grls = grls,async=TRUE,num_threads) + content <- callREST2(grls = grls,async=FALSE,num_threads) cat("\nparsing the data....\n") res_list <- parseResponse(content=content,parallel=TRUE, num_threads=num_threads) ds <- res_list$result cat("Done!") - + # in case of all other methods except for annotateVcf }else{ i=1 @@ -56,12 +67,13 @@ fetchCellbase <- function(file=NULL,host=host, version=version, meta=meta, skip=0 num_results=1000 container=list() - while(is.null(file)&all(unlist(num_results)==server_limit)){ + while(is.null(file)&all(unlist(num_results)==server_limit)){ grls <- createURL(file=NULL, host=host, version=version, meta=meta, - species=species, categ=categ, subcateg=subcateg, ids=ids, - resource=resource,filters=filters,skip = skip) + species=species, categ=categ, subcateg=subcateg, + ids=ids, resource=resource,param=param, + skip = skip) skip=skip+1000 - content <- callREST(grls = grls) + content <- callREST2(grls = grls) res_list <- parseResponse(content=content) num_results <- res_list$num_results cell <- res_list$result @@ -71,7 +83,7 @@ fetchCellbase <- function(file=NULL,host=host, version=version, meta=meta, if(class(container[[1]])=="data.frame"){ ds <- rbind.pages(container) }else{ - ds <- as.data.frame(container[[1]], stringsAsFactors=FALSE, names="result") + ds <- as.data.frame(container[[1]], stringsAsFactors=FALSE,names="result") } @@ -114,15 +126,19 @@ readIds <- function(file=file,batch_size,num_threads) ## create a list of character vectors of urls createURL <- function(file=NULL, host=host, version=version, meta=meta, species=species, categ=categ, subcateg=subcateg, ids=ids, - resource=resource, filters=filters,skip=0) + resource=resource, param=param,skip=0) { if(is.null(file)){ skip=paste0("?","skip=",skip) - filters <- paste(skip,filters, sep = "&") - grls <- paste0(host,version, meta, species, categ, subcateg, ids, - resource,filters,collapse = "") - + param <- paste(skip,param, sep = "&") + if(nchar(species)>1){ + grls <- paste0(host,version, meta, species,"/", categ, subcateg, ids, + resource,param,collapse = "") + }else{ + grls <- paste0(host,version, meta, species, categ, subcateg, ids, + resource,param,collapse = "") + } }else{ grls <- list() gcl <- paste0(host,version,species,categ,subcateg,collapse = "") @@ -135,45 +151,26 @@ createURL <- function(file=NULL, host=host, version=version, meta=meta, } return(grls) } -## A function to make the API calls -callREST <- function(grls,async=FALSE,num_threads=num_threads) - { - content <- list() - if(is.null(file)){ - content <- getURI(grls) - } else{ - if (requireNamespace("pbapply", quietly = TRUE)){ - content <- pbapply::pbsapply(grls, function(x)getURI(x)) - - } - } +callREST2 <- function(grls,async=FALSE,num_threads=num_threads) +{ + content <- list() + if(is.null(file)){ + resp <- GET(grls, add_headers(`Accept-Encoding` = "gzip, deflate"), + timeout(2)) + content <- content(resp, as="text", encoding = "utf-8") + }else{ + resp <- GET(grls, add_headers(`Accept-Encoding` = "gzip, deflate")) + content <- content(resp, as="text", encoding = "utf-8") + } return(content) } ## A function to parse the json data into R dataframes -parseResponse <- function(content,parallel=FALSE,num_threads=num_threads){ +parseResponse <- function(content, parallel=FALSE, num_threads=num_threads){ if(parallel==TRUE){ - num_cores <-detectCores()/2 - registerDoMC(num_cores) - - # - # ## Extracting the content in parallel - js <- mclapply(content, function(x)fromJSON(x), mc.cores=num_cores) - res <- mclapply(js, function(x)x$response$result, mc.cores=num_cores) - names(res) <- NULL - ind <- sapply(res, function(x)length(x)!=1) - res <- res[ind] - ds <- mclapply(res, function(x)rbind.pages(x), mc.cores=num_cores) - if(requireNamespace("pbapply", quietly = TRUE)){ - ds <- pbapply::pblapply(res, function(x)rbind.pages(x)) - - } - ## Important to get correct merging of dataframe - names(ds) <- NULL - ds <- rbind.pages(ds) - nums <- NULL - }else{ + + } else{ js <- lapply(content, function(x)fromJSON(x)) ares <- lapply(js, function(x)x$response$result) @@ -196,29 +193,57 @@ parseResponse <- function(content,parallel=FALSE,num_threads=num_threads){ return(list(result=ds,num_results=nums)) } -# consider seperating into two functions ### Docs -#' A function to get help about cellbase queries +#' getCellBaseResourceHelp #' -#' This is a convience function to get help on cellbase methods +#' A function to get help about available cellbase resources +#' @details This function retrieves available resources for each generic method +#' like getGene, getRegion, getprotein, etc. It help the user see all possible +#' resources to use with the getGeneric methods #' @param object a cellBase class object -#' @param category a character the category to be queried #' @param subcategory a character the subcategory to be queried -#' @param resource A charcter when specified will get all the parametrs for -#' that specific resource -#' @return documentation about avaiable resources or required parameters +#' @return character vector of the available resources to that particular +#' subcategory #' @examples #' cb <- CellBaseR() -#' cbHelp(cb, category="feature", subcategory="gene") +#' # Get help about what resources are available to the getGene method +#' getCellBaseResourceHelp(cb, subcategory="gene") +#' # Get help about what resources are available to the getRegion method +#' getCellBaseResourceHelp(cb, subcategory="region") +#' # Get help about what resources are available to the getXref method +#' getCellBaseResourceHelp(cb, subcategory="id") #' @export -cbHelp <- function(object, category, subcategory, resource=NULL){ +getCellBaseResourceHelp <- function(object, subcategory){ host <- object@host - cbDocsUrl <- paste0(host, "swagger.json") - Data <- fromJSON(cbDocsUrl) - tags <- Data$tags - paths <- Data$paths - getList <- lapply(paths, function(x)x$get) + if(exists('.api', .GlobalEnv)&exists('.tags', .GlobalEnv)){ + getList <- get('.api',envir = .GlobalEnv) + tags <- get('.tags',envir = .GlobalEnv) + }else { + cbDocsUrl <- paste0(host, "swagger.json") + Datp <- jsonlite::fromJSON(cbDocsUrl) + tags <- Datp$tags + paths <- Datp$paths + getList<- lapply(paths, function(x)x$get) + assign('.api', getList, .GlobalEnv) + assign('.tags', tags, .GlobalEnv) + } + category <- switch (subcategory, + gene= "feature", + protein= "feature", + tf="regulation", + variation="feature", + variant="genomic", + clinical="feature", + transcript="feature", + id="feature") + ## filtered + SUBCATEGORIES <- c('gene', 'protein', 'tf', 'variation', 'variant', + 'clinical', 'transcript', 'id', 'region') + if(!(subcategory %in% SUBCATEGORIES)){ + cat("Please use one of CellBase Subcategories\n") + cat(SUBCATEGORIES,'\n') + stop("Error unknown subcategory")} parts <- Filter(Negate(function(x) is.null(unlist(x))), getList) cbGetParams <- lapply(parts, function(x)x$parameters) catsub <- paste(category,subcategory, sep = "/") @@ -227,16 +252,23 @@ cbHelp <- function(object, category, subcategory, resource=NULL){ patt1 <- paste0(catsub,"/", ".*?/","(.*)" ) resMatch <- regexec(patt1,narrowed) m <- regmatches(narrowed, resMatch) - if(is.null(resource)){ - res <- sapply(m, function(x)x[2]) - res <- res[!is.na(res)] - }else{ - patt2 <- paste(catsub,"/", ".*?/", resource, sep="") - index <- grep(patt2, names(parts)) - res <- parts[[index]] - res <- res$parameters - res <- subset(res,!(name %in% c("version", "species")), select=c("name", "description","required", "type")) - } + res <- sapply(m, function(x)x[2]) + res <- res[!is.na(res)] + res } -# \ No newline at end of file +# +# cbCheck <- function(object, category, subcategory, resource){ +# CATEGORIES <- c("feature", "genomic", "regulation") +# if(!(category %in% CATEGORIES)){ +# stop("Error Unknown category") +# } +# SUBCATEGORIES <- tolower(unlist(tags[[1]])) +# if(!(subcategory %in% SUBCATEGORIES)){ +# stop("Error Unknown subcategory") +# } +# RESOURCES <- getCellBaseResourceHelp(object, subcategory) +# if(!(resource %in% RESOURCES)){ +# stop("Error Unknown resource") +# } +# } \ No newline at end of file diff --git a/clients/R/R/getCellbase-methods.R b/clients/R/R/getCellbase-methods.R new file mode 100644 index 0000000000..d84b3cbcca --- /dev/null +++ b/clients/R/R/getCellbase-methods.R @@ -0,0 +1,45 @@ +############################################################################### +#' getCellBase +#' +#' The generic method for querying CellBase web services. +#' @details This method allows the user to query the +#' cellbase web services without any predefined categories, subcategries, +#' or resources. +#' @aliases getCellBase +#' @param object an object of class CellBaseR +#' @param category character to specify the category to be queried. +#' @param subcategory character to specify the subcategory to be queried +#' @param ids a character vector of the ids to be queried +#' @param resource a character to specify the resource to be queried +#' @param param an object of class CellBaseParam specifying additional param +#' for the CellBaseR +#' @return a dataframe holding the results of the query +#' @examples +#' cb <- CellBaseR() +#' res <- getCellBase(object=cb, category="feature", subcategory="gene", +#' ids="TET1", resource="info") +#' @seealso \url{https://github.com/opencb/cellbase/wiki} +#' and the RESTful API documentation +#' \url{http://bioinfo.hpc.cam.ac.uk/cellbase/webservices/} +#' @export +setMethod("getCellBase", "CellBaseR", definition = function(object, category, + subcategory, ids, resource + ,param=NULL) { + categ <- category + subcateg<- subcategory + ids <- ids + resource <- resource + if (!is.null(param)) { + param <- c(genome=param@genome, gene=param@gene,region=param@region + , rs=param@rs,so=param@so, phenotype=param@phenotype, + limit=param@limit, include=param@include, + exclude=param@exclude, limit=param@limit) + param <- paste(param, collapse = "&") + } + # TODO: param are not enabled + result <- fetchCellbase(object=object, file=NULL, meta = NULL, categ=categ, + subcateg=subcateg, ids=ids, resource=resource , + param=param) + + return(result) +}) diff --git a/clients/R/R/getChromosomeInfo-methods.R b/clients/R/R/getChromosomeInfo-methods.R new file mode 100644 index 0000000000..5fbae8f2fa --- /dev/null +++ b/clients/R/R/getChromosomeInfo-methods.R @@ -0,0 +1,34 @@ +############################################################################### +#' getChromosomeInfo +#' +#' A method to query sequence data from Cellbase web services. +#' @details A method to query sequence data from Cellbase web services. This +#' method retrieves information about chromosomes, including its size and +#' detailed information about its different cytobands +#' @aliases getChromosomeInfo +#' @param object an object of class CellBaseR +#' @param ids a character vector of chromosome ids to be queried +#' @param resource a character vector to specify the resource to be queried +#' @param param a object of class CellBaseParam specifying additional param for +#' the query +#' @return a dataframe with the results of the query +#' @seealso \url{https://github.com/opencb/cellbase/wiki} +#' and the RESTful API documentation +#' \url{http://bioinfo.hpc.cam.ac.uk/cellbase/webservices/} +#' @examples +#' cb <- CellBaseR() +#' res <- getChromosomeInfo(object=cb, ids="22", resource="info") +#' @export +setMethod("getChromosomeInfo", "CellBaseR", + definition = function(object , ids, resource, param=NULL) { + + categ <- "genomic" + subcateg<- "chromosome" + ids <- ids + resource <- "info" + result <- fetchCellbase(object=object, file=NULL, meta = NULL, + categ=categ, subcateg=subcateg, ids=ids, resource=resource + , param=NULL) + data <- result[[1]][[1]] + return(data) +}) diff --git a/clients/R/R/getClinical-methods.R b/clients/R/R/getClinical-methods.R new file mode 100644 index 0000000000..fcd14aebb3 --- /dev/null +++ b/clients/R/R/getClinical-methods.R @@ -0,0 +1,41 @@ +############################################################################### +#' getClinical +#' +#' A method to query Clinical data from Cellbase web services. +#' @details This method retrieves clinicaly relevant variants annotations from +#' multiple resources including clinvar, cosmic and gwas catalog. Furthermore, +#' the user can filter these data in many ways including phenotype, genes, rs, +#' etc,. +#' @aliases getClinical +#' @param object an object of class CellBaseR +#' @param param a object of class CellBaseParam specifying the parameters +#' limiting the CellBaseR +#' @return a dataframe with the results of the query +#' @examples +#' cb <- CellBaseR() +#' cbParam <- CellBaseParam(gene=c("TP73","TET1")) +#' res <- getClinical(object=cb,param=cbParam) +#' @seealso \url{https://github.com/opencb/cellbase/wiki} +#' and the RESTful API documentation +#' \url{http://bioinfo.hpc.cam.ac.uk/cellbase/webservices/} +#' @export +############################################################################## +setMethod("getClinical", "CellBaseR", definition = function(object, + param=NULL) { + + categ <- "feature" + subcateg<- "clinical" + ids <- NULL + resource <- "search" + + param <- c(genome=param@genome, gene=param@gene, + region=param@region,rs=param@rs,so=param@so, + phenotype=param@phenotype, include=param@include, + exclude=param@exclude, limit=param@limit) + param <- paste(param, collapse = "&") + result <- fetchCellbase(object=object,file=NULL, meta=NULL, categ=categ, + subcateg=subcateg,ids=ids,resource=resource, + param=param) + + return(result) +}) diff --git a/clients/R/R/getGene-methods.R b/clients/R/R/getGene-methods.R new file mode 100644 index 0000000000..d4818298d2 --- /dev/null +++ b/clients/R/R/getGene-methods.R @@ -0,0 +1,44 @@ +################################################################################ +#' getGene +#' +#' A method to query gene data from Cellbase web services. +#' @details This method retrieves various gene annotations including transcripts +#' and exons data as well as gene expression and clinical data +#' @aliases getGene +#' @param object an object of class CellBaseR +#' @param ids a character vector of gene ids to be queried +#' @param resource a character vector to specify the resource to be queried +#' @param param an object of class CellBaseParam specifying additional param +#' for the CellBaseR +#' @return a dataframe with the results of the query +#' @examples +#' cb <- CellBaseR() +#' res <- getGene(object=cb, ids=c("TP73","TET1"), resource="info") +#' @seealso \url{https://github.com/opencb/cellbase/wiki} +#' and the RESTful API documentation +#' \url{http://bioinfo.hpc.cam.ac.uk/cellbase/webservices/} +#' @export +setMethod("getGene", "CellBaseR", definition = function(object, ids, + resource, + param=NULL) + { + + categ <- "feature" + subcateg<- "gene" + ids <- ids + resource <- resource + if (!is.null(param)) { + param <- c(genome=param@genome, gene=param@gene, + region=param@region, rs=param@rs,so=param@so, + phenotype=param@phenotype, limit=param@limit, + include=param@include, exclude=param@exclude, + limit=param@limit) + param <- paste(param, collapse = "&") + } + # TODO: param are not enabled + result <- fetchCellbase(object=object,file=NULL, meta=NULL, + categ=categ, subcateg=subcateg, + ids=ids, resource=resource, + param=param) + return(result) +}) diff --git a/clients/R/R/getMeta-methods.R b/clients/R/R/getMeta-methods.R new file mode 100644 index 0000000000..eaa9f4d259 --- /dev/null +++ b/clients/R/R/getMeta-methods.R @@ -0,0 +1,35 @@ +############################################################################### +#' getMeta +#' +#' A method for getting the available metadata from the cellbase web services +#' +#' @details This method is for getting information about the avaialable species +#' and available annotation, assembly for each species from the cellbase web +#' services. +#' @aliases getMeta +#' @param object an object of class CellBaseR +#' @param resource the resource you want to query it metadata +#' @return a dataframe with the +#' results of the query +#' @examples +#' cb <- CellBaseR() +#' res <- getMeta(object=cb, resource="species") +#' @seealso \url{https://github.com/opencb/cellbase/wiki} +#' and the RESTful API documentation +#' \url{http://bioinfo.hpc.cam.ac.uk/cellbase/webservices/} +#' @export +setMethod("getMeta", "CellBaseR", definition = function(object, resource){ + # host <- object@host + object@species <- "" + meta <- "meta/" + categ <- NULL + subcateg<- NULL + ids <- NULL + resource <- resource + result <- fetchCellbase(object=object, file=NULL, meta=meta, categ=categ, + subcateg=subcateg, + ids=ids, resource=resource, param=NULL) + data <- lapply(result, function(x)as.data.frame(x)) + result <- rbind.pages(data) + return(result) +}) diff --git a/clients/R/R/getProtein-methods.R b/clients/R/R/getProtein-methods.R new file mode 100644 index 0000000000..e9c26cc861 --- /dev/null +++ b/clients/R/R/getProtein-methods.R @@ -0,0 +1,42 @@ +############################################################################## +#' getProtein +#' +#' A method to query protein data from Cellbase web services. +#' @details This method retrieves various protein annotations including +#' protein description, features, sequence, substitution scores, evidence, etc. +#' @aliases getProtein +#' @param object an object of class CellBaseR +#' @param ids a character vector of uniprot ids to be queried, should be one +#' or more of uniprot ids, for example O15350. +#' @param resource a character vector to specify the resource to be queried +#' @param param a object of class CellBaseParam specifying additional param +#' for the query +#' @return an object of class CellBaseResponse which holds a dataframe with th +#' e results of the query +#' @examples +#' cb <- CellBaseR() +#' res <- getProtein(object=cb, ids="O15350", resource="info") +#' @export +setMethod("getProtein", "CellBaseR", definition = function(object, ids, + resource, + param= + NULL) { + + categ <- "feature" + subcateg<- "protein" + ids <- ids + resource <- resource + if (!is.null(param)) { + param <- c(genome=param@genome, gene=param@gene, + region=param@region, rs=param@rs,so=param@so, + phenotype=param@phenotype, limit=param@limit, + include=param@include, exclude=param@exclude, + limit=param@limit) + param <- paste(param, collapse = "&") + } + result <- fetchCellbase(object=object, file=NULL, meta=NULL, categ=categ, + subcateg=subcateg, ids=ids, resource=resource, + param=param) + + return(result) +}) diff --git a/clients/R/R/getRegion-methods.R b/clients/R/R/getRegion-methods.R new file mode 100644 index 0000000000..faedc391e4 --- /dev/null +++ b/clients/R/R/getRegion-methods.R @@ -0,0 +1,43 @@ +############################################################################### +#' getRegion +#' +#' A method to query features within a genomic region from Cellbase web +#' services. +#' @details This method retrieves various genomic features from a given +#' region including genes, snps, clincally relevant variants, proteins, etc. +#' @aliases getRegion +#' @param object an object of class CellBaseR +#' @param ids a character vector of the regions to be queried, for example, +#' "1:1000000-1200000' should always be in the +#' form 'chr:start-end' +#' @param resource a character vector to specify the resource to be queried +#' @param param a object of class CellBaseParam specifying additional param +#' for the query +#' @return a dataframe with the results of the query +#' @examples +#' cb <- CellBaseR() +#' res <- getRegion(object=cb, ids="17:1000000-1200000", resource="gene") +#' @seealso \url{https://github.com/opencb/cellbase/wiki} +#' and the RESTful API documentation +#' \url{http://bioinfo.hpc.cam.ac.uk/cellbase/webservices/} +#' @export +setMethod("getRegion", "CellBaseR", definition = function(object, ids, resource, + param=NULL) { + + categ <- "genomic" + subcateg<- "region" + ids <- ids + resource <- resource + if (!is.null(param)){ + param <- c(genome=param@genome, gene=param@gene, + region=param@region, rs=param@rs,so=param@so, + phenotype=param@phenotype, limit=param@limit, + include=param@include, exclude=param@exclude, + limit=param@limit) + param <- paste(param, collapse = "&") + } + result <- fetchCellbase(object=object, file=NULL, meta=NULL, categ=categ, + subcateg=subcateg, ids=ids, resource=resource, + param=param) + return(result) +}) diff --git a/clients/R/R/getSnp-methods.R b/clients/R/R/getSnp-methods.R new file mode 100644 index 0000000000..4a3fdbad45 --- /dev/null +++ b/clients/R/R/getSnp-methods.R @@ -0,0 +1,42 @@ +############################################################################### +#' getSnp +#' +#' A method to query genomic variation data from Cellbase web services. +#' @details . +#' @details This method retrieves known genomic variants (snps) and their +#' annotations including population frequncies from 1k genomes and Exac projects +#' as well as clinical data and various other annotations +#' @aliases getSnp +#' @param object an object of class CellBaseR +#' @param ids a character vector of the ids to be queried, must be a valid rsid, +#' for example 'rs6025' +#' @param resource a character vector to specify the resource to be queried +#' @param param a object of class CellBaseParam specifying additional param +#' for the query +#' @return a dataframe with the results of the query +#' @examples +#' cb <- CellBaseR() +#' res <- getSnp(object=cb, ids="rs6025", resource="info") +#' @seealso \url{https://github.com/opencb/cellbase/wiki} +#' and the RESTful API documentation +#' \url{http://bioinfo.hpc.cam.ac.uk/cellbase/webservices/} +#' @export +setMethod("getSnp", "CellBaseR", definition = function(object, ids, resource, + param=NULL) { + categ <- "feature" + subcateg<- "variation" + ids <- ids + resource <- resource + if (!is.null(param)) { + param <- c(genome=param@genome, gene=param@gene, + region=param@region, rs=param@rs,so=param@so, + phenotype=param@phenotype, limit=param@limit, + include=param@include, exclude=param@exclude, + limit=param@limit) + param <- paste(param, collapse = "&") + } + result <- fetchCellbase(object=object, file=NULL, meta=NULL, categ=categ, + subcateg=subcateg, ids=ids, resource=resource, + param=param) + return(result) +}) diff --git a/clients/R/R/getTf-methods.R b/clients/R/R/getTf-methods.R new file mode 100644 index 0000000000..e737507acd --- /dev/null +++ b/clients/R/R/getTf-methods.R @@ -0,0 +1,44 @@ +############################################################################### +#' getTf +#' +#' A method to query transcription factors binding sites data from Cellbase web +#' services. +#' @details This method retrieves various transcription factors binding sites +#' data +#' @aliases getTf +#' @param object an object of class CellBaseR +#' @param ids a character vector of the ids to be queried, must be a valid +#' transcription factor name, for example, +#' eg, CTCF +#' @param resource a character vector to specify the resource to be queried +#' @param param a object of class CellBaseParam specifying additional param +#' for the query +#' @return a dataframe with the results of the query +#' @examples +#' cb <- CellBaseR() +#' param <- CellBaseParam(limit = 12) +#' res <- getTf(object=cb, ids="CTCF", resource="tfbs", param=param) +#' @seealso \url{https://github.com/opencb/cellbase/wiki} +#' and the RESTful API documentation +#' \url{http://bioinfo.hpc.cam.ac.uk/cellbase/webservices/} +#' @export +setMethod("getTf", "CellBaseR", definition = function(object, ids, + resource, + param=NULL) { + categ <- "regulation" + subcateg<- "tf" + ids <- ids + resource <- resource + if (!is.null(param)) { + param <- c(genome=param@genome, gene=param@gene, + region=param@region, rs=param@rs,so=param@so, + phenotype=param@phenotype, limit=param@limit, + include=param@include, exclude=param@exclude, + limit=param@limit) + param <- paste(param, collapse = "&") + } + result <- fetchCellbase(object=object, file=NULL, meta=NULL, categ=categ, + subcateg=subcateg, + ids=ids, resource=resource, param=param) + return(result) +}) diff --git a/clients/R/R/getTranscript-methods.R b/clients/R/R/getTranscript-methods.R new file mode 100644 index 0000000000..61633676f1 --- /dev/null +++ b/clients/R/R/getTranscript-methods.R @@ -0,0 +1,34 @@ +############################################################################### +#' getTranscript +#' +#' A method to query transcript data from Cellbase web services. +#' @details This method retrieves various genomic annotations for transcripts +#' including exons, cDNA sequence, annotations flags, and cross references,etc. +#' @aliases getTranscript +#' @param object an object of class CellBaseR +#' @param ids a character vector of the transcript ids to be queried, use +#' ensemble transccript IDs eq, ENST00000380152 +#' @param resource a character vector to specify the resource to be queried +#' @param param an object of class CellBaseParam specifying additional params +#' for the query +#' @return a dataframe with the results of the query +#' @examples +#' cb <- CellBaseR() +#' res <- getTranscript(object=cb, ids="ENST00000373644", resource="info") +#' @seealso \url{https://github.com/opencb/cellbase/wiki} +#' and the RESTful API documentation +#' \url{http://bioinfo.hpc.cam.ac.uk/cellbase/webservices/} +#' @export +setMethod("getTranscript", "CellBaseR", definition = function(object, ids, + resource, + param=NULL) { + + categ <- "feature" + subcateg<- "transcript" + ids <- ids + resource <- resource + result <- fetchCellbase(object=object, file=NULL, meta=NULL, categ=categ, + subcateg=subcateg, + ids=ids, resource=resource, param=NULL) + return(result) +}) diff --git a/clients/R/R/getVariant-methods.R b/clients/R/R/getVariant-methods.R new file mode 100644 index 0000000000..64ae0c750c --- /dev/null +++ b/clients/R/R/getVariant-methods.R @@ -0,0 +1,49 @@ +############################################################################### +#' getVariant +#' +#' A method to query variant annotation data from Cellbase web services from +#' Cellbase web services. +#' @details This method retrieves extensive genomic annotations for variants +#' including consequence types, conservation data, population frequncies from 1k +#' genomes and Exac projects, etc. +#' as well as clinical data and various other annotations +#' @aliases getVariant +#' @param object an object of class CellBaseR +#' @param ids a character vector of the ids to be queried, must be in the +#' following format 'chr:start:ref:alt', for +#' example, '1:128546:A:T' +#' @param resource a character vector to specify the resource to be queried +#' @param param a object of class CellBaseParam specifying additional param +#' for the query +#' @return a dataframe with the results of the query +#' @examples +#' cb <- CellBaseR() +#' res <- getVariant(object=cb, ids="19:45411941:T:C", resource="annotation") +#' @seealso \url{https://github.com/opencb/cellbase/wiki} +#' and the RESTful API documentation +#' \url{http://bioinfo.hpc.cam.ac.uk/cellbase/webservices/} +#' @export +setMethod("getVariant", "CellBaseR", definition = function(object, ids, + resource, + param=NULL) { + categ <- "genomic" + subcateg<- "variant" + ids <- ids + resource <- resource + if(object@species!='hsapiens'&resource=='cadd'){ + stop('cadd scores are only avaialable for hsapiens') + } + if (!is.null(param)) { + param <- c(genome=param@genome, gene=param@gene, + region=param@region, rs=param@rs,so=param@so, + phenotype=param@phenotype, limit=param@limit, + include=param@include, exclude=param@exclude, + limit=param@limit) + param <- paste(param, collapse = "&") + } + result <- fetchCellbase(object=object, file=NULL, meta=NULL, + categ=categ, subcateg=subcateg, + ids=ids, resource=resource, param=param) + + return(result) +}) diff --git a/clients/R/R/getXref-methods.R b/clients/R/R/getXref-methods.R new file mode 100644 index 0000000000..3ba92c0491 --- /dev/null +++ b/clients/R/R/getXref-methods.R @@ -0,0 +1,43 @@ +############################################################################### +#' getXref +#' +#' A method to query cross reference data from Cellbase web services. +#' @details This method retrieves cross references for genomic identifiers, eg +#' ENSEMBL ids, it also provide starts_with service that is useful for +#' autocomplete services. +#' @aliases getXref +#' @param object an object of class CellBaseR +#' @param ids a character vector of the ids to be queried, any crossrefereable +#' ID, gene names, transcript ids, +#' uniprot ids,etc. +#' @param resource a character vector to specify the resource to be queried +#' @param param a object of class CellBaseParam specifying additional param +#' for the query +#' @return a dataframe with the results of the query +#' @examples +#' cb <- CellBaseR() +#' res <- getXref(object=cb, ids="ENST00000373644", resource="xref") +#' @seealso \url{https://github.com/opencb/cellbase/wiki} +#' and the RESTful API documentation +#' \url{http://bioinfo.hpc.cam.ac.uk/cellbase/webservices/} +#' @export +setMethod("getXref", "CellBaseR", definition = function(object, ids, resource, + param=NULL) { + + categ <- "feature" + subcateg<- "id" + ids <- toupper(ids) + resource <- resource + if (!is.null(param)) { + param <- c(genome=param@genome, gene=param@gene, + region=param@region, rs=param@rs,so=param@so, + phenotype=param@phenotype, limit=param@limit, + include=param@include, exclude=param@exclude, + limit=param@limit) + param <- paste(param, collapse = "&") + } + result <- fetchCellbase(object=object, file=NULL, meta=NULL, categ=categ, + subcateg=subcateg, + ids=ids, resource=resource, param=param) + return(result) +}) diff --git a/clients/R/R/show-methods.R b/clients/R/R/show-methods.R index 5c793fff65..087e38e5ef 100644 --- a/clients/R/R/show-methods.R +++ b/clients/R/R/show-methods.R @@ -1,30 +1,21 @@ -######################################################################################################################## -#' The show method for CellBaseR class -#' -#' @param object an object of class CellBaseR +############################################################################### +# The show method for CellBaseR class + +# setMethod("show",signature = "CellBaseR",definition = function(object){ cat("An object of class ", class(object), "\n", sep = "") - cat("| it holds the configuration for querying the Cellbase databases\n") - cat("| to change the default species from human use CellBaseR(species='')") + cat("| it holds the configuration for querying the CellBase databases\n") + cat("| the current species is ",object@species, "\n") }) -######################################################################################################################## -#' The show method for CellBaseParam class -#' -#' @param object an object of class CellBaseParam +############################################################################### +# The show method for CellBaseParam class +# + setMethod("show",signature = "CellBaseParam",definition = function(object){ - cat("An object of class ", class(object), "\n", sep = "") - cat("use this object to control what results are returned from the - CellBaseR methods") + cat("|An object of class ", class(object), "\n", sep = "") + cat("|use this object to control what results are returned from the CellBaseR + methods\n") }) -#' The show method for CellBaseResponse class -#' -#' @param object an object of class CellBaseResponse -setMethod("show",signature = "CellBaseResponse", definition = function(object){ - cat("An object of class ", class(object), "\n", sep = "") - cat(" containing ", nrow(object@cbData), " rows and ", - ncol(object@cbData), " columns.\n", sep = "") - cat(" to get the annotated dataframe use cbData()") -}) diff --git a/clients/R/R/tools.R b/clients/R/R/tools.R index 26110bc8c8..d886dc7ddd 100644 --- a/clients/R/R/tools.R +++ b/clients/R/R/tools.R @@ -1,36 +1,28 @@ utils::globalVariables(c("k", "transcripts", "exons")) -#' A convience fubction to directly annotate variants from a vcf file -#' -#' This is a function to annotate variants from a vcf file -#' @param object an object of class CellBaseR -#' @param file Path to a bgzipped and tabix indexed vcf file -#' @param batch_size intger if multiple queries are raised by a single method -#' call, e.g. getting annotation info for several genes, -#' queries will be sent to the server in batches. This slot indicates the size -#' of each batch, e.g. 200 -#' @param num_threads integer number of asynchronus batches to be sent to the -#' server -#' @param ... any extra arguments -#' @return a dataframe -Annovcf <- function(object, file, batch_size, num_threads){ - num_cores <-parallel::detectCores()-2 +# Annovcf +Annovcf <- function(object, file, batch_size, num_threads, BPPARAM=bpparam()){ + num_cores <-2 + register(BPPARAM, default=TRUE) registerDoParallel(num_cores) - p <- DoparParam() + p <- bpparam() host <- object@host species <- object@species version <- object@version batch_size <- object@batch_size num_threads <- object@num_threads ids <- readIds(file, batch_size, num_threads) + #filter out multiallelic sites + ids2 <- sapply(ids, function(x)sapply(x, function(y)filterMulti(y))) + names(ids2) <- NULL grls <- list() categ <- 'genomic/' subcateg <- "variant/" resource <- "/annotation" # get the IDs - gcl <- paste0(host,version,species,categ,subcateg,collapse = "") - for(i in seq_along(ids)){ - hop <- paste(ids[[i]],collapse = ",") + gcl <- paste0(host,version,species,"/",categ,subcateg,collapse = "") + for(i in seq_along(ids2)){ + hop <- paste(ids2[[i]],collapse = ",") tmp <- paste0(gcl,hop,resource,collapse = ",") grls[[i]] <- gsub("chr","",tmp) } @@ -38,48 +30,56 @@ Annovcf <- function(object, file, batch_size, num_threads){ grp <- foreach(i=1:length(prp))%do%{ paste(prp[[i]]) } - + # get the data and parse in chuncks num <- length(prp) i <- 1 container <- list() while(i<=num){ - content <- getURIAsynchronous(grp[[i]],perform = Inf)# alist of responses + resp <- pblapply(grp[[i]], function(x)GET(x, add_headers(`Accept-Encoding` + = "gzip, deflate"))) + content <- pblapply(resp, function(x) content(x, as="text", + encoding = "utf-8")) js <- bplapply(content, function(x)fromJSON(x),BPPARAM = p) res <- bplapply(js, function(x)x$response$result, BPPARAM = p) names(res) <- NULL ind <- sapply(res, function(x)length(x)!=1) res <- res[ind] ds <- bplapply(res, function(x)rbind.pages(x), BPPARAM = p) - container[[i]] <- ds + container[[i]] <- ds i=i+1 } - - - final <- foreach(k=1:length(container),.options.multicore=list(preschedule=TRUE), - .combine=function(...)rbind.pages(list(...)), - .packages='jsonlite',.multicombine=TRUE) %dopar% { - rbind.pages(container[[k]]) + + + final <-foreach(k=1:length(container), + .options.multicore=list(preschedule=TRUE), + .combine=function(...)rbind.pages(list(...)), + .packages='jsonlite',.multicombine=TRUE) %dopar% { + rbind.pages(container[[k]]) } - + return(final) - + } -# create GeneModel -#' A convience functon to construct a genemodel +#' createGeneModel #' -#' @details This function takes cbResponse object and returns a geneRegionTrack -#' model to be plotted by Gviz +#' A convience functon to construct a genemodel +#' @details This function create a gene model data frame, which can be then +#' turned into a GeneRegionTrack for visualiaztion +#' by \code{\link[Gviz]{GeneRegionTrack}} #' @param object an object of class CellbaseResponse #' @param region a character #' @return A geneModel #' @import data.table -# @examples -# cb <- CellBaseR() -# test <- createGeneModel(object = cb, region = "17:1500000-1550000") +#' @examples +#' cb <- CellBaseR() +#' test <- createGeneModel(object = cb, region = "17:1500000-1550000") +#' @seealso \url{https://github.com/opencb/cellbase/wiki} +#' and the RESTful API documentation +#' \url{http://bioinfo.hpc.cam.ac.uk/cellbase/webservices/} #' @export createGeneModel <- function(object, region=NULL){ if(!is.null(region)){ @@ -90,8 +90,9 @@ createGeneModel <- function(object, region=NULL){ subcateg<- "region" ids <- region resource <- "gene" - data <- fetchCellbase(file=NULL,host=host, version=version, meta=NULL, species=species, categ=categ, subcateg=subcateg, - ids=ids, resource=resource, filters=NULL) + data <- fetchCellbase(object=object, file=NULL, meta=NULL, categ=categ, + subcateg=subcateg, + ids=ids, resource=resource, param=NULL) rt4 <- data[,c(1,2,11)] rt4 <- as.data.table(rt4) #rt4 <- as.data.table(rt4) @@ -104,12 +105,14 @@ createGeneModel <- function(object, region=NULL){ hope <- as.data.frame(hope) hope <- hope[!duplicated(hope),1:9] - chr <- paste0("chr",hope$chromosome[1]) - from <- min(hope$start)-5000 - to <- max(hope$end)+5000 - hope <- Gviz::GeneRegionTrack(hope,from = from, to = to, - transcriptAnnotation='symbol') } hope } + +# Filter multiallelic sites +filterMulti <- function(x){ + res <- strsplit(x, split = ",")[[1]][1] + res +} + diff --git a/clients/R/R/user.R b/clients/R/R/user.R new file mode 100644 index 0000000000..311d52f97b --- /dev/null +++ b/clients/R/R/user.R @@ -0,0 +1,198 @@ +#' getClinicalByGene +#' +#' A convienice method to fetch clinical variants for specific gene/s +#' @param object an object of CellBaseR class +#' @param id a charcter vector of HUGO symbol (gene names) +#' @param param an object of class CellBaseParam +#' @return a dataframe of the query result +#' @examples +#' cb <- CellBaseR() +#' res <- getClinicalByGene(cb, "TET1") +#' @export +getClinicalByGene <- function(object, id, param=NULL){ + + res <- getGene(object = object, ids = id, resource = "clinical", + param = param) + res +} +############################################################################## +#' getTranscriptByGene +#' +#' A convienice method to fetch transcripts for specific gene/s +#' @param object an object of class CellBaseR +#' @param id a charcter vector of HUGO symbol (gene names) +#' @param param an object of class CellBaseParam +#' @return a dataframe of the query result +#' @examples +#' cb <- CellBaseR() +#' res <- getTranscriptByGene(cb, "TET1") +#' @export +getTranscriptByGene <- function(object, id, param=NULL){ + + res <- getGene(object = object, ids = id, resource = "transcript", + param = param) + res +} +############################################################################## +#' getGeneInfo +#' +#' A convienice method to fetch gene annotations specific gene/s +#' @param object an object of class CellBaseR +#' @param id a charcter vector of HUGO symbol (gene names) +#' @param param an object of class CellBaseParam +#' @return a dataframe of the query result +#' @examples +#' cb <- CellBaseR() +#' res <- getGeneInfo(cb, "TET1") +#' @export +getGeneInfo <- function(object, id, param=NULL){ + + res <- getGene(object = object, ids = id, resource = "info", + param = param) + res +} +############################################################################## +#' getSnpByGene +#' +#' A convienice method to fetch known variants (snps) for specific gene/s +#' @param object an object of class CellBaseR +#' @param id a charcter vector of HUGO symbol (gene names) +#' @param param an object of class CellBaseParam +#' @return a dataframe of the query result +#' @examples +#' cb <- CellBaseR() +#' param <- CellBaseParam(limit = 10) +#' res <- getSnpByGene(cb, "TET1", param = param) +#' @export +getSnpByGene <- function(object, id, param=NULL){ + + res <- getGene(object = object, ids = id, resource = "snp", param = param) + res +} +############################################################################## +#' getProteinInfo +#' +#' A convienice method to fetch annotations for specific protein/s +#' @param object an object of class CellBaseR +#' @param id a charcter vector of Uniprot Ids +#' @param param an object of class CellBaseParam +#' @return a dataframe of the query result +#' @examples +#' cb <- CellBaseR() +#' res <- getProteinInfo(cb, "O15350") +#' @export +getProteinInfo <- function(object, id, param=NULL){ + + res <- getProtein(object = object, ids = id, resource = "info", + param = param) + res +} +############################################################################## +#' getClinicalByRegion +#' +#' A convienice method to fetch clinical variants for specific region/s +#' @param object an object of class CellBaseR +#' @param id a charcter vector of genomic regions, eg 17:1000000-1100000 +#' @param param an object of class CellBaseParam +#' @return a dataframe of the query result +#' @examples +#' cb <- CellBaseR() +#' res <- getClinicalByRegion(cb, "17:1000000-1189811") +#' @export +getClinicalByRegion <- function(object, id, param=NULL){ + + res <- getRegion(object = object, ids = id, resource = "clinical", + param = param) + res +} +############################################################################## +#' getConservationByRegion +#' +#' A convienice method to fetch conservation data for specific region/s +#' @param id a charcter vector of genomic regions, eg 17:1000000-1100000 +#' @param object an object of class CellBaseR +#' @param param an object of class CellBaseParam +#' @return a dataframe of the query result +#' @examples +#' cb <- CellBaseR() +#' res <- getConservationByRegion(cb, "17:1000000-1189811") +#' @export +getConservationByRegion <- function(object, id, param=NULL){ + + res <- getRegion(object = object, ids = id, resource = "conservation", + param = param) + res +} +############################################################################## +#' getRegulatoryByRegion +#' +#' A convienice method to fetch regulatory data for specific region/s +#' @param object an object of class CellBaseR +#' @param id a charcter vector of genomic regions, eg 17:1000000-1100000 +#' @param param an object of class CellBaseParam +#' @return a dataframe of the query result +#' @examples +#' cb <- CellBaseR() +#' res <- getRegulatoryByRegion(cb, "17:1000000-1189811") +#' @export +getRegulatoryByRegion <- function(object, id, param=NULL){ + + res <- getRegion(object = object, ids = id, resource = "regulatory", + param = param) + res +} +############################################################################## +#' getTfbsByRegion +#' +#' A convienice method to fetch Transcription facrots data for specific region/s +#' @param id a charcter vector of genomic regions, eg 17:1000000-1100000 +#' @param object an object of class CellBaseR +#' @param param an object of class CellBaseParam +#' @return a dataframe of the query result +#' @examples +#' cb <- CellBaseR() +#' res <- getTfbsByRegion(cb, "17:1000000-1189811") +#' @export +getTfbsByRegion <- function(object, id, param=NULL){ + + res <- getRegion(object = object, ids = id, resource = "tfbs", + param = param) + res +} +############################################################################## +#' getCaddScores +#' +#' A convienice method to fetch Cadd scores for specific variant/s +#' @param object an object of class CellBaseR +#' @param id a charcter vector of genomic variants, eg 19:45411941:T:C +#' @param param an object of class CellBaseParam +#' @return a dataframe of the query result +#' @examples +#' cb <- CellBaseR() +#' res <- getCaddScores(cb, "19:45411941:T:C") +#' @export +getCaddScores <- function(object, id, param=NULL){ + + res <- getVariant(object = object, ids = id, resource = "cadd", + param = param) + res +} +############################################################################## +#' getVariantAnnotation +#' +#' A convienice method to fetch variant annotation for specific variant/s +#' @param object an object of class CellBaseR +#' @param id a charcter vector of length < 200 of genomic variants, +#' eg 19:45411941:T:C +#' @param param an object of class CellBaseParam +#' @return a dataframe of the query result +#' @examples +#' cb <- CellBaseR() +#' res <- getVariantAnnotation(cb, "19:45411941:T:C") +#' @export +getVariantAnnotation <- function(object, id, param=NULL){ + + res <- getVariant(object = object, ids = id, resource = "annotation", + param = param) + res +} \ No newline at end of file diff --git a/clients/R/README.md b/clients/R/README.md index 83a01739de..857f5bc1bd 100644 --- a/clients/R/README.md +++ b/clients/R/README.md @@ -1,4 +1,7 @@ + [![Build Status](https://travis-ci.org/melsiddieg/cellbaseR.svg?branch=master)](https://travis-ci.org/melsiddieg/cellbaseR) + + ### Overview This R package makes use of the exhaustive RESTful Web service API that has been implemented for the Cellabase database. It enable researchers to query and obtain a wealth of biological information from a single database saving a lot of time. Another benefit is that researchers can easily make queries about different biological topics and link all this information together as all information is integrated. diff --git a/clients/R/dbsnp_gene258.txt b/clients/R/dbsnp_gene258.txt new file mode 100644 index 0000000000..382a0a0644 --- /dev/null +++ b/clients/R/dbsnp_gene258.txt @@ -0,0 +1,2322 @@ +rs3924573 +rs3924574 +rs4694075 +rs4694076 +rs5859239 +rs6422713 +rs6605353 +rs6831606 +rs7439186 +rs7439191 +rs7439194 +rs7658448 +rs7674598 +rs7679703 +rs7680880 +rs7694409 +rs10540269 +rs13115627 +rs28377667 +rs28435442 +rs28451259 +rs28459922 +rs28509200 +rs28538959 +rs28548913 +rs28571094 +rs28585617 +rs28589913 +rs28590566 +rs28710288 +rs28723380 +rs28723656 +rs28735772 +rs28744573 +rs33910648 +rs33975031 +rs34032826 +rs34230455 +rs34367704 +rs34480281 +rs34538475 +rs35266919 +rs35287680 +rs35454701 +rs35496203 +rs35575397 +rs35736187 +rs35850072 +rs35859385 +rs35870385 +rs35913040 +rs35936034 +rs36108778 +rs55938049 +rs56877949 +rs57032476 +rs57519313 +rs58537027 +rs59142068 +rs61047303 +rs61455089 +rs61544557 +rs62323386 +rs62323387 +rs62323388 +rs62323389 +rs62323390 +rs62323404 +rs62323405 +rs67400307 +rs67785664 +rs71210192 +rs71210194 +rs71599963 +rs71599964 +rs71604568 +rs71671481 +rs71865638 +rs72652261 +rs72652262 +rs72652263 +rs72654383 +rs72654384 +rs72654385 +rs72654387 +rs72859609 +rs74328499 +rs74863297 +rs74926542 +rs74949118 +rs75018716 +rs75194467 +rs75457045 +rs75728781 +rs75825750 +rs76096306 +rs76503327 +rs76889324 +rs77018163 +rs77185575 +rs77381490 +rs77530417 +rs77969954 +rs78115903 +rs78323483 +rs78367307 +rs79024248 +rs79108066 +rs79122304 +rs79131152 +rs79200974 +rs79736910 +rs79834971 +rs79881380 +rs79970290 +rs111295696 +rs111453594 +rs111586006 +rs111711924 +rs111733033 +rs111863442 +rs111983789 +rs112223321 +rs112432980 +rs112526317 +rs112651555 +rs112697905 +rs113010670 +rs113027837 +rs113107651 +rs113127264 +rs113168982 +rs113344792 +rs113359786 +rs113360877 +rs113506649 +rs113806454 +rs114116379 +rs114352568 +rs114441254 +rs114451220 +rs114744918 +rs114846042 +rs115081332 +rs115176437 +rs115227739 +rs115391384 +rs115538991 +rs115723025 +rs115835101 +rs115893252 +rs116007537 +rs116518439 +rs116601725 +rs117351187 +rs117687487 +rs137900627 +rs138033439 +rs138362289 +rs138423171 +rs138657065 +rs138774045 +rs139104328 +rs139319140 +rs139568664 +rs139684640 +rs139807447 +rs139870016 +rs139975322 +rs140073076 +rs140210365 +rs140331879 +rs140365016 +rs140618698 +rs140816853 +rs140820215 +rs140996175 +rs141168596 +rs141384720 +rs141401324 +rs141521373 +rs141524813 +rs141535122 +rs141615558 +rs141858427 +rs142022847 +rs142254586 +rs142316020 +rs142332144 +rs142373684 +rs142454471 +rs142481454 +rs142563291 +rs142755020 +rs142764944 +rs143004208 +rs143203106 +rs143285488 +rs143597176 +rs143716009 +rs143748901 +rs143795139 +rs143940501 +rs143941749 +rs144031017 +rs144286664 +rs144800041 +rs144829376 +rs144854242 +rs144905737 +rs145058270 +rs145190129 +rs145196562 +rs145240720 +rs145329566 +rs145659003 +rs145723122 +rs145745749 +rs145763811 +rs146025791 +rs146044517 +rs146148316 +rs146167261 +rs146171297 +rs146187098 +rs146205948 +rs146238585 +rs146588857 +rs146725902 +rs146953511 +rs147042417 +rs147852217 +rs147949755 +rs147966778 +rs148041312 +rs148068857 +rs148417782 +rs148944860 +rs149205050 +rs149467865 +rs149521103 +rs149779151 +rs149937358 +rs150017698 +rs150026302 +rs150338030 +rs150547868 +rs150827003 +rs151127788 +rs151283081 +rs180819235 +rs180895165 +rs181057426 +rs181160026 +rs181644387 +rs181822454 +rs182172977 +rs182244473 +rs182511529 +rs182578895 +rs183113225 +rs183137060 +rs183407829 +rs183684131 +rs184092253 +rs184131646 +rs184170430 +rs184384776 +rs184986363 +rs185058170 +rs185154087 +rs185351363 +rs185403461 +rs185626073 +rs186037759 +rs186527935 +rs186736014 +rs187062200 +rs187097254 +rs187338583 +rs187405225 +rs187484386 +rs187612936 +rs187673856 +rs188269687 +rs188275922 +rs188401314 +rs188435519 +rs188549233 +rs188722316 +rs189233519 +rs189438972 +rs189506030 +rs189846864 +rs189892663 +rs190060481 +rs190127198 +rs190311485 +rs190373217 +rs190674911 +rs190944379 +rs191137647 +rs191503725 +rs191765265 +rs191989344 +rs192030042 +rs192077837 +rs192560459 +rs192802012 +rs193002626 +rs193123387 +rs199519886 +rs199531157 +rs199534434 +rs199556863 +rs199582898 +rs199622935 +rs199822777 +rs199886372 +rs200081159 +rs200089358 +rs200183196 +rs200594154 +rs200620822 +rs200708176 +rs200796492 +rs201142712 +rs201190468 +rs201299436 +rs201348905 +rs201496209 +rs201505714 +rs201644638 +rs201976575 +rs202024421 +rs202245589 +rs267600236 +rs367566102 +rs367728696 +rs367866356 +rs367971921 +rs368000869 +rs368325742 +rs368371182 +rs368409993 +rs368599894 +rs368636663 +rs368641147 +rs368655454 +rs368770792 +rs368861309 +rs368927637 +rs369006341 +rs369011183 +rs369098661 +rs369108748 +rs369129669 +rs369135444 +rs369224560 +rs369261041 +rs369331417 +rs369393485 +rs369596506 +rs369661101 +rs369701598 +rs369746513 +rs369762642 +rs369894758 +rs369907660 +rs370393648 +rs370473140 +rs370614344 +rs370678334 +rs370798263 +rs370911623 +rs371026801 +rs371093375 +rs371173790 +rs371199073 +rs371537255 +rs371641899 +rs371732806 +rs371778201 +rs371801125 +rs371948350 +rs371993910 +rs372201499 +rs372243132 +rs372302987 +rs372347148 +rs372563005 +rs372583774 +rs372811383 +rs372935744 +rs373012636 +rs373033705 +rs373117636 +rs373284973 +rs373323752 +rs373422008 +rs373446963 +rs373505344 +rs373577295 +rs373660529 +rs373881695 +rs374087780 +rs374242351 +rs374442005 +rs374646768 +rs374694395 +rs374703849 +rs374733347 +rs374742197 +rs374781399 +rs374816418 +rs374902438 +rs374980119 +rs375075485 +rs375086122 +rs375231405 +rs375335465 +rs375426598 +rs375453085 +rs375496198 +rs375499565 +rs375793904 +rs375943228 +rs375959178 +rs376071193 +rs376075755 +rs376082805 +rs376165259 +rs376197293 +rs376418551 +rs376440889 +rs376539054 +rs376598317 +rs376703369 +rs376746114 +rs376770243 +rs376980666 +rs376992994 +rs377037017 +rs377060218 +rs377158807 +rs377162419 +rs377236269 +rs377247109 +rs377394491 +rs377677437 +rs386675808 +rs386675809 +rs397942821 +rs397975803 +rs527310479 +rs527357261 +rs527512407 +rs527572322 +rs527740107 +rs527781394 +rs528152479 +rs528488360 +rs528719388 +rs529121596 +rs529312358 +rs529364577 +rs529413064 +rs529681144 +rs529804459 +rs529899227 +rs530195571 +rs530338480 +rs530360963 +rs530934998 +rs531330579 +rs531420264 +rs531631680 +rs531706240 +rs531856448 +rs532168563 +rs532230767 +rs532260231 +rs532724029 +rs532755114 +rs532880819 +rs532890418 +rs532996523 +rs533043393 +rs533260858 +rs533617285 +rs533757135 +rs533863329 +rs533913529 +rs534082374 +rs534252995 +rs534618928 +rs534738445 +rs535146873 +rs535667209 +rs535745406 +rs536021304 +rs536197066 +rs536318071 +rs536354762 +rs536508087 +rs536782842 +rs537189924 +rs537308228 +rs537315226 +rs537394074 +rs537558699 +rs537817133 +rs538289084 +rs538374745 +rs538422602 +rs538436788 +rs538513467 +rs538594739 +rs538643551 +rs538877012 +rs538972710 +rs539004255 +rs539114576 +rs539396380 +rs539638557 +rs539727196 +rs539771790 +rs539995074 +rs540001335 +rs540090155 +rs540285832 +rs540287623 +rs540292592 +rs540888139 +rs541199150 +rs541206640 +rs541251018 +rs541282103 +rs541381310 +rs541406442 +rs541599647 +rs541726047 +rs542112970 +rs542167730 +rs542170793 +rs542293507 +rs542436394 +rs542511852 +rs542547942 +rs542712763 +rs542719255 +rs542726419 +rs543064210 +rs543323106 +rs543637559 +rs543838539 +rs543916135 +rs544269602 +rs544334674 +rs544553597 +rs544578996 +rs544588394 +rs544817845 +rs544931617 +rs545208587 +rs545361978 +rs545457617 +rs545603808 +rs545698256 +rs545743366 +rs545835543 +rs546007780 +rs546042929 +rs546183974 +rs546394829 +rs546558306 +rs546600426 +rs546683340 +rs546719907 +rs546778141 +rs546842758 +rs546851902 +rs547160561 +rs547878793 +rs548083930 +rs548085077 +rs548688377 +rs548769495 +rs548992791 +rs549027766 +rs549105163 +rs549158960 +rs549285638 +rs549981692 +rs550039546 +rs550317645 +rs550339358 +rs550893711 +rs551519308 +rs551524128 +rs551865058 +rs552438585 +rs552473293 +rs552641212 +rs552720870 +rs552993582 +rs553040303 +rs553094254 +rs553165288 +rs553176387 +rs553328499 +rs553464684 +rs553845772 +rs554231706 +rs554233924 +rs554335470 +rs554356883 +rs554370118 +rs554401846 +rs554440217 +rs554494179 +rs554658250 +rs554781199 +rs554861742 +rs555392291 +rs555446608 +rs555672812 +rs555715855 +rs555924488 +rs555956094 +rs556403309 +rs556513212 +rs556625869 +rs556750626 +rs556781042 +rs556782400 +rs556921138 +rs557074479 +rs557139317 +rs557513411 +rs557734044 +rs557855881 +rs557885429 +rs557976679 +rs558169730 +rs558376593 +rs558651263 +rs558957844 +rs558971507 +rs559397801 +rs559460134 +rs559502503 +rs559633827 +rs559764125 +rs559870572 +rs559932940 +rs559957759 +rs560047086 +rs560621502 +rs560735479 +rs560914355 +rs560984875 +rs560986989 +rs561446897 +rs561755444 +rs561898654 +rs561980298 +rs562186691 +rs562421222 +rs562460540 +rs562461443 +rs562771968 +rs562777014 +rs562940440 +rs563297639 +rs563299134 +rs563966501 +rs564280422 +rs564565946 +rs564813294 +rs564868779 +rs564905233 +rs565182189 +rs565347250 +rs565669837 +rs566049345 +rs566052665 +rs566076352 +rs566174722 +rs566238707 +rs566255037 +rs566305033 +rs566380661 +rs566988852 +rs567117623 +rs567245133 +rs567483718 +rs567484088 +rs567531034 +rs567550757 +rs567710200 +rs568283274 +rs568466514 +rs568675718 +rs568703630 +rs568713009 +rs568747131 +rs568881578 +rs569308117 +rs569636529 +rs569712208 +rs569816124 +rs569994498 +rs570116933 +rs570234604 +rs570596037 +rs570727742 +rs570793698 +rs570826995 +rs570996891 +rs571270578 +rs571513107 +rs571590922 +rs571819924 +rs571842651 +rs571921337 +rs572136702 +rs572199718 +rs572621110 +rs572713251 +rs572995187 +rs573033853 +rs573178243 +rs573529595 +rs573543784 +rs573981632 +rs574018774 +rs574192895 +rs574230384 +rs574397289 +rs574452222 +rs574741101 +rs575098469 +rs575117056 +rs575174439 +rs575359978 +rs575681057 +rs575990541 +rs576248341 +rs576336383 +rs576415971 +rs576569856 +rs576696208 +rs577246599 +rs577456867 +rs577766915 +rs577773346 +rs577891390 +rs577983012 +rs578017318 +rs578044191 +rs578051558 +rs745371944 +rs745594327 +rs745638949 +rs745654916 +rs745765008 +rs745938371 +rs745981017 +rs746036188 +rs746141544 +rs746159063 +rs746228829 +rs746310972 +rs746356236 +rs746426326 +rs746539334 +rs746624600 +rs746724705 +rs746787053 +rs746813256 +rs746834479 +rs746883901 +rs746885949 +rs746974656 +rs747007114 +rs747014519 +rs747119987 +rs747137893 +rs747166600 +rs747255232 +rs747370717 +rs747383763 +rs747439436 +rs747475472 +rs747565586 +rs747646070 +rs747740833 +rs747766446 +rs747799656 +rs747805519 +rs747854302 +rs747912788 +rs748077119 +rs748229314 +rs748344001 +rs748357992 +rs748365197 +rs748406215 +rs748492024 +rs748519925 +rs748629954 +rs748698157 +rs748714399 +rs748798988 +rs748931327 +rs748995149 +rs749016234 +rs749065689 +rs749196582 +rs749235920 +rs749277134 +rs749376645 +rs749397318 +rs749418617 +rs749558512 +rs749666851 +rs749703387 +rs749828135 +rs749865798 +rs750033625 +rs750168916 +rs750358093 +rs750379334 +rs750413031 +rs750588564 +rs750930274 +rs751027728 +rs751074735 +rs751162767 +rs751307514 +rs751339307 +rs751374782 +rs751432137 +rs751520250 +rs751577588 +rs751608780 +rs751721654 +rs751803066 +rs751811155 +rs751867964 +rs752057018 +rs752108180 +rs752225523 +rs752342150 +rs752348612 +rs752402310 +rs752524524 +rs752528379 +rs752612682 +rs752814924 +rs753006873 +rs753200127 +rs753263140 +rs753314472 +rs753378385 +rs753391808 +rs753435072 +rs753523123 +rs753602612 +rs753659960 +rs753667279 +rs753699796 +rs753805325 +rs753807589 +rs753861074 +rs753981873 +rs754031212 +rs754127370 +rs754166897 +rs754334834 +rs754351034 +rs754440872 +rs754508444 +rs754548772 +rs754569842 +rs754569854 +rs754594272 +rs754629521 +rs754667088 +rs754691173 +rs754791754 +rs754808661 +rs754866209 +rs754932853 +rs755021007 +rs755136801 +rs755186739 +rs755356334 +rs755392251 +rs755400390 +rs755404251 +rs755434940 +rs755494804 +rs755522196 +rs755667673 +rs755715582 +rs755744770 +rs755785755 +rs755836287 +rs755836736 +rs755921012 +rs756017972 +rs756062120 +rs756080244 +rs756094947 +rs756169533 +rs756236756 +rs756553919 +rs756707494 +rs756710235 +rs756726075 +rs756925513 +rs756969935 +rs756987016 +rs756993915 +rs757073352 +rs757198664 +rs757334549 +rs757343797 +rs757438245 +rs757445366 +rs757552249 +rs757573332 +rs757641274 +rs757950890 +rs758011947 +rs758020895 +rs758057577 +rs758133163 +rs758140701 +rs758171789 +rs758335048 +rs758351216 +rs758388637 +rs758509817 +rs758546675 +rs758599357 +rs758687587 +rs758709641 +rs758950730 +rs759085271 +rs759090497 +rs759170710 +rs759337300 +rs759342902 +rs759510590 +rs759559200 +rs759581697 +rs759782328 +rs759807580 +rs759822612 +rs759960410 +rs759994492 +rs760048837 +rs760273996 +rs760302093 +rs760307757 +rs760313097 +rs760362738 +rs760389841 +rs760501686 +rs760558453 +rs760617304 +rs760629885 +rs760724796 +rs760758795 +rs760915331 +rs760923195 +rs760928369 +rs760941532 +rs760956903 +rs761020179 +rs761041082 +rs761122909 +rs761133818 +rs761193651 +rs761521791 +rs761595217 +rs761621695 +rs761701631 +rs761723007 +rs761755537 +rs761801420 +rs761866110 +rs761873084 +rs761891580 +rs761895998 +rs762064429 +rs762075115 +rs762078135 +rs762205073 +rs762271725 +rs762294255 +rs762338094 +rs762471651 +rs762671034 +rs762819032 +rs762829882 +rs762840330 +rs762881888 +rs763013673 +rs763026369 +rs763034932 +rs763139877 +rs763317455 +rs763427554 +rs763484324 +rs763562068 +rs763621098 +rs763622136 +rs763846029 +rs763850112 +rs763929179 +rs763931330 +rs763983609 +rs764018902 +rs764110289 +rs764283468 +rs764306628 +rs764337538 +rs764383206 +rs764459313 +rs764598505 +rs764660387 +rs764685565 +rs764712520 +rs764722872 +rs764935597 +rs764939749 +rs764991108 +rs765011604 +rs765017023 +rs765076338 +rs765093755 +rs765131383 +rs765256208 +rs765340433 +rs765462447 +rs765462707 +rs765655841 +rs765703346 +rs765704979 +rs765921100 +rs766020605 +rs766028049 +rs766044957 +rs766064153 +rs766100077 +rs766147620 +rs766225005 +rs766229520 +rs766257873 +rs766325385 +rs766326078 +rs766460788 +rs766489283 +rs766493438 +rs766526587 +rs766731780 +rs766830942 +rs766865064 +rs766904083 +rs766935881 +rs766963001 +rs766972765 +rs767008720 +rs767182246 +rs767279567 +rs767284722 +rs767464468 +rs767521239 +rs767554152 +rs767693494 +rs767715150 +rs767848385 +rs767882542 +rs767914206 +rs767961230 +rs767972285 +rs767995404 +rs768051738 +rs768228366 +rs768264470 +rs768372497 +rs768378208 +rs768407132 +rs768607147 +rs768613149 +rs768673264 +rs768705381 +rs768760959 +rs768792914 +rs768841395 +rs768972542 +rs769061576 +rs769062573 +rs769094247 +rs769200833 +rs769325843 +rs769371270 +rs769376399 +rs769523083 +rs769559009 +rs769705808 +rs769811556 +rs769911881 +rs770104590 +rs770126037 +rs770127979 +rs770257329 +rs770264296 +rs770298829 +rs770433471 +rs770446858 +rs770460128 +rs770498002 +rs770510857 +rs770515782 +rs770662595 +rs770852229 +rs770954734 +rs771179545 +rs771183034 +rs771217998 +rs771228127 +rs771276958 +rs771316013 +rs771351508 +rs771396982 +rs771414577 +rs771613177 +rs771648844 +rs771701895 +rs771843046 +rs771871364 +rs771915325 +rs772035255 +rs772087403 +rs772124232 +rs772146203 +rs772155667 +rs772247798 +rs772271187 +rs772304269 +rs772307532 +rs772331112 +rs772340921 +rs772360617 +rs772520773 +rs772521362 +rs772566071 +rs772832255 +rs772863243 +rs772951204 +rs773058826 +rs773118004 +rs773146871 +rs773147077 +rs773197079 +rs773236947 +rs773323545 +rs773325113 +rs773345867 +rs773395077 +rs773468518 +rs773514948 +rs773631696 +rs773646817 +rs773734640 +rs773972418 +rs774010923 +rs774062263 +rs774143167 +rs774172380 +rs774262816 +rs774324175 +rs774370036 +rs774386756 +rs774390533 +rs774473809 +rs774477839 +rs774596022 +rs774650612 +rs774653716 +rs774730846 +rs774743870 +rs774799244 +rs774830241 +rs774863048 +rs774984989 +rs775244856 +rs775414238 +rs775494113 +rs775535240 +rs775639547 +rs775667627 +rs775867526 +rs775899514 +rs775941778 +rs776063839 +rs776099092 +rs776174719 +rs776268348 +rs776377225 +rs776389254 +rs776396880 +rs776557419 +rs776565676 +rs776661614 +rs776875648 +rs776928121 +rs776975434 +rs777015829 +rs777127126 +rs777303776 +rs777318415 +rs777368202 +rs777442798 +rs777465699 +rs777675028 +rs777719898 +rs777785704 +rs777817672 +rs777856234 +rs777861387 +rs778067258 +rs778082450 +rs778170186 +rs778278579 +rs778316669 +rs778353419 +rs778527857 +rs778539622 +rs778594228 +rs778627420 +rs778629743 +rs778718391 +rs778731323 +rs778820984 +rs778896618 +rs778923688 +rs778971384 +rs779026885 +rs779083275 +rs779084410 +rs779113083 +rs779268740 +rs779573135 +rs779579689 +rs779605432 +rs779668319 +rs779675904 +rs779676765 +rs779765531 +rs779779400 +rs779781403 +rs779869165 +rs779874002 +rs779975669 +rs780129733 +rs780244963 +rs780300075 +rs780324229 +rs780326419 +rs780349174 +rs780424964 +rs780632317 +rs780715710 +rs780934616 +rs781020845 +rs781041364 +rs781082963 +rs781128848 +rs781187635 +rs781231723 +rs781264832 +rs781315593 +rs781370051 +rs781391187 +rs781478867 +rs781488282 +rs781571269 +rs781578161 +rs781714948 +rs781728949 +rs796231400 +rs796434734 +rs796638835 +rs796800689 +rs865848110 +rs865862482 +rs866183040 +rs866268583 +rs866307016 +rs866318277 +rs866539254 +rs866587144 +rs866630412 +rs866824281 +rs867098230 +rs867141454 +rs867402927 +rs867597552 +rs867658650 +rs867659169 +rs867708157 +rs867821510 +rs867974870 +rs868044717 +rs868168848 +rs868188594 +rs868395641 +rs868420689 +rs868823128 +rs868823352 +rs869056092 +rs869231475 +rs869259128 +rs878919504 +rs878993086 +rs879075404 +rs879266025 +rs879391233 +rs879495884 +rs879503656 +rs879511767 +rs879565060 +rs879596815 +rs886078364 +rs886307293 +rs886738960 +rs886852997 +rs887085938 +rs887113361 +rs887247034 +rs887757170 +rs887855504 +rs887910348 +rs887976448 +rs888010337 +rs888034318 +rs888080677 +rs888187617 +rs888217705 +rs888350331 +rs888936163 +rs889100107 +rs889260843 +rs889323836 +rs889432087 +rs889574372 +rs889585405 +rs890244156 +rs890451722 +rs890611735 +rs891137543 +rs891259305 +rs891261994 +rs891359373 +rs891376570 +rs891401498 +rs891755127 +rs891762915 +rs891835922 +rs891867273 +rs891988663 +rs892064852 +rs892066592 +rs892322538 +rs892390946 +rs892609075 +rs892819067 +rs892929899 +rs892979072 +rs893225054 +rs893589544 +rs894321909 +rs894502263 +rs894566576 +rs894636691 +rs894759023 +rs895209875 +rs895417362 +rs895523884 +rs895554955 +rs895738500 +rs895978869 +rs896089544 +rs896292484 +rs896325750 +rs896897010 +rs896938406 +rs897924181 +rs898110098 +rs898178070 +rs898225708 +rs898255276 +rs898498303 +rs898619863 +rs898749249 +rs898782055 +rs898905781 +rs899469985 +rs899562004 +rs899773232 +rs900167861 +rs900409341 +rs900806229 +rs901108440 +rs901125195 +rs901537272 +rs901613515 +rs901841524 +rs901975707 +rs902049879 +rs902095303 +rs902127904 +rs902479013 +rs902590352 +rs902592642 +rs902783438 +rs902807877 +rs902864027 +rs902922908 +rs903024454 +rs903113041 +rs903251249 +rs903662690 +rs903690036 +rs904271861 +rs904700527 +rs905011514 +rs905066648 +rs905097498 +rs905362786 +rs905831778 +rs905946713 +rs906026746 +rs906059266 +rs906094854 +rs906126893 +rs906156218 +rs906360132 +rs906392176 +rs906687072 +rs906861115 +rs907036359 +rs907113581 +rs907139718 +rs907509728 +rs907556740 +rs907670611 +rs908571877 +rs908672795 +rs908772240 +rs908900427 +rs908974323 +rs909220459 +rs909338728 +rs909342724 +rs909675424 +rs909739917 +rs910274965 +rs910401775 +rs910432211 +rs910484347 +rs910655196 +rs910724531 +rs911171208 +rs911406132 +rs911532703 +rs911911357 +rs912087648 +rs912153579 +rs912186792 +rs912768613 +rs912844526 +rs913262192 +rs913300389 +rs913311923 +rs913430294 +rs913502352 +rs913603149 +rs913625480 +rs913742593 +rs914224871 +rs914409240 +rs914671311 +rs915141733 +rs915262465 +rs915312511 +rs915508602 +rs915537636 +rs915693670 +rs915808913 +rs915877580 +rs915904189 +rs915929198 +rs916008100 +rs916200257 +rs916330408 +rs916659004 +rs916682468 +rs916714805 +rs917065494 +rs917109397 +rs917186082 +rs917347556 +rs917573035 +rs917760161 +rs917876202 +rs918015255 +rs918230611 +rs918261799 +rs918377447 +rs918483682 +rs918502953 +rs918992714 +rs919234050 +rs919249960 +rs919359305 +rs919396887 +rs919527263 +rs919689675 +rs920162596 +rs920171959 +rs920411095 +rs920451759 +rs920493496 +rs920898405 +rs920961820 +rs920994068 +rs921090204 +rs921120661 +rs921121390 +rs921570386 +rs921872062 +rs922102411 +rs922766981 +rs922832614 +rs922956990 +rs923036124 +rs923278577 +rs923430210 +rs923534573 +rs923983028 +rs924100232 +rs924160418 +rs924258337 +rs924262067 +rs924315002 +rs924340205 +rs924416817 +rs924560350 +rs925581393 +rs925722527 +rs925909179 +rs926009404 +rs926113632 +rs926119694 +rs926146146 +rs926250821 +rs926390331 +rs926636193 +rs926709823 +rs926755518 +rs926900585 +rs927043917 +rs927266841 +rs927392491 +rs927414404 +rs927817392 +rs928271896 +rs928347989 +rs928427207 +rs928680567 +rs928793942 +rs928965088 +rs929305172 +rs929722025 +rs929808247 +rs930350294 +rs930406137 +rs930498107 +rs930665275 +rs930743505 +rs931004703 +rs931332585 +rs931433132 +rs931475677 +rs931481378 +rs931536257 +rs931596295 +rs932058505 +rs932105780 +rs932135222 +rs932189724 +rs932191368 +rs932212890 +rs932315158 +rs932415273 +rs932527145 +rs932559688 +rs932821933 +rs933187269 +rs933250805 +rs933746573 +rs933879581 +rs934062403 +rs934554731 +rs934722281 +rs935395377 +rs935502050 +rs935564095 +rs935575639 +rs935595130 +rs935611473 +rs936058566 +rs936106788 +rs936175185 +rs936205883 +rs936508462 +rs936588372 +rs937026125 +rs937089798 +rs937136091 +rs937282409 +rs937716611 +rs938061939 +rs938216382 +rs938231885 +rs938645170 +rs938700889 +rs938758043 +rs938881608 +rs938926655 +rs938929261 +rs938970823 +rs939027999 +rs939138504 +rs939277085 +rs939289963 +rs939703666 +rs940226539 +rs940318692 +rs940322731 +rs940586197 +rs941100601 +rs941247968 +rs941345054 +rs941746911 +rs942086534 +rs942104695 +rs942152271 +rs942273883 +rs942329758 +rs942743456 +rs942775980 +rs942797138 +rs942849177 +rs942886149 +rs942899327 +rs942937525 +rs943008308 +rs943047040 +rs943184823 +rs943987695 +rs944458334 +rs944590146 +rs944694412 +rs944765973 +rs945209953 +rs945490379 +rs946124606 +rs946205870 +rs946279104 +rs946324417 +rs946417518 +rs946517920 +rs947741716 +rs947910527 +rs947984659 +rs948000768 +rs948446836 +rs948459211 +rs948738011 +rs948772042 +rs949374356 +rs949536490 +rs949573272 +rs949591962 +rs949892865 +rs950072276 +rs950122190 +rs950262648 +rs950383836 +rs950442461 +rs950963335 +rs951188823 +rs951199231 +rs951229979 +rs951263170 +rs951552279 +rs951848124 +rs952142351 +rs952397259 +rs952413556 +rs952557709 +rs952811002 +rs952891656 +rs952964547 +rs953149379 +rs953419624 +rs953479833 +rs953512791 +rs953712589 +rs953728720 +rs953804621 +rs953844969 +rs953986717 +rs954088553 +rs954333329 +rs954643293 +rs954809161 +rs955083375 +rs955145257 +rs955358667 +rs955466525 +rs955525988 +rs955532764 +rs955636278 +rs955742747 +rs955805307 +rs955997366 +rs956097847 +rs956105087 +rs956440060 +rs956484086 +rs956605995 +rs957068163 +rs957139772 +rs957409076 +rs957425979 +rs957656044 +rs957769755 +rs958318663 +rs958433562 +rs958613412 +rs958644618 +rs958796286 +rs959325425 +rs959326947 +rs959444027 +rs959600370 +rs959701443 +rs959735031 +rs960265123 +rs960308549 +rs960459078 +rs960500065 +rs960501707 +rs961004673 +rs961035707 +rs961297783 +rs961976577 +rs962001893 +rs962453012 +rs962671711 +rs962704544 +rs962720272 +rs962850031 +rs963043274 +rs963446348 +rs963447049 +rs963587281 +rs963628362 +rs963709014 +rs963858158 +rs963981346 +rs964116505 +rs964251899 +rs964483275 +rs964744196 +rs964924637 +rs964939062 +rs965282340 +rs965602903 +rs965998429 +rs966682293 +rs967102706 +rs967152933 +rs967448188 +rs967593565 +rs967612908 +rs967795539 +rs967856878 +rs967928951 +rs968391285 +rs968524159 +rs968616231 +rs968813851 +rs968869060 +rs969188211 +rs969834862 +rs970009945 +rs970156542 +rs970166618 +rs970315837 +rs970504340 +rs970576434 +rs970652750 +rs970828532 +rs970868415 +rs970877326 +rs970949547 +rs970956955 +rs971101156 +rs971208455 +rs972091929 +rs972112986 +rs972126204 +rs972378635 +rs972444418 +rs972518168 +rs972687404 +rs973088950 +rs973371758 +rs973630434 +rs973704302 +rs973732514 +rs973762255 +rs973765209 +rs973796298 +rs974090121 +rs974117827 +rs974380852 +rs974428865 +rs974829519 +rs975130673 +rs975154979 +rs975343432 +rs975442282 +rs975497998 +rs975656269 +rs975725257 +rs975814406 +rs975830340 +rs975983379 +rs976397396 +rs976441995 +rs976634818 +rs976644418 +rs976679624 +rs977116745 +rs977207845 +rs977275468 +rs977275889 +rs977769813 +rs978152789 +rs978561778 +rs978616645 +rs978695426 +rs979149833 +rs979182548 +rs979205703 +rs979262932 +rs979337125 +rs979452151 +rs979784371 +rs979796755 +rs979861748 +rs979916051 +rs980613732 +rs980616066 +rs980659048 +rs980841513 +rs981615859 +rs981713470 +rs981788528 +rs982050318 +rs982290738 +rs982321892 +rs982329416 +rs982671265 +rs982761389 +rs982792752 +rs982956853 +rs983132671 +rs983414707 +rs983676642 +rs983746978 +rs984497422 +rs984509316 +rs984609978 +rs984673304 +rs984798601 +rs984810702 +rs984959734 +rs985284010 +rs985319021 +rs986088092 +rs986131002 +rs986218581 +rs986274628 +rs986305591 +rs986313540 +rs986771504 +rs987293372 +rs987365223 +rs987394849 +rs987915174 +rs988058446 +rs988200546 +rs988448570 +rs989015368 +rs989039064 +rs989064954 +rs989210871 +rs989240203 +rs989263843 +rs989384883 +rs989559434 +rs989593521 +rs989628531 +rs989659830 +rs989702727 +rs989891401 +rs989946654 +rs989961962 +rs989993109 +rs990051312 +rs990097986 +rs990209740 +rs990775805 +rs990805557 +rs990909680 +rs990988987 +rs991229545 +rs991266750 +rs991332769 +rs991368923 +rs991451374 +rs991664798 +rs991837660 +rs991846892 +rs992185224 +rs992552026 +rs992825778 +rs992919329 +rs992936194 +rs993009843 +rs993045034 +rs993296178 +rs993597295 +rs993679670 +rs993695397 +rs993853724 +rs994079843 +rs994364083 +rs994414684 +rs994950182 +rs994954363 +rs995482536 +rs995665729 +rs995699423 +rs996053259 +rs996107394 +rs996139857 +rs996302074 +rs996328696 +rs996446494 +rs996837892 +rs997028586 +rs997042784 +rs997138823 +rs997168112 +rs997301237 +rs997471134 +rs997770035 +rs998112868 +rs998305673 +rs998521570 +rs998643726 +rs998675047 +rs998961036 +rs999178510 +rs999564940 +rs999578002 +rs999649967 +rs999794232 +rs999825395 +rs999899006 +rs999949299 +rs1000390188 +rs1000520596 +rs1000738119 +rs1001276730 +rs1001452441 +rs1001657845 +rs1001865992 +rs1001897264 +rs1002059383 +rs1002430045 +rs1002530057 +rs1002561301 +rs1002627150 +rs1002921853 +rs1002948638 +rs1003014016 +rs1003092024 +rs1003225682 +rs1003378129 +rs1003537199 +rs1003607895 +rs1003992227 +rs1004215958 +rs1004245415 +rs1004394622 +rs1004572058 +rs1004736548 +rs1004768890 +rs1004801231 +rs1005793065 +rs1005919535 +rs1005968447 +rs1006273639 +rs1006302222 +rs1006486040 +rs1006933180 +rs1006964908 +rs1007105294 +rs1007262314 +rs1007293426 +rs1007622018 +rs1007780243 +rs1007875526 +rs1008077938 +rs1008158763 +rs1008675691 +rs1008957424 +rs1009240638 +rs1009303128 +rs1009354430 +rs1009458161 +rs1009528439 +rs1010237276 +rs1010310957 +rs1010641564 +rs1010874245 +rs1010929658 +rs1010948532 +rs1010979678 +rs1011101687 +rs1011226396 +rs1011233320 +rs1011306760 +rs1011512579 +rs1011550269 +rs1012065625 +rs1012097750 +rs1012153101 +rs1012614630 +rs1012797926 +rs1013122227 +rs1013181196 +rs1013222435 +rs1013310886 +rs1013527324 +rs1013571439 +rs1013585758 +rs1013657961 +rs1013922728 +rs1013991336 +rs1014235714 +rs1014293600 +rs1014438717 +rs1014578410 +rs1014600351 +rs1015035497 +rs1015064878 +rs1015381092 +rs1015717932 +rs1015848239 +rs1015877648 +rs1016018047 +rs1016029292 +rs1016197022 +rs1016371555 +rs1016390133 +rs1016703666 +rs1016734855 +rs1017294806 +rs1017386239 +rs1017405957 +rs1017532875 +rs1017755376 +rs1018075008 +rs1018410128 +rs1018699388 +rs1018775970 +rs1018943717 +rs1019379150 +rs1019380088 +rs1019429775 +rs1019468394 +rs1019727779 +rs1019733120 +rs1020107917 +rs1020250258 +rs1020356035 +rs1020409188 +rs1020620850 +rs1020739868 +rs1020886587 +rs1020974278 +rs1021003876 +rs1021281654 +rs1021615551 +rs1021670277 +rs1021887006 +rs1022104275 +rs1022256060 +rs1022294213 +rs1022412676 +rs1022855801 +rs1022959335 +rs1022985227 +rs1022986201 +rs1023140841 +rs1023192406 +rs1023457021 +rs1023791167 +rs1024127865 +rs1024631315 +rs1024652554 +rs1024961923 +rs1025819309 +rs1025864734 +rs1026222042 +rs1026314448 +rs1026345354 +rs1026592115 +rs1026675450 +rs1027379293 +rs1027425570 +rs1027946219 +rs1027951807 +rs1028026694 +rs1028179665 +rs1028621847 +rs1029098870 +rs1029208939 +rs1029371065 +rs1029821875 +rs1030223897 +rs1030411096 +rs1030466092 +rs1030610207 +rs1030687257 +rs1030718547 +rs1030881726 +rs1030956407 +rs1031324430 +rs1031361990 +rs1031373061 +rs1031378335 +rs1031532261 +rs1032022032 +rs1032046798 +rs1032114471 +rs1032177621 +rs1032367032 +rs1032706904 +rs1033054376 +rs1033281764 +rs1033308392 +rs1033604142 +rs1033620164 +rs1033855203 +rs1033933460 +rs1034110970 +rs1034115409 +rs1034194736 +rs1034241639 +rs1034272534 +rs1034451563 +rs1034512388 +rs1034652442 +rs1034832985 +rs1035377306 +rs1035869239 +rs1035916125 +rs1036192338 +rs1036342331 +rs1036413577 +rs1036521290 +rs1037261177 +rs1037294839 +rs1037525432 +rs1037598592 +rs1037992485 +rs1038129626 +rs1038424764 +rs1038879884 +rs1038890224 +rs1039143225 +rs1039264948 +rs1039860866 +rs1039894418 +rs1040024274 +rs1040093510 +rs1040196226 +rs1040294256 +rs1040423376 +rs1040500132 +rs1040587355 +rs1040642826 +rs1040714511 +rs1040887902 +rs1040959921 +rs1041351841 +rs1041370341 +rs1041427317 +rs1041519657 +rs1041563454 +rs1041587618 +rs1041605412 +rs1041964093 +rs1041990097 +rs1042428114 +rs1042640217 +rs1042788057 +rs1043019468 +rs1043097455 +rs1043240236 +rs1043385924 +rs1043431999 +rs1043791975 +rs1043925190 +rs1044201170 +rs1044401800 +rs1044460920 +rs1044624223 +rs1044914255 +rs1044989063 +rs1045046940 +rs1045324048 +rs1045403022 +rs1045804377 +rs1045881455 +rs1046006965 +rs1046615236 +rs1046766243 +rs1047052614 +rs1047074511 +rs1047088826 +rs1047183573 +rs1047241299 +rs1047749148 +rs1047877065 +rs1048014728 +rs1048314022 +rs1048398927 +rs1048764590 +rs1048892888 +rs1049142028 +rs1049454723 +rs1049565550 +rs1049613050 +rs1049687200 +rs1050020092 +rs1050475687 +rs1050537971 +rs1050567619 +rs1050702026 +rs1050998497 +rs1051120499 +rs1051208919 +rs1051288769 +rs1051289133 +rs1051322968 +rs1051592316 +rs1051627907 +rs1051691919 +rs1052039914 +rs1052343022 +rs1052621887 +rs1052886341 +rs1053235997 +rs1053309830 +rs1053359651 +rs1053560423 +rs1053704129 +rs1053949631 +rs1054339985 +rs1054622654 +rs1054915447 +rs1055280892 +rs1055354799 +rs1055383957 +rs1055455358 +rs1055481171 +rs1055661082 +rs1056057170 +rs1056088739 +rs1056226544 +rs1056594027 +rs1057052679 +rs1057055942 +rs1057281520 +rs1057320372 diff --git a/clients/R/inst/extdata/hapmap_exome_chr22_500.vcf.gz b/clients/R/inst/extdata/hapmap_exome_chr22_500.vcf.gz new file mode 100644 index 0000000000000000000000000000000000000000..78cdb61734ca305f593812e417eb89530cf47ae7 GIT binary patch literal 125911 zcmV)0K+eA(iwFb&00000{{{d;LjnLMO6`4Fb6ZJv=Ck}O5Zw<`6%9eTFOWH77D=fU zmZ*iSDlg$cKqN%MMG|ZRR7sBc@pI0}^==?kqQ?_44!et27kP6%`Q_R3&wu{3yjpx( z-CfT&d%qmK_^c-U@BaMf{nw{^fB))m@A&QU?8DKE@!?{9cDKCUELS&sfBLYvy<4mo zH=Ffne)Dy7yIQZ8AFmdp`PF7|cQfBCKjZV&0$*)Lo6F^TbhSF0=Qp z-&~HMm+K{T2&x)w!gr&q#plJ<2!=eODn{3agLd)FW9vm`l3T$%wzUNz@ji-^#!}OLtjkji+$X_7^O>JLf3Zaiw%8o zkJ%SBk-~|pFW9vm`r<-g{A2dTAhD|4m(aBx`r@H4oH4+>zdTlNh(tpn|@hu!%F=Rlu(mf4Cptv2_Oe!6(8BRrLeA^^HRkXcJLd&yx}6 zCUoZQhd29ybKC!Ee0+cXadEfD$ERO!7ke+RR`X4>ANzqx`#8UX))&<5Vt#fxx?F5V z7mJ(K2EOamdzk8-gnD1yY!(-byPletXQT7Q?dEb#HE&>ecZ*NJGM*!+7&*lCXn8|F zt?tejccZK2db2ohw|V%kHJ1K1Z*T8bUzWhgVng%u(D>*Fd|r=!U&8a7_j^KXXe<2l zBNW2oz{lRf@R!KHF3x{!H~;eeF3rD;6E=EZv#wPwr>$B}Hh0ULi~dU5AHR8ZJlky+ z-YjpH*Z0?>!*`?A$Mxdw^WvNa8>jgt@c5&Tz>fdcZsOfe9ej8Bb-g^BUyW`r=WFES4|EZ_cel8rk4Kx;XmtanU@9&b zcb$H|I{YL3e0A9D;O|iNB9Qz2&GK*e3oH>QYCgIE8RllRo?qX>{`leJ{bmH68O_h` zK-P(`*FTQVRyQ|`GZ2IB7H2@e>+*eS_2O=If7=okCuTNd&d`+BwfkHz_T^zIVq z^647J15sugzo6TswfljYC%QKkT z%Oxxo{&croFKBQtmTOqV|FIq&eVLzaMyHGQ25IMfv4KT_Z|@LlJ}&3$33ch^{^>s+ ztgf%&?Q58$$qCTl+2)t|-Et11Z0Ks^)%cgi-5NV5C+ev(PcJ^6F=2!r9|95Y{pnYj zi<8CeNXQWvQ>LcCz`T5O`jojTVk9!;hQ!#oqCL_%dK0R)4-+&q0`^%ca|99MD&(4^OyaR(n>Ti2*U%bG-FXy*!Zx=W37BKA1*F6QC1_F9d>a~ATrW4XRcyWS3#p~x#GCysban=`09)#EezRvr7gvB$SMN{o zmv;zXd#Fnp0R=A42^wkM&Nesj&ECnY*GI>vFuB*T7Bis1i@W*tEW&(j?YG6^cHpPD zmO#t%>&5JPetU}qK|7d6dk?GqDL$ux&hKIAakO7%XR!IGM?jo2Jgf0*IIwPLSK>eJ zR=KSkAeifOBL3yg>=FvVj*Z<|0&g>0-CTW5Wr4lCo53)zXP?hL&BAdA{aRcl^8a}D zDLuic2yS6MGNG=QNZg;k{knK@Dn%@uy>#@ zt+_b4oWo}S>EK0t|2cqsTzGBfAi{Kc5-y|kFDQt=Rj)+U$~*JRu>4SGm;th zULC)9i?0Y=GND~Au5MFH@i1$&yZ6I~)%j0QIWj9qtb6f?(Ry`%_aOehfsMXAAz}wk z;~9=V@dO`;5xE9LnSEHC!!bnP&R*Z&TpY}2CyT%Rdbzq<9DRYa>D|@+dd3t}T+a9e zkLjm!B0=aCOxeh6O@2B$T;BtMz|k^6L2JVQ@#W;`%l?6!d^mdX>iFnz!VLF#>`s8T zCl~+mBhn`BN`##5K+_0+KK|+L&&P+v&3!}Z)%~WL99-Vd^Jf=lXHP$^#WP@#fCIc) zE}k6#hCcggxq`~i?-8fN>@B_ogg|P41}ro{1iXW}n4MkT2@yw-aD;k*M}PR|;!E0; zk+|dgz#&lmq004S^JVjI>9C%)YHPht{6*_^-57R(Sd-Sv zf#(Wz?3d*#h#m2VFqSt%KX<>wLk{5x_%c9IJd(pi%G|G;EQ!4Kn7E6owGIzdNy!(6jEDpN+GoHiv-C%(*Ih*{$ z=5%$u0%_zb_8r##?XR=rx5saPIr{K=|J}P+$1i6GZ{NJxKR%qj25^W>*hyxJu%cNw zbqKQ~@6`MqxF9$m&n^*VKLS5P=W)$&#B%uCdIp^Z7GjmDx=-i`DwNyXtFIpx(EsJf zyC9AhNds{2>4mgHxcR3jXq;Z&kKW9`j+h-WG1Yp?#pvkpv?XFl<{h_O7-@G9F}i(t z95Lhg?d<5Z2pZ3p>*dwz=2_(DVIrR$ygK{<@PBd-%*n~>)8_a2-QpR3@C@f_CZ1g_ z7L(uM-^-iz?B6f1my^Z${RAo-5Lo`pB$MvYXaIl&bX34JA^-7=PxP~o(*Czh^4~Ja z{|7P&o!tK|lKi(w^6erCoj-g3+F`xveU?YMs0)Y5>>V)T&vukBp1t|`_35h!fqzIU z(JVuCy#}C`eU+7t;2Y>b@soouc?zH zldbM9CLixs2uX03ZtgdW2{IRx#mxmOeV41rdIMbYB#I>mE7&MsHox8hF5R8LFQd&m zG8d7G(ZvX;`1}B{@YAQrPF&moVkah~eg(TPzRpKOuf&6p#}g>blj={<9zU|MK?7AEUKrf3#djQxtuST|i?X z_JZt^Z?VAq<||rpE=I-tR62K%dbalFNCQEtaVq@KZeHyzlPR1G_>|_U> zuWM6iY5qm4`QeFqaThk}*Y9rgco(zd>1s2-!ov;n^Uv;=D{kvwGsmfaCq` zM}s#DEVaH|-nJ_E4#WHN5zfyjSl_Qfe7&511{Q9yxXG6GR%0g* z_V!oY#prVigOAjUM?od4od2(8rANnYYjN)oPByDsbYxwUBpho`JXEvB7bg#|YQtW7 z`xNT9NBIOnB^xalWVGB28ZDcxzTAmWUmlTLg>;l5eSZ{nsOy?j5S;kNt#es*$tczE>7!?m4k zU<#13&ljJU^Rysa>i#Rpy}QiL>-pUUPB)(U%ZqzFC*Y`A-L9^_g7`mzTCkzW7>pv0 zzPcG5k=#8xTmn;+ZRn--U)!6ck03(F18${F{Z|;|*U_(wp*pv6TLhcO=p1shI0La1i0A5S zIa%j{-`GF+@q3S99LEl){~sB}r^G7kFpwADKajRJRnI6syg3=Y2^xxqJ5^N)+np12#*mmz-S_*?mro7L0ElEkC1Ro~(Mx7FA6(IOk#XFRQo zA5={tX$PPGn1ekKY+C&|0vYbrFGsV}5Bsltj~+bhPqC_Wbo~y*gmxf2Dn9~D zhJ)>fzzetvI5n3yIIrsk%{w~w#ZOx^^0vbd^sMe%)OEsnbF;d6dcFi)T%M0eNj~}^ zPRq0O@E0r-pWBkmyO+E8R%Iuu*JaC+F0fVETbQ-SpTfZN^i1Ie_M?9e-|sMm=@f;t z=+p8X73R;<_WSsCbchUMv(gXmGO2EJEG?vpnr;9k;1w3vu(@s*Kz{c(%MFTf;h*R^ zm$52|d?fMG>6CT)t!4Z0^A7%nr`>jcAP&4;8SMIZtMz||fYSh$%)543$CI}oc3`@` zUSBUz*F1WA4oC0@qIPIVd=bP_!UWI>u|du1E)46*>4yjDGZ6_2-Dq&S+cej+S>rG7 zPhP*>f%IOlKy=4J+@(Q$T;O`oN2Hui`vH}YzyXHeq6Ogw&n?^*v>Q-po!_t5P<(W~ z{Ia>f3woQDKoCcP-PwU~(wJ$>pO;^nb)MZ{-QF$R3YT6&#B=-xAS4{{!A+%VyKFK#VaUy7b zg9?Mi0(*I|y8Z|&@JkIqM28pD5FcMHZZ0;LdqR1knGt+EU#~%mz52TMQQB5%QA$hh zy|i*$X_-oM@0fs3*tXKDl;&J3Va>MEI+u3Lb1lr)x=k)^IaJP!-B#M>(%N(BjM+L$ zmrE-nje>!0EA2~ZF1Ung+*X>iTwH1`l~r3i&UsawF{Am`Ipm@gmrir%_15BLJvr3u zopoD_mjz{3DzDYnCE{g8nb49;zjYpYUQ*AbR#tCaBc7MkaqhL?+q;sN)H-IZP}|3u zmlUW)IPbRhMC27U62_^;)}DyGpvrOKA6Ouf*Hd%Jlr~#e|DOt#Yhjt*zJva`3=($z z1698{&2<}X{I;SmUo*x8vy(DXVYaS(_(GWS1#D=xb&299zWT(&&VKk4$;&6g0u(&_ z31{^u#_cc`S#=CHqEI`0qN`67;KB}bT#ZEQD6c!!3T&XvOFqXpB{ptT@d24l~B;PrTe^ET;L%E=$R47~{K) zMOBonq*S|%rJgaV#V%v1hcAuaWnF4W)^0n;6hEoQqWvyoVHLqRF1Me{af?-y>;d?9 zfs6VRVcf&SkAc+XuwX{*LNTJ6GT;Q{E~qSA{S7b>56^($)ueH0E#KwvtH%SZq~BpZ zS$$vvbF<4y&g=0Q&bKqHv2U#LjoSfefpxCGQDPTB%tSPVQ zz`}Cv(l^uiM)+OY(T#7k+GQ&=zJZOs1MTp74y@<99JfL>zA=86{Zp^00|xft@c=Vl ze*^6IE-ad;zcEhlGM?5qW*2a)>DpP4Q+60nV-A2F*afTVxdxtNmwhU#d4r9?w@dP| zooWt1imTS2n$}isLK5 zA5&gQdIfNqUMZpIm9yzXZMliBN+-MxuRPB!>R8H){E9Pth0(dWMXTd0^$(0&=d5Jm zLwJ=3q_~K$a#xLxb%{JVHhm~_i-yq{pNgZf7OmU zdu(EbectkRiEj^odVctBPx9w4PGIv)fOC2N@?g*EiO|oZOTiwTX;wVXP62z^>T|T? z@5$#ai!;;;Y=C?I=KUTp-Acd%+hfn)wEA*<0Db1r*74!~9)JGsC2FC>m_2`gxCf{q z-1DX?9zTOVp1l2l(IwtL59;N;r+`Y%Fa84Kt`xg_FhkFyQg-jn`{(P$W-od4y}H@I zx_a{Rbh>{yJ$yHP`F{HD_4M7lC;SZWj(nlYPdKXzmGWb$k>yg4Sy9+}C2T|4VOyCa4OH~98jFM1+!dZvHpJF9mB8eM(?2tGRB^=ApxF9-b zg~)+qV8-q99`hhlKJZ#V+8xRVi7iq-fJLHw;I)~2i0GpofXMx)HpR1NYznJ|>n_aH zIanI&#=v&K18{84>r}*H5jS-LiwGElV^{{BIILeRgo`aWkP!R??x)6Luk09PK>3HK94T1+O}Eh3=U+NG&o@4QYqY#lI2pK`bLEq*X`AnI3fw_iem(R z&Pvr9n#VN(sNlc@V~zNv5(yw`A(CnAw-RHeX|CYGsdj&`uMQ?y7#y0%CuiHFG&GOU z^h7Z>g%^NuG&%_@0fX`epcgm+IGazO zK=<^nPz9(Ym8R3GdlJq?0s4_0wF@-20# zi&b_k{UBB;>{A!3fHMeK1>9W1D(Hk0kAPJQNkc_a1$knO0yaJZLcs!M3PMVhwk)S| zVYk9D44htHDIiw(P14?nZOpatsZFFh|)%+Hi|2o<@Mnufw!K zF%Xe@*MPyqE5bX#@-Z4cQ!&Iar5|jxIlDGDDphKfcCyE%0%`u_nd#ih9>lVWfSiOe57gZHkn8xN%BL|N#>n}g6k%x(dBleJGoqP8sD%!x zvG92I<8ICbN^$~7KlpwuX#@uNrk<{FM&i#@As+(dD-{wl2tLw^-p<(68K0m8zEB`C z(N5*KfspB&;x>gRt$G@zy@(7j7QizH2Liz7-42C$Dl7+P)1=wVJQ7U@pAr~JoDgD` z%vfd~i6f+Q8Q3T|Qxstcu~DpdPGy`^9ril#EF5MZB`+nJvDU#}KX@Y0w&+3n?r!*! z9Fumu3tL_XeS>W28<3~y;c%D`N!`F)*y!3?+~^9PeA(!*VNJEsg-2FnV58%g%;G*5 zwpSPv09J*;QNWYoK9^xn1F)(=4#!Shj~;>mSN6AA6rAMoQtXqL?f(;CD{3ghK5|97Hc36Q@=GY>tX0%YS z|M3`xC!4q(Zb*9*#Tqx(j)(oINr>LIgdO>^I>xa#%9m-iw7^pVSQP{^WWSOsrVqdC z=l0A(H^a;#tEI}!)Lc=wF9AQKFrE{B7!BeBscjta_(o5R%EFLP5hY;v_DDk$)<)nTQu#Pt*)--@Y`Q(S6i`54(@cn~P3mt_}7E>mr&m;up& z7*?Z!Oifh`c0ByQ=Ajr=rIAJqh|ZdiS=<+}CR5}w7`6Rz%BxOu+T-Eq_IPsK-l$Zp5Sc7kpoNx z{mO)xaRd=*Jv=#@gjBD_dEzvyWugq$EP>?`q`i>brP2y@O>n43{-5e5^v4aWa7V*a zDs3dKm_@z_clQ5=8Hu}i_HwpQ@Qcs}2!+syAeY+Vgn>AQ(hkxNl!11PpeI-6+8_{u zw1EXRs(5gfG_Yu@#&=k@vT~>@!o@?@4zSJfyeNXWIf2q#SQOMO67vT$ZB^#^qI#+> z=1InZV$SCS4x0eJ*UPlTxUj@R;+d#qViJwQgAfO;Y#ubCG*l)*UZq3U7Xkyk43J5q z5e|-3hU5f~jueJb;|&6)_Z)CjIgUoKph035STJC*bVg2T0&+TJw7STNH=Ok7yyZkT zpc8uBR3nLrs-P3;vk9HR*${M!9xe-6!!5|^Ko)Exry#oyC%euNbb<`Yd!Wp*_{S?IYF=;w1kel`yoDo4$ zD-*FsB!q@{y-I>KQP;k{^TOc#v;nKi{yqBiw(iZ8x6rx zfXZVS6>#$a+=M)EfVnb_s0`%DW(ER~oWL4k5Owbe$qD2|ASYz0Xu`FPC6&>!WbPU= zq=+dRkcZSV25>^zZtwLJq_VM=qzHuh(w(E+2p|EDNQWcT zuh9_Tprj6SJY-M-ig<;KT;Y}ROnJa7fu5SV3TS{hj(Em|y)4jpjF=^|e3nm4-#H3BJgAn$0y`-b10peG^?RVB?y-496}ha$(y!ookEMAE{Gq$X{aL(0H!0B`Mm! zY~t&Rfy*L)0%AZAIR>@> zagi3yBZe5{+mL@Uy1f>OdqD}37*B-|koagJkncnQbcNv~lNLjU&jp3}z#$hnKHSg3 z5XXmc1`KP5C#*!P#D}7C7n1nn(7h%b1?9w< zrgGf6VVxO91#L%1-9bn4ZyAC|$$FJ#irEB@DE4MXPU%OLft&od)TDi;O$r2y7LUfZ z@W@2TOoW=Yr3PX%%+phr$V`xZ6sgYQmJ?K(p$?j)Ag_nI!EEjZ8i9B%j;mxuqoN9> zX#!EMfb!9nRvpy361})UNrgp~8LEF+U9>5O0QklZ2qf`F2VneV3b-W8d4OlqffYtb zSsW^05?c04`CxOi0u^fnLOcunB*bAl9&n*17Yx}_glV{6kI3olx090ULpfC+Y06at_d z6$gmpjHY3#(IShd!trL&zFilEE{28TbVvkLOKJi1I-z;M6=kaIBs^LSGMYM*h4Hww z*1D<1-jC7loft?kEgFVL`aSg#BsT0d-0D8y?5;|d+F~KKHL8nlWpCL6ODo1GT zb+j;C4LDjbmAxJ|vpS6YfGP2yn^H zXfwwt0AT;HTCtXmNe(rU(-e$&ONLS~Nu;6%1ve%QJeDH_0NDYac#xA@tdi2vP!+f- z5Pf}{6V<$CxPZSkxk%z^EvnZInizRFzil>mkz?XC2-a#W>HL?ZXKOoWCFK!uv4BdB zrGsBP96Z_rgIJ_#@ThY4BslvvC*hi01gd&`o7W}F9I3%fb$)Ova^^*%6GeW=cv{09X;M z%oboEiNo5H&eKQr1KMW-=n8V#D5K9ld@S_FP`A(#wU|{NE|MeBzvEg~@*N@K^mo?x)0hV7&RV57$q zj7h>NsMfnI83U&MVad4mT220ls+Mqpv+&s;F%yrA#6!-H#sRKmOMB3HOv&dH_Lq{l z;yS6nYx=UhmTG~Ua#{FIwU8&5L=0m=VpJV_y^2OtMMhJU?nJwm+?UW|W5*<`Kda#Y zi&)j7;VttLy)oQ0dSjR%x6153wL>$(he41(k%nVIlTHnGm2a=lmT60F4*kV*rvaNpAl#m1f30*(6P`~d$M{GmIP z3KR0*CR8+DC$=i|!mvL&6v6|N;>fclYJdP%1=$GBCzTIp>o^^t{XKl<-bjoYP?P}E5gi*?;#QqDhci= z38>Sb8oaA_sr^72=KHovnaXr_N^~cTf0IvV&+AInm-iYeImr-}p78I$>(qm=*QEQS z6kaN@RpeIw8^gHzUJq>4c%oJh&7-#YL##xHUg$pv8ATHtR7x;w*3qJ4mvz!E^}MT$ zTfw}QSSiQzANXJ2yLeg(>n#PLF-%?vyKEnre_(R$M2TW=iW&&hYi`1jFXe`!(0o29 zIe8BmU|v;MIqH-3DISz$e%i+JZ#yqBY)toP9Xv?nTeJ?QV~^(;IgTeMpD@ew$!We{ zIZCug?j{LB&^BRth@(LtKP@X7Z+P=c5snUrQ5mK>ESet3j-^sU$RSoM1^77B;U{jn z69yzW&vj{4!AFTbL&+dSdQ$9}rE9k%KKUj8<8|D zT&Q|GW}dnogo|_Mho^$8G)R>ZsO({A=HgJ##!Hb)9J-S z*omN78+18mEa>a(0veU8bl zQc{S3%h9rmWFP>gz)D%-Ml{TxC4Wa#!e#3|(y|Jn(y|tPYIlxVrf{WX1T@RMMwP0A z_2e#Cdq6z%fG0cR8Oq^ZM{=|c$p~dY=z-_Q2$T+#DZoSCRHKS5;U*lBWgC=fMNlT% zVgF`}>cVzHX#u5G44Vt0fH$H7H2#MT=oO$vRTK{zFPQ?nq)Hn&>n+K-1>l%ON9EC) zkv80z!p_3B9tZ0tg*;}JKuAe3rFgSqn}LU1M>K>C7icvS%se9MO=|6F2r|Q9loXYc zfi0ib(E=6iOd!y(RAg&Zd8@Orp`dESXttt_Op_MvIZ@dw$2tqgO_PM=WM+eHCxgMw zv>lRq`<&SjF%2px<**w#RR;Dk>o`%HhMvK|LuRnE1~u8ug8LCFK-&hb6uPe&Da+v@ z<7KB7Iux*$Y|4wXw}s>)xuhX$vNa)3oe$VZwvk)}B^*F<$P*4IrB!4vF2br|ew zrL#uaz(;v6CX(-*cf`6r1`4>PfI2o=mpwWz0*d*GDN0kX0naMbarn<|fh%ka1I6*< z4*vw}uK6J7NbG+{_26aFmujwSyit#UH;sd%XqSk~DBAq&rBCNZ_RtUKMoC*Sz!{+$ zPs?0aodRRH#YSB@I*y|KmFk!pZM_*Wy@%+psBkg}T8i~{y|}A!hKv~RXT+*x2gGgi z_6P~HFyD|*kj3(z$_YiH$=j=#cg1H^>m(*n!MYC^XTNpJYkD(r9&Pd0P1k=(liSV34C9OZ*6?3sF51po5cU3xctZe+;lq znm5=cU(12=G33B}5|V{58%Px}%c6HJE0G3S@tnmcS7fJ^XEkOH675_-w5u@}kj!a% z+B*9HCl=YGtO2R4iqWD%3bcX&Ai23=hTY`^AX@agNfhrFLIWWlK<8Ff$yzF=N!1bR zbR`{Bit&qB>q#9<(A7>WwY@`a8T0Q1+AG{o4HG{iDp`A54y%x?9BkKjoQ z=mLvni*qn1H(ZcwFq@7g>#`^rl#;HZ>A6bV%8?IiWjdx1e{_n-jzbu3FMQ!>Xn76UEpt|P~XDRFr5xOEak z22#)hGayJ%J|&4x#X=QFSB%z!en1ax@uv+jgU~kF%W3wQR5|>Lqm!;EF~1T;936~h zBsA($eJiz5m_f43cnqvye)4b;3~ghSJV1Bq*zqvys1o2VLjQv8h2=OVaocPf^G+>+oc8C;sPN+tUUvuO@N z1Nmi2et$+L@G%TMg%s*|dOMB~hsvHQ53EN?jTtpVA_WL$Js$v(w3SVbf~nC(r(HQP z$1%FvqElYMAdF9exwQRVqC^PXqjytqW|!@_hn}`LFd{MTK_SywS`&CG;SBSE8Me`B zJe&$5hY6Qxz`pN90B|@01PQ;qxQ-@2@*I-lnzo$5Q{)|aO_KYh9E(!dj!kxgDsyZox~z8+nTYPHdB#FG zwDY8xtSO|pk#^@kr1injqLBMSb~HX>TCz_t@-!E9QrF0&*TsTwC=~O_bPFtlHi{&7 zhW`7AyKpWV>0sLy+>JSNy|S0}Bbbj>h9il8KedWvo=Q6sO%qVP?~l6k~YI0Aq+2`NBeb1VlWB==H- zRstRTHwhRp!48Gv^5RFB^!vI&dpdHBRTY4^iQ`IuElkbzXvGLxX3?YI?$*3mWqQpL;^<>KIIo^cH1dsdrv zJh}P?uUk3@0o37%5^<)mF)gd+@DzfYlgzG_b%{ab!U0UZeBywk^%Jgk)i839XM=3sW0wU4N+He3 zt=v&~i;N6 zCTsQjZlfG5HJt4iv*vc?qnz$JSrH5wJNh;HSS;8Fs8~KR46=a|K`yvhBG8jgcB(>_ zaaI7qV1)n@n5>=R3S+)vO)-WfVRHLzOV-U@Eq&>w9JF;riwIU$k{7nTbgD$ys4~g6 z=p8Au=^KJQ<0Zp&&T-mx)6vlkgCW#h_7+3cBBnx#W*Cz_o4QGrn`GO3f zpxdO31kO@w0~|;}Hqpp!+SNtMo@5O+<6R7x5lzWg$%!tiNNXlux3U&)PvQQ6GBVz% zQb8N}*bj=nsBY|G!(`52?0lVd>oI^W2RpdPM^nszb}>-1Ap%5mhzbT4J1*{Bom!ZR zwUoOdQZ^OYkXwLd$!SXv-^hJ0>fd$9vIlHTP@YRy6h0uaVyG`BjWg&If~nLc27P56 zO-exGq9UAA?qPBo$>xV-qp(e7za?KiS0M#%6CXE_A%|nUBEgWlQ5ilo4HSoq(@^CU zh>0P^6tDZFq>yl~HxKUL0a@$&*5;c`V#cHsC?n{cZ~_DKSkdA#q9~y0xO5cPrBLi3 zhdU+m$q`ah@MQauq#?zehLU(`tCFJ5dSD3wt_-(Ok#WJ&Yn7QeyCWZl#?UTUY061n zWnJgdJr47fb~DR33_NMDVO#TVF-o>Rh*hvqJ)SBcmJNHVD3C+@@~tODoh$j)F;x07 zgvKE@29GDL22M^^ye7!yV9@hZgd-6v6Ge(kX3Vy$3M#P6Vcq0U=!`2~4y^a&k8BLd zSAvqO*ax_c)-db-5BIFeU?Eo!yk#+wrrF}FtW9dNcyJ9nzhEj-k)&2iu&QwnC&Z+T zds4)tKC%&pQY}^CBqXKC&w+rN++{;F6jn$HpR7jr6xyA>-@=dMppf3MsJ@pS3T`!d zf{PDjmp4t`CWv#z<*74uAts5YE@w|`@rJxq<{FhXCL|=btk;7-cxZXrGYTE2TrUAvv?Ose*auy&6osD+43w2(tWm7H z19_eg!+Lih)fSA5RGTbbhaK@;QbGVKR+!l#iCPjyyP>V6L)-wCDjpl%amoM=)MUBM zs3}n4Vuv;rfliJuK%+F^s){$-7&5z~?~$SOXWsS30*4BNmXRvVR|~YRN8(vRLke+j z;B-UxxJV(qRz)Z+aGSU2sepkQhsL`BuOvEnX3^@#IiMfLs7! z-U55HYg#HXah~@&-aVDbL)P9bEM;%jf&!Hda+x((#%tx6!W%k=_4sldQ-+r%>XP|| z*9of7v1kip#!ZiYjOD!d##Z_Kf%S)#+laN~M8U`c(IN3}9um%^u*5 zN-a7V26o@ztPS|7mNt`^2JM32WT>bO9w(eKHjs-2&t_#(kx>%7;9KEIBaL}aJZaPL zw%x*?LHk%MftaIg`W|M$>0p59xP%n`jHOG?n|j=Y@eg+NLE$68?}JrF3J$+rY?_RwWu9uCJ8 zM$zNf$9)z~OWGOCN@(>XT@n;wVobM9(Xob5ow7RRt=}p@JOLHR)Phtn4Hx~OQW^`A z3umJGF@;_cWuTWoatjm`kaOD@^uMstBSHj!3+7{bHJ-J5t)7?|zQgk!6`HR8P}7vN zfOa4LgUDO;_1C5Dvfi|N#X{%Ch7FBKrxB$B(O7Cj-GX*6=D1U8pnyyTvKlL0l0~4+ zMI%Gvn3CneB4iCkjLJ&M{6e@NfK$G=GUmo&p>d((xP;5SV7PcXdIoV75e)OE1_!{l zg0E+00^)eatR^YZ0txAGw~*xm_IH(WUPdX=4kWkYn18OH(-JwqRLVOab@h&!t`*V< zbVI0g^%h}g*l$=!wN+IgqeFdRvVeTIT##WWz6W2>7cPcrxe}&jF$n*WF33P9)|A7M zl7C9iQ(j2VT4sI>+F{YmZ-7iyeK$nB^Z@nIuACREN}jnNa^0= z^ybi!0kI12ZVIvFC5bZL$p);3ggPjHJKp{#8p?J_;T|wbASpxlpaI#~MtbAY8Jjwz zQ)dXtV)j)M(l8>17#Q?+@mY)4%0WtzWs<3MiBjbQ7;P7hC?IB1##5s-mlDxa+GalX zA(BJE1J8ivjHAoYyptGl1CTX7cw&G(kY39Q7V-)REah;$)Z)Ydyq zVOhptw!Lgxw5^<=4&A@{R9kp+#Ws*BeQSL#N=skqT>u_|I#-xDVe0D=S(1QzzbElL->By3Ecm%&OFZYg*8KZWEAWQn_vKmoWS;T1ZmwSvXQCDJp-Lgl~d zl6Xqg1lxoDBGcEnJY-xYp9HoEuhIyAjEl+mFfF@P>=CEMI&tjrOysanvF(D>bp{*Mc1H>Kp!#b_zTU>qqqbQh- zg6qj-tA&p@bkKx_{6!dq7g4D%9hN6a*F}+6H*#~73`D60XI=hddg~(aNK+-8}8KUt=db zxo1^8_K=s^a@x6`(@wMEDp;#R*<)mHX=)N{uP4;04;x&Q-xev55_}Kea^I|M$UUu5 zSyw|C^`%%Ur?YO_B6e#sn5u#jfp)g;k4N<-^#ZB$a%Ej#H=AAJOi2gXRMJ*DJkglc*Vi4WPWOn05#RDBruTuYUbhjNVhbLX(MhJRT*l))JAaNQ}^9l39y2?Bj^a&X`vlU`>h$Yp_I0(gmF_#~2^yEGFmwHdY=T zpZbF}k^{67z8N6b;N`WCPJ`tF5-0mXZQI?Pp}{U29}*>L6n6Zu540SJlH=KiEvrjN z^y9PfnHNv_l+dFp{xKn)yTs6Sbj~Brw2_QDFlQ-ek&*dNOaL!1Gc{&SK!&ZjB9^SU zRSuzMR$NLaB#`ZKP`bM0E}Ze0*`8$`SNao^+@qhr#V~%&Ty8KCFmSN0_p*M8xm)$*6^51M+Lc=$u(NW}{LJq^Gf>l~8yuLI2 z329z2-cBKjpc7#goRJALEtUaBHT?-%f*|(cVp-Hkm2k_#{|+Sp1+l?N3PNfKK!0hAY z8YP)p`cvgq!<&FGL0G(!GFcNqZWyziOP_+eU>VT+RANveFeTxJqoA;&gmdHK6Hc?vB8fGcNT1rq)6w^8dRhk zYd{77b_5;Xh45a;`o5a&*F^A%QGI6^&-y4Ynr9fF$P#d9G1#qEp9{QHi}>^IQHFl3 z+Z?W{dnvkJS1|G|VTY{85euZMbcpHN-(5cD-L0+ILc0A-h1-=xbcB|?*1tsUOY0t0 zy!s$}@#HYH6iuB|v;e%Da-5{_u@pL7Vgpg8Z{M!FO4ozkycvO_YtKo)SUC2TCB`EbaCMcC;+ZQE}F{})C zF^?_f#h_ypZ->%!7o;%lAWNNse1otR=KK%KPz!+X&FwlTB(fQ;`KEGS$ zG^J*x7@6olA3~UMe``M5pS_$a7jBw1F%U@#(`vz`qyg2X4wSgHeLvck@zvV*Evr^i z5m4S)k<*k&9hL$;_rp@;JG6sSJW!X)c|=0~S;OSilAWPM1tsC;!7=qDgsGfb$Tc-! zCEkjQ^D{8IEO@0oCk;b%Twq+`0S_C_~v929=y z)wUZ4#RHePns3WdM2d+XUcdNrx#|iX^%(xD8CB?NKVTckn2vGtS*sn4(;^wC$wLdX zMiloL5w-`9ca4NCFO`KS+Ic#e1_kUbfmn>@GN_UQUy+{aYC8R-*Q0@e039Dfj59Au zzEXBp7Pu)xUI~~mBi|s4o=pa;3Muy$8N+SLkHI_lY=>arwDXiDktFA<@KJ>2cnK{J z-zfB<;6up{1SJrG11FhPRld4eldVyvyNhDF3P2DMu6j(yG>kA-IA;PK48kpbbe*3f zN6@wRJRFP&Z`AnB<*OQmGFe`zS>nUl9)U#Z}9ZL%j~ zv9b(CSvM=|c%l33+^VwHvFo;KL~(x9{b?4lNmDAz85?moM7PJ5rV|r~=ZxK5)t=4$ zFBXxep0El8pev}^gU+oKGH(WBZ2IS{bHzh&Qx9|Id*>`@m_w`<`oEPZ?FXC8KC*a4 zWlTfI!`bE?-oPEA$XU55W++yB`zRhJwlG#v#@aiGEz`Tb$$(|RMLI4>4XXk2;k+fE zQ)wjzBbOW$m?DR`F&)&etaHJk9?VgOX}(h0$mS)`R$xk;>}ATE0YmU_&xW#40Ad-l zHTn_#LJ`pn-!)X5V-Cx%=qfUxiCT1h6rL_Oli#;g_jK=LB*kGnlGzObLH#-%7fqa~y)r$F|v>hW{5@Z+!6o zlE9QziTZPvG#8bq!Qs-yE1{Dp2rNf*k_~R)#Qys1Y@2-GV8m03a1XyZMJZ>=;Wjfp zQ~Wrx@M^oXnf$3RR5g_ZZTliQ95?H;#u7 zU5H{UM$(S;GlU}36+UJl$XhmV7;^*R6gr!X(PUy8&ND4;tK5FqNFs$+1k9iswAU=` z1k33;h>`sfA9X|yab3Ea7+|mjIo(jiN$?fN;29TE*s3f7D@w8;(b6&$ti=EY)fRP_Gu=y$!Tp_NTi@5O-Sk?>Wd_G(C~~J zDo})u0acC+gWg~=bP6A`yrvyPagQtnElC1=8)KF%%aiFS0gzBJ^^hT*E@uWGLnM!_ zvc_7po8UU)oqB?iVpf894~Ue}zbEEB>=xo2)v!N=q9iE6v4E=tfgYoM@uD~_tO@ao z4rD`%32b(SKun+Cy;|w1Zh6qdCT-cV+ljoqZvau;EzyIUY?lJ>V}fTBo*!~b3h-B-3&6f$u4)&i#)S|g zM$aK1HqR5O2{WWg6Uj(!fa7Yp6(*Z1e2W7|N`G=qPa1uKAs0b)j?ok2B5+jaI zKa|_3O;dOF>iFd7!|AKH$CKmx>ko_D#b&u#u5Q*dJ~{flxY@j3++1ufXKL#m)m<3P z7rT-D|Nj8y6&}+7{{R3ViwFb&00000{{{d;LjnLtNv(Zb(_Oc5?2=?xrYb*vdUc~4*tf%vGAoVEB*IeZ#4#MNQa6J^(i&_@2TBtaMs`sq22J0r{?LuH-Gak_1Tgx z0bRmVP8d7U-#KeY2Zs*sso=jCcdI#ALppeL@YbO@Z;j0(v_p5Z!5t!AH1?;C$$3Y! zD=sfhd0EVZCKvJJNU!OVHRLfFkI7FJ^Q(b=-P~+(7d)pw1*~VNwA9TS&zq>nBYb{J zm|e=ZT$(jxgoF{2&7q}a4eH=&2KmV+ys2;ThL5$hc;ThNui~k5#$wXT6zq~)scp9YM+h%`_q}8nUi|!v zcg4k8Uc7zr`bG80g?p(lzIpxKcQ0PQd6izi{@p8gciq2y{q?JqUjEY$zr6qBw?F*! zf4}?Nf4=(6-&=I=|EF^=-~9Q%kL%C5is-FL6T zy@&ep?VDFQ+*5n`_K)v={{@X){oQB$+jrl8{`nVwdga@_#Fzj3+rRzv%Dw#Zr~mWw z`}hA!qrdsf`+xhlSD(>@oNF(C|HoGaO=`GT_@_P`6AmxGe)ER@>(`&Ze&t_&^Y#_J z`_1>4-~8dbFTeltPhY(I{@d4Ie*KRA<%^ep{QQ+qckf?*`~HW2{pK&f%yB|4FTeZ4 zx76xAz5LT3zx(PB)VJJwd-3|1+j7|m!l}& zcz-e78p@b%%2(5MWlT3{mk9KXRZ)j_b7Ewm6F|*WE=FoRAB<%4u_IeIN0xxP$*Fhu zOox>IeVqLe2#IbX7HZ+_2L@yGOZ3_}SP2K1dd5u0@D}NrG2u7K<=rA&Je1!MUFg_$ zynE+2!yf3gL+O2W@<0n;l~F_pG!j2JKBQl!VC70~Lz zpsI#OP*v#>^jfb8t8(>)5F|Ylsp$Mxe*h^44}quT9pK5`tBZiAMDyzgPXse*15f>4 z`$KpN?jbz6BRX~3Y!A?hesVx3m+C;L7K@=%yXWu;(8&XxXw&dDBf`&s2H*ExSUxJZ z6usQKDcfPd%^tc4I&&vL(DBYtPA|^Bxi~vvfURo! zq2L`u?7KHB`a;|X7nF4Ye$qc4e$*k!2*Q!DmdDkSk4reZ6qzt?pT55bvfMSjn^5J` z3s1{@2SQ~$iB>!3fPtt%cmp8b?J(UJB5woyViFt*zD8FFhhoY;me60kdGY4W>lZ+8 z=kKvR8;o2zg3)IMchMp-rRD{aNZ4VCsohhUkd*H<`WBMH6(nJd{1}l){5n7q{of@b z^*c#m-+n`VZ{g*)|NQFB>pebw7Voa&h5P`i+6k_{|5kyD-ghfSefjlwUwr%hmw)*B z{`KGf^V|1-egEr^zyA1_pMH7g?_d1={ZGGs_5P=S|MfrKg**Q4hhM+=ufP8A(=XKF z9X(s|?RVd;_!b!8j_CG5QC<-s7D2Ymg1R&|`h@ImyLm_Jd1HJ)OJqU5V44t2aB}JI z>TGSs&^IY%HqLcbz1*q69TMIoC6%`5*a#?SbE9kOC?Xk1L#Db27%5|hImg+$QhM8L zo$Iu%S>t({^@lqgl=oW{oS4u1m(M<^GTs zqZZ^)04S+~-qF=r`L@;8b`+K#Bd~gD4b&oRqFdzWUz)3lzWJLM-@hRIN`xlP04ob% zd7m!yycpxDo=3l-^DTfyVlx1Xl){`Cu;QHr6a}p0?=CEW6+C1r2CR4nSTV#$fJMv1 zfaO=fYPaAo5v$zei3~-cKHw?&wrF@Q{Z<)@{{5RTKi|kwe8jM??{XKB98}oWLG7kO zvq>Fwbfe2Xv&kmW{Tx&+5K{@EjdX&Q#52NVlG02RP<3t{t7RFhxbonUiO(K&qx)yk zk;0ASyr#e4d_qS$oRpe!=%kc`x;y#kJa_fN^| zXpv+i7H>R_tc#2DSf1MGgHOO`n)EpnX;i?{P7t#Ad6DD(19a%!7v12UzHxAk@(e=caRG^pkyA@s+CNWyk!lde-yXAJ0n0&9?{gB2g{ledz z%Eh!^G&;14e)8TPx7IB~Cy#u^)FGqAO7~V^87=e>=(7Rud~Ch>JKaMHcx?b)3ul1m z?%ufnKg@qqqMbVx$;O|jHy3cT?__w@e=AXtY;65S*^we z>dJ41x&d*leenl_-ooNa32aA!bt17H#jFvT?`Ya6xVK1H=-9a#T4aaDlS9!hQ24U; ztUt1ChQB%Kqap(3JoglxX8K>nb`G%V0wZbQI>mdvva6Syx>mM3k;vCi5MZcSW0S`o zkDxScPJI9p<1@ct?R_^rp%BGN>wP)y1 zZM_>-s_3w~o>wL@nC;c%5;jT$1 zrb>rth~ffJu&L=NrvI{LUtn=`EDqBLNX1@kZwHGkaFTe2H8T4g9vAAeMj}dLjglXT z)m!u))~!JLqRalp>({Wwch~8h8eoN?Qj*Mc4p{Z5QTjV6tgL_uYE{uFGXY8mYQ>DR zuc*}`2}3Jtm3z3p#WNCa472WKt2uuD#aCba7RB-P z+mBQnP3^n%m_g8pW$uf_J8ZNzE}jRfeKYj<=K+?;P|De^MRj{&$BjV z94sNNnyF|54y3hR!gB@d_$a8mk#%)#$~YT1z`_MLTcZ2IcZf|v3SnR$+ib{#@Y;kT z4Y<~T5d7Msb+&wrlx}IBf6nNZmOKjkFBM%rdP2>4X`XdDTVoGYhR_$qEXm?!Tv`HN zDQ2ME&%gLoTOs7jFWy4l%C+4|v3VYNeU{BobdIww6Cr0|78NuM;TwREvegY%?W_LE&V2WK<(V1d4 ztPy2nji8IMnpUYNYKL1M0$7e=e^axa7UC1%)bziy_caDS*tA@%(qxkB>{3)2Y8X#C z8%Y{9de{x}V8S|;rXEJNhd0PG?&^+)&uhF>%I17fAKJ#WRVzV-EzTa)BTE)MQ0!(v z9Pk~_PH6Te21L@~7@oOvWaL|Rq_I@m$Nwc?0sz0X2{slV8fd`C{ z1@m6$0cgd!pu=a^)r08y6Lz%fVbwSHALQSpvp4zj!FnDyTbi3q7b{{D#CE(gNG$Ch7tN6Vt*t0k?=C+?samd4ihwf?m%*7kF+Xr8_OoDz*oUlD;?xiO z-Sy^{Io z0&Q?uQ(>|o5Q<|rUJJhqNolYvlJMOl zx02f1v*%IiV-|iLQs(gYq+qwqEt5{S%A+ec-<)g#G($Q6Y%u!|p&89G^vCRy?~uuY zt8_gj63O1Yh^@NkYmWqC^$glb*jH!^PL1^^ffNL7VKvt04@qR+1KV;(5a@~Cm``H6 zXsf1c$7DR!8+}q~EVnQ%Uo`wDK(&KHQ@!10K3tySX-Y`_9IeD$k@b8A^P8P0V`idA z`BG&QSKgRdJ3V$d;6*^0_PQ_TxY|J!bT zr@o)#3t#4@bjB&WY!{8?38$k?pW5yaL8%X>0>xt8Ft@adj8(1zylAbLi|b<27j^aG z!eCcvG`tNe7{|oX8uSiX0`5qU5~mDe6xdVKPDR?)xB$R3#JDs;YF9&}tUx1Kg2d>641F_8&_#*&SXXc>WdXNn zL1IU_?HMM07uP7U2ykQP))lk`TvtbED?O^BnO2F-=TG2>g#V4U66p?dlU3fAwAbmv z>`|I_KQ^{)lg=r9X+I&VyJc>|8`sJjD9*0=r_4LKvAeQ0c)x(o{$+5FBv`)06=D%!&-{a&GfOx~)-h>`)L_EDv1RQJHD&Ic9{K zAA~@NQOVquI}r<(d5(4xG_+gj5&|6yPkN={o6eIeZ}Q+{|9P6~_5~3tj=Ln6nom+Ss^Pv*ee- zKFb>5=NEx3uiY-8(Bl%ZM3IJvw(Ex~29}hIVjyYtZ#nABHBS&YqcF;d!ieQuvWxyC zPB!i`i&AQvIN1`0jZNZY+r8CQbM5zV8M;qn&|&?!$o+=^NT5bK>Cw_guR2s#XF+Gd z-+TEKkr)BtI-CL~;h6Zcw^-oy#@UTk!wL}URgn7<+?E@yBV;g6M>MDtofmW%{j1f&P7}jL* zA(cQ4TkB!@J6}kFDOz^dpneiawbEGoq&q7Ve{YLNzzIy1t6;HwjJ;S>i(KB|Qw{J; z8a|b~Tm6=y-E(aD@ zqiw+U-b%QG#taq2c=0`lroxGDWBDiXXUC2p zNLJGlHx}WgBj8@}f+MQ}9Un2>h9%mJ5DFkg&`M{9@6FU2Hgja^zZUaqnq zf|i7Yl^fsbkX5*~Tq7BmLy+ZQoQ<$)M`_K$G-SWDjPnZHKObCM*~nST9bR9)XfRgd zRLUqV1$T&2{M99Njz1!#$H+kAEv`&~Ce6H!C-xNAvMw8agQoD7IG>6@KClriw6d&P z!FLylUF6$>R*}}~Xmr3!vF&qUV_R#NGulD_%oMMHeb-G`}f4j7|F2aJ)7 zw3D_fiD5?^3)P#h>D9H#DclY2F$1zl;!9tFtiS?)DQI~lM?H$a2!dgxuP%l(q@=K1 z)$Tn%M6AVTmhbf+RV-OffSB-veMTRf1DI}>9bDK=NM{&nB^>ZcIzW-g zSewGeFF2%)MSm6Pad>dCvCS|zTyJ#O1z%s>{}?{M8wnG>mN(f|c}(d^9T^w8%%NO=O_8 z02txG%cY)h56_rf{3i^9-25a)H(9V%QsDTuna&tV$jRr+#T~F*)`5ZTi3PHoI2mtd zYm}r6b`n7OW?NIbi6d5BzmOj@j8a}e1N}K{;$j98WRDqGRLG2;AGrydQec52tZY7s zVUHEpr;!<=ADxFdENTy9QETNz9bixkWZ<8Fi2)|oM0(fvZ(k(R$9lWdv=t5d00Vbn zRBx@H1(f=Y>eWM6r(rmTWc7G&D z4{Q2J17tI2MiSyalQD0ys4-oOIC@SOWg6(KZH69HEZp!xXyeDM%ed~X3rjcDC7E0! zB7?**w3~!^M`Q?^hd+z<7%&}<+bTnKiR_bzUJZCKh9zhuV!-Q8Ozb2QaBI#=1AsS_ zQKWK|nMbL~Gn>3=!s=Q+W}Tn$pfQSe$t>g+P!6@-r#J~AHOJk?X=^vsh@>sg_@)Xy zq&hYZVDBWFk>bkG6Mar=y5Mlt5xiZv>e`vGQ88_lgD8V5QZVxMq(Em!+rIwXYaM)e3moNp9cJlpLC9A>mhp;>IoE6rE}f+? zTZsC?*3c2b^$8*el0@&8A(CfjIt$CI)#<$pa}S3%ar`k7a+weTzvR^1GPmkgj3Zkb z%mua4+Bjg5V_Fb>lgwX(D~_O!Hls-Tq8+9XpPFYwPCU3r+SBSDX}3PjquH@S*@x1Z zb7M6Ues6wR3qrCuYoP1&kM+RONIR%n6sM-|In$?gsJ2a4;xyiBDJxaN*85nu!chju zrpaCMzAaQq69ztNX3zKn-GWSc{`oWve9aB^Ysjs+@Tx#Y=g?7zFBWcl+!nr?k`)hO z`5M=l>39Wc+3atwYFZ4gaHc+o-(U+ zRb`l?1up#qYp8Y+jzE$F49*xh&Zql*XeV_L#0jrKbqi^M zDGg7&h`<08{3o2C|t*vQCOnmu7@_vDJDq^o+00XF4#)F)N`tw2%0rnw;r30vfG> z-^V8~H>lk|wcmO>_23hp2n`p!U^CfJ6GgY|rVYNe$&kAeOqR?9qfdjaD-N-$XCESf zsQDfUeS`xmv_yK_vtcNo!4M5LV5s#b+FdPT3itOo2}FAZo=h03V8(hFWd0C_z=d!y zg+C55XR3z-4Ar8Mn7Ox4&2N0nW6`7-xh2j{<&wt*p&(y}kDmnxZv*EpqkebUI=Co{ zMg2~8-GiY#R0|A`{vtJuO{o&B#|HIqdSzZt4W2pr$A`K>L>sIz4_}mH6Z*%k$C_yi zZLpqZFO8&_q}}4=Kh~5x{hmU4!U5;GU#)E%c|;rjlw$<{@D4z7C7EJ}0aLetD_{$mKEEeFVI#Z$>8B+w8E)JQ+;&*fVPciI3K`eE{FuR@fzD2PcAt=!{ei|Ovbx8NUB zBKt>~%p|52F_s-k7d%~550Ym{{yXLb7Rw1N&Ty^%1FU{)D)Y+GkA%^vf_^*A2i|Pl zf(TxdpH!^L8?h$S9rq#eo{y#pAx(6(TH zPg`qfzlDQ&3K9V#M`lc*I#B3jTmNXm(^~{uC>tbm@N{kYLTNUZU1BB_){RhDHF05; zo?2Q3EP}q?57b*bU6oU*j!D!k>{ey=VS+Aysuf=DuHBxGOdP_mhYPli_ykgh6YYP5 zTsGPeF^e!pyQ1Gyd?tbsfSnlJ`#vz76fYLZTyDpd=A1FehNSOdV7QBqa+>Q^;HBf7 z=4(4whS~p^{MR%fyO53NeW;33tLEy5c~ zjdmDgL*hc3U$q<5LVO-{(Wq(;ZGyYfiykz&*bUaUY*5{AhyVs+)r~8ty0z}aMkZO* zL$?x8jQ3_*8{^AN%X=F!-nN7bv^sA>(nhO;7fejhq=>r%3C(Q5-d>PN!4@So@-lt`C?$2j#A0u}dq&&myUYM`YDMHqj#~7eu&T!+>fzr4nKkrY~KL#8${`Q0ht<{U|yg8x=cefr4& z9j1H=Dtlf^V{hls+ zt02kDtVnrItOLeuu^LU-UaJfW%*h|f5qd;v)lS&mlUF^kw7jIS_^o~G_y7FW_g}vL>Z>ol`tr@Ye~jv#`PF1Q zD_=IBF}iW}PyA!Z*scwokaa{qNqRY7N0MX4D544IAEU?#Y#lxfOGku?P*$QWIeJAW zB4UsJF}O=nc?&)&P`J_AU9C8Rqw5SB0wLs&CW%!EiO)QNPNK#VE7kb-kYAKuoQv%Q z{iCE2_ftq-!HbcK2C}1xtb(msNzBE{u78Y@9rPPQ9{kVaB(HqILnG6tvt1|$`xF0o z5@#X!3RnqqO#cv8Li?L=)$1CF0bc(QTYO5lT(~Mjrim24%9D1Q$5xPYZ+{vHz>LX0 zw#;f1TO>cthm5imP|Tbz1+-F{wf>2JjC~qP8O$Ak-{@DSo0}$L4_5nO%32yqBMK)v zE`$WqQS8rZL^BXBp?R})KyI`DMkK6Y8k4&>4zVxDwQ-2n0M`bIi7m2@PC|DlMVe#~ zJZ~*g&~IIK+?b+7!G#LaeNs$FBZV3>sL4C>N;6?PHej3CHpAzTWvQF5Ty5hv8Vyl2 zB)77&yhV_O;UMg<4Y^>(G!kcb2ioNcdV*`5_8Hli9cn{$DVhd$@al1wJ9;gCz+j<& z>h;GmP>}p}k0tRrFR4Sr5iO%&T{*RLG{A*M*DA4wpNmvJ0M&xb^~J+MnFvT#vM#dVT|0;>uU zY-9bIo}|w*&cNw~i(uux4H?{~j&4n`C6Iu>^KGZcRp}m?U<>l}u1&C)9&RQ=I^4WD z8SSlKQ?dTxVgsvbfdeaMXcryux_8i?m{#`=Zf2uq2lrsjPsXfcI)GnQWqH1iN z%W4k*Iq-}%7@-mRL4{clAJhr}Sd_PJi$1ncPWvQw{h*VCbVg6CWd<+4)+5vRzLQyl z{h$u-B@Il9biIY44bb2yk6ANmPWQM3Fpq*K$@TN(iR8|bKao&5QoVLb?3=U+U$@Sn z5MV*Lw50}LA6D;;Su(xos(vQV28s0Hgc=e9smUU&L_@!sd;3h{$62w`La1+u4|JQ< zG>~+bzxN{%(a*S)-3YW1q=#9$My{gX!yL3Fv|{jsj*}D+A9$nN6p{lva)J~zUCB>Y z-!WXrm-87(=}#V+nIf6-{(ATN-CO9_JXhS|VKaFxM@1WyLEvVED^I2_Ec>jKU#vir zHMAUUX3x3dF-2}~&$4;Jz$_KoalvU>W+P_R+oqINq=8JaVtJ&1@DM?dvtDGt`-{jz zIE{B8VPHwi&QF|Y&vQXQ9)mMvX18>TNVk>8h;T|zOUvJa8luD<40 z#Av1G&RsqJv6Z4o^iA6qHn}bg&=A&l^zp=OJ|4H0WBMc^fEvfOF73BiSmI&E~MqsVsRR+)5bz`B3~cWO8zERGb+N%vCNJWa0WVso}y%0 zz`~k)tE9)hA-RdACOVAYe*g0iKmE&pyr<*W`@Oke|I*=KepbM8JWB?Pd866IG>Vxx zrrUqpHl-b0sopS5D<*I&GSy+Dl+90 zp{n|%nw>L05S|eNKjRv_#u$uYzx(mezrO$Z{l9+s)9XL~`5}_2ti7oK4L7KT_?z7C zH?p?3YOBjA8`>#wtr#?zer46DlRRjtjlD@cTAVqYLcaIy>U5;IB~2$E0)P7;r)r!i zM&d)Ck+_i1F<)UT(T`C8Kg!Z_73~A?=ILCd%|-GyIP=o5gB7F zThU5_ANq)1ozRPBLNKxN0MYFW{0i+5>3r(Ku9`STKnv(`MQ_*QUw?6}+s}g$n_*T|98w z8X6&-JY9H$#*aHo9g%Y`qS#j89V4Q#22yJrde%5O7{6R zHq=#^659o%fmh*b9Ry-EM@i?TRYHC`DIU+Z=|IGASD|v*UIvZo zK&*z~{s$_OmzqSmgW=}{u<9XJZp5GX+jaIqJFQ3rF=a%ZR4e%yKTVzOJhG#srk*ox zFEhF`$!Ko#HY5c`c)xvz497gu8uO1w79XbY`pzl*-BJ1FtHvi@Eg*SQHrr>Y8vL!FM;3 zax&R*>t-7Lz8H1aPKCwg`Jks#mQ9 z_76WY%rd80R?;jo!(T0C)(JA(t|bT<-5OX$Byhk`X_uDmx%kJ^NE}G!DcW^gitBQe z{UJ_Y(>f$~qXQ1kdEVDJG`y^35A5ne70$AI(nuA{1>JQ++(#1QKFd}X`*t9U%NBB& z%pbd}c5?NWm$`4?n-g%<&Bfx`D8)ca!0B74lLV7Bn)YONQl!fv2mA#B@XTC6t(BI# z7w>=Wghh1h9!qb{V)4!$aOI?eH`FeT9FED-vHUT?G_?^KFtx7mFvHYmre947k$Y#w zyYn#&0CA3^((M^vba2HAu}zIDkRVw;t%Np2@uVr`Ze${7zZzB-OK4(&zQF;)Y(KLS z#*QSIw+O@#p#fe>=&ts3^L4|XzT@=@te&)C3uk+&g{u!~j@@4tOu!Uu`+)wuNh>E2 zvrf($P3|9~L|KMH|1+1I8e+=kGKYi^%ig-rM{H&?0Co44BQ}J=aumDB#5u2yxdbt8 zTnl`zXgS&S=>6UdVoPDa`dm1-!B@Jb5(1XqlFXK9f^;xVWE&D2NSUuBwyTU$x`Z_c zK05Kjg}?;S1WMVjIq+%q!ewMWJQCPqWPzr13$*5s%HEztDy6EV(R4#A zY!L!}5iu*M3>Q17c1hC+uIr|>OxB)VHZ-Ky zB#ERn{TV`YEMyn$nX#NFc5$Ul3ujtt&z)1}KAQh^uZyhRU9aao@vwykzW~qvB2|8= z%$e3;;^V~1+>c%NW0K--5TT{85$~p_zicAy3W*kx!z)y#(`S)`EvIg1qG z3sVcNeaCtq9;Cr@g2ST_%m!80w9v4DHdLX0z?RkyWrjXWDAKps%}UrX4gKaS9=jMQ zbrtLPOuB_4Mx`*ECv2?df(oENkWvvjT7u84)jW~{EHg<; zI?p(6Ol71Vw9aA5qzP1Hu$p;(jJC7v&>kJJ{$}L`Ij-^e3s#3ZRACOZVwZP?2Q7-d z-X=U;bXCK1mP#~CR$~N=v*g$|yk5_6F|kawK}*a)rjw+Sb0R}G)xL79Jb6_5-5_3D+6p2OIISV-t4!$| z`Z$T`vO@#P5zx}0qQL&JcoNklqKd@AxCyuz72VsCRFYYj;zx{@^(Hs5w&#&GvtOa_L{PMf+znvv=UA$uP|J#3l`~I)*fBo^-AOG^x zFYo;Qi@(4B>DRB`|Mc&_{s;XV{_clgzxc1e{_xW;)ZyKm=h6Ic;1FNe&6+;r+wzxq z_x9b}H%#2l8(tgZCkPevXFu?ew^(x=jq!u_)Bu^sAHcZ5-e_%%9|Y!;rn7kb$w(}7 z)?k1X&)j&U$}YWh^5fc|4pU!kjGv%RML7EbX_}H}qmA){B4Jm@A0Uy3wIOZj8`Tl) zezIz@XB;^`u!XNyq#1^jNTzc;5h2RKqKlf7QxK1H;MFLr1c9v9 zNjjor_}5*w=_rU^8rkbT?%C(-kWYt`4``J458Bi?f>$yhqN>;{*^HqF`oOhvrD_wD zzp$UPxVFu29d2!s1E?RcY~&_LWFfCEBla;4LhHl{i!em=SC7WL{i*S+*$xh$efrR3oq=H%GDEd%MU{M56r~$r?mI z4up4w{SqvvnV48dMW|T=s$7QNv(@iWeM_lP$GWlKCp^Af2%Dktk0e4!-Sk!@}g{Oqj*q#+@S{0EfS9+1gQS=1wrKfv%F1hY! z)k>ut;HDUf(I6s8{y|D~ZQI~el05QdN;Fsdeq3@cx1*1Np!S;WJ44brdPcpKn~Q#- zAql^^-uGD^qH+e9HDj7RV9kj8T;pk$F%Ajjms$dUrYS9BmJfInUiz%rw&BpFNFKYUk7NU*}*ByRj%_5v+U!Hm%xS&6@0*jS-QUM5l z%6)4lr$f(8TmnbZm@i^p;CnNcgmYM+!?Wjk*0D4GA_2IcIB^!5k!r7#`d;?^z(PL% zRV-~sjfPu~?Dc?fB6SmRyxXT(Y}UplO(}3?Pl5Sh7w^0$^T|OtP5Dz>_}_WY)U@Z! zs5tGJ2Inx=yA(yojwFkpe+i-G(i_L=`{-z4?j=2+Fd|?3DY611sFg-NmvRKg)^^Nt z8POvTfYCq5(EiL{N6Xbm=os()jI4K(G=;bpb%~$C0lUwU@lC!cBxd))GA$hCW|3uG zBFpr!iE}m=RD^@uD{t77SWju=&`SNMcIyuqu*1xjF{T0I8t$fg$PL`x3GV3bwl|!X zX;VTNJ9ZFor-r~)| zbs>~EQgE;i@q%VM@M+b-Qro+E+u(*n>4zt&RO9CpuPEJY*KFQ#$EeJ~Z-zbqk3ew0 z<~xq<+aKP{-0Q&Ro}v-br7YwUguJPF#E*nldPO-Gj`=Of zxp{7yBnJVL-nLKd4&g%Pn}0P@7g*#ggka&AD@jO}R*^4)nBrQ`eiw|IeUsb@=E zsDx!Z*32pyN5`_AoHr#f=HeRuR^x~AA}_+p#SxQv0%9@@v>jaV=tnP653*3>!V zO&&fIs&)@&Y!9r=9~X=1z_C`|+wtuk0!RioOcZ-H9cj06ZO0Lr8rWVPj>=iMP|k!2 zc7&%s;)nF%p4RLlW@oqv{eny*r7bg^opwfR8<$c6jiiL-h?1Ip?LkDi%1J)6S%PX$ zGybc`-)yozQO?HBRJSng&anY!*0Agp^)TyB;*9(?Q|_2Gcl>1>zqA`cHi=5gv{CGA zl&dasFBHzdJ3e!;x|mi3yy#=|<$m?jNe@83oO&Kp&sSrVF-Ger%W_OC+)mxB*EjIn zAeRqH?Kmb(KFIMK^eRy@nqDX)4m+555&dX@X0I85?{n z&zZ2E;SB!ICoij_bg?RdH0NBB{IcI(71e| zA`0z^lyFYlHOkEdssQh_BL`bUJqTG?1HyB^#pp2R6#2@gImJnEzp~3+> z<{M55lu2 zxVGpr-n978q}%e*Xc17ue0a6%8JT5ICL;8O%rf*(Sgnz%5$AD;;6dG4+3HAik@~{b zFO-DCr?9E`nCj|-S&P@7KV}?(s7D}4hd66-uazQDik4|hz=xdt`53HLV2tT<()~Ru zPbMuipNz-RysBNcbst);V9xWGZOmnp;F9T~mL`Pkm4ZYO$!C_l{|IG>Z}tgC9l0rB z4`7suOpOasTxwVZV*%N|ebB<)F&_9Q&nLBk;*sEz#2%ih*S>C4+vKA(gurgSR8qv& zoKOhV-gBDhV+NdM@Sp76Kb!QDT9*XI{nwOSEL6UpCgM$ja!X#Ju_Dwny(L?mP4&Atn++{Ok0aQ7pijTo4}{sc!HVFHS#=%}JV#*% z1VM^D2MYVo;_!c&1F8Cj{J;%k#ivTGJC<=4A7fzR*L@r==b17y0zP_AYi+!XXa-Rf z%(AzZqFBpjMXoKl^Co?u*M3rbgLlwWAM)ZJPRh8M#z0CZkXBmOT^ftCavW?qF@fMP zbvK|4oB}f?cVCgii+q52sgdE#l3grEHMsLs;U$$d0R_^DTSTbv@EjwS;@E4hcnPVtz1>W##UDL4(oOTH{Qdq(I&%W9;T zTSYCwQMA@K>#L#`6D%^<9-q`6MhJpy6WCQIc44K{rLiS~!tMd-CHz&>6P|ywCw%2b zK=pdk)ccb3i!j$Tl=|)De2o3?y#p6ysr&Fw=^3V(_r>#b-qP3%+6mrK3{w8_2rNQ!Y z^ueqhIZpubX_2c!3zl)}YUS{|s%fzN*9j3YY~V=7!mv&D4U(8k>P`qU^lD)#=obe0 z1TQfubDc9>`<}loZs={IA3-WSHw38MvStNKMF*0vg!ogmrn5&%nm3YcMO51hBWweQ zaK-+xNaAA;_N6*lJE;$XcG&+`E z_l<(!Dn7i>##^U$viqFC+QIfW*_N!d^AhHJtAj;qvUH)FCQdLr@1hW6bjLJZ4P($Ji$jkb)^nM}ZwPS{{#q|ZvqYxcLTdaLxxVq`$W zkUv&dl*1_9m|Ww%P_^avdgJ7$Rs}K|Z*avf2SCcz%GeK9z|k6%dW2Yo{s+X0o$v_t zJ&+EZQKBF`H^#=(;foi5RdUv(jFz?%R~)Q)5@VBx>NrhRtvoc1yT@e^$_ZpisI%C{ zOFH4o>vf|px|LeIehPb)l`7G++cZKJTHn`K?AtJXgmw7157XCiY8>O#S%h$3*j<8F zgl~5y$gk?t48muv%$wb5tBRorSg^Pc*G>}_B-TW-?E@!-Ud7Ie1r~F!7eogf7RJ_? zh~pX#HWm%BUJtk^?mf+ zF12X9qS?9kGpZ5_MbAwKE7r)bC|c36&OM?^{g_Z?3n+?iP2QLw$s=+2CSqs0G2{U8 zwVCohmdebEQMbtwN_nWVDPaUiY@S6ecUoWqJ&iLhu;c+ur4|Ris7U&zPsqQ0{RZ)W zxxfS87w26bnqavi%u|ooNjgT@#7B26Fk33qM3LH8X0S{zfST2we`aWOKWlhV=ixCj233e@y+`RF3-&IjnB*IHIXbph#t%qs6`4w3nT!V1a$hfwppXZlj+$_vB$iO+9+zXj28Af30)%mYz$A_gU^C~>A zCi7x;T>>F%Ngw7$5;V{J^Xl4c@c}%Bu4zEFH0@z^Si-zxmZge}Y->s{<}MM|n$Brw z4Xdjy%`Pp-D`8nXIWBAHmZpA~FcPzTid=`$&6X@>MxQJnFZ99t$`c7in0ZKXM!{IJ@&6 zKD2`Qeo7EZvZl#rGam$?_bEA9gx(B>3=35kCQ6pli!f}ONj1wgS~tZS`6^`ts}tR7 zF}HBq+CUj5qTr&nFxX_sTBy{y_U;UTR-CgqiI|R0DD;WeRCwq(&O)Oessoe232!5+ zi*Be!BM%%bMP=;6cW>Xlro+aWsmv(KAIj`@*)zqF?@QuD?m~D<$kW+4oXr~8#NZs) zx}HHog#a>K>e*S5Db9qwMLxp%8qSM(s3G1-9Eg%+X9jII3r@>=3KMc1OrsLZ&ErcP zy0DS!Y@G1G)+Zsi%+qf$(Na@bydoyf`J!=k-UBr6)aJbTK8O`&KgJhv<*K5NJrjmp z$(%Y#%3i~cCF0jo%L+hl19ud5t*i%j1U%POp$)teqwr{}0|XmHK)?O`1mI=JVp8)= zI9?ssX+>+P>D4)zChChdq?BOcNe^y|eNWPxNqC(sE5*yfL1lG0II~Vp(tvU) zv^*1ZtAK79R9FXBgFljwn(J{=672j99U;%A{e}_osZ3bj0>jQTOj>g^DT_m+Bgs1;7=b#BfQ@tTxnpLVSBPTyK`ZVpcmyP_hy{-u%Z`r%KM`hcdnzsv zd1?$B;9o?v#1{&{G;v+!Y|LT{;H+<1O@C<2FSn-yPwe$7 zF0r*1t-3ew2~{MU_qef8fsc~SetfdX5$WJz6K+z7*2n3?KPA)W)>4;nDDTB`mqsL8 zGxrW85p0q^rjIJ(@L(v+#W+IIf{$U6S&{J0WLC6?T)fx(+$h*Mgt(I^*vOpp3)mH} zw0|6xR`ZB^)u=STI#)@lZ4aZ;LU~wH(D$^UU7SiZCz~|ky`nopc(0B`e_==Tw`0WW z&(xONr(wi0W8sEDgLXi7v%wwAaTSN-O2S;ZAtMY6ASd(F&#L|@f2(PBUc)Own=N_5 zWf8++s z)XI~RhIG&>7H*Xuq#=r-hvQ_Zm~wTv*)mgv8p{M2k@;*bS+!xB^CM57NZ1NDq=WiV zyZBMXelLy9t4Lx>;ebW{bF-oh4UnMOhSNTg37XEsh&9He2Q}fBT${xa0kb(mu?I7sJJ7*Y$*)2nZ4tk!#eM~qWcd~7 z8uRW~`Q7)(?eGPem5vShmH9drnz1%~4ktf@4_?HG$Q6Vq6W$=UJO7nOIb;4+;5sim zO0)A{x$e}CB+0mQIaGT&S&r*P6k+K6S=3@N0Ol_)&t<>LT`i7>Uxk{>je{u=n~+KJ zdhT*KT@FqXoXe5oFp!Pf$xzGW8x_NqqWYH#39RXIn zdRSrMi=S5Uv^t+w{HP^zwsLi@T-&Z3%Dcsjr)7?(mcSG)*D=ZdQe_g;)2I2w8Qgpi zk?s=w@@{R|8BU%C0z+LAe5hqf%({B=G$)+t{4|GZyeHrHP}-;M5q za}M^=#-5Z^)0o?& zGcd}Z;XY>~t#Xv>~t---ehP zm?s`FeSysGFU zSua_{X!v37wrYwq9-PrI8l7QbVSI&4HhikivzzzrYzMw9r?977Kbx9{v*))$2 z-#Ot9w!*M4B&Q#?vFcDz9?wi1+g!TjIlQnc&7$v$RS{$lpbe}p6Kuv8Z{NOo`}Y3> zMGO>n0RI30ABzYC000000RIL6LPG)oK}hX=Yp)$QcI9WyUzwv5z8^=>2SrwE47mMN z8uLx?q?NQWj%>*4AOp;gpS{*5S*+K&SC)av0F$_{cqJB##bPb)$J%?peEs6}>z6NI zzQB){FWx+P{lummeZ1QGti$6U#SCh)K7hgXQ;n_d__}jbhzW?$4 z|NPZJ)YpHRjz@OK*I&GNZl8Vo`nkEt|3CZon;*V> z^W|S&y?yiji!Z-^E5E#Y_T3lH-L=$b-@p6uuiyUi+wue^=Vw2B^S!iU@z4J9-49=V z^Tl(24e8lme*Ey$kMBRe`Cq@jd;Z0%uU@_R@|&-(U;q8zzJK@YyN^G8{OOnXzrD5B zSO5O*{l~A~z5mybe|u}qFCYH=%ZGQ*{`v1e|N7ylkI%pR;@NNSK0g0<9mzd;{pR-K zi`y69-d=xq`}V8bx8FW7|6p!DUGU>p>&;why;$$k(qfk&&m}*!i?#M*Q;Jhl#|aoG zEaQX{mlnIYc)^cbcJdF|T}myZaWY0uOG~=goAnnN!58#Na;aSJ{nFB5JcjYhFs`_z zrBlIE%Y%-o#5x-65M@C5(Vp4K|B5kFlap~WnS6^}8EcX}-X)~s=e91O#RA$km?`o& zDNoJghj+y;t%Da~f~Jh>pWp`yVP$!l;^ z^Jpl$3}yRJkGkKZw$OOB+!smyA(*9g^7egNTDp$t5`5p#vUu5=srg@=d*ZD3CYt=@ z!*90MR7(t1u~j7HyPl?NYH+a!uvlCNuv`FOP5{gSz+%3J3Bby= z`U$`U5c3&+Jq2o+cn)CZ8iL(pmvY&K*)O8LcWI9E1*~Co5*I_^SX(GT#*`vT+g-<2aD17UH~H>ryc1D z239T~d+BJfJZ2Wdm|4Nh%Cw=PewZ?4o1*K39Rrg-W;91L<1L-(y+Y|vc?wYS54NP< zEo96rKiKUIp#r-4c(xjfQThO(_QB3zN?xLirByq$ny9n!&$}JVbntb#}BhJU3z=!Q;&7-&5`YC{{`X2DGVZ4VE@X`e~ zW4oQ<7q(l@rQ?^avZ(~Wa&dBez7+U!HrE*KRS>u1mmrn^m<3cE;g`r%DZTrz@~?aR zGBq^($|eB6h&>d*yX!>;y>Np%`9FJ(t0J5R~2{TNF4{ zWGiypj%@XsJ_*?dtjRCme)&a%H;Y||?I!=#Ag}H!FU?*uK5=Vg>r~l2>t0@a$w!p2 zvug2|>PIKR1%(E5l2=^0nPf0uVk``b21wfGe6F>pbvNX5%&_U4zl$tlO3 zg+-FV>@>A-lmDtdXsH>3vEi1i_G~A{u@i$?@5Iffh|8uh>rD~;E&9>1U{VpU!B*^^ zyu1jJ0aOgojzB$vwOmtiid@WufK?DMCXwN)9M=@!Vio<+mB&hO_L{9fM8K!znwxOf zU{GLg1%vMD%L0QAa@z!h=9*9CIH^FC5j0xabz6x_8?gbswVaC0u)h*UB&;S85MKeLboZ?>k(QXu{lFD$vpftMjGmwAC zy{q6_mTy>oR+(`Z3i$P9H;p*SaX^(4;w0ZV$O>H|*J5{UG&P~T!$&_u{ma@7oL|w_1ctSrtp+F$s5%2A1p=`gpllbEy zn8mTW7!(le`ZWEeIEYMgRF)j}BG3tjxe%Zqg60EkP=NpN2lm0z!eo8D>TiHj=^3<9iGs!z+`rArOWQFk}H1+T=Xkk zl%p-t8Ykjz+~cB?=TcnEb&&)`6_0-)E@BfUU{iZDcrl&=n}|1ktKl$~9}x1jo9xn1 z0ZJm{M%TYY;31{PHkRNfl~`DAhGs-b=H@$U$?Nx2Dn#?}$!%|F`VHk)(eU`bsPT>6 zcyOE5^j$V>`gL@pjFNA$cNC!dQuQ+h=N4CVmpY8sx0#hh0@1L|hcugNuhw<3-geKAo^ z-Q3@w3ih|;^xYMn;G$3!@3tTUbQFa%al1w@8!&%DmxfqAuD%S>UtQkprF*0FZ>-GF zDCc~)f=?eoUVQ*rq@zB{kTo$%H8lF6RcL(d<4}o;Hw9mJQ5$E(`t>f|kwVd95kd+@ zEZ08eC{QX&WkV+?0su5vycbA-a?(?ox(>sGe3eb1i_GogwuzQL4++jq1X=DU0Eq|1nXURG36ofwpgjSxFJslLHZK6gNhBG*DA ztw{h$l+c%Np1gcwlc_mftA8XW!Bx5!wV)EN)zOp{nWD|~D#-Wk1~L^9ux772^LE|VtFRJ;&Pc2NfjO-E@E%$tj>)TD^KR)Ht0(Wvzhf%bL%?2JKj#`Jn`y^@JYBl zUXBFonP664T6z`4#qJ^6U1e!ly;SF?=GxWTw;42LwE?u&rz~2)qJ?m*0=H%Z+Te?U z=}(Y9g)9QA!0ekRKEWdPNXwtV>5)F0hC&-evRaw@R+3+K*R(SC1(CJRBtLpRtUCu- za9j5H>O>K+r=p*`+Oh@JrvbC2st#loMYzPtog2*`ApiA~o^T=}Ovp_bh%RkJ3JNZ= z({c0%ibFNpWVi7b8nR*LLhREm@?Wf-fvu0`2p=vgAW#G!C>ag}N~OmGH5 zsc3I`xbG(87(uz@a#P=C9p<4fjOL&qnutUhdP#q3k2`rYh8ZSFo(5a(Ionxt&H~GM zYl7=juKWbxDvI{>CAj_)`cqjzi-1ADQ4C&h6o=1Ul`%pu4F^$W(Y+$Jyd~S;k~>+v znucT8xGt|HimL&-c@h+(kS0P_f_&%QRwuZ(G@HALNaV-uhTY8(xdln$t?_w64u-u0r~|Ln4tA?Gg61yr7XBxp$3}{31A1xJ_gHDEO6iuUCWaLEiz$bw zE~Y3*eKBV!2ptNNZ5r_S>^dm<21?O2Z9LN3!6_L4fvk_?N9Ajzy6SK6E27mETuWOO zn0GfQf>=N3`3CQ>9xOqMZ3$%7(-N%pWE*)qIk0Tv?dT_9KLdp_jW^sM0IU#;_aN;+d~!ZnkSHGO7I0US&)fp8boOq}S^WYzq(kzED{J;{ zj`zqT0=;+XyS|>dO`)tpZ1UHV_fRFDLbsTuIuqbN52{W`M3(YUYn?dvM6!iB)`X?i z-?OEHC!0oDLW#za=%-e{@s@cPyjxnE!*Z}?iA&lzdw{+0zH)Xo{V~|N*>4AIkq;r} z*_Nb@z0sio?bJN(1~x?WQ*-Z?Y8=O61CnQiCSuE*Z0B#J1gV$WhBEu;QikFC4 zsXN_Dnof7QYsCSIqmc(*@F2Yv-hQZ(O&8*~4_&CzGvS)~zDodb*ig9=ZOw#nA-~ha%aI-1&vIjON3At@gOmeo*v>y>E`@EYj-JvlQdcl zZ|_(DDOBACQ9!@ z)8+8K1QGlOxnlR=DYXYLTTf?P?5Su(k=?q0m0~6}&5B$RvX`9=-bG4TK1or~<@@~p z&4(Y~|MTD8$ro8gSu-Dhkw2;dh~?%Ti1pYzkbOG9FCR<8FKcPIiq~2dzoPu(z%RHc z?TlZdkHvHRaz2oW5l-+6w*`PXvm#^2o3Ydk-J!UJtJFXh?Ffx}>aQ+4!t(=|^{1bH z{`l_0yT5+<{>9Hf-$yRdb)Z1V_r}-e7U}pk1k-!kgC$CIEnae6U))x}k3lxHn4$YCC09034@L zSzHVVvBwch4$+=_J9h}PojcV$q#n^>|A?@qm8o&@!_)RBg6T$`p@%tvhfme6T&mrw z_>?)ord09P%@*ixuxz8$+TGM9md#1ISS*#k>8LIY)91pCU0Ez?*DT|Ho$Pr3*}CaG z&7uT?4e|&rTE#}4Mj-W5m3Cx=7bp)l%cw&O*oOG1(x<^OgU>lU3w}O(MJy~MWTy)Y z_n)nc0{pijEfg4F4)wUxrQ8HMoklRtDs;i|Xq1EsoiGm*4o-;+Ljis9pS08nJ8MwZNoc1hfH9+1nJb1xU-6 z!_q_jdSq0%sA|r*V_v=;G1`h%qKd3csx;m>e-DbWHKHTBY>KakF&9ta6OYfZpfsa-cDsc60 z>V3Dvg*1fWypp=}C5NpyMtw&J2)Ft{)g8M=ch)dV@N=3>N8M5tXOsl*!Pu>ONskX~ z&{SLmDPkN_5VS@S9a8gnXSJG%Zj#BGk8V5j;~NfBJ%g-dtwk+yJ;2HoT(IMW#+BX% z^&%WD!9t0sEBNcgNHfD9&Bnv#H@mDVDfYgNV`AQJkb0Xuj0uun*nofUl0(rhc}Ob# z6zMOvGu157ZF4~8cDde4w$pN}oq5qK`heE%&mYW=Tn2V1ftyfQGolAf1(Jo1QLuVL zgeroqvHB-3fl)ZS|r#KOc*fbt|kl@o;+bBINMXK zYJ98virR*EwfC8o^>h;tUR647{``Xp0peEV|(#D z)WJh`W30|9ZN0!*SB1*e*%6dP6RQ;Kw)3RB$7jfVG+6cRslxvO*77 z%qm2Aa{Y&ES3lZ3vf7w3Wzd5abAg1N1iceBr#i4i^^9dM6i;bU*=j0dtsGIF+R8w- zZZ8?Z0Fh=tzJM?QXQgH(A2j0;7$6!ty)JSh z_(lJ2hmP+QKdM5_ld6dj_~H{z6wD(Z&jZ9mQAgmjPSo$au`zpmWB&93=%I|1py^GT zK{F9FLlm*i&;~C;fiLAM>-@Q(S;8Y?jJBY;3c& zg!wdJOlz)c$k({U0t6-aj1w%%39VDTr1Ua^sI>ujHZLB?zdsg-;aa?5 zkiS++7(U>%a*R%qD*Oa(k*g|m(+tZGfKk?vepYnkHuMhMY=WY-%RMQa1{ikig<4Ut z2z{ESl{5&|(F#XHQ9<10(m}IbWPdBMAaq)`w!lQ5pS@~aDOg5oY{K30j(--N=>E2m zujHYk+m9jNh>jruvl*k(g(&K?+&&UItyz+e%wq(vV|bA7R%0-ENi1@TIZa#=Q-Q~G z>f)(=gXRc-NvMZiVrpHATX*TZ!N;~6l0DfC(PrHZQDz;|+=X841lx?$yeQ1F zGV}T}&N{0b*Y=G&cTjGiY?uuGF*blGuFS2Xkds{iz30PkIh*Kkj01HX;=hsG>;XY7 zDHP?%ltJZj-pA~6hoY*^NBOAs5*nkv7a%IvdH_w!+RjGYlipWDYCJd-{*up7SSMl;2oJqw^|C88^k0HPQe>>Ue1{}+0_e}&Ubgo=zmrrZ3Ui`sUt8G(@> zezQ*gbTBx-yuh3za1^ex`|rEk@r{ks_hMSAEa$cxA3p2-#z#8Q9xp=OM7BEvg|lfq zA@#bO=097KWSMxB7ACpSRFV`9&feV2&(>PU?H&fZ@iI7$F2Rg^$LXFIj^opCjXv-8 z`=9^mt2bZ1`0A@yUw!%V?I(NScUiKCT6CI@ms_)`fmuuRyU|Je89$BkIBL|7ITQk6QPpMcMuJ9=3Z+nJ9Ku^x*F{ z&v*P5K5I{IciNq;5@XvI+5qR^;P3v>X(=`q=TagQsk%}#lK#RS7c-*A9stG%GH3Z~ zO%GaZWb%rNA^JW08-^Ue&Y4yHy&yWL$(tid+&hUNUfnDageDJs{p$6LtyVJP>l^^H zz-Ye5%a%n!rkqC>1vn<7{d|(rLGBpkrTCFBB_i(N#zX`zZ1aJ{NgEEDL?Fp&@75NR zX)I;RV5||de{jRxG9N4f3J0B1AIavG1t6>}093tUT`hNR*GF>Oj1F-!IcQdgXePtR zBfIG*IV`FC%(7Zir*u3$h;Uv~`X6JO_>Q`yVYchg$`Qg8N0KX9q#l|P){-AEKf?GH zv9ub2laU>fKF4k9ov<@d%Mu3bPS@Gx+SYmGf>8@q=#CJQpy-{2C919rI}hAW&lf*g z)vQ&6v`xc2({k>_kse0WCv`km8LF(`#MVHEp+=gCZjeg-eGQ7H=%A^bFM_vi>OQ%K zd!jTsSY3Pu&)>=>1W77XpJM_!oEB$&d9_m2#>fEdYg%yuHiF(}ne-r%MV* zE5aQy%-|c27U{uc&lqRh0tr_~DoKb8E`cDN)G*1c!Au<~Ul+m{vOA6R z(Sw#$v*2dc0h#G?ivf#FzMTt9c%My`Z?9F-lj*E7AFksWAeEs1U>al8up zF(uOL3-{zfaTg5nb)DRN&hG(f zcj1H0FG~}qC>s>J*p1|P>ySglzGh`}gAHcYk@ZlVYSt26zsQ|nL=#=WbS}GU7~y|v(l4B!G}Xaq7C;6i7p&u4w03*19SN(BqO;Fb2(1l z823k|$K*El8loJhe6RuD8AheUhXOHf7aPdR;D~j0ttyZgrStB)H1}cDUd_!TVmzXrMQCwVOmQ&qJx9$FbMt0GAw)9Td^=A zFe6!NB9Ck`-f4>U+-6!wignABc(dQBAN*<$QaqzNDT}~-byQ%3Wh&yy3uxQv&O1~r zKv6GdL@9|Sx5F-76;DyEn8Fa~q5`86IQJxX`|LovWO_SqoQF$!$-Ly7I~!i1V|Vre ziU!0>&b02@eA?L)MPrrEV4-zK*leaSHg|P*GoH9|FW-6|x!#vZ6cQxmtMhj~+vPxH zbbcg0ktr{!hU4!}!9HWC0g)p2londpL{LD}w#o^(_!>)NW+w)2!Ylx%1?P z%2+n6Y7zGeGBV*~E%Jb6$?lR0F)_h`jD<)_Z33(sLUdj}wbVXg5ey=E#rRZx*?cc8 z=ZYgEoW%)>NX2RP@U~(UkZh37l=LZ+kyvQVt27*-b3EMCeP4@ecp7BiV-FpZv#0HnVCd}L^Td`S%e?r#%y2e=@S!`TCJAqd!M9y^LE%@NghpW|UOHq1=$o z#XxqW><-AGuojgVQ>}A3FxNbV;h3i*Sam?uLE3?h8eH!LtW<}D0+W2`!2UUB>-cmh z!GPR5o)g~Mq8hizXq zD#qX~$KG1qg;?WufYD5zS zSdwG!VY9WftIsnoqk!8d`dOtZ8xJypb+jsYmnQE;9wSlkv9)FqZb56xY>L)N6~Q60 z99INms}8L>F;foSY^!q!5JAvPYvsv%=bK(?1%p|_0=oiNy9w~N86AjU$avXXX&KNp zWVbOED!ACSU}V|pc&*F<>be~!ISoR$W@!#|FSJs^!or(_?qryfueXK~Xr*Out3CVV@Oaa1N3J?m5Q;2gosGLKZ_5yg}THW1f z;(PSOdzEvLmb#omUH}{YW9zGdOSKfO$bWwY#}864x#y`F-_7@A7*4+hr9-{#>{Azu8$#cpX=8CH=FXOU%~sPaog1H%8cXkWBPO5Oy#ltPVPW| z=lHq&neYFruG4auArCBL&Y3Kt|FLNv{2Hg!fS+`gvg&6nIzUBDTScx||6|iU__YOE zfBIEDCZOX5=y#Tj#y{l8^yjMi*nSF03nJZ^loG+1{4xExZfYKn$MoYJmhB%~VlQ$Z z#~+*K!LRvuUe)E|Qj%j~qFPPW?5WA+l+!g%1v5&sZkof)gQylB^RWv&fd4U>I8z!q zRNX!YAza{bos-Aksg-NIxl=pisT+=?O=2DjR;T(t@40u~EO~iyncUzZ{}Comby*;F zDAndb)e4rsK=)u6>CZjG1`(mij-IDD9I5K9wj(RpaAWo~E%e%Ms)sq$`G{TQrz$nZ>)p$}?{19ML7EzXdL(zz}XNyg`4FrN_W_k9#1Ys6_nE1c>s5 zY%H1)QN5{IG>t5ESu)VgA|Cj}Jdwb!VKVvQ=bbc`V(>r#VlFdas2 z8`DdWSuUXAzgUU9s{KvyIHPnwk1jqK%BUqfwGzGG&1I%?uE zA?4(H@Ajqs{+o%nu(D7?wisPuwlSGkc68eyeNgaz&I|2Z@r|5M(jkhzdf>KM*Z(fg zuiZAGg;lE+Q#ANhh1($5caPTdK>hE0jA;}&PTkR@79C*PNN#W3oE-XhW7=_mmq#{* z)VM4~J-^aOD}SS$W&@6WeD8^cz?Qxo&5>YHXt6R}z{w!h@7)nSnZmSR0r+KdZ#Ys}QX3Iu5BgP5 z)ta@2oI^vXv0 z+LD%wsFO23AX?vd2=EhArL<&_oB%?~nau&ss?D=yu(>aTys&v0iV`1f zbK!EP%!OD{$AlOzt^Fn>SBChIvnCe-S%6^=aAMDK-HnOUX6>OsC=(qJNmY}=OHAZ&lh%=>9|RIkmMKZjJcQ-7sS$Wh*$TGCn=KnAJeT1Qz~ z@-0dEBHz+<@3#PZG$^I(L?|>?Q~UUkuckgSqwLdk%_lT)l=bYnslhU2H4tCu3G$&y zf@&0vUd1L~>u0GgKA zMXS#uf_urK*9(HRRO_105dxaordls8)p}xVl6-(E?<$YAyycNaDCN*iOAhrOfiu#+ zb2wx_-z9~8{9H2gt;<}>;2)3rWi1nXWEaFjj4o^M2Cz{{cl@Fe&A2 zj-&C|Oc0O9UZSsB1Xx<7)lX(BmDb-<@8X$9HL28fG8f-69j3BNU)yu$$L842W}Thd zw|Ejw{|pcDa7T^Mw~+{_>ixQ@YkG~VJoi}LvfEM+(nTuGl&wp?k0nEC0tLmLGnT_iV8BnKssVQFyLyUy~>@ z7{%{mvyRhKnAFo#*o_cZSVpk}5CUIjw~Qm_@KlJC>D?`(=7J{2FK$!b!=GxU`C1QB z<#;#9*|kpDV&flCo~VUdGocr}JgndxFB7Ym&J`9ft(TTR7$0HxXZ1&9E3^GXF#xzaIq>7r19BqFN*=vU8GBW9VB=FH1Yfwlokk+2eF_5mOm#0+^ zlHgLrq3fUfG8z8(xwOdka?F^4+(f%y=w*IJi&m#G#|U*DCT1 zPr8taJ#s>?YWf6!uL_w7_c?cNQr^O%ym5=3DsTQ;kCeBZ2LZ)S;b*S?0R|~#YqqEe zVavp!g?6DTQQVn*ayttM14#3{6p3$LG_|pZLFmThYdOp@V)c?*jw@AWKpJrxRAHtZ zSIi3~#|o*qM5t=XVcsNcl7kWguqJFmcB!;yHzP2_HA1pevg?)x3*K|1!IA)N7FDUL zs?N*P4J!lCQ0?F>LKf7789m#A|LeShXgi21ppz#3Qq#y73A!3GkA-i=Jrv zq1ax|ZIt@hR3saW9%#mKQr)$-RB*HeX>F;j#T*ZJjn#!h@-dPoR47nE3nY!C!EEV=!f#8T}s zW!N6nq2AfkV@Ye&L&nwO9Pxj~`$C$FD!W|4ll)eZ9@4dY3%{u>oI?veKF8Q@+RmSwN=0rKMe* zbkQ=NPHTddytLGV)az6A5{fyDhIZ(N_0Hop47Y48?b7n3rv@4=42uozu!0u^)TYr; zCQKtcQ~#jdozi$~sW-1nJz*vFu)&9gS)k{|*C?!9{nF}d1`kG5Bf1vJjZ5ofMf_-J zhvp>c%Qy^C75>`@D; zWlmu$;{JQaukF_IEHdRHaETK42?Ez%(K;=a1G;%>`F8e2L4&d(MO_%RRtF)~t=@7a zfwhgZK77rR1^~sjTH(`Enk)_EP08=D!=mhvYS<77qBKldlg&|Yx|LiY^S*J4hl9)9 zR;42NWUb3g6rLki5ii{G8|=8O-um9BL(gfT|2$5Q3t2N~VWf5q7ES^T*2Anwsa*cC z-krL-r{9JpZ9}X6aT>FKdasi{yCSd$FZ40%vo8p=8AzEKp|EiHRl6awsmsE&%&;u|>Yn^jHHlY|8ZvlKd!+XkzTa`3Ko~YFVd{H}^Bh8)NTC zQV40yC$R{k0n2UAV-fb@S5IZ4c9x;iQjr4^*dGy)aGE`YLHp^D0)D64$+otny^jQA zRNd+x7d>r7BUu@y7W>q&4`=vX$`Wt)n-8Vmb4eC{_HnOgw*OM{7%MI&=%~Cl^UxD) zRt;a0CbeJz#3k5$9Wa4^)7%`4gc!!BO*a%%%;WxX2^xY%UN7*qtNP^0POu1XL-}a7 z2fJf0g=kb7p4g2NzI5q@k)1>SEor$XTNlLNZ6+`8BiN3UXwlDqCYETzbBHh$^Z;V5I+BZ)`BsB8y$jALin?58u zcamAoZc;9lyw)^5JY{pe+PsRkvctZAf_C|yeLtNMP9L)GyMq8zS(XlTrA#sP?vvEb zvjEfnb)>N&_*ExL3+J6;?^FhD&(cJNd<#+I16e)VA~^)p#SMuAhdfSr+vuj=x3F?) zF`T}JExU?*Lf@EGD4a?R7@c~OAlZca^~0)5>P=b9^pS=dL}qhy7CIM_sK}a2DJ_XN zHmQdqBNJ2c(xO3s1>PtwDB%k&;fao3o==PebgH-lMSYfbCHVaagM1>l_&{BC6E`ZB1kXUs|*x zqhVL1FdTFN30U=@!?Y@ypNs>jqc&()pvf>mQVruvH<=^7s!Q!n6jRGeF6(@w6pYiFkS z*R&8(bKMY8QPT2WQf+(Bt|mHc*=0uRI;^|+bEiNAsrI1m?SQ*lChMC0+|)?)O7()I zVQppNE;>kdHRtEhl$xXDST|sk3AL2a1^*$Q-pw_tlBg%$AaR^QsCu9?|Sc;aio=&N?|${DgXUq+!-Sf3%T)<=(7^HTK^7 z7@O|iA`NH7y-w>=!aY+txO#4vJ@arJMXFS6rHqCGjsiq3Xfn4b@O#9!I`IRf;nzEe zg&#G6N@%Q4S^hoyqGsgMT>vYJetTCqi?q4Ld{P7;o#p>PQKou|S00JDcX*W+ymDcQ zXSaU{^J=%5eKYn$^fIR=4Ht*4!qw9(AugEFYbpEP%LkaYd(`X295xTx#vt}AHJkTI zf!&z;lJ0eFN5(grhRG|LtvOCBjRTU&9ieAyAo4-Bj>YPXGQu0m5kvkRW(&yejm8dPw2`Q-JJ9OInI?E!B>1{dZK z*etNCCHhT`l~Hp%NaR+oWsY)mS98z3Y3>C%qL|bHmtC}ha*k;3kj!p6pye|A55nj2 z$quo@)2$Dw+lDl19Xd^Y*cG9m@f;a(j`}K>?ASf?>j;cv;GsnhG8YDy5}?*j#0v?P zA(H!eUuFpW>Q4c*1>K^TOW_zd$}liTv$)TWwzXCO;4SSzqTYKGJIS+zUcNk(mS;28 zyq=U}l+WvUO5|hIv%~Wd{JDRJz^^z}l;L&cxS8NAfsb42`SSZ^`Q6!mXu>=8Lm1H5 zrA_u)v{MR+)}3Jc;>8MZRoK&sx#d-Qdz!}maQW990AO5O3uK6swNL;Pamg9xqO>S= zK@~Cy)Op16KE7tGpv{4UpbRFw2z~3KvE*M&=(S>J_-j6O5U^%!xu2BnBt$!+Y}RS| zAq$q7yIn9OKwBzFlkO zIQJ?QB5q^mNe(xKNSSg=$|bJC+#hCRi@>CYC_2%NWs&&tRfAZ(g+>cLYeZZ@>zkRW zMds&k*=jQ^oX~>QyLx9(;|aPliP#(@`!(^V^fmD?Q?Aye_*+q5LzX9XR1RGZNV_;w zfrod)Az!jnB>G znr*JG-dGPwhZCd39+7SknLn>bxFux*%XDP>khl9fL%D>A zMlzm3snr)&ogU4!7_?J*dSTt?tLuqyiUI1 ztoR|#VlQs>O^1xaV~6)sk0T*S$z3aKVZG+V`-%2+VE_c0^1;~Ux&U`F>O97S>r!kX z(;m66>lECb>82CeTH$B+>OeMO=p8~RVkp`ko*o43p=vcM0UckTS$ZN^6vNJ@YTNI1 zfL4HRPCyG;Cl3xwSDWX}C{t;haj7r(=v~Wl>&*CVHP&H2`RX)Lyey8ileVX1;l7pF z*}vhy!goC0f=>$7%XPJRa}RbRWXr;xfwY>o97Gzd9!w30c(9SZ1YsyBZ;p!X$Iq3V zW|+f^OD<}=hm*h+BYOf0^x5T_OWrY3lL;B5J?uCO)u2~WT;zCW9jfWxJGFG2Rmw)L zp9U2tzMclo@-*JWhhSn`>N$ ze484Kll*olLS`oQXQwQaU~}ol;A(cu5X^kXYQU zsFaUtD2{(Y!}a32CM;=!y6yn+~V)bkTBIcjs+4TIC;;A$8jVxp& z?b6yuezXbf=#%ameXTx${8vQX5)rutx0mDuf0EnFzFC9CHbv;47R>Fe)?!>qz#)gV z04)0P66l^w^T2f5WVqUU5o0#q^AWEDUhOtpkrv8vN7>e59AxG&#kGgu?F~LCI>!1b zhE-8!d5Et>&b}9o0pgKJ-)SYSDG)Uy7BUW@bh(O=slb*jA8nlK(pcusMT}=Tyj@_$ zgDk)qv^rke26T^v+*730e%6u6;{*`3aKntt5TXNODtEI^o>pVSBsyWKr_d8}cyk+N zd|NI_$V3a-nS_gnx{dgXAp{Il9gL1XY(1>0k2jpPi3E$Yygt(t3D`wV>?7a1nR88% z;Nke&!ZEa(0M!4>=OX%Kgr_VAx>i!+f`J zu<(KlDGbNoSz>-7kM&~hJZU}RZmAT#8<Imc^cmyuNHtR*oNT$f+FSgmnY^?c2Y7J$da1JrTWnpix^OS5# zW)#tMR#L0KC$-vqr-bAkBF^qQr`(eF#P3(at=(U1ouGvHkF0HLhlEUTp0ICB(!$?cIQ zlBk$jl9F#Ts{CpIh}o;LAZfnr1yh(&qf||}sPZd31S=^@1RQm$$b9MK=G2krEiPj@ z8XP6 zK$`JbQY}ML^)ODX?5T^jC&#SZ!Oke0x5q+Ibu910ZjcjMF=?5bs0V6xP1UF~K@9>l zneR7=MUqh6B(_4JUTqRy5}F z48ap^JXF!n85S(hdKJ`^ulV~nAAWrQ&wqO--)*heVm|&Ne^j&bq=!S96>)jxELh zlFuBoCsDK394AzFgLd5=S|uunGK)+Jd~_m2uFROTLn|S=@7$qfipMW&T}*y&yjE7AQrp%+wTHfol$1S! zPiaczD-y{qtG=Q;LUf0hFWBa+`noe#P~?_?g3g-T&K?l& z=C3!6fchoPuw^|%+9MApC~~4{#cK=o*_G+bXZnuP*&H?DtcWBiaa&tD$4%0_Jl+c6 zg?1Dq4w!5kh%~89SUbE+B2Q7?BihV9Wk+gC8UsUq%-cV#ZQW|)Atu=mZc!(VKVs0P zq8k{t+i7@V)|ktnmrt~(Pu`$&o&-SDo<_bZ)UD|@(9;bLICc6k&o5}I{Yywo3PQ@{ zCQZGH)#oT9-hjS*(YcmBng~?(&Bz-DMqfe((i?W}$s5)B?xK9a$xCarOL4@h!**by zNZD|<^F+F)VI#}ZxX6G~pKF>hnV~n?r%**nfAi#x$aC`lFP~ThJC!7|<--4LDmtXK z6UWk?KlL>2c?K%CUIXF{cS+&PT5J{h@gC1WK9&1W*bJc?MK^}Z+^B(uX_}-p8j;FqZ!>z>`gRPQpr+AjCR`_MCXm9euM223?r(yy* z3@*ZFxU_YZ;56+q0=dtyUr>@!u{p-M z-HAc_Hj)#cP}Lp_!qIYJM7tB=UF9qu6L+(bj!ZjKaFU zD=S0tchWznd_VoOKMI=k7k{4qIUW*Ty&pMX^IX6qd~V%!$`rj`dCy4L;sC>nVNXdR z-5Ay~GK!0Mn?{}4ktmG+(jz8C6fWg3VeyWX?=(DwDWtbbUZY&g{H$67N(kHeZ{s;p z#COQ0-M`fzAey2N5J#|*rch?iXnw;tO&PtL3(;VT28=NI?YzMYjXm_olA~kekr9n} z$$Bc-vohR;9?LH4!GiUC0_d!Es)N2F#N+LSk#46agFDLW6igYWk7Wf;*!6uW*G?}) z#>bvC*I~Y6R^2KzP_hw>^uVAvAS&hrL_ai22o7+%S&)G>?)URGzNpE%eJ9vUvlGe4f zuRW?rD+0{7|?K_=Byz^K<5Vx2L~gkfaA*4ew!vSOo_ zMQT~GMN){9iGjKC2ZwO74LFK3pgxra)K!s5Jme6^qLeJ7ZGH6>61fLD+cYE2^>k ziV9<=mhli89+?4zeyYq0ZfG#AM?UiIr8vBMiQYZG+RBazJKBoaqLt^+q(CXn25JIy zjv++?oTgRR@SOQ7A#}tLnE%7t#T?r*1G@i!BmNtx10Q2Xtrp-QmNvWfR zR%P_@`U?dk*tK8|Yqd0_i^$iaJV9wU(Tm%0vbBT+x21-~AYFx03BmbJv9-4b^bTNN z3-UoGs0*2J;Xl^|LU2;IrPbyk`HxZsH#T{I3r3?BhG52xx|7u+nF&fA8wUY4iIo`D zb&NU`c3p4|aSXOI1hvQkAugghIkIbyH1JtQ zq4!#v0(9!gUfyGd;sGPMejCjm;|kijwH5E=bJDty_<~$emC`!!_Cc!Nd$hB9w2OHJ z3ZgRP84VMD5&fq|!z@nigQ5tK#}itGAyqgX(k`wN_vcf$HtFZ2Va9;;U`JkU;~(qQ z)(9n~X66H((~PQWZ>fIs`w9oaqXgb4(?_Cza!zQ?yO-@ds;%|?YvX{4Q0 zyL_~=d!S3%?KM8v3;nsigv-2{jEZl*M+xt5#wy_WdYR}fC40cpjQItD zv`c|B5=SPP>Eo}jPoL->xBkL1wS8-MfufxdgY z>qj)lb7nbD#0hecdo=Bw=AJ5tN4}R%hsT-3K}ioMhoP0{)#R(@;p*{f!Iztti^!1p zo7~O3YhNGoQ%}BQvvD_TGj1}QEX_1}8PUrmA3aJa8w-lEHbkL61i!!OL;RR#FR9LQv5peSSWk63aY318;CF^l!i-C~GW6XbW?hTKN zvA+4oKjlG&P{Nz9-h8~he`9^FF@$?^Z@zv1{r7L)e|RVJ%D#R7yLX(#H*+^GynX-8 zyWrmb%b)-G!=JwU^N;`E_y7Js-u=ejjj=!cM`PZ8`0HQ({`bH9_}|8#{9Ug5!*7gx z`^CS!{o>nqG5WW^`(DmyH0%G@%9*Q7M2mOdfBfQ$FaPzO4fmMe ze*NQr{>KkL{F|Ki!{2`Rum2Tac0RoQ!=K*8axYmL=ADt>{i5b>vw!=|hY#=U+i$*j z|IWYt_N#YTWCkn6rCTg-|MbN>7w?hpUz_aDE0|NGy6`TMUweER;IZ{PlxfB);>|M8cf z-u>ZEZ~ytjPw)Px9{c92kB|5N@_7Hnn|SP{{Hdpx6Asm?uIF< z5)@O^c`P@qawk(QBzMb@5FxZrz45nD$}QJ9d2xm!$M6I`$X9W6YsiaCHQzqV86ql} z)cW9y^da1whd|D~6FJm&f?P$misZ1)lt+%SeO#QJLR@WBR-w-R1l=8KJ z^V)vi5Op6Y(g|6A1+%-z>P)_WEdP>$I0~un6`m&+iJW~~#JNJ6%~$-w#~zXmiwDw9 zI&PiwbA_WTGDcaYe3eZjLp-&HyvS#%eI~QM7CDivi}2Csl#C9MTn!TE)*A96pB4SA zNDoT771=*@e`)vdNRK{LzUnU#*-2Y6MWyp~ZUPkZvet_Zo{Wi{l}oy{@QROf|2WG% z+lYr{);T73;`CJQIrxG}7DdPeIa3U>i5D;OD)dj~L@`0Og=GiCIk2zlO@!jOmEKxI zUgWc^pGDcx63)DCPw2vSgA#G{=__tfBC0G#_%@no$RAP|e~?bgw7A(~bDw4MJgnEA zxj62Q&mhRI1_>OZj8(MqX=B~tmbN#Ym$oiBszJDYx6}c!hshgAaEWczwlc!bD7ibFj zSmXzm=x6`c4v~D`9XHI+|_-YpM z5h`bTcqBd$ehd+U=j4(*>noR$oU!+!H>rEduhDPst9H+)(&tFUW5q5ayRSX%U(L|t zY|@n@Gd0UEm#gE08-I~UZ?ni5S7P6pZK&1D&g@L~AzIm)WnYe2HfbjhaqP?1>8|W# zo5Ow_w)?T{f5{!TV%as5ZM(2M+OpY(liZk@+i(#rVA+PFJe0Tp&v*a+qinPL&GB##ou@?YDpY{_Brl|Ld2ZK7RN9>u)~En=i33+br_xxG|?{ z$Hr{>#%!zXU7MZxXKco86Xy0ZXNQ_0F67>dzKL%xpoi$(BBG&sQ=Io5G(%CB+4#tX z>mhKL%+}9lw|nsA1bx&%);O11!@J&_DI}Xw6h#hloVgPdOY; zHPW!O=dB#>*Y?r(&d-BHg~o8A|J)DEXr-$`3C50Azk?u~w+K3PF1OA>qKJ5NOM9$% z(T(H*VjHq5>Jp#42(LKX(Y78y^Oj$2#3Aa6_EVc_-D^aS*w))b<1fe*Y^~5|Rpb*wxfX_h_z!oSasq^tFupO~&&SGsjZUc?vqKg3iKF z>tZb)#abw}iM3Sy5NqLH!Yhb1OOJ-d)S)67A|8n-dorn~!v5IX$tkIgoH7;<)M3-7 zH`NlAUGlM2$z{i%EmpFX>5N$*YJS!uMdt~nAEGwxBVvhT8Cs{u#?YmfMW-N)TDRp< zYPWsp(g6BFhB*MeM0Qu)m)Hp2nA48>-qHSjnk2HGqgACemWW=6zG}Nv>MB@9FA~&w zNFLd-i|;E5B1qn&uaN(d4jhq+RO_?Z`4!}jMGH_bLWW+Pr-uS^%O;o=P^EA1$MB-b zjT>r~OJYa;t#I7LRw#4a_Cu>Tm6x09L+iLqMNf}-*6@dwbiApQA5Il!*%RnfNO{-e z81&I3Z`!0u<|VVQ-BeSPOB-4-1aV9ep)Trl7wWbt}Mp=@BZ@FpMLnq5C8V{kMIBb*U$Mp_(W-l%6?|L=a>3` znXNvB=#lLfzpQWDUi$o@+oW`Jew{2|erE6$Ea?|t5QbDBQo^K9*UFIKG{2#=35 zqjA*I=J^6eOl$2PO0n(00$a?+**a>cdZ2|iml*-*&Bgx%asSyFGX|%RU-DvD$I;kr zb+PwRWOq(+G>-b@I)-kxcH+?Y1IM1CjV4<&cQv^&_^+q&2;tQ%af7YH!Rs-bMi9KQAJ^L5I{#^SX3BR3d3eu8qtLy49!vVs`Wzi@-}oi=rZIWytgJn z5QYlnYM7T1UfU@MMK5aRr9GE}Hc<{H8NH+GRqmqM57q0l!q8)pKpgseJ!oTAZk%$^ ziuyHd%-^_sN#)ne!A1V{6+&e>m+rb0(F4mPoye>qifWtj)(xw|ma}glDuivG-|PS{sLZGvk3uu=)jDp|vd0(OcIlGSZb8xD7y?A@Eth_Xs$@P*l}whGo#DXd z=%iK&XC$@0ER9@`B5f6C*3rHjx*bG-^{U3oC1Nlt8`HEC_ZFuvBc3P@Tdr$>)vNeW zi$+9$NnKgWg?4{wy|NYNU^Sw7(wkj~NW1yP@w%=W# z)RMc4V^=&{!Dn~ZRbcA3Z~(igU5nLr+Y|o64BJzqR3)f`IXzm0$ys+4PG{E~k|~x# z50_2Rs)x%vF}#adJvOSc1y8*wLl5A|2tfwcHVF^M;MIO;)&^g@Q- z%3CFA8|#)u5=AaB#4a{F9r$Oa(u}I+?BLRW6I4F3Jf+5MTjuLR&hv{b-G-ww%Anh}q`B!XHa&jXKV0q~(?(00wmYSoJYu zcv>sHtV0}Lc!uPzsT*5H8xeqDBfH&m46a*qwl_vZ2JSz3Oc{cVBGE!Vs;g`U2A`>+#Gsjaoh?kBifx*eoGrGS3Ir$jqX^bl{#nR?Yd7fE;D zN{>xRJ@B>~n$>Ogd_?E0+k0dfa6p8S3Rr;19oJfQ2a#$B(<&rH)Q56)gX+91w=`9U z<{wIJ<*LsHt1ge;G~FpSIUd;KSfL&4L{jAQk_X0~M?5*VgDwSP4w_;o;&h7PgumY? z>k)4tGR(`Qa)bz}Imft)ha@RY4!gv-yc|YQnVrtDrZ<)5Hp}!C6^P@Z^6hoUrl43T zD87Z@po(~g;6x42@*qW|+}__lzJZ1=hKip$%FW)U>*%)pzVKPca&9^O#^0k|-AGBK zfQTF~YC@s%LM32WPg$&yMdYNr*jT4#Q+%Seh)t92-fU{2IZt?#O?;#U_&DfMQhy`f;Uf1nH1gAH3dC*gTISs#bg1H4D{3Jc%lMpWI0G z@LWeeh8pD7#j>v>UW>g>A3}wOJJ5=<=k=Fevzg*WegKG&9SB=z!DA@}d$JrlJafJK z0lP_C9hlEyzU-Rx?#nc(qJ?u7-Jqob?NTv$@WsT|7)Z9)eUdXR=!FZA^xVH~58dMk`m&ZLw43SMax(@L_J#B+kgiGP!GaB4Ul1;Ku9m4SsP#FpQBH z#4v!c7)Te(<%0>1o3nNe?A~T@cadu$#HDfaE`-?STEtcdxfXzG3&pEki$v&Qc|>Pc z7~fFEPsJ*+5p7-J_4o$A`Xcjvk$EgK-xrz3A|uSkr`6Tl!G4>oiRmz2k8kj+U(Ml` za5c_S*mk^{(~ls_Ez~C0kP3v&wN=;AW1`>r2+fEHa0jc;j8E`hUPY10Rct0EoXnZXX{jNIAw9ezEqz#t#s-cqL_{~%rP^y^e$#ArRQ_N+>;g3#gW zSnn^prWyk>SBlJmB;ry|QH)pEB;Lxk!|Ku05v)LN%-Dh{e!L#v;1?A=JbZaXc>Y`u z7D9licdUG_1zF(FmmFk{TN@|ulDcLCg%qZpgP`(|Y*=>|AM+ze8GiQ@lKq)rrN4*dFZ}aqAS0^XqQ7Fghp?i*>gt}iqQ^ZCQ$9gPs1kSp zML?&d7e2#YK6v4Ck4DNGTObks7rVmFR7IjZ%TAm|T11=*i?g`<$a}mHLd&|`OgU#d zb}_?PDK|w>th=8)SxtoiN=BrId^d8jc$dzM%LH>Kt%0!xNQB8c{qCnxzOLOsjY&fQ zb!)WFrK1WL7lCmr)_Nm+m$(4tvL6mCIt7sq(|QT{PUHu~!U?+Tb0bY?Q4TMgaI9BOLgGlftTOnoI90b%Hq7^Tc@-Iz(U8)#CtMo%PrO>|~j)FUt8co&5W! zgpjl&oI^3IBQ}|tmh__86pj*)ebiy4-t4aqy_|S}$N{;x6QjDXK^*4T;9;WRiNcE9 zl;mZX(eOYuva{c1!#;#AlZGy{;y9XYbS-un4i51X6cMp-c4_%5d z4l6R&iCG_>2}hCfj9t2W3P&T{i)f!lc+Xb3j9rTT(5&s~PJDhfHmNB?xL`PBO}tv{ zvipc(BBbV#f*uKp?wJb!hyK>B7ajw+A!cItuQM|QdJf}jKo_Z=swrn9KzHIT3~}617xl3^|0`6-wZ~9k+B#R~SPmGp#8yujfKCD5 zz7G#*@(QdF+rlqdV@9*aJZy2qG?-!(t4LcK(aG$?67-NxT!ce*%U<{pT|1!|P_$$3 zehSPgD*X{N)6qvUJ`FR7QV%=004E=!F!>=P9W3JwJ=JjHN;(4Wdcb?XihFEeCr-0~ zb}^Np4$Q#w$WVoGo*q2!Lr@u$k|C&Wgk7@cJ*Kw%1`U^lz?@7V^K2JtJ`^O}$=(=b z!*@}{6#yC1a(9!ba@QqTsgPj4?8BZ#miUSAGCk@UEggsXUWU|NP;{ zpML+tkN@qb|NhC|@wY$!^yUBh`=5XOryTIilzP{xdScLF)-+%d!~4$r z(csK!5QpJDqw$Rwo?(PwnSo-g=9tVDH9=+vyzFos6mD@jh=NQGm@Rgzd-YdzQmA$` zc+f~oXqz;AJ8?94F_GAa3t~YtOOZ00;z%2Mu@)a(&$NVcRUTEuV2Ac*>HnAAf417q zg-4kqpm29TTiU63OT~3(ktd{r+KTGe(SBZ*2zTNgvIS6Rzi{Bae~@U2X7j zwSy>!WenumYj4GPh78dco{n#E(?eNyE{=vypBBdO-IcrzleccQD30r1C;67AnA3)K zOQT9UK$iRL`3N~CV+PsFN2`ggWTFTsi{$-j zE>a#a{kSzo<2}R)(|2-$Rc1lIyMk)a8uia}ky2T7En1^4(f4yDw7k35gNX{XTTc^C zDGs=XLrU?liLj3FSs*ywQM;m1z*Jecq`}Lg$IgRHU|M$G(Q|3u976C=idr7t!_w@u zM@j?v35`i1BHpuR+>hQw;EmWDz}L@u6MAn_>&@{TVmawKO4y!5c7OSi-93rsMlOXU zn=)+SnZ@UuDkO>^lXJ255XOM6w+}wzr{&KEdCD+Y_WgA^w*HDx-SoHLkSpzg7NVutdkQ4ZI zP$0*keLq5EAO`24O1bC4fU2A5eSzykpZ0OkWaYPztvsF0peb8}*sXBJC#Eq3&wPe? zh({bhS2-#m?*s4~g7%jSG3uKDJcCffA#kfoLj_OpvejGYOGPA*Xp``R*^uN}xw}}( zLtSd3$F($}o#^3OJOo=akRS^o0TRTvX+lMevP)+el4-B;9mb00_Eh?WV!!pQ3NHA4p>lXAlU^f6f*<0kI^CTFw-9%r)9b#3ZRvVfXyQ?GYtipn_@))n`P9D zBNEExz_wGA_kg%1EJ1WwkCq{|>~L10hYqiqe86TvF;(j~(vAjL0c|RZ*@p8DCv;e& zQHTJ!Q~2oWtHL+pz~w9ss1~1zBk$0TWQL6`&69aME-%t`iaFbSRPqQBpVMsqm~ONd z``~2e-6Bg>?^j79WLJY;N^}T<8_Vzn>^4Xn;Imi2qsLgb#8#if*==*?M>l4EI?1Yd zvOW%DVn9E5}TnSuytT(t3T&aASo57CQ)DtC3;`s7iND4JcUI zI5-f{bpsC9%?M%-hNC0{a4`DR!1nX@RDNqfai4S8Z?6(pB6nBQfWS_V^>!!lbnIT8 zsW6QjVaOOR2O!P?SfFJtH9$#~zhpv&MKW(xCQ)=6Vm&e@L5nFM5D&4k$YnTiO7qQ& zwL`ZJTxdja=X@r^n08P`&w_Ioqn_CS24uwXw=-e5%{c15o<19-Lb_!74l@&6N3t%# zd>zgUrXYJcr5eZy{dOZE_bOWeM@`h33}VGocPlQ|ba(lf z;B7Bl^&y^zF-3pNJ3^_g`I!9OPsx?TJ(jJ%-r8rmM($ZKQ~G7o^w)3X7nF`mH7?%G zi5lla2kEAm7B$Yjh8j0A5|d8G#A$*Yn6kpNu#zqN_HSp43z8 zP9T-60!hC7V8pQ6LFs~ifa*YlkExlUURr9F4rFOZme0JoHn+{lxXz@9sf69YKTBR4 z6B^5$8(7zo2Z;GPa{wW_R_zG_ptgWOAb(OcrNuO&TeAk>MX}wLom(D&v>5#uDV}{$ zbGsVQz>fwD8j`L{ivDmi)kfsm`+Xu%Kcp~U3i+LNzZLZ7*OJJXJ6%q42DeHYWMM8B zS8JYiz?16LRN!`qsW5_vhdCEpW>OkD)^NQOUOZgyh*(@*sPsg#awLxIH`NdxyeTtw zrY#!=f|p6fA2juno5ZTcJGi+-)f59$w&Ra)K7RQ4)%&mB%YSctPNJ=gN^$hkpT`-& zK6h$&Zsk^RJGWO5#eZffMbV;GxmAY7b#8Ztu5l%QqH%d!7K!CHY2ihr@F6Q4h}}d1 z+!=TBbj16z4JLm5&G%n^r=Ivf{_B^&|5S&#`rY?0_pdMR)&bn>V0dk)hqTSHHHCU+ zhBW+>MQVv%*rW6zfBN`oKG}z5{L2C6KbzW-nU-^&53RmlYdMoULD$(eM8#-CqpiX2 z$vTI_=4tP|3dx9ksnKjvf%@5d^IqZcsV>dUy*m4LzuHvpvuMANf+x(&9%|291eCYPnzt{pK=pD%@~5hZyPv$+PxPt_?kC za@7q!f}HYb=s_~G+yusWmB>v9%N9MHcc~zQy<}PkolR< zHO;j16ef|AiVQ*a`UmiGgy|^E%<5buwukGE65F3j?3ABoXLQ=sU9f`6#-*7IL4A^0 z8qF}1%VH*H|2mSiMk6OZ@MdQQ;BG}tKh=WPcqNP=)f5Ft91YCyP$bc=-_f5t# z5RpbU(#}1e;JysXU0g)#fP-oQy@**1Dj=@sOsq;Z@O&|`X{fpIT2>C3LRFkbMP)SyLSHw3ZG)#9V_hJv@7%D5efW~U6*u^&lvGJyL^upB1_ zq#4;vOP%I3=TjW{y_SJ$P~B0Xw@T7%I-^}2NSE&KOIu--lu_;Y?1OF3o(XpA*jjcS zBbszX(IUg98A1&S21sZXc~~N?=j@}a^={(N5Ng?9n9mV8^&6qqpuj27@s})6w!`r! z!egZ@at^d)Pt?%(OsK_1HRSfX=yRcFVbJdt)H;N7gS^=Z6wdnuvtJ4n-aXr{=;0}) zDm&g!XxVyWrbNlYj)&o7!f6$4R{biI0wm4s ze;}`I$VmF-`Y-z^WrH>+`6dYtDLFSG(YR=m)iiduD&5FyXj?WlNBR^6vN$lO5TN0} z-!@r96#=goi-1gobEFP`M6$1AB-jspF+$0} ztbyju()qdP$Z`WQN3 z=f)I6iBpItq@%MeHCYOClA(%W1RT>Wz=JI^afN%74Bs%FrXutBH#FsuZ$dV*ev94? za?}`^mnI4}__9%;BS;CP@2dSf!uo8&qjbIzZ})rmj?nNJ+o`RJdB{72yA`C{#|hLY zsEIJ<2%k@-m&Ykh`ys9}=7<|}#0{2V#ifhtm>OcKk_I~4KL7H_^IlR^%qBa7TC`c& z_pw2!x7vVvfx{W_O#L#PG^kOjgpVi5g@3JEy5^H0^KblcxBg6BGd!i} zEyXVewE1<+<73s6Viq$WY6iLXdvj_^;Nbx8d~P*g3Kg9KWDOOa5)KkEZ6zXE3|1Tk zI8H)~lV*jihwuPdJ(tLSuBWX$Ol*Bd9`f>ocY7qIwuIDFRIUeL=u#8$GluIr<28&% zF2UZMG2Ea8WzjZKWRr4>TgNv2Xx4WXhyfpu0z#UN6p6h7)l=l!Orr_`_(?F_rj1V| zJye$QiR3`bOR0t!TSkSgAoeFNt~FN`aH5qo&6bWsZLVNGxfQJ|V2dLi0sXbCkx=Jt zSKc-@w1%sSI+XI1Y}*dZP~9;BMDU5)r)MraILZ!E)ZET_(I_!M{t?tcK@@pr)fFb3 zjQCU_^;L`KBMUMxqyylCwC3I9_N<*D9)Pw6n`ugQAf5nT4MS4ul;+LQMFKNqESJ(K z_FW1D-gCLIITdqDIFYWZKpG4lrp;+@2NNyq?JP^&Al;sv!6mzujjnTIUMYmNmTQG@ z#HmyF9-_2@7}}zArj%^#g z0Qwnt=0ymb?y6TVUBGe4`wi}+y*>Q1E>=vN)FlibWe-4+X32`AWQvenYG8B@(4kY5 z#~v<{$oUBN5P!(B8u*Qu6e*o>>TLc9bTdb-U~2FLx0+XkBl2dDNGvSX9NW;nH$MD#6&&250q3sFMj7jare zg)}`~nWV9dtheU7v{s`W&^#4T5YL#qpWMP0N@+kCqFx0DT{2yY;q&p>&yDt^^m*2E z=~D)IiC2P>pEc2T#fBzs9NaR=wMq@5l>-4SqD&-a06z|rVSTYkXLz9`Lx>|?CG(4s z+eBGT&EO1Tw;h@ETq}Cjl`e~1vu8?|duDQmd$oITV1wGohT*UIfIaFv9Kp?Tkf8YR z>fq)BFx1B`(Of>AXw9l~eYJakitwjepppY8lShAg$weswK6g-rAF!xy;)?x*O78`- zNn?T9Yk};T@ZE0mP*`AMWb-&`l$$vYSVI7#U-ohZ^}nZp&+R|6INT`V`&Be982FiIk4bGN$7Xbq<;JviL{4?)I$rFFL625@b+C z%}UQ!*?_9Agx&1^xv(>74E!jMbCQ%XAN8o^aeRn#I{QV40k!~~vq97g=#vWSwk$Ga z2r=KXGV*zbnuYv1As-ICkb=+QS#E5)n@w(PM6TL(6d~mF0vhv06BE6|KS_-BC&)nn zbaU6lN>~C2^>qRWE$h1B|1Pl#^a#yM=MIn(A2Mo!`Cg(?-X= ziR5WXyJeR)Iu5b@_PyI3qM=ln=Rp%bljvpfBvaPP`J-ma#;Q5MOXXey`(T_`23H@| zYPhxAd7b2-LyEP;1VWLUxV#1YvU%d@4o;rQwMtzx+;tC<3OLl>rXiX<({J}#w@!@3 zR@OFp&DEZqECurilQCL7OG@F^B3-MAt48Z^N+d-2(+DIKHBNmiZmW?P^xAjAohFoI zCyK4^i%Bt+sz##Bl$RTcUc*pQ=Ff6r^~Yz6)JFEa z*&a14p`LhP>BXwC6GR@>g2kq7A<3+ILZFklyxdAK~;exuZ++>5y%&i0Fe+vz=VH=TCf3q<(FsrkO5g zE}zo&TwSg?#3mIM2TGf--h8;de-jHzCyNd>lVC+#>1nVxiji}zE1ik9xbfE)uQjah z#iwHhnHriQ*-c0AoSX_ZG2x#oUEUrU0a(f$JT&1JE@PE8pO%pczC+^TOe)h-gRjB4 zzS@wjntd~5ngKFin>9j-z@$>9$1^-smWi}?euDjCHiFK0=I*F%2Ki|>N%&4r(yBDI zMK@kMF`1`dwfWgVyt*L6f`awZn2J#g%ZQwb3AD6`IU@AOSX2TP4@%3>ni)zwcnsWOc?53hbDkMpO}>xUPGv?y+1!>oV*+a;=gxfI6Q7S^ zCJ8RcpAC7RJ7UEvEgup6YFcJ>g-0OyWj;Dm;{)-g6mIdBv#46&Uv@5DJ=nlCzciv5 z4*y7|ef7n4G1EiTSOjJWrKq84)BYu+k~3=TT5bgByi_(>vdRxX0ldFpmj3!tC9b$C z?@CfGSogA3NJfA-qHq1<23 zDxQSv8r>p&;If};XM~Jo^z!K7(8xJgEv$9jK6|^Y<9Wmbh z5Uu$ZS|x8KvJ0p+GVY|;f4aVto;aR1)x49HMLZyOkiGL}SuPi#k>TxbgWfBO>jAzU z(7`bkejN23SWU!%FM-*k1I)J@H7%h5Hnf5F?-ifgA+6$*Y@@TFReQkC4(UVN=YUd_ zMj)?$#)WzvbbNWR4MtWV?|Ml?JY<|@q}ygBu8gzv!sAcQ(o@V^ZSqD}fnq5wrLUso z3doGMc!Xz`Gs9Vj7+X3lB_@BlVGjd4IN>9>eH}FM<~`q zJaVX_ux!;toi)wxn*Uj*B^jXIiC+UL+r8RS8p$v$E@eN%|GauMUS7hsXWDMacu}p@ z9UwO(DDd)^#!pbgo@cji`FcsKAJ!sEB%W)R%C$udiaUTF_jV)=2EUUen(y2z$t6^u z7+OiQflK$uS)Qn{sK^0v(+(<38bsZR5hlqLCw&*rs9NKjUgnNWTe%fk6J5}$Y+Fcp zx`j_B3sjIWEVxE;i6L~xSZ_Uvg{H=3eCl+R1_>!eA(Ge{PjVW$Bqb8b$#S1?{VL#4 zbovI*cRy#u4-6G8-a=Q$zD_a42Ws*dB{YGxSWm$fYm5;lL0%Ql(}>t+6fRkDHb=oC z!Tv`w4Ae;qwUu)h^}mtY*C+}V3B00ASjTeQAKuu6ph$Qj$`B%~t>c3TD|>2*UFu07 zv~P$ozoo>n;hxHKsG)yKi6eULMbsO1;S=|TIi~di%%o@Qq3@|%k%<2lK!+VLR#li3 z;`cJDWgSXcb5)Ltl{DA(hxkXslrYh`jUnmp1Cl^{Ou64~O>72>jKXZ}`x!um1 zT8-6Kve7P_Do0PJdhK8?`GMRS;H&_ztFi%eJ42&7eV=KRp| zXCdy(@%AB5-4}pVx5upZdDb*IkO{STc1_s^u;93ovrR!0LB!k-v8=>hpG!T?aF%lc zf7Zi_$oWQ2`JNOvm{&KYb??qR6;t6!j$9q-c_%bDxyd7Y63tF_ROPOdqs#mXn&$(p ze4_y=-Ftc)6`pW(X1zh*(alh=TuiW$(j=aerMB? z3Ybo5Ynq7#+6KeY0ORMS7p|g07&l>8W%aN~#SEzWr3jBGcVJA@Qi_0wElIHC_ymJQ zW9?Lec;zK=rOtMZ$Gk$G94Rp^w=lCzSsf8qhM(g_g&}Q@qI(n0cC1^Z&9y$?u{PiC z&@F#qPZ>t7IEbH`!Zu}CwB|DU>A;oD$|%y5+i{x!`$(461a&Uvz=Bg4q@FqJiWWUx z(<~!wTo&o>&pRo}t*x`|<~YkvnC3WBv8o(r)P+M;IrDVz8n{rKb3_seX8KuOz^SyT zD)6p3%tD0EigwLM(o@U9G>+W-ad(D-*vgVx+QUn0HJ2!0!|C6Ml)F&yM>8)AF#_4Q z9&a^Ey#O6B+Fi&Nhm=1cALZ_AW488Hw*9mwoYY1zX0BDi3v1TzIBTkN+W`HB-a#yD zw{ft!&&XKUtXUD%XB9!*hThuEVAiD)7(g?7LX4O?gvbtlYq7(Bt@_tp@rb{qwy#Fw zd4fklHq3_*4)D4qtn?U>q-C2%!jx@cYdu|J;s8k=Mg(??Jzg2JGwby(K_G;HD4#QS zfYOZTw1zZJ8HhCkvFrZooqr66{F@2;TPY zqmT=tDa3$ay_ZGhvX}&L;{}t--MSYNz&eDhPcn&ZuV4vCH04^T{+LNzf=I}76Zax; z;GUVdsVS~!DRn3k`viXEj_@PbRMBqY=1H?4Ux@ZKOx*4-YuMpT-Yc0*`H;mn4q*Zo z4mp;KY#823_giIvZdgS1P%XamH8qX{kV%Gx0JCgW@JTV)j`7Up)#t!?g z_24WVcV^q2O|aE5Q)gg`!{k@)Idcp<42Ly_b5D{ohDej1lSplMF+zpG61n+uZgz9Q zP6T=gLuv-4pbZTL7|7k=26v6Cmku=-Cb+-sy^7QAmL?c_xF3d>_XtDpvLPs@5<9Ba zL1QX4kne$nY_7yb<{++{+jS!oW&&t}h@J?8a*an;ZmWFSi7fw7#w9V!F1qXT0u8Rs znd449=Z= zTw1U#-*ecaj6M@>2<{o!$Va7tjhpf#PeoWjK=W9DBy@~-O)H~dc#YhY;m-&ge@3{a z5tr0ho`Uy*lwwJ)yp)`6AvpI~1DBx4u$u#zvOWTraxGuuOApXWZxk-zZGLE-`C0k# z^LH^kV6l0?Ok;BQ!>-(LA&*>Iu@`IEj)f{Hy`mVL327T&rH6@{Dn?E0D0grmQPUj3 zWV#54pzCDX^uD`W>@9&)T=PT*8k>f3lk(uHkM>sI$STj7B^MEqx9kl9g9m(MNhB0 zw$+{(&%72r#{hwxD0kaXR@AFd{;i^?`N*T$ELwQ3_v%F|t1DH^rZO;EBX*x3i+?-- zOjvg7fDY|BVXPcg_Dk-`h5ED$n}v(2YI}Oq5vlCa%sPXjT~a-{>CPn>HeyI@o_siq z*TopAbBb*c!$Frgj~EXUrdvSKy4>pbvJz7si*i*1FJqlJ6;L7;>s$T$^on{=?J#*_ zln4R={iJ8s+QSwrJgC$-2+8XwHXcWN?m^iWL_*cW6YGccsj*--dRdRYUsw(ocx3m% zCl%Pa1!zNQ0owJsKbbvUc|9M+E|Yw9b;u-DjJ>;kDHe<}DSeI{Dx{#Py2yJy zSadKRH=Zict2~iLK0Zw)K~2h|G?H!pI$VhYXQ!|P?UtCWQfYKWTLc3MW$Fy#hZ_i!QGmiM$5NA%D&)qr)wPy{j@B4qt6tTn^4 zxZT24MvsyBKt_*IbL4O-c33Wz+<`yDJ=V$>M2*b!-^+qEz#pfuUvF&)lg345F%4wc zw$jdEPeJn8I7>GcpB%DT*gdKY0QICH*=KsGOVXs4H5f*!#s+~h%ZwBzjvb8r{zOPf zAy1@CBX>90$%Ho8{t(B`D*Q7`xr3)>AoMN?Z-7}XhcRjc5UIe+0L1BY*j-Dh=E3F? zxmZUm;KnUF=}(C1au^`g#SRmj&Ao>B>GV52+02?zJ;i4Cxm5-NiC9l_@mKpB zR3CF^>u{Pw0vNL}$C~Z4zjnr>f%2~L;Jz9p9<7=fx<6stCqyeu6AOgC@6lCy!9k>~ zgafnI&J{67-Q+bGUF4;CveXL#3o~jG>XRaZ$_#|_`6r2PN^`)YuAM?5@FC%$+pFd}290tvf?oZw7$O|zq>BA}K$&*X&$HK=nE;*TcE~!z_EEhAojNBF+ z*6X4L8%wFNr?6E=!T>MIScogC{<&w#!i{}m*KMhXtFLO;m0VBxn_}AVH`)BGOoe}L z)|CUnCQG4RTXhLZz(=x^8irLj^(azJy#m?E#j>On8f4l*xgimiY8g7T@w34UAmyW* z`Sr2$WZ257#jU;4VVllE;5(QBM#x@H?O+C($=vXFluEpk`fG{%h^L1!v=|3dPoDIa z1S!$K+UPz^3&Ayd%K>yFn`Mfhy@~D0oARB>dc*$NF+R;8C{CQ+wXn)*49ToPyuDXu z1=@bwiyYcZQ9ot3pXp35yn#b$Twlgv!JMCs-tjbevQoLG8p$Ky(G5={eB;b3eEtYP zOAjM{8QW6kH!gO(t4DCjNZc;k#9FN&E&InmMJbF0fI9fgYpHN#zdTvUo=~bUwxJKq z#f^98Sa~PIFE>3^#~P0v#o$iK)XQ@`Yq<*c0d;dJ*D8eU(Oc!Zw+i?0YRthqm&68# z8K6%OmAm;Hd;?jA?&Jw0syrN%eq%z4?(O$z&Sw|uKCd#)uLeaJ8c6e~(^o$nyKB9k z(UT4A7Iw?fu$pt2-gYt9$!h?cc4Wg3rFB$%(R>0*z?JPWp{N!mj3b^>roMcyHbRz7 zkLij=B2RPL%qW7U4E0-bzVVH?_?ddIEunAc(C!aO;{XUY4C&vWz?0{=t*m%{NHf3~ zlNb?A;$7?REOf5ZTY%HSxjrHN4Urr+cvISrhbOtgo1%DS-qT2xRzL_?ErU+4hHDeQt4-@Ndk_i<~kQ~-#(y zy^Ttoycvhud(-RV`%(V0%WZeXr>sTSi_#4?rEpG+%A>rWN0oEQ2l!>P#oa0gb_N;D zO?A3?TAuNA?^u|Z$>+N%6OthywZddoCx-N*5RA3>?DtQ=`#i?BoYHUVlV${zQ^S>W zDpH(l}#YEETdeKSVu3EWlpw$Gs@r65mhntIHJkNItwUhn77DK z`<%YqKJkAs<@#r`mq&y(52@QWwA5_?!d{t7VmQkg{BgHJT?in>cnVUSl>OjQIjzbL zGf|^^Wj^OO(?uOsY>@DOzI+@hJfN=UlIPQ7?M~-2SGiqoHLHk28{9eGq z9dwN9ZDPKB5@CNL#&PYfaGXecG>{g6M;O9MIRFhrT998znABjD8IQHipH3YI{uzH5 zqw5Ela(HVyrPQdfK-?;Bu zkDG@NS>5}b<+u?$Vt;BQ?) zNtV5DsP7W4VN+8u+d)PrSnCW2ps3fN1IB3s9;X%_B&8i9yRMaK?7($EMH72XiQ*NQ z2K=ZR-F1UoH+*VZq?-9hz`|=aRyW7?GhFml@72pS5JEGsc9JL_B@<1`vK< z?!~@TJXrt}PMll5n|~too66+Uk!3vOd$l|1bg42CgZ>ofU{YTAw_cJXSiskL6i=xe zelk~AM97SW(BBs9MBMnuD9zYy>L0miNM- zxuLZv3oxB#|%uJ)mR4|H{fvKlYj8yfp9j8TT9IAgtYINg#yQl}Lk|&kfeSO-+D_ z8lRHZ{miyNJ0&BRK{+Z>jE-c3)%^4~nG7N{NP<&ZSr<=*%a?;a=#LEJs75`gZ#*6D zR`fVu)lC%v@a$5}fmLg(bD2w@JJgjxNQ284QmvLL)kI{ka!tmLjDkpTJi)g|rN1fn z8V7y>BAQ%e*OuV#zJCFk;D!lj1Y<;FM`02WnY8Eh>8np4Xw&HABgyeXei9zxk&a)0 z2Bce=d|~CG5s@SRACDIap&9)7=3j7nFwgPy080}|%cKZ}YePPp}_7C;c9ImVThRwYtrsn6mY7Dz77X0if3inufl99Ul;VZN~ zv7c%qwSGd*50wsgFW1x0LAI(d>GSg>^?719(@>A+bZ~ttId?Ks$r7aFU$@WKJw*5( zFIfS>lxYYNISSu!oMlIPHqIuD5pUr~9}E%^5q_*S8015L6eINZ)yLb%k00fw{rdPu z)`N2ZcMk2(aGBm@OKKi{>CK&%f;KIjK2I=V@w7HpEnS9|ve64&MLmQeK}#dL=@K;G zOE~lJ%VnN=({Mq8F`TM{wTsOc{ohiD@`-4LA>6dXG$60C3;63g4S)Fh|NZidy^L+T zqN8}dVi|J}mM_;%0YRk`4-d=o^>T90sjcfho{4uJSiim6z zom2ADS06upCHp)qW)M1@tP+aW9(X= zWkkAYTjmH-H2sY>u87&z&NmXDjppH9G{5+ZWBSf#Z(S4gRinC|djjdi#`~-<`?nV# zrB^)}H#ve>`s0_|??RVVeBIa=4mFQx`y%N6TIi^?)}wg^6&M}$lj9& zY|e{XR3j;b9%wKET=W49*vDS^gkw&(|3w!zZAu&7um0Y)j_=Mt zvC+TQdDu?|l6pt6RAx`LNTi9o*74o>Czg)IS2@p^4PD@7gyrsv3?lb6VVf24+V+;% zn7Dg){)zm1t@FGIzYUK*p30A6_v(Xe4i9Lc7Adoz`;`}kEe?{HSS3KF+jeVOOEDMS*19HJ}hf{?~n5IwfXS8%NI> z8#6m4x*nBH(_eN?{8OrF{;&+t=8sThkh1wY=aB~tNeHzOCWc zeY@#lZgh&3e#u`A4qxugjJczH95Fh006uQtoPHqxUgadikx`Y|Ef|NIF^Hs_m~ser zIpE;%OM_io9Y8;e!@>i@e9dqYG%+_4 zD|Av=CX{_3%U>0ivE0$=1MVNaX4`9hPjf4oha8 z%GI?P8|5s;Swe;~0lGF(B5n$yYxV9hwIf+3pWchzoO(I$ON6I(&M{7zR79?gle>}syCCRy@+4I~=5vO_Jy!~b#c|r%VU+aS zq*emm*aVW8!vxZq0g83R%pX~XD9s|>J)9r9`_v#HH9Iqi0yt#bm& zBU;QHRn6BS(emt3?=_(oEDMOslZ@-VI@jpPcnh_#(EX#B!m(Lm|EOSWmrz3v3b_JX zGt~~Cr>qQc`T_@@V~mC3GQ?;BlXxK&odwYOL>{_MuM%?6N?Q&!|Mv1Qg)L8kWd*Hg z^&cu@V6h^dVciQ3PqIKoToe z>K}jj<^8wc{qWO&|Nig){`#f6yI|h`XJcM{@|Pd~_O~B@`q$}K$(r{sjeYg$Kfe0( zo7cX^SAY1P?q#U;=byZe8GFl>9vdZ=wAJo@BaSN zYy0YppZ?p=@8AEK?*7SN-~Y?M&^?kZ_SGN1eVuSSx-hTtcYn6I+f-hC^~oo%gQd?; z-_Sk2`TVu@H(H3VzWMt5FW!Ffr_bKK{qD^dU%jJ$eD>Zy(=$`S|9W7Z#I$^Wi~%Xr8POfhGs@ zYdx(|YiO0UMlL_-PocFG;;mo_R@z#{YXh2UnQiN7aamLNE}oVk*3a=#v_ATyLft&d z(y!|yVTD(06}q4`N2^Tl;vVz|cd@ieEAM@}3s#tUasLM_HrlNHZs9?HLVQGO5%9nm z@-2+V#r%l8?46?)Hd|ia)W+s8`V=4ZCzMB|O^Gi*VhWHlIzFBSi+hxmZizbbD7n(U zT=i(YUu^GZi@e`xy8n`AQB&Q+8tP%e189uto!!aTunR4Zufxn?f^H#rp2}PBi*99X z{}>*zT8JK!S0>!z7z39c^rzTIrN?KUUqdrksA=EH+4w*^*#_fD=)R%dT#PA^wzAc& zOnaBMvc-N`?PPnm&MkK`ZLtvACU&&#=1m;ZJ$l{5q1>~ZH*vW8B%9bRHgQa~UT$LV zWD`5fo7nRvPPcfziCw+Zem!hrlTzEnC8WNIZKW;!n>I21+bq{ZakntGHJz0>F6DSD zd>-)zNVlA|QGR5sA3j_vjv+oh6D_N8A2}xFJk3Qm#iP(NOmVf5JPD6S2(54S=CLgT zJu{3|OG`fJ320OB^h&&TQ>3x+{_IU-e^WcZsl}pycAjQHjdw6}%^X+cS zgZ@P6b)qT3J|qRgllF7{#XctXf7yp@Nf+O}dH4Avkf7uNiX;|zfDYfaH2n`RI#eJL zfYG6D(_0Qf*Th6>Ju^*I(8`Eu2!a|6j&xd0(IgXJyd_akt1b6ZR1hRN(%o7R&{?0; z@iZ^@8aJnTDG&tq?i~w)#9O@!f}HMj01rVxTaBJ`dYZ>r{FNXGrnb}Ej?%EW zfZi}1B|(m+O9D3}LA>YiA(G%9_a}N&(QrVKN?0N8X)n@A0qwPV=%=|WXjoBl8biIM zl@kpw0!x>*x8l9xinJ;a5|y`sn-t-F8#N-XBs%Wb;RF zJQ*vz`DqJ#YhQdqsz9{a-OHrW%kDQJV)xU*zS;d2dhLGmlg?1vwy!1ew)gi+0svY( zO|#K`Un@57*!R4jdE1-AwttCVT64bdp^_AlIoSMW-ugH;3${7+B$negk5#mGblvGT z4`j!Dgl)dv!8pw_Pe;K2DIN_mOqGQd=D8WoTFmzBW~A-(n?+N5E35!trdDFnajWdt zk0iw-1i2Y0{n0IN#*2v74mTq~MV3`-7WjxYPd#()zwD5h`^|jlqY+tmkF6QRO<~KP zo=2Bu`ApJ|&~?XlK*ay%bOzX7ml?2YNehiE``*f@J^_IbTmRH(_{@$#(4jM+o$EjyQ`|o{TJ@TSwPp%DiH54d7B-UX)un`v%%V6*5M-j>@My0go zWV=5yEG?4A&E|tyMyCWxUCa6#sg1tB5Y#H@TOYEdq?z-hS@TRJ=Tayn$(+lv(h>2N zBv~##hd3KFWR8m>QdU98c)X0s-_yDvkkrF-y`R4aE^M5={_ zGGiRsKo`mk{cwmgC*q8x*_j?=GlbSbzy;qenoJ5+%TBao#90s z8eXY&z1(Q=#3UzlnAg1bFsyF0fZJo?Kq0HCkVao|#m>F1s*piMx_@AKA({`ZKDt6z zb4tA>y#(ZvhjmXa1Mi$bEdx&STS)4sWF4kX2LN8Ut@~iQUyqf2@5dY4qHkZ2j-&lPg+joiLe>1BCCZNPsALb zzGE8inCjUh!+2!KT{58`Hu2)*8y0x8NFkubX)Irz-tRDGyx1*IJqb|JQmx^&k=f*A zRXFpB!cq}tzJ=3C+Qx)sLOLPo$|><>p4DoS;5291%Y8iyP&yTG?fKfeF7n7~_ayQ> z-I9#DLU!BR7tzq_n@zVS@eCPPYl&y-+8b-`Bx1YimXZiN(g=>GTMYM@W*-j8lzgVc zQCH|3yino7y);1!ndfE|4jZ$cNy5Uis&$3_^%2y%ZqdYU(eRl}mbR?D zO+*2)ixEvIq>T3MjD4COqK=U5!vO-aCtU0eG~Cdvf@E-!9GNs4xaffpELU1rwX#V7 z&oD1;Ubb|KCxi}oeY+rsGr}x#H1{PN3(LR)6N8d9^02 ze4FjVvM98wqG=q$ioKWFGKF(g<2|hF!RZ7Igucq&Puj8?r06zJ#8*ixp)(AFQExf) z&D(vbp;=LZrzODT*Cvr2Y&fLY%^CwY$+xH?1@8zybf446qAnt|qw~>YSgkKHI_XOs z5u)~>h!;TsjCC6lbt%@}U3zzE8%uX%O}q8=jP71E(O6m={uUs!x2mV3!wSRc$j7XyhN3u#IlRknpf>K{#y+C21 z(++b<2Z&P-k!V`>!LbF}^nv#fDbhiWuH8M@UqbirV;?qG1urwWDiViy;j=jG!z4>G zR9@J$Hl1sdgXZi(2OVxif{~9*N79QWhzoiia;!69d9$`CzomaWzDoUWP}&0I6`LKd z$O%hVnXmNarr0y@+Z1}-Ipuxd%|?b`N5#D~wjzxq3o8VERhqH71c`@!Ky$!w(uG=c zQ=EApV>auVNVd&pQD0v3Rf4$Qq=co79b2$Z;YP3p znnS3n-EZAaZ~-~7C=xsyW_K*{5zJmp_H+WXVVqhpM|YC!JieD#ttN>TX4%7A$+lqI z3&tpeEke+ij!jQQW2I$IY$RB^V#C3yBk086#pb0k`^_Gj`ok{%6mGe8i-N5Lhv;15 zLCIDeEe6mQ7Gj>Y4_4zG!$oXU&wNQN3=>_UcTTtE!i37bceL{NYDjG&fW1$l-cmia z#auA`MlLSrfo-Rxt-MOlqs10&Zxz&JPFP3X;)4T%#F(#=pwuLR-zy{W-Z*?`JTL&P*Fxko_t<3Cu-=K?;ly(-v6SiL! z7XbqIo?Qf8u$?-?u!duZBHXI4WazQKo)iiA2}!;B{6z_fsXg0WPx9-iR)y>}UhgGL z=bEj@a!YMJdk-_{#(G#%Ct*7F*XPTCJ(&U$r`u>&nNHkOx#rQIMZCUiRuzG{rdcIG zgg%0u$6@Fq8gvW|>qQ!L8hUuwi*nP8Sjh?q$ojJ;eAuE%=$lbYL5l`3grGOjVA$Ff zi>|?mapK{*Xa=X66*y=soHYy|p`#wpAPp|0eK%T@z(+AP8Cswo#igq_PK?&%dQVmR zsE;{tSs-TIKH|rLKG?^ZZ%CS;`giq6uNy;&#E-f~V7EF_79-+#mc=3I2o*!5HuPa^ z*$@VNNIfwSyZMHwCW)WOqLMBIXczb0VN)9#2KOrg%2+pZ=d)o6f?dV;+{jvY+6^phlCF39$^UXK1p%5h*Ko7a)^KOZ#;<}+^*1ssnbq% zw>FO@M484?MCwFC(#BNA3I!7Pmd=+qBzHUuh8MKczI*%g4?q3$zrCluRV(QLzy6gz z=vCoxZ?eb*mPPK_hMq-uT?7&x3lK>3G#if2C!bq1Q9bRpT*)Js*!dLW-L2$NDuLyZ z?E>km&pv;%mqG$1fD#OWRM3GVYQUNnPAo>liKIdrD=++nQ2N7>AIZb~-{wgs$zc^EZ(O{SHptG;lAfwg5dq zoO1QXPI$+W*0pIG1g;A(g1~kAZN#tDJ7U>8jgHu~?nvkzDfMK`ZJ)us>Zvuot7>|Q zG3wPAWw!ubsEcxY13po30}V^7Ozc({TWAT^VqUF6Rv>v5p3HfT{YovcUCHI63YE5feBT{av<;^o zU3HQ+e1Bk7KO*|O)k7FTLxRAS=1%oyyEWKVz+0oKBTfT*yI$DlwQ{O0?Rz1SVd_O3 zeuwV8h)rRteGw~4e%n#cN*6j>^6nH(=`q1=QUX3`yGc#oq|JNe!rt-BKnFaYB{8D~ z<9a+w0{~Ah@b13Kv!%w)l&~GL-jCe-QF{yk638(&l9Aao8|)#Y-JjWP+RO1aY@T5d z^h|&SH$JY=#0s}`KxM0)3Lx~23|PjZLoCu7U^}jkSYRQ!Km!LM&58&avm*v5k6`Ie zH)=98hxM4VbiunS&ZK$JQjF{}{rs0=Oc5XxV_l5AfAcg8=&o?BU?Sjfgdop-4gsX(9-TuVz5-4B|ur zuxl7KJ7|@~f{<6O(4J0lTF)Gitgq_r3ASwjupA?d@_IrUkm2+N)c8C4w^lvd04m75 zf^$i3hD5M&vke}^j?r*38Y0K&Kg-%vCOH~2DZz|>%9ex+$+zbTGLI~Xqa33OQBq zPJX63w{|ZIUnmErcvnuq&J$SS_L-cM6}lu4)vtEZl1m5e0LcT*l5S_3jU`|h8cC9+ zj5V<8FWJcr&v@D1!=zFuK^;u)slh`I3(TD-nsGiw>|R@FL9H2f@iY}%(T9Xn!Pt^w zNds-xbAbu4qFo`(6HgGkY|({2Wj>t)d%IMF6j3Mxr`ZKJNth^DTnBljK!hU-(~ouH z*KjOpR()?4{OLKnT_;VdRmQcFc4kZ-m~baNv#b3+gV$N~-fCP#2j?@QD7n<3)ZfT9)Y z?I94i$(x|g7L~5e7%a^ge`gSt&s=+2zz z4vy&#S7XZ^aJ6vo@g*@UBfG5-7|=v_xa(;o1FtUsU?@4xgycDXhtu z^LntKS{Yp&1;{xD7IwL*nGt0 z82d?_v!ZnqFa$_NkD^H<-LlQ+yU*Xfq19{{TAN8JA$@^&S039-knOYz+ljURdiGXO zM)8pyt0*CrGoTP2<9D z8P9hq_2&=V(V?a2jaHu@$3Z{Lw5MKbm}=AG&A@S}bUC~}Lk()sAss-8$`kKO&muZZ zJnSflQW73?&4P0%y_d8Y+s^M>wzNOrN5mD)sR1Owai7ddpBS9ZX;}2#C`(Hb1y)`u zb$jCQbz?bn4C)Y)C%mqmhE~>NC(s4F(f~^=_LnGxyuSieNL>#@o0}KeSdY;zd=KOK z;^~xGUL|$Ri(EV{hG)EpU?%e;c-vwJCFbVEOSJ@dkLH=M2t?-2Br^yQHn^|6P5p_v zCHr)bUYI3wyw_8Y9wf8B&=z0DmXPF**e{5?3uCx0h)HPiE+n&s%kd+pI7*s^=>8DQ z&MubVc1H#Fft>kw#J$U{oJRR}=`zE{VTVdpO^W0#tiT56iW02LbRGmw?ooh-LYx`= z%xj*npoZz)cnbz3bV#OCh6X~a0?;A2-GGD~jce~y-%36%(;=TXA|hXm?Kg8Hv+po) zUT@~&>G0Z;wbe*7I!=Ngld#NR6j`kI3ii}#>cmp!d)ZTmo%K5HgQV%`Vl!2rIDDqh zTWDvgRCuDoZjLs0hi5@3hNX*;Zx(gHY+iao#mlUZ^kzsk(qtjkjH$I$35e2yP5A?a zn!VSU&w%t~#Ws0Xwlqs2kPbJeGP*gHG2c`At?~>{tw$yE2~n2pLX^3z$&B&;uqeY` z3t9J?g7*Gzh_WnMk*+NuK@|D~0urbVUNc=h>@;vM;lu=;gcqq+x_-#AEQ&henyWuC zV7^3L;dW&#+Ra-e_1<%mdVI<)zZ;RGqtmG<3;zFkQFh|t-@WAiENOX_5&p8%u+;yb zk__40KmS6OZ>ZT<`{K=8`t$bo=0(o6q&Y@GUsO29?KDZ(n`&-9Np4 zdvNO6yG^rGFCbs&?RV;3Cr|Ly(H zD)zqpbQXJV!7Yc$BKa~lQw}ohKNY-LX z|DgX@KjSY(nMvBOj=h)#&Ooo9`0M1y^mWG$-5WagVDdZAZAK%R5;TV{uYR`cFvGxH zx@8*2_L13=Km1IFHp$SYwv1}~i_!V>Kjkq|9uwO{kX&tlTRt9kKauYQ`A)-<2qLh5 zw8WGB&*Y0%zGxqeETT=4ZRj7FJ&lK-$<)(Nu1AruYSy557O6QbbSJpp`ZBc z{G)a88t`uwU z(LFOzPCE4}fx^U&SI%zdxJ~yk1bH=*)1%2uMc* zwsg3Nz8=&|9>ySadtsU0eX8L5ob>h9j4Z5V+Nd}pTTb)SnnwdSb8g{6Z;uqu0a|%? zs<5tyYez(|2!Z{E#UO7ukW$W_zoBH{@f+5qLD8J~q2G*5BavPS(G7S6=&IV}Ns|N0 z$7DlF3)|5W4XqVd1E`0R#`T7(p{$H z5G_xlMPf+@Ros1#&i91(7Qm;Au+JjD=*z^#&RIm2%3&f44wAstg7k=Ti> z-evW6>Ik-*B_S$-`qYy@0UXBC&kYzEqiy-OG4R!hSNDNr%~4rTz*lXb!cI13^L{6^ zBE|J$7!<0>N0U-K;%IUs*4!thQ!L1&_%0LefdmjMdolWejSu4yPyndbX$>CTNp-?@oNKJcah~T(l}UT*(;8s zqVn=6vLac#7rCou;mm}N*PWSpQoGzo5m_5%($G=C;;xDNMrpgY6CCDF~mgPb55>wm4^Qd z**Dn}B6D%YJr@%T?F3*8-z+w|uC+%_cvG2Ia`dVvzh>D|l@*Etwk30Z_FL2M?IH0HPFF8VXDw)5mW%PdIWKx zrtc!jNb4#Ej3TjAG8*ZX5Q>RDx_Wp1nUNS$M)Hv*_hs7YUBxva7HwH#e$s|3A3Du> zBqpQ_5oYe*l!f$y=j%e@3ad~|R$j@8DL;ep^5fxsPCy1$=W8UdFF_7{W&v=umn~fb zUBm7fM#vIK<7ysjZy`Y@j78C#h7~{TQyo15OyaP;5H&HU=p2504Ej!Gf&HF`G^v!D z=vtPz5uw=?67p+=N3-kTjr9xel z^6o7OO95-K%2XTB=DbH!ZjwPp>>|5o8ao?ZAG^V?vPQCmhKpuN&~# z8*6s?Zrc{RA>EGfIQpp;g*<3E#(G~?=+h5RF<~WlHqC!h3s9% z|0T26z?naD*t?aT-0f~i`t=~gV^QGPb}n=w88f56TJL;m%AMiUq`)sb8g-4ol})gQ zx#TJo-H~ZB^D0fY1M9hJ%69rr_C#pza=A@8eY3(`at|R0_pbk-K|kuZNsZZ1*M8r_ zdJ%DDW2JK*hAf#c1=8x1w{KshoN^!?%03hL4HNfBLjb;UH)o<0pRPg&0SvdB&;fn( ziqrC%XZI9ZXfCQHSzv<@$M(0lj$xBp8a9b3W)s6sfF{mz?2E6y|LnWBUwr-5{j0zK z`*-jE_Wsu&fBo^VKmGE~-#`10_dosm<@=xh_1AxUXYcsk55Io)KmPW^Prp!ucW+hv z{o(uP#JE*tna2i_Ay?954Yg=j8u(gpzKtf9?KIcg6!wHAk|uhk;Wuop(!EK-+|jP2 zGixht?#$6SEJ_(fT%@gWbqBWL5jW~r$H8fUDKlLjr&IKKb%61!QJy9&2&x1#dWrwy_Z!6vEp%3NEa}}67D5zg9;&B#YO8?MoZOX znw>_*{EZg{pwg7Zjqsad(E;Fx;h+JsN z&|WI+2{NbU1~_C6>b1ah@{(-dpIt!+&f7>b%s|xQxh#Pz2k>t0HZt3jPy^iXM0fd6 zA2U}cD<{VU0KF3fEBH=I=&8PV|Cs$wS!-ggN>C;ChavqiagZQsp@uA;v)tg{mf40A za(%eALkgW6g(Jp@3N*czHY00as3yszb7s`AkRp-^EQ1{OR$H^4{E%dDQGmAbm&CiU& z(Teaxk>$ZLl@jPmQtJjg3&1=Md3=Rd4yqN<1&aC3Pvqi+#iQCw>4gb%8udoG?|qgm zQk%AhwiBOMfAh&8$%Xk!8W33Vf*i=itP65+XY1k5YE9j~=xmJB~ zh?%;QGX@j3W)7+P4aJLVVTgE2nYp5nQo-gsV`i$B1)Fd65Ts1)t`v-`7u6A7GD13D zNVaq)**H_^RI<_67Op!Rx{?;dT-xq;#!9t5n-m~K%|YLb4>IUU*FQ=I-K=TVj9v9z z`td2|jK<6&l3`ObYGmWu473`*_9)+CIce51@(K%y7lvunxK%4I?{aIMxK*Gh70I&g z&jr5e2CP}76^{LMLt$5@+^y=i5enMcSdTqp`aHO5S)!t%mF^a{VI$o4UP@+WQX1k^ zSq}j=euEYqWH(RXcVQOdx-Zh_5fLb@N?&kN-EvSUWSD|d@WDwb8`CN}OhL>wV^$%826tCT*SNh`+L_KuMZ)U?WwWojBvNJk6#c$`=%$wpa0aW1^#a+^K3MrIPo%abA^GqXu6kOi9u9Eq=I&b|L z=^u@)@WC@D73^u_*3EAPTN{Ald@!2UYl3Q{5MV|}@X7Hmus5IA7=cPVu44oS2WDeC z;NT-yYT&jg2VGA3VOl@bBP(2RLWSPB;5ha4*$tjS4K6RMy-2+mdCO`iDW)XXBrCMG zYBOliD34hUY#3h4WZUcEl)?;vl*e@g*Bf{Z3K)3ANL%BbE9?nmY_~*PyQNCi;SdzF zYhsc`0G}HEQRF^+W)z46UMKx&9tt!a8PbYl(TIQ8#LeuMfK+Pz0IA6rk<=+O9X%P! zd6J`%1r7~QJ0wTA3mSD>t%1F3x1=W%ICQATQf*C$3r9iYV;3|vUm!G4T6BM+&xm(O6`%{@B zfBJpDLGCvwyBpBC`G8LfB#Wfda7o|(yC7VPHW^8ju&AXQk532q0pUqzRH?6xDeb#TE9wyU=$;vRzlX9d-mYrrq zP#NK9pY)b~*Vylx>~`>bgA!W|vz2y3g*_FC5=MT zQrcrIpL%FVn)YVMrm-!PVM6u}b|`5^TeI=Gc+p7gLfKq)=9DxJHR zQr2M9sQIWO_d>E8RmVrvVp5M#1&{7V)d}g6QSOP-P-amoGhD$?-J*mF7lske-EI@02D+7t%!Q))z(zilmnM~$`iy`-7OYCaS zfZrdW1a|gipd6)|HQNf08m_K0q3v0sh~EGocim}dgK(=p?nFyTB33F}9))DtI0!Z* zX9@&QEvmM`88CHQXtnK7vLzqD82v%)U@yS$YQ$gbw6)u`?1h55Ad_#UvN|W&T~0WK zE5r$SRY@atocmOmHWfJ>&=I}YKK5Sg2zF>PXFzhXCRV`!RPeLW72)sk15V6T=d2{z z0c6`0u|%$p9V9A2QSL^(LZv4laNGnO=u-6DE2my7wzDx#QHUZRriIs!(gjjqd+d!w z6UkN)O~I2H$w`T1z0T-@>y*To7K!2~a3~*YM;G*j`0Ubx=VQm<3ug06p=2)H)TqJ~ zk7y{=OgWcIW|7ZhQAa_vu^QtfmBL41B0mE!*AcH>!GxW*3c5}=CA_4tS=D+<<6CNHXUPB#7HL+EQB8+;LwY;K=@F5Nc>$B$kYL!l zVbnN4Fp?4vFJZaQorUw&u|W_pgp~OJXwpxKf}gjz8`n+hW8vzOb7?VTD$Am=jfp&1 z(zsB5(+64tWS%{{q(WR!k-zl2gr8EZNHa^Vk65V+u{29FW3EYiFH#f{FglTDSH@*n zkYgszu+GI#;w*iPa^%sp-U=ZUkq zAgIUj4waETsS+?Why^y1MLS^qmr|`hOR8xHIsBC-K`MoFg)4oOc)Av7=k#hrpgD7T z+-(Hfsn~mZ9?sXtwLn{BK|FVP9|c;Mj-U|+ukhK_cY)>s6BFgk(iJObwnUCKJ=1b@ zcYAb<9}*am8gWG{c@$_Db*M-tUSrk6D)|Rx$1WHn@}f{o@?}Jk6vLSw zlE~sVIVYDX`+m8|=A1AXY#X{?($i6&K;lKNbFgyVapCvP%S5x&N1vwKZCjn~sO@W< z$}i;NM&MJC z3;y013E>cvy{(lduC8FpkRDI!Y1`pFt?03NhfSr6)0=^~kN$e{W;2rWe6F?!M&6dB zaKg!!a`3T81ON(K;@S!+7gXDOo|5KP?sK79gZ``0fHOx&9>t6I&K`cFgd7la z^3v5c7gZfN)BPLO?oo65Ktk_sE5JJ^NoyJjyYLlb%49_G;0$ZCG(7ogWa;2F&s-?Y zGbdY8ITI{9w^?F%!M2ss_#XUlzHJHz*Qs#C@Llc)h=&;iR1aD1>UJxS=619DF+6xc z%l|7km$!Zyi1e4nBHZ> zSoafJRyt>c{EdRCGQC<~^fK}NW2$xH0re$eLUKewm08v~r%DSuh;Y&x#K0oGyT`!` z-!j~@09|H?5Xqb!k^jDGB8rR0n-I~;1%1$B%0LXll@2Nz`ZF7ld!vfPO#f`Cbs=8@ z`-zX8luo@NgH5kDWmDXadGarxa-;h=A^bZk1A*1>Y?iVZSqNIzS zhw+KOwCAZv&q0buD#CnRwB6QvUTB!xM=33oQo(wIo_p6AG)^9m!l3;VfAz68uRMHli ztzfH^kIKJtg?mvNfjmkHiCj;~DVGOeYu4Ee+rd?o<|msDc#x zM`F>6!PE$5Zy3!hZg_B?P*;Jk68I-z3h5iO>ra{VJqzLrJ60r^9P zdRxMr1v(#u!pf(g8;ZWtxJ#Vvv66n2$YC-S4eB3L{UGGm(()tOKVE*fW(;Sf>F1V# z4iFw>KQV#bh8p>3f$8T?N0wz5QN%53Y%NGH)CU8Gj6Ey8ug?k~E)I-F=@ zWbN)usps{horE=1rWtXzWN1550XzDF;PLRC((%COAj#d6D7Euvnej%8Ia<3v2{&N8 z%Bb79hDD55xmct>KOLW*jzikc@dAivmNjXErp1#YGuIXReUTu=ul0;W3#Le}3`3WQ zj`|tK7HqS=;WlNb5}L7)&NJ4l=cd>UIUTuK;j%GvGqTjgShGpUIas0Rg+AxcI0pI( zQrsa33V22kr1-d3Y_=w1C(>)W4D2eIdzMi^8qKN)$(kJZ0X)DPuwQ8B0j(6-gs=c` zS^_{j>NnGQBXBe%LUFb^UDBvAC~e#=w>`?WmcYG+yIBz_(<{_QL~j$*{s@fDF&tQ7 za7k+5kfauCScpA~2Zo1r1rjj&vc8$=HY0Q#`MJ5WL*h0gZRr^fv~_4(IK2bbNnzBj zlqBwtCW$}?OyajmtcbvK_ehCx#Zt4k=XOCYuC3BfW|UqeT{v^{KrAYOHjb0Y0f4hN zmytaZx(990CSZ zF@L$ir@7n-@)Y0(7c8|O$V1fXlq?uSqwIKfc}%jy>Jm{$hi>Go23ve~HD$@ms;+!c z$lKU;y&kSE+ZBGZ#T=&y0Ot-FrZ3Aq z+c{%CxdAi|zZYn{wfK0AK{b#w&6o*Yv#CWr2zmuRt6uny!KsadB1^qc15@Bo{9s4r zz;db1%63c26fUq^qzNGVp)ArR3}xM0zP;PUbsC;Q%)7r&ZJQq0mSwbScD-_!>>ff?o1Y`I z#a%J>cJ*?T`_R{sEU zKM;dW7o&6Kto%+nsVU}^xVs6e6hu(bq#mQ$1tn{@$?@)#aToHBM9EcAv6B>1PQ|+N zlh&{zuhdj5W2XFwkK!j)cG~U)W#k{yi-#1M86qcM3c%V%?b8M#Tw&ArL#L7_jWJL$Se;%_?%?TmL@7B_Y}c+%i2yD<;M2W-Oir_ zd&6pc%SnQ1Xw;jMpcstr38r?#MmBM&36B7)K*IGpK#rZu#BB}^W|-CDYJK2hb0}6J zNG2mG??KjS1C}J^q}n;x7W!aq3RB2%Sb-iSFibrUcT{t`miD5NfA4dkEA~GXrB+Ci z5pUaJPKG~Cap-msW|tpS~*nRG;y-`xkAn< ztnJX2iLdgCU|B}T^1ASnI1i$h?(|90;fpgQzgY322?|KTW4#Ni+CAoH=abU;dX@Cy zd=q66WNT!x2B2Fs=_A}t*d~4CQ)CX@z3C$6gEZE}QY_6<3~4nNoNH-eT#{(-%9nLh z(nt6hQmp0rai*w6D(QpaqD~i0t6a^=lYyzAITyf{y1oNz9Jqt}QnV~HwxI6?co2|K zM31JOwkFLb>24#0t6+V(J7e|$)ZZt+wtje)Y5=}^KP*COfGiW*@4TPAY1vm}OLzq`wFhF5FEyOtK>gKt8Hd;w@D)u!jybnFU zAi-(<6q1V(W@9C9$i`LiX?6AvXXNDeeKaR`Fo#TzJev^b$sW3K5ZxZ0*@N99`_J)7 zs|S0JR5qhlh!x@YHfq%N!@q2ZBjMPNC$K}j8B1I1m|gI+7-}nl%m_8j3puOEvK=M0 zqAusRMc(;fQ45*Wpqx+9m!6|t+$XO(=F{`5G9FUDnRkwL%t%AwBD=nZReD%e!vD*& zGqN`J<7J}u&Fa~-wG2a`<_sU5cTPw4NwNv>p}z4Op9O&TiA;)mvSjQ;dgSw?_}4)2~p_<#wBz#vM+IRIRTpd`-M|S5U>_e z$X?)JkexD;HUO3Z)Swed!F`I9*${_v5cR<5dM*WYf1mGNIbp>uMkg%eWZ2iMZl(_P zxajN$?6a%=Dq0CAQ?gdVeF<}4@)WC7%#H*ocSpJC0X_E>U=p(z`xkE{r#*iaYLNhp z5WL?fm0d__)lI{!RD^IFg;3Rj)kdZ8K~_NwRCmj%YzTl0=CaG39c4xk4k_RHj{M=+ zxR|Dm2lMP8+vKKA6%yD4&Ryc9Al!<9q)pB>velK41^R4tXz&>xJV_b#%_q#A3;BZd zn*Qb7F8B0Q_B@prF+H0_PuyVc3T>Y=E37UdciDHCOZ0KlmEs4n`W$6Z%hKz*J;TmO zlyu-#_f@hVb1dP(ZPf^YT+_Kj(~?}PWTv>bI?Eq${Q*`Boj;q3z z-YDC2n9IR`lr)4xDaKaQD0e7IryitZne^8vQFxb_Z58|q!q5^%F`p_C=K!b}$B{YW zjJR?Tc2YC93|#hyJCG$J4F*A`eNFi^-Oq`kBdN_xW^@UZgxa-af06ywIEpjl=J$tW z*=XE2{`~0I!LSIW-^yPY0?P;P^A)^HdN1X1g{Cu8a0?7E(k4s{xQ+2V3CoQ!Q|b(a z+^~5=ryFG#JW3iT=90}9wdS0@MNrVyw$>Uv&)I6WR#r#L78U?kc1oJ>l*;mMwQdW# zk7UqoeK$LT4V$ptG1a4&*fDIIoz6qnISuBSb1L#JRiATHkBX!7&ZDm7?ad1pi@%3a zD$Xea7_g8N1h55e>1dgS=zC?$Jqg(c0bETJc!Oa-#t(NDS&*$B#2VSBWRv*7isq?+ zbL_O*BLu?T#to;w&69p);>U&o4@hGV^OxZIM-iU}Euw0Z1guGVR6Ex+ofDJV*?Bp<57~GtE&uz?r-nH*vx$wFs_+DGOM201upU~a6qes>42P%NU1-dpRFtb zXR1Z!oM(Wmoioy`%%p9OAfb}#AHph?5T>ed4FQG`bOSvTAbdH4vIu}z8bRg$Azq-0 z5Hw4Gib~KMg=*dazv11zOn!GtA|MVf;{J)hcok<(|8C1U<6l`qwiVb~)75`e+j>jK zqa(?e(uPr?`43z?ITq{DVfiv@1(;U2KBvys$7iF9h-fGVr67%YIvY8VdO-wiF9Wy6 zhvN}RO4fPx!E}#@gAq)?qx#?+xTSOcBc$myH(QLeqbTAaR|UNY%+ohCYK~HUAU!fN zHfg8V{gKuWw8-`WScRCSC={*WkfgRjYKt#O$pTXv)-|~$Er+lOjIh75G^mfRgXla1 zHR>F>III85Ws+BQ@45n>^?Bhu=F${DoDPb~JFOsQSnJ%|78LzOA5x&n?yL78*>unq85zQ3?#96DFgw#X+e>?KE*MD`l~URXD#PlFo^ zII-R8y0(#6=CidVRC^(DzAivWZTq zH!t42ee;IInu#X4nODKKGJr0h1!C;7GD8?deA`0y9vO5a5EHkY3NDa1xeUbQ%K$Oi zKH>=7M2Ih{X@TVU;0GmTKe&yuUldmt@5P)I&-(gLpMCi*d|*v1WsmH2=AF?CULXam zYEp`T>D_`WX2ImEiRmbeT|}xnFIZfb5|}o{jNwT=8u( zmr8N6OqoSAmT@I_>6j0*S)@kOrWL?#VWn5tRCBwzY;ulio%q}P6ZB^Pe3l7 zHq6JHq6+le%LJ=(O?HlFFz12aWE|hlL2v~nUXEB5Qx(b^CS5B3Uamdn6^8nAi*Ur_ z#AL=Ri~C+ZBLhh469a{wHG_=11+d zpDbCPtRdV+m0m5H9%UORUYf|?R65I6>VRGOTIv94&Fa+++6U^_@~)Za$&62_wfNZ0PeHA!5oy?RMfmoprbbgu+ooRIi>$YUPTElLi_NHsQ; zT)}aF+XL9R9K~SIMZNg)oLApK%Ub4h@V#C|I8?nb;tL6!f)Vh@KElj!BBdYzgcaW@ z6vI6{&3Bq%E+^{ICFL&ef;nykGh7F|w<(W?a%3o50VDNUS7m76!8lG~=u?<(19{kr zT0FRfi1?_XAa@y5X>G6yl)a<>gn>PKGSkd6Da%i%#5)Rgn*U zIi~JKWEdz)YUT4>f>xUzsieaMQP{|aFa})9YhF4*l1oh%zLNryH!<@8p+LTQI2&lO zIx)~)fThAA)YPbiIY0Bp1_^skf)+zbnN`)?&IRYVVIk3KSj`+c93Af12>_&UGv31} zQfxoJLPUf4b$iC;K2k9>J#KQZ&N*c>LW=M+K34tH_oPe(6arQo}W2E$pq} zJ+=)VFSF<1(f4AxMemiWB33$xag$_d@~E%%c!(MMoMVql_GqNHKJR2wi4N?3VTmx@1@(m8`z&Yvc)FC9L!k#z|3+W=>N@u~NY|@Z_ zq}WB?oTZi3i)=F?ecKw2pfvrp9}BitsVvw}&Dg{7+=yJ^QN$VISaKrLG#z{i%_YEmb zdH@*~iET_dPrTH(Kz-ffqyp|x;J1qc5S|eFY=^W2=WGH#h1X6Kh|vJTiDWJa@#3pw z!UsbJy^@KGXgB1${$Ek_2I3{0>m`$0{V?hg&Kl}3kq z9vF@8{n;c1(yEGnO$R~zNLfbYfO}B6E!FU+Tff#XjL_sBX5=_ zS2ED88iE_wl=|YpGdSo_dXv?RZWShycNukO839dF#}5ydhQ2r1!t`EI)6?;z*<8@mK+?Q&Mjln4h~&O}VZC`@L-7)arhgO(gwK z-gQtaNYgn-6>8b=%Z)Sq$+wDZNj&HI6XW_-)9&9VQwy4316ZQmU0dW_?#@=`2oA2o zHO6*N@S5vCfwTJy46=3bL#9D(;RR@}Y!mw@CAJM?fsA8_gNk$(3c?ikw_T>8yp7&`*Wp?TEiYn@XO>CP! zYg8xyaqB8zGRhG*@mB4(>G7Sq7%jnaYCf3qsaHm{Ib$+{NzYA2b9a}_+Orqbf8R@v z#Re(MTmaUWrpu{`yV2~B7kilpdtF;TrFDM(sawyY2**meE{a-E+ut64SP9pm4;^RC zZE6w>RsATi0DhdP1oz9Ev4vTj;9S{6L1B~S`qcB6$AIT_+XlXz!>w>wYtfN@_5`NUThcn;v)Z>uzq#v19q7 zZPGV&(Z*b~v*tnlle%4R&RrD!xaCYAuK2r37afd3(`sr)UAo##U2X1NbEY#TUr*|7 z_~@Qa{epC$)FaBXxrUpn{Vpa1yt`)|Je8WcW#_x96IKl{T=t*<7%_#fZ?^~aa$#pgf%&kyh4|B252`lt8*{_ih8 zp_3TvU;O@?mp)&eqK0~jpTotYmy3V-`ZfLO%THgu)Gxk%^Af{)vDEzPyU*W#{)f-r zz5Vvp=U={~51+mG=F^wjU6X$C?fXCe>Fb|iHGNW$+x90UF^3)CP5_7#VPb<{W7js$WKI6`U)i;`lXnA#9wsj%Onx*HWHCflJ zQ+NPXyJ12{xiyF*Rj=z34G0a9=b@wP(oLv~&Ee)1UFhPpUp;CfNn#bBPhqz7RgGn3 zZ66Tra~%+!)p6}lOBB6)U(8*Wlqa<+)+e<#)ouaZLO+>}?UGK{OB(bt;g%96j;D^e zVoEr1drufMlGJsUMZR~MWwG74!RVXVXBn-rGRu^APo0W~_sCO6wiBK@x^5>1V_;|u z@V7{Jt0QK9#!1ye=+1Hs1LZ@LW8Ugaax5t2ll2d8NQ&ufjq`~XZkZKcM?zsab~WxFiE1ABF>WclQ;|cN@AsnGj|Pc5NG+C;!c{;DRj^fW&vkA2s8X$ z4RXvtj?tPXxv>*tCSI*MiZNQjMT|ihS21RA4{D>2`-t&r`(z)k(wZY49`hVOG8}@O;C?>Qp;D7;cx|7TQ|ci*k+5r(^_##b1U}i zx*{@Ywi=$A^j$-{3*E&f&*&SQktcy|daFa;Vi+6a>4!PA*VpF#R+D&jZ zpKd`rZiPN9j&6oe7-^c&62=LW!V9wFbzRY!wP!ic^TcDG*gj7*pUunJ0*x#SV;y6b z)ltM;3W|2Y4?p`DOr*E{`r++^#>s4apymAS+Yf*I@!$UZo)&PORRN#4|tTBl7Nd-~aH-`w#E`^!bmke)!=a_2~20pMN?@ zKZ^-#E~E+Brg#Tdyljlr!lWgms`NIro@nCH;%oZ6XhmeC6rn_uw+aZHIzcGeW++%J zP|~4D6tFN0tvAdu!&*-_s+_VcNN6T1&#iRSR;sB$Ytr(T%=$()ciIn0vSNPVZoMj+ zhV}K?9Nhp(5Yk6nJ8#6SC-o3oE~}+F+{tfJlF(5rT04maj0)zGd>4}uQV2pOHM=ew z%Ogd5Og3JcRak}yJq4py@jHC)|Nr`wrW?+7*4Gx9?G&Fg(=|Feb33pvm^+s z-s9E=SOqs-={)Ap$}Y;fQXnUL*pbi>F{+pLuuH5$`aqWNN{;G-9Ibk! zJ<%i6H7)c=t7Fw8Nv$oy)sk%ewQA%-pt7>VGP3(T0(M2(DM_HhGNP8d)3dUbm#j&j z5LJ-o)+O83Y|wwxxBAlGy?ytZwp%)DQAi^Fq78f0g4%X}|2?B}02C=0@ zc*jA?I+lU7sghy<$>VdZy%Ssktl_l@>lOFTB>q@V(U4D?SzCcR2POAR&BzjFd~7}V z&S-e(@mPG(Qh>S<`W-tKv{>2w)H-Vxue7a@x}>CS>NmW+Dq9R~enx1VbP|XN)=kYy zb3VKQLn<#UdTgd_z)qTe9)t+(k0NsL2wE2{u6Cs@GpNnW!T?7$V-<-;ohIcp4zf>& zltqbzx~oKL^h=O-nAewZ3R0A7xoO z1AqZyyPh=XEU$AT^CA>~cHfeA8D)+SLLY+L7Ng>DLpHJsOa{MAtb}KM)aA=?rKZpG zzNQBK7H_1@KN70gD`fk`{EL&lk;p{bygZlc_mt1_y(YY|H+}e-?lLD@BX1sFJ(xgd zdW0x#!rLSf-XuYmimL|NO z6xxIO%gWAHYSRP9qtqrPw5r6;cB%dAotPV`P4f`SUz-;(dKO^e7L(#u7X`3#`>Y^& zP8u}JQBNEw)X< zM3Tt{S}irf>WyLQ}aQh)-->Q)K?5ruL1t1E+_LqW-kT9zy#8r|B)c1L@m@x$wi zyvLLFpNiE$%{*>Rnztsmd~CWUjIdR#Jh0V6Z9QC$rWI|(sXa+b@=9)L@V0Qf8tyt)Tn+g)>TD_t9-eWCpa zai*(1NN5DDtmiL6OvkH<%}Gn!QnXOu_nwR2efRO63(P21ld~FRAXM0-T2wcgYVxrW zOu{SHt|ZT_=2$5yRMxOgB6>A^kAs<-`dFx9 z{kzW4cVFKiX-My-TVS83SNS}WTmnceYU?6m?Jwr1JTfg0abrHEGxQ^PGM>^Eqn@5L z>H$kIMEGE@MGvOkKy$#2_l4@BfruHzNQsS=bFwYf-=sLAtM#nl`X!wVV@0O3wMw<; zXRT4Yr`+lB2A-oUJI&MZ0!YT2r1-tk)^Cz+?-lnNpLDAqG5!v3)lEJ!Y-2VxM@Ng9 zVsaMU_0fqXhMMQKcP--gLen*fhlX^*>J`$8b!s*0DNxzVdCAhkd5gTww0XzoBF-EM zvntR+P#>WN8)%RVnd-U%teq&pK3fjw$7|Rt!1|ihi4(Xgz$8%JN&(h>Qh>kw?9Hot zz4uY2I9#(^D8)WCKe4LP7Kfi*D|Q^>Y07Rk65OGA#cB>FQL~leEexBh_0TnVb9L3b z&=iMo^KEGu7_&NXTva2E4bjmRXoo0$+uakwE3B4Tgj}<_9DIwD-Xrch=sn)lco~#p zXbFCp^fBSVvVksP*nk})UCzLT+hs4!URLsKVv|2gd$2HTa7XOeAW$E+V-YFuZVR|m zBKIGJH7zeK0ltKG3HFUjI*lz%?S4P-9N{rNn*1bjP>?JF=yeDasqjVu>!j(CxstaE zQidCV9kB*ZYh%r1fYWoBIG8svvWrD|U92Z+R&R^*eAkY);qIxhjHDoGHs})KGglv<@=CG2dETK3A~~m#CQPw#MpYZILM%O zR{w!EuxL2xl9F3%h{}BZMopYX(!Vc?3!ou%@xqdObjv zCafU*$(!M5F(ke`Z6Pbjl3=)^ZYR_C;l%z1oNHs7{3xMWz=(q&0ike7BrD-{pq5`C zKI>&odj_|DRDKIqx3>_@>KR1%wHNRDi@yiRRiqbhkxQi4w$~jduS44SP3Z-&w2Ycb zZPeIJvh1akZM}?Jzjc5_f~}Xd%84u^Q=Ifj$g-Fc4TEFMfgwYlY~QX;K4zxpya5-G zsU60!811PLYX~N#MN|x^)Jd#aeJa+pI>S|Il6pspMq0SrN;C_T|DZ)WD`*3KRn`n5 zjU?SOh_rb{4RZrf6P>p!D#+YOBk1n9JnLFVz$n(qfzVO$_uUyW@U=R(6>0^a$WqYm zmQ!5@belD772nVWK|$_A!-QD16KsS3XO)U4M z1Z|a5m2$pI`=^OEBn2dPiSV0EFrG=PB+ZWD1-WG%{eRK+t3+E$z{As*L$on*&_ze< z4PqTlxD_Ci_IV@RYCvM)3Jg`cX?OrxylK611tRJ)i8poT3RK#kLgC3=J_s-SEnTd$b!a8cr|DYZt{Od)hleY_^22PY1gMWga^l2GHwgmLTr9eGlbodSc4kb0hmk2z~6(`rVxQ?{vc)e$ztl}{!VQ>^LjqgAqyaMVc>p z=QJFE+PiG%ax(Fx@yS|9`l$K(-2AaYjks6fXKc|gGe?dXm6MYM5xQbK-=Bi1(C}Kp zG;6#BcWjZXS{uQ;L~cvCB&9`~PCz(J(sV*n1y}h|v&9SaCYEpkV6(ihD#ofBY3J>D z+Y;MGfU6~{GuX=K?doXKPEe3^EfXxV$6r6Zy}ZVM{O|BTJ}7^Apy9J*>2;(#-ONSF z|En2HuN^o@{8V>8Sah0$=p+HWPN~#aJ3->DkL>%?R}&;f+>zzc-cGXWPj8$Qs+0mLerU%72KcB-B>bS zpmxz7VM&M}rFCpBK5h=39M1M1beaB~(_3tvW02<18m-&5yQghW+xFMCHEmndwr$(C zZQHiZY2QBg)cJ9%?w?d@r;_ZwQ?)C3v(~d%j_8nK*nI|4m;P|6j`*^3$_= zxos(Oi^VyH@Bi%olD6*bCaN^fEGVp;l@2+hZ0Y=WR{rl@OBd{uuZpcF;Ff#;pGz;6 zG(0S<-8;z^-8aOrdIAk zUokt}@!|C3@o$nePGiL|n!M+dQ3rwZ6aKh{z4$>z}hR_)SzZ zRR&2%_U|0&B@b7@qH(!Bp0ZHq(<)#{)@K4X_Gt~`QN*PmlK?^2h9lY4uq6bYUOCYAuWEX_Js;axvL$UW(a!(vpxPZKr+H+92F}MSU4K&CHkjf?Rc*jUO5~n^d~7|7PcrQYVLe zT}zwK%kE`fCgsFjSCKrVY%1({+a*a4=E)qagmE?ju!uM|dR%h@zPM#n#v5Xt{OlMEVJn zA{xv$+nv9b0eh4U<*ffY_WW}xxNl$dnt1jhD*rYO>AASYLEJeLG421paIM+yD%b1Q znA-N6#gX$NNM~*n#L?tVlTxl`JuKRL3TSF52LGF`6KNDT>{OgkR)O9f~|v)bwy{(Rp&oNau{hU&-cH=WASHDs5&AQGZxj z7>0Ni1eN=xV|#OZW!|n46im|`(aXw5dukZ_2lfA`DTOyC#THIYN>WluS>PoY7p5gO zBC%u`OalCg;I=Fx<_T50we$ovvwE7+707E zEXi&CpU;wJUtKbDwqb}~u-LI;$$kBMkj(roT2Aw0FN^qDNW=I!Gd`ye4qiqSda}kU zXJEIv>=}(A-+*EAx5%+fPH96_P(U|3B01-QQs*&3QXM!=!ecz#M}kw6N!F#`t^L5b zdWmTzoZ}&!!Ax`*KE~P~(~maOGt2ArW%;zw+h;(3ttJ^<$gmfNc%ihX>OJ#s+;ErO z;F$g|(F8uGIA^TUnNqcz(mZE|0!-E}+Cic}>M_`<5~T*&3>F~IyW;2TST=Ph7~*!m zP@j%qaxp4dtgK99Y1n6XybWb;5)u%PZ!ExH|+%F|rssj$D4RXegaP zNgCB*ZG%aNXQ!hs>t6(H|PT>QIZo{ z)5fBl7?BKMjiWDOQR+8?S#0Dph)mH`Jwb*pITjyPxd(t4n0#^dV8WuZQ`P22ea%^i z2}4bSd&N(~h9>U~Il9_@(m=`Dx)EY|jxi%#JOyG85Y6|)2pIO#KRnI#!P1o)K$+KJ zUaI$^tTF+p4GM%yl?=a#Mv}|IT}W+l7ct}66NP8Zi3R%)()L`)lK2Mp_n?!SHlzzA z61H!%jbfE;$Sqo?DYem@CB){Nc6l8xfKhk zT~{K>%=4~FtC}S=2Ic#0U!>;~1to=&{b~(WFOa37CsiLaq}O3EB~Dh}QqpdgXE{|U z3k2H$K^|D5EhY0}f)73YsTcq()hI z;)Kjj3yCGv?nOgNV}KuiA4mg^q;9zDTtfWov)`fJxY~>IMLOB6KTclS;xO706WKF$ zJUQmosY+ymD4tePS`^?)7CZ+CdTZf9;X|c{!&wI1Q}D$zF|ymIXLmqbk{#kS{@8eJ z2vICH_;@IOioF>GIK{9U5v(sm<=2|v@3muzAMzUt>zmV_U8kEe76|P$$$Y{2qxgM) zkc*{+utwr?o!g*)`Iqx^d4&r_G;Ez6hc4nt9ssTc5sM#80wrxWZ26CHD7gL1`!!79 z{RNCo#R;7PQMcVLCR%+omo3C2z^-<0u+J49kg@A4usK(_c*wcxZl?ViEXAA{fsu-tO<@(wk4UAsRs(g_2J>f^d|9xTT-d1 zRqo2Sh3*N$r8(|RR}-ifU+5Idv!FtuoHOxCMoyV#-d~){fRr+%@gcTaD%eN2fCxpj z7!6^bi9=MYfT(LkzkUF)T9V6F%d|^nBl32BA1g7lmMQ_9^v<4#N=?OGC1?a*uzb>p7y2<^2U0w5}RRIY@Biq}smFcD> zq!@M|l9x7PyVcT$)Mf05{O%uN9g6>MwHf(watj9>Ua-ZaJ<>90)gL~Xmsx|F2$gX! z#FxiR+n22k>l)u=I7MIsYr~3xDk|>vgQ}@Et{i4lZU)1J1%*~*mh+w9G}%e>C&~8| zNw#9uSnT(RX%44_K2Ush=n?Jn3|4uc0DYjH){!)tcqU zT9zp!m0c>an^AE_h9lyM$iy>SKd%y0$gvTQ6JcsKNWiL!Cf0>Hf55hxjcVeecdWF~ zkMos|i~>`E(JIP+U2f%K+2PAIre2Hyi~-u!ZSL(d&LEVt%9(KvJzh~@27yG^Z&wR5 z8eGhUCU|J~)T(K~QW~ItKp*9@j8X=^a}*lbsM5*WI!p*x;X&^WoSsG&je&`6}k(S}IS@yK@5*boFj$0dg|0&SlBw%5(MVIeDF##3g2=PV?gp5>+}fwdb^n-M8?X3> zqbglRL>HA*JX&(LcsUwi!kyHdRx4G3+aDI|!>P|)+6BsOKr8K%E`Z&HWaFKVF7pE2 zPsc(yB*Zy}&ng4Aq~=fbEAbsyLjVw$k)70WLR~o{1#X6M&6dc)exOYpxyMU&v=NOl z^e*r{-%98FP^g$5SxU2Z@{CwbL)19m53}xmsbb;+Qal6EKPAh2*8pdw*O+DmYtjWQ zW;LElv!Il5Mo@X;gG?nljbkJ2HsB};j2UV;`%KS9x%WdyxAJzaKz4DZM%RHX8#dSJ z`~H3jL`<>o_tFx&p6AQ+2K5f^n&rFE%8K6S*TrwX_mvB^o{!hh5RdhD*7|Cab1Wdl zwm)vL^_dp_Xi;e4wx@QHm{?=xYPrH;Evih4a2)dr6@iPROLcFezwdo97~gq#eliaa z`K;3bzY)i$=6|x~cu$6j$bwlqB~01mu`ojZX=x)zsN{kGRK}L|{?+kNuF&in2!4`m zkul`@`G8Lga^QMUhBDAxjG}$3g~}7VfssVa4>026&O?T`4;zcFww?$;I0p-*r$D}@ zm%>1mC>q>efmiG_0M37-&`H+|sg1m@H#YRbQ%Uegqr_uFSg*{p@>2bdFuZR}?k=rc z0gM|wYGW`6DVT(ueGPGj_pW(W3Z^(#AE*C;M4A zHg*$`bif-bMFzc~W)2r}%y%kO7=DPlq%-ywPm=ke-T(ej$M+Nn#sFQ$D_3xY7rhNi zDYwQbx7EZ;_-&$*_na(IRy>r*fkj}x0=4!VffwyxNtYd-fDUc|@M@r&VAKxQzE|uB4)Gdx>JdwBaWu6ey1p36_RQu<+W>xgq zggnn5mhU08dUKK*EA%pH4N!oMe5AF2LUGC_v zZemHt?ZGceb?W8((-6({P5Jv}ra*zb;t&X7#ceyxO820_l#GChckCyS=1#)Fet@-y z+Rf}mTyD0qr@P2}&#J$wA|n!|q|QI>4`@u+y{aQZgH?n-=Qe6xP6<~YTR9VN&sAOH(HGzBOtsxt8rX)drVPV{|F&_$t(`YI@%9U%MU>k{(8t{Id>Fi z@0MfqruviH>5iixBuN%RxTXGqh}A_UIkjY(MTarGK{8oJ!lIxM?2e zuD}{h4aoEAV7Sprzg2QOLAEccDb%%|kUR?BR4s{*t`L?XlfTzU)yUel>^*N6waJm> zZlPoel9#ekkxO^&BMf}jlHfLckF;1m&2F-#_Xgv{n5^x#I30-IGCAqHx4NvEuiVIG zgMOJJzQT&GfWa^bJHTMAmzKiHEW49V$|o;d%$Z%6$VXqpLATwI+2S4n>qKVafJ?Rs z08M1DVCH4w@IZUiwltrpV9&AMWNKzQpDy-k?_Ibunzl~sv$mnxVP&7fd)tCGC~~J? zobR!BFpaq;z1$GJT?dWAf^kaEqXk|<#{L$!Fx$AThZ0wdJAiu_BoC(|ddMFU8_HwK!Ej2EucvphVJ*>x$?1zz9VI<2BGMJ zFxG{2eyuxw=ahzInIZa}tKtM^ud=_2HB6l4F_zn~(;kC}O`Y;_3v=Wy5<`lj;t+lw zd~<^0&Vg$v4;i=w0kRu)r1q?=*>xO+0;K@>Bnet>p1dzYuDTA)H;&Q-oiOAs$Q|!7 z$|7AqEJ#(tOgaaf6-%u-Kq4VfxU^~-YSn|PkM;u|7$;;?R^mF;u!Pk=z5KF05>9A2 zYTcIN^O$j6l3xsDb)=9W$4U<~PlErN6@Zx-=>QIiO^Q+K=W!ge90Swak+Biva!j$c zM{vUF$dO`hx2juhLUGUWG|EqYKaL(T>IgHrPT(C)lqa1>;rKiyO!&uO3ss8djMbfj zz1{l|+R>bhrs&GVJO$*IIY3vOdbtf+YX4<0aEh~Pf;vmE_r`!; z+I4mmFF|9Lkr*kt>zD#N@=*u;c~Par@|u=rxLl%wiOyFPevepf60cNF1X=bL@v65} zra(!p>1~GGJ+YS!5Z4H*T!!A6QJGkCflNWkm4;+^B%``67zmb1SCj}r*RIRK1sf}h zmJ{8O_TOTPg`DWEBvH|8Tvt?Cx;P;|H>U*J-qnH`R*(&sBA5$WB}Z4VMsoF0Sok$5 zq9R5sR&Dgv_Az)hXO(3uPF49-rZELv4u1h~7Q=@CZ0{QkeN# zp_|J2f>CR2(P82V;V%%*y3Lw0=_d|M%Na2_(twBm?2=Ypo0$^wAVvx34ibyB+vs~w zC1&_pW4XhpBK>xs;ZO|0BKNq_G2^}2!ui-8ZHERqiFWZrYMI=p!)D!7Hsq_K%R1yfE+BPimn_L_0*8H&EQX zyT~f_CTJ3XT3x8aC!>NY=_{(uvKqFzT?ad*t>iRfq)mWio*6mbHB4?l=SF;lqE=KP zx?7y79gsPjU?-@np1d7wpn-EEHgT_p2_QJso+35SLuJ6Q>YY8b^EQ$JA5K&%g|lNL z3o8Ew!#9%tEV?)~$|{1=+>ZlxWf;L4;-$!ny}t zPJ!t1J6Vn#R;4)T`=WpRdTTdytaxk}ns`OHQ%>;W_xLjA5@7)u0SWsiM@D63XiM** z()PgThLNWXP<36DY@PXE54eBbad+1YC&{WIWwY_noS@AbLFg&%1PAZ1VM}tD<5kO% zMsmv&>azY|2~x_gsHu8PQy61tCDx3qnx-jE6h9yqPH|-=lT3)IeI#?x%R?Gbv>?`( z@H{f?X1@v5XvJ}~vx;$VjcBIhv5cB4z$OaZUk^c}mq?`;QoBlvW^mhzGpzpD-nblI zD=Lf#{cw(_HV-+|-<(Q}Y2`NRJ<%GxbXn49ghUYrsa_3p2zJM(n#gBZ)A7?dLyBfb zisBwkiy6>Lv(}Mx^r%47cJQuU(a3ws9@swe5FK4Bl6Y;X6$~%B?zWzsTT|2>HEm|v z4X`rm>t^qR?Q~A=vaB8k5L0u9%w!zpG#p)Zov{)NMNTL>Y9P^s)Qdvw#>FrW_-nMR z%4LBNG+4C)I7B#2bnt*wcZuVOBimL!{ZNU4BXu=UNx9U-1D;YQdUZrcCU+)wbnL}l zUTButl}*vi-?wI0%hT_z4%->ZO12~#24u?S7-cQc^OdmduH!VK;m={oL$4mNIat;# z8~2tF=5vthEMe9@h!NMC%MWPCHP{?4(Tr{h9#{2izUPY+(k*+>xfC?=QdyRV77gv5 zR)AQUm0EMn z7lXmAq0&jr$5(FmT5=nk-X#I7>fb-(2A%^I_g%_5)|~P?&cIOyoF>=OcJ%0=WFZ2r z@fl5DH6*38`;8Ikt4m(u*D}@{ojhubNi#88ulZu?3na37UL>-1R!In3n%|<=!>u1W z4suOyu`r~dreF!~!-Ct}n_i7dmCV!Sc$!Z(llw7F&%MvuieJ-P$tev^I?nzYdi&I` z?j)>lV#{J^${L+)WiCwI0;vp19nf%qJorl^Ot1>Hv{yRfeJwL(ST z=|~k!8US9`6@H3-W@GCJs0h6{$BU3;)=F?DwMKV;s8aBfO-9+G(n3{FCY-9oR$-I=huWT~(hYRoBhj!6VWi=me82bT z@*#668XetN=gT>#O-Uv@^^o;t0N?P{3$Jp5p#+S{SM0Voit6H^@<|aS3yBH@MkQ2| z@Vo2TwLsh;IA`$Z@9)PdhPZXvajT#$y@6q$j>*lZHUbKi^XKXr!bfWPwT)5Tdqf*B zyIN?T8HAMiMZki@zhRXplsBoJWmpX*Y!ti#xG)>}VXllHd=6_11ZXnmYMD3Y+6tUL!HMszfZaE716MKwr0TruZcSUivJP>V%sFFi9V z<~$w!R&&7Pd58ON~Tfrm+4$<46vzhbk_w(P`{(IFO{ zCL>v4uCdGo@#IP_;_k@Mu%%CQ0BR7v@#rY{3MQ#ct(~uqjHgAKjiZc7#KsF~deT}N zu1B0c@tdVx!ndVZgDT#5WrXY@^KGC`;@P#LX^k)$7%!q?h*+5fUi!Dpd7x>(?4=#t zD%?`)mLZ50;#la6_8c$Gx+7LZossSLS!q7C3C>SK2%1HC(_A(sRmTNNT0TTo7${t_pSQ!wkhK>iwM zY#g9l9YJ*)*~NI;n!He*1Ci1#E~a<;dt7B_!$fU9(*tDh|6Wr2w#-_OwGX6R9If!- z`DyaK+_~&Sj?Q--G;06Z*>O_ISzM-eB2Nw#_$LlBb}^{>y9-GfB@Wk4%}>H*<9lWm zaX+vCNBcL|KJ&{GQ5Pta>djLXhS!buuNgJKLVpz@)KO|C?-*!qVGs7Nfz;hn;X%s@ zwHH`Q5(;oe@TD`C^lXsP*xTHOSx(ZSRjE4kpG5CM5`8)b;zxY-dw3lj*|VakP_^?& zMnWAjCPORZ=C+&f@G-~yp&bkhJ^@iC9|J%0EZdd5QTZE*v=kq#zgjW3g&4(LN{B>q zQGpbfy z@7P_;Jj7u3?RN5D>DgZ`it?Y(5CbORj`p8T%2Q92R>_`MC_n>hDc9nU>km%noQn&B ze#Q)~MdKT;vh^e57_W&fpHCJwZ7}M4Et*d5PqZ{YNYna`R7e<18OP(fQ|SJ5n_Y7d zG*~sE3+`*m$tLUYOwod4?X&VMkiftkB(Qv+BC{WPyW}3jYJ~0~CBmE$EnT_P7Si(B z@HB;Ft?H!$H65(9wUPjvQZh3rIG#-D1nqi0rG+2~jIx*~!z+=$n3}EU+bw509@Vrd zlSfXpRF}%0?)3mWq&?jTZikQn7XA~VX(^HKusah`9^V4TgxDrnN0`r)kPguZW9g}M z$p+lsVbAHXj+sN4YdGbpV^%z5Kg4+AZ09yQqpv20m9yfDrmU!3P#8#1zI>CHJ(mWk`<06gJl#ltEKj#jTeO+|uYZ(@xBaEV_h_+Uu)TqsB2Ycs9;E-(JWx{#B?QQ z_KFV$hx~O16+*JRx4I)XAd_0<^icBXpy^?bN~+T+_IDlH^x~T!Oh=SWXD(q%Xoy|K zC56LDW59HG9RR}QtSfx8p{FKWzEd zDWZa;QYOh7QyR^Ijvq_|zKS$r0sl=TBst zLWM;0{>1H%|B6CVQ9f3@;;sjix%WC9eRZoQt#!d@?G?YTf5wmHIbHftlYVkjXMPcDZL#Ft(Q)X=8 z;>vu>oq>7l(aGk2G!k`OJS%_Q2JU#&CZd|7)TO-84nrwtRHidCHY#R13?FY^XGSZc zw#cxenMf3OH{>Em^GqkNT8<=v3)}DcnLtWd>Qx(f4_IrF{{NetC2uxJ=>EYYItw4ViK^2h;Vx~C)~-L>}5X? zVyym>;1Aw$e7L1b)B7A+;HGloE2ZUZ`j1M)iEYLiKii{vl4s(@ylIlx_3o0VtmhWd z3|Xu-C}NK)hxV&LG_~0KGg>WpnRx|!ryF0iMM$P zHXGUa$HA1{^4Z5M_$hQMQ>oLSNysG4O#EIq(KAOo7MKzCioHR+%@8> zfE8c;X6kbkoW8%PZu{5DX$0o;WJPgcF4SPQ>E}r2Ic^|NGMfK8H~+Rz?rP~|i}CH{ z!?d!2^m!wuRAe9lml~hc$$WQ3$MMeI>r_K-xWPzyhWtue^8M9qv z|9w~TZD1!+eT}I7|N2n!bde4INGJ*0sCEvrw5a{`_jKnW$DV}Xi44IuFVrQW$mW;c zPC>gZRz^fjhVbK!hTJmT3!3ji*jTICs10N+#lksZLn|uFkwIz&nVxU=F*-q(OY_k@ z#;86EY(EfYjXN9!HYE4IK!)C|^4(rnN#Z6#*TDwwjg zc#gE-b6@xhNKDt?u)-1B+iFk-B0j&BgjK~MvzF?^!QoZMsiVsTs^Vn;S#&|M5)I)^ z)LP1+eg%A#1uUzeVIpcS{OcITlvFfNE==#;r!Ec!x@D*RFtiEfp+=Z5l{@L86I9rA z0}0RHoBceB?e%*ro_*2?jRMYYFDd48*PplB1-rBbWXS$D^jf*_zV2n{L0EYDr_+HP zeJsRE@>C-cBMri*_IPRqa2B=??B$Rxi%)~7e!j8JE?`=kb0P@NG$OTROjB_-)ti)1 z!9yg}CYi`#5ZeC<{p%aJV_;K(8gU<>He-N8g7K z{{(yA_Lid*HcR{J-&MEjwz0ySBvgsU;)MB9LtGJTcYA+6!viRACM1}M-zoaxI4@n` zj#4q?sE{u@)^T0oWX^CFGL18)k=VJi9&%IeH&FG+KYZUsz8gp91n`=P3lpn_sENl} z#!G*Uo%;&K6pVzMv0w3>^nw-y-cLJZ+{m+>1yNR5gwiwzu zdpHbO0Ko8l4tMGn-j&jfCQ;N(=6Zj&BU~ z#PClDjZE7+YoENib-UY+mK^Vd&Z)b=j)W4I4BDO{GBW8nA;d0=g4vnVd9^W#Y+`G7B^XoyL2R>5P4AF(okZDZf{Px-37 zZU6PPZ5=}ZGna5h;w%QGI1PDd7V>0|G)iArQ7kuDyve2oTUE{RU)g3O;I?7XRA{3p zv9E1;<2#!yl61n?Xx!E7q{ASk6}uw=X+^OfvBaz+2ZlNYH+-rCPct+MK4m5*dUk?T z%GO1=T7$_l-{wR=j^&P+hxusKTrC$&Y#|8$Kny-L1Sv{`HmSv4^qL+th9LVuy1V{1 z4WOZ`+q`!wi1ez2$&3BYmsg~3@P{P<4GLMPezV&aMc%I?h%JHujTxh;5{Osr@qaET{npo*XU-PM+1(2W|uoXYR5j{^;)j2tyf%wpt{6EV-*>W7jikSPguUJFp< zR#U05(!WlFUH&kG;iP*}$!OFJlfXO}%Bn3DU>UP!JBq_Uap+{lOr34Aq=(nClR9bt zMyR`(zE*uSd8*kdAW{|ZHn~#I{Q&eN4bI~CMddNewmWP&6BpWuwH5sR4uqo58KFpX zDv+UMG8MA=R3)ulmUqXWJk~G5)H*#PIM3fuR9bpn(dnwtmbSWxCdU4L1Y2<+@#n;N zG5&b2|N2y4YDw12FD)OgvjqEz(KdmeV9djBfvk*QV24_XLXeLnxZhj7&m#z8a99%H zB{mRobVm8BS^lAg!fu5mJ=}^{`tkn`T*)6bVI!@B#o{z zUBWq`D(uims})Z|QqsnHLeIQd$lD+WThunD6LC;psO8A=`!zeZN((rs0Hfr4`yO5x z!31d~^yu7E!s@{g1E|clW$?X`66uXRlB-&VDHROUv7uJG@SL#{Si13if=(E;n>WEk*viS2#9ug7SJoA=t1kt2tIpt96bf<`kU-%#*?7R(2v zi6spBvIiJbhs#xFt1X>GJv_|&?h{M%_5Uyezm-E2LhKT_SlP2p>k?%MUlYdizi*j& z1;WQU#^xma4v$z1ONi4He3ma!tQ?o(<#}yfyk08^;#v9f!3Yad<#_a(fn(GNkGo>F z0}5WuSlj7s7X=jZbA~K76^a;p9~FqJ+Ey|j)?hJi>6bg7PM||C66)YFwE*XSZw726 zH+x-lLHY)xzF`^sAut@24T`|~Lita?sEDtdAjxlaEDNdKYDV{UL zy9N1Clt;+Mb7TRZ{%6ab>*39*PTWmYG7!Dz`9c}XPy{ryR$w=jV}$SJit4d_ABMSb zJ6ko%oz6{F+rhtnni$u)ZbnPVl#`nH9F}*d^T5 zn|+_MdMKy3@TfB6T$O6Am@XS(M*2hZ%dL4a}c{jHM(07phQ{t~G+%5bc3uRk9^eB>HGM|~I|u(j=62`@%vkAR=LA}WI?3yiM&+EyBmkBK z6(AUdqjKk`df#Hp|8Y0s^ZwwW*->a_{4^oQ(n%_vEf0xAG}%~;_%*0^g|-!${r7Y< zog8(P;2`5M>uUG4;o5rc4ty`Gb#1xru%y@<%MAT`|N>0@AGy*X?~%cLY#e8Ig!|%5=O6B zU1+&jIO$RO&0gbyR$_mV1qKLdZAWQ3$ydt=cE%N@kvQn>$$v6K%IxvX8U2Y55XvF% zU#nY@%jQl%;S>TooR@5M{L#K*w9CYe0Zu_EC#p%|}F0P=LmhN#Vh6J(`WKR4Liuz$ z8ZTSl=rnZ*;;-#7ssNQ+t~jfx>Z+b+j18+F41}~0WZR0JMYIQ|mKDlN?g2gP9>8y;gQ-Bf%|PJeynPfZPpzT8Sx zHI?M==QBPUie}X#rBaZWZJ~qT`lUiqI=WO$s=bXtsTRbkjv;P=5ACIpr4|Ka;KP{b~rhD8U zo-9vvKd;|&_`M&lUVca*H(y^lHBYR8YPR3^13N!iVlm&k-}gVT2T89F=`^*R@9U+L z8$HXM#flvt@hQq8-7b&!^`nZCes+SdTX5F&g(Z`ZvyPJ){_lM`Wx98@@6U~%?|+(I zZ}%hLcMBsiKE=yF+>wKx&y9Z9S#ee=D{-^ZZ_)uNftn7Gwel7KUeg5`&KMT>* z{ocz^@*%bui!K}$6N1M7#{p}t@}#G zf;02@^Ky>FGp;-S*HyxyP*#zm5peo9T6w(K#rJjy0yn2u#$?;~$58TmXrd(tG3)=e zkm2|UX+GU#*kVgRL`b2gpdeS@hTqzNd9$0y&?QlZ#lAKVALVE%%# z9iQAiG%xvU;-C1C@MStRlD-@N6+^AbVgw?WlrNVd&~?7FNq5(tT6wy|a|J-#8fs-x zj%f7k{4Gsb$tFO9_Bn+0=5R&q7Zrmkq)bcyW|kj^E=B3+BWwi=TAJIW+S1D_fsd7i zSJibw=J0n_m_T&IC8HOO$4bSSD^- zn{Jk6wl|ncD8!8%9e$a?TX9ZN0ddJJj#(~_wb4{&xLz?1N48E5IV#Xw6tyUcw%}pY zOVcbdD$%e{#8QPRFpQ;LAO&ylprb|ZCcA#-+`?c$wVPpczqwtDDMqy1plP>*$k=-^ty{IK~Ot% z(p@bwV3;Q1e!>dN(K(P^vc1J9Q|`{N}^;r=EC=PUQOIku_J2O^WEJneUiPrvHMzt*J^bl_l4Qw8>E zA(_dCe-SaVG!o}13a1tl5dkOA#!{ZHN@<5+M4HIYlKkqvN3%&(<)Me%kt2GVw>rXH z;Lt_p!LM=$l_#0{;4Y4Qi;rq2wpGTksWrE ziGkCadnE{bW?kBXuy_p=sT)B&(TGkR(yUDf8<914OMr4K56~ zX&t9gbLC(1^2a`NI}0|`^^t^-jKqigoV8@~YS2wOxyJOI6vW=e#u*_JnIP&xg&9E0 zhLdi*5u+(*JUKO@RE0NqZuPYvB2vha(Gcw^1D|4NCBgRedto3rqR}wEx5~#A1BVId+N3^nY z?rwfWXWUpX1SBv0s{vOMv{QNk0Fu?bje=kj%yXXiOuGN5R!tvkdI@sxIj%HXuoKIm zHprC(e%TqeAZ}9+x{9odQMUkki6LP^p#LQ^u}0#)5NEL`_O)6zq0KM%$D;4YyZZ}Cmhieh#l zMjn2sb_M1sdu`e0V4=$pd`P-=A~uL1a0F*c9d^L*#rr^CFkcl7OZ>`FUruucmf`Oz=4QEyCa%>wK;lVu&J z!E2`pKl{4H)sfoyT7!>mKTRRYtS__h`+(aog!Vg_K{v!Ltf5Z_&Wmk3XIqxM6r(HU z!je+a(;^vcCQDY8%~Rm1pf^%3sdLnWr0D2zE8KimE7xZ^9u4T^M=HxHW{uTNrV)ZUFe25R#FUZ*5DBbtl9^T$FcD-0GxCk&>Ab z`Z|j+!Xw&xLkue&8kug|xd zpT+Gr!8UxZ>N<}?-Wwka8C(7u;zr9?jpvb;&A4L{aG?gFtMi za^3ZdiE+~t_c-stb5qnrZF@@ZaR!8|F=WNA#<|r(i(5DDR#Ar`D(uf1MwU$-CE7(?BGuExKwofS%?9#&H=ESpsu z1O$pa%xl7NH6!X$n%if%JDT)xN*=asyXw6UEOo;xg7|hmFAyz(AQSFt(9RHgU3qOD?N#8z>$XgF>{e@NU^$#WDWd2tWnJ{t>NK`o zcS@d|AP~qm-aakAYd zM(Q4z9m$ZrjCUE_J#iKw!NlNs-S1e6O`B{Oa6Xr;vWF3#1A_d7?O3Yqm4$^qSip)( z>~B55$nNUa*>L@Qe9$UxL1GNpz7`$^P1}ZfYvN~8W|z10X?~4N>!kQzU7ZjsdUldR zG-1t^CDr$a6^{GPF0Mm}_pdJ4)@_LJ;jx#WZVuzU?&sQ5Y~hl?d1RVTTwA3@H=7jv z)QcUcTB1RBq2ril*>NOlXqD3Foe?gACP-JM_LVYeRTg4qkP|;nX8=jue#|*TLQr`osaeX@{(L5A>g9ICm_i;QQRwp z=iYqEdi9bv1xNYyUdN>BH;-dRP*E*S%2wx^WA-Hk9i=ME>NG5b@ceuoVY-WwbW3|; zG_QC+7|NO^*}kS>llY~v%q#K$g68U}w2bmvd@bK63IeUkD(CqI+M%V@;dZM@u8m`2 zxx$?Cb5sJ|HyD{qUb5@z?|04OmHLXXAO!7}rpG_`Z|a`$TRhP1C^{ash2i8g`)`2< zI)T3%_Z`XywkTC&qA=7Sa8d^4_#xN%$-!k}7TM*LDS*B3oyh$>h898od<@5kaD!?; zsDa;E+-py1eg8R7ol!w?cThFO2t`B49zePQaBxuA+jHMhqGMw@-%d;?bxtcGv- zp6!n*U>*cO1`Zn2*^3L%9mqYN{^0(ttRmpUG`l^{ZScruPmHLo{*g1o*)}^|`yVK1 zmd-7_AyKY)G>d3n$YexxHU~|=^^~bh0?m&M+Dy7yQvg%nz3D%;QhTx(wh91nU zw0KZyx<%WkQM5Fim5EIHTTUo!6F(xe2OhAXx2BgSS(A_h zFIS_|Aj=}BSuhWVaXfsv<|b+nZpI@58L1YBJxAJ;N`R`(mTog56q%?#1W%c zVSy}I{g@;cJRc#pR{oGFXAmyn|KXlQ%{^Eu`9)aVTnX7=wbc9IzqDpJl>JjYzw3_3 z23{t>OYe+P@`0*-kf`epS`tM7a1zxh{#eB3=&(jwtyxLx`y8OfFCi6cbv_Kp zSj9cf(j_S2Ti>&nG&qJ0br275OE|RB=Jq_(ov87e9OPBCXd_ci&Kh=)C`}&yMVbzT z5xP5ni4=*VwAvbkmxUF{L%nM;x5Er+YLcROk*)!0&$*#3shw%Ie<7~XLTYjQwaDvU zpI!}$xS%CCI7#o&afWi+v4f5(Reop8Z7IQ-tneVPSAhEYh)pR}VGZkkf9q5RyKFr# z)^hM9gcm#0{5!oBqgcsGj|H|QeGeJo$`}8N&Tep;tUtgcO2-FKoX>xMm4Cm_#oMTn zH$?$CvxAl7=fQfhsmMb5+6oEUwhPG~Vg004Mt8fgsD0+e2YnpA!t)l(&`I0nEmMDt zySNFnX!f>TSA|@26tF55^IYyQQGh4V167VUgso;fj4xgrpDRCcA-ri`ab##~Ne8SN zK{Oqne&HZ?Yq+v=w$y#Sh5}%Z!c(YvGXY1KNsB<0#|}Q;4l%nrgK9U4+bQ(|%NSt} z3_TBk_*XoU%ePh$P6 z6%{!i!6U3fYDz2x?4OBU#(KEK#LcfsPj(%8VT%JLtLUa4cgyu!D(qV=es#h}jwUIU zhzf5caM|3v;+WZHui4Ep>j;`zr{5gA3ubT!G_n+{=WDroc|K}PLkiJB?`B8>az>H3 z|NIPaqt$Zs0DI5@m{8BnqEwZwE+R4d&2!Y|Yv^vj(QIS448ZBkM}#)%nbwUC@_=e~ z;~Yl-l{gwTUIL;~pAX@v1ZKH<`es-XdL%0RL>>!8jhj$Za|lI!{^VFxT3uYF5f^B* zkfD4pah1A(*ycWWC9AfzQ0!2NuRAGh+Q@^iQ!h!CD#}4%$)W16OG!GbE{1x1GdNr( zVK?huk}BmSo^-bP_-!p~r6heh>i&EjihKyE>~4th54XfYOu@H;v{JB=#f}uKi*PA% z8^(gIBg4;)U&&tgf^@c^cO2a4Zd-@CYGtnDNi1ecLE1Q+Sv{0CbHZX^w$&G;l%z_% z2Tzu84_#KLUaI>|ZI_T$d8M>j!a;EMZYav2^TnbazEx;nWFC?fq%W(;#8RwCl{Hh0 zkkk!#W@Vl@nqJd;DnBTLedb$8=@F}ptD#rMgkm2+jMZD9jO$qC?A7Y6BX2M#u~#~s zOJRC=TI#R~R0tQFijmVCOae5@TwO2B;CkV%`6X-u*hAqax+RcCpg`NxwD`Z~?7)_B zb8+GzkS<>3eHCn+?hoNFp+)XM`p7rN4}@+rEPSKYx|APCk)R=>nR=Ps;1!?sTPj7!a1pgNS6?E@ZHHrv2#Ws2*er>kivQG?$Z&Vo(*qPdH6K_TAHme)R zz(iGI+G%q<6UfAnm4&6P3qu8F{9H}1p{qVT^-Kwbs!zRawhDSnI1>9)kAPu^GS;4H z==}+c5&flC`#`930;7!Q>H%?VaLo#7hd_4ot9A1;cUdN1(O|&Y`(CHShPGjoLo^P9 zAF2zMS;lCUnRzUzRy&GVVhha#YDdSixK>5qoqJ?U<{Qw^wry^bpv+Nn4+e4BRAKTK zsD6?#6$D#Fc@Z_LNsZ6Y;6Um)xH{6SR!mZH7L8aNZf~^Ao^!A4SY!l4|1kBYGD;Q>&#gs@3cZ$avNJGY=0h9BUZ3-95wKRu_U}ho?eoO4(SNQt_@k#8wUVm`-i0 zqiL^DiOrAh2%lR8FJByLtrVOpd^RtY(a(SbP7j(F$T^9XV2su{vw7OF$rt4eY8XjD z#zDdm_}v1ZX+yFaE}RNNo(++7p~!T2hWZGRiz(b<2cW<=CLmgvgjn0=>58NG6iRXJ z)}TXM1f8eGpZ*$^%g@X$Cz|gsnL=KVriwfm3u4#JX)|7*fv-=l>OEgdn-?sY!K7rF1=GiL&GCs&?zhiBegEUX{>Mi;s~JJ>zx*{r z3HE?lG`Ed)Pbc+W|yo;moh8{+ZcjVJ)2T2R{D$(u!(n@*#;4O z{l&XCdu+RJCS_lgqaTQ>uUnG+D)JG$YL$2@?!e#gfB4HUAAkDz=P!SJ^OwJz#uy~N z*u`nTKkG8R&6@3U^j8{oId7yEi@c#Q+vsJXaBr6RE$h$_iUrL|?4%;2GI(iUYySKE zvc;v(Pqc)aJkC2d!WQDBjy@D=dk_Fy%`158Y6Z5b$|$17wszjnE2Hq{gm$E45!W_1 z{lKr((SfFXlSBU9)a7B>*u(=!;xIW9?%1n@%E2^+9seh=u@sX*P{?hu!=VWFb4|i`W+$2eNsLva}Fpv@&5+4O=V3yVW+w za9s@tEX>emTkYIu^Am>v9$%>U?o`u!9JQT^aNG9KyLh*E4}Ny#WhHLFQ%kIPL3G-o z?(Dn>Yv^rNUUq_g5*~&9HnX5-6yzLn&{xguxV|1XgGd0EGy|7Xt-cze9^sD~LwiAI z&)6nf!{)NPbH&3E>%J(VdkQMHc)$h}MByn6BXAYe+%&uTO&eXW8YVjCWwnZI5q`Sh z?=|q!e22h!a9%2%u2iGB?3M>A{8p!?QAI-1L>riQq~>NzZfQOEE5{i6QE;=+6*9!- znKm%!>dwaeNC!@Ha|ogLcWHc0U}mKEZ(iq1V#DcCW>d*Eg7Y-mO#@hnA2FNeI}E8 zR;;~hgyWDrj1}`sE%GS@6rk%2 zUddnRsik`9snYbia_*yMJtii%mc({=@aWyz4oim`3%Ic)BpX)y_2O}8F1Ml8VjUXw zTH+wUhiNpc<67~sQ9^cgqqL$7E-(c@Hx-yWJz)>lQvF&e<2Q7qX>+hV){3%EGVc>{ zj$w09@TQmKW1bO|_dwz>hZsXIRlLg}x%ug55`v?PDKS$>BDsAeg1Zx-ph;>A3vNrB z8rUhZeVD6rc}fDei@>t_H;}-QSUQpD^2M!nac=q|rNdVpcj=1*|JzIG;wHYTxj9&M z%CN2EH{MI(O0vOlk6ET!c_zZ+(wZ>ENrc;iJ}+Y!ijM3 zE`|GZ^ALksfP^sU=8C;GhzS%#zJx&RzS;u-c5iFwF-tHfFt2-WuavFZwcU1+VXiVT=7#1GpYNt%N$LU%I zTu_cW?~S;TIOn~M5?ZP^wi5(MBD#5N*()QwzkYgMQ>gb?RK5x-?qsaMs|81_e5swGI8j z%hS*`i!NSY7m^-vm9S_MB3~_+=G;-1k|6`qa+K9DI|m=b9&fb5>_B2@wcC(bf?~5u z*#ta8v@O~#Rh?!WH%^Pht++_rLhq{7bu3C;suIGkN?idj6JsyF*~A-Vh+}c^k_~JB z9EqEa4F!$d*jdhAB(8&+sxYZpz2I-`1=k&(97%+_;t%3KtBoK_oVy`$E$T5&>Q2@K zchz>DH35dw)B@dAA@EQ+Ok7M7JjF&a%bSyg2_zn#z>lBAfEK^oL<@cv1DYnf|I~QI zdkiQ&yZuX`&&nB}BjePRv0`I5gvlo#ydzE@=!r-Lb9vHwWc3BEc^9 ztTQw~!Lnwto`3Tw9Tja2l;)kj?Ld=J6FG2%{UKFX4{Ay+hSj&&3QlL`TfF{|79ww2 zduRkl4qe~%O#?C7AqP(huN8OVCR-f^yU>D2d}@MS;)G~EH^DBmnH9ET_>wqDNzg*7 z7ABuQ5^mIsjD^T1aRN+5u5xHpLTP=^OM#?SN|IJpkxY_SC6uk?_)=AI$k9`lGrmb} zC0X7GpQtPu!Bmd^^XP|Bb7`W5g|ROLyE#<41R9w!``t zcr!G*R15{QDUcM#8N@W}tM4M6Ndj>6kY5-<NgeLg& z>dBMBivd8CV7 z9mnjLi8Gp}7>@*6#tvyF4V2Ry9O*n0&rwU%;oqVt@R z5^r4|dt`e7$PR8%L_!zscsp3Ed7UT;VTA@05~Sq#ty!`N4LwJc(ixk2?cUS=$kUIzvO{&d`v?HP0opR;@WWC!Y} z5b3^vpto{0a2qPLRT?$K55zoYOdIcJQBKcW>(?aw_+#VCf%?s|Pl8}kjvR7<%puI2 zlhY!?dG=l2n2MG0p+9XByU>#$g0j#)=*B&}O|rBcGG3h)UXq`9lTkd!wq zd<_E)GjE>FN7sIF+iFYCC8^c`4#Ij7_cX^W(5+&f4c9ni%!)x`<>?*Wb^ ziLJP|r>Zo0!v|uQDP{O&eI6rre8`eS?@z=%dsP$Dfo~xT!Mj1+OTSHd*Wy=Fc`m|z zpZ7F-Ab5WIj8T%1p=^0tB&J%3>_NftRb7OGW+bsoyreK8%=ZPoZtG+yS|nJWcmpf3h3O*sv`=U5B=5~6fkTO;Nh99)y}=NQ>z#>E z`DOM5i0F>8gYe;UaV<8=LAMyiVZiRSn&@Y(u}g`xrgQYW)(ELx zah?f|k0@3osS=EJPt3z5(dZO+4|vC?y*~NF!L2r>4Z`i>0~0%lz|TU~LW}kdRHIr8 z(cGAMo_Z%8)Y)<-R`KlsMunO1YYg8<;@<|}vDhgoEADdy1H6Vk2NXxPMTSAL0)w0> zP$%JtG>Nz9MbdA{vm%G}n^^EEmx~V4n+;NIlCqJ|#oVMui4snb8d=26U8>%<>% z*G)}J&~XnBpPzoF=UgJZ1Haql-IF1qGC{xA1GWe;YRJ}wv1a<*Re5H-a2@(;0@Rg5 z+|fs5X0-@s(f7HLW*#Ivyp1?oIb7m8C4#@2nS`es0_O3->+%Kx|L`wgJ%9P;tFONJ z>dUtuex_s^D%OgZ{GAHu@*md4o;=*f14T_3MdF;md*c6C^VkO zquT0|n&3pkLu3T&=#v==J~fKnz#1=B7P8YrT=#>Jq5W?agd{a~l72WAi`>YYbTknC zzn%>!Yz8>sNTUWAZc2-?GZJ|vFA zj|GWT=Ur<-dj;1|%kTOYDGlp1U8sDCmDjow0tdc8HG*#Dn+f*w zyxu9FGQI7h^cPkZi#`DAGu)KWU@M$6ui06WAVTrm-y!5tfqaNn8)1_r_%|G%dMVMK z=BGjmWqN`rB@l?{84IAjV9hqGIk;_}IC>~tjJQlxA*_{P#NGw1+94}T$>hNn_h#UlY>}SDz}V_bu&1xUi(0YQlIQfjK`q$? zt?75=oC|opneGg=U>o%3mMQa7;{2VAZNbLJ38f9f1ZQgGEjxr!KsHCRyg9~9XU;G* zxC`hLEz5l_=~?j2Lw=eD+UtE{@^Ce#Cnncdx~|4p!{PZ837-8j}bHKC}H zKX9I|9ytsn^E{)pKw!yF9r+=<#?!95)N?h#THClHS=ea9cW%gh^Tyil5T93x0_x`0 zUe_P!wL4PD2_UJ<8zWgwafTTq(KEBlA%|`EWSsST56|j&;ylL>)>?(j?@q15Jd_AT zP7U5{N1#UHfS)4LduA*O@V;c>DKr9xHcHIq5JZgy*Gpx!k*qA7wmh|5b~Qm?X)5vF zp_WqLIfsUF&jsFn&JW;YWErsyOVe>FkJNznVdMLN0d5Fe|wqiXjLQTK&p9&8Ld%HlDD54G|<9eKQGwx!Y=IiYQeF zpu^iVxk=<}Z57znBZz`scVJ8h3{zN_APW;)t2#gjeq@`A_Ta^Hx2uP_T2?*DaxK{0 z!lDLdo;x)MThQJ4KMab4ZOTlkai#`q;JsESspbbZZHT7fWK|Xr82e^K&sOI-*7g3U^ux+M-iisKildl<`(!6u5 zMm0T*)8s|i1MAtElkJdT_>gR?Cq}Lz)$0ONkvZ=77>zhK^&RM*_128cH|CO8?Y#gSzHxWj$Gl_SwODN`0n1+L$ zfZ2n$*#8GGTd8ojoA*I5%PzuGD$?-4g^b)Hl3gUk@VFLFA%X7!(KNVi3ZVI|m((t6 zl0!n>4rm$NufJA*r>`m<0quk~M~J&Yo8vBKnQw%~R~-iO$eUyKM6WB}9QWesM(VA$ zP9iZ$o~89rluD};TZ*%mh7_5m`pc+^aU`c+I#v-M2+@w0B3Ih^7P5p>ZL8$q6sYYk z-aZ1m_c|gwVyC28IM#0)TNxZqKMBtOc``u#<^9zCe*MXXxVih}!LM>Y%Ek46)_>S$ zM+K^$R(rhvHrefaa;J+cr@lf7SSP~5Z@k|&P}lkViNoB+H9*RdZRWzL(S2-ZEcpaD z`@H?M)jT4dr1sj?#CJz=pl2+pFsr%MJIC&waP3JZ(xv5YhHKT#gr9RP?b)(^#}lBA3_V&R?>yPT|cFFzI1IMBU_%dfBgbl?T8Y35cT??@*R&e)XyxulWTsmeNds>ALn(Tu6ao@ByDmlSfj(qZBx@ zOX%Tahj(N)y)>5swFL4>X(n*uBy)0vT3kqzI`-0{HzD-Wqq95_$mMZdii=8CLfT7l zHqWlT*-LRHx=!TV!z4D*zGi~Iw_X*+NQN<-gq+?4G#I=#Ej`#(G*^-J@aZQ5A|e zSRUNV=!KVgbJ8mc5jA`?OhRZy=s_VHg%dkkhsN*{gB=2~>8T>2iat;WoxI6FNbCF< zvE2zm6SHoK*MbG9+BVxRLZ?%WQb%AW;2D&!S{z=DnV7xX>C&~6!B33SO6&kNo(IBF zKB&Dzd#y1~1?N%fR6l6UPZ*hXYpj|IF*c9%r7$YgzS?I$-&mK1wvI?8d_cY#HZ3HW++Z!nM2#KQxO;=IH54j~n zEKL8#r9%IJVhJfMV~Ck009|*x5q1ELY_KBw>1O$7?RbKqSU9E?bC<$Di=e;=amK!r zRctBJ39I;9jPr_mU(y`t`H@vs_~7Jq&8pBu%Cj%-A#3U_c2!lcwv0>psB(yC!DIwm$ z`$Cr=ntJGHDHFRU+j2Xr-R7w=zGvZ`)`<9+r^oYWg+qlUsfb_!VOIBDJS<5ULB)c| z9!a=JAHU==U1ekQH;Kc76-#s46~3Gnr(Cs~^mt6%K?Ij0FlbxNmO*Gb15Cz&YJr0{ zx=6ajJ{-oT7hGbWZc}oGeSB}ZMqaiAzwHD&Bcb`ehDUSooy(xI=gjMk_G=kqVYb~{ zpq_NEd+62IsJm^fHq4&UvZgF;8{1DF3E0|&r5knic6#N_r20%(9z~MAt!~aCIts|q z-#>0~_{^OId$|}^E+T377i0WQ8L z%&-K{r}k7k#7LM8xPj;V%$_=VwURhcGXY08W*>P8+OU?%kYl@4&149b%HBbjUAz!2 zuemZ}V{~qjU^Po2ZherQluBu=w2Veln<&>qE!%WRwn=nMHbWxVS;tq1CPWhRl(_&EIvJy4PlI`x`fbZ*m)NW*$&b8 z?Ca)KB6;m}3vx^VFe z>m+UOn-<;17*BU}Pz!Z9R!x0~dC;~`jr+t2+<#GrCU@$ES2aiWg`RmmR(IZ*z@Sd> z7CrseC#F7hJ|qWoXMcbex)JN<$xBRe1TiysQw81Vconu0?~XC~(L%2_gj)qz9@e=_ zj5`a-CwXgbT%Z}aoTdGBlhh@;k&Oi1$woMT`frCglQ?s;X&Zi*Ad zw;EmkhBt`k%gn?;CAJ)Q{x=Y(UUIqqgeKU~9cOtPo0iE!bINGCn2qpaa5SHWz$oU! zMq|-ZMw{ChH;sF;=L8bP76(jnlAgq7G@mXhv;?+_pJ&>YJ?`X57W57DIw*DJ8fb{Y zyTP4dEQ>T?KQd91h=N?W&?18lj8g%DH>xGTL?r|B2F#ENxrIE|%M>M^2AZMNObs=yJG+Sx2xgXD=$PjICasc}E@Dve zJ7ICW8pUD3rZoi}B#Sr9Z3)mZ%mIOipOFr1;r#oSVgcJhR@P0{afVh zC{#T*lZ$4q%XIT4^^rKw(xMGyBGtLND%g}bSA$ZjCrvJuqAmhGQ{jLsp^L_44j9HG zel6+RpWMlZ&NNT!imq)24S--)Yo8;LAffh@bo zYI*Xwq`uo(R?D+I<=TKP_UNbEyh6h0r>p-Ve!9-ImzQhGu%(p3Dks0>4Kn4v@|$3o zm11g}Yx}WUEBcU4t({yk1oObFL)}#(Z5!LFhX(bVW|H-}E{wVRS~R3rQ?d)Tci28< zaiO(;@SCAgvoa4-p8Ah0$GJ5DV9l$@={A|uA6loSE5$bN_fAd}Jycz&uo9Y0Qy_}E zY!MA;niIEfl6qr3&zyg^M2`uT9nCZSQS9nwx_LLRZdL%+%;Y3wGBXmKcp;yAHUwA) zNK2mpX=$FSw`Cn^-fq+lARCOEmW`h7>NYggyF_vo*;e^_&(&tZbhVk@SUpeS&BEty z!nU6ZHfTXV&4_vh9y4)l=Y3K#JnW5`K4!rj)EdfKv=md~}W z9P8@nHG}%*n`;L3O*J+^)@5Oo!Md#vAYePwml;m`9%NWyw zz&vqku4-Vjk!vxsA>MTd+3k=+YnAHtmuc(ut^FO`CL@H%^P9j7>uA zD6HfpGlq*#I3yc|;J_hy5R(cWm_(u9Q8Mkm_*kvSdVjP&O4eIBE`C;R-Pjh1VvC&L z8UY_{Y}+%t&GhM)dC-e4O_p-OH-M|cHY2MK3*m>Spl4O@-oM9C+acv$BkJeO3aoOg zK7>l#d9f($a&~kf9L%R(pVw8D`@QD0>Vuue^hpZ>fgEiWmX8ISdSiM@V6aJkDuHAF q^nU?NV;Z7W|>1^u_T@=?_p7f|GmRcS!sX%LsGg_m&g(B`xyzH^v zXeGOdm(V66!UQx8(*z__n?y|)Ma2+nRemU73SKbs(E0QHah^ZEZ|0qM=6l}fdFFc$ zlmE8c>@#-E&BDSVX3-YvyG60%c*p)-%nQ|3g>27Lkf-$w7NPG;pY~T)*P_E~Chk@& zxLv+qn{f6+=E=7wW_n(rvD zYQ|7HIP?G@Bd((tn>N8R>>q;4e9%9!271hJ zKKmo1=eYQAT1B@FvNQzD5mwpvpoyR2Lu;V67mDX;a%k)iAx-olT;7)e7+O$ftRaOR zU9E1I*PEp6+P(ge8+heV+#3qT!(-z~i~S^3z&X1eJVZ>4>UZ`2x0JCI4fbw}gPX#) zt;e_Bqy_6G;ik8lM@ykKi!4scY=EtcDEJ&n^L05rmfpWS%ufOQZ>rkXR<1hCJx7*9#&ONoHH zrtXP&u(iue^?_1Wt7FvTp=~J?mE(#_O&_7pPi;|2hZ~2z7v|nS8qk&}CBHn&D0KUF<4sNepD&#Io6HW3)+lxxC zOW!vwjt-hsmha0usHJEIommP6V^bfY-Dz5^U1`|?=JWUy4k1>6dzeZVXhUn&th3?hW9{cwxf%`j@#xIvP~sHan)ocr)Y&uu;a!h^(^S&Ptjf@$t-cAgCYUdjHER{r7Ipd6a?op3dO#!mA9ehB!Lo4k;WHin!rxnf*( z*bD$bK2rn`frO1vI}HQ3Ia12Joco2RQOe`(JOzI8awFtQ`H9XKL5)2IlrR(pCz5LTo%*IA+@x1!e0m4l| z`!|rrHl`Bg-)$3o3e)x7o{ve5?vkUPJz7&zoNtMR7$qv|VM*v4D#y|G(@6|*iH!XN zeL#}QEDLRgjaL=>6RHJQmUxO0(}!Xg3(Yaj95RaaeD6?z-L>id-of8+egy)6_Iwf9 z)B#-;4eA)$Z+GwDU~K6Q^kXlf58T;xx0L}+dzt{Ro6EoRy;yS z%MeZ;s)z~WiEWW7EO|fFFlf6e@w&krzFh`TBk&O;gKZv zM}UEI01^=7{CuDI?CLjX5apj9IdvOih9lgq4 literal 0 HcmV?d00001 diff --git a/clients/R/man/AnnotateVcf-CellBaseR-method.Rd b/clients/R/man/AnnotateVcf-CellBaseR-method.Rd new file mode 100644 index 0000000000..29672495a2 --- /dev/null +++ b/clients/R/man/AnnotateVcf-CellBaseR-method.Rd @@ -0,0 +1,44 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/AnnotateVcf-methods.R +\docType{methods} +\name{AnnotateVcf,CellBaseR-method} +\alias{AnnotateVcf,CellBaseR-method} +\alias{AnnotateVcf} +\title{AnnotateVcf} +\usage{ +\S4method{AnnotateVcf}{CellBaseR}(object, file, batch_size, num_threads, + BPPARAM = bpparam()) +} +\arguments{ +\item{object}{an object of class CellBaseR} + +\item{file}{Path to a bgzipped and tabix indexed vcf file} + +\item{batch_size}{intger if multiple queries are raised by a single method +call, e.g. getting annotation info for several genes, +queries will be sent to the server in batches. This slot indicates the size +of each batch, e.g. 200} + +\item{num_threads}{number of asynchronus batches to be sent to the server} + +\item{BPPARAM}{a BiocParallel class object} +} +\value{ +a dataframe with the results of the query +} +\description{ +This method is a convience method to annotate bgzipped tabix-indexed vcf +files. It should be ideal for annotating small to medium sized +vcf files. +} +\examples{ +cb <- CellBaseR() +fl <- system.file("extdata", "hapmap_exome_chr22_500.vcf.gz", + package = "cellbaseR" ) +res <- AnnotateVcf(object=cb, file=fl, BPPARAM = bpparam(workers=2)) +} +\seealso{ +\url{https://github.com/opencb/cellbase/wiki} +and the RESTful API documentation +\url{http://bioinfo.hpc.cam.ac.uk/cellbase/webservices/} +} diff --git a/clients/R/man/CellBaseParam-class.Rd b/clients/R/man/CellBaseParam-class.Rd index 822a365450..f383d395f1 100644 --- a/clients/R/man/CellBaseParam-class.Rd +++ b/clients/R/man/CellBaseParam-class.Rd @@ -3,16 +3,15 @@ \docType{class} \name{CellBaseParam-class} \alias{CellBaseParam-class} -\title{This Class defines a CellBaseParam object} +\title{CellBaseParam Class} \description{ -This class defines a CellBaseParam object to hold filtering parameters +This class defines a CellBaseParam object to hold filtering +parameters. } \details{ -This class stores filtering parameters to be used by CellBaseR query - methods. Not all the slots will be -used by all query methods, please have a look at -http://bioinfo.hpc.cam.ac.uk/cellbase/webservices/ and the -Reference Manual for more information. +This class stores parameters used for filtering the CellBaseR query +and is avaialable for all query methods. CellBaseParam object is used to +control what results are returned from the' CellBaseR methods } \section{Slots}{ @@ -37,3 +36,8 @@ in the form 1:100000-1500000} \item{\code{limit}}{A number limiting the number of results to be returned} }} +\seealso{ +\url{https://github.com/opencb/cellbase/wiki} +and the RESTful API documentation +\url{http://bioinfo.hpc.cam.ac.uk/cellbase/webservices/} +} diff --git a/clients/R/man/CellBaseParam.Rd b/clients/R/man/CellBaseParam.Rd index 339645b5c0..bc8bd910d5 100644 --- a/clients/R/man/CellBaseParam.Rd +++ b/clients/R/man/CellBaseParam.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/CellBaseParam-methods.R \name{CellBaseParam} \alias{CellBaseParam} -\title{A constructor function for CellBaseParam} +\title{A Constructor for the CellBaseParam Object} \usage{ CellBaseParam(genome = character(), gene = character(), region = character(), rs = character(), so = character(), @@ -30,8 +30,11 @@ in the form 1:100000-1500000 not chr1:100000-1500000} \item{limit}{A number limiting the number of results to be returned} } +\value{ +an object of class CellBaseParam +} \description{ -use the CellBaseParam object to control what results are returned from the +CellBaseParam object is used to control what results are returned from the CellBaseR methods } \examples{ @@ -39,7 +42,7 @@ cbParam <- CellBaseParam(genome="GRCh38",gene=c("TP73","TET1")) print(cbParam) } \seealso{ -for more information about the cellbase webservices see +\url{https://github.com/opencb/cellbase/wiki} +and the RESTful API documentation \url{http://bioinfo.hpc.cam.ac.uk/cellbase/webservices/} } - diff --git a/clients/R/man/CellBaseR-class.Rd b/clients/R/man/CellBaseR-class.Rd index bde2145abb..35902a179d 100644 --- a/clients/R/man/CellBaseR-class.Rd +++ b/clients/R/man/CellBaseR-class.Rd @@ -3,17 +3,15 @@ \docType{class} \name{CellBaseR-class} \alias{CellBaseR-class} -\title{This class defines the CellBaseR object} +\title{CellBaseR Class} \description{ -This class defines the CellBaseR object +This is an S4 class which defines the CellBaseR object } \details{ This S4 class holds the default configuration required by CellBaseR methods to connect to the cellbase web services. By default it is configured to query human data based on the GRCh37 -genome assembly. Please, visit https://github.com/opencb/cellbase/wiki and -http://bioinfo.hpc.cam.ac.uk/cellbase/webservices/ for more details on -following parameters. +genome assembly. } \section{Slots}{ @@ -34,3 +32,8 @@ of these batches. Default 200} \item{\code{num_threads}}{the number of threads. Default 8} }} +\seealso{ +\url{https://github.com/opencb/cellbase/wiki} +and the RESTful API documentation +\url{http://bioinfo.hpc.cam.ac.uk/cellbase/webservices/} +} diff --git a/clients/R/man/CellBaseR.Rd b/clients/R/man/CellBaseR.Rd index 9ddd2683dc..ac4fe929a0 100644 --- a/clients/R/man/CellBaseR.Rd +++ b/clients/R/man/CellBaseR.Rd @@ -2,10 +2,11 @@ % Please edit documentation in R/CellBaseR-methods.R \name{CellBaseR} \alias{CellBaseR} -\title{A constructor function for CellBaseR object} +\title{CellBaseR} \usage{ -CellBaseR(host = NULL, version = NULL, species = NULL, - batch_size = NULL, num_threads = NULL) +CellBaseR(host = "http://bioinfo.hpc.cam.ac.uk/cellbase/webservices/rest/", + version = "v4", species = "hsapiens", batch_size = 200L, + num_threads = 8L) } \arguments{ \item{host}{A character the default host url for cellbase webservices, @@ -13,31 +14,36 @@ e.g. "http://bioinfo.hpc.cam.ac.uk/cellbase/webservices/rest/"} \item{version}{A character the cellbae API version, e.g. "V4"} -\item{species}{a character specifying the species to be queried, e.g. "hsapiens"} +\item{species}{a character specifying the species to be queried, e.g. +"hsapiens"} -\item{batch_size}{intger if multiple queries are raised by a single method call, e.g. getting annotation info for several genes, -queries will be sent to the server in batches. This slot indicates the size of each batch, e.g. 200} +\item{batch_size}{intger if multiple queries are raised by a single method +call, e.g. getting annotation info for several genes, queries will be sent +to the server in batches.This slot indicates the size of each batch,e.g. 200} -\item{num_threads}{integer number of asynchronus batches to be sent to the server} +\item{num_threads}{integer number of batches to be sent to the server} } \value{ An object of class CellBaseR } \description{ -This is a constructor function for CellBaseR object +This is a constructor function for the CellBaseR object } \details{ +CellbaseR constructor function + + This class defines the CellBaseR object. It holds the default configuration required by CellBaseR methods to connect to the cellbase web services. By defult it is configured to query human -data based on the GRCh37 genome assembly. Please, visit -https://github.com/opencb/cellbase/wiki and -bioinfodev.hpc.cam.ac.uk/cellbase/webservices/ for more details on -following parameters. -run cbSpeciesClient to see avaiable species and their corresponding data +data based on the GRCh37 genome assembly. } \examples{ cb <- CellBaseR() print(cb) } - +\seealso{ +\url{https://github.com/opencb/cellbase/wiki} +and the RESTful API documentation +\url{http://bioinfo.hpc.cam.ac.uk/cellbase/webservices/} +} diff --git a/clients/R/man/cellbaseR-package.Rd b/clients/R/man/cellbaseR-package.Rd index 87fca5d024..1a15655701 100644 --- a/clients/R/man/cellbaseR-package.Rd +++ b/clients/R/man/cellbaseR-package.Rd @@ -4,7 +4,7 @@ \name{cellbaseR-package} \alias{cellbaseR} \alias{cellbaseR-package} -\title{CellbaseR} +\title{cellbaseR} \description{ Querying annotation data from the high performance Cellbase web services @@ -23,8 +23,14 @@ Currently Homo sapiens, Mus musculus and other 20 species are available and many others will be included soon. Results returned from the cellbase queries are parsed into R data.frames and other common R data strctures so users can readily get into downstream anaysis. +} +\seealso{ +Useful links: +\itemize{ + \item \url{https://github.com/melsiddieg/cellbaseR} +} + } \author{ Mohammed OE Abdallah } - diff --git a/clients/R/man/createGeneModel.Rd b/clients/R/man/createGeneModel.Rd index 4aabc63c0c..8588a74981 100644 --- a/clients/R/man/createGeneModel.Rd +++ b/clients/R/man/createGeneModel.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/tools.R \name{createGeneModel} \alias{createGeneModel} -\title{A convience functon to construct a genemodel} +\title{createGeneModel} \usage{ createGeneModel(object, region = NULL) } @@ -18,7 +18,16 @@ A geneModel A convience functon to construct a genemodel } \details{ -This function takes cbResponse object and returns a geneRegionTrack -model to be plotted by Gviz +This function create a gene model data frame, which can be then +turned into a GeneRegionTrack for visualiaztion + by \code{\link[Gviz]{GeneRegionTrack}} +} +\examples{ +cb <- CellBaseR() +test <- createGeneModel(object = cb, region = "17:1500000-1550000") +} +\seealso{ +\url{https://github.com/opencb/cellbase/wiki} +and the RESTful API documentation +\url{http://bioinfo.hpc.cam.ac.uk/cellbase/webservices/} } - diff --git a/clients/R/man/getCaddScores.Rd b/clients/R/man/getCaddScores.Rd new file mode 100644 index 0000000000..95a33dce95 --- /dev/null +++ b/clients/R/man/getCaddScores.Rd @@ -0,0 +1,25 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/user.R +\name{getCaddScores} +\alias{getCaddScores} +\title{getCaddScores} +\usage{ +getCaddScores(object, id, param = NULL) +} +\arguments{ +\item{object}{an object of class CellBaseR} + +\item{id}{a charcter vector of genomic variants, eg 19:45411941:T:C} + +\item{param}{an object of class CellBaseParam} +} +\value{ +a dataframe of the query result +} +\description{ +A convienice method to fetch Cadd scores for specific variant/s +} +\examples{ +cb <- CellBaseR() +res <- getCaddScores(cb, "19:45411941:T:C") +} diff --git a/clients/R/man/getCellBase-CellBaseR-method.Rd b/clients/R/man/getCellBase-CellBaseR-method.Rd new file mode 100644 index 0000000000..22e4ea2359 --- /dev/null +++ b/clients/R/man/getCellBase-CellBaseR-method.Rd @@ -0,0 +1,46 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/getCellbase-methods.R +\docType{methods} +\name{getCellBase,CellBaseR-method} +\alias{getCellBase,CellBaseR-method} +\alias{getCellBase} +\title{getCellBase} +\usage{ +\S4method{getCellBase}{CellBaseR}(object, category, subcategory, ids, resource, + param = NULL) +} +\arguments{ +\item{object}{an object of class CellBaseR} + +\item{category}{character to specify the category to be queried.} + +\item{subcategory}{character to specify the subcategory to be queried} + +\item{ids}{a character vector of the ids to be queried} + +\item{resource}{a character to specify the resource to be queried} + +\item{param}{an object of class CellBaseParam specifying additional param +for the CellBaseR} +} +\value{ +a dataframe holding the results of the query +} +\description{ +The generic method for querying CellBase web services. +} +\details{ +This method allows the user to query the +cellbase web services without any predefined categories, subcategries, +or resources. +} +\examples{ + cb <- CellBaseR() + res <- getCellBase(object=cb, category="feature", subcategory="gene", + ids="TET1", resource="info") +} +\seealso{ +\url{https://github.com/opencb/cellbase/wiki} +and the RESTful API documentation +\url{http://bioinfo.hpc.cam.ac.uk/cellbase/webservices/} +} diff --git a/clients/R/man/getCellBaseResourceHelp.Rd b/clients/R/man/getCellBaseResourceHelp.Rd new file mode 100644 index 0000000000..72e636bde3 --- /dev/null +++ b/clients/R/man/getCellBaseResourceHelp.Rd @@ -0,0 +1,34 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/commons.R +\name{getCellBaseResourceHelp} +\alias{getCellBaseResourceHelp} +\title{getCellBaseResourceHelp} +\usage{ +getCellBaseResourceHelp(object, subcategory) +} +\arguments{ +\item{object}{a cellBase class object} + +\item{subcategory}{a character the subcategory to be queried} +} +\value{ +character vector of the available resources to that particular +subcategory +} +\description{ +A function to get help about available cellbase resources +} +\details{ +This function retrieves available resources for each generic method +like getGene, getRegion, getprotein, etc. It help the user see all possible +resources to use with the getGeneric methods +} +\examples{ +cb <- CellBaseR() +# Get help about what resources are available to the getGene method +getCellBaseResourceHelp(cb, subcategory="gene") +# Get help about what resources are available to the getRegion method +getCellBaseResourceHelp(cb, subcategory="region") +# Get help about what resources are available to the getXref method +getCellBaseResourceHelp(cb, subcategory="id") +} diff --git a/clients/R/man/getChromosomeInfo-CellBaseR-method.Rd b/clients/R/man/getChromosomeInfo-CellBaseR-method.Rd new file mode 100644 index 0000000000..8b752b30da --- /dev/null +++ b/clients/R/man/getChromosomeInfo-CellBaseR-method.Rd @@ -0,0 +1,40 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/getChromosomeInfo-methods.R +\docType{methods} +\name{getChromosomeInfo,CellBaseR-method} +\alias{getChromosomeInfo,CellBaseR-method} +\alias{getChromosomeInfo} +\title{getChromosomeInfo} +\usage{ +\S4method{getChromosomeInfo}{CellBaseR}(object, ids, resource, param = NULL) +} +\arguments{ +\item{object}{an object of class CellBaseR} + +\item{ids}{a character vector of chromosome ids to be queried} + +\item{resource}{a character vector to specify the resource to be queried} + +\item{param}{a object of class CellBaseParam specifying additional param for +the query} +} +\value{ +a dataframe with the results of the query +} +\description{ +A method to query sequence data from Cellbase web services. +} +\details{ +A method to query sequence data from Cellbase web services. This +method retrieves information about chromosomes, including its size and +detailed information about its different cytobands +} +\examples{ + cb <- CellBaseR() + res <- getChromosomeInfo(object=cb, ids="22", resource="info") +} +\seealso{ +\url{https://github.com/opencb/cellbase/wiki} +and the RESTful API documentation +\url{http://bioinfo.hpc.cam.ac.uk/cellbase/webservices/} +} diff --git a/clients/R/man/getClinical-CellBaseR-method.Rd b/clients/R/man/getClinical-CellBaseR-method.Rd new file mode 100644 index 0000000000..e2c3f7b36c --- /dev/null +++ b/clients/R/man/getClinical-CellBaseR-method.Rd @@ -0,0 +1,38 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/getClinical-methods.R +\docType{methods} +\name{getClinical,CellBaseR-method} +\alias{getClinical,CellBaseR-method} +\alias{getClinical} +\title{getClinical} +\usage{ +\S4method{getClinical}{CellBaseR}(object, param = NULL) +} +\arguments{ +\item{object}{an object of class CellBaseR} + +\item{param}{a object of class CellBaseParam specifying the parameters +limiting the CellBaseR} +} +\value{ +a dataframe with the results of the query +} +\description{ +A method to query Clinical data from Cellbase web services. +} +\details{ +This method retrieves clinicaly relevant variants annotations from +multiple resources including clinvar, cosmic and gwas catalog. Furthermore, + the user can filter these data in many ways including phenotype, genes, rs, + etc,. +} +\examples{ + cb <- CellBaseR() + cbParam <- CellBaseParam(gene=c("TP73","TET1")) + res <- getClinical(object=cb,param=cbParam) +} +\seealso{ +\url{https://github.com/opencb/cellbase/wiki} +and the RESTful API documentation +\url{http://bioinfo.hpc.cam.ac.uk/cellbase/webservices/} +} diff --git a/clients/R/man/getClinicalByGene.Rd b/clients/R/man/getClinicalByGene.Rd new file mode 100644 index 0000000000..c34e139616 --- /dev/null +++ b/clients/R/man/getClinicalByGene.Rd @@ -0,0 +1,25 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/user.R +\name{getClinicalByGene} +\alias{getClinicalByGene} +\title{getClinicalByGene} +\usage{ +getClinicalByGene(object, id, param = NULL) +} +\arguments{ +\item{object}{an object of CellBaseR class} + +\item{id}{a charcter vector of HUGO symbol (gene names)} + +\item{param}{an object of class CellBaseParam} +} +\value{ +a dataframe of the query result +} +\description{ +A convienice method to fetch clinical variants for specific gene/s +} +\examples{ +cb <- CellBaseR() +res <- getClinicalByGene(cb, "TET1") +} diff --git a/clients/R/man/getClinicalByRegion.Rd b/clients/R/man/getClinicalByRegion.Rd new file mode 100644 index 0000000000..2f68678d68 --- /dev/null +++ b/clients/R/man/getClinicalByRegion.Rd @@ -0,0 +1,25 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/user.R +\name{getClinicalByRegion} +\alias{getClinicalByRegion} +\title{getClinicalByRegion} +\usage{ +getClinicalByRegion(object, id, param = NULL) +} +\arguments{ +\item{object}{an object of class CellBaseR} + +\item{id}{a charcter vector of genomic regions, eg 17:1000000-1100000} + +\item{param}{an object of class CellBaseParam} +} +\value{ +a dataframe of the query result +} +\description{ +A convienice method to fetch clinical variants for specific region/s +} +\examples{ +cb <- CellBaseR() +res <- getClinicalByRegion(cb, "17:1000000-1189811") +} diff --git a/clients/R/man/getConservationByRegion.Rd b/clients/R/man/getConservationByRegion.Rd new file mode 100644 index 0000000000..1863c69334 --- /dev/null +++ b/clients/R/man/getConservationByRegion.Rd @@ -0,0 +1,25 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/user.R +\name{getConservationByRegion} +\alias{getConservationByRegion} +\title{getConservationByRegion} +\usage{ +getConservationByRegion(object, id, param = NULL) +} +\arguments{ +\item{object}{an object of class CellBaseR} + +\item{id}{a charcter vector of genomic regions, eg 17:1000000-1100000} + +\item{param}{an object of class CellBaseParam} +} +\value{ +a dataframe of the query result +} +\description{ +A convienice method to fetch conservation data for specific region/s +} +\examples{ +cb <- CellBaseR() +res <- getConservationByRegion(cb, "17:1000000-1189811") +} diff --git a/clients/R/man/getGene-CellBaseR-method.Rd b/clients/R/man/getGene-CellBaseR-method.Rd new file mode 100644 index 0000000000..4f7a2e29aa --- /dev/null +++ b/clients/R/man/getGene-CellBaseR-method.Rd @@ -0,0 +1,39 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/getGene-methods.R +\docType{methods} +\name{getGene,CellBaseR-method} +\alias{getGene,CellBaseR-method} +\alias{getGene} +\title{getGene} +\usage{ +\S4method{getGene}{CellBaseR}(object, ids, resource, param = NULL) +} +\arguments{ +\item{object}{an object of class CellBaseR} + +\item{ids}{a character vector of gene ids to be queried} + +\item{resource}{a character vector to specify the resource to be queried} + +\item{param}{an object of class CellBaseParam specifying additional param +for the CellBaseR} +} +\value{ +a dataframe with the results of the query +} +\description{ +A method to query gene data from Cellbase web services. +} +\details{ +This method retrieves various gene annotations including transcripts +and exons data as well as gene expression and clinical data +} +\examples{ + cb <- CellBaseR() + res <- getGene(object=cb, ids=c("TP73","TET1"), resource="info") +} +\seealso{ +\url{https://github.com/opencb/cellbase/wiki} +and the RESTful API documentation +\url{http://bioinfo.hpc.cam.ac.uk/cellbase/webservices/} +} diff --git a/clients/R/man/getGeneInfo.Rd b/clients/R/man/getGeneInfo.Rd new file mode 100644 index 0000000000..15f18223a4 --- /dev/null +++ b/clients/R/man/getGeneInfo.Rd @@ -0,0 +1,25 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/user.R +\name{getGeneInfo} +\alias{getGeneInfo} +\title{getGeneInfo} +\usage{ +getGeneInfo(object, id, param = NULL) +} +\arguments{ +\item{object}{an object of class CellBaseR} + +\item{id}{a charcter vector of HUGO symbol (gene names)} + +\item{param}{an object of class CellBaseParam} +} +\value{ +a dataframe of the query result +} +\description{ +A convienice method to fetch gene annotations specific gene/s +} +\examples{ +cb <- CellBaseR() +res <- getGeneInfo(cb, "TET1") +} diff --git a/clients/R/man/getMeta-CellBaseR-method.Rd b/clients/R/man/getMeta-CellBaseR-method.Rd new file mode 100644 index 0000000000..bfff5a385e --- /dev/null +++ b/clients/R/man/getMeta-CellBaseR-method.Rd @@ -0,0 +1,36 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/getMeta-methods.R +\docType{methods} +\name{getMeta,CellBaseR-method} +\alias{getMeta,CellBaseR-method} +\alias{getMeta} +\title{getMeta} +\usage{ +\S4method{getMeta}{CellBaseR}(object, resource) +} +\arguments{ +\item{object}{an object of class CellBaseR} + +\item{resource}{the resource you want to query it metadata} +} +\value{ +a dataframe with the + results of the query +} +\description{ +A method for getting the available metadata from the cellbase web services +} +\details{ +This method is for getting information about the avaialable species +and available annotation, assembly for each species from the cellbase web +services. +} +\examples{ + cb <- CellBaseR() + res <- getMeta(object=cb, resource="species") +} +\seealso{ +\url{https://github.com/opencb/cellbase/wiki} +and the RESTful API documentation +\url{http://bioinfo.hpc.cam.ac.uk/cellbase/webservices/} +} diff --git a/clients/R/man/getProtein-CellBaseR-method.Rd b/clients/R/man/getProtein-CellBaseR-method.Rd new file mode 100644 index 0000000000..73831945ff --- /dev/null +++ b/clients/R/man/getProtein-CellBaseR-method.Rd @@ -0,0 +1,36 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/getProtein-methods.R +\docType{methods} +\name{getProtein,CellBaseR-method} +\alias{getProtein,CellBaseR-method} +\alias{getProtein} +\title{getProtein} +\usage{ +\S4method{getProtein}{CellBaseR}(object, ids, resource, param = NULL) +} +\arguments{ +\item{object}{an object of class CellBaseR} + +\item{ids}{a character vector of uniprot ids to be queried, should be one +or more of uniprot ids, for example O15350.} + +\item{resource}{a character vector to specify the resource to be queried} + +\item{param}{a object of class CellBaseParam specifying additional param +for the query} +} +\value{ +an object of class CellBaseResponse which holds a dataframe with th +e results of the query +} +\description{ +A method to query protein data from Cellbase web services. +} +\details{ +This method retrieves various protein annotations including +protein description, features, sequence, substitution scores, evidence, etc. +} +\examples{ + cb <- CellBaseR() + res <- getProtein(object=cb, ids="O15350", resource="info") +} diff --git a/clients/R/man/getProteinInfo.Rd b/clients/R/man/getProteinInfo.Rd new file mode 100644 index 0000000000..ef48f0dca0 --- /dev/null +++ b/clients/R/man/getProteinInfo.Rd @@ -0,0 +1,25 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/user.R +\name{getProteinInfo} +\alias{getProteinInfo} +\title{getProteinInfo} +\usage{ +getProteinInfo(object, id, param = NULL) +} +\arguments{ +\item{object}{an object of class CellBaseR} + +\item{id}{a charcter vector of Uniprot Ids} + +\item{param}{an object of class CellBaseParam} +} +\value{ +a dataframe of the query result +} +\description{ +A convienice method to fetch annotations for specific protein/s +} +\examples{ +cb <- CellBaseR() +res <- getProteinInfo(cb, "O15350") +} diff --git a/clients/R/man/getRegion-CellBaseR-method.Rd b/clients/R/man/getRegion-CellBaseR-method.Rd new file mode 100644 index 0000000000..892e2c996c --- /dev/null +++ b/clients/R/man/getRegion-CellBaseR-method.Rd @@ -0,0 +1,42 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/getRegion-methods.R +\docType{methods} +\name{getRegion,CellBaseR-method} +\alias{getRegion,CellBaseR-method} +\alias{getRegion} +\title{getRegion} +\usage{ +\S4method{getRegion}{CellBaseR}(object, ids, resource, param = NULL) +} +\arguments{ +\item{object}{an object of class CellBaseR} + +\item{ids}{a character vector of the regions to be queried, for example, + "1:1000000-1200000' should always be in the +form 'chr:start-end'} + +\item{resource}{a character vector to specify the resource to be queried} + +\item{param}{a object of class CellBaseParam specifying additional param +for the query} +} +\value{ +a dataframe with the results of the query +} +\description{ +A method to query features within a genomic region from Cellbase web + services. +} +\details{ +This method retrieves various genomic features from a given +region including genes, snps, clincally relevant variants, proteins, etc. +} +\examples{ + cb <- CellBaseR() + res <- getRegion(object=cb, ids="17:1000000-1200000", resource="gene") +} +\seealso{ +\url{https://github.com/opencb/cellbase/wiki} +and the RESTful API documentation +\url{http://bioinfo.hpc.cam.ac.uk/cellbase/webservices/} +} diff --git a/clients/R/man/getRegulatoryByRegion.Rd b/clients/R/man/getRegulatoryByRegion.Rd new file mode 100644 index 0000000000..a5dead28ae --- /dev/null +++ b/clients/R/man/getRegulatoryByRegion.Rd @@ -0,0 +1,25 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/user.R +\name{getRegulatoryByRegion} +\alias{getRegulatoryByRegion} +\title{getRegulatoryByRegion} +\usage{ +getRegulatoryByRegion(object, id, param = NULL) +} +\arguments{ +\item{object}{an object of class CellBaseR} + +\item{id}{a charcter vector of genomic regions, eg 17:1000000-1100000} + +\item{param}{an object of class CellBaseParam} +} +\value{ +a dataframe of the query result +} +\description{ +A convienice method to fetch regulatory data for specific region/s +} +\examples{ +cb <- CellBaseR() +res <- getRegulatoryByRegion(cb, "17:1000000-1189811") +} diff --git a/clients/R/man/getSnp-CellBaseR-method.Rd b/clients/R/man/getSnp-CellBaseR-method.Rd new file mode 100644 index 0000000000..a1486e9614 --- /dev/null +++ b/clients/R/man/getSnp-CellBaseR-method.Rd @@ -0,0 +1,43 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/getSnp-methods.R +\docType{methods} +\name{getSnp,CellBaseR-method} +\alias{getSnp,CellBaseR-method} +\alias{getSnp} +\title{getSnp} +\usage{ +\S4method{getSnp}{CellBaseR}(object, ids, resource, param = NULL) +} +\arguments{ +\item{object}{an object of class CellBaseR} + +\item{ids}{a character vector of the ids to be queried, must be a valid rsid, +for example 'rs6025'} + +\item{resource}{a character vector to specify the resource to be queried} + +\item{param}{a object of class CellBaseParam specifying additional param +for the query} +} +\value{ +a dataframe with the results of the query +} +\description{ +A method to query genomic variation data from Cellbase web services. +} +\details{ +. + +This method retrieves known genomic variants (snps) and their +annotations including population frequncies from 1k genomes and Exac projects +as well as clinical data and various other annotations +} +\examples{ +cb <- CellBaseR() +res <- getSnp(object=cb, ids="rs6025", resource="info") +} +\seealso{ +\url{https://github.com/opencb/cellbase/wiki} +and the RESTful API documentation +\url{http://bioinfo.hpc.cam.ac.uk/cellbase/webservices/} +} diff --git a/clients/R/man/getSnpByGene.Rd b/clients/R/man/getSnpByGene.Rd new file mode 100644 index 0000000000..efb4caf44f --- /dev/null +++ b/clients/R/man/getSnpByGene.Rd @@ -0,0 +1,26 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/user.R +\name{getSnpByGene} +\alias{getSnpByGene} +\title{getSnpByGene} +\usage{ +getSnpByGene(object, id, param = NULL) +} +\arguments{ +\item{object}{an object of class CellBaseR} + +\item{id}{a charcter vector of HUGO symbol (gene names)} + +\item{param}{an object of class CellBaseParam} +} +\value{ +a dataframe of the query result +} +\description{ +A convienice method to fetch known variants (snps) for specific gene/s +} +\examples{ +cb <- CellBaseR() +param <- CellBaseParam(limit = 10) +res <- getSnpByGene(cb, "TET1", param = param) +} diff --git a/clients/R/man/getTf-CellBaseR-method.Rd b/clients/R/man/getTf-CellBaseR-method.Rd new file mode 100644 index 0000000000..ef1a11b09e --- /dev/null +++ b/clients/R/man/getTf-CellBaseR-method.Rd @@ -0,0 +1,43 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/getTf-methods.R +\docType{methods} +\name{getTf,CellBaseR-method} +\alias{getTf,CellBaseR-method} +\alias{getTf} +\title{getTf} +\usage{ +\S4method{getTf}{CellBaseR}(object, ids, resource, param = NULL) +} +\arguments{ +\item{object}{an object of class CellBaseR} + +\item{ids}{a character vector of the ids to be queried, must be a valid +transcription factor name, for example, +eg, CTCF} + +\item{resource}{a character vector to specify the resource to be queried} + +\item{param}{a object of class CellBaseParam specifying additional param +for the query} +} +\value{ +a dataframe with the results of the query +} +\description{ +A method to query transcription factors binding sites data from Cellbase web + services. +} +\details{ +This method retrieves various transcription factors binding sites +data +} +\examples{ + cb <- CellBaseR() + param <- CellBaseParam(limit = 12) + res <- getTf(object=cb, ids="CTCF", resource="tfbs", param=param) +} +\seealso{ +\url{https://github.com/opencb/cellbase/wiki} +and the RESTful API documentation +\url{http://bioinfo.hpc.cam.ac.uk/cellbase/webservices/} +} diff --git a/clients/R/man/getTfbsByRegion.Rd b/clients/R/man/getTfbsByRegion.Rd new file mode 100644 index 0000000000..08799f8d42 --- /dev/null +++ b/clients/R/man/getTfbsByRegion.Rd @@ -0,0 +1,25 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/user.R +\name{getTfbsByRegion} +\alias{getTfbsByRegion} +\title{getTfbsByRegion} +\usage{ +getTfbsByRegion(object, id, param = NULL) +} +\arguments{ +\item{object}{an object of class CellBaseR} + +\item{id}{a charcter vector of genomic regions, eg 17:1000000-1100000} + +\item{param}{an object of class CellBaseParam} +} +\value{ +a dataframe of the query result +} +\description{ +A convienice method to fetch Transcription facrots data for specific region/s +} +\examples{ +cb <- CellBaseR() +res <- getTfbsByRegion(cb, "17:1000000-1189811") +} diff --git a/clients/R/man/getTranscript-CellBaseR-method.Rd b/clients/R/man/getTranscript-CellBaseR-method.Rd new file mode 100644 index 0000000000..c00909663a --- /dev/null +++ b/clients/R/man/getTranscript-CellBaseR-method.Rd @@ -0,0 +1,40 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/getTranscript-methods.R +\docType{methods} +\name{getTranscript,CellBaseR-method} +\alias{getTranscript,CellBaseR-method} +\alias{getTranscript} +\title{getTranscript} +\usage{ +\S4method{getTranscript}{CellBaseR}(object, ids, resource, param = NULL) +} +\arguments{ +\item{object}{an object of class CellBaseR} + +\item{ids}{a character vector of the transcript ids to be queried, use +ensemble transccript IDs eq, ENST00000380152} + +\item{resource}{a character vector to specify the resource to be queried} + +\item{param}{an object of class CellBaseParam specifying additional params +for the query} +} +\value{ +a dataframe with the results of the query +} +\description{ +A method to query transcript data from Cellbase web services. +} +\details{ +This method retrieves various genomic annotations for transcripts + including exons, cDNA sequence, annotations flags, and cross references,etc. +} +\examples{ + cb <- CellBaseR() + res <- getTranscript(object=cb, ids="ENST00000373644", resource="info") +} +\seealso{ +\url{https://github.com/opencb/cellbase/wiki} +and the RESTful API documentation +\url{http://bioinfo.hpc.cam.ac.uk/cellbase/webservices/} +} diff --git a/clients/R/man/getTranscriptByGene.Rd b/clients/R/man/getTranscriptByGene.Rd new file mode 100644 index 0000000000..696f9700ad --- /dev/null +++ b/clients/R/man/getTranscriptByGene.Rd @@ -0,0 +1,25 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/user.R +\name{getTranscriptByGene} +\alias{getTranscriptByGene} +\title{getTranscriptByGene} +\usage{ +getTranscriptByGene(object, id, param = NULL) +} +\arguments{ +\item{object}{an object of class CellBaseR} + +\item{id}{a charcter vector of HUGO symbol (gene names)} + +\item{param}{an object of class CellBaseParam} +} +\value{ +a dataframe of the query result +} +\description{ +A convienice method to fetch transcripts for specific gene/s +} +\examples{ +cb <- CellBaseR() +res <- getTranscriptByGene(cb, "TET1") +} diff --git a/clients/R/man/getVariant-CellBaseR-method.Rd b/clients/R/man/getVariant-CellBaseR-method.Rd new file mode 100644 index 0000000000..1d28d2ca9b --- /dev/null +++ b/clients/R/man/getVariant-CellBaseR-method.Rd @@ -0,0 +1,44 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/getVariant-methods.R +\docType{methods} +\name{getVariant,CellBaseR-method} +\alias{getVariant,CellBaseR-method} +\alias{getVariant} +\title{getVariant} +\usage{ +\S4method{getVariant}{CellBaseR}(object, ids, resource, param = NULL) +} +\arguments{ +\item{object}{an object of class CellBaseR} + +\item{ids}{a character vector of the ids to be queried, must be in the +following format 'chr:start:ref:alt', for +example, '1:128546:A:T'} + +\item{resource}{a character vector to specify the resource to be queried} + +\item{param}{a object of class CellBaseParam specifying additional param +for the query} +} +\value{ +a dataframe with the results of the query +} +\description{ +A method to query variant annotation data from Cellbase web services from + Cellbase web services. +} +\details{ +This method retrieves extensive genomic annotations for variants +including consequence types, conservation data, population frequncies from 1k + genomes and Exac projects, etc. +as well as clinical data and various other annotations +} +\examples{ + cb <- CellBaseR() + res <- getVariant(object=cb, ids="19:45411941:T:C", resource="annotation") +} +\seealso{ +\url{https://github.com/opencb/cellbase/wiki} +and the RESTful API documentation +\url{http://bioinfo.hpc.cam.ac.uk/cellbase/webservices/} +} diff --git a/clients/R/man/getVariantAnnotation.Rd b/clients/R/man/getVariantAnnotation.Rd new file mode 100644 index 0000000000..12149d481a --- /dev/null +++ b/clients/R/man/getVariantAnnotation.Rd @@ -0,0 +1,26 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/user.R +\name{getVariantAnnotation} +\alias{getVariantAnnotation} +\title{getVariantAnnotation} +\usage{ +getVariantAnnotation(object, id, param = NULL) +} +\arguments{ +\item{object}{an object of class CellBaseR} + +\item{id}{a charcter vector of length < 200 of genomic variants, +eg 19:45411941:T:C} + +\item{param}{an object of class CellBaseParam} +} +\value{ +a dataframe of the query result +} +\description{ +A convienice method to fetch variant annotation for specific variant/s +} +\examples{ +cb <- CellBaseR() +res <- getVariantAnnotation(cb, "19:45411941:T:C") +} diff --git a/clients/R/man/getXref-CellBaseR-method.Rd b/clients/R/man/getXref-CellBaseR-method.Rd new file mode 100644 index 0000000000..7ea73a8623 --- /dev/null +++ b/clients/R/man/getXref-CellBaseR-method.Rd @@ -0,0 +1,42 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/getXref-methods.R +\docType{methods} +\name{getXref,CellBaseR-method} +\alias{getXref,CellBaseR-method} +\alias{getXref} +\title{getXref} +\usage{ +\S4method{getXref}{CellBaseR}(object, ids, resource, param = NULL) +} +\arguments{ +\item{object}{an object of class CellBaseR} + +\item{ids}{a character vector of the ids to be queried, any crossrefereable + ID, gene names, transcript ids, +uniprot ids,etc.} + +\item{resource}{a character vector to specify the resource to be queried} + +\item{param}{a object of class CellBaseParam specifying additional param +for the query} +} +\value{ +a dataframe with the results of the query +} +\description{ +A method to query cross reference data from Cellbase web services. +} +\details{ +This method retrieves cross references for genomic identifiers, eg +ENSEMBL ids, it also provide starts_with service that is useful for +autocomplete services. +} +\examples{ + cb <- CellBaseR() + res <- getXref(object=cb, ids="ENST00000373644", resource="xref") +} +\seealso{ +\url{https://github.com/opencb/cellbase/wiki} +and the RESTful API documentation +\url{http://bioinfo.hpc.cam.ac.uk/cellbase/webservices/} +} diff --git a/clients/R/vignettes/cellbaseR.Rmd b/clients/R/vignettes/cellbaseR.Rmd index 4c58081450..3bce5ff940 100644 --- a/clients/R/vignettes/cellbaseR.Rmd +++ b/clients/R/vignettes/cellbaseR.Rmd @@ -2,7 +2,7 @@ title: "Simplifying Genomic Annotations in R" author: "Mohammed Omar Elsiddieg Abdallah" date: "`r doc_date()`" -package: "`r pkg_ver('BiocStyle')`" +package: "`r pkg_ver('cellbaseR')`" # BiocStyle::html_document vignette: > %\VignetteIndexEntry{"Simplifying Genomic Annotations in R"} @@ -32,53 +32,35 @@ Cellbase web services. Let us start by loading the library. library(cellbaseR) # A default cellbaseR object is created as follows cb <- CellBaseR() -# to change the default species from human to mouse for example -mm <-CellBaseR(species = "mmsculus") - -``` - -You can see the avaiable species and their corresonding data by -running the cbSpecies method passing the CellbBseR object you just created - -```{r, message=FALSE, warning=FALSE} -library(cellbaseR) -cb <- CellBaseR() -sp <- cbSpeciesClient(object = cb) -# This will give you a CellbaseResult object -# to get the dataframe of all available species -sp <- cbData(sp) -str(sp,1) - ``` ## The CellbaseR Methods -In addition to the cbSpecies you have seen already, The cellbaseR package +The cellbaseR package provide many methods to query the cellbase webservices, they include: -- cbGeneClient -- cbSnpClient -- cbProteinClient -- cbTranscriptClient -- cbRegionClient -- cbVariantClient -- cbXrefClient -- cbClinicalClient +- getGene +- getSnp +- getProtein +- getTranscript +- getRegion +- getVariant +- getClinical +- getTf +- getXref + In all cases the user is expected to provide the ids for the query and the resource to be queried, in addition to the CellbaseQuery object they created. For example, a query through the cbGene will look something like this -### cbGeneClient +### getGene ```{r, message=FALSE, warning=FALSE} library(cellbaseR) cb <- CellBaseR() genes <- c("TP73","TET1") - -res <- cbGeneClient(object = cb, ids = genes, resource = "info") -# to get the resulting data.frame run cellbaseData() -res <- cbData(object = res) +res <- getGene(object = cb, ids = genes, resource = "info") str(res,2) -# as you can see the res dataframe also contains a transcriots column +# as you can see the res dataframe also contains a transcripts column # which is in fact a list column of nested dataframes, to get the # trasnscripts data.frame for first gene TET1_transcripts <- res$transcripts[[1]] @@ -86,28 +68,27 @@ str(TET1_transcripts,1) ``` -### cbRegionClient +### getRegion ```{r, message=FALSE, warning=FALSE} # making a query through cbRegion to get all the clinically relevant variants # in a specific region library(cellbaseR) cb <- CellBaseR() -res <- cbRegionClient(object=cb,ids="17:1000000-1100000", +res <- getRegion(object=cb,ids="17:1000000-1005000", resource="clinical") # to get all conservation data in this region -res <- cbRegionClient(object=cb,ids="17:1000000-1100000", +res <- getRegion(object=cb,ids="17:1000000-1005000", resource="conservation") #likewise to get all the regulatory data for the same region -res <- cbRegionClient(object=cb,ids="17:1000000-1100000", resource="regulatory") -res <- cbData(res) +res <- getRegion(object=cb,ids="17:1000000-1005000", resource="regulatory") str(res,1) ``` -### cbVraiantClient +### getVariant Getting annotation for a specific variant ```{r, eval=FALSE,message=FALSE, warning=FALSE} library(cellbaseR) cb <- CellBaseR() -res2 <- cbVariantClient(object=cb, ids="1:169549811:A:G", resource="annotation") +res2 <- getVariant(object=cb, ids="1:169549811:A:G", resource="annotation") # to get the data res2 <- cbData(res2) str(res2, 1) @@ -116,20 +97,18 @@ str(res2, 1) A very powerfull feature of cellbaseR is ability to fetch a wealth of clinical data, as well as abiliy to fiter these data by gene, phenotype, rs, etc… -### cbClinical +### getClinical ```{r, eval=TRUE, message=FALSE, warning=FALSE} library(cellbaseR) cb <- CellBaseR() -# First we have to specify aour filters, we do that by creating an object of +# First we have to specify aour param, we do that by creating an object of # class CellbaseParam cbparam <- CellBaseParam(gene="TET1", genome="GRCh38") cbparam -# Note that cbClinical does NOT require any Ids to be passed, only the filters +# Note that cbClinical does NOT require any Ids to be passed, only the param # and of course the CellbaseQuery object -res <- cbClinicalClient(object=cb,filters=cbparam) -res -res <- cbData(res) +res <- getClinical(object=cb,param=cbparam) str(res,1) ``` @@ -139,32 +118,33 @@ str(res,1) A usefull utility for fast building of gene models, compatible with Gviz package for genomic visualization -```{r,message=FALSE, warning=FALSE, eval=FALSE} +```{r,message=FALSE, warning=FALSE, eval=TRUE} library(cellbaseR) cb <- CellBaseR() test <- createGeneModel(object = cb, region = "17:1500000-1550000") -library(Gviz) -testTrack <- GeneRegionTrack(test) -plotTracks(testTrack, transcriptAnnotation='symbol') -# then you can use this track in conjunction with any other tracks -ideoTrack <- IdeogramTrack(genome = "hg19", chromosome = "chr17") -axisTrack <- GenomeAxisTrack() -from <- min(test$start)-5000 -to <- max(test$end)+5000 -plotTracks(list(ideoTrack,axisTrack,testTrack),from = from, to = to, transcriptAnnotation='symbol') - +if(require("Gviz")){ + testTrack <- Gviz::GeneRegionTrack(test) + Gviz::plotTracks(testTrack, transcriptAnnotation='symbol') +} ``` -## cbAnnotateVcf -This utility allows users to annoate genomic variants from small to medium-sized vcf files directly from the cellbase server, with a wealth of genomic annotations including riche clinical annotations like clinvar, gwas, and cosmic data, as well as conservation and functional scores like phast and cadd scores, without the need to download any files. -```{r, message=FALSE, warning=FALSE, eval=FALSE} +## AnnotateVcf +This utility allows users to annoate genomic variants from small to medium-sized +vcf files directly from the cellbase server, with a wealth of genomic +annotations including riche clinical annotations like clinvar, gwas, and cosmic +data, as well as conservation and functional scores like phast and cadd scores +, without the need to download any files. +```{r, message=FALSE, warning=FALSE, eval=TRUE} library(cellbaseR) +library(VariantAnnotation) cb <- CellBaseR() -fl <- system.file("extdata", "chr22.vcf.gz", package="VariantAnnotation") -res <- cbAnnotateVcf(object=cb, file=fl) -res <- cbData(res) -res +fl <- system.file("extdata", "hapmap_exome_chr22_500.vcf.gz",package = "cellbaseR" ) +res <- AnnotateVcf(object=cb, file=fl, BPPARAM = bpparam(workers=2)) +vcf <- readVcf(fl, "hg19") +samples(header(vcf)) +length(rowRanges(vcf))==nrow(res) +str(res,1) ```