phyloseq/.travis.yml0000644000175400017540000000036413177706002015563 0ustar00biocbuildbiocbuild# Adapted from sample .travis.yml for R projects language: r bioc_required: true warnings_are_errors: true sudo: required env: global: - CRAN: http://cran.rstudio.com notifications: email: on_success: change on_failure: change phyloseq/DESCRIPTION0000644000175400017540000000400013177723156015160 0ustar00biocbuildbiocbuildPackage: phyloseq Version: 1.22.3 Date: 2017-11-04 Title: Handling and analysis of high-throughput microbiome census data Description: phyloseq provides a set of classes and tools to facilitate the import, storage, analysis, and graphical display of microbiome census data. Maintainer: Paul J. McMurdie Author: Paul J. McMurdie , Susan Holmes , with contributions from Gregory Jordan and Scott Chamberlain License: AGPL-3 Imports: ade4 (>= 1.7.4), ape (>= 5.0), Biobase (>= 2.36.2), BiocGenerics (>= 0.22.0), biomformat (>= 1.0.0), Biostrings (>= 2.40.0), cluster (>= 2.0.4), data.table (>= 1.10.4), foreach (>= 1.4.3), ggplot2 (>= 2.1.0), igraph (>= 1.0.1), methods (>= 3.3.0), multtest (>= 2.28.0), plyr (>= 1.8.3), reshape2 (>= 1.4.1), scales (>= 0.4.0), vegan (>= 2.4) Depends: R (>= 3.4.0) Suggests: BiocStyle (>= 2.4), DESeq2 (>= 1.16.1), genefilter (>= 1.58), knitr (>= 1.16), metagenomeSeq (>= 1.14), rmarkdown (>= 1.6), testthat (>= 1.0.2) VignetteBuilder: knitr Enhances: doParallel (>= 1.0.10) biocViews: Sequencing, Microbiome, Metagenomics, Clustering, Classification, MultipleComparison, GeneticVariability URL: http://dx.plos.org/10.1371/journal.pone.0061217 BugReports: https://github.com/joey711/phyloseq/issues Collate: 'allClasses.R' 'allPackage.R' 'allData.R' 'as-methods.R' 'show-methods.R' 'plot-methods.R' 'extract-methods.R' 'almostAllAccessors.R' 'otuTable-class.R' 'phyloseq-class.R' 'taxonomyTable-class.R' 'IO-methods.R' 'merge-methods.R' 'multtest-wrapper.R' 'ordination-methods.R' 'transform_filter-methods.R' 'validity-methods.R' 'assignment-methods.R' 'sampleData-class.R' 'extend_vegan.R' 'network-methods.R' 'distance-methods.R' 'deprecated_functions.R' 'extend_DESeq2.R' 'phylo-class.R' 'extend_metagenomeSeq.R' RoxygenNote: 6.0.1 NeedsCompilation: no Packaged: 2017-11-06 00:01:50 UTC; biocbuild phyloseq/NAMESPACE0000644000175400017540000001603413177706002014672 0ustar00biocbuildbiocbuild# Generated by roxygen2: do not edit by hand export("otuTable<-") export("otu_table<-") export("phy_tree<-") export("sam_data<-") export("sampleData<-") export("sample_data<-") export("sample_names<-") export("speciesAreRows<-") export("taxTab<-") export("tax_table<-") export("taxa_are_rows<-") export("taxa_names<-") export("tre<-") export(DPCoA) export(UniFrac) export(access) export(build_tax_table) export(distance) export(distanceMethodList) export(estimate_richness) export(export_env_file) export(export_mothur_dist) export(filter_taxa) export(filterfunSample) export(filterfun_sample) export(gapstat_ord) export(genefilterSample) export(genefilter_sample) export(getSamples) export(getSpecies) export(getTaxa) export(getVariable) export(get_sample) export(get_taxa) export(get_taxa_unique) export(get_variable) export(getslots.phyloseq) export(import) export(import_RDP_cluster) export(import_RDP_otu) export(import_biom) export(import_env_file) export(import_mothur) export(import_mothur_dist) export(import_pyrotagger_tab) export(import_qiime) export(import_qiime_otu_tax) export(import_qiime_sampleData) export(import_qiime_sample_data) export(import_uparse) export(import_usearch_uc) export(make_network) export(merge_phyloseq) export(merge_phyloseq_pair) export(merge_samples) export(merge_species) export(merge_taxa) export(microbio_me_qiime) export(mt) export(nodeplotblank) export(nodeplotboot) export(nodeplotdefault) export(nsamples) export(nspecies) export(ntaxa) export(ordinate) export(otuTable) export(otu_table) export(parse_taxonomy_default) export(parse_taxonomy_greengenes) export(parse_taxonomy_qiime) export(phy_tree) export(phyloseq) export(phyloseq_to_deseq2) export(phyloseq_to_metagenomeSeq) export(plot_bar) export(plot_clusgap) export(plot_heatmap) export(plot_net) export(plot_network) export(plot_ordination) export(plot_phyloseq) export(plot_richness) export(plot_richness_estimates) export(plot_scree) export(plot_taxa_bar) export(plot_tree) export(prune_samples) export(prune_species) export(prune_taxa) export(psmelt) export(rank.names) export(rank_names) export(rarefy_even_depth) export(read_tree) export(read_tree_greengenes) export(refseq) export(rm_outlierf) export(samData) export(sam_data) export(sample.names) export(sample.variables) export(sampleData) export(sampleNames) export(sampleSums) export(sample_data) export(sample_names) export(sample_sums) export(sample_variables) export(show_mothur_cutoffs) export(show_mothur_list_cutoffs) export(species.names) export(speciesAreRows) export(speciesSums) export(speciesarerows) export(subset_ord_plot) export(subset_samples) export(subset_species) export(subset_taxa) export(t) export(taxTab) export(tax_glom) export(tax_table) export(taxa_are_rows) export(taxa_names) export(taxa_sums) export(taxaplot) export(taxglom) export(taxtab) export(threshrank) export(threshrankfun) export(tip_glom) export(tipglom) export(topf) export(topk) export(topp) export(transformSampleCounts) export(transform_sample_counts) export(tre) export(tree_layout) exportClasses(dist) exportClasses(otu_table) exportClasses(phylo) exportClasses(phyloseq) exportClasses(sample_data) exportClasses(taxonomyTable) exportMethods("[") exportMethods(show) import(BiocGenerics) import(foreach) import(methods) import(reshape2) importClassesFrom(Biostrings,AAStringSet) importClassesFrom(Biostrings,BStringSet) importClassesFrom(Biostrings,DNAStringSet) importClassesFrom(Biostrings,IlluminaQuality) importClassesFrom(Biostrings,PhredQuality) importClassesFrom(Biostrings,QualityScaledAAStringSet) importClassesFrom(Biostrings,QualityScaledBStringSet) importClassesFrom(Biostrings,QualityScaledDNAStringSet) importClassesFrom(Biostrings,QualityScaledRNAStringSet) importClassesFrom(Biostrings,QualityScaledXStringSet) importClassesFrom(Biostrings,RNAStringSet) importClassesFrom(Biostrings,SolexaQuality) importClassesFrom(Biostrings,XStringQuality) importClassesFrom(Biostrings,XStringSet) importFrom(Biobase,AnnotatedDataFrame) importFrom(Biostrings,readDNAStringSet) importFrom(ade4,cailliez) importFrom(ade4,dpcoa) importFrom(ade4,is.euclid) importFrom(ape,consensus) importFrom(ape,cophenetic.phylo) importFrom(ape,drop.tip) importFrom(ape,is.rooted) importFrom(ape,ladderize) importFrom(ape,node.depth) importFrom(ape,node.depth.edgelength) importFrom(ape,node.height) importFrom(ape,pcoa) importFrom(ape,prop.part) importFrom(ape,read.nexus) importFrom(ape,read.tree) importFrom(ape,reorder.phylo) importFrom(ape,root) importFrom(ape,write.nexus) importFrom(biomformat,biom_data) importFrom(biomformat,observation_metadata) importFrom(biomformat,read_biom) importFrom(biomformat,sample_metadata) importFrom(cluster,agnes) importFrom(cluster,clusGap) importFrom(cluster,pam) importFrom(data.table,copy) importFrom(data.table,data.table) importFrom(data.table,fread) importFrom(data.table,setkey) importFrom(data.table,setkeyv) importFrom(data.table,setnames) importFrom(ggplot2,aes) importFrom(ggplot2,aes_string) importFrom(ggplot2,element_blank) importFrom(ggplot2,element_text) importFrom(ggplot2,facet_grid) importFrom(ggplot2,facet_wrap) importFrom(ggplot2,geom_bar) importFrom(ggplot2,geom_errorbar) importFrom(ggplot2,geom_line) importFrom(ggplot2,geom_path) importFrom(ggplot2,geom_point) importFrom(ggplot2,geom_raster) importFrom(ggplot2,geom_segment) importFrom(ggplot2,geom_text) importFrom(ggplot2,ggplot) importFrom(ggplot2,ggtitle) importFrom(ggplot2,scale_alpha) importFrom(ggplot2,scale_fill_gradient) importFrom(ggplot2,scale_size) importFrom(ggplot2,scale_size_continuous) importFrom(ggplot2,scale_size_manual) importFrom(ggplot2,scale_x_continuous) importFrom(ggplot2,scale_x_discrete) importFrom(ggplot2,scale_y_discrete) importFrom(ggplot2,theme) importFrom(ggplot2,theme_bw) importFrom(ggplot2,update_labels) importFrom(ggplot2,xlab) importFrom(ggplot2,ylab) importFrom(igraph,V) importFrom(igraph,degree) importFrom(igraph,delete.vertices) importFrom(igraph,get.edgelist) importFrom(igraph,get.vertex.attribute) importFrom(igraph,graph.adjacency) importFrom(igraph,graph.data.frame) importFrom(igraph,layout.auto) importFrom(igraph,layout.circle) importFrom(igraph,layout.fruchterman.reingold) importFrom(igraph,layout.fruchterman.reingold.grid) importFrom(igraph,layout.graphopt) importFrom(igraph,layout.kamada.kawai) importFrom(igraph,layout.lgl) importFrom(igraph,layout.random) importFrom(igraph,layout.reingold.tilford) importFrom(igraph,layout.sphere) importFrom(igraph,layout.spring) importFrom(igraph,layout.svd) importFrom(igraph,vcount) importFrom(multtest,mt.maxT) importFrom(multtest,mt.minP) importFrom(plyr,ddply) importFrom(plyr,is.discrete) importFrom(plyr,ldply) importFrom(plyr,llply) importFrom(scales,log_trans) importFrom(stats,p.adjust) importFrom(stats,p.adjust.methods) importFrom(vegan,betadiver) importFrom(vegan,capscale) importFrom(vegan,cca) importFrom(vegan,decorana) importFrom(vegan,decostand) importFrom(vegan,designdist) importFrom(vegan,diversity) importFrom(vegan,estimateR) importFrom(vegan,fisher.alpha) importFrom(vegan,metaMDS) importFrom(vegan,rda) importFrom(vegan,scores) importFrom(vegan,vegdist) importFrom(vegan,wascores) importFrom(vegan,wisconsin) phyloseq/R/0000755000175400017540000000000013177706002013650 5ustar00biocbuildbiocbuildphyloseq/R/IO-methods.R0000644000175400017540000032251513175714136015760 0ustar00biocbuildbiocbuild################################################################################ #' Universal import method (wrapper) for phyloseq-package #' #' A user must still understand the additional arguments required for each #' type of import data. Those arguments are described in detail at the #' tool-specific \code{import_*} links below. Each clustering tool / package / pipeline #' has its own idiosyncratic set of file names / types, and it remains the #' responsibility of the user to understand which file-path should be provided #' to each argument for the particular importing submethod. This method #' merely provides a central documentation and method-name, and the arguments #' are passed along as-is. #' #' @usage import(pipelineName, ...) #' #' @param pipelineName (Required). Character string. The name of the #' analysis tool / pipeline / package #' that created the OTU-cluster data or other data that you now want to import. #' Current options are \code{c("mothur", "pyrotagger", "QIIME", "RDP")}, and #' only the first letter is necessary. #' #' @param ... (Required). Additional named arguments providing file paths, and possible #' other paramaters to the desired tool-specific import function. #' #' @return In most cases a \code{\link{phyloseq-class}} will be returned, though #' the included component data will vary by pipeline/tool, and also #' by the types of data files provided. #' The expected behavior is to return the most-comprehensive object possible, #' given the provided arguments and pipeline/tool. #' #' @seealso #' #' For BIOM format, see: #' \code{\link{import_biom}} #' #' For mothur, see: #' \code{\link{import_mothur}} #' #' Separate tools for mothur are also: #' \code{\link{show_mothur_cutoffs}} #' \code{\link{import_mothur_dist}} #' \code{\link{export_mothur_dist}} #' #' For PyroTagger, see: #' \code{\link{import_pyrotagger_tab}} #' #' For QIIME legacy format, see: #' \code{\link{import_qiime}} #' #' For RDP pipeline, see: #' \code{\link{import_RDP_cluster}} #' #' \code{\link{import_RDP_otu}} #' #' @references #' #' BIOM: \url{http://www.biom-format.org/} #' #' mothur: \url{http://www.mothur.org/wiki/Main_Page} #' #' PyroTagger: \url{http://pyrotagger.jgi-psf.org/} #' #' QIIME: \url{http://qiime.org/} #' #' RDP pipeline: \url{http://pyro.cme.msu.edu/index.jsp} #' #' @export #' @examples #' ## See documentation of a specific import function import <- function(pipelineName, ...){ # Reduce pipelineName to just its first letter, as all are different pipelineName <- substr(pipelineName, 1, 1) # Test that it is in the set if( !(pipelineName %in% c("B", "b", "M", "m", "P", "p", "Q", "q", "R", "r")) ){ stop("You need to select among available importer types:\n", "\"BIOM\", \"mothur\", \"pyrotagger\", \"QIIME\", \"RDP\" \n See ?import for details") } if( pipelineName %in% c("B", "b") ){ return( import_biom(...) ) } if( pipelineName %in% c("M", "m") ){ return( import_mothur(...) ) } if( pipelineName %in% c("P", "p") ){ return( import_pyrotagger_tab(...) ) } if( pipelineName %in% c("Q", "q") ){ return( import_qiime(...) ) } if( pipelineName %in% c("R", "r") ){ return( import_RDP_cluster(...) ) } } ################################################################################ #' Import function to read the now legacy-format QIIME OTU table. #' #' QIIME produces several files that can be directly imported by #' the \code{\link{phyloseq-package}}. #' Originally, QIIME produced its own custom format table #' that contained both OTU-abundance #' and taxonomic identity information. #' This function is still included in phyloseq mainly to accommodate these #' now-outdated files. Recent versions of QIIME store output in the #' biom-format, an emerging file format standard for microbiome data. #' If your data is in the biom-format, if it ends with a \code{.biom} #' file name extension, then you should use the \code{\link{import_biom}} #' function instead. #' #' Other related files include #' the mapping-file that typically stores sample covariates, #' converted naturally to the #' \code{\link{sample_data-class}} component data type in the phyloseq-package. #' QIIME may also produce a #' phylogenetic tree with a tip for each OTU, which can also be imported #' specified here or imported separately using \code{\link{read_tree}}. #' #' See \url{"http://www.qiime.org/"} for details on using QIIME. While there are #' many complex dependencies, QIIME can be downloaded as a pre-installed #' linux virtual machine that runs ``off the shelf''. #' #' The different files useful for import to \emph{phyloseq} are not collocated in #' a typical run of the QIIME pipeline. See the main \emph{phyloseq} vignette for an #' example of where ot find the relevant files in the output directory. #' #' @param otufilename (Optional). A character string indicating #' the file location of the OTU file. #' The combined OTU abundance and taxonomic identification file, #' tab-delimited, as produced by QIIME under default output settings. #' Default value is \code{NULL}. #' #' @param mapfilename (Optional). The QIIME map file is required #' for processing barcoded primers in QIIME #' as well as some of the post-clustering analysis. This is a required #' input file for running QIIME. Its strict formatting specification should be #' followed for correct parsing by this function. #' Default value is \code{NULL}. #' #' @param treefilename (Optional). Default value is \code{NULL}. #' A file representing a phylogenetic tree #' or a \code{\link{phylo}} object. #' Files can be NEXUS or Newick format. #' See \code{\link{read_tree}} for more details. #' Also, if using a recent release of the GreenGenes database tree, #' try the \code{\link{read_tree_greengenes}} function -- #' this should solve some issues specific to importing that tree. #' If provided, the tree should have the same OTUs/tip-labels #' as the OTUs in the other files. #' Any taxa or samples missing in one of the files is removed from all. #' As an example from the QIIME pipeline, #' this tree would be a tree of the representative 16S rRNA sequences from each OTU #' cluster, with the number of leaves/tips equal to the number of taxa/species/OTUs, #' or the complete reference database tree that contains the OTU identifiers #' of every OTU in your abundance table. #' Note that this argument can be a tree object (\code{\link[ape]{phylo}}-class) #' for cases where the tree has been --- or needs to be --- imported separately, #' as in the case of the GreenGenes tree mentioned earlier (code{\link{read_tree_greengenes}}). #' #' @param refseqfilename (Optional). Default \code{NULL}. #' The file path of the biological sequence file that contains at a minimum #' a sequence for each OTU in the dataset. #' Alternatively, you may provide an already-imported #' \code{\link[Biostrings]{XStringSet}} object that satisfies this condition. #' In either case, the \code{\link{names}} of each OTU need to match exactly the #' \code{\link{taxa_names}} of the other components of your data. #' If this is not the case, for example if the data file is a FASTA format but #' contains additional information after the OTU name in each sequence header, #' then some additional parsing is necessary, #' which you can either perform separately before calling this function, #' or describe explicitly in a custom function provided in the (next) argument, #' \code{refseqFunction}. #' Note that the \code{\link[Biostrings]{XStringSet}} class can represent any #' arbitrary sequence, including user-defined subclasses, but is most-often #' used to represent RNA, DNA, or amino acid sequences. #' The only constraint is that this special list of sequences #' has exactly one named element for each OTU in the dataset. #' #' @param refseqFunction (Optional). #' Default is \code{\link[Biostrings]{readDNAStringSet}}, #' which expects to read a fasta-formatted DNA sequence file. #' If your reference sequences for each OTU are amino acid, RNA, or something else, #' then you will need to specify a different function here. #' This is the function used to read the file connection provided as the #' the previous argument, \code{refseqfilename}. #' This argument is ignored if \code{refseqfilename} is already a #' \code{\link[Biostrings]{XStringSet}} class. #' #' @param refseqArgs (Optional). #' Default \code{NULL}. #' Additional arguments to \code{refseqFunction}. #' See \code{\link[Biostrings]{XStringSet-io}} for details about #' additional arguments to the standard read functions in the Biostrings package. #' #' @param parseFunction (Optional). An optional custom function for parsing the #' character string that contains the taxonomic assignment of each OTU. #' The default parsing function is \code{\link{parse_taxonomy_qiime}}, #' specialized for splitting the \code{";"}-delimited strings and also #' attempting to interpret greengenes prefixes, if any, as that is a common #' format of the taxonomy string produced by QIIME. #' #' @param verbose (Optional). A \code{\link{logical}}. #' Default is \code{TRUE}. #' Should progresss messages #' be \code{\link{cat}}ted to standard out? #' #' @param ... Additional arguments passed to \code{\link{read_tree}} #' #' @return A \code{\link{phyloseq-class}} object. #' #' @seealso #' #' \code{\link{phyloseq}} #' #' \code{\link{merge_phyloseq}} #' #' \code{\link{read_tree}} #' #' \code{\link{read_tree_greengenes}} #' #' \code{\link[Biostrings]{XStringSet-io}} #' #' @references \url{http://qiime.org/} #' #' ``QIIME allows analysis of high-throughput community sequencing data.'' #' J Gregory Caporaso, Justin Kuczynski, Jesse Stombaugh, Kyle Bittinger, Frederic D Bushman, #' Elizabeth K Costello, Noah Fierer, Antonio Gonzalez Pena, Julia K Goodrich, Jeffrey I Gordon, #' Gavin A Huttley, Scott T Kelley, Dan Knights, Jeremy E Koenig, Ruth E Ley, #' Catherine A Lozupone, Daniel McDonald, Brian D Muegge, Meg Pirrung, Jens Reeder, Joel R Sevinsky, #' Peter J Turnbaugh, William A Walters, Jeremy Widmann, Tanya Yatsunenko, Jesse Zaneveld and Rob Knight; #' Nature Methods, 2010; doi:10.1038/nmeth.f.303 #' #' @importClassesFrom Biostrings XStringSet #' @importFrom Biostrings readDNAStringSet #' @export #' @examples #' otufile <- system.file("extdata", "GP_otu_table_rand_short.txt.gz", package="phyloseq") #' mapfile <- system.file("extdata", "master_map.txt", package="phyloseq") #' trefile <- system.file("extdata", "GP_tree_rand_short.newick.gz", package="phyloseq") #' import_qiime(otufile, mapfile, trefile) import_qiime <- function(otufilename=NULL, mapfilename=NULL, treefilename=NULL, refseqfilename=NULL, refseqFunction=readDNAStringSet, refseqArgs=NULL, parseFunction=parse_taxonomy_qiime, verbose=TRUE, ...){ # initialize the argument-list for phyloseq. Start empty. argumentlist <- list() if( !is.null(mapfilename) ){ if( verbose ){ cat("Processing map file...", fill=TRUE) } QiimeMap <- import_qiime_sample_data(mapfilename) argumentlist <- c(argumentlist, list(QiimeMap)) } if( !is.null(otufilename) ){ if( verbose ){ cat("Processing otu/tax file...", fill=TRUE) } otutax <- import_qiime_otu_tax(otufilename, parseFunction, verbose=verbose) otutab <- otu_table(otutax$otutab, TRUE) taxtab <- tax_table(otutax$taxtab) argumentlist <- c(argumentlist, list(otutab), list(taxtab) ) } if( !is.null(treefilename) ){ if(verbose){cat("Processing phylogenetic tree...\n", treefilename, "...\n")} if(inherits(treefilename, "phylo")){ # If argument is already a tree, don't read, just assign. tree = treefilename } else { # If it is not a tree, assume file and attempt to import. # NULL is silently returned if tree is not read properly. tree <- read_tree(treefilename, ...) } # Add to argument list or warn if( is.null(tree) ){ warning("treefilename failed import. It will not be included.") } else { argumentlist <- c(argumentlist, list(tree) ) } } if( !is.null(refseqfilename) ){ if( verbose ){ cat("Processing Reference Sequences...", fill=TRUE) } if( inherits(refseqfilename, "XStringSet") ){ # If argument is already a XStringSet, don't read, just assign. refseq = refseqfilename } else { # call refseqFunction and read refseqfilename, # either with or without additional args if( !is.null(refseqArgs) ){ refseq = do.call("refseqFunction", c(list(refseqfilename), refseqArgs)) } else { refseq = refseqFunction(refseqfilename) } } argumentlist <- c(argumentlist, list(refseq) ) } do.call("phyloseq", argumentlist) } ################################################################################ #' Somewhat flexible tree-import function #' #' This function is a convenience wrapper around the #' \code{\link[ape]{read.tree}} (Newick-format) and #' \code{\link[ape]{read.nexus}} (Nexus-format) importers provided by #' the \code{\link[ape]{ape-package}}. This function attempts to return a valid #' tree if possible using either format importer. If it fails, it silently #' returns \code{NULL} by default, rather than throwing a show-stopping error. #' #' @usage read_tree(treefile, errorIfNULL=FALSE, ...) #' #' @param treefile (Required). A character string implying a file \code{\link{connection}} #' (like a path or URL), or an actual \code{\link{connection}}. #' Must be a Newick- or Nexus-formatted tree. #' #' @param errorIfNULL (Optional). Logical. Should an error be thrown if no tree #' can be extracted from the connection? #' Default is \code{FALSE}, indicating that \code{NULL} will be #' SILENTLY returned, rather than an error. #' Be cautious about this behavior. Useful for phyloseq internals, but might #' be hard to track in your own code if you're not aware of this #' ``no error by default'' setting. If this is a problem, change this value #' to \code{TRUE}, and you can still use the function. #' #' @param ... (Optional). Additional parameter(s) passed to the #' relevant tree-importing function. #' #' @return If successful, returns a \code{\link{phylo}}-class object as defined #' in the \code{\link[ape]{ape-package}}. Returns NULL if neither tree-reading function worked. #' #' @seealso #' \code{\link{read_tree_greengenes}} #' #' \code{\link{phylo}} #' #' \code{\link[ape]{read.tree}} #' #' \code{\link[ape]{read.nexus}} #' #' @importFrom ape read.nexus #' @importFrom ape read.tree #' @export #' @examples #' read_tree(system.file("extdata", "esophagus.tree.gz", package="phyloseq")) #' read_tree(system.file("extdata", "GP_tree_rand_short.newick.gz", package="phyloseq")) read_tree <- function(treefile, errorIfNULL=FALSE, ...){ # "phylo" object provided directly if( class(treefile)[1] %in% c("phylo") ){ tree <- treefile } else { # file path to tree file provided. # Try Nexus first, protected, then newick if it fails tree <- NULL try(tree <- read.nexus(treefile, ...), TRUE) # Try Newick if nexus didn't work. if(is.null(tree)) try(tree <- read.tree(treefile, ...), TRUE) } # If neither tree-import worked (still NULL), report warning if( errorIfNULL & is.null(tree) ){ stop("tree file could not be read.\nPlease retry with valid tree.") } if( !is.null(tree) ){ # Perform any standard phyloseq checks/fixes # E.g. Replace any NA branch-length values in the tree with zero. tree = fix_phylo(tree) } return(tree) } ################################################################################ #' Read GreenGenes tree released in annotated newick format #' #' In principal, this is a standard newick format, that can be imported #' into R using \code{\link{read_tree}}, #' which in-turn utilizes \code{\link[ape]{read.tree}}. #' However, \code{\link[ape]{read.tree}} has failed to import #' recent (October 2012 and later) releases of the GreenGenes tree, #' and this problem has been traced to the additional annotations #' added to some internal nodes #' that specify taxonomic classification between single-quotes. #' To solve this problem and create a clear container #' for fixing future problems with the format of GreenGenes-released trees, #' this function is available in phyloseq and exported for users. #' It is also referenced in the documentation of the import functions #' for QIIME legacy and BIOM format importers -- #' \code{\link{import_qiime}} and \code{\link{import_biom}}, respectively. #' However, since the precise format of the tree is not restricted to GreenGenes trees #' by QIIME or for the biom-format, this function is not called #' automatically by those aforementioned import functions. #' If your tree is formatted like, or is one of, the official GreenGenes #' release trees, then you should use this function and provide its output #' to your relevant import function. #' #' @param treefile (Required). A character string implying #' a file \code{\link{connection}} #' (like a path or URL), or an actual \code{\link{connection}}. #' Must be a Newick--formatted tree released by GreenGenes #' in October 2012 or later. #' The similarity threshold of the OTUs should not matter, #' except that it should match your OTU table. #' #' @return A tree, represented as a \code{\link{phylo}} object. #' #' @importFrom ape read.tree #' @export #' @examples #' # Read the May 2013, 73% similarity official tree, #' # included as extra data in phyloseq. #' treefile = system.file("extdata", "gg13-5-73.tree.gz", package="phyloseq") #' x = read_tree_greengenes(treefile) #' x #' class(x) #' y = read_tree(treefile) #' y #' class(y) #' ## Not run, causes an error: #' # library("ape") #' # read.tree(treefile) read_tree_greengenes = function(treefile){ alines = readLines(treefile, warn=FALSE) # Collapse to one line, in case it isn't already. alines = paste0(alines, collapse="") # replace all semicolons with something weird # that isn't already a special newick character. newdelim = "><-><" clines = gsub("\\;", newdelim, alines) # reinstate the final character as a semicolon clines = gsub(paste0(newdelim, "$"), ";", clines) # Convert your newick string into a phylo-class tree. tree = read.tree("", text=clines) # Now that it is phylo-class, reinstate semicolon # as the delimiter in the node labels gsub(newdelim, ";", tree$node.label) # Also get rid of those extra quotes gsub("'", "", tree$node.label) # Return the cleaned-up tree return(tree) } ################################################################################ #' Import now legacy-format QIIME OTU table as a list of two matrices. #' #' Now a legacy-format, older versions of QIIME #' produced an OTU file that typically contains both OTU-abundance #' and taxonomic identity information in a tab-delimted table. #' If your file ends with the extension \code{.biom}, or if you happen to know #' that it is a biom-format file, or if you used default settings in a version #' of QIIME of \code{1.7} or greater, #' then YOU SHOULD USE THE BIOM-IMPORT FUNCTION instead, #' \code{\link{import_biom}}. #' #' This function uses chunking to perform both the reading and parsing in blocks #' of optional size, #' thus constrain the peak memory usage. #' feature should make this #' importer accessible to machines with modest memory, #' but with the caveat that #' the full numeric matrix must be a manageable size at the end, too. #' In principle, the final tables will be large, but much more efficiently represented than #' the character-stored numbers. #' If total memory for storing the numeric matrix becomes problematic, #' a switch to a sparse matrix representation of the abundance #' -- which is typically well-suited to this data -- might provide a solution. #' #' @param file (Required). The path to the qiime-formatted file you want to #' import into R. Can be compressed (e.g. \code{.gz}, etc.), though the #' details may be OS-specific. That is, Windows-beware. #' #' @param parseFunction (Optional). An optional custom function for parsing the #' character string that contains the taxonomic assignment of each OTU. #' The default parsing function is \code{\link{parse_taxonomy_qiime}}, #' specialized for splitting the \code{";"}-delimited strings and also #' attempting to interpret greengenes prefixes, if any, as that is a common #' format of the taxonomy string produced by QIIME. #' #' @param verbose (Optional). A \code{\link{logical}}. #' Default is \code{TRUE}. #' Should progresss messages #' be \code{\link{cat}}ted to standard out? #' #' @param parallel (Optional). Logical. Should the parsing be performed in #' parallel?. Default is \code{FALSE}. Only a few steps are actually #' parallelized, and for most datasets it will actually be faster and #' more efficient to keep this set to \code{FALSE}. #' Also, to get any benefit at all, you will need to register a #' parallel ``backend'' through one of the backend packages supported #' by the \code{\link{foreach-package}}. #' #' @return A list of two matrices. \code{$otutab} contains the OTU Table #' as a numeric matrix, while \code{$taxtab} contains a character matrix #' of the taxonomy assignments. #' #' @importFrom data.table fread #' @importFrom plyr llply #' #' @seealso #' \code{\link{import}} #' #' \code{\link{merge_phyloseq}} #' #' \code{\link{phyloseq}} #' #' \code{\link{import_qiime}} #' #' \code{\link{read_tree}} #' #' \code{\link{read_tree_greengenes}} #' #' \code{\link{import_env_file}} #' #' @export #' @examples #' otufile <- system.file("extdata", "GP_otu_table_rand_short.txt.gz", package="phyloseq") #' import_qiime_otu_tax(otufile) import_qiime_otu_tax <- function(file, parseFunction=parse_taxonomy_qiime, verbose=TRUE, parallel=FALSE){ if(verbose){cat("Reading file into memory prior to parsing...\n")} x = readLines(file) if(verbose){cat("Detecting first header line...\n")} # Check for commented lines, starting with line 1. # The deepest commented line (largest n) is assumed to have header information. skipLines = max(which(substr(x[1:25L], 1, 1)=="#"))-1L if(verbose){cat("Header is on line", (skipLines + 1L), " \n")} if(verbose){cat("Converting input file to a table...\n")} x = fread(input=paste0(x, collapse="\n"), sep="\t", header=TRUE, skip=skipLines) if(verbose){cat("Defining OTU table... \n")} taxstring = x$`Consensus Lineage` # This pops the taxonomy (Consensus Lineage) column, in-place statement x[, `Consensus Lineage`:=NULL] # Store the OTU names, you will pop the column OTUnames = x$`#OTU ID` # This pops the OTUID column, in-place statement x[, `#OTU ID`:=NULL] x <- as(x, "matrix") rownames(x) <- OTUnames rm(OTUnames) if(verbose){cat("Parsing taxonomy table...\n")} # Split into "jagged" list (vectors of different lengths) taxlist = llply(taxstring, parseFunction, .parallel=parallel) # Add OTU names to list element names names(taxlist) <- rownames(x) # Build the tax table from the jagged list. taxtab <- build_tax_table(taxlist) # Call garbage collection one more time. Lots of unneeded stuff. garbage.collection <- gc(FALSE) # Return the named list return(list(otutab=x, taxtab=taxtab)) } ################################################################################ ################################################################################ #' Import just \code{sample_data} file from QIIME pipeline. #' #' QIIME produces several files that can be analyzed in the phyloseq-package, #' This includes the map-file, which is an important \emph{input} #' to QIIME that can also indicate sample covariates. It is converted naturally to the #' sample_data component data type in phyloseq-package, based on the R data.frame. #' #' See \code{\link{import_qiime}} for more information about QIIME. It is also the #' suggested function for importing QIIME-produced data files. #' #' @usage import_qiime_sample_data(mapfilename) #' #' @param mapfilename (Required). A character string or connection. #' That is, any suitable \code{file} argument to the \code{\link{read.table}} function. #' The name of the QIIME map #' file required for processing pyrosequencing tags #' in QIIME as well as some of the post-clustering analysis. This is a required #' input file for running QIIME. Its strict formatting specification is expected by #' this function, do not attempt to modify it manually once it has worked properly #' in QIIME. #' #' @return A \code{sample_data} object. #' #' @seealso #' #' \code{\link{import}} #' #' \code{\link{merge_phyloseq}} #' #' \code{\link{phyloseq}} #' #' \code{\link{import_qiime}} #' #' \code{\link{import_qiime_otu_tax}} #' #' \code{\link{import_env_file}} #' #' @export #' @examples #' mapfile <- system.file("extdata", "master_map.txt", package = "phyloseq") #' import_qiime_sample_data(mapfile) import_qiime_sample_data <- function(mapfilename){ # Process mapfile. Name rows as samples. QiimeMap <- read.table(file=mapfilename, header=TRUE, sep="\t", comment.char="") rownames(QiimeMap) <- as.character(QiimeMap[,1]) return( sample_data(QiimeMap) ) } ################################################################################ #' Read a UniFrac-formatted ENV file. #' #' Convenience wrapper function to read the environment-file, as formatted for #' input to the UniFrac server (\url{http://bmf2.colorado.edu/unifrac/}). #' The official format of these files is that #' each row specifies (in order) the sequence name, source sample, and (optionally) #' the number of times the sequence was observed. #' #' @usage import_env_file(envfilename, tree=NULL, sep="\t", ...) #' #' @param envfilename (Required). A charater string of the ENV filename (relative or absolute) #' #' @param tree (Optional). \code{\link{phylo-class}} object to be paired with #' the output otu_table. #' #' @param sep A character string indicating the delimiter used in the file. #' The default is \code{"\t"}. #' #' @param ... Additional parameters passed on to \code{\link{read.table}}. #' #' @return An \code{\link{otu_table-class}}, or \code{\link{phyloseq-class}} if #' a \code{\link{phylo-class}} argument is provided to \code{tree}. #' #' @references \url{http://bmf2.colorado.edu/unifrac/} #' #' @seealso #' \code{\link{import}} #' #' \code{\link{tip_glom}} #' @export #' @examples #' # import_env_file(myEnvFile, myTree) import_env_file <- function(envfilename, tree=NULL, sep="\t", ...){ tipSampleTable <- read.table(envfilename, sep=sep, ...) # Convert to otu_table-class table (trivial table) physeq <- envHash2otu_table(tipSampleTable) # If tree is provided, combine it with the OTU Table if( class(tree) == "phylo" ){ # Create phyloseq-class with a tree and OTU Table (will perform any needed pruning) physeq <- phyloseq(physeq, tree) } return(physeq) } ################################################################################ #' Convert a sequence-sample hash (like ENV file) into an OTU table. #' #' Parses an ENV-file into a sparse matrix of species-by-sample, where #' each species-row has only one non-zero value. We call this sparse abundance #' table the trivial OTU table, where every sequence is treated as a separate #' species. If a phylogenetic tree is available, it can be submitted with this #' table as arguments to \code{\link{tip_glom}} to create an object with a #' non-trivial \code{otu_table}. #' #' @usage envHash2otu_table(tipSampleTable) #' #' @param tipSampleTable (Required). A two-column character table (matrix or data.frame), #' where each row specifies the sequence name and source sample, consistent with the #' env-file for the UniFrac server (\url{http://bmf2.colorado.edu/unifrac/}). #' #' @return \code{\link{otu_table}}. A trivial OTU table where each sequence #' is treated as a separate OTU. #' #' @references \url{http://bmf2.colorado.edu/unifrac/} #' #' @seealso #' \code{\link{import_env_file}} #' #' \code{\link{tip_glom}} #' #' \code{\link{otu_table}} #' #' @keywords internal #' @examples # #' ## fakeSeqNameVec <- paste("seq_", 1:8, sep="") #' ## fakeSamNameVec <- c(rep("A", 4), rep("B", 4)) #' ## fakeSeqAbunVec <- sample(1:50, 8, TRUE) #' ## test <- cbind(fakeSeqNameVec, fakeSamNameVec, fakeSeqAbunVec) #' ## testotu <- envHash2otu_table( test ) #' ## test <- cbind(fakeSeqNameVec, fakeSamNameVec) #' ## testotu <- envHash2otu_table( test ) envHash2otu_table <- function(tipSampleTable){ if( ncol(tipSampleTable) > 2 ){ tst <- tipSampleTable trivialOTU <- matrix(0, nrow=nrow(tst), ncol=length(unique(tst[,2]))) colnames(trivialOTU) <- unique(tst[,2]) rownames(trivialOTU) <- tst[,1] for( i in 1:nrow(tst) ){ trivialOTU[tst[i, 1], tst[i, 2]] <- as.integer(tst[i, 3]) } } else { trivialOTU <- table(as.data.frame(tipSampleTable)) trivialOTU <- as(trivialOTU, "matrix") } return( otu_table(trivialOTU, taxa_are_rows=TRUE) ) } ################################################################################ ################################################################################ #' Import RDP cluster file and return otu_table (abundance table). #' #' The RDP cluster pipeline (specifically, the output of the complete linkage clustering step) #' has no formal documentation for the \code{".clust"} #' file or its apparent sequence naming convention. #' #' \code{http://pyro.cme.msu.edu/index.jsp} #' #' The cluster file itself contains #' the names of all sequences contained in input alignment. If the upstream #' barcode and aligment processing steps are also done with the RDP pipeline, #' then the sequence names follow a predictable naming convention wherein each #' sequence is named by its sample and sequence ID, separated by a \code{"_"} as #' delimiter: #' #' \code{"sampleName_sequenceIDnumber"} #' #' This import function assumes that the sequence names in the cluster file follow #' this convention, and that the sample name does not contain any \code{"_"}. It #' is unlikely to work if this is not the case. It is likely to work if you used #' the upstream steps in the RDP pipeline to process your raw (barcoded, untrimmed) #' fasta/fastq data. #' #' This function first loops through the \code{".clust"} file and collects all #' of the sample names that appear. It secondly loops through each OTU (\code{"cluster"}; #' each row of the cluster file) and sums the number of sequences (reads) from #' each sample. The resulting abundance table of OTU-by-sample is trivially #' coerced to an \code{\link{otu_table}} object, and returned. #' #' @usage import_RDP_cluster(RDP_cluster_file) #' #' @param RDP_cluster_file A character string. The name of the \code{".clust"} #' file produced by the #' the complete linkage clustering step of the RDP pipeline. #' #' @return An \code{\link{otu_table}} object parsed from the \code{".clust"} file. #' #' @references \url{http://pyro.cme.msu.edu/index.jsp} #' #' @export #' import_RDP_cluster <- function(RDP_cluster_file){ # Read file and pop the header lines RDP_raw_otu_lines_only <- readLines(RDP_cluster_file)[-(1:5)] # internal function: make_verbose_sample_list <- function(RDP_raw_otu_lines_only){ # Each OTU line has a 3 element "line header" that indicates the OTUID, the name of the file, # and the number of sequences that are included in this cluster. # From each line, remove the header elements get_sample_names_from_one_line <- function(otuline){ # first split the line on tabs "\t" splittabs <- strsplit(otuline, "\t")[[1]] # next, remove the header by keeping on the 4th element. seqIDonly <- splittabs[4] # Finally, split on white space seqIDonly <- strsplit(seqIDonly, "[[:space:]]+")[[1]] # For each element in seqIDonly, split on the underscore delimiter splitseqnames <- strsplit(seqIDonly, "_", fixed=TRUE) # Return the sample names from the first element (assumes no "_" in sample names) return( sapply(splitseqnames, function(i){i[1]}) ) } return( sapply(RDP_raw_otu_lines_only, get_sample_names_from_one_line) ) } ## Get the verbose sample name list, and then shrink to the ## unique sample names in the entire dataset. ## Need this unique list for initializing the OTU abundance matrix RDPsamplenameslist <- make_verbose_sample_list(RDP_raw_otu_lines_only) RDPsamplenames <- unique(unlist(RDPsamplenameslist)) # remove NAs RDPsamplenames <- RDPsamplenames[!is.na(RDPsamplenames)] # Initialize otu abundance matrix. otumat <- matrix(0, nrow=length(RDP_raw_otu_lines_only), ncol=length(RDPsamplenames)) rownames(otumat) <- paste("OTUID_", 1:length(RDP_raw_otu_lines_only)) colnames(otumat) <- RDPsamplenames # Now re-loop through the cluster file (by OTU) and sum the # abundance of sequences from each sample for( i in 1:length(RDP_raw_otu_lines_only) ){ # i = 1 # first split the line on tabs "\t" splittabs <- strsplit(RDP_raw_otu_lines_only[i], "\t")[[1]] # next, remove the header by keeping on the 4th element. seqIDonly <- splittabs[4] # Finally, split on white space seqIDonly <- strsplit(seqIDonly, "[[:space:]]+")[[1]] # For each element in seqIDonly, split on the underscore delimiter splitseqnames <- strsplit(seqIDonly, "_", fixed=TRUE) # make the verbose vector verbosesamplenamesi <- sapply(splitseqnames, function(i){i[1]}) # sum the reads from each sample with tapply OTUi <- tapply(verbosesamplenamesi, factor(verbosesamplenamesi), length) # store results of this OTU in abundance matrix otumat[i, names(OTUi)] <- OTUi } # Return the abundance table. return( otu_table(otumat, taxa_are_rows=TRUE) ) } ################################################################################ #' Import new RDP OTU-table format #' #' Recently updated tools on RDP Pyro site make it easier to import Pyrosequencing output #' into R. The modified tool ``Cluster To R Formatter'' can take a cluster file #' (generated from RDP Clustering tools) to create a community data matrix file #' for distance cutoff range you are interested in. The resulting output file #' is a tab-delimited file containing the number of sequences for each sample #' for each OTU. The OTU header naming convention is \code{"OTU_"} followed by the OTU #' number in the cluster file. It pads ``0''s to make the OTU header easy to sort. #' The OTU numbers are not necessarily in order. #' #' @usage import_RDP_otu(otufile) #' #' @param otufile (Optional). #' A character string indicating the file location of the OTU file, #' produced/exported according to the instructions above. #' #' @return A \code{\link{otu_table-class}} object. #' #' @seealso #' An alternative ``cluster'' file importer for RDP results: #' \code{\link{import_RDP_cluster}} #' #' The main RDP-pyrosequencing website #' \url{http://pyro.cme.msu.edu/index.jsp} #' #' @export #' @examples #' otufile <- system.file("extdata", "rformat_dist_0.03.txt.gz", package="phyloseq") #' ### the gzipped file is automatically recognized, and read using R-connections #' ex_otu <- import_RDP_otu(otufile) #' class(ex_otu) #' ntaxa(ex_otu) #' nsamples(ex_otu) #' sample_sums(ex_otu) #' head(t(ex_otu)) import_RDP_otu <- function(otufile){ otumat <- read.table(otufile, TRUE, sep="\t", row.names=1) return(otu_table(otumat, FALSE)) } ################################################################################ ################################################################################ ################################################################################ ################################################################################ ################################################################################ #' Imports a tab-delimited version of the pyrotagger output file. #' #' PyroTagger is a web-server that takes raw, barcoded 16S rRNA amplicon sequences #' and returns an excel spreadsheet (\code{".xls"}) with both abundance and #' taxonomy data. It also includes some confidence information related to the #' taxonomic assignment. #' #' PyroTagger is created and maintained by the Joint Genome Institute #' at \code{"http://pyrotagger.jgi-psf.org/"} #' #' The typical output form PyroTagger is a spreadsheet format \code{".xls"}, which poses #' additional import challenges. However, virtually all spreadsheet applications #' support the \code{".xls"} format, and can further export this file in a #' tab-delimited format. It is recommended that you convert the xls-file without #' any modification (as tempting as it might be once you have loaded it) into a #' tab-delimited text file. Deselect any options to encapsulate fields in quotes, #' as extra quotes around each cell's contents might cause problems during #' file processing. These quotes will also inflate the file-size, so leave them out #' as much as possible, while also resisting any temptation to modify the xls-file #' ``by hand''. #' #' A highly-functional and free spreadsheet application can be obtained as part #' of the cross-platform \code{OpenOffice} suite. It works for the above #' required conversion. Go to \code{"http://www.openoffice.org/"}. #' #' It is regrettable that this importer does not take the xls-file directly #' as input. However, because of the moving-target nature of spreadsheet #' file formats, there is limited support for direct import of these formats into #' \code{R}. Rather than add to the dependency requirements of emph{phyloseq} #' and the relative support of these xls-support packages, it seems more efficient #' to choose an arbitrary delimited text format, and focus on the data #' structure in the PyroTagger output. This will be easier to support in the #' long-run. #' #' @usage import_pyrotagger_tab(pyrotagger_tab_file, #' strict_taxonomy=FALSE, keep_potential_chimeras=FALSE) #' #' @param pyrotagger_tab_file (Required). A character string. The name of the tab-delimited #' pyrotagger output table. #' #' @param strict_taxonomy (Optional). Logical. Default \code{FALSE}. Should the taxonomyTable #' component be limited to just taxonomic data? Default includes all fields from #' the pyrotagger file. #' #' @param keep_potential_chimeras (Optional). Logical. Default \code{FALSE}. The #' pyrotagger output also includes OTUs that are tagged by pyrotagger as likely #' chimeras. These putative chimeric OTUs can be retained if set to \code{TRUE}. #' The putative chimeras are excluded by default. #' #' @return An \code{otuTax} object containing both the otu_table and TaxonomyTable data #' components, parsed from the pyrotagger output. #' #' @export #' #' @references \url{http://pyrotagger.jgi-psf.org/} #' #' @examples #' ## New_otuTaxObject <- import_pyrotagger_tab(pyrotagger_tab_file) import_pyrotagger_tab <- function(pyrotagger_tab_file, strict_taxonomy=FALSE, keep_potential_chimeras=FALSE){ x <- readLines(pyrotagger_tab_file, warn=FALSE) # Get the header pyro_header <- strsplit(x[1], "\t", TRUE)[[1]] # Pop the first (header) line from the list. x <- x[-1] ######################################## ### There are "Potential chimeras" ### listed in the typical output, separated by 2 completely blank lines ### after the last confidently-good OTU. ######################################## chimera_line <- grep("Potential chimeras", x, fixed=TRUE) if( keep_potential_chimeras ){ # Pop just the blank lines that delimit the chimeras # at the bottom of the table x <- x[-((chimera_line-2):chimera_line)] } else { x <- x[-((chimera_line-2):length(x))] } ######################################## # The tab-split character list, z ######################################## z <- strsplit(x, "\t", TRUE) names(z) <- sapply(z, function(z){z[1]}) # The table switches from abundance to taxonomy at the "% Identity" column taxonomy_table_column_index <- which( pyro_header == "% identity" ) ######################################## # Initialize the two matrices # (otu_table and taxonomyTable) ######################################## ### Initialize abundance matrix, a a <- matrix(0, nrow=length(x), ncol=(taxonomy_table_column_index-2)) colnames(a) <- pyro_header[2:(taxonomy_table_column_index-1)] rownames(a) <- names(z) ###### Initialize the raw pyrotagger taxonomy matrix, w ntax_tablecols <- (max(sapply(z, length)) - taxonomy_table_column_index + 1) w <- matrix("", nrow=length(x), ncol=ntax_tablecols) rownames(w) <- names(z) colnamesw <- pyro_header[-(1:(taxonomy_table_column_index-1))] colnamesw <- colnamesw[1:which(colnamesw=="Taxonomy")] colnamesw <- c(colnamesw, paste("col", (which(colnamesw=="Taxonomy")+1):ntax_tablecols, sep="") ) colnames(w) <- colnamesw # Rename the taxonomy columns biotaxonomy <- c("Domain", "Phylum", "Class", "Order", "Family", "Genus", "Species", "Strain") colnames(w)[which(colnames(w)=="Taxonomy"):length(colnames(w))][1:length(biotaxonomy)] <- biotaxonomy # Loop through each line and add to appropriate matrix. for( i in rownames(a) ){ # i <- rownames(a)[[1]] # cut out just the abundance part, and convert to integer y <- as.integer(z[[i]][2:(taxonomy_table_column_index-1)]) y[is.na(y)] <- 0 a[i, ] <- y # Taxonomy data is jagged taxi <- z[[i]][-(1:(taxonomy_table_column_index-1))] w[i, 1:length(taxi)] <- taxi } # Create the component objects OTU <- otu_table(a, taxa_are_rows=TRUE) if( strict_taxonomy ){ TAX <- tax_table[, biotaxonomy] } else { TAX <- tax_table(w) } return( phyloseq(OTU, TAX) ) } ################################################################################ ################################################################################ #' Show cutoff values available in a mothur file. #' #' This is a helper function to report back to the user the different cutoff #' values available in a given mothur file -- #' for instance, a list or shared file. #' #' @param mothur_list_file The file name and/or location as produced by \emph{mothur}. #' #' @return A character vector of the different cutoff values contained in the file. #' For a given set of arguments to the \code{cluster()} command from within #' \emph{mothur}, a number of OTU-clustering results are returned in the same #' file. The exact cutoff values used by \emph{mothur} can vary depending #' on the input data/parameters. This simple function returns the cutoffs that were actually #' included in the \emph{mothur} output. This an important extra step prior to #' importing data with the \code{\link{import_mothur}} function. #' #' @export #' #' @seealso \code{\link{import_mothur}} #' show_mothur_cutoffs <- function(mothur_list_file){ unique(scan(mothur_list_file, "character", comment.char="\t", quiet=TRUE)) } ################################################################################ #' Import mothur list file and return as list object in R. #' #' This is a user-available module of a more comprehensive function for importing #' OTU clustering/abundance data using the \emph{mothur} package. The list object #' returned by this function is not immediately useable by other \emph{phyloseq} #' functions, and must be first parsed in conjunction with a separate \emph{mothur} #' \code{"group"} file. This function is made accessible to \emph{phyloseq} users #' for troubleshooting and inspection, but the \code{link{import_mothur()}} function #' is suggested if the goal is to import the OTU clustering results from \emph{mothur} #' into \emph{phyloseq}. #' #' @usage import_mothur_otulist(mothur_list_file, cutoff=NULL) #' #' @param mothur_list_file The list file name and/or location as produced by \emph{mothur}. #' #' @param cutoff A character string indicating the cutoff value, (or \code{"unique"}), #' that matches one of the cutoff-values used to produce the OTU clustering #' results contained within the list-file created by \emph{mothur}. The default #' is to take the largest value among the cutoff values contained in the list #' file. If only one cutoff is included in the file, it is taken and this #' argument does not need to be specified. Note that the \code{cluster()} #' function within the \emph{mothur} package will often produce a list file #' with multiple cutoff values, even if a specific cutoff is specified. It is #' suggested that you check which cutoff values are available in a given list #' file using the \code{\link{show_mothur_cutoffs}} function. #' #' @return A list, where each element is a character vector of 1 or more #' sequence identifiers, indicating how each sequence from the original data #' is clustered into OTUs by \emph{mothur}. Note that in some cases this is highly #' dependent on the choice for \code{cutoff}. #' #' @seealso \code{\link{show_mothur_cutoffs}}, \code{\link{import_mothur}} #' @keywords internal #' import_mothur_otulist <- function(mothur_list_file, cutoff=NULL){ # mothur_list_file = system.file("extdata", "esophagus.fn.list.gz", package="phyloseq") # cutoff = 0.04 cutoffs = show_mothur_cutoffs(mothur_list_file) cutoff = select_mothur_cutoff(cutoff, cutoffs) # Read only the line corresponding to that cutoff inputline = which(cutoffs == cutoff) rawlines = scan(mothur_list_file, "character", sep="\t", skip=(inputline-1), nlines=1, na.strings="", quiet=TRUE) rawlines = rawlines[!is.na(rawlines)] # The first two elements are the cutoff and the number of OTUs. skip, and read to first comma for OTUnames OTUnames = scan(text=rawlines, what="character", comment.char=",", quiet=TRUE)[3:as.integer(rawlines[2])] # split each element on commas OTUs <- strsplit(rawlines[3:as.integer(rawlines[2])], ",", fixed=TRUE) # Name each OTU (currently as the first seq name in each cluster), and return the list names(OTUs) <- OTUnames # return as-is return(OTUs) } ################################################################################ # Need to select a cutoff if none was provided by user. # Take the largest non-"unique" cutoff possible, # if "unique" is the only cutoff included in the list file, use that. # Multiple cutoffs are provided in both `.shared` and `.list` files. # This function consolidates the heuristic for selecting/checking a specified cutoff. #' @keywords internal select_mothur_cutoff = function(cutoff, cutoffs){ if( is.null(cutoff) ){ # cutoff was NULL, need to select one. if( length(cutoffs) > 1 ){ # Select the largest value, avoiding the "unique" option. selectCutoffs <- as(cutoffs[cutoffs != "unique"], "numeric") cutoff <- as.character(max(selectCutoffs)) } else { # There is only one cutoff value, so use it. # Don't have to specify a cutoff, in this case cutoff <- cutoffs } } else { # Provided by user, non-null. Coerce to character for indexing cutoff <- as.character(cutoff) # Check that it is in set of available cutoffs. if( !cutoff %in% cutoffs ){ stop("The cutoff value you provided is not among those available. Try show_mothur_cutoffs()") } } } ################################################################################ #' Parse mothur group file into a simple hash table. #' #' The data.frame object #' returned by this function is not immediately useable by other \emph{phyloseq} #' functions, and must be first parsed in conjunction with a separate \emph{mothur} #' \code{"list"} file. This function is made accessible to \emph{phyloseq} users #' for troubleshooting and inspection, but the \code{link{import_mothur()}} function #' is suggested if the goal is to import the OTU clustering results from \emph{mothur} #' into \emph{phyloseq}. You will need both a group file and a list file for that end. #' #' @usage import_mothur_groups(mothur_group_file) #' #' @param mothur_group_file A character string indicating the location of the #' \emph{mothur}-produced group file in which the sample-source of each sequence #' is recorded. See #' \code{http://www.mothur.org/wiki/Make.group} #' #' @return A data.frame that is effectively a hash table between sequence names #' and their sample source. #' #' @seealso \code{\link{import_mothur}} #' @keywords internal #' import_mothur_groups <- function(mothur_group_file){ read.table(mothur_group_file, sep="\t", as.is=TRUE, stringsAsFactors=FALSE, colClasses="character", row.names=1) } ################################################################################ #' Import mothur list and group files and return an otu_table #' #' @usage import_mothur_otu_table(mothur_list_file, mothur_group_file, cutoff=NULL) #' #' @param mothur_list_file The list file name and/or location as produced by \emph{mothur}. #' #' @param mothur_group_file The name/location of the group file produced #' by \emph{mothur}'s \code{make.group()} function. It contains information #' about the sample source of individual sequences, necessary for creating a #' species/taxa abundance table (\code{otu_table}). See #' \code{http://www.mothur.org/wiki/Make.group} #' #' @param cutoff A character string indicating the cutoff value, (or \code{"unique"}), #' that matches one of the cutoff-values used to produce the OTU clustering #' results contained within the list-file created by \emph{mothur} (and specified #' by the \code{mothur_list_file} argument). #' The default #' is to take the largest value among the cutoff values contained in the list #' file. If only one cutoff is included in the file, it is taken and this #' argument does not need to be specified. Note that the \code{cluster()} #' function within the \emph{mothur} package will often produce a list file #' with multiple cutoff values, even if a specific cutoff is specified. It is #' suggested that you check which cutoff values are available in a given list #' file using the \code{\link{show_mothur_cutoffs}} function. #' #' @return An \code{\link{otu_table}} object. #' #' @seealso \code{\link{import_mothur}} #' @keywords internal #' @importFrom plyr ldply #' @importFrom plyr ddply import_mothur_otu_table <- function(mothur_list_file, mothur_group_file, cutoff=NULL){ otulist <- import_mothur_otulist(mothur_list_file, cutoff) mothur_groups <- import_mothur_groups(mothur_group_file) # Initialize abundance matrix with zeros for sparse assignment samplenames = unique(mothur_groups[, 1]) mothur_otu_table <- matrix(0, nrow=length(otulist), ncol=length(samplenames)) colnames(mothur_otu_table) <- samplenames rownames(mothur_otu_table) <- names(otulist) # Write a sparse versino of the abundance table df = ldply(otulist, function(x){data.frame(read=x, stringsAsFactors=FALSE)}) colnames(df)[1] <- "OTU" df = data.frame(df, sample=mothur_groups[df[, "read"], 1], stringsAsFactors=FALSE) adf = ddply(df, c("OTU", "sample"), function(x){ # x = subset(df, OTU=="59_3_17" & sample=="C") data.frame(x[1, c("OTU", "sample"), drop=FALSE], abundance=nrow(x)) }) # Vectorized for speed using matrix indexing. # See help("Extract") for details about matrix indexing. Diff than 2-vec index. mothur_otu_table[as(adf[, c("OTU", "sample")], "matrix")] <- adf[, "abundance"] # Finally, return the otu_table as a phyloseq otu_table object. return(otu_table(mothur_otu_table, taxa_are_rows=TRUE)) } ################################################################################ #' Import mothur shared file and return an otu_table #' #' @param mothur_shared_file (Required). A #' \href{http://www.mothur.org/wiki/Shared_file}{shared file} #' produced by \emph{mothur}. #' #' @return An \code{\link{otu_table}} object. #' #' @seealso \code{\link{import_mothur}} #' @keywords internal import_mothur_shared = function(mothur_shared_file, cutoff=NULL){ #mothur_shared_file = "~/github/phyloseq/inst/extdata/esophagus.fn.shared.gz" # Check that cutoff is in cutoffs, or select a cutoff if none given. cutoffs = show_mothur_cutoffs(mothur_shared_file) cutoffs = cutoffs[!cutoffs %in% "label"] cutoff = select_mothur_cutoff(cutoff, cutoffs) x = readLines(mothur_shared_file) rawtab = read.table(text=x[grep(paste0("^", cutoff), x)], header=FALSE, row.names=2, stringsAsFactors=FALSE)[, -(1:2)] colnames(rawtab) <- strsplit(x[1], "\t")[[1]][4:(ncol(rawtab)+3)] return(otu_table(t(as.matrix(rawtab)), taxa_are_rows=TRUE)) } ################################################################################ #' Import mothur constaxonomy file and return a taxonomyTable #' #' @param mothur_constaxonomy_file (Required). A #' \href{http://www.mothur.org/wiki/Constaxonomy_file}{consensus taxonomy file} #' produced by \emph{mothur}. #' #' @param parseFunction (Optional). A specific function used for parsing the taxonomy string. #' See \code{\link{parse_taxonomy_default}} for an example. If the default is #' used, this function expects a semi-colon delimited taxonomy string, with #' no additional rank specifier. A common taxonomic database is GreenGenes, #' and for recent versions its taxonomy includes a prefix, which is best cleaved #' and used to precisely label the ranks (\code{\link{parse_taxonomy_greengenes}}). #' #' @return An \code{\link{taxonomyTable-class}} object. #' #' @seealso \code{\link{import_mothur}} #' #' \code{\link{tax_table}} #' #' \code{\link{phyloseq}} #' #' @keywords internal import_mothur_constaxonomy = function(mothur_constaxonomy_file, parseFunction=parse_taxonomy_default){ read.table(mothur_constaxonomy_file) rawtab = read.table(mothur_constaxonomy_file, header=TRUE, row.names=1, stringsAsFactors=FALSE)[, "Taxonomy", drop=FALSE] if( identical(parseFunction, parse_taxonomy_default) ){ # Proceed with default parsing stuff. # Remove the confidence strings inside the parentheses, if present rawtab[, "Taxonomy"] = gsub("\\([[:digit:]]+\\)", "", rawtab[, "Taxonomy"]) # Remove the quotation marks, if present rawtab[, "Taxonomy"] = gsub("\"", "", rawtab[, "Taxonomy"]) # Remove trailing semicolon rawtab[, "Taxonomy"] = gsub(";$", "", rawtab[, "Taxonomy"]) # Split on semicolon taxlist = strsplit(rawtab[, "Taxonomy"], ";", fixed=TRUE) taxlist = lapply(taxlist, parseFunction) } else { taxlist = lapply(rawtab[, "Taxonomy"], parseFunction) } names(taxlist) <- rownames(rawtab) return(build_tax_table(taxlist)) } ################################################################################ #' General function for importing mothur data files into phyloseq. #' #' Technically all parameters are optional, #' but if you don't provide any file connections, then nothing will be returned. #' While the \code{list} and \code{group} files are the first two arguments #' for legacy-compatibility reasons, we don't recommend that you use these #' file types with modern (large) datasets. They are comically inefficient, as #' they store the name of every sequencing read in both files. The \emph{mothur} #' package provides conversions utilities to create other more-efficient formats, #' which we recommend, like #' the \href{http://www.mothur.org/wiki/Shared_file}{shared file} for an OTU table. #' Alternatively, mothur also provides a utility to create a biom-format file #' that is independent of OTU clustering platform. Biom-format files #' should be imported not with this function, but with \code{\link{import_biom}}. #' The resulting objects after import should be \code{\link{identical}} in R. #' #' @param mothur_list_file (Optional). The list file name / location produced by \emph{mothur}. #' #' @param mothur_group_file (Optional). The name/location of the group file produced #' by \emph{mothur}'s \code{make.group()} function. It contains information #' about the sample source of individual sequences, necessary for creating a #' species/taxa abundance table (\code{otu_table}). See #' \code{http://www.mothur.org/wiki/Make.group} #' #' @param mothur_tree_file (Optional). #' A tree file, presumably produced by \emph{mothur}, #' and readable by \code{\link{read_tree}}. #' The file probably has extension \code{".tree"}. #' #' @param cutoff (Optional). A character string indicating the cutoff value, (or \code{"unique"}), #' that matches one of the cutoff-values used to produce the OTU clustering #' results contained within the list-file created by \emph{mothur} (and specified #' by the \code{mothur_list_file} argument). The default #' is to take the largest value among the cutoff values contained in the list #' file. If only one cutoff is included in the file, it is taken and this #' argument does not need to be specified. Note that the \code{cluster()} #' function within the \emph{mothur} package will often produce a list file #' with multiple cutoff values, even if a specific cutoff is specified. It is #' suggested that you check which cutoff values are available in a given list #' file using the \code{\link{show_mothur_cutoffs}} function. #' #' @param mothur_shared_file (Optional). A #' \href{http://www.mothur.org/wiki/Shared_file}{shared file} #' produced by \emph{mothur}. #' #' @param mothur_constaxonomy_file (Optional). A #' \href{http://www.mothur.org/wiki/Constaxonomy_file}{consensus taxonomy file} #' produced by \emph{mothur}. #' #' @param parseFunction (Optional). A specific function used for parsing the taxonomy string. #' See \code{\link{parse_taxonomy_default}} for an example. If the default is #' used, this function expects a semi-colon delimited taxonomy string, with #' no additional rank specifier. A common taxonomic database is GreenGenes, #' and in recent versions its taxonomy entries include a prefix, which is best cleaved #' and used to precisely label the ranks (\code{\link{parse_taxonomy_greengenes}}). #' #' @return The object class depends on the provided arguments. #' A phyloseq object is returned if enough data types are provided. #' If only one data component can be created from the data, it is returned. #' #' FASTER (recommended for larger data sizes): #' #' If only a \code{mothur_constaxonomy_file} is provided, #' then a \code{\link{taxonomyTable-class}} object is returned. #' #' If only a \code{mothur_shared_file} is provided, #' then an \code{\link{otu_table}} object is returned. #' #' SLOWER (but fine for small file sizes): #' #' The list and group file formats are extremely inefficient for large datasets, #' and they are not recommended. The mothur software provides tools for #' converting to other file formats, such as a so-called ``shared'' file. #' You should provide a shared file, or group/list files, but not #' both at the same time. #' If only a list and group file are provided, #' then an \code{otu_table} object is returned. #' Similarly, if only a list and tree file are provided, #' then only a tree is returned (\code{\link[ape]{phylo}}-class). #' #' @references \url{http://www.mothur.org/wiki/Main_Page} #' #' Schloss, P.D., et al., Introducing mothur: Open-source, platform-independent, #' community-supported software for describing and comparing microbial communities. #' Appl Environ Microbiol, 2009. 75(23):7537-41. #' #' @export #' #' @examples #' # # The following example assumes you have downloaded the esophagus example #' # # dataset from the mothur wiki: #' # # "http://www.mothur.org/wiki/Esophageal_community_analysis" #' # # "http://www.mothur.org/w/images/5/55/Esophagus.zip" #' # # The path on your machine may (probably will) vary #' # mothur_list_file <- "~/Downloads/mothur/Esophagus/esophagus.an.list" #' # mothur_group_file <- "~/Downloads/mothur/Esophagus/esophagus.good.groups" #' # mothur_tree_file <- "~/Downloads/mothur/Esophagus/esophagus.tree" #' # # # Actual examples follow: #' # show_mothur_cutoffs(mothur_list_file) #' # test1 <- import_mothur(mothur_list_file, mothur_group_file, mothur_tree_file) #' # test2 <- import_mothur(mothur_list_file, mothur_group_file, mothur_tree_file, cutoff="0.02") #' # # Returns just a tree #' # import_mothur(mothur_list_file, mothur_tree_file=mothur_tree_file) #' # # Returns just an otu_table #' # import_mothur(mothur_list_file, mothur_group_file=mothur_group_file) #' # # Returns an error #' # import_mothur(mothur_list_file) #' # # Should return an "OMG, you must provide the list file" error #' # import_mothur() import_mothur <- function(mothur_list_file=NULL, mothur_group_file=NULL, mothur_tree_file=NULL, cutoff=NULL, mothur_shared_file=NULL, mothur_constaxonomy_file=NULL, parseFunction=parse_taxonomy_default){ pslist = vector("list") if( !is.null(mothur_group_file) & !is.null(mothur_list_file) ){ # If list & group files provided, you can make an OTU table. groupOTU = import_mothur_otu_table(mothur_list_file, mothur_group_file, cutoff) pslist = c(pslist, list(groupOTU)) } if( !is.null(mothur_tree_file) ){ tree <- read_tree(mothur_tree_file) pslist = c(pslist, list(tree)) } if( !is.null(mothur_shared_file) ){ OTUshared <- import_mothur_shared(mothur_shared_file) pslist = c(pslist, list(OTUshared)) } if( !is.null(mothur_constaxonomy_file) ){ tax <- import_mothur_constaxonomy(mothur_constaxonomy_file, parseFunction) pslist = c(pslist, list(tax)) } return(do.call("phyloseq", pslist)) } ################################################################################ #' Import mothur-formatted distance file #' #' The mothur application will produce a file containing the pairwise distances #' between all sequences in a dataset. This distance matrix can be the basis for #' OTU cluster designations. R also has many built-in or off-the-shelf tools for #' dealing with distance matrices. #' #' @usage import_mothur_dist(mothur_dist_file) #' #' @param mothur_dist_file Required. The distance file name / location produced by \emph{mothur}. #' #' @return A distance matrix object describing all sequences in a dataset. #' #' @export #' #' @seealso \code{\link{import_mothur}} #' #' @examples #' # # Take a look at the dataset shown here as an example: #' # # "http://www.mothur.org/wiki/Esophageal_community_analysis" #' # # find the file ending with extension ".dist", download to your system #' # # The location of your file may vary #' # mothur_dist_file <- "~/Downloads/mothur/Esophagus/esophagus.dist" #' # myNewDistObject <- import_mothur_dist(mothur_dist_file) import_mothur_dist <- function(mothur_dist_file){ # Read the raw distance matrix file produced by mothur: raw_dist_lines <- readLines(mothur_dist_file) # split each line on white space, and begin modifying into dist-matrix format dist_char <- strsplit(raw_dist_lines, "[[:space:]]+") dist_char <- dist_char[-1] # add name to each list element names(dist_char) <- sapply(dist_char, function(i){i[1]}) # pop out the names from each vector dist_char <- sapply(dist_char, function(i){i[-1]}) # convert to numeric vectors dist_char <- sapply(dist_char, function(i){as(i, "numeric")}) # Initialize and fill the matrix distm <- matrix(0, nrow=length(dist_char), ncol=length(dist_char)) rownames(distm) <- names(dist_char); colnames(distm) <- names(dist_char) for( i in names(dist_char)[-1] ){ distm[i, 1:length(dist_char[[i]])] <- dist_char[[i]] } diag(distm) <- 1 distd <- as.dist(distm) return(distd) } ################################################################################ ################################################################################ #' Export a distance object as \code{.names} and \code{.dist} files for mothur #' #' The purpose of this function is to allow a user to easily export a distance object #' as a pair of files that can be immediately imported by mothur for OTU clustering #' and related analysis. A distance object can be created in \code{R} in a number of #' ways, including via cataloguing the cophentic distances of a tree object. #' #' @usage export_mothur_dist(x, out=NULL, makeTrivialNamesFile=NULL) #' #' @param x (Required). A \code{"dist"} object, or a symmetric matrix. #' #' @param out (Optional). The desired output filename for the \code{.dist} file, OR #' left \code{NULL}, the default, in which case the mothur-formated distance table #' is returned to \code{R} standard out. #' #' @param makeTrivialNamesFile (Optional). Default \code{NULL}. The desired name of the \code{.names} file. #' If left \code{NULL}, the file name will be a modified version of the \code{out} argument. #' #' @return A character vector of the different cutoff values contained in the file. #' For a given set of arguments to the \code{cluster()} command from within #' \emph{mothur}, a number of OTU-clustering results are returned in the same #' list file. The exact cutoff values used by \emph{mothur} can vary depending #' on the input data. This simple function returns the cutoffs that were actually #' included in the \emph{mothur} output. This an important extra step prior to #' importing the OTUs with the \code{import_mothur_otulist()} function. #' #' @export #' #' @examples # #' data(esophagus) #' myDistObject <- as.dist(ape::cophenetic.phylo(phy_tree(esophagus))) #' export_mothur_dist(myDistObject) export_mothur_dist <- function(x, out=NULL, makeTrivialNamesFile=NULL){ if( class(x)== "matrix" ){ x <- as.dist(x) } if( class(x)!= "dist" ){ stop("x must be a dist object, or symm matrix") } # While x is a dist-object, get the length of unique pairs # to initialize the dist table. distdf <- matrix("", nrow=length(x), ncol=3) # Now convert x to matrix for looping, indexing. x <- as(x, "matrix") colnames(distdf) <- c("i", "j", "d") # distdf row counter z <- 1 # The big loop. for( i in 2:nrow(x) ){ # i <- 2 thisvec <- x[i, 1:(i-1)] for( j in 1:length(thisvec) ){ # j <- 1 distdf[z, "i"] <- rownames(x)[i] distdf[z, "j"] <- colnames(x)[j] distdf[z, "d"] <- thisvec[j] z <- z + 1 } } # mothur requires a .names file, in case you removed identical sequences # from within mothur and need to keep track and add them back. if( !is.null(makeTrivialNamesFile) ){ namestab <- matrix(rownames(x), nrow=length(rownames(x)), ncol=2) write.table(namestab, file=makeTrivialNamesFile, quote=FALSE, sep="\t", row.names=FALSE, col.names=FALSE) } # If is.null(out)==TRUE, then return two-column table. # If it's a character, write.table-it if( is.null(out) ){ return(distdf) } else { write.table(distdf, file=out, quote=FALSE, sep="\t", row.names=FALSE, col.names=FALSE) } } ################################################################################ #' Export environment (ENV) file for UniFrac Server. #' #' Creates the environment table that is needed for the original UniFrac #' algorithm. Useful for cross-checking, or if want to use UniFrac server. #' Optionally the ENV-formatted table can be returned to the \code{R} #' workspace, and the tree component can be exported as Nexus format #' (Recommended). #' #' @param physeq (Required). Experiment-level (\code{\link{phyloseq-class}}) object. #' Ideally this also contains the phylogenetic tree, which is also exported by default. #' #' @param file (Optional). The file path for export. If not-provided, the #' expectation is that you will want to set \code{return} to \code{TRUE}, #' and manipulate the ENV table on your own. Default is \code{""}, skipping #' the ENV file from being written to a file. #' #' @param writeTree (Optional). Write the phylogenetic tree as well as the #' the ENV table. Default is \code{TRUE}. #' #' @param return (Optional). Should the ENV table be returned to the R workspace? #' Default is \code{FALSE}. #' #' @importFrom ape write.nexus #' @export #' #' @examples #' # # Load example data #' # data(esophagus) #' # export_env_file(esophagus, "~/Desktop/esophagus.txt") export_env_file <- function(physeq, file="", writeTree=TRUE, return=FALSE){ # data(esophagus) # physeq <- esophagus # Create otu_table matrix and force orientation OTU <- as(otu_table(physeq), "matrix") if( !taxa_are_rows(physeq) ){ OTU <- t(OTU) } # initialize sequence/sample names seqs <- taxa_names(physeq) samples <- sample_names(physeq) # initialize output table as matrix ENV <- matrix("", nrow=sum(OTU >= 1), ncol=3) # i counts the row of the output , ENV i=1 while( i < nrow(ENV) ){ for( j in seqs){ for( k in which(OTU[j, ]>0) ){ ENV[i, 1] <- j ENV[i, 2] <- samples[k] ENV[i, 3] <- OTU[j, k] i <- i + 1 } } } # If a file path is provided, write the table to that file if(file != ""){ write.table(ENV, file=file, quote=FALSE, sep="\t", row.names=FALSE, col.names=FALSE) } # If needed, also write the associated tree-file. if( writeTree ){ fileTree <- paste(file, ".nex", sep="") write.nexus(phy_tree(physeq), file=fileTree, original.data=FALSE) } # If return argument is TRUE, return the environment table if(return){ return(ENV) } } ################################################################################ # UniFrac ENV files have the form: # # SEQ1 ENV1 1 # SEQ1 ENV2 2 # SEQ2 ENV1 15 # SEQ3 ENV1 2 # SEQ4 ENV2 8 # SEQ5 ENV1 4 # http://128.138.212.43/unifrac/help.psp#env_file ################################################################################ #' Import phyloseq data from biom-format file #' #' New versions of QIIME produce a more-comprehensive and formally-defined #' JSON file format, called biom file format: #' #' ``The biom file format (canonically pronounced `biome') is designed to be a #' general-use format for representing counts of observations in one or #' more biological samples. BIOM is a recognized standard for the Earth Microbiome #' Project and is a Genomics Standards Consortium candidate project.'' #' #' \url{http://biom-format.org/} #' #' @usage import_biom(BIOMfilename, #' treefilename=NULL, refseqfilename=NULL, refseqFunction=readDNAStringSet, refseqArgs=NULL, #' parseFunction=parse_taxonomy_default, parallel=FALSE, version=1.0, ...) #' #' @param BIOMfilename (Required). A character string indicating the #' file location of the BIOM formatted file. This is a JSON formatted file, #' specific to biological datasets, as described in #' \url{http://www.qiime.org/svn_documentation/documentation/biom_format.html}{the biom-format home page}. #' In principle, this file should include you OTU abundance data (OTU table), #' your taxonomic classification data (taxonomy table), as well as your #' sample data, for instance what might be in your ``sample map'' in QIIME. #' A phylogenetic tree is not yet supported by biom-format, and so is a #' separate argument here. If, for some reason, your biom-format file is #' missing one of these mentioned data types but you have it in a separate file, #' you can first import the data that is in the biom file using this function, #' \code{import_biom}, and then ``merge'' the remaining data after you have #' imported with other tools using the relatively general-purpose data #' merging function called \code{\link{merge_phyloseq}}. #' #' @param treefilename (Optional). Default value is \code{NULL}. #' A file representing a phylogenetic tree #' or a \code{\link{phylo}} object. #' Files can be NEXUS or Newick format. #' See \code{\link{read_tree}} for more details. #' Also, if using a recent release of the GreenGenes database tree, #' try the \code{\link{read_tree_greengenes}} function -- #' this should solve some issues specific to importing that tree. #' If provided, the tree should have the same OTUs/tip-labels #' as the OTUs in the other files. #' Any taxa or samples missing in one of the files is removed from all. #' As an example from the QIIME pipeline, #' this tree would be a tree of the representative 16S rRNA sequences from each OTU #' cluster, with the number of leaves/tips equal to the number of taxa/species/OTUs, #' or the complete reference database tree that contains the OTU identifiers #' of every OTU in your abundance table. #' Note that this argument can be a tree object (\code{\link[ape]{phylo}}-class) #' for cases where the tree has been --- or needs to be --- imported separately, #' as in the case of the GreenGenes tree mentioned earlier (code{\link{read_tree_greengenes}}). #' #' @param refseqfilename (Optional). Default \code{NULL}. #' The file path of the biological sequence file that contains at a minimum #' a sequence for each OTU in the dataset. #' Alternatively, you may provide an already-imported #' \code{\link[Biostrings]{XStringSet}} object that satisfies this condition. #' In either case, the \code{\link{names}} of each OTU need to match exactly the #' \code{\link{taxa_names}} of the other components of your data. #' If this is not the case, for example if the data file is a FASTA format but #' contains additional information after the OTU name in each sequence header, #' then some additional parsing is necessary, #' which you can either perform separately before calling this function, #' or describe explicitly in a custom function provided in the (next) argument, #' \code{refseqFunction}. #' Note that the \code{\link[Biostrings]{XStringSet}} class can represent any #' arbitrary sequence, including user-defined subclasses, but is most-often #' used to represent RNA, DNA, or amino acid sequences. #' The only constraint is that this special list of sequences #' has exactly one named element for each OTU in the dataset. #' #' @param refseqFunction (Optional). #' Default is \code{\link[Biostrings]{readDNAStringSet}}, #' which expects to read a fasta-formatted DNA sequence file. #' If your reference sequences for each OTU are amino acid, RNA, or something else, #' then you will need to specify a different function here. #' This is the function used to read the file connection provided as the #' the previous argument, \code{refseqfilename}. #' This argument is ignored if \code{refseqfilename} is already a #' \code{\link[Biostrings]{XStringSet}} class. #' #' @param refseqArgs (Optional). #' Default \code{NULL}. #' Additional arguments to \code{refseqFunction}. #' See \code{\link[Biostrings]{XStringSet-io}} for details about #' additional arguments to the standard read functions in the Biostrings package. #' #' @param parseFunction (Optional). A function. It must be a function that #' takes as its first argument a character vector of taxonomic rank labels #' for a single OTU #' and parses and names each element #' (an optionally removes unwanted elements). #' Further details and examples of acceptable functions are provided #' in the documentation for \code{\link{parse_taxonomy_default}}. #' There are many variations on taxonomic nomenclature, and naming #' conventions used to store that information in various taxonomic #' databases and phylogenetic assignment algorithms. A popular database, #' \url{http://greengenes.lbl.gov/cgi-bin/nph-index.cgi}{greengenes}, #' has its own custom parsing function provided in the phyloseq package, #' \code{\link{parse_taxonomy_greengenes}}, #' and more can be contributed or posted as code snippets as needed. #' They can be custom-defined by a user immediately prior to the the call to #' \code{\link{import_biom}}, and this is a suggested first step to take #' when trouble-shooting taxonomy-related errors during file import. #' #' @param parallel (Optional). Logical. Wrapper option for \code{.parallel} #' parameter in \code{plyr-package} functions. If \code{TRUE}, apply #' parsing functions in parallel, using parallel backend provided by #' \code{\link{foreach}} and its supporting backend packages. One caveat, #' plyr-parallelization currently works most-cleanly with \code{multicore}-like #' backends (Mac OS X, Unix?), and may throw warnings for SNOW-like backends. #' See the example below for code invoking multicore-style backend within #' the \code{doParallel} package. #' #' Finally, for many datasets a parallel import should not be necessary #' because a serial import will be just as fast and the import is often only #' performed one time; after which the data should be saved as an RData file #' using the \code{\link{save}} function. #' #' @param version (Optional). Numeric. The expected version number of the file. #' As the BIOM format evolves, version-specific importers may be available #' by adjusting the version value. Default is \code{1.0}. #' Not yet implemented. Parsing of the biom-format is done mostly #' by the biom package now available in CRAN. #' #' @param ... Additional parameters passed on to \code{\link{read_tree}}. #' #' @return A \code{\link{phyloseq-class}} object. #' #' @seealso #' \code{\link{import}} #' #' \code{\link{import_qiime}} #' #' \code{\link{read_tree}} #' #' \code{\link{read_tree_greengenes}} #' #' \code{\link[biomformat]{read_biom}} #' #' \code{\link[biomformat]{biom_data}} #' #' \code{\link[biomformat]{sample_metadata}} #' #' \code{\link[biomformat]{observation_metadata}} #' #' \code{\link[Biostrings]{XStringSet-io}} #' #' @references \href{http://www.qiime.org/svn_documentation/documentation/biom_format.html}{biom-format} #' #' @importFrom Biostrings readDNAStringSet #' @importFrom biomformat read_biom #' @importFrom biomformat sample_metadata #' @importFrom biomformat biom_data #' @importFrom biomformat observation_metadata #' #' @export #' #' @examples #' # An included example of a rich dense biom file #' rich_dense_biom <- system.file("extdata", "rich_dense_otu_table.biom", package="phyloseq") #' import_biom(rich_dense_biom, parseFunction=parse_taxonomy_greengenes) #' # An included example of a sparse dense biom file #' rich_sparse_biom <- system.file("extdata", "rich_sparse_otu_table.biom", package="phyloseq") #' import_biom(rich_sparse_biom, parseFunction=parse_taxonomy_greengenes) #' # # # Example code for importing large file with parallel backend #' # library("doParallel") #' # registerDoParallel(cores=6) #' # import_biom("my/file/path/file.biom", parseFunction=parse_taxonomy_greengenes, parallel=TRUE) import_biom <- function(BIOMfilename, treefilename=NULL, refseqfilename=NULL, refseqFunction=readDNAStringSet, refseqArgs=NULL, parseFunction=parse_taxonomy_default, parallel=FALSE, version=1.0, ...){ # initialize the argument-list for phyloseq. Start empty. argumentlist <- list() # Read the data if(class(BIOMfilename)=="character"){ x = read_biom(biom_file=BIOMfilename) } else if (class(BIOMfilename)=="biom"){ x = BIOMfilename } else { stop("import_biom requires a 'character' string to a biom file or a 'biom-class' object") } ######################################## # OTU table: ######################################## otutab = otu_table(as(biom_data(x), "matrix"), taxa_are_rows=TRUE) argumentlist <- c(argumentlist, list(otutab)) ######################################## # Taxonomy Table ######################################## # Need to check if taxonomy information is empty (minimal BIOM file) if( all( sapply(sapply(x$rows, function(i){i$metadata}), is.null) ) ){ taxtab <- NULL } else { # parse once each character vector, save as a list taxlist = lapply(x$rows, function(i){ parseFunction(i$metadata$taxonomy) }) names(taxlist) = sapply(x$rows, function(i){i$id}) taxtab = build_tax_table(taxlist) } argumentlist <- c(argumentlist, list(taxtab)) ######################################## # Sample Data ("columns" in QIIME/BIOM) ######################################## # If there is no metadata (all NULL), then set sam_data <- NULL if( is.null(sample_metadata(x)) ){ samdata <- NULL } else { samdata = sample_data(sample_metadata(x)) } argumentlist <- c(argumentlist, list(samdata)) ######################################## # Tree data ######################################## if( !is.null(treefilename) ){ if( inherits(treefilename, "phylo") ){ # If argument is already a tree, don't read, just assign. tree = treefilename } else { # NULL is silently returned if tree is not read properly. tree <- read_tree(treefilename, ...) } # Add to argument list or warn if( is.null(tree) ){ warning("treefilename failed import. It not included.") } else { argumentlist <- c(argumentlist, list(tree) ) } } ######################################## # Reference Sequence data ######################################## if( !is.null(refseqfilename) ){ if( inherits(refseqfilename, "XStringSet") ){ # If argument is already a XStringSet, don't read, just assign. refseq = refseqfilename } else { # call refseqFunction and read refseqfilename, either with or without additional args if( !is.null(refseqArgs) ){ refseq = do.call("refseqFunction", c(list(refseqfilename), refseqArgs)) } else { refseq = refseqFunction(refseqfilename) } } argumentlist <- c(argumentlist, list(refseq) ) } ######################################## # Put together into a phyloseq object ######################################## return( do.call("phyloseq", argumentlist) ) } ################################################################################ # Need to export these parsing functions as examples... ################################################################################ #' Parse elements of a taxonomy vector #' #' These are provided as both example and default functions for #' parsing a character vector of taxonomic rank information for a single taxa. #' As default functions, these are intended for cases where the data adheres to #' the naming convention used by greengenes #' (\url{http://greengenes.lbl.gov/cgi-bin/nph-index.cgi}) #' or where the convention is unknown, respectively. #' To work, these functions -- and any similar custom function you may want to #' create and use -- must take as input a single character vector of taxonomic #' ranks for a single OTU, and return a \strong{named} character vector that has #' been modified appropriately (according to known naming conventions, #' desired length limits, etc. #' The length (number of elements) of the output named vector does \strong{not} #' need to be equal to the input, which is useful for the cases where the #' source data files have extra meaningless elements that should probably be #' removed, like the ubiquitous #' ``Root'' element often found in greengenes/QIIME taxonomy labels. #' In the case of \code{parse_taxonomy_default}, no naming convention is assumed and #' so dummy rank names are added to the vector. #' More usefully if your taxonomy data is based on greengenes, the #' \code{parse_taxonomy_greengenes} function clips the first 3 characters that #' identify the rank, and uses these to name the corresponding element according #' to the appropriate taxonomic rank name used by greengenes #' (e.g. \code{"p__"} at the beginning of an element means that element is #' the name of the phylum to which this OTU belongs). #' Most importantly, the expectations for these functions described above #' make them compatible to use during data import, #' specifcally the \code{\link{import_biom}} function, but #' it is a flexible structure that will be implemented soon for all phyloseq #' import functions that deal with taxonomy (e.g. \code{\link{import_qiime}}). #' #' @usage parse_taxonomy_default(char.vec) #' @usage parse_taxonomy_greengenes(char.vec) #' @usage parse_taxonomy_qiime(char.vec) #' #' @param char.vec (Required). A single character vector of taxonomic #' ranks for a single OTU, unprocessed (ugly). #' #' @return A character vector in which each element is a different #' taxonomic rank of the same OTU, and each element name is the name of #' the rank level. For example, an element might be \code{"Firmicutes"} #' and named \code{"phylum"}. #' These parsed, named versions of the taxonomic vector should #' reflect embedded information, naming conventions, #' desired length limits, etc; or in the case of \code{\link{parse_taxonomy_default}}, #' not modified at all and given dummy rank names to each element. #' #' @rdname parseTaxonomy-functions #' @export #' #' @seealso #' \code{\link{import_biom}} #' \code{\link{import_qiime}} #' #' @examples #' taxvec1 = c("Root", "k__Bacteria", "p__Firmicutes", "c__Bacilli", "o__Bacillales", "f__Staphylococcaceae") #' parse_taxonomy_default(taxvec1) #' parse_taxonomy_greengenes(taxvec1) #' taxvec2 = c("Root;k__Bacteria;p__Firmicutes;c__Bacilli;o__Bacillales;f__Staphylococcaceae") #' parse_taxonomy_qiime(taxvec2) parse_taxonomy_default = function(char.vec){ # Remove any leading empty space char.vec = gsub("^[[:space:]]{1,}", "", char.vec) # Remove any trailing space char.vec = gsub("[[:space:]]{1,}$", "", char.vec) if( length(char.vec) > 0 ){ # Add dummy element (rank) name names(char.vec) = paste("Rank", 1:length(char.vec), sep="") } else { warning("Empty taxonomy vector encountered.") } return(char.vec) } #' @rdname parseTaxonomy-functions #' @aliases parse_taxonomy_default #' @export parse_taxonomy_greengenes <- function(char.vec){ # Use default to assign names to elements in case problem with greengenes prefix char.vec = parse_taxonomy_default(char.vec) # Define the meaning of each prefix according to GreenGenes taxonomy Tranks = c(k="Kingdom", p="Phylum", c="Class", o="Order", f="Family", g="Genus", s="Species") # Check for prefix using regexp, warn if there were none. trim indices, ti ti = grep("[[:alpha:]]{1}\\_\\_", char.vec) if( length(ti) == 0L ){ warning( "No greengenes prefixes were found. \n", "Consider using parse_taxonomy_default() instead if true for all OTUs. \n", "Dummy ranks may be included among taxonomic ranks now." ) # Will want to return without further modifying char.vec taxvec = char.vec # Replace names of taxvec according to prefix, if any present... } else { # Remove prefix using sub-"" regexp, call result taxvec taxvec = gsub("[[:alpha:]]{1}\\_\\_", "", char.vec) # Define the ranks that will be replaced repranks = Tranks[substr(char.vec[ti], 1, 1)] # Replace, being sure to avoid prefixes not present in Tranks names(taxvec)[ti[!is.na(repranks)]] = repranks[!is.na(repranks)] } return(taxvec) } #' @rdname parseTaxonomy-functions #' @aliases parse_taxonomy_default #' @export parse_taxonomy_qiime <- function(char.vec){ parse_taxonomy_greengenes(strsplit(char.vec, ";", TRUE)[[1]]) } ################################################################################ #' Build a \code{\link{tax_table}} from a named possibly-jagged list #' #' @param taxlist (Required). A list in which each element is a vector of #' taxonomic assignments named by rank. #' Every element of every vector must be named by the rank it represents. #' Every element of the list (every vector) should correspond to a single OTU #' and be named for that OTU. #' #' @return A \code{\link{tax_table}} (\code{\link{taxonomyTable-class}}) that #' has been built from \code{taxlist}. The OTU names of this output will be #' the element names of \code{taxlist}, and a separate taxonomic rank #' (column) will be included for each unique rank found among the element names #' of each vector in the list. \code{NA_character_} is the default value of #' elements in the \code{\link{tax_table}} for which there is no corresponding #' information in \code{taxlist}. #' #' @seealso #' \code{\link{import_biom}} #' \code{\link{import_qiime}} #' #' @export #' #' @examples #' taxvec1 = c("Root", "k__Bacteria", "p__Firmicutes", "c__Bacilli", "o__Bacillales", "f__Staphylococcaceae") #' parse_taxonomy_default(taxvec1) #' parse_taxonomy_greengenes(taxvec1) #' taxvec2 = c("Root;k__Bacteria;p__Firmicutes;c__Bacilli;o__Bacillales;f__Staphylococcaceae") #' parse_taxonomy_qiime(taxvec2) #' taxlist1 = list(OTU1=parse_taxonomy_greengenes(taxvec1), OTU2=parse_taxonomy_qiime(taxvec2)) #' taxlist2 = list(OTU1=parse_taxonomy_default(taxvec1), OTU2=parse_taxonomy_qiime(taxvec2)) #' build_tax_table(taxlist1) #' build_tax_table(taxlist2) build_tax_table = function(taxlist){ # Determine column headers (rank names) of taxonomy table columns = unique(unlist(lapply(taxlist, names))) # Initialize taxonomic character matrix taxmat <- matrix(NA_character_, nrow=length(taxlist), ncol=length(columns)) colnames(taxmat) = columns # Fill in the matrix by row. for( i in 1:length(taxlist) ){ # Protect against empty taxonomy if( length(taxlist[[i]]) > 0 ){ # The extra column name check solves issues with raggedness, and disorder. taxmat[i, names(taxlist[[i]])] <- taxlist[[i]] } } # Convert functionally empty elements, "", to NA taxmat[taxmat==""] <- NA_character_ # Now coerce to matrix, name the rows as "id" (the taxa name), coerce to taxonomyTable taxmat <- as(taxmat, "matrix") rownames(taxmat) = names(taxlist) return( tax_table(taxmat) ) } ################################################################################ ################################################################################ ################################################################################ #' Import microbio.me/qiime (QIIME-DB) data package #' #' Originally, this function was for accessing microbiome datasets from the #' \href{http://www.microbio.me/qiime/index.psp}{microbio.me/qiime} #' public repository from within R. #' As you can see by clicking on the above link, #' the QIIME-DB sever is down indefinitely. #' However, this function will remain supported here #' in case the FTP server goes back up, #' and also for phyloseq users that have downloaded #' one or more data packages prior to the server going down. #' #' @param zipftp (Required). A character string that is the full URL #' path to a zipped file that follows the file naming conventions used by #' \href{http://www.microbio.me/qiime/index.psp}{microbio.me/qiime}. #' Alternatively, you can simply provide the study number #' as a single \code{\link{integer}} or other single-length vector #' that can be \code{\link{coerce}}d to an integer; #' this function will complete the remainder of the ftp URL hosted at #' \href{http://www.microbio.me/qiime/index.psp}{microbio.me/qiime}. #' For example, instead of the full URL string, #' \code{"ftp://thebeast.colorado.edu/pub/QIIME_DB_Public_Studies/study_494_split_library_seqs_and_mapping.zip"}, #' you could simply provide \code{494} or \code{"494"} #' as the first (`zipftp`) argument. #' #' @param ext (Optional). A \code{\link{character}} string of the expected #' file extension, which also indicates the compression type, #' if \code{zipftp} is a study number instead of the full path. #' Note that this argument has no effect if \code{zipftp} is the full path, #' in which case the file extension is read directly from the downloaded file. #' #' @param parsef (Optional). The type of taxonomic parsing to use for the #' OTU taxonomic classification, in the \code{.biom} file, if present. #' This is passed on to \code{\link{import_biom}}, but unlike that function #' the default parsing function is \code{\link{parse_taxonomy_greengenes}}, #' rather than \code{\link{parse_taxonomy_default}}, because we know #' ahead of time that most (or all?) of the taxonomic classifications #' in the \code{microbio.me/qiime} repository will be based on #' GreenGenes. #' #' @param ... (Optional, for advanced users). Additional arguments passed to #' \code{\link{download.file}}. This is mainly for non-standard links to #' resources (in this case, a zipped file) that are not being hosted by #' \href{http://www.microbio.me/qiime/index.psp}{microbio.me/qiime}. #' If you are using a FTP address or study number from their servers, #' then you shouldn't need to provide any additional arguments. #' #' @return #' A \code{\link{phyloseq-class}} object if possible, a component if only a #' component could be imported, or \code{NULL} if nothing could be imported #' after unzipping the file. Keep in mind there is a specific naming-convention #' that is expected based on the current state of the #' \href{http://www.microbio.me/qiime/index.psp}{microbio.me/qiime} #' servers. Several helpful messages are \code{\link{cat}}ted to standard out #' to help let you know the ongoing status of the current #' download and import process. #' #' @seealso #' See \code{\link{download.file}} and \code{\link{url}} #' for details about URL formats -- #' including local file addresses -- that might work here. #' #' \code{\link{import_biom}} #' #' \code{\link{import_qiime}} #' #' @export #' @examples #' # This should return TRUE on your system if you have internet turned on #' # and a standard R installation. Indicates whether this is likely to #' # work on your system for a URL or local file, respectively. #' capabilities("http/ftp"); capabilities("fifo") #' # A working example with a local example file included in phyloseq #' zipfile = "study_816_split_library_seqs_and_mapping.zip" #' zipfile = system.file("extdata", zipfile, package="phyloseq") #' tarfile = "study_816_split_library_seqs_and_mapping.tar.gz" #' tarfile = system.file("extdata", tarfile, package="phyloseq") #' tarps = microbio_me_qiime(tarfile) #' zipps = microbio_me_qiime(zipfile) #' identical(tarps, zipps) #' tarps; zipps #' plot_heatmap(tarps) #' # An example that used to work, before the QIIME-DB server was turned off by its host. #' # # Smokers dataset #' # smokezip = "ftp://thebeast.colorado.edu/pub/QIIME_DB_Public_Studies/study_524_split_library_seqs_and_mapping.zip" #' # smokers1 = microbio_me_qiime(smokezip) #' # # Alternatively, just use the study number #' # smokers2 = microbio_me_qiime(524) #' # identical(smokers1, smokers2) microbio_me_qiime = function(zipftp, ext=".zip", parsef=parse_taxonomy_greengenes, ...){ # Define naming convention front = "ftp://thebeast.colorado.edu/pub/QIIME_DB_Public_Studies/study_" if( !is.na(as.integer(zipftp)) ){ # If study number instead of string, # create the ftp URL using ext and convention back = paste0("_split_library_seqs_and_mapping", ext) zipftp = paste0(front, zipftp, back) } else { # Determine file extension from the file path itself ext = substring(zipftp, regexpr("\\.([[:alnum:]]+)$", zipftp)[1]) back = paste0("_split_library_seqs_and_mapping", ext) } # Check if zipftp is clearly an externally located file, ftp, http, etc. externprefixes = c("http://", "https://", "ftp://") prefix = regexpr("^([[:alnum:]]+)\\://", zipftp) if( substr(zipftp, 1, attr(prefix, "match.length")[1]) %in% externprefixes ){ # If external, then create temporary file and download zipfile = tempfile() download.file(zipftp, zipfile, ...) } else { # Else it is a local zipfile zipfile = zipftp } # Use the apparent file naming convention for microbio.me/qiime # as the de facto guide for this API. In particular, # the expectation o fthe study name (already used above) studyname = gsub("\\_split\\_.+$", "", basename(zipftp)) # The output of tempdir() is always the same in the same R session # To avoid conflict with multiple microbio.me/qiime unpacks # in the same session, pre-pend the study name and datestamp unpackdir = paste0(studyname, "_", gsub("[[:blank:][:punct:]]", "", date())) # Add the temp path unpackdir = file.path(tempdir(), unpackdir) # Create the unpack directory if needed (most likely). if( !file.exists(unpackdir) ){dir.create(unpackdir)} # Unpack to the temporary directory using unzip or untar if( ext == ".zip" ){ unzip(zipfile, exdir=unpackdir, overwrite=TRUE) } else if( ext %in% c("tar.gz", ".tgz", ".gz", ".gzip", ".bzip2", ".xz") ){ # untar the tarfile to the new temp dir untar(zipfile, exdir=unpackdir) } else { # The compression format was not recognized. Provide informative error msg. msg = paste("Could not determine the compression type.", "Expected extensions are (mostly):", ".zip, .tgz, .tar.gz", sep="\n") stop(msg) } # Define a list of imported objects that might grow # if the right file types are present and imported correctly. imported_objects = vector("list") # Search recursively in the unpacked directory for the .biom file # and parse if it is. # There should be only one. Throw warning if more than one, take the first. biomfile = list.files(unpackdir, "\\.biom", full.names=TRUE, recursive=TRUE) if( length(biomfile) > 1 ){ warning("more than one .biom file found in compressed archive. Importing first only.") biomfile = biomfile[1] } else if( length(biomfile) == 1 ){ cat("Found biom-format file, now parsing it... \n") biom = import_biom(biomfile, parseFunction=parsef) cat("Done parsing biom... \n") imported_objects = c(imported_objects, list(biom)) } # Check if sample_data (qiime mapping) file present, and parse if it is. sdfile = list.files(unpackdir, "\\_mapping\\_file\\.txt", full.names=TRUE, recursive=TRUE) if( length(sdfile) > 1 ){ warning("more than one mapping file found in compressed archive. Importing first only.") sdfile = sdfile[1] } else if( length(sdfile)==1 ){ cat("Importing Sample Metdadata from mapping file...", fill=TRUE) sample_metadata = import_qiime_sample_data(sdfile) imported_objects = c(imported_objects, list(sample_metadata)) } # Check success, notify user, and return. if( length(imported_objects) > 1 ){ # If there are more than one imported objects, merge them and return cat("Merging the imported objects... \n") physeq = do.call("merge_phyloseq", imported_objects) if( inherits(physeq, "phyloseq") ){ cat("Successfully merged, phyloseq-class created. \n Returning... \n") } return(physeq) } else if( length(imported_objects) == 1 ){ cat("Note: only on object in the zip file was imported. \n") cat("It was ", class(imported_objects[[1]]), " class. \n") return(imported_objects[[1]]) } else { cat("PLEASE NOTE: No objects were imported. \n", "You chould check the zip file, \n", "as well as the naming conventions in the zipfile \n", "to make sure that they match microbio.me/qiime. \n", "Instead returning NULL... \n") return(NULL) } } ################################################################################ #' Import usearch table format (\code{.uc}) to OTU table #' #' UPARSE is an algorithm for OTU-clustering implemented within usearch. #' At last check, the UPARSE algortihm was accessed via the #' \code{-cluster_otu} option flag. #' For details about installing and running usearch, please refer to the #' \href{http://drive5.com/usearch/}{usearch website}. #' For details about the output format, please refer to the #' \href{http://www.drive5.com/usearch/manual/opt_uc.html}{uc format definition}. #' This importer is intended to read a particular table format output #' that is generated by usearch, #' its so-called ``cluster format'', #' a file format that is often given the \code{.uc} extension #' in usearch documentation. #' #' Because usearch is an external (non-R) application, there is no direct #' way to continuously check that these suggested arguments and file formats will #' remain in their current state. #' If there is a problem, please verify your version of usearch, #' create a small reproducible example of the problem, #' and post it as an issue on the phyloseq issues tracker. #' The version of usearch upon which this import function #' was created is \code{7.0.109}. #' Hopefully later versions of usearch maintain this function and format, #' but the phyloseq team has no way to guarantee this, #' and so any feedback about this will help maintain future functionality. #' For instance, it is currently #' assumed that the 9th and 10th columns of the \code{.uc} table #' hold the read-label and OTU ID, respectively; #' and it is also assumed that the delimiter between sample-name and read #' in the read-name entries is a single \code{"_"}. #' If this is not true, you may have to update these parameters, #' or even modify the current implementation of this function. #' #' Also note that there is now a UPARSE-specific output file format, #' \href{http://www.drive5.com/usearch/manual/opt_uparseout.html}{uparseout}, #' and it might make more sense to create and import that file #' for use in phyloseq. #' If so, you'll want to import using the #' \code{\link{import_uparse}()} function. #' #' @param ucfile (Required). A file location character string #' or \code{\link{connection}} #' corresponding to the file that contains the usearch output table. #' This is passed directly to \code{\link{read.table}}. #' Please see its \code{file} argument documentation for further #' links and details. #' #' @param colRead (Optional). Numeric. The column index in the uc-table #' file that holds the read IDs. #' The default column index is \code{9}. #' #' @param colOTU (Optional). Numeric. The column index in the uc-table #' file that holds OTU IDs. #' The default column index is \code{10}. #' #' @param readDelimiter (Optional). An R \code{\link{regex}} as a character string. #' This should be the delimiter that separates the sample ID #' from the original ID in the demultiplexed read ID of your sequence file. #' The default is plain underscore, which in this \code{\link{regex}} context #' is \code{"_"}. #' #' @param verbose (Optional). A \code{\link{logical}}. #' Default is \code{TRUE}. #' Should progresss messages #' be \code{\link{cat}}ted to standard out? #' #' @importFrom data.table fread #' @importFrom data.table setnames #' @export #' @seealso \code{\link{import}} #' #' \code{\link{import_biom}} #' #' \code{\link{import_qiime}} #' #' @examples #' usearchfile <- system.file("extdata", "usearch.uc", package="phyloseq") #' import_usearch_uc(usearchfile) import_usearch_uc <- function(ucfile, colRead=9, colOTU=10, readDelimiter="_", verbose=TRUE){ if(verbose){cat("Reading `ucfile` into memory and parsing into table \n")} # fread is one of the fastest and most-efficient importers for R. # It creates a data.table object, suitable for large size objects x = fread(ucfile, sep="\t", header=FALSE, na.strings=c("*", '*', "NA","N/A",""), select=c(colRead, colOTU), colClasses="character", showProgress=TRUE) setnames(x, c("read", "OTU")) NrawEntries = nrow(x) if(verbose){ cat("Initially read", NrawEntries, "entries. \n") cat("... Now removing unassigned OTUs (* or NA)... \n") } x = x[!is.na(OTU), ] if(verbose){ cat("Removed", NrawEntries - nrow(x), "entries that had no OTU assignment. \n") cat("A total of", nrow(x), "will be assigned to the OTU table.\n") } # Process sequence label to be sample label only x[, sample:=gsub(paste0(readDelimiter, ".+$"), "", read)] # Convert long (melted) table into a sample-by-OTU OTU table, and return OTU <- as(table(x$sample, x$OTU), "matrix") # system.time({setkey(x, OTU, sample) # OTU2 <- dcast.data.table(x, sample ~ OTU, fun.aggregate=length, fill=0L) # }) return(otu_table(OTU, taxa_are_rows=FALSE)) } ################################################################################ #' Import \href{http://www.drive5.com/usearch/manual/opt_uparseout.html}{UPARSE file format} #' #' UPARSE is an algorithm for OTU-clustering implemented within usearch. #' At last check, the UPARSE algortihm was accessed via the #' \code{-cluster_otu} option flag. #' For details about installing and running usearch, please refer to the #' \href{http://drive5.com/usearch/}{usearch website}. #' For details about the output format, please refer to the #' \href{http://www.drive5.com/usearch/manual/opt_uparseout.html}{uparse format definition}. #' #' Because UPARSE is an external (non-R) application, there is no direct #' way to continuously check that these suggested arguments and file formats will #' remain in their current state. #' If there is a problem, please verify your version of usearch, #' create a small reproducible example of the problem, #' and post it as an issue on the #' \href{https://github.com/joey711/phyloseq/issues}{phyloseq issues tracker}. #' #' @param upFile (Required). A file location character string #' or \code{\link{connection}} #' corresponding to the file that contains the UPARSE output table. #' This is passed directly to \code{\link[data.table]{fread}}. #' Please see its \code{file} argument documentation for further #' links and details. #' #' @param omitChimeras (Optional). \code{logical(1)}. #' Default is \code{TRUE}. #' Whether to omit entries that correspond to sequences/OTUs #' that were identified as chimeras. #' #' @param countTable (Optional). \code{logical(1)}. #' Default is \code{TRUE}. #' Whether to return the result as a wide-format table #' with dimensions OTU-by-sample, #' or to leave the table in its original sparse long-format #' that might be more suitable for certain \code{\link{data.table}} operations. #' If \code{TRUE}, entries corresponding to the same sample and OTU #' have their counts summed. #' #' @param OTUtable (Optional). \code{logical(1)}. #' Default is \code{TRUE}. #' Whether to coerce the result to \code{\link{otu_table}} format, #' or leave it as a \code{\link{data.table}} format. #' The former is appropriate for most \code{\link{phyloseq}} operations, #' the latter is useful for a lot of custom operations #' and custom \code{\link[ggplot2]{ggplot}2} graphics calls. #' #' @param verbose (Optional). A \code{\link{logical}}. #' Default is \code{TRUE}. #' Should progresss messages #' be \code{\link{cat}}ted to standard out? #' #' @importFrom data.table fread #' @importFrom data.table setnames #' @importFrom data.table setkeyv #' #' @export #' #' @seealso #' \code{\link{import_usearch_uc}} #' #' @examples #' ### import_uparse = function(upFile, omitChimeras = TRUE, countTable = TRUE, OTUtable = TRUE, verbose = TRUE){ if(verbose){message("Parsing UPARSE results table at:\n", upFile, "\nSee the following for details:\n", "http://www.drive5.com/usearch/manual/opt_uparseout.html")} x = fread(upFile, header = FALSE) setnames(x, "V5", "OTULabel") if(ncol(x) > 5L){ # If relabel column provided, use that as OTULabel setnames(x, "V6", "OTULabel") } setnames(x, "V1", "queryString") x[, count := as.integer(gsub("^.+;size=(\\d+);$", "\\1", queryString))] x[, queryID := gsub("^(.+);size=\\d+;$", "\\1", queryString)] setnames(x, "V2", "Classification") if(omitChimeras){ x <- x[(Classification != "chimera")] } if(countTable){ # If you want to create a wide-format table with summed counts # key sort sortVars = c("queryID", "OTULabel") setkeyv(x, sortVars) # turn into wide data.table OTUwdt <- dcast.data.table(x, OTULabel ~ queryID, value.var = "count", fun.aggregate = sum, fill=0L) if(OTUtable){ # If we want an OTU table version of this taxaIDvec = OTUwdt$OTULabel OTUwdt[, OTULabel := NULL] # Coerce to integer matrix OTU <- as.matrix(OTUwdt) row.names(OTU) <- taxaIDvec # Coerce to OTU table and return return(otu_table(OTU, taxa_are_rows=TRUE)) } else { return(OTUwdt) } } else { return(x[, list(OTULabel, count, queryID, Classification)]) } } ################################################################################ ################################################################################ ################################################################################ phyloseq/R/allClasses.R0000644000175400017540000003221013175714136016064 0ustar00biocbuildbiocbuild################################################################################ #' The S4 class for storing taxa-abundance information. #' #' Because orientation of these tables can vary by method, the orientation is #' defined explicitly in the \code{taxa_are_rows} slot (a logical). #' The \code{otu_table} class inherits the \code{\link{matrix}} class to store #' abundance values. #' Various standard subset and assignment nomenclature has been extended to apply #' to the \code{otu_table} class, including square-bracket, \code{\link{t}}, etc. #' #' \describe{ #' \item{taxa_are_rows}{ #' A single logical specifying the orientation of the abundance table. #' } #' #' \item{.Data}{This slot is inherited from the \code{\link{matrix}} class.} #' } #' @name otu_table-class #' @rdname otu_table-class #' @exportClass otu_table setClass("otu_table", representation(taxa_are_rows="logical"), contains = "matrix") ################################################################################ #' The S4 for storing sample variables. #' #' Row indices represent samples, while column indices represent experimental #' categories, variables (and so forth) that describe the samples. #' #' \describe{ #' #' \item{.Data}{data-frame data, inherited from the data.frame class.} #' #' \item{row.names}{ #' Also inherited from the data.frame class; #' it should contain the sample names. #' } #' #' \item{names}{Inherited from the data.frame class.} #' #' } #' #' @name sample_data-class #' @rdname sample_data-class #' @exportClass sample_data setClass("sample_data", contains="data.frame") ################################################################################ #' An S4 class that holds taxonomic classification data as a character #' matrix. #' #' Row indices represent taxa, columns represent taxonomic classifiers. #' #' \describe{ #' \item{.Data}{This slot is inherited from the \code{\link{matrix}} class.} #' } #' #' @name taxonomyTable-class #' @rdname taxonomyTable-class #' @exportClass taxonomyTable setClass("taxonomyTable", contains = "matrix") #metaMDS ################################################################################ #' S3 class placeholder definition (list) for metaMDS #' #' The ape package does export a version of its \code{\link[vegan]{metaMDS}}-class, #' partly because it is not really defined formally anywhere. #' Instead, it is an S3 class extended from the base class, \code{\link{list}} -- #' this is a very common and easy approach -- #' and proper behavior of any method taking an instance of this class #' requires exact naming conventions for element names of the list components. #' The phyloseq package does not provide any validity checks that a given phylo #' instance is valid (conforms to the conventions in the ape package)... yet. #' If problems arise, this might be considered, and they could be defined #' judiciously and within phyloseq. #' #' @seealso #' \code{\link[vegan]{metaMDS}} #' #' @keywords internal metaMDS <- structure(list(), class = "metaMDS") ### # Remove if this ever works # @importClassesFrom vegan metaMDS ################################################################################ #' S3 class placeholder definition (list) for decorana #' #' The ape package does export a version of its \code{\link[vegan]{decorana}}-class, #' partly because it is not really defined formally anywhere. #' Instead, it is an S3 class extended from the base class, \code{\link{list}} -- #' this is a very common and easy approach -- #' and proper behavior of any method taking an instance of this class #' requires exact naming conventions for element names of the list components. #' The phyloseq package does not provide any validity checks that a given phylo #' instance is valid (conforms to the conventions in the ape package)... yet. #' If problems arise, this might be considered, and they could be defined #' judiciously and within phyloseq. #' #' @seealso #' \code{\link[vegan]{decorana}} #' #' @keywords internal decorana <- structure(list(), class = "decorana") ### # Remove if this ever works # @importClassesFrom vegan decorana ################################################################################ #' S3 class placeholder definition (list) for dpcoa #' #' The ade4 package does not export a version of its \code{\link[ade4]{dpcoa}}-class, #' partly because it is not really defined formally anywhere. #' Instead, it is an S3 class extended from the base class, \code{\link{list}} -- #' this is a very common and easy approach -- #' and proper behavior of any method taking an instance of this class #' requires exact naming conventions for element names of the list components. #' The phyloseq package does not provide any validity checks that a given phylo #' instance is valid (conforms to the conventions in the ape package). Yet. #' If problems arise, this might be considered, and they could be defined #' judiciously and within phyloseq. #' #' An instance of this class can be produced from within phyloseq using either #' the \code{\link{DPCoA}} function, or the higher-level wrapping function #' \code{\link{ordinate}}. #' #' @seealso #' \code{\link[ade4]{dpcoa}} #' #' \code{\link{DPCoA}} #' #' \code{\link{ordinate}} #' #' @keywords internal dpcoa <- structure(list(), class = "dpcoa") ################################################################################ ## # @keywords internal ## print.dpcoa <- ade4:::print.dpcoa ################################################################################ # If this ever works # @importClassesFrom ade4 dpcoa ################################################################################ #' S3 class for ape-calculated MDS results #' #' Nothing to import, because ape doesn't (yet) export this S3 class. #' We will define it here, but keep it internal. #' For the moment, its only use is for proper dispatch in our extensions #' to the scores S3 generic from vegan, #' for generic extraction of coordinates and possibly other features from #' any ordination results. #' #' @keywords internal pcoa <- structure(list(), class = "pcoa") # @importMethodsFrom ape print # phyloseq-specific definition of "phylo" class, ################################################################################ #' S3 class placeholder definition (list) for phylogenetic trees. #' #' The ape package does not export a version of its \code{\link[ape]{phylo}}-class, #' partly because it is not really defined formally anywhere. #' Instead, it is an S3 class extended from the base class, \code{\link{list}} -- #' this is a very common and easy approach -- #' and proper behavior of any method taking an instance of this class #' requires exact naming conventions for element names of the components. #' The phyloseq package does not provide any validity checks that a given phylo #' instance is valid (conforms to the conventions in the ape package). Yet. #' If problems arise, this might be considered, and they could be defined #' judiciously and within phyloseq. #' Similarly, if a formal definition for the the phylo-class is ever exported #' by ape, the current philosophy of phyloseq would be to remove this #' internal definition and import the former. Note that there is still some #' work going on for the phylobase package, which is addressing these same #' exact issues for S4 phylogenetic tree interaction. #' A very large number of packages (around 60 at my last count), depend on ape, #' making it easily the de facto standard for representing phylogenetic trees in R; #' and the phyloseq team would prefer to use any exported definitions from #' the ape package if possible and available. #' #' @seealso #' \code{\link[ape]{phylo}} #' #' @keywords internal phylo <- structure(list(), class = "phylo") ################################################################################ # If this ever works # @importClassesFrom ape phylo ################################################################################ #' An S4 placeholder of the main phylogenetic tree class from the ape package. #' #' See the \code{\link[ape]{ape}} package for details about this type of #' representation of a phylogenetic tree. #' It is used throughout the ape package. #' #' @seealso \code{\link[ape]{phylo}}, \code{\link{setOldClass}} #' #' @name phylo-class #' @rdname phylo-class #' @exportClass phylo setOldClass("phylo") ################################################################################ #' An S4 placeholder for the \code{\link[stats]{dist}} class. #' #' See \code{\link[stats]{dist}} for details #' about this type of a distance matrix object. #' #' @seealso \code{\link[stats]{dist}}, \code{\link{setOldClass}} #' #' @name dist-class #' @rdname dist-class #' @exportClass dist setOldClass("dist") ################################################################################ # Use setClassUnion to define the unholy NULL-data union as a virtual class. # This is a way of dealing with the expected scenarios in which one or more of # the component data classes is not available, in which case NULL will be used # instead. ################################################################################ #' @keywords internal setClassUnion("otu_tableOrNULL", c("otu_table", "NULL")) #' @keywords internal setClassUnion("sample_dataOrNULL", c("sample_data", "NULL")) #' @keywords internal setClassUnion("taxonomyTableOrNULL", c("taxonomyTable", "NULL")) #' @keywords internal setClassUnion("phyloOrNULL", c("phylo", "NULL")) #' @importClassesFrom Biostrings BStringSet #' @importClassesFrom Biostrings DNAStringSet #' @importClassesFrom Biostrings RNAStringSet #' @importClassesFrom Biostrings AAStringSet #' @importClassesFrom Biostrings QualityScaledXStringSet #' @importClassesFrom Biostrings XStringQuality #' @importClassesFrom Biostrings PhredQuality #' @importClassesFrom Biostrings SolexaQuality #' @importClassesFrom Biostrings IlluminaQuality #' @importClassesFrom Biostrings QualityScaledBStringSet #' @importClassesFrom Biostrings QualityScaledDNAStringSet #' @importClassesFrom Biostrings QualityScaledRNAStringSet #' @importClassesFrom Biostrings QualityScaledAAStringSet #' @importClassesFrom Biostrings XStringSet #' @keywords internal setClassUnion("XStringSetOrNULL", c("XStringSet", "NULL")) ################################################################################ #' The main experiment-level class for phyloseq data #' #' Contains all currently-supported component data classes: #' \code{\link{otu_table-class}}, #' \code{\link{sample_data-class}}, #' \code{\link{taxonomyTable-class}} (\code{"tax_table"} slot), #' \code{\link[ape]{phylo}}-class (\code{"phy_tree"} slot), #' and the \code{\link[Biostrings]{XStringSet-class}} (\code{"refseq"} slot). #' There are several advantages #' to storing your phylogenetic sequencing experiment as an instance of the #' phyloseq class, not the least of which is that it is easy to return to the #' data later and feel confident that the different data types ``belong'' to #' one another. Furthermore, the \code{\link{phyloseq}} constructor ensures that #' the different data components have compatible indices (e.g. OTUs and samples), #' and performs the necessary trimming automatically when you create your #' ``experiment-level'' object. Downstream analyses are aware of which data #' classes they require -- and where to find them -- often making your #' \code{phyloseq-class} object the only data argument required for analysis and plotting #' functions (although there are many options and parameter arguments available #' to you). #' #' In the case of missing component data, the slots are set to \code{NULL}. As #' soon as a \code{phyloseq-class} object is to be updated with new component #' data (previously missing/\code{NULL} or not), the indices of all components #' are re-checked for compatibility and trimmed if necessary. This is to ensure #' by design that components describe the same taxa/samples, and also that these #' trimming/validity checks do not need to be repeated in downstream analyses. #' #' slots: #' \describe{ #' \item{otu_table}{a single object of class otu_table.} #' \item{sam_data}{ a single object of class sample_data.} #' \item{tax_table}{ a single object of class taxonomyTable.} #' \item{phy_tree}{ a single object of the \code{\link[ape]{phylo}}-class, from the ape package.} #' \item{refseq}{ a biological sequence set object of a class that #' inherits from the \code{\link[Biostrings]{XStringSet-class}}, from the Biostrings package.} #' } #' @seealso #' The constructor, \code{\link{phyloseq}}, #' the merger \code{\link{merge_phyloseq}}, and also the component #' constructor/accessors \code{\link{otu_table}}, \code{\link{sample_data}}, #' \code{\link{tax_table}}, \code{\link{phy_tree}}, and \code{\link{refseq}}. #' #' @import BiocGenerics #' @importClassesFrom Biostrings XStringSet #' @name phyloseq-class #' @rdname phyloseq-class #' @exportClass phyloseq setClass(Class="phyloseq", representation=representation( otu_table="otu_tableOrNULL", tax_table="taxonomyTableOrNULL", sam_data="sample_dataOrNULL", phy_tree="phyloOrNULL", refseq = "XStringSetOrNULL"), prototype=prototype(otu_table=NULL, tax_table=NULL, sam_data=NULL, phy_tree=NULL, refseq=NULL) ) ################################################################################ phyloseq/R/allData.R0000644000175400017540000003416313175714136015351 0ustar00biocbuildbiocbuild################################################################################ #' (Data) Small example dataset from a human esophageal community (2004) #' #' Includes just 3 samples, 1 each from 3 subjects. Although the research article mentions 4 subjects, #' only 3 are included in this dataset. #' #' abstract from research article (quoted): #' #' The esophagus, like other luminal organs of the digestive system, provides a potential environment for bacterial colonization, but little is known about the presence of a bacterial biota or its nature. By using broad-range 16S rDNA PCR, biopsies were examined from the normal esophagus of four human adults. The 900 PCR products cloned represented 833 unique sequences belonging to 41 genera, or 95 species-level operational taxonomic units (SLOTU); 59 SLOTU were homologous with culture-defined bacterial species, 34 with 16S rDNA clones, and two were not homologous with any known bacterial 16S rDNA. Members of six phyla, Firmicutes, Bacteroides, Actinobacteria, Proteobacteria, Fusobacteria, and TM7, were represented. A large majority of clones belong to 13 of the 41 genera (783/900, 87\%), or 14 SLOTU (574/900, 64\%) that were shared by all four persons. Streptococcus (39\%), Prevotella (17\%), and Veilonella (14\%) were most prevalent. The present study identified 56-79\% of SLOTU in this bacterial ecosystem. Most SLOTU of esophageal biota are similar or identical to residents of the upstream oral biota, but the major distinction is that a large majority (82\%) of the esophageal bacteria are known and cultivable. These findings provide evidence for a complex but conserved bacterial population in the normal distal esophagus. #' #' (end quote) #' #' A description of the 16S rRNA sequence processing can be found on the mothur-wiki #' at the link below. A cutoff of 0.10 was used for OTU clustering in that example, #' and it is taken here as well to create example data, \code{esophagus}, which was #' easily imported with the \code{import_mothur()} function. #' #' @references #' Pei, Z., Bini, E. J., Yang, L., Zhou, M., Francois, F., & Blaser, M. J. (2004). #' Bacterial biota in the human distal esophagus. #' Proceedings of the National Academy of Sciences of the United States of America, 101(12), 4250-4255. #' \url{http://www.ncbi.nlm.nih.gov/pmc/articles/PMC384727} #' #' mothur-processed files and the sequence data can be downloaded from a zip-file, #' along with additional description, from the following URL: #' \url{http://www.mothur.org/wiki/Esophageal_community_analysis} #' #' @name data-esophagus #' @aliases esophagus #' @docType data #' @author Pei et al. \email{zhiheng.pei@@med.nyu.edu} #' @keywords data #' @examples #' data(esophagus) #' UniFrac(esophagus, weighted=TRUE) #' # How to re-create the esophagus dataset using import_mothur function #' mothlist <- system.file("extdata", "esophagus.fn.list.gz", package="phyloseq") #' mothgroup <- system.file("extdata", "esophagus.good.groups.gz", package="phyloseq") #' mothtree <- system.file("extdata", "esophagus.tree.gz", package="phyloseq") #' show_mothur_cutoffs(mothlist) #' cutoff <- "0.10" #' esophman <- import_mothur(mothlist, mothgroup, mothtree, cutoff) ################################################################################ NA ################################################################################ #' (Data) Enterotypes of the human gut microbiome (2011) #' #' Published in Nature in early 2011, this work compared (among other things), #' the faecal microbial communities from 22 #' subjects using complete shotgun DNA sequencing. #' Authors further compared these microbial communities with the faecal #' communities of subjects from other studies. A total of 280 faecal samples / subjects #' are represented in this dataset, and 553 genera. The authors claim that the #' data naturally clumps into three community-level clusters, or ``enterotypes'', #' that are not immediately explained by sequencing technology or demographic #' features of the subjects, but with potential relevance to understanding #' human gut microbiota. #' #' abstract from research article (quoted): #' #' Our knowledge of species and functional composition of the human gut microbiome is rapidly increasing, but it is still based on very few cohorts and little is known about variation across the world. By combining 22 newly sequenced faecal metagenomes of individuals from four countries with previously published data sets, here we identify three robust clusters (referred to as enterotypes hereafter) that are not nation or continent specific. We also confirmed the enterotypes in two published, larger cohorts, indicating that intestinal microbiota variation is generally stratified, not continuous. This indicates further the existence of a limited number of well-balanced host-microbial symbiotic states that might respond differently to diet and drug intake. The enterotypes are mostly driven by species composition, but abundant molecular functions are not necessarily provided by abundant species, highlighting the importance of a functional analysis to understand microbial communities. Although individual host properties such as body mass index, age, or gender cannot explain the observed enterotypes, data-driven marker genes or functional modules can be identified for each of these host properties. For example, twelve genes significantly correlate with age and three functional modules with the body mass index, hinting at a diagnostic potential of microbial markers. #' #' (end quote) #' #' @references #' Arumugam, M., et al. (2011). Enterotypes of the human gut microbiome. #' #' Nature, 473(7346), 174-180. #' #' \url{http://www.nature.com/doifinder/10.1038/nature09944} #' See supplemental information for subject data. #' #' OTU-clustered data was downloaded from the publicly-accessible: #' #' \url{http://www.bork.embl.de/Docu/Arumugam_et_al_2011/downloads.html} #' #' @name data-enterotype #' @aliases enterotype #' @docType data #' @author Arumugam, M., Raes, J., et al. #' @keywords data #' @examples #' data(enterotype) #' ig <- make_network(enterotype, "samples", max.dist=0.3) #' plot_network(ig, enterotype, color="SeqTech", shape="Enterotype", line_weight=0.3, label=NULL) ################################################################################ NA ################################################################################ #' (Data) Reproducibility of soil microbiome data (2011) #' #' Published in early 2011, #' this work compared 24 separate soil microbial communities under four treatment #' conditions via multiplexed/barcoded 454-pyrosequencing of PCR-amplified 16S rRNA gene fragments. #' The authors found differences in the composition and structure of microbial #' communities between soil treatments. #' As expected, the soil microbial communities were highly diverse, with a staggering #' 16,825 different OTUs (species) observed in the included dataset. #' Interestingly, this study used a larger number of replicates than previous studies of this type, #' for a total of 56 samples, and the putatively low resampling rate of species #' between replicated sequencing trials (``OTU overlap'') was a major concern by #' the authors. #' #' This dataset contains an experiment-level (\code{\link{phyloseq-class}}) object, #' which in turn contains the taxa-contingency table and soil-treatment table #' as \code{\link{otu_table-class}} and \code{\link{sample_data-class}} components, respectively. #' #' This data was #' imported from raw files supplied directly by the authors via personal communication #' for the purposes of including as an example in the \code{\link{phyloseq-package}}. #' As this data is sensitive to choices in OTU-clustering parameters, attempts to recreate #' the \code{otu_table} from the raw sequencing data may give slightly different results #' than the table provided here. #' #' abstract from research article (quoted): #' #' To determine the reproducibility and quantitation of the amplicon sequencing-based #' detection approach for analyzing microbial community structure, a total of 24 microbial #' communities from a long-term global change experimental site were examined. Genomic DNA #' obtained from each community was used to amplify 16S rRNA genes with two or three #' barcode tags as technical replicates in the presence of a small quantity (0.1\% wt/wt) #' of genomic DNA from Shewanella oneidensis MR-1 as the control. The technical #' reproducibility of the amplicon sequencing-based detection approach is quite low, #' with an average operational taxonomic unit (OTU) overlap of 17.2\%\code{+/-}2.3\% #' between two technical replicates, and 8.2\%\code{+/-}2.3\% among three technical #' replicates, which is most likely due to problems associated with random sampling processes. #' Such variations in technical replicates could have substantial effects on estimating #' beta-diversity but less on alpha-diversity. A high variation was also observed in the #' control across different samples (for example, 66.7-fold for the forward primer), #' suggesting that the amplicon sequencing-based detection approach could not be quantitative. #' In addition, various strategies were examined to improve the comparability of amplicon #' sequencing data, such as increasing biological replicates, and removing singleton sequences #' and less-representative OTUs across biological replicates. Finally, as expected, various #' statistical analyses with preprocessed experimental data revealed clear differences in #' the composition and structure of microbial communities between warming and non-warming, #' or between clipping and non-clipping. Taken together, these results suggest that amplicon #' sequencing-based detection is useful in analyzing microbial community structure even #' though it is not reproducible and quantitative. However, great caution should be taken #' in experimental design and data interpretation when the amplicon sequencing-based detection #' approach is used for quantitative analysis of the beta-diversity of microbial communities. #' #' (end quote) #' #' @references Zhou, J., Wu, L., Deng, Y., Zhi, X., Jiang, Y.-H., Tu, Q., Xie, J., et al. #' Reproducibility and quantitation of amplicon sequencing-based detection. #' The ISME Journal. (2011) 5(8):1303-1313. \code{doi:10.1038/ismej.2011.11} #' #' The article can be accessed online at \url{http://www.nature.com/ismej/journal/v5/n8/full/ismej201111a.html} #' #' @name data-soilrep #' @aliases soilrep #' @docType data #' @author Jizhong Zhou, et al. #' @keywords data #' @examples #' # Load the data #' data(soilrep) #' ################################################################################ #' # Alpha diversity (richness) example. Accept null hypothesis: #' # No convincing difference in species richness between warmed/unwarmed soils. #' ################################################################################ #' # Graphically compare richness between the different treatments. #' man.col <- c(WC="red", WU="brown", UC="blue", UU="darkgreen") #' plot_richness(soilrep, x="Treatment", color="Treatment", measures=c("Observed", "Chao1", "Shannon")) ################################################################################ NA ################################################################################ ################################################################################ #' (Data) Global patterns of 16S rRNA diversity at a depth of millions of sequences per sample (2011) #' #' Published in PNAS in early 2011. This work compared the microbial #' communities from 25 environmental samples and three known ``mock communities'' #' -- a total of 9 sample types -- at a depth averaging 3.1 million reads per sample. #' Authors were able to reproduce diversity patterns seen in many other #' published studies, while also invesitigating technical issues/bias by #' applying the same techniques to simulated microbial communities of known #' composition. #' #' abstract from research article (quoted): #' #' The ongoing revolution in high-throughput sequencing continues to democratize the ability of small groups of investigators to map the microbial component of the biosphere. In particular, the coevolution of new sequencing platforms and new software tools allows data acquisition and analysis on an unprecedented scale. Here we report the next stage in this coevolutionary arms race, using the Illumina GAIIx platform to sequence a diverse array of 25 environmental samples and three known ``mock communities'' at a depth averaging 3.1 million reads per sample. We demonstrate excellent consistency in taxonomic recovery and recapture diversity patterns that were previously reported on the basis of metaanalysis of many studies from the literature (notably, the saline/nonsaline split in environmental samples and the split between host-associated and free-living communities). We also demonstrate that 2,000 Illumina single-end reads are sufficient to recapture the same relationships among samples that we observe with the full dataset. The results thus open up the possibility of conducting large-scale studies analyzing thousands of samples simultaneously to survey microbial communities at an unprecedented spatial and temporal resolution. #' #' (end quote) #' #' Many thanks to J. Gregory Caporaso for directly providing the OTU-clustered data files #' for inclusion in this package. #' #' @references #' Caporaso, J. G., et al. (2011). #' Global patterns of 16S rRNA diversity at a depth of millions of sequences per sample. #' PNAS, 108, 4516-4522. #' PMCID: PMC3063599 #' #' The primary article can be viewed/downloaded at: #' \url{http://www.pnas.org/content/108/suppl.1/4516.short} #' #' @name data-GlobalPatterns #' @aliases GlobalPatterns #' @docType data #' @author Caporaso, J. G., et al. #' @keywords data #' #' @seealso #' The examples on the phyloseq wiki page for \code{\link{plot_ordination}} show #' many more examples: #' #' \url{https://github.com/joey711/phyloseq/wiki/plot_ordination} #' #' @examples #' data(GlobalPatterns) #' plot_richness(GlobalPatterns, x="SampleType", measures=c("Observed", "Chao1", "Shannon")) ################################################################################ NA ################################################################################ phyloseq/R/allPackage.R0000644000175400017540000000267513175714136016036 0ustar00biocbuildbiocbuild############################################### #' Handling and analysis of high-throughput phylogenetic sequence data. #' #' There are already several ecology and phylogenetic packages available in R, #' including the adephylo, vegan, ade4, picante, ape, phangorn, phylobase, and OTUbase packages. #' These can already take advantage of many of the powerful statistical and graphics tools #' available in R. However, prior to \emph{phyloseq} a user must devise their own methods #' for parsing the output of their favorite OTU clustering application, and, as a consequence, #' there is also no standard within Bioconductor (or R generally) for storing or sharing the #' suite of related data objects that describe a phylogenetic sequencing project. #' The phyloseq package seeks to address these issues by providing a related set of S4 classes #' that internally manage the handling tasks associated with organizing, linking, storing, #' and analyzing phylogenetic sequencing data. \emph{phyloseq} additionally provides some #' convenience wrappers for input from common clustering applications, common analysis pipelines, #' and native implementation of methods that are not available in other R packages. #' #' @import methods #' @name phyloseq-package #' @author Paul J. McMurdie II \email{mcmurdie@@stanford.edu} #' @references \url{www.stanford.edu/~mcmurdie} #' @docType package #' @keywords package NA ############################################### phyloseq/R/almostAllAccessors.R0000644000175400017540000004642513175714136017611 0ustar00biocbuildbiocbuild################################################################################ ### Accessor / subset methods. ################################################################################ ################################################################################ #' Retrieve reference sequences (\code{\link[Biostrings]{XStringSet}}-class) from object. #' #' This is the suggested method #' for accessing #' the phylogenetic tree, (\code{\link[Biostrings]{XStringSet}}-class) #' from a phyloseq data object (\code{\link{phyloseq-class}}). #' Like other accessors (see See Also, below), the default behavior of this method #' is to stop with an #' error if \code{physeq} is a \code{phyloseq-class} but does not #' contain reference sequences (the component data type you are trying to access in this case). #' #' @usage refseq(physeq, errorIfNULL=TRUE) #' #' @param physeq (Required). An instance of phyloseq-class #' that contains a phylogenetic tree. If physeq is a phylogenetic #' tree (a component data class), then it is returned as-is. #' #' @param errorIfNULL (Optional). Logical. Should the accessor stop with #' an error if the slot is empty (\code{NULL})? Default \code{TRUE}. #' #' @return The \code{\link[ape]{phylo}}-class object contained within \code{physeq}; #' or NULL if \code{physeq} does not have a tree. #' This method stops with an error in the latter NULL case be default, which #' can be over-ridden by changing the value of \code{errorIfNULL} to \code{FALSE}. #' #' @seealso \code{\link{otu_table}}, \code{\link{sample_data}}, \code{\link{tax_table}} #' \code{\link{phy_tree}}, #' \code{\link{phyloseq}}, \code{\link{merge_phyloseq}} #' #' @export #' @rdname refseq-methods #' @docType methods #' #' @examples #' data(GlobalPatterns) #' refseq(GlobalPatterns, FALSE) setGeneric("refseq", function(physeq, errorIfNULL=TRUE) standardGeneric("refseq")) #' @rdname refseq-methods #' @aliases refseq,ANY-method setMethod("refseq", "ANY", function(physeq, errorIfNULL=TRUE){ access(physeq, "refseq", errorIfNULL) }) # Return as-is if already a "XStringSet" object #' @importClassesFrom Biostrings XStringSet #' @rdname refseq-methods #' @aliases refseq,XStringSet-method setMethod("refseq", "XStringSet", function(physeq){ return(physeq) }) ################################################################################ #' Retrieve phylogenetic tree (\code{\link[ape]{phylo}}-class) from object. #' #' This is the suggested method #' for accessing #' the phylogenetic tree, (\code{\link[ape]{phylo}}-class) from a \code{\link{phyloseq-class}}. #' Like other accessors (see See Also, below), the default behavior of this method #' is to stop with an #' error if \code{physeq} is a \code{phyloseq-class} but does not #' contain a phylogenetic tree (the component data you are trying to access in this case). #' #' Note that the tip labels should be named to match the #' \code{taxa_names} of the other objects to which it is going to be paired. #' The \code{\link{phyloseq}} constructor automatically checks for #' exact agreement in the set of species described by the phlyogenetic tree #' and the other components (taxonomyTable, otu_table), #' and trims as-needed. Thus, the tip.labels in a phylo object #' must be named to match the results of #' \code{\link{taxa_names}} of the other objects to which it will ultimately be paired. #' #' @usage phy_tree(physeq, errorIfNULL=TRUE) #' #' @param physeq (Required). An instance of phyloseq-class #' that contains a phylogenetic tree. If physeq is a phylogenetic #' tree (a component data class), then it is returned as-is. #' #' @param errorIfNULL (Optional). Logical. Should the accessor stop with #' an error if the slot is empty (\code{NULL})? Default \code{TRUE}. #' #' @return The \code{\link[ape]{phylo}}-class object contained within \code{physeq}; #' or NULL if \code{physeq} does not have a tree. #' This method stops with an error in the latter NULL case be default, which #' can be over-ridden by changing the value of \code{errorIfNULL} to \code{FALSE}. #' #' @seealso \code{\link{otu_table}}, \code{\link{sample_data}}, \code{\link{tax_table}} #' \code{\link{refseq}}, #' \code{\link{phyloseq}}, \code{\link{merge_phyloseq}} #' #' @export #' @rdname phy_tree-methods #' @docType methods #' #' @examples #' data(GlobalPatterns) #' phy_tree(GlobalPatterns) setGeneric("phy_tree", function(physeq, errorIfNULL=TRUE) standardGeneric("phy_tree")) #' @rdname phy_tree-methods #' @aliases phy_tree,ANY-method setMethod("phy_tree", "ANY", function(physeq, errorIfNULL=TRUE){ access(physeq, "phy_tree", errorIfNULL) }) # Return as-is if already a "phylo" object #' @rdname phy_tree-methods #' @aliases phy_tree,phylo-method setMethod("phy_tree", "phylo", function(physeq){ return(physeq) }) ################################################################################ #' Access taxa_are_rows slot from otu_table objects. #' #' @usage taxa_are_rows(physeq) #' #' @param physeq (Required). \code{\link{phyloseq-class}}, or \code{\link{otu_table-class}}. #' #' @return A logical indicating the orientation of the otu_table. #' #' @seealso \code{\link{otu_table}} #' @rdname taxa_are_rows-methods #' @docType methods #' @export #' @aliases taxa_are_rows taxa_are_rows setGeneric("taxa_are_rows", function(physeq) standardGeneric("taxa_are_rows")) #' @rdname taxa_are_rows-methods #' @aliases taxa_are_rows,ANY-method setMethod("taxa_are_rows", "ANY", function(physeq){NULL}) #' @rdname taxa_are_rows-methods #' @aliases taxa_are_rows,otu_table-method setMethod("taxa_are_rows", "otu_table", function(physeq){physeq@taxa_are_rows}) #' @rdname taxa_are_rows-methods #' @aliases taxa_are_rows,phyloseq-method setMethod("taxa_are_rows", "phyloseq", function(physeq){ taxa_are_rows(otu_table(physeq)) }) ################################################################################ #' Get the number of taxa/species. #' #' @usage ntaxa(physeq) #' #' @param physeq \code{\link{phyloseq-class}}, \code{\link{otu_table-class}}, #' \code{\link{taxonomyTable-class}}, or #' \code{\link[ape]{phylo}} #' #' @return An integer indicating the number of taxa / species. #' #' @seealso taxa_names #' #' @rdname ntaxa-methods #' @docType methods #' @export #' #' @examples #' data("esophagus") #' ntaxa(esophagus) #' phy_tree(esophagus) #' ntaxa(phy_tree(esophagus)) setGeneric("ntaxa", function(physeq) standardGeneric("ntaxa")) #' @rdname ntaxa-methods #' @aliases ntaxa,ANY-method setMethod("ntaxa", "ANY", function(physeq){ return(NULL) }) #' @rdname ntaxa-methods #' @aliases ntaxa,phyloseq-method setMethod("ntaxa", "phyloseq", function(physeq){ ntaxa(otu_table(physeq)) }) #' @rdname ntaxa-methods #' @aliases ntaxa,otu_table-method setMethod("ntaxa", "otu_table", function(physeq){ if( taxa_are_rows(physeq) ){ return( nrow(physeq) ) } else { return( ncol(physeq) ) } }) #' @rdname ntaxa-methods #' @aliases ntaxa,taxonomyTable-method setMethod("ntaxa", "taxonomyTable", function(physeq){ nrow(physeq) }) #' @rdname ntaxa-methods #' @aliases ntaxa,phylo-method setMethod("ntaxa", "phylo", function(physeq){ length(physeq$tip.label) }) #' @rdname ntaxa-methods #' @aliases ntaxa,XStringSet-method setMethod("ntaxa", "XStringSet", function(physeq){ length(physeq) }) ################################################################################ #' Get species / taxa names. #' #' @usage taxa_names(physeq) #' #' @param physeq \code{\link{phyloseq-class}}, \code{\link{otu_table-class}}, #' \code{\link{taxonomyTable-class}}, or #' \code{\link[ape]{phylo}} #' #' @return A character vector of the names of the species in \code{physeq}. #' #' @seealso ntaxa #' #' @rdname taxa_names-methods #' @docType methods #' @export #' #' @examples # #' data("esophagus") #' tree <- phy_tree(esophagus) #' OTU1 <- otu_table(esophagus) #' taxa_names(tree) #' taxa_names(OTU1) #' physeq1 <- phyloseq(OTU1, tree) #' taxa_names(physeq1) setGeneric("taxa_names", function(physeq) standardGeneric("taxa_names")) #' @rdname taxa_names-methods #' @aliases taxa_names,ANY-method setMethod("taxa_names", "ANY", function(physeq){ return(NULL) }) #' @rdname taxa_names-methods #' @aliases taxa_names,phyloseq-method setMethod("taxa_names", "phyloseq", function(physeq){ taxa_names(otu_table(physeq)) }) #' @rdname taxa_names-methods #' @aliases taxa_names,otu_table-method setMethod("taxa_names", "otu_table", function(physeq){ if( taxa_are_rows(physeq) ){ return( rownames(physeq) ) } else { return( colnames(physeq) ) } }) #' @rdname taxa_names-methods #' @aliases taxa_names,taxonomyTable-method setMethod("taxa_names", "taxonomyTable", function(physeq) rownames(physeq) ) #' @rdname taxa_names-methods #' @aliases taxa_names,sample_data-method setMethod("taxa_names", "sample_data", function(physeq) NULL ) #' @rdname taxa_names-methods #' @aliases taxa_names,phylo-method setMethod("taxa_names", "phylo", function(physeq) physeq$tip.label ) #' @rdname taxa_names-methods #' @aliases taxa_names,XStringSet-method setMethod("taxa_names", "XStringSet", function(physeq) names(physeq) ) ################################################################################ #' Get the number of samples. #' #' @usage nsamples(physeq) #' #' @param physeq A \code{\link{phyloseq-class}}, \code{\link{sample_data}}, #' or \code{\link{otu_table-class}}. #' #' @return An integer indicating the total number of samples. #' #' @seealso \code{\link{taxa_names}}, \code{\link{sample_names}}, #' \code{\link{ntaxa}} #' #' @rdname nsamples-methods #' @docType methods #' @export #' #' @examples # #' data("esophagus") #' tree <- phy_tree(esophagus) #' OTU1 <- otu_table(esophagus) #' nsamples(OTU1) #' physeq1 <- phyloseq(OTU1, tree) #' nsamples(physeq1) setGeneric("nsamples", function(physeq) standardGeneric("nsamples")) #' @rdname nsamples-methods #' @aliases nsamples,ANY-method setMethod("nsamples", "ANY", function(physeq){ return(NULL) }) #' @rdname nsamples-methods #' @aliases nsamples,phyloseq-method setMethod("nsamples", "phyloseq", function(physeq){ # dispatch to core, required component, otu_table nsamples(otu_table(physeq)) }) #' @rdname nsamples-methods #' @aliases nsamples,otu_table-method setMethod("nsamples", "otu_table", function(physeq){ if( taxa_are_rows(physeq) ){ return( ncol(physeq) ) } else { return( nrow(physeq) ) } }) #' @rdname nsamples-methods #' @aliases nsamples,sample_data-method setMethod("nsamples", "sample_data", function(physeq) nrow(physeq) ) ################################################################################ #' Get sample names. #' #' @usage sample_names(physeq) #' #' @param physeq (Required). A \code{\link{phyloseq-class}}, \code{\link{sample_data}}, #' or \code{\link{otu_table-class}}. #' #' @return A character vector. The names of the samples in \code{physeq}. #' #' @seealso \code{\link{taxa_names}}, \code{\link{nsamples}} #' #' @aliases sample_names #' #' @rdname sample_names-methods #' @docType methods #' @export #' #' @examples #' data(esophagus) #' sample_names(esophagus) setGeneric("sample_names", function(physeq) standardGeneric("sample_names")) # Unless otherwise specified, this should return a value of NULL # That way, objects that do not explicitly describe samples all # behave in the same (returning NULL) way. #' @rdname sample_names-methods #' @aliases sample_names,ANY-method setMethod("sample_names", "ANY", function(physeq){ return(NULL) }) #' @rdname sample_names-methods #' @aliases sample_names,phyloseq-method setMethod("sample_names", "phyloseq", function(physeq){ # dispatch to core, required component, otu_table sample_names(otu_table(physeq)) }) #' @rdname sample_names-methods #' @aliases sample_names,sample_data-method setMethod("sample_names", "sample_data", function(physeq) rownames(physeq) ) #' @rdname sample_names-methods #' @aliases sample_names,otu_table-method setMethod("sample_names", "otu_table", function(physeq){ if( taxa_are_rows(physeq) ){ return( colnames(physeq) ) } else { return( rownames(physeq) ) } }) ################################################################################ #' Returns all abundance values for species \code{i}. #' #' This is a simple accessor function for investigating #' a single species-of-interest. #' #' @usage get_sample(physeq, i) #' @param physeq (Required). \code{\link{otu_table-class}}, or \code{\link{phyloseq-class}}. #' @param i (Required). A single taxa/species/OTU ID for which you want #' to know the abundance in each sample. #' #' @return An integer vector of the abundance values for #' each sample in \code{physeq} for species \code{i} #' #' @seealso #' \code{\link{get_taxa}} #' \code{\link{taxa_names}} #' \code{\link{sample_names}} #' #' @rdname get_sample-methods #' @docType methods #' @export #' #' @examples #' data(esophagus) #' taxa_names(esophagus) #' get_sample(esophagus, "59_5_19") setGeneric("get_sample", function(physeq, i) standardGeneric("get_sample")) ################################################################################ #' @aliases get_sample,otu_table-method #' @rdname get_sample-methods setMethod("get_sample", "otu_table", function(physeq, i){ if( taxa_are_rows(physeq) ){ as(physeq, "matrix")[i, ] } else { as(physeq, "matrix")[, i] } }) ################################################################################ #' @aliases get_sample,phyloseq-method #' @rdname get_sample-methods setMethod("get_sample", "phyloseq", function(physeq, i){ get_sample(otu_table(physeq), i) }) ################################################################################ #' Returns all abundance values of sample \code{i}. #' #' This is a simple accessor function for investigating #' a single sample-of-interest. #' #' @usage get_taxa(physeq, i) #' @param physeq (Required). \code{\link{otu_table-class}}, or \code{\link{phyloseq-class}}. #' @param i (Required). A single sample for which you want #' to know the abundance of each species. Can be integer #' for index value, or sample name. #' #' @return An integer vector of the abundance values for #' each species in \code{physeq} for sample \code{i} #' #' @seealso #' \code{\link{get_sample}} #' \code{\link{taxa_names}} #' \code{\link{sample_names}} #' #' @rdname get_taxa-methods #' @docType methods #' @export #' #' @examples #' data(esophagus) #' sample_names(esophagus) #' get_taxa(esophagus, "B") setGeneric("get_taxa", function(physeq, i) standardGeneric("get_taxa")) #' @aliases get_taxa,otu_table-method #' @rdname get_taxa-methods setMethod("get_taxa", "otu_table", function(physeq, i){ if( taxa_are_rows(physeq) ){ as(physeq, "matrix")[, i] } else { as(physeq, "matrix")[i, ] } }) #' @aliases get_taxa,phyloseq-method #' @rdname get_taxa-methods setMethod("get_taxa", "phyloseq", function(physeq, i){ get_taxa(otu_table(physeq), i) }) ################################################################################ #' Retrieve the names of the taxonomic ranks #' #' This is a simple accessor function to make it more convenient to determine #' the taxonomic ranks that are available in a given \code{\link{phyloseq-class}} #' object. #' #' @usage rank_names(physeq, errorIfNULL=TRUE) #' #' @param physeq (Required). #' \code{\link{taxonomyTable-class}}, or \code{\link{phyloseq-class}}. #' #' @param errorIfNULL (Optional). Logical. Should the accessor stop with #' an error if the slot is empty (\code{NULL})? Default \code{TRUE}. #' #' @return Character vector. The names of the available taxonomic ranks. #' #' @seealso #' \code{\link{get_taxa}} #' \code{\link{taxa_names}} #' \code{\link{sample_names}} #' #' @export #' #' @examples #' data(enterotype) #' rank_names(enterotype) rank_names <- function(physeq, errorIfNULL=TRUE){ colnames(tax_table(physeq, errorIfNULL)) } ################################################################################ #' Get a unique vector of the observed taxa at a particular taxonomic rank #' #' This is a simple accessor function to make it more convenient to determine #' the different taxa present for a particular taxonomic rank #' in a given \code{\link{phyloseq-class}} object. #' #' @usage get_taxa_unique(physeq, taxonomic.rank=rank_names(physeq)[1], errorIfNULL=TRUE) #' #' @param physeq (Required). \code{\link{taxonomyTable-class}}, or \code{\link{phyloseq-class}}. #' #' @param taxonomic.rank (Optional). Character. The taxonomic rank to use. Must select #' from the set indicated by \code{get_taxa_unique}. Default is #' to take the first column of the \code{taxonomyTable} component. #' #' @param errorIfNULL (Optional). Logical. Should the accessor stop with #' an error if the slot is empty (\code{NULL})? Default \code{TRUE}. #' #' @return Character vector. Unique vector of the observed taxa #' at a particular taxonomic rank #' #' @seealso #' \code{\link{get_taxa}} #' \code{\link{taxa_names}} #' \code{\link{sample_names}} #' #' @export #' #' @examples #' data(enterotype) #' get_taxa_unique(enterotype) #' data(GlobalPatterns) #' get_taxa_unique(GlobalPatterns, "Family") get_taxa_unique <- function(physeq, taxonomic.rank=rank_names(physeq)[1], errorIfNULL=TRUE){ unique(as(tax_table(physeq, errorIfNULL)[, taxonomic.rank], "character")) } ################################################################################ #' Get the sample variables present in sample_data #' #' This is a simple accessor function to make it more convenient to determine #' the sample variable names of a particular \code{\link{phyloseq-class}} object. #' #' @usage sample_variables(physeq, errorIfNULL=TRUE) #' #' @param physeq (Required). \code{\link{sample_data-class}}, or \code{\link{phyloseq-class}}. #' #' @param errorIfNULL (Optional). Logical. Should the accessor stop with #' an error if the slot is empty (\code{NULL})? Default \code{TRUE}. #' #' @return Character vector. The names of the variables in the sample_data #' data.frame. Essentially the column names. Useful for selecting model #' and graphics parameters that interact with sample_data. #' #' @seealso #' \code{\link{get_taxa}} #' \code{\link{taxa_names}} #' \code{\link{sample_names}} #' #' @export #' #' @examples #' data(enterotype) #' sample_variables(enterotype) sample_variables <- function(physeq, errorIfNULL=TRUE){ colnames(sample_data(physeq, errorIfNULL)) } ################################################################################ #' Get the values for a particular variable in sample_data #' #' This is a simple accessor function for streamlining access #' to values/vectors/factors/etc contained in the sample_data. #' #' @usage get_variable(physeq, varName) #' #' @param physeq (Required). \code{\link{sample_data-class}}, or \code{\link{phyloseq-class}}. #' #' @param varName (Required). Character string of the variable name in \code{sample_data}. #' Use \code{sample_variables(physeq)} for available variables in your object. #' #' @return Data. The clas of the data depends on what the contents of sample_data. #' #' @seealso #' \code{\link{get_taxa}} #' \code{\link{taxa_names}} #' \code{\link{sample_names}} #' #' \code{\link{sample_variables}} #' #' @export #' #' @examples #' # Load the GlobalPatterns dataset into the workspace environment #' data(GlobalPatterns) #' # Look at the different values for SampleType #' get_variable(GlobalPatterns, "SampleType") get_variable <- function(physeq, varName){ if( is.null(sample_data(physeq, FALSE)) ){ stop("Your phyloseq data object does not have a sample-data component\n", "Try ?sample_data for more details.") } return( as(sample_data(physeq), "data.frame")[, varName] ) } ################################################################################ phyloseq/R/as-methods.R0000644000175400017540000000214213175714136016043 0ustar00biocbuildbiocbuild################################################################################ # coercion methods ################################################################################ setAs("phyloseq", "matrix", function(from){ from@.Data }) setAs("phyloseq", "otu_table", function(from){ otu_table(from) }) setAs("phyloseq", "otu_table", function(from){ otu_table(from) }) ################################################################################ setAs("data.frame", "sample_data", function(from){ new("sample_data", from) }) setAs("sample_data", "data.frame", function(from){ data.frame(from) }) setAs("phyloseq", "sample_data", function(from){ sample_data(from) }) ################################################################################ setAs("taxonomyTable", "matrix", function(from){ from@.Data }) setAs("phyloseq", "taxonomyTable", function(from){ tax_table(from) }) ################################################################################ setAs("phyloseq", "phylo", function(from){ phy_tree(from) }) ################################################################################ phyloseq/R/assignment-methods.R0000644000175400017540000003454713175714136017626 0ustar00biocbuildbiocbuild################################################################################ #' Assign a new OTU Table to \code{x} #' #' @usage otu_table(x) <- value #' #' @param x (Required). \code{\link{phyloseq-class}} #' @param value (Required). #' \code{\link{otu_table-class}} #' or #' \code{\link{phyloseq-class}}. #' #' @export #' @docType methods #' @rdname assign-otu_table #' @aliases assign-otu_table #' #' @examples #' # data(GlobalPatterns) #' # # An example of pruning to just the first 100 taxa in GlobalPatterns. #' # ex2a <- prune_taxa(taxa_names(GlobalPatterns)[1:100], GlobalPatterns) #' # # The following 3 lines produces an ex2b that is equal to ex2a #' # ex2b <- GlobalPatterns #' # OTU <- otu_table(GlobalPatterns)[1:100, ] #' # otu_table(ex2b) <- OTU #' # identical(ex2a, ex2b) #' # print(ex2b) #' # # Relace otu_table by implying the component in context. #' # ex2c <- GlobalPatterns #' # otu_table(ex2c) <- ex2b #' # identical(ex2a, ex2c) setGeneric("otu_table<-", function(x, value) standardGeneric("otu_table<-")) #' @rdname assign-otu_table #' @aliases otu_table<-,phyloseq,otu_table-method setMethod("otu_table<-", c("phyloseq", "otu_table"), function(x, value){ phyloseq(value, x@sam_data, x@tax_table, x@phy_tree, x@refseq) }) #' @rdname assign-otu_table #' @aliases otu_table<-,otu_table,otu_table-method setMethod("otu_table<-", c("otu_table", "otu_table"), function(x, value){ value }) #' @rdname assign-otu_table #' @aliases otu_table<-,phyloseq,phyloseq-method setMethod("otu_table<-", c("phyloseq", "phyloseq"), function(x, value){ phyloseq(otu_table(value), x@sam_data, x@tax_table, x@phy_tree, x@refseq) }) ################################################################################ #' Manually change taxa_are_rows through assignment. #' #' The taxa_are_rows slot is a logical indicating the orientation of the #' abundance table contained in object \code{x}. #' #' @usage taxa_are_rows(x) <- value #' #' @param x \code{\link{otu_table-class}} or \code{\link{phyloseq-class}} #' #' @param value A logical of length equal to 1. If \code{length(value) > 1}, #' the additional elements will be ignored. Only the first element is assigned #' to the taxa_are_rows slot. #' #' @export #' @docType methods #' @rdname assign-taxa_are_rows #' @aliases assign-taxa_are_rows taxa_are_rows<- #' #' @examples #' data(esophagus) #' taxa_are_rows(esophagus) #' taxa_are_rows(otu_table(esophagus)) setGeneric("taxa_are_rows<-", function(x, value){ standardGeneric("taxa_are_rows<-") }) #' @rdname assign-taxa_are_rows #' @aliases taxa_are_rows<-,otu_table,logical-method setMethod("taxa_are_rows<-", c("otu_table", "logical"), function(x, value){ x@taxa_are_rows <- value[1] return(x) }) #' @rdname assign-taxa_are_rows #' @aliases taxa_are_rows<-,phyloseq,logical-method setMethod("taxa_are_rows<-", c("phyloseq", "logical"), function(x, value){ taxa_are_rows(otu_table(x)) <- value return(x) }) ################################################################################ #' Assign (new) sample_data to \code{x} #' #' This replaces the current \code{sample_data} component of \code{x} with #' \code{value}, if \code{value} is a \code{\link{sample_data-class}}. However, #' if \code{value} is a \code{data.frame}, then \code{value} is first coerced to #' a \code{\link{sample_data-class}}, and then assigned. Alternatively, if #' \code{value} is \code{\link{phyloseq-class}}, then the #' \code{\link{sample_data}} component will first be accessed from \code{value} #' and then assigned. This makes possible some concise assignment/replacement #' statements when adjusting, modifying, or building subsets of #' experiment-level data. See some examples below. #' #' Internally, this re-builds the \code{\link{phyloseq-class}} object using #' the standard \code{\link{phyloseq}} constructor. Thus, index mismatches #' between sample-describing components will not be allowed, and subsetting #' will occurr automatically such that only the intersection of sample IDs #' are included in any components. This has the added benefit of re-checking #' (internally) for any other issues. #' #' @usage sample_data(x) <- value #' #' @param x (Required). \code{\link{phyloseq-class}}. The object to modify. #' @param value (Required). Either a \code{\link{sample_data-class}}, #' a \code{data.frame} that can be coerced into \code{\link{sample_data-class}}, #' or a \code{\link{phyloseq-class}} that contains a #' suitable \code{sample_data} component to assign to \code{x}. If unsure, #' try \code{\link{sample_data}}\code{(value)}, which should return a #' \code{\link{sample_data-class}} object without error. #' #' @return No return. This is an assignment statement. #' #' @export #' @rdname assign-sample_data #' @aliases assign-sample_data sample_data<- #' @examples #' data(soilrep) #' soilrep #' head(sample_data(soilrep)) #' sample_data(soilrep)$Time <- as.integer(substr(sample_data(soilrep)$Sample, 1, 1)) #' head(sample_data(soilrep)) "sample_data<-" <- function(x, value){ if( !inherits(value, "sample_data") ){ value <- sample_data(value) } phyloseq(x@otu_table, value, x@tax_table, x@phy_tree, x@refseq) } ################################################################################ #' Assign a (new) Taxonomy Table to \code{x} #' #' @usage tax_table(x) <- value #' #' @param x (Required). \code{\link{phyloseq-class}} #' @param value (Required). \code{\link{taxonomyTable-class}}. #' Alternatively, \code{value} can be a \code{\link{phyloseq-class}} that has #' a \code{\link{tax_table}} component, or a \code{\link{matrix-class}} #' that can be coerced to a \code{\link{taxonomyTable-class}} with row indices #' that match at least some of the \code{\link{taxa_names}} of \code{x}. #' #' @export #' @rdname assign-tax_table #' @aliases assign-tax_table tax_table<- #' @examples #' # data(GlobalPatterns) #' # # An example of pruning to just the first 100 taxa in GlobalPatterns. #' # ex2a <- prune_taxa(taxa_names(GlobalPatterns)[1:100], GlobalPatterns) #' # # The following 3 lines produces an ex2b that is equal to ex2a #' # ex2b <- GlobalPatterns #' # TT <- tax_table(GlobalPatterns)[1:100, ] #' # tax_table(ex2b) <- TT #' # identical(ex2a, ex2b) #' # print(ex2b) #' # # 2 examples adding a tax_table component from phyloseq or matrix classes #' # ex2c <- phyloseq(otu_table(ex2b), sample_data(ex2b), phy_tree(ex2b)) #' # tax_table(ex2c) <- ex2b #' # identical(ex2a, ex2c) #' # ex2c <- phyloseq(otu_table(ex2b), sample_data(ex2b), phy_tree(ex2b)) #' # tax_table(ex2c) <- as(tax_table(ex2b), "matrix") #' # identical(ex2a, ex2c) setGeneric("tax_table<-", function(x, value) standardGeneric("tax_table<-")) #' @rdname assign-tax_table #' @aliases tax_table<-,phyloseq,taxonomyTable-method setMethod("tax_table<-", c("phyloseq", "taxonomyTable"), function(x, value){ phyloseq(x@otu_table, x@sam_data, value, x@phy_tree, x@refseq) }) #' @rdname assign-tax_table #' @aliases tax_table<-,phyloseq,ANY-method setMethod("tax_table<-", c("phyloseq", "ANY"), function(x, value){ phyloseq(x@otu_table, x@sam_data, tax_table(value, FALSE), x@phy_tree, x@refseq) }) #' @rdname assign-tax_table #' @aliases tax_table<-,taxonomyTable,taxonomyTable-method setMethod("tax_table<-", c("taxonomyTable", "taxonomyTable"), function(x, value){ # Asign as-is. value }) #' @rdname assign-tax_table #' @aliases tax_table<-,taxonomyTable,ANY-method setMethod("tax_table<-", c("taxonomyTable", "ANY"), function(x, value){ tax_table(value, FALSE) }) ################################################################################ #' Assign a (new) phylogenetic tree to \code{x} #' #' @usage phy_tree(x) <- value #' @param x (Required). \code{\link{phyloseq-class}} #' @param value (Required). \code{\link{phylo-class}}, or \code{\link{phyloseq-class}} #' #' @export #' @docType methods #' @rdname assign-phy_tree #' @aliases assign-phy_tree phy_tree<- #' @examples # #' data("esophagus") #' # An example of pruning to just the first 20 taxa in esophagus #' ex2a <- prune_taxa(taxa_names(esophagus)[1:20], esophagus) #' # The following 3 lines produces an ex2b that is equal to ex2a #' ex2b <- ex2a #' phy_tree(ex2b) <- phy_tree(esophagus) #' identical(ex2a, ex2b) setGeneric("phy_tree<-", function(x, value) standardGeneric("phy_tree<-")) #' @rdname assign-phy_tree #' @aliases phy_tree<-,phyloseq,phylo-method setMethod("phy_tree<-", c("phyloseq", "phylo"), function(x, value){ phyloseq(x@otu_table, x@sam_data, x@tax_table, value, x@refseq) }) #' @rdname assign-phy_tree #' @aliases phy_tree<-,phyloseq,phyloseq-method setMethod("phy_tree<-", c("phyloseq", "phyloseq"), function(x, value){ phyloseq(x@otu_table, x@sam_data, x@tax_table, phy_tree(value), x@refseq) }) ################################################################################ #' Replace OTU identifier names #' #' @usage taxa_names(x) <- value #' #' @param x (Required). An object defined by the \code{\link{phyloseq-package}} #' that describes OTUs in some way. #' @param value (Required). A character vector #' to replace the current \code{\link{taxa_names}}. #' #' @export #' @docType methods #' @rdname assign-taxa_names #' @aliases assign-taxa_names taxa_names<- #' #' @examples #' data("esophagus") #' taxa_names(esophagus) #' # plot_tree(esophagus, label.tips="taxa_names", ladderize="left") #' taxa_names(esophagus) <- paste("OTU-", taxa_names(esophagus), sep="") #' taxa_names(esophagus) #' # plot_tree(esophagus, label.tips="taxa_names", ladderize="left") #' ## non-characters are first coerced to characters. #' taxa_names(esophagus) <- 1:ntaxa(esophagus) #' taxa_names(esophagus) #' # plot_tree(esophagus, label.tips="taxa_names", ladderize="left") #' ## Cannot assign non-unique or differently-lengthed name vectors. Error. #' # taxa_names(esophagus) <- sample(c(TRUE, FALSE), ntaxa(esophagus), TRUE) #' # taxa_names(esophagus) <- sample(taxa_names(esophagus), ntaxa(esophagus)-5, FALSE) setGeneric("taxa_names<-", function(x, value){ if( anyDuplicated(value) ){ stop("taxa_names<-: You are attempting to assign duplicated taxa_names") } standardGeneric("taxa_names<-") }) # Attempt to coerce value to a character vector. Remaining methods will require it. #' @rdname assign-taxa_names #' @aliases taxa_names<-,ANY,ANY-method setMethod("taxa_names<-", c("ANY", "ANY"), function(x, value){ taxa_names(x) <- as(value, "character") return(x) }) # value is now character, but no specific method for first argumet # return x unchanged. #' @rdname assign-taxa_names #' @aliases taxa_names<-,ANY,character-method setMethod("taxa_names<-", c("ANY", "character"), function(x, value){ return(x) }) #' @rdname assign-taxa_names #' @aliases taxa_names<-,otu_table,character-method setMethod("taxa_names<-", c("otu_table", "character"), function(x, value){ if( taxa_are_rows(x) ){ rownames(x) <- value } else { colnames(x) <- value } return(x) }) #' @rdname assign-taxa_names #' @aliases taxa_names<-,taxonomyTable,character-method setMethod("taxa_names<-", c("taxonomyTable", "character"), function(x, value){ rownames(x) <- value return(x) }) #' @rdname assign-taxa_names #' @aliases taxa_names<-,phylo,character-method setMethod("taxa_names<-", c("phylo", "character"), function(x, value){ x$tip.label <- value return(x) }) #' @rdname assign-taxa_names #' @aliases taxa_names<-,XStringSet,character-method setMethod("taxa_names<-", c("XStringSet", "character"), function(x, value){ names(x) <- value return(x) }) #' @rdname assign-taxa_names #' @aliases taxa_names<-,phyloseq,character-method setMethod("taxa_names<-", c("phyloseq", "character"), function(x, value){ # dispatch on components taxa_names(x@otu_table) <- value taxa_names(x@phy_tree) <- value taxa_names(x@tax_table) <- value taxa_names(x@refseq) <- value return(x) }) ################################################################################ ################################################################################ #' Replace OTU identifier names #' #' @usage sample_names(x) <- value #' #' @param x (Required). An object defined by the \code{\link{phyloseq-package}} #' that describes OTUs in some way. #' @param value (Required). A character vector #' to replace the current \code{\link{sample_names}}. #' #' @export #' @docType methods #' @rdname assign-sample_names #' @aliases assign-sample_names sample_names<- #' #' @examples #' data("esophagus") #' sample_names(esophagus) #' # plot_tree(esophagus, color="sample_names", ladderize="left") #' sample_names(esophagus) <- paste("Sa-", sample_names(esophagus), sep="") #' sample_names(esophagus) #' # plot_tree(esophagus, color="sample_names", ladderize="left") #' ## non-characters are first coerced to characters. #' sample_names(esophagus) <- 1:nsamples(esophagus) #' sample_names(esophagus) #' # plot_tree(esophagus, color="sample_names", ladderize="left") #' ## Cannot assign non-unique or differently-lengthed name vectors. Error. #' # sample_names(esophagus) <- sample(c(TRUE, FALSE), nsamples(esophagus), TRUE) #' # sample_names(esophagus) <- sample(sample_names(esophagus), nsamples(esophagus)-1, FALSE) setGeneric("sample_names<-", function(x, value){ if( anyDuplicated(value) ){ stop("sample_names<-: You are attempting to assign duplicated sample_names") } standardGeneric("sample_names<-") }) # Attempt to coerce value to a character vector. Remaining methods will require it. #' @rdname assign-sample_names #' @aliases sample_names<-,ANY,ANY-method setMethod("sample_names<-", c("ANY", "ANY"), function(x, value){ sample_names(x) <- as(value, "character") return(x) }) # value is now character, but no specific method for first argumet # return x unchanged. #' @rdname assign-sample_names #' @aliases sample_names<-,ANY,character-method setMethod("sample_names<-", c("ANY", "character"), function(x, value){ return(x) }) #' @rdname assign-sample_names #' @aliases sample_names<-,otu_table,character-method setMethod("sample_names<-", c("otu_table", "character"), function(x, value){ if( taxa_are_rows(x) ){ colnames(x) <- value } else { rownames(x) <- value } return(x) }) #' @rdname assign-sample_names #' @aliases sample_names<-,sample_data,character-method setMethod("sample_names<-", c("sample_data", "character"), function(x, value){ rownames(x) <- value return(x) }) #' @rdname assign-sample_names #' @aliases sample_names<-,phyloseq,character-method setMethod("sample_names<-", c("phyloseq", "character"), function(x, value){ # dispatch on components sample_names(x@otu_table) <- value sample_names(x@sam_data) <- value return(x) }) ################################################################################phyloseq/R/deprecated_functions.R0000644000175400017540000002224213175714136020172 0ustar00biocbuildbiocbuild################################################################################ #' Depcrecated functions in the phyloseq package. #' #' These will be migrated to \code{"defunct"} status in the next release, #' and removed completely in the release after that. #' These functions are provided for compatibility with older version of #' the phyloseq package. They may eventually be completely #' removed. #' #' @usage deprecated_phyloseq_function(x, value, ...) #' @rdname phyloseq-deprecated #' @name phyloseq-deprecated #' @param x For assignment operators, the object that will undergo a replacement #' (object inside parenthesis). #' @param value For assignment operators, the value to replace with #' (the right side of the assignment). #' @param ... For functions other than assignment operators, #' parameters to be passed to the modern version of the function (see table). #' @docType package #' @export plot_taxa_bar taxaplot taxtab taxTab sampleData samData sam_data speciesSums sampleSums nspecies species.names sampleNames sample.names getSamples getSpecies rank.names getTaxa sample.variables getVariable merge_species otuTable speciesarerows speciesAreRows plot_richness_estimates import_qiime_sampleData filterfunSample genefilterSample prune_species subset_species tipglom taxglom tre show_mothur_list_cutoffs sam_data<- sampleData<- tre<- speciesAreRows<- otuTable<- taxTab<- #' @aliases deprecated_phyloseq_function plot_taxa_bar taxaplot taxtab taxTab sampleData samData sam_data speciesSums sampleSums nspecies species.names sampleNames sample.names getSamples getSpecies rank.names getTaxa sample.variables getVariable merge_species otuTable speciesarerows speciesAreRows plot_richness_estimates import_qiime_sampleData filterfunSample genefilterSample prune_species subset_species tipglom taxglom tre show_mothur_list_cutoffs sam_data<- sampleData<- tre<- speciesAreRows<- otuTable<- taxTab<- #' @details #' \tabular{rl}{ #' \code{plot_taxa_bar} \tab now a synonym for \code{\link{plot_bar}}\cr #' \code{taxaplot} \tab now a synonym for \code{\link{plot_bar}}\cr #' \code{taxtab} \tab now a synonym for \code{\link{tax_table}}\cr #' \code{taxTab} \tab now a synonym for \code{\link{tax_table}}\cr #' \code{sampleData} \tab now a synonym for \code{\link{sample_data}}\cr #' \code{samData} \tab now a synonym for \code{\link{sample_data}}\cr #' \code{sam_data} \tab now a synonym for \code{\link{sample_data}}\cr #' \code{speciesSums} \tab now a synonym for \code{\link{taxa_sums}}\cr #' \code{sampleSums} \tab now a synonym for \code{\link{sample_sums}}\cr #' \code{nspecies} \tab now a synonym for \code{\link{ntaxa}}\cr #' \code{species.names} \tab now a synonym for \code{\link{taxa_names}}\cr #' \code{sampleNames} \tab now a synonym for \code{\link{sample_names}}\cr #' \code{sample.names} \tab now a synonym for \code{\link{sample_names}}\cr #' \code{getSamples} \tab now a synonym for \code{\link{get_sample}}\cr #' \code{getSpecies} \tab now a synonym for \code{\link{get_taxa}}\cr #' \code{rank.names} \tab now a synonym for \code{\link{rank_names}}\cr #' \code{getTaxa} \tab now a synonym for \code{\link{get_taxa_unique}}\cr #' \code{sample.variables} \tab now a synonym for \code{\link{sample_variables}}\cr #' \code{getVariable} \tab now a synonym for \code{\link{get_variable}}\cr #' \code{merge_species} \tab now a synonym for \code{\link{merge_taxa}}\cr #' \code{otuTable} \tab now a synonym for \code{\link{otu_table}}\cr #' \code{speciesarerows} \tab now a synonym for \code{\link{taxa_are_rows}}\cr #' \code{speciesAreRows} \tab now a synonym for \code{\link{taxa_are_rows}}\cr #' \code{plot_richness_estimates} \tab now a synonym for \code{\link{plot_richness}}\cr #' \code{import_qiime_sampleData} \tab now a synonym for \code{\link{import_qiime_sample_data}}\cr #' \code{filterfunSample} \tab now a synonym for \code{\link{filterfun_sample}}\cr #' \code{genefilterSample} \tab now a synonym for \code{\link{genefilter_sample}}\cr #' \code{prune_species} \tab now a synonym for \code{\link{prune_taxa}}\cr #' \code{subset_species} \tab now a synonym for \code{\link{subset_taxa}}\cr #' \code{tipglom} \tab now a synonym for \code{\link{tip_glom}}\cr #' \code{taxglom} \tab now a synonym for \code{\link{tax_glom}}\cr #' \code{tre} \tab now a synonym for \code{\link{phy_tree}}\cr #' \code{show_mothur_list_cutoffs} \tab now a synonym for \code{\link{show_mothur_cutoffs}}\cr #' \code{sam_data<-} \tab now a synonym for \code{\link{sample_data<-}}\cr #' \code{sampleData<-} \tab now a synonym for \code{\link{sample_data<-}}\cr #' \code{tre<-} \tab now a synonym for \code{\link{phy_tree<-}}\cr #' \code{speciesAreRows<-} \tab now a synonym for \code{\link{taxa_are_rows<-}}\cr #' \code{otuTable<-} \tab now a synonym for \code{\link{otu_table<-}}\cr #' \code{taxTab<-} \tab now a synonym for \code{\link{tax_table<-}}\cr #' } #' deprecated_phyloseq_function <- function(x, value, ...){return(NULL)} plot_taxa_bar <- function(...){.Deprecated("plot_bar", package="phyloseq");return(plot_bar(...))} taxaplot <- function(...){.Deprecated("plot_bar", package="phyloseq");return(plot_bar(...))} taxtab <- function(...){.Deprecated("tax_table", package="phyloseq");return(tax_table(...))} taxTab <- function(...){.Deprecated("tax_table", package="phyloseq");return(tax_table(...))} sampleData <- function(...){.Deprecated("sample_data", package="phyloseq");return(sample_data(...))} samData <- function(...){.Deprecated("sample_data", package="phyloseq");return(sample_data(...))} sam_data <- function(...){.Deprecated("sample_data", package="phyloseq");return(sample_data(...))} speciesSums <- function(...){.Deprecated("taxa_sums", package="phyloseq");return(taxa_sums(...))} sampleSums <- function(...){.Deprecated("sample_sums", package="phyloseq");return(sample_sums(...))} nspecies <- function(...){.Deprecated("ntaxa", package="phyloseq");return(ntaxa(...))} species.names <- function(...){.Deprecated("taxa_names", package="phyloseq");return(taxa_names(...))} sampleNames <- function(...){.Deprecated("sample_names", package="phyloseq");return(sample_names(...))} sample.names <- function(...){.Deprecated("sample_names", package="phyloseq");return(sample_names(...))} getSamples <- function(...){.Deprecated("get_sample", package="phyloseq");return(get_sample(...))} getSpecies <- function(...){.Deprecated("get_taxa", package="phyloseq");return(get_taxa(...))} rank.names <- function(...){.Deprecated("rank_names", package="phyloseq");return(rank_names(...))} getTaxa <- function(...){.Deprecated("get_taxa_unique", package="phyloseq");return(get_taxa_unique(...))} sample.variables <- function(...){.Deprecated("sample_variables", package="phyloseq");return(sample_variables(...))} getVariable <- function(...){.Deprecated("get_variable", package="phyloseq");return(get_variable(...))} merge_species <- function(...){.Deprecated("merge_taxa", package="phyloseq");return(merge_taxa(...))} otuTable <- function(...){.Deprecated("otu_table", package="phyloseq");return(otu_table(...))} speciesarerows <- function(...){.Deprecated("taxa_are_rows", package="phyloseq");return(taxa_are_rows(...))} speciesAreRows <- function(...){.Deprecated("taxa_are_rows", package="phyloseq");return(taxa_are_rows(...))} plot_richness_estimates <- function(...){.Deprecated("plot_richness", package="phyloseq");return(plot_richness(...))} import_qiime_sampleData <- function(...){.Deprecated("import_qiime_sample_data", package="phyloseq");return(import_qiime_sample_data(...))} filterfunSample <- function(...){.Deprecated("filterfun_sample", package="phyloseq");return(filterfun_sample(...))} genefilterSample <- function(...){.Deprecated("genefilter_sample", package="phyloseq");return(genefilter_sample(...))} prune_species <- function(...){.Deprecated("prune_taxa", package="phyloseq");return(prune_taxa(...))} subset_species <- function(...){.Deprecated("subset_taxa", package="phyloseq");return(subset_taxa(...))} tipglom <- function(...){.Deprecated("tip_glom", package="phyloseq");return(tip_glom(...))} taxglom <- function(...){.Deprecated("tax_glom", package="phyloseq");return(tax_glom(...))} tre <- function(...){.Deprecated("phy_tree", package="phyloseq");return(phy_tree(...))} show_mothur_list_cutoffs <- function(...){.Deprecated("show_mothur_cutoffs", package="phyloseq");return(show_mothur_cutoffs(...))} originalUniFrac <- function(...){.Deprecated("fastUniFrac", package="phyloseq");return(fastUniFrac(...))} "sam_data<-" <- function(x, value){ .Deprecated("sample_data<-", package="phyloseq") sample_data(x) <- value return(x) } "sampleData<-" <- function(x, value){ .Deprecated("sample_data<-", package="phyloseq") sample_data(x) <- value return(x) } "tre<-" <- function(x, value){ .Deprecated("phy_tree<-", package="phyloseq") phy_tree(x) <- value return(x) } "speciesAreRows<-" <- function(x, value){ .Deprecated("taxa_are_rows<-", package="phyloseq") taxa_are_rows(x) <- value return(x) } "otuTable<-" <- function(x, value){ .Deprecated("otu_table<-", package="phyloseq") otu_table(x) <- value return(x) } "taxTab<-" <- function(x, value){ .Deprecated("tax_table<-", package="phyloseq") tax_table(x) <- value return(x) } ################################################################################ phyloseq/R/distance-methods.R0000644000175400017540000007522613177706002017242 0ustar00biocbuildbiocbuild################################################################################ #' Calculate distance, dissimilarity #' #' Takes a \code{\link{phyloseq-class}} object and method option, and returns #' a \code{\link{dist}}ance object suitable for certain #' ordination methods and other distance-based analyses. #' Only #' sample-wise distances are currently supported (the \code{type} argument), #' but eventually species-wise (OTU-wise) #' distances may be supported as well. #' #' Depending on the \code{method} #' argument, \code{distance()} wraps one of #' \code{\link{UniFrac}}, #' \code{\link{DPCoA}}, #' \code{\link{JSD}}, #' \code{\link[vegan]{vegdist}}, #' \code{\link[vegan]{betadiver}}, #' \code{\link[vegan]{designdist}}, or #' \code{\link{dist}}. #' #' @param physeq (Required). A \code{\link{phyloseq-class}} or #' an \code{\link{otu_table-class}} object. The latter is only appropriate #' for methods that do not require any additional data (one-table). #' For example, the ``wunifrac'' option (\code{\link{UniFrac}}) requires #' \code{\link{phyloseq-class}} that contains both an \code{otu_table} #' and a phylogenetic tree (\code{phylo}). #' #' @param method (Required). A character string. #' Provide one of the currently supported options. #' See \code{\link{distanceMethodList}} for a detailed list #' of the supported options here, #' and links to accompanying documentation. #' #' Note that for the common definition of \code{Jaccard} distance #' using the \code{vegan-package} implementation, #' an additional argument is needed, with the full call having the form: #' \code{distance(physeq, method = "jaccard", binary = TRUE)} #' #' The following methods are implemented explicitly within #' the \code{\link{phyloseq-package}}, #' and accessed by the following \code{method} options: #' #' \describe{ #' \item{\code{"unifrac"}}{Original (unweighted) UniFrac distance, #' \code{\link[phyloseq]{UniFrac}}} #' \item{\code{"wunifrac"}}{weighted-UniFrac distance, \code{\link[phyloseq]{UniFrac}}} #' \item{\code{"dpcoa"}}{ #' sample-wise distance used in #' Double Principle Coordinate Analysis, \code{\link[phyloseq]{DPCoA}}} #' \item{\code{"jsd"}}{Jensen-Shannon Divergence, \code{\link{JSD}}} #' } #' #' Alternatively, you can provide #' a character string that defines a custom distance method, if it has the form #' described in \code{\link{designdist}}. #' #' @param type (Optional). A character string. The type of pairwise comparisons #' being calculated: sample-wise or taxa-wise. The default is #' \code{c("samples")}. #' #' @param ... Additional arguments passed on to the appropriate distance #' function, determined by the \code{method} argument. #' #' @return An object of class ``\code{\link{dist}}'' suitable for certain #' ordination methods and other distance-based analyses. #' #' @seealso #' \code{\link{plot_ordination}}, #' \code{\link{UniFrac}}, #' \code{\link{DPCoA}}, #' \code{\link{JSD}}, #' \code{\link[vegan]{vegdist}}, #' \code{\link[vegan]{betadiver}}, #' \code{\link[vegan]{designdist}}, #' \code{\link{dist}}. #' #' @importFrom vegan betadiver #' @importFrom vegan designdist #' @importFrom vegan vegdist #' @export #' @examples #' data(esophagus) #' distance(esophagus, "uunifrac") # Unweighted UniFrac #' distance(esophagus, "wunifrac") # weighted UniFrac #' distance(esophagus, "jaccard", binary = TRUE) # vegdist jaccard #' distance(esophagus, "gower") # vegdist option "gower" #' distance(esophagus, "g") # designdist method option "g" #' distance(esophagus, "minkowski") # invokes a method from the base dist() function. #' distance(esophagus, "(A+B-2*J)/(A+B)") # designdist custom distance #' distanceMethodList #' help("distance") setGeneric("distance", function(physeq, method, type="samples", ...){ standardGeneric("distance") }) #' @rdname distance setMethod("distance", c("phyloseq", "ANY"), function(physeq, method){ stop("You must specify a `method` argument as a character string. \nIt was missing/NA or not a character string. \nSee `?distanceMethodList`") }) #' @rdname distance setMethod("distance", c("otu_table", "character"), function(physeq, method, type="samples", ...){ OTU = physeq if( method == "jsd" ){ return(JSD(OTU)) } # Hard-coded dispatch according to certain method groups if( method %in% distanceMethodList$vegdist ){ dfun <- "vegdist" } else if( method %in% distanceMethodList$betadiver ){ dfun <- "betadiver" } else if( method %in% distanceMethodList$dist ){ dfun <- "dist" } else { dfun <- "designdist" } # get the extra arguments to pass to functions (this can be empty) extrargs <- list(...) # If necessary (non phyloseq funs), enforce orientation, build function. # disambiguate type argument... Must be "species" for vegan integration... # The following should all work: "OTUs", "OTU", "otus", "Taxas", "site" type <- gsub("(OTU(s)?)|(taxa(s)?)|(Species)", "species", type, ignore.case = TRUE) # The following should all work: "SaMplE", "Samples", "site", "sites" type <- gsub("(Sample(s)?)|(site(s)?)", "samples", type, ignore.case = TRUE) # Test type, and enforce orientation accordingly if( type == "species"){ # For species-distance, species need to be rows (vegan-style) if( !taxa_are_rows(OTU) ){OTU <- t(OTU)} } else if( type == "samples" ){ # For sample-distance, samples need to be rows (vegan-style) if( taxa_are_rows(OTU) ){OTU <- t(OTU)} } else { stop("type argument must be one of \n (1) samples \n or \n (2) species") } OTU <- as(OTU, "matrix") fun.args <- c(list(OTU, method=method), extrargs) return( do.call(dfun, fun.args) ) }) #' @rdname distance setMethod("distance", c("phyloseq", "character"), function(physeq, method, type="samples", ...){ # Only one method at a time. if(length(method) > 1){ stop("`distance` only accepts one method at a time. ", "You provided ", length(method), " methods. ") } if(length(method) < 1 | is.na(method)){ stop("You must specify a `method` argument. \nIt was missing/NA. \nSee `?distanceMethodList`") } # Regular Expression detect/convert unifrac/weighted-UniFrac args method <- gsub("^(u.*)*unifrac$", "unifrac", method, ignore.case = TRUE) method <- gsub("^w.*unifrac$", "wunifrac", method, ignore.case = TRUE) # Distances that require a phyloseq object # because they make use of additional information (e.g. a tree) if( method == "unifrac" ){ return(UniFrac(physeq, ...)) } if( method == "wunifrac" ){ return(UniFrac(physeq, weighted=TRUE, ...)) } if( method == "dpcoa" ){ # Remove diagnol entries from "dist" object returned in `RaoDis` slot. return(as.dist(DPCoA(physeq, ...)$RaoDis, diag=FALSE)) } # Else, dispatch to OTU table method return(distance(otu_table(physeq), method, type, ...)) }) ################################################################################ #' List of distance method keys supported in \code{\link[phyloseq]{distance}} #' #' Distance methods should be specified by exact string match. #' Cannot do partial matching for all options, #' because too many similar options in downstream method dispatch. #' #' @format A list of character vectors. #' Every entry specifies a supported distance method. #' Names in the list indicate which downstream function #' is being utilized for further details. #' Same functions are linked in the itemized list below. #' #' \describe{ #' \item{\code{unifrac}}{\code{\link[phyloseq]{UniFrac}}} #' \item{\code{wunifrac}}{\code{\link[phyloseq]{UniFrac}}} #' \item{\code{dpcoa}}{\code{\link[phyloseq]{DPCoA}}} #' \item{\code{jsd}}{\code{\link{JSD}}} #' \item{\code{manhattan}}{\code{\link[vegan]{vegdist}}} #' \item{\code{euclidean}}{\code{\link[vegan]{vegdist}}} #' \item{\code{canberra}}{\code{\link[vegan]{vegdist}}} #' \item{\code{bray}}{\code{\link[vegan]{vegdist}}} #' \item{\code{kulczynski}}{\code{\link[vegan]{vegdist}}} #' \item{\code{jaccard}}{\code{\link[vegan]{vegdist}}} #' \item{\code{gower}}{\code{\link[vegan]{vegdist}}} #' \item{\code{altGower}}{\code{\link[vegan]{vegdist}}} #' \item{\code{morisita}}{\code{\link[vegan]{vegdist}}} #' \item{\code{horn}}{\code{\link[vegan]{vegdist}}} #' \item{\code{mountford}}{\code{\link[vegan]{vegdist}}} #' \item{\code{raup}}{\code{\link[vegan]{vegdist}}} #' \item{\code{binomial}}{\code{\link[vegan]{vegdist}}} #' \item{\code{chao}}{\code{\link[vegan]{vegdist}}} #' \item{\code{cao}}{\code{\link[vegan]{vegdist}}} #' \item{\code{w}}{\code{\link[vegan]{betadiver}}} #' \item{\code{-}}{\code{\link[vegan]{betadiver}}} #' \item{\code{c}}{\code{\link[vegan]{betadiver}}} #' \item{\code{wb}}{\code{\link[vegan]{betadiver}}} #' \item{\code{r}}{\code{\link[vegan]{betadiver}}} #' \item{\code{I}}{\code{\link[vegan]{betadiver}}} #' \item{\code{e}}{\code{\link[vegan]{betadiver}}} #' \item{\code{t}}{\code{\link[vegan]{betadiver}}} #' \item{\code{me}}{\code{\link[vegan]{betadiver}}} #' \item{\code{j}}{\code{\link[vegan]{betadiver}}} #' \item{\code{sor}}{\code{\link[vegan]{betadiver}}} #' \item{\code{m}}{\code{\link[vegan]{betadiver}}} #' \item{\code{-}}{\code{\link[vegan]{betadiver}}} #' \item{\code{co}}{\code{\link[vegan]{betadiver}}} #' \item{\code{cc}}{\code{\link[vegan]{betadiver}}} #' \item{\code{g}}{\code{\link[vegan]{betadiver}}} #' \item{\code{-}}{\code{\link[vegan]{betadiver}}} #' \item{\code{l}}{\code{\link[vegan]{betadiver}}} #' \item{\code{hk}}{\code{\link[vegan]{betadiver}}} #' \item{\code{rlb}}{\code{\link[vegan]{betadiver}}} #' \item{\code{sim}}{\code{\link[vegan]{betadiver}}} #' \item{\code{gl}}{\code{\link[vegan]{betadiver}}} #' \item{\code{z}}{\code{\link[vegan]{betadiver}}} #' \item{\code{maximum}}{\code{\link[stats]{dist}}} #' \item{\code{binary}}{\code{\link[stats]{dist}}} #' \item{\code{minkowski}}{\code{\link[stats]{dist}}} #' \item{\code{ANY}}{\code{\link[vegan]{designdist}}} #' } #' #' @seealso #' \code{\link[phyloseq]{distance}} #' #' @export #' #' @examples #' distanceMethodList distanceMethodList <- list( UniFrac = c("unifrac", "wunifrac"), DPCoA = "dpcoa", JSD = "jsd", # The methods supported by vegan::vegdist function. vegdist = c("manhattan", "euclidean", "canberra", "bray", "kulczynski", "jaccard", "gower", "altGower", "morisita", "horn", "mountford", "raup" , "binomial", "chao", "cao"), # The methods supported by vegan::betadiver function. betadiver = c("w", "-1", "c", "wb", "r", "I", "e", "t", "me", "j", "sor", "m", "-2", "co", "cc", "g", "-3", "l", "19", "hk", "rlb", "sim", "gl", "z"), dist = c("maximum", "binary", "minkowski"), designdist = "ANY" ) ################################################################################ # Shannon-Jensen Divergence, in R. ################################################################################ #' @keywords internal phyloseq_JSD_pair <- function(x, y){ # Function to compute Shannon-Jensen Divergence # x and y are the frequencies for the same p categories # Assumes relative abundance transformation already happened (for efficiency) # Define the mean point m <- (x+y)/2 # Define each samples component P1 <- x*log(x/m) P2 <- y*log(y/m) # In the case of zeroes entries log is undefined, JSD is defined as zero P1[!is.finite(P1)] <- 0 P2[!is.finite(P2)] <- 0 d <- (P1+P2)/2 return(sum(d, na.rm = TRUE)) } ################################################################################ #' Calculate the Jensen-Shannon Divergence (distance) #' #' This is a phyloseq-specific implementation of the Jensen-Shannon Divergence #' for comparing pairs of microbial communities (samples) in an experiment. #' The expectation is that you have many samples (say. more than two) and you #' want a distance matrix on which will perform further analysis. \code{JSD} is #' intended to be ``wrapped'' by the more general \code{\link{distance}} #' function in phyloseq, and it can be invoked using \code{"jsd"} as the #' argument to the \code{method} parameter of \code{\link{distance}}. #' #' One of the motivations for providing JSD in phyloseq was its recent use in #' the analysis of the \code{\link{enterotype}} dataset. #' #' @param physeq (Required). \code{\link{phyloseq-class}}. #' The phyloseq data on which to compute the #' pairwise sample distance matrix. #' #' @return An object of class ``\code{\link{dist}}'' suitable for certain #' ordination methods and other distance-based analyses. #' See \code{\link{distance}}. #' #' @seealso #' \code{\link{distance}} #' #' \code{\link{enterotype}} #' #' \url{http://en.wikipedia.org/wiki/Jensen-Shannon_divergence} #' #' @references #' Jensen-Shannon Divergence and Hilbert space embedding. #' Bent Fuglede and Flemming Topsoe University of Copenhagen, #' Department of Mathematics #' \url{http://www.math.ku.dk/~topsoe/ISIT2004JSD.pdf} #' #' @author #' Susan Holmes \email{susan@@stat.stanford.edu}. #' Adapted for phyloseq by Paul J. McMurdie. #' #' @keywords internal #' @examples #' # library(doParallel) # Do this and next line only if you have multi-cores #' # registerDoParallel(cores=6) #' # data(enterotype) #' # # ent.jsd <- JSD(enterotype, TRUE) # internal only #' # ent.jsd <- distance(enterotype, "jsd", parallel=TRUE) #' # ent.PCoA <- ordinate(enterotype, "PCoA", ent.jsd) # Perform principle coordinate analysis #' # p <- plot_ordination(enterotype, ent.PCoA, color="Enterotype", shape="SeqTech") #' # (p <- p + geom_point(size=5, alpha=0.5)) setGeneric("JSD", function(physeq){ standardGeneric("JSD") }) setMethod("JSD", "ANY", function(physeq){ stop("JSD requires specific input classes. Check call and try again") }) setMethod("JSD", "phyloseq", function(physeq){ JSD(otu_table(physeq)) }) setMethod("JSD", "otu_table", function(physeq){ # Coerce to species-as-columns if(taxa_are_rows(physeq)){ physeq <- t(physeq) } # Coerce physeq to matrix and pass on return(JSD(as(physeq, "matrix"))) }) # Assumes samples are rows setMethod("JSD", "matrix", function(physeq){ # Coerce to relative abundance by sample (row) physeq <- sweep(physeq, 1, rowSums(physeq), "/") # Parallelization not needed for this. # Fix at sequential (eventually update code to remove parallelization complexity) registerDoSEQ() # create N x 2 matrix of all pairwise combinations of samples. spn <- combn(row.names(physeq), 2, simplify=FALSE) # initialize DistMat with NAs DistMat <- matrix(NA, nrow(physeq), nrow(physeq)) # define the rows/cols of DistMat with the sample names (rownames) rownames(DistMat) <- row.names(physeq) colnames(DistMat) <- row.names(physeq) # optionally-parallel implementation with foreach distlist <- foreach( i = spn, .packages="phyloseq") %dopar% { A <- i[1] B <- i[2] return( phyloseq_JSD_pair(physeq[A, ], physeq[B, ]) ) } # return(distlist) # This is in serial, but it is quick. distlist2distmat <- function(i, spn, DL){ DistMat[ spn[[i]][2], spn[[i]][1] ] <<- DL[[i]] } junk <- sapply(1:length(spn), distlist2distmat, spn, distlist) return(as.dist(DistMat)) }) ############################################################################## #' Calculate weighted or unweighted (Fast) UniFrac distance for all sample pairs. #' #' This function calculates the (Fast) UniFrac distance for all sample-pairs #' in a \code{\link{phyloseq-class}} object. #' #' \code{UniFrac()} accesses the abundance #' (\code{\link{otu_table-class}}) and a phylogenetic tree (\code{\link{phylo-class}}) #' data within an experiment-level (\code{\link{phyloseq-class}}) object. #' If the tree and contingency table are separate objects, suggested solution #' is to combine them into an experiment-level class #' using the \code{\link{phyloseq}} function. For example, the following code #' #' \code{phyloseq(myotu_table, myTree)} #' #' returns a \code{phyloseq}-class object that has been pruned and comprises #' the minimum arguments necessary for \code{UniFrac()}. #' #' Parallelization is possible for UniFrac calculated with the \code{\link{phyloseq-package}}, #' and is encouraged in the instances of large trees, many samples, or both. #' Parallelization has been implemented via the \code{\link{foreach-package}}. #' This means that parallel calls need to be preceded by 2 or more commands #' that register the parallel ``backend''. This is acheived via your choice of #' helper packages. One of the simplest seems to be the \emph{doParallel} package. #' #' For more information, see the following links on registering the ``backend'': #' #' \emph{foreach} package manual: #' #' \url{http://cran.r-project.org/web/packages/foreach/index.html} #' #' Notes on parallel computing in \code{R}. Skip to the section describing #' the \emph{foreach Framework}. It gives off-the-shelf examples for registering #' a parallel backend using the \emph{doMC}, \emph{doSNOW}, or \emph{doMPI} packages: #' #' \url{http://trg.apbionet.org/euasiagrid/docs/parallelR.notes.pdf} #' #' Furthermore, as of \code{R} version \code{2.14.0} and higher, a parallel package #' is included as part of the core installation, \code{\link{parallel-package}}, #' and this can be used as the parallel backend with the \code{\link{foreach-package}} #' using the adaptor package ``doParallel''. #' \url{http://cran.r-project.org/web/packages/doParallel/index.html} #' #' See the vignette for some simple examples for using doParallel. #' \url{http://cran.r-project.org/web/packages/doParallel/vignettes/gettingstartedParallel.pdf} #' #' UniFrac-specific examples for doParallel are provided in the example #' code below. #' #' @usage UniFrac(physeq, weighted=FALSE, normalized=TRUE, parallel=FALSE, fast=TRUE) #' #' @param physeq (Required). \code{\link{phyloseq-class}}, containing at minimum #' a phylogenetic tree (\code{\link{phylo-class}}) and #' contingency table (\code{\link{otu_table-class}}). See #' examples below for coercions that might be necessary. #' #' @param weighted (Optional). Logical. Should use weighted-UniFrac calculation? #' Weighted-UniFrac takes into account the relative abundance of species/taxa #' shared between samples, whereas unweighted-UniFrac only considers #' presence/absence. Default is \code{FALSE}, meaning the unweighted-UniFrac #' distance is calculated for all pairs of samples. #' #' @param normalized (Optional). Logical. Should the output be normalized such that values #' range from 0 to 1 independent of branch length values? Default is \code{TRUE}. #' Note that (unweighted) \code{UniFrac} is always normalized by total branch-length, #' and so this value is ignored when \code{weighted == FALSE}. #' #' @param parallel (Optional). Logical. Should execute calculation in parallel, #' using multiple CPU cores simultaneously? This can dramatically hasten the #' computation time for this function. However, it also requires that the user #' has registered a parallel ``backend'' prior to calling this function. #' Default is \code{FALSE}. If FALSE, UniFrac will register a serial backend #' so that \code{foreach::\%dopar\%} does not throw a warning. #' #' @param fast (Optional). Logical. DEPRECATED. #' Do you want to use the ``Fast UniFrac'' #' algorithm? Implemented natively in the \code{phyloseq-package}. #' \code{TRUE} is now the only supported option. #' There should be no difference in the output between the two algorithms. #' Moreover, the original UniFrac algorithm #' only outperforms this implementation of fast-UniFrac if the datasets are so #' small #' (approximated by the value of \code{ntaxa(physeq) * nsamples(physeq)}) #' that the difference in time is inconsequential (less than 1 second). #' In practice it does not appear that this parameter should #' have ever been set to \code{FALSE}, and therefore #' the original UniFrac implementation perhaps never should have been supported here. #' For legacy code support the option is now deprecated here #' (the implementation was an internal function, anyway) #' and the \code{fast} option will remain for one release cycle before #' being removed completely #' in order to avoid causing unsupported-argument errors. #' #' @return a sample-by-sample distance matrix, suitable for NMDS, etc. #' #' @seealso #' #' \code{\link{distance}} #' #' \code{unifrac} in the picante package. #' #' @references #' #' \url{http://bmf.colorado.edu/unifrac/} #' #' The main implementation (Fast UniFrac) is adapted from the algorithm's #' description in: #' #' Hamady, Lozupone, and Knight, #' ``\href{http://www.nature.com/ismej/journal/v4/n1/full/ismej200997a.html}{Fast UniFrac:} #' facilitating high-throughput phylogenetic analyses of #' microbial communities including analysis of pyrosequencing and PhyloChip data.'' #' The ISME Journal (2010) 4, 17--27. #' #' See also additional descriptions of UniFrac in the following articles: #' #' Lozupone, Hamady and Knight, ``UniFrac - An Online Tool for Comparing Microbial #' Community Diversity in a Phylogenetic Context.'', BMC Bioinformatics 2006, 7:371 #' #' Lozupone, Hamady, Kelley and Knight, ``Quantitative and qualitative (beta) #' diversity measures lead to different insights into factors that structure #' microbial communities.'' Appl Environ Microbiol. 2007 #' #' Lozupone C, Knight R. ``UniFrac: a new phylogenetic method for comparing microbial #' communities.'' Appl Environ Microbiol. 2005 71 (12):8228-35. #' #' @docType methods #' @export #' @import foreach #' @rdname UniFrac-methods #' @examples #' ################################################################################ #' # Perform UniFrac on esophagus data #' ################################################################################ #' data("esophagus") #' (y <- UniFrac(esophagus, TRUE)) #' UniFrac(esophagus, TRUE, FALSE) #' UniFrac(esophagus, FALSE) #' # ################################################################################ #' # # Now try a parallel implementation using doParallel, which leverages the #' # # new 'parallel' core package in R 2.14.0+ #' # # Note that simply loading the 'doParallel' package is not enough, you must #' # # call a function that registers the backend. In general, this is pretty easy #' # # with the 'doParallel package' (or one of the alternative 'do*' packages) #' # # #' # # Also note that the esophagus example has only 3 samples, and a relatively small #' # # tree. This is fast to calculate even sequentially and does not warrant #' # # parallelized computation, but provides a good quick example for using UniFrac() #' # # in a parallel fashion. The number of cores you should specify during the #' # # backend registration, using registerDoParallel(), depends on your system and #' # # needs. 3 is chosen here for convenience. If your system has only 2 cores, this #' # # will probably fault or run slower than necessary. #' # ################################################################################ #' # library(doParallel) #' # data(esophagus) #' # # For SNOW-like functionality (works on Windows): #' # cl <- makeCluster(3) #' # registerDoParallel(cl) #' # UniFrac(esophagus, TRUE) #' # # Force to sequential backed: #' # registerDoSEQ() #' # # For multicore-like functionality (will probably not work on windows), #' # # register the backend like this: #' # registerDoParallel(cores=3) #' # UniFrac(esophagus, TRUE) #' ################################################################################ setGeneric("UniFrac", function(physeq, weighted=FALSE, normalized=TRUE, parallel=FALSE, fast=TRUE){ standardGeneric("UniFrac") }) ################################################################################ #' @aliases UniFrac,phyloseq-method #' @rdname UniFrac-methods #' @importFrom ape is.rooted #' @importFrom ape root setMethod("UniFrac", "phyloseq", function(physeq, weighted=FALSE, normalized=TRUE, parallel=FALSE, fast=TRUE){ if(is.null(phy_tree(physeq)$edge.length)){ stop("Tree has no branch lengths. See tree$edge.length. Cannot compute UniFrac without branch lengths") } # Check if tree is rooted, set random root with warning if it is not. if( !is.rooted(phy_tree(physeq)) ){ randoroot = sample(taxa_names(physeq), 1) warning("Randomly assigning root as -- ", randoroot, " -- in the phylogenetic tree in the data you provided.") phy_tree(physeq) <- root(phy=phy_tree(physeq), outgroup=randoroot, resolve.root=TRUE, interactive=FALSE) if( !is.rooted(phy_tree(physeq)) ){ stop("Problem automatically rooting tree. Make sure your tree is rooted before attempting UniFrac calculation. See ?ape::root") } } if( fast ){ fastUniFrac(physeq, weighted, normalized, parallel) } else { warning("Option `fast=FALSE` is deprecated. Only 'fast' UniFrac is supported in phyloseq.") fastUniFrac(physeq, weighted, normalized, parallel) } }) ################################################################################ # Fast UniFrac for R. # Adapted from The ISME Journal (2010) 4, 17-27; doi:10.1038/ismej.2009.97; # http://www.nature.com/ismej/journal/v4/n1/full/ismej200997a.html ################################################################################ #' @importFrom ape prop.part #' @importFrom ape reorder.phylo #' @importFrom ape node.depth #' @importFrom ape node.depth.edgelength #' @keywords internal #' @import foreach fastUniFrac <- function(physeq, weighted=FALSE, normalized=TRUE, parallel=FALSE){ # Access the needed components. Note, will error if missing in physeq. OTU <- otu_table(physeq) tree <- phy_tree(physeq) # Some important checks. if( is.null(tree$edge.length) ) { stop("Tree has no branch lengths, cannot compute UniFrac") } if( !is.rooted(tree) ) { stop("Rooted phylogeny required for UniFrac calculation") } ### Some parallel-foreach housekeeping. # If user specifies not-parallel run (the default), register the sequential "back-end" if( !parallel ){ registerDoSEQ() } # create N x 2 matrix of all pairwise combinations of samples. spn <- combn(sample_names(physeq), 2, simplify=FALSE) # Make sure OTU is in species-are-rows orientation if( !taxa_are_rows(physeq) ){OTU <- t(OTU)} # Convert to standard matrix OTU <- as(OTU, "matrix") # Enforce that tree and otu_table indices are the same order, # by re-ordering OTU, if needed if( !all(rownames(OTU) == taxa_names(tree)) ){ OTU <- OTU[taxa_names(tree), ] } ######################################## # Build the requisite matrices as defined # in the Fast UniFrac article. ######################################## ## This only needs to happen once in a call to UniFrac. ## Notice that A and B do not appear in this section. # Begin by building the edge descendants matrix (edge-by-sample) # `edge_array` # # Create a list of descendants, starting from the first internal node (root) ntip <- length(tree$tip.label) if(ntip != ntaxa(physeq)) stop("Incompatible tree and OTU table!") # Create a matrix that maps each internal node to its 2 descendants # This matrix doesn't include the tips, so must use node#-ntip to index into it node.desc <- matrix(tree$edge[order(tree$edge[,1]),][,2],byrow=TRUE,ncol=2) # Define the edge_array object # Right now this is a node_array object, each row is a node (including tips) # It will be subset and ordered to match tree$edge later edge_array <- matrix(0, nrow=ntip+tree$Nnode, ncol=nsamples(physeq), dimnames=list(NULL, sample_names=sample_names(physeq))) # Load the tip counts in directly edge_array[1:ntip,] <- OTU # Get a list of internal nodes ordered by increasing depth ord.node <- order(node.depth(tree))[(ntip+1):(ntip+tree$Nnode)] # Loop over internal nodes, summing their descendants to get that nodes count for(i in ord.node){ edge_array[i,] <- colSums(edge_array[node.desc[i-ntip,], , drop=FALSE], na.rm = TRUE) } # Keep only those with a parental edge (drops root) and order to match tree$edge edge_array <- edge_array[tree$edge[,2],] # Remove unneeded variables. rm(node.desc) # If unweighted-UniFrac, coerce to a presence-absence contingency, occ if(!weighted){ # For unweighted UniFrac, convert the edge_array to an occurrence (presence/absence binary) array edge_occ <- (edge_array > 0) - 0 } if( weighted & normalized ){ # This is only relevant to weighted-UniFrac. # For denominator in the normalized distance, we need the age of each tip. # 'z' is the tree in postorder order used in calls to .C # Descending order of left-hand side of edge (the ancestor to the node) z = reorder.phylo(tree, order="postorder") # Call phyloseq-internal function that in-turn calls ape's internal # horizontal position function, in C, using the re-ordered phylo object, `z` tipAges = node.depth.edgelength(tree) # Keep only the tips, and add the tip labels in case `z` order differs from `tree` tipAges <- tipAges[1:length(tree$tip.label)] names(tipAges) <- z$tip.label # Explicitly re-order tipAges to match OTU tipAges <- tipAges[rownames(OTU)] } ######################################## # optionally-parallel implementation with foreach ######################################## samplesums = sample_sums(physeq) distlist <- foreach( i = spn, .packages="phyloseq") %dopar% { A <- i[1] B <- i[2] AT <- samplesums[A] BT <- samplesums[B] if( weighted ){ # weighted UniFrac wUF_branchweight <- abs(edge_array[, A]/AT - edge_array[, B]/BT) # calculate the w-UF numerator numerator <- sum({tree$edge.length * wUF_branchweight}, na.rm = TRUE) # if not-normalized weighted UniFrac, just return "numerator"; # the u-value in the w-UniFrac description if(!normalized){ return(numerator) } else { # denominator (assumes tree-indices and otu_table indices are same order) denominator <- sum({tipAges * (OTU[, A]/AT + OTU[, B]/BT)}, na.rm = TRUE) # return the normalized weighted UniFrac values return(numerator / denominator) } } else { # Unweighted UniFrac # Subset matrix to just columns A and B edge_occ_AB <- edge_occ[, c(A, B)] # Keep only the unique branches. Sum the lengths edge_uni_AB_sum <- sum((tree$edge.length * edge_occ_AB)[rowSums(edge_occ_AB, na.rm=TRUE) < 2, ], na.rm=TRUE) # Normalize this sum to the total branches among these two samples, A and B uwUFpairdist <- edge_uni_AB_sum / sum(tree$edge.length[rowSums(edge_occ_AB, na.rm=TRUE) > 0]) return(uwUFpairdist) } } # Initialize UniFracMat with NAs UniFracMat <- matrix(NA_real_, nsamples(physeq), nsamples(physeq)) rownames(UniFracMat) <- colnames(UniFracMat) <- sample_names(physeq) # Matrix-assign lower-triangle of UniFracMat. Then coerce to dist and return. matIndices <- do.call(rbind, spn)[, 2:1] # Take care of edge case where there are two samples -> 1 pair of indices -> rbind doesn't return a matrix if(!is.matrix(matIndices)) matIndices <- matrix(matIndices, ncol=2) UniFracMat[matIndices] <- unlist(distlist) return(as.dist(UniFracMat)) } ################################################################################ phyloseq/R/extend_DESeq2.R0000644000175400017540000000604613175714136016400 0ustar00biocbuildbiocbuild################################################################################ #' Convert phyloseq data to DESeq2 dds object #' #' No testing is performed by this function. The phyloseq data is converted #' to the relevant \code{\link[DESeq2]{DESeqDataSet}} object, which can then be #' tested in the negative binomial generalized linear model framework #' of the \code{\link[DESeq2]{DESeq}} function in DESeq2 package. #' See the #' \href{http://joey711.github.io/phyloseq-extensions}{phyloseq-extensions} #' tutorials for more details. #' #' @param physeq (Required). \code{\link{phyloseq-class}}. #' Must have a \code{\link{sample_data}} component. #' #' @param design (Required). A \code{\link{formula}} which specifies the design of the experiment, #' taking the form \code{formula(~ x + y + z)}. That is, a formula with right-hand side only. #' By default, the functions in this package and DESeq2 #' will use the last variable in the formula (e.g. \code{z}) #' for presenting results (fold changes, etc.) and plotting. #' When considering your specification of experimental design, you will want to #' re-order the levels so that the \code{NULL} set is first. #' For example, the following line of code would ensure that Enterotype 1 is used as the #' reference sample class in tests by setting it to the first of the factor levels #' using the \code{\link{relevel}} function: #' #' \code{sample_data(entill)$Enterotype <- relevel(sample_data(entill)$Enterotype, "1")} #' #' @param ... (Optional). Additional named arguments passed to \code{\link[DESeq2]{DESeqDataSetFromMatrix}}. #' Most users will not need to pass any additional arguments here. #' Most testing-related options should be provided in #' a following call to \code{\link[DESeq2]{DESeq}}. #' #' @return A \code{\link[DESeq2]{DESeqDataSet}} object. #' #' @seealso #' #' \code{vignette("phyloseq-mixture-models")} #' #' The #' \href{http://joey711.github.io/phyloseq-extensions}{phyloseq-extensions} #' tutorials. #' #' \code{\link[DESeq2]{DESeq}} #' #' \code{\link[DESeq2]{results}} #' #' \code{\link[DESeq2]{DESeqDataSetFromMatrix}} #' #' @export #' #' @examples #' # Check out the vignette phyloseq-mixture-models for more details. #' # vignette("phyloseq-mixture-models") #' data(soilrep) #' phyloseq_to_deseq2(soilrep, ~warmed) phyloseq_to_deseq2 = function(physeq, design, ...){ # Need to add check here for missing sample_data if( is.null(sample_data(physeq, FALSE)) ){ stop("There must be sample_data present, for specifying experimental design. See ?phyloseq_to_deseq2") } # Enforce orientation. Samples are columns if( !taxa_are_rows(physeq) ){ physeq <- t(physeq)} # Coerce count data to vanilla matrix of integers countData = round(as(otu_table(physeq), "matrix"), digits=0) colData = data.frame(sample_data(physeq)) # Create the DESeq data set, dds. if(requireNamespace("DESeq2")){ dds <- DESeq2::DESeqDataSetFromMatrix(countData, colData, design, ...) return(dds) } } ################################################################################ phyloseq/R/extend_metagenomeSeq.R0000644000175400017540000000511513175714136020143 0ustar00biocbuildbiocbuild################################################################################ #' Convert phyloseq data to MetagenomeSeq MRexperiment object #' #' No testing is performed by this function. The phyloseq data is converted #' to the relevant \code{\link[metagenomeSeq]{MRexperiment-class}} object, which can then be #' tested in the zero-inflated mixture model framework #' (e.g. \code{\link[metagenomeSeq]{fitZig}}) #' in the metagenomeSeq package. #' See the #' \href{http://joey711.github.io/phyloseq-extensions}{phyloseq-extensions} #' tutorials for more details. #' #' @param physeq (Required). \code{\link{phyloseq-class}}. #' @param ... (Optional). Additional named arguments passed #' to \code{\link[metagenomeSeq]{newMRexperiment}}. #' Most users will not need to pass any additional arguments here. #' #' @return A \code{\link[metagenomeSeq]{MRexperiment-class}} object. #' #' @seealso #' #' \code{\link[metagenomeSeq]{fitTimeSeries}} #' \code{\link[metagenomeSeq]{fitLogNormal}} #' \code{\link[metagenomeSeq]{fitZig}} #' \code{\link[metagenomeSeq]{MRtable}} #' \code{\link[metagenomeSeq]{MRfulltable}} #' #' @export #' @importFrom Biobase AnnotatedDataFrame #' #' @examples #' # Check out the vignette metagenomeSeq for more details. #' # vignette("metagenomeSeq") #' data(soilrep) #' phyloseq_to_metagenomeSeq(soilrep) phyloseq_to_metagenomeSeq = function(physeq, ...){ # Enforce orientation. Samples are columns if( !taxa_are_rows(physeq) ){ physeq <- t(physeq)} # Coerce count data to vanilla matrix of integers countData = round(as(otu_table(physeq), "matrix"), digits=0) # Create sample annotation if possible if(!is.null(sample_data(physeq,FALSE))){ ADF = AnnotatedDataFrame(data.frame(sample_data(physeq))) } else { ADF = NULL } # Create taxa annotation if possible if(!is.null(tax_table(physeq,FALSE))){ TDF = AnnotatedDataFrame(data.frame(OTUname = taxa_names(physeq), data.frame(tax_table(physeq)),row.names = taxa_names(physeq))) } else { TDF = AnnotatedDataFrame(data.frame(OTUname = taxa_names(physeq), row.names = taxa_names(physeq))) } # Create MRexperiment if(requireNamespace("metagenomeSeq")){ mrobj = metagenomeSeq::newMRexperiment(counts = countData, phenoData = ADF, featureData = TDF,...) # Calculate normalization factor if (sum(colSums(countData > 0) > 1) < ncol(countData)) { p = suppressMessages(metagenomeSeq::cumNormStat(mrobj)) } else { p = suppressMessages(metagenomeSeq::cumNormStatFast(mrobj)) } mrobj = metagenomeSeq::cumNorm(mrobj, p = p) return(mrobj) } } phyloseq/R/extend_vegan.R0000644000175400017540000002552113175714136016454 0ustar00biocbuildbiocbuild################################################################################ # Define S3 methods for scores (originally defined by vegan-package) # to work for other ordination results # vegan:::scores.default ################################################################################ # pcoa-class, from pcoa{ape} #' @importFrom vegan wascores #' @importFrom vegan scores #' @keywords internal scores.pcoa <- function(x, choices=NULL, display="sites", physeq=NULL, ...){ if(is.null(choices)){ choices <- colnames(x$vectors) } co = list(sites = x$vectors[, choices]) if( "species" %in% display ){ if(is.null(otu_table(physeq, errorIfNULL = FALSE))){ warning("scores.pcoa: Failed to access OTU table from `physeq` argument, \n needed for weighted average of OTU/taxa/species points in MDS/PCoA.") } else { # MDS/PCoA only provides coordinates of the elements in the # distance matrix, usually sites/samples, so species (etc.) # This means we need to use the weighted-average as there is # no corresponding axes from the ordination directly. co$species <- wascores(x$vectors[, choices], w = veganifyOTU(physeq)) } } co <- co[display] if(length(co) < 2L){ # Unlist co <- co[[display]] } return(co) } ################################################################################ # DPCoA management ################################################################################ #' @importFrom vegan scores #' @keywords internal get_dpcoa_species_coords = function(x, physeq=NULL){ # Grab coordinates from the dpcoa object coords = x$dls # ade4 mangles the element names using `make.names` conventions in base R # Replace them in `coords` if(is.null(taxa_names(physeq))){ warning("scores.dpcoa: Failed to access `taxa_names` from `physeq` argument, \n needed to ensure correct mapping of OTU/taxa/species points in DPCoA.") } else { # if the names are available, use them # by mapping the same variable-name conversion that ade4 would have used. taxnames = taxa_names(physeq) names(taxnames) <- make.names(taxnames) rownames(coords) <- taxnames[rownames(coords)] } return(coords) } #' @importFrom vegan scores #' @keywords internal get_dpcoa_sites_coords = function(x, physeq=NULL){ # Grab coordinates from the dpcoa object coords = x$li # ade4 mangles the element names using `make.names` conventions in base R # Replace them in `coords` if(is.null(sample_names(physeq))){ warning("scores.dpcoa: Failed to access `sample_names` from `physeq` argument, \n needed to ensure correct mapping of site/sample/library points in DPCoA.") } else { # if the names are available, use them # by mapping the same variable-name conversion that ade4 would have used. samplenames = sample_names(physeq) names(samplenames) <- make.names(samplenames) rownames(coords) <- samplenames[rownames(coords)] } return(coords) } # dpcoa-class, from ade4 #' @importFrom vegan scores #' @keywords internal scores.dpcoa <- function(x, choices=NULL, display="sites", physeq=NULL, ...){ # x = ordination # display = "species" coords = NULL # `display` must be either "sites" or "species", per vegan-package convention. coords <- switch(EXPR = display, species = get_dpcoa_species_coords(x, physeq), sites = get_dpcoa_sites_coords(x, physeq)) # If no choices selection, take all dimensions/columns if(is.null(choices)){ choices <- 1:ncol(coords) } return( coords[, choices, drop=FALSE] ) } ################################################################################ # Extend vegdist for phyloseq classes ################################################################################ # \code{\link[vegan]{vegdist}} wrapper for phyloseq classes # # Trivially-extended S4 method from the \code{\link[vegan]{vegdist}} function, # such that S4 classes from the \code{\link{phyloseq-package}} are properly # handled / accessed. All parameters passed on to \code{\link[vegan]{vegdist}} # verbatim. # # @seealso \code{\link[vegan]{vegdist}} # @rdname vegdist-methods # @docType methods # @aliases vegdist # # @examples # data(esophagus) # vegdist(esophagus, "jaccard") #' @importFrom vegan vegdist #' @keywords internal setGeneric("vegdist") ################################################################################ # @aliases vegdist,otu_table-method # @rdname vegdist-methods #' @importFrom vegan vegdist setMethod("vegdist", "otu_table", function(x, method = "bray", binary = FALSE, diag = FALSE, upper = FALSE, na.rm = FALSE, ...){ # Make sure in sample-by-species orientation if( taxa_are_rows(x) ){x <- t(x)} # Convert to simple matrix x <- as(x, "matrix") # pass to standard method (compiled C) vegdist(x, method, binary, diag, upper, na.rm, ...) }) ################################################################################ # @aliases vegdist,phyloseq-method # @rdname vegdist-methods setMethod("vegdist", "phyloseq", function(x, method = "bray", binary = FALSE, diag = FALSE, upper = FALSE, na.rm = FALSE, ...){ # Simply access the otu_table x <- otu_table(x) vegdist(x, method, binary, diag, upper, na.rm, ...) }) ################################################################################ #' Summarize alpha diversity #' #' Performs a number of standard alpha diversity estimates, #' and returns the results as a \code{data.frame}. #' Strictly speaking, this function is not only estimating richness, #' despite its name. #' It can operate on the cumulative population of all #' samples in the dataset, or by repeating the richness estimates for each #' sample individually. #' NOTE: You must use untrimmed datasets #' for meaningful results, as these estimates (and even the ``observed'' richness) #' are highly dependent on the number of singletons. You can always trim the data #' later on if needed, just not before using this function. #' #' @param physeq (Required). \code{\link{phyloseq-class}}, or alternatively, #' an \code{\link{otu_table-class}}. The data about which you want to estimate #' the richness. #' #' @param split (Optional). Logical. Should a separate set of richness estimates #' be performed for each sample? Or alternatively, pool all samples and #' estimate richness of the entire set. #' #' @param measures (Optional). Default is \code{NULL}, meaning that #' all available alpha-diversity measures will be included. #' Alternatively, you can specify one or more measures #' as a character vector of measure names. #' Values must be among those supported: #' \code{c("Observed", "Chao1", "ACE", "Shannon", "Simpson", "InvSimpson", "Fisher")}. #' #' @return A \code{data.frame} of the richness estimates, and their standard error. #' #' @seealso #' Check out the custom plotting function, \code{\link{plot_richness}}, #' for easily showing the results of different estimates, #' with method-specific error-bars. #' Also check out the internal functions borrowed from the \code{vegan} package: #' #' \code{\link[vegan]{estimateR}} #' #' \code{\link[vegan]{diversity}} #' #' \code{\link[vegan]{fisherfit}} #' #' @importFrom vegan estimateR #' @importFrom vegan diversity #' @importFrom vegan fisher.alpha #' @export #' @examples #' ## There are many more interesting examples at the phyloseq online tutorials. #' ## http://joey711.github.com/phyloseq/plot_richness-examples #' data("esophagus") #' # Default is all available measures #' estimate_richness(esophagus) #' # Specify just one: #' estimate_richness(esophagus, measures="Observed") #' # Specify a few: #' estimate_richness(esophagus, measures=c("Observed", "InvSimpson", "Shannon", "Chao1")) estimate_richness <- function(physeq, split=TRUE, measures=NULL){ if( !any(otu_table(physeq)==1) ){ # Check for singletons, and then warning if they are missing. # These metrics only really meaningful if singletons are included. warning( "The data you have provided does not have\n", "any singletons. This is highly suspicious. Results of richness\n", "estimates (for example) are probably unreliable, or wrong, if you have already\n", "trimmed low-abundance taxa from the data.\n", "\n", "We recommended that you find the un-trimmed data and retry." ) } # If we are not splitting sample-wise, sum the species. Else, enforce orientation. if( !split ){ OTU <- taxa_sums(physeq) } else if( split ){ OTU <- as(otu_table(physeq), "matrix") if( taxa_are_rows(physeq) ){ OTU <- t(OTU) } } # Define renaming vector: renamevec = c("Observed", "Chao1", "ACE", "Shannon", "Simpson", "InvSimpson", "Fisher") names(renamevec) <- c("S.obs", "S.chao1", "S.ACE", "shannon", "simpson", "invsimpson", "fisher") # If measures was not explicitly provided (is NULL), set to all supported methods if( is.null(measures) ){ measures = as.character(renamevec) } # Rename measures if they are in the old-style if( any(measures %in% names(renamevec)) ){ measures[measures %in% names(renamevec)] <- renamevec[names(renamevec) %in% measures] } # Stop with error if no measures are supported if( !any(measures %in% renamevec) ){ stop("None of the `measures` you provided are supported. Try default `NULL` instead.") } # Initialize to NULL outlist = vector("list") # Some standard diversity indices estimRmeas = c("Chao1", "Observed", "ACE") if( any(estimRmeas %in% measures) ){ outlist <- c(outlist, list(t(data.frame(estimateR(OTU))))) } if( "Shannon" %in% measures ){ outlist <- c(outlist, list(shannon = diversity(OTU, index="shannon"))) } if( "Simpson" %in% measures ){ outlist <- c(outlist, list(simpson = diversity(OTU, index="simpson"))) } if( "InvSimpson" %in% measures ){ outlist <- c(outlist, list(invsimpson = diversity(OTU, index="invsimpson"))) } if( "Fisher" %in% measures ){ fisher = tryCatch(fisher.alpha(OTU, se=TRUE), warning=function(w){ warning("phyloseq::estimate_richness: Warning in fisher.alpha(). See `?fisher.fit` or ?`fisher.alpha`. Treat fisher results with caution") suppressWarnings(fisher.alpha(OTU, se=TRUE)[, c("alpha", "se")]) } ) if(!is.null(dim(fisher))){ colnames(fisher)[1:2] <- c("Fisher", "se.fisher") outlist <- c(outlist, list(fisher)) } else { outlist <- c(outlist, Fisher=list(fisher)) } } out = do.call("cbind", outlist) # Rename columns per renamevec namechange = intersect(colnames(out), names(renamevec)) colnames(out)[colnames(out) %in% namechange] <- renamevec[namechange] # Final prune to just those columns related to "measures". Use grep. colkeep = sapply(paste0("(se\\.){0,}", measures), grep, colnames(out), ignore.case=TRUE) out = out[, sort(unique(unlist(colkeep))), drop=FALSE] # Make sure that you return a data.frame for reliable performance. out <- as.data.frame(out) return(out) } ################################################################################ phyloseq/R/extract-methods.R0000644000175400017540000000540513175714136017117 0ustar00biocbuildbiocbuild################################################################################ # subsetting functions # Without these, the default coerces to the base object (e.g. matrix or data.frame) ################################################################################ #' Method extensions to extraction operator for phyloseq objects. #' #' See the documentation for the \code{\link[base]{Extract}} generic, #' defined in the R \code{\link[base]{base-package}} #' for the expected behavior. #' #' One special exception to standard behavior of these methods in phyloseq is that #' the \code{drop} argument is set internally to \code{FALSE}. #' This helps avoid bugs during complicated subsetting with multiple components, #' where it is necessary to be able to use a two dimensional indexing even #' if one of those dimensions has only 1 rank. #' Put another way, these phyloseq-defined extractions never collapse their result #' into a vector. See the documentation of \code{\link[base]{Extract}} for #' more information about the \code{drop} argument. #' #' @param j See \code{\link[base]{Extract}} #' #' @param ... See \code{\link[base]{Extract}} #' #' @seealso \code{\link[base]{Extract}} #' #' @export #' #' @rdname extract-methods #' @inheritParams base::Extract #' @examples #' data(esophagus) #' nrow(otu_table(esophagus)) #' nrow(otu_table(esophagus)[1:5, ]) setMethod("[", "otu_table", function(x, i, j, ...){ newx <- as(x, "matrix")[i, j, drop=FALSE] otu_table(newx, taxa_are_rows(x) ) }) # extract parts of sample_data # #' @export #' @rdname extract-methods setMethod("[", "sample_data", function(x, i, j, ...){ sample_data( data.frame(x)[i, j, drop=FALSE] ) }) # extract parts of taxonomyTable # #' @export #' @rdname extract-methods setMethod("[", "taxonomyTable", function(x, i, j, ...){ # Coerce to matrix, apply std extraction, reconstruct. return( tax_table(as(x, "matrix")[i, j, drop=FALSE]) ) }) # A numeric extraction method is already defined in Biostrings for XStringSet # Add name-character-based extraction method for XStringSet # #' @importClassesFrom Biostrings XStringSet #' @export #' @rdname extract-methods setMethod("[", c("XStringSet", "character"), function(x, i){ index_vector = match(i, names(x), nomatch=NA_integer_) index_vector = index_vector[!is.na(index_vector)] if( length(index_vector) <= 0 ){ warning("[,XStringSet: no valid seq-indices provided, NULL returned") return(NULL) } if( length(index_vector) < length(i) ){ warning("[,XStringSet: some seq-name indices invalid, omitted.") } # index_vector is an integer, subsetting now dispatches to standard x = x[index_vector] return(x) }) ################################################################################ ################################################################################ phyloseq/R/merge-methods.R0000644000175400017540000006222513175714136016547 0ustar00biocbuildbiocbuild################################################################################ #' Merge arguments into one phyloseq object. #' #' Takes a comma-separated list of phyloseq objects as arguments, #' and returns the most-comprehensive single phyloseq object possible. #' #' Higher-order objects can be created if arguments are appropriate component data #' types of different #' classes, and this should mirror the behavior of the \code{\link{phyloseq}} method, #' which is the suggested method if the goal is simply to create a higher-order #' phyloseq object from different data types (1 of each class) describing the same experiment. #' #' By contrast, this method is intended for situations in which one wants to combine #' multiple higher-order objects, or multiple core component data objects (e.g. more than one #' \code{otu_table}) that should be combined into one object. #' #' Merges are performed by first separating higher-order objects into #' a list of their component objects; then, merging any component objects of the same class #' into one object according to the behavior desribed in \code{\link{merge_phyloseq_pair}}; #' and finally, building back up a merged-object according to the constructor #' behavior of the \code{\link{phyloseq}} method. If the arguments contain only a single #' component type -- several otu_table objects, for example -- then a single merged object #' of that component type is returned. #' #' @usage merge_phyloseq(...) #' #' @param ... a comma-separated list of phyloseq objects. #' #' @return Merges are performed by first separating higher-order objects into #' a list of their component objects; then, merging any component objects of the same class #' into one object according to the behavior desribed in \code{\link{merge_phyloseq_pair}}; #' and finally, re-building a merged-object according to the constructor #' behavior of the \code{\link{phyloseq}} method. If the arguments contain only a single #' component type -- several otu_table objects, for example -- then a single merged object #' of the relevant component type is returned. #' #' Merges between 2 or more tree objects are ultimately done using #' \code{\link[ape]{consensus}} from the ape package. #' This has the potential to limit somewhat the final data object, because trees #' don't merge with other trees in the same granular manner as data tables, and #' ultimately the species/taxa in higher-order phyloseq objects will be clipped to #' what is contained in the tree. If this an issue, the tree component should #' be ommitted from the argument list. #' #' @export #' #' @examples # #' ## # Make a random complex object #' ## OTU1 <- otu_table(matrix(sample(0:5,250,TRUE),25,10), taxa_are_rows=TRUE) #' ## tax1 <- tax_table(matrix("abc", 30, 8)) #' ## map1 <- data.frame( matrix(sample(0:3,250,TRUE),25,10), #' ## matrix(sample(c("a","b","c"),150,TRUE), 25, 6) ) #' ## map1 <- sample_data(map1) #' ## exam1 <- phyloseq(OTU1, map1, tax1) #' ## x <- exam1 #' ## x <- phyloseq(exam1) #' ## y <- tax_table(exam1) #' ## merge_phyloseq(x, y) #' ## merge_phyloseq(y, y, y, y) merge_phyloseq <- function(...){ arguments <- list(...) # create list of all components of all objects comp.list <- list() for( i in 1:length(arguments) ){ comp.list <- c(comp.list, splat.phyloseq.objects(arguments[[i]])) } # loop through each component type. Note, list names redundant. will use this merged.list <- list() for( i in unique(names(comp.list)) ){ #i="tax_table" # check if length 1, if so, cat to merged.list. i.list <- comp.list[names(comp.list)==i] if( length(i.list) == 1 ){ merged.list <- c(merged.list, i.list) } else { # else, loop through each identically-named objects. x1 <- i.list[[1]] for( j in 2:length(i.list)){ x1 <- merge_phyloseq_pair(x1, i.list[[j]]) } x1 <- list(x1) names(x1) <- i merged.list <- c(merged.list, x1) } } # Remove names to avoid any conflicts with phyloseq(), which does not need named-arguments names(merged.list) <- NULL # Use do.call for calling this variable-length, variable-content argument list. return( do.call(phyloseq, merged.list) ) } ################################################################################ #' Merge pair of phyloseq component data objects of the same class. #' #' Internal S4 methods to combine pairs of objects of classes specified in the #' phyloseq package. These objects must be component data of the same type #' (class). This is mainly an internal method, provided to illustrate how #' merging is performed by the more general \code{\link{merge_phyloseq}} function. #' #' The \code{\link{merge_phyloseq}} function is recommended in general. #' #' Special note: non-identical trees are merged using \code{\link[ape]{consensus}}. #' #' @usage merge_phyloseq_pair(x, y) #' #' @param x A character vector of the species in object x that you want to #' keep -- OR alternatively -- a logical vector where the kept species are TRUE, and length #' is equal to the number of species in object x. If \code{species} is a named #' logical, the species retained is based on those names. Make sure they are #' compatible with the \code{taxa_names} of the object you are modifying (\code{x}). #' #' @param y Any \code{phyloseq} object. #' #' @return A single component data object that matches \code{x} and \code{y} #' arguments. The returned object will #' contain the union of the species and/or samples of each. If there is redundant #' information between a pair of arguments of the same class, the values in \code{x} are #' used by default. Abundance values are summed for \code{otu_table} objects #' for those elements that describe the same species and sample in \code{x} #' and \code{y}. #' #' @seealso \code{\link{merge_phyloseq}} \code{\link{merge_taxa}} #' #' @rdname merge_phyloseq_pair-methods #' @docType methods #' @export #' #' @examples # #' ## # merge two simulated otu_table objects. #' ## x <- otu_table(matrix(sample(0:5,200,TRUE),20,10), taxa_are_rows=TRUE) #' ## y <- otu_table(matrix(sample(0:5,300,TRUE),30,10), taxa_are_rows=FALSE) #' ## xy <- merge_phyloseq_pair(x, y) #' ## yx <- merge_phyloseq_pair(y, x) #' ## # merge two simulated tax_table objects #' ## x <- tax_table(matrix("abc", 20, 6)) #' ## y <- tax_table(matrix("def", 30, 8)) #' ## xy <- merge_phyloseq_pair(x, y) #' ## # merge two simulated sample_data objects #' ## x <- data.frame( matrix(sample(0:3,250,TRUE),25,10), #' ## matrix(sample(c("a","b","c"),150,TRUE),25,6) ) #' ## x <- sample_data(x) #' ## y <- data.frame( matrix(sample(4:6,200,TRUE),20,10), #' ## matrix(sample(c("d","e","f"),120,TRUE),20,8) ) #' ## y <- sample_data(y) #' ## merge_phyloseq_pair(x, y) #' ## data.frame(merge_phyloseq_pair(x, y)) #' ## data.frame(merge_phyloseq_pair(y, x)) setGeneric("merge_phyloseq_pair", function(x, y) standardGeneric("merge_phyloseq_pair")) ################################################################################ #' @aliases merge_phyloseq_pair,otu_table,otu_table-method #' @rdname merge_phyloseq_pair-methods setMethod("merge_phyloseq_pair", signature("otu_table", "otu_table"), function(x, y){ specRrowsx <- taxa_are_rows(x) new.sp.names <- union(taxa_names(x), taxa_names(y)) new.sa.names <- union(sample_names(x), sample_names(y)) # Create the empty new matrix structure newx <- matrix(0, nrow=length(new.sp.names), ncol=length(new.sa.names), dimnames=list(new.sp.names, new.sa.names)) # assign a standard taxa_are_rows orientation to TRUE for x and y if( !taxa_are_rows(x) ){ x <- t(x) } if( !taxa_are_rows(y) ){ y <- t(y) } # "merge" by addition. newx[rownames(x), colnames(x)] <- x newx[rownames(y), colnames(y)] <- newx[rownames(y), colnames(y)] + y # Create the new otu_table object newx <- otu_table(newx, taxa_are_rows=TRUE) # Return the orientation that was in x if( !specRrowsx ){ newx <- t(newx) } return(newx) }) ################################################################################ #' @aliases merge_phyloseq_pair,taxonomyTable,taxonomyTable-method #' @rdname merge_phyloseq_pair-methods setMethod("merge_phyloseq_pair", signature("taxonomyTable", "taxonomyTable"), function(x, y){ new.sp.names <- union(rownames(x), rownames(y)) new.ta.names <- union(colnames(x), colnames(y)) # Create the empty new matrix structure newx <- matrix(NA, nrow=length(new.sp.names), ncol=length(new.ta.names), dimnames=list(new.sp.names, new.ta.names)) # "merge". Overwrite with x information. newx[rownames(y), colnames(y)] <- y newx[rownames(x), colnames(x)] <- x # Create the new otu_table object newx <- tax_table(newx) return(newx) }) ################################################################################ #' @aliases merge_phyloseq_pair,sample_data,sample_data-method #' @rdname merge_phyloseq_pair-methods setMethod("merge_phyloseq_pair", signature("sample_data", "sample_data"), function(x, y){ new.sa.names <- union(rownames(x), rownames(y)) new.va.names <- union(colnames(x), colnames(y)) partx <- data.frame("X0"=rownames(x), x) party <- data.frame("X0"=rownames(y), y) newx <- merge(partx, party, all=TRUE) # now we have the correct template, lets remove redundant rows. keep.samp.rows <- sapply(unique(as.character(newx[,1])), function(i,nx){ rownames(subset(nx, X0==i))[1] },newx) newx <- newx[keep.samp.rows,] rownames(newx) <- as.character(newx$"X0") # "merge". Overwrite with x information. newx[rownames(y), colnames(y)] <- data.frame(y) newx[rownames(x), colnames(x)] <- data.frame(x) # trim the sample name column newx <- newx[,names(newx)!="X0"] # Create the new otu_table object newx <- sample_data(newx) return(newx) }) ################################################################################ #' @aliases merge_phyloseq_pair,phylo,phylo-method #' @rdname merge_phyloseq_pair-methods #' @importFrom ape consensus setMethod("merge_phyloseq_pair", signature("phylo", "phylo"), function(x, y){ if(identical(x, y)){ return(x) } else { return( consensus(x, y) ) } }) ################################################################################ #' @aliases merge_phyloseq_pair,XStringSet,XStringSet-method #' @rdname merge_phyloseq_pair-methods setMethod("merge_phyloseq_pair", signature("XStringSet", "XStringSet"), function(x, y){ if( class(x) != class(y) ){ # if class of x and y don't match, throw warning, try anyway (just in case) warning("For merging reference sequence objects, x and y should be same type.\n", "That is, the same subclass of XStringSet. e.g. both DNAStringSet.\n", "Try coercing each to the same compatible class prior to merge.") } # Add to x the stuff that is in y, but not in x add_y_taxa = setdiff(taxa_names(y), taxa_names(x)) if( length(add_y_taxa) < 1L ){ # If there is nothing from y to add, just return x as-is return(x) } else { # Else, add unique stuff from y only to x (they are both lists!) x = c(x, y[add_y_taxa]) return(x) } }) ################################################################################ ################################################################################ #' Merge a subset of the species in \code{x} into one species/taxa/OTU. #' #' Takes as input an object that describes species/taxa #' (e.g. \code{\link{phyloseq-class}}, \code{\link{otu_table-class}}, #' \code{\link{phylo-class}}, \code{\link{taxonomyTable-class}}), #' as well as #' a vector of species that should be merged. #' It is intended to be able to operate at a low-level such that #' related methods, such as \code{\link{tip_glom}} and \code{\link{tax_glom}} #' can both reliably call \code{merge_taxa} for their respective purposes. #' #' @usage merge_taxa(x, eqtaxa, archetype=1) #' #' @param x (Required). An object that describes species (taxa). This includes #' \code{\link{phyloseq-class}}, \code{\link{otu_table-class}}, \code{\link{taxonomyTable-class}}, #' \code{\link[ape]{phylo}}. #' #' @param eqtaxa (Required). The species names, or indices, that should be merged together. #' If \code{length(eqtaxa) < 2}, then the object \code{x} will be returned #' safely unchanged. #' #' @param archetype (Optional). A single-length numeric or character. #' The index of \code{eqtaxa}, or OTU ID, #' indicating the species that should be kept to represent #' the summed/merged group of species/taxa/OTUs. #' The default is to use the OTU with the largest count total #' if counts are available, or to use \code{1} #' (the first OTU in \code{eqtaxa}) otherwise. #' If \code{archetype} is not a valid index or index-name in \code{eqtaxa}, #' the first will be used, and the value in archetype will be used #' as the index-name for the new species. #' #' @return The object, \code{x}, in its original class, but with the specified #' species merged into one entry in all relevant components. #' #' @seealso \code{\link{tip_glom}}, \code{\link{tax_glom}}, \code{\link{merge_phyloseq}}, #' \code{\link{merge_samples}} #' #' @export #' @docType methods #' @rdname merge_taxa-methods #' @examples # #' data(esophagus) #' tree <- phy_tree(esophagus) #' otu <- otu_table(esophagus) #' otutree0 <- phyloseq(otu, tree) #' # plot_tree(otutree0) #' otutree1 <- merge_taxa(otutree0, 1:8, 2) #' # plot_tree(esophagus, ladderize="left") setGeneric("merge_taxa", function(x, eqtaxa, archetype=1L) standardGeneric("merge_taxa")) ################################################################################ #' @keywords internal merge_taxa.indices.internal = function(x, eqtaxa, archetype){ ## If eqtaxa or archetype are character, interpret them to be OTUs and coerce them to integer indices if( is.character(archetype) ){ # If archetype is already an OTU, just assign it to keepIndex keepIndex = which(taxa_names(x) %in% archetype[1L]) } else { # Else archetype is the numeric index of the eqtaxa that should be kept. # Need to grab from unmodifed eqtaxa, and then decide archetype = eqtaxa[as.integer(archetype[1L])] if( is.character(archetype) ){ # If archetype is now an OTU name, find the index and assign to keepIndex keepIndex = which(taxa_names(x) == archetype[1L]) } else { # Otherwise, assume it is a taxa index, and assign to keepIndex keepIndex = as.integer(archetype) } } # Ensure eqtaxa is the integer indices of the taxa that are being merged together if( is.character(eqtaxa) ){ # assume OTU name, index it against the OTU names in x eqtaxa = which(taxa_names(x) %in% eqtaxa) } else { # Else assume numeric index of the OTU that are being merged eqtaxa = as.integer(eqtaxa) } # keepIndex is index of the OTU that is kept / everything merged into. # It must be among the set of indices in eqtaxa or there is a logic error. Stop. if( length(keepIndex) <= 0L ){ stop("invalid archetype provided.") } if( !keepIndex %in% eqtaxa ){ stop("invalid archetype provided. It is not part of eqtaxa.") } # removeIndex is the index of each OTU that will be removed removeIndex = setdiff(eqtaxa, keepIndex) # Check that indices are valid allIndices = unlist(list(keepIndex, removeIndex)) if( any(allIndices > ntaxa(x) | allIndices < 0L) ){ stop("invalid OTU indices provided as eqtaxa or archetype.") } return(list(removeIndex=removeIndex, keepIndex=keepIndex)) } ################################################################################ #' @aliases merge_taxa,phyloseq-method #' @rdname merge_taxa-methods setMethod("merge_taxa", "phyloseq", function(x, eqtaxa, archetype=eqtaxa[which.max(taxa_sums(x)[eqtaxa])]){ comp_list <- splat.phyloseq.objects(x) merged_list <- lapply(comp_list, merge_taxa, eqtaxa, archetype) # the element names can wreak havoc on do.call names(merged_list) <- NULL # Re-instantiate the combined object using the species-merged object. do.call("phyloseq", merged_list) }) ############################################################################### # Don't need to merge anything for sample_data. Return As-is. #' @aliases merge_taxa,sample_data-method #' @rdname merge_taxa-methods setMethod("merge_taxa", "sample_data", function(x, eqtaxa, archetype=1L){ return(x) }) ############################################################################### #' @aliases merge_taxa,otu_table-method #' @rdname merge_taxa-methods setMethod("merge_taxa", "otu_table", function(x, eqtaxa, archetype=eqtaxa[which.max(taxa_sums(x)[eqtaxa])]){ if( length(eqtaxa) < 2 ){ return(x) } indList = merge_taxa.indices.internal(x, eqtaxa, archetype) removeIndex = indList$removeIndex keepIndex = indList$keepIndex # Merge taxa by summing all the equivalent taxa and assigning to the one in keepIndex if( taxa_are_rows(x) ){ x[keepIndex, ] = colSums(x[eqtaxa, ]) } else { x[, keepIndex] = rowSums(x[, eqtaxa]) } # For speed, use matrix subsetting instead of prune_taxa() if (taxa_are_rows(x)) { x = x[-removeIndex, , drop = FALSE] } else { x = x[, -removeIndex, drop = FALSE] } return(x) }) ############################################################################### #' @importFrom ape drop.tip #' @aliases merge_taxa,phylo-method #' @rdname merge_taxa-methods setMethod("merge_taxa", "phylo", function(x, eqtaxa, archetype=1L){ # If there is nothing to merge, return x as-is if( length(eqtaxa) < 2 ){ return(x) } indList = merge_taxa.indices.internal(x, eqtaxa, archetype) removeIndex = indList$removeIndex # If there is too much to merge (tree would have 1 or 0 branches), return NULL/warning if( length(removeIndex) >= (ntaxa(x)-1) ){ # Can't have a tree with 1 or fewer tips warning("merge_taxa attempted to reduce tree to 1 or fewer tips.\n tree replaced with NULL.") return(NULL) # Else, drop the removeIndex tips and returns the pruned tree. } else { return( drop.tip(x, removeIndex) ) } }) ############################################################################### #' @importClassesFrom Biostrings XStringSet #' @aliases merge_taxa,XStringSet-method #' @rdname merge_taxa-methods setMethod("merge_taxa", "XStringSet", function(x, eqtaxa, archetype=1L){ # If there is nothing to merge, return x as-is if( length(eqtaxa) < 2 ){ return(x) } indList = merge_taxa.indices.internal(x, eqtaxa, archetype) removeIndex = indList$removeIndex # If there is too much to merge (refseq would have 0 sequences), return NULL/warning if( length(removeIndex) >= ntaxa(x) ){ # Can't have a refseq list with less warning("merge_taxa attempted to reduce reference sequence list to 0 sequences.\n refseq replaced with NULL.") return(NULL) } else { # Else, drop the removeIndex sequences and returns the pruned XStringSet object x <- x[-removeIndex] return(x) } }) ################################################################################ #' @aliases merge_taxa,taxonomyTable-method #' @rdname merge_taxa-methods setMethod("merge_taxa", "taxonomyTable", function(x, eqtaxa, archetype=1L){ if( length(eqtaxa) < 2 ){ return(x) } indList = merge_taxa.indices.internal(x, eqtaxa, archetype) removeIndex = indList$removeIndex keepIndex = indList$keepIndex # # # Taxonomy is trivial in ranks after disagreement among merged taxa # # # Make those values NA_character_ taxmerge <- as(x, "matrix")[eqtaxa, ] bad_ranks <- apply(taxmerge, 2, function(i){ length(unique(i)) != 1 }) # Test if all taxonomies agree. If so, do nothing. Just continue to pruning. if( any(bad_ranks) ){ # The col indices of the bad ranks bad_ranks <- min(which(bad_ranks)):length(bad_ranks) # Replace bad taxonomy elements in the archetype only (others are pruned) x[keepIndex, bad_ranks] <- NA_character_ } # Finally, remove the OTUs that have been merged into keepIndex return( x[-removeIndex, , drop = FALSE] ) }) ################################################################################ ################################################################################ #' Merge samples based on a sample variable or factor. #' #' The purpose of this method is to merge/agglomerate the sample indices of a #' phyloseq object according to a categorical variable contained in a sample_data #' or a provided factor. #' #' NOTE: (\code{\link[ape]{phylo}}) trees and \code{\link{taxonomyTable-class}} #' are not modified by this function, but returned in the output object as-is. #' #' @usage merge_samples(x, group, fun=mean) #' #' @param x (Required). An instance of a phyloseq class that has sample indices. This includes #' \code{\link{sample_data-class}}, \code{\link{otu_table-class}}, and \code{\link{phyloseq-class}}. #' #' @param group (Required). Either the a single character string matching a variable name in #' the corresponding sample_data of \code{x}, or a factor with the same length as #' the number of samples in \code{x}. #' #' @param fun (Optional). The function that will be used to merge the values that #' correspond to the same group for each variable. It must take a numeric vector #' as first argument and return a single value. Default is \code{\link[base]{mean}}. #' Note that this is (currently) ignored for the otu_table, where the equivalent #' function is \code{\link[base]{sum}}, but evaluated via \code{\link[base]{rowsum}} #' for efficiency. #' #' @return A phyloseq object that has had its sample indices merged according to #' the factor indicated by the \code{group} argument. The output class #' matches \code{x}. #' #' @seealso \code{\link{merge_taxa}}, code{\link{merge_phyloseq}} #' #' @rdname merge_samples-methods #' @docType methods #' @export #' #' @examples # #' data(GlobalPatterns) #' GP = GlobalPatterns #' mergedGP = merge_samples(GlobalPatterns, "SampleType") #' SD = merge_samples(sample_data(GlobalPatterns), "SampleType") #' print(SD) #' print(mergedGP) #' sample_names(GlobalPatterns) #' sample_names(mergedGP) #' identical(SD, sample_data(mergedGP)) #' # The OTU abundances of merged samples are summed #' # Let's investigate this ourselves looking at just the top10 most abundance OTUs... #' OTUnames10 = names(sort(taxa_sums(GP), TRUE)[1:10]) #' GP10 = prune_taxa(OTUnames10, GP) #' mGP10 = prune_taxa(OTUnames10, mergedGP) #' ocean_samples = sample_names(subset(sample_data(GP), SampleType=="Ocean")) #' print(ocean_samples) #' otu_table(GP10)[, ocean_samples] #' rowSums(otu_table(GP10)[, ocean_samples]) #' otu_table(mGP10)["Ocean", ] setGeneric("merge_samples", function(x, group, fun=mean) standardGeneric("merge_samples")) ################################################################################ #' @aliases merge_samples,sample_data-method #' @rdname merge_samples-methods setMethod("merge_samples", signature("sample_data"), function(x, group, fun=mean){ x1 <- data.frame(x) # Check class of group and modify if "character" if( class(group)=="character" & length(group)==1 ){ if( !group %in% colnames(x) ){stop("group not found among sample variable names.")} group <- x1[, group] } if( class(group)!="factor" ){ # attempt to coerce to factor group <- factor(group) } # Remove any non-coercable columns. # Philosophy is to keep as much as possible. If it is coercable at all, keep. # Coerce all columns to numeric matrix coercable <- sapply(x1, canCoerce, "numeric") x2 <- sapply(x1[, coercable], as, "numeric") rownames(x2) <- rownames(x1) # Perform the aggregation. outdf <- aggregate(x2, list(group), fun) # get rownames from the "group" column (always first) # rownames(outdf) <- as.character(outdf[, 1]) rownames(outdf) <- levels(group) # "pop" the first column outdf <- outdf[, -1, drop=FALSE] return( sample_data(outdf) ) }) ################################################################################ #' @aliases merge_samples,otu_table-method #' @rdname merge_samples-methods setMethod("merge_samples", signature("otu_table"), function(x, group){ # needs to be in sample-by-species orientation if( taxa_are_rows(x) ){ x <- t(x) } # coerce to matrix, x2 x2 <- as(x, "matrix") # # # #aggregate(x2, list(group), fun) out <- rowsum(x2, group) # convert back to otu_table, and return return( otu_table(out, taxa_are_rows=FALSE) ) }) ################################################################################ #' @aliases merge_samples,phyloseq-method #' @rdname merge_samples-methods setMethod("merge_samples", signature("phyloseq"), function(x, group, fun=mean){ # Check if phyloseq object has a sample_data if( !is.null(sample_data(x, FALSE)) ){ # Check class of group and modify if single "character" (column name) if( class(group)=="character" & length(group)==1 ){ x1 <- data.frame(sample_data(x)) if( !group %in% colnames(x1) ){stop("group not found among sample variable names.")} group <- x1[, group] } # coerce to factor if( class(group)!="factor" ){ group <- factor(group) } # Perform merges. newSM <- merge_samples(sample_data(x), group, fun) newOT <- merge_samples(otu_table(x), group) phyloseqList <- list(newOT, newSM) # Else, the only relevant object to "merge_samples" is the otu_table } else { if( class(group)!="factor" ){ group <- factor(group) } phyloseqList <- list( newOT=merge_samples(otu_table(x), group) ) } ### Add to build-call-list the remaining components, if present in x. ### NULL is returned by accessor if object lacks requested component/slot. ### Order of objects in list doesn't matter for phyloseq. ### The list should not be named. if( !is.null(access(x, "tax_table")) ){ phyloseqList <- c(phyloseqList, list(tax_table(x))) } if( !is.null(access(x, "phy_tree")) ){ phyloseqList <- c(phyloseqList, list(phy_tree(x))) } return( do.call("phyloseq", phyloseqList) ) }) ################################################################################ phyloseq/R/multtest-wrapper.R0000644000175400017540000001742213175714136017345 0ustar00biocbuildbiocbuild#################################################################################### # # # # Avoiding full import of multtest to mitigate potential conflicts #################################################################################### #' Multiple testing of taxa abundance according to sample categories/classes #' #' Please note that it is up to you to perform any necessary #' normalizing / standardizing transformations prior to these tests. #' See for instance \code{\link{transform_sample_counts}}. #' #' @param physeq (Required). \code{\link{otu_table-class}} or \code{\link{phyloseq-class}}. #' In this multiple testing framework, different taxa correspond to variables #' (hypotheses), and samples to observations. #' #' @param classlabel (Required). A single character index of the sample-variable #' in the \code{\link{sample_data}} of \code{physeq} that will be used for multiple testing. #' Alternatively, \code{classlabel} can be a custom integer (or numeric coercable #' to an integer), character, or factor with #' length equal to \code{nsamples(physeq)}. #' #' NOTE: the default test applied to each taxa is a two-sample two-sided #' \code{\link{t.test}}, WHICH WILL FAIL with an error if you provide a data variable #' (or custom vector) that contains MORE THAN TWO classes. One alternative to consider #' is an F-test, by specifying \code{test="f"} as an additional argument. See #' the first example below, and/or further documentation of #' \code{\link[multtest]{mt.maxT}} or \code{\link[multtest]{mt.minP}} #' for other options and formal details. #' #' @param minPmaxT (Optional). Character string. \code{"mt.minP"} or \code{"mt.maxT"}. #' Default is to use \code{"\link[multtest]{mt.minP}"}. #' #' @param method (Optional). Additional multiple-hypthesis correction methods. #' A character vector from the set \code{\link[stats]{p.adjust.methods}}. #' Default is \code{"fdr"}, for the Benjamini and Hochberg (1995) method #' to control False Discovery Rate (FDR). This argument is passed on to #' \code{\link[stats]{p.adjust}}, please see that documentation for more details. #' #' @param ... (Optional). Additional arguments, forwarded to #' \code{\link[multtest]{mt.maxT}} or \code{\link[multtest]{mt.minP}} #' #' @return A dataframe with components specified in the documentation for #' \code{\link[multtest]{mt.maxT}} or \code{\link[multtest]{mt.minP}}, respectively. #' #' @seealso #' #' \code{\link[multtest]{mt.maxT}} #' #' \code{\link[multtest]{mt.minP}} #' #' \code{\link[stats]{p.adjust}} #' #' @rdname mt-methods #' @docType methods #' @export #' #' @importFrom multtest mt.maxT #' @importFrom multtest mt.minP #' @importFrom stats p.adjust #' @importFrom stats p.adjust.methods #' #' @examples #' ## # Simple example, testing genera that sig correlate with Enterotypes #' data(enterotype) #' # Filter samples that don't have Enterotype #' x <- subset_samples(enterotype, !is.na(Enterotype)) #' # (the taxa are at the genera level in this dataset) #' res = mt(x, "Enterotype", method=c("fdr", "bonferroni"), test="f", B=300) #' head(res, 10) #' ## # Not surprisingly, Prevotella and Bacteroides top the list. #' ## # Different test, multiple-adjusted t-test, whether samples are ent-2 or not. #' ## mt(x, get_variable(x, "Enterotype")==2) setGeneric("mt", function(physeq, classlabel, minPmaxT="minP", method="fdr", ...) standardGeneric("mt") ) ################################################################################ # First, access the otu_table, and if appropriate, define classlabel from # the sample_data. #' @aliases mt,phyloseq,ANY-method #' @rdname mt-methods setMethod("mt", c("phyloseq", "ANY"), function(physeq, classlabel, minPmaxT="minP", method="fdr", ...){ # Extract the class information from the sample_data # if sample_data slot is non-empty, # and the classlabel is a character-class # and its length is 1. if( !is.null(sample_data(physeq, FALSE)) & inherits(classlabel, "character") & identical(length(classlabel), 1L) ){ # Define a raw factor based on the data available in a sample variable rawFactor = get_variable(physeq, classlabel[1]) if( !inherits(rawFactor, "factor") ){ # coerce to a factor if it is not already one. rawFactor = factor(rawFactor) } # Either way, replace `classlabel` with `rawFactor` classlabel = rawFactor } # Either way, dispatch `mt` on otu_table(physeq) MT = mt(otu_table(physeq), classlabel, minPmaxT, ...) if( !is.null(tax_table(physeq, FALSE)) ){ # If there is tax_table data present, # add/cbind it to the results. MT = cbind(MT, as(tax_table(physeq), "matrix")[rownames(MT), , drop=FALSE]) } if(length(method)>0 & method %in% p.adjust.methods){ # Use only the supported methods method <- method[which(method %in% p.adjust.methods)] # Add adjust-p columns. sapply should retain the names. adjp = sapply(method, function(meth, p){p.adjust(p, meth)}, p = MT$rawp, USE.NAMES = TRUE) MT <- cbind(MT, adjp) } return(MT) }) ################################################################################ # All valid mt() calls eventually funnel dispatch to this method. # The otu_table orientation is checked/handled here (and only here). #' @aliases mt,otu_table,integer-method #' @rdname mt-methods setMethod("mt", c("otu_table", "integer"), function(physeq, classlabel, minPmaxT="minP", ...){ # Guarantee proper orientation of abundance table, and coerce to matrix. if( !taxa_are_rows(physeq) ){ physeq <- t(physeq) } mt.phyloseq.internal(as(physeq, "matrix"), classlabel, minPmaxT, ...) }) ################################################################################ # Coerce numeric classlabel to be integer, pass-on #' @aliases mt,otu_table,numeric-method #' @rdname mt-methods setMethod("mt", c("otu_table", "numeric"), function(physeq, classlabel, minPmaxT="minP", ...){ mt(physeq, as(classlabel, "integer"), minPmaxT="minP", ...) }) ################################################################################ # Coerce logical to integer, pass-on #' @aliases mt,otu_table,logical-method #' @rdname mt-methods setMethod("mt", c("otu_table", "logical"), function(physeq, classlabel, minPmaxT="minP", ...){ mt(physeq, as(classlabel, "integer"), minPmaxT="minP", ...) }) ################################################################################ # Test for length, then dispatch... #' @aliases mt,otu_table,character-method #' @rdname mt-methods setMethod("mt", c("otu_table", "character"), function(physeq, classlabel, minPmaxT="minP", ...){ if( length(classlabel) != nsamples(physeq) ){ stop("classlabel not the same length as nsamples(physeq)") } else { classlabel <- factor(classlabel) } # Use mt dispatch with classlabel now a suitable classlabel mt(physeq, classlabel, minPmaxT, ...) }) ################################################################################ # Coerce factor to an integer vector of group labels, # starting at 0 for the first group #' @aliases mt,otu_table,factor-method #' @rdname mt-methods setMethod("mt", c("otu_table", "factor"), function(physeq, classlabel, minPmaxT="minP", ...){ # integerize classlabel, starting at 0 classlabel <- (0:(length(classlabel)-1))[classlabel] # Use mt dispatch with classlabel now a suitable classlabel mt(physeq, classlabel, minPmaxT, ...) }) #################################################################################### # Internal function # @aliases mt,matrix,integer-method # not exported #' @keywords internal mt.phyloseq.internal <- function(physeq, classlabel, minPmaxT="minP", ...){ # require(multtest) if( minPmaxT == "minP" ){ return( mt.minP(physeq, classlabel, ...) ) } else if( minPmaxT == "maxT" ){ return( mt.maxT(physeq, classlabel, ...) ) } else { print("Nothing calculated. minPmaxT argument must be either minP or maxT.") } } #################################################################################### phyloseq/R/network-methods.R0000644000175400017540000001676313175714136017147 0ustar00biocbuildbiocbuild################################################################################ #' Make microbiome network (igraph) #' #' A specialized function for creating a network representation of microbiomes, #' sample-wise or taxa-wise, #' based on a user-defined ecological distance and (potentially arbitrary) threshold. #' The graph is ultimately represented using the #' \code{igraph}-package. #' #' @usage make_network(physeq, type="samples", distance="jaccard", max.dist = 0.4, #' keep.isolates=FALSE, ...) #' #' @param physeq (Required). Default \code{NULL}. #' A \code{\link{phyloseq-class}} object, #' or \code{\link{otu_table-class}} object, #' on which \code{g} is based. \code{phyloseq-class} recommended. #' #' @param type (Optional). Default \code{"samples"}. #' Whether the network should be samples or taxa/OTUs. #' Supported arguments are \code{"samples"}, \code{"taxa"}, #' where \code{"taxa"} indicates using the OTUs/taxaindices, #' whether they actually represent species or some other taxonomic rank. #' #' NOTE: not all distance methods are supported if \code{"taxa"} #' selected for type. For example, the UniFrac distance and DPCoA #' cannot be calculated for taxa-wise distances, because they use #' a taxa-wise tree as part of their calculation between samples, and #' there is no transpose-equivalent for this tree. #' #' @param distance (Optional). Default \code{"jaccard"}. #' Any supported argument to the \code{method} parameter of the #' \code{\link{distance}} function is supported here. #' Some distance methods, like \code{"unifrac"}, may take #' a non-trivial amount of time to calculate, in which case #' you probably want to calculate the distance matrix separately, #' save, and then provide it as the argument to \code{distance} instead. #' See below for alternatives). #' #' Alternatively, if you have already calculated the sample-wise distance #' object, the resulting \code{dist}-class object #' can be provided as \code{distance} instead (see examples). #' #' A third alternative is to provide a function that takes #' a sample-by-taxa matrix (typical vegan orientation) #' and returns a sample-wise distance #' matrix. #' #' @param max.dist (Optional). Default \code{0.4}. #' The maximum ecological distance (as defined by \code{distance}) #' allowed between two samples to still consider them ``connected'' #' by an edge in the graphical model. #' #' @param keep.isolates (Optional). Default \code{FALSE}. Logical. #' Whether to keep isolates (un-connected samples, not microbial isolates) #' in the graphical model that is returned. Default results in isolates #' being removed from the object. #' #' @param ... (Optional). Additional parameters passed on to \code{\link{distance}}. #' #' @return A \code{igraph}-class object. #' #' @seealso #' \code{\link{plot_network}} #' #' @importFrom igraph graph.adjacency #' @importFrom igraph V #' @importFrom igraph delete.vertices #' @importFrom igraph degree #' @importFrom igraph vcount #' #' @export #' #' @examples #' # # Example plots with Enterotype Dataset #' data(enterotype) #' ig <- make_network(enterotype, max.dist=0.3) #' plot_network(ig, enterotype, color="SeqTech", shape="Enterotype", line_weight=0.3, label=NULL) #' # #' ig1 <- make_network(enterotype, max.dist=0.2) #' plot_network(ig1, enterotype, color="SeqTech", shape="Enterotype", line_weight=0.3, label=NULL) #' # #' # # Three methods of choosing/providing distance/distance-method #' # Provide method name available to distance() function #' ig <- make_network(enterotype, max.dist=0.3, distance="jaccard") #' # Provide distance object, already computed #' jaccdist <- distance(enterotype, "jaccard") #' ih <- make_network(enterotype, max.dist=0.3, distance=jaccdist) #' # Provide "custom" function. #' ii <- make_network(enterotype, max.dist=0.3, distance=function(x){vegan::vegdist(x, "jaccard")}) #' # The have equal results: #' all.equal(ig, ih) #' all.equal(ig, ii) #' # #' # Try out making a trivial "network" of the 3-sample esophagus data, #' # with weighted-UniFrac as distance #' data(esophagus) #' ij <- make_network(esophagus, "samples", "unifrac", weighted=TRUE) make_network <- function(physeq, type="samples", distance="jaccard", max.dist = 0.4, keep.isolates=FALSE, ...){ if( type %in% c("taxa", "species", "OTUs", "otus", "otu")){ # Calculate or asign taxa-wise distance matrix if( class(distance) == "dist" ){ # If distance a distance object, use it rather than re-calculate obj.dist <- distance if( attributes(obj.dist)$Size != ntaxa(physeq) ){ stop("ntaxa(physeq) does not match size of dist object in distance") } if( !setequal(attributes(obj.dist)$Labels, taxa_names(physeq)) ){ stop("taxa_names does not exactly match dist-indices") } } else if( class(distance) == "character" ){ # If character string, pass on to distance(), assume supported obj.dist <- distance(physeq, method=distance, type=type, ...) # Else, assume a custom function and attempt to calculate. } else { # Enforce orientation for taxa-wise distances if( !taxa_are_rows(physeq) ){ physeq <- t(physeq) } # Calculate distances obj.dist <- distance(as(otu_table(physeq), "matrix")) } # coerce distance-matrix back into vanilla matrix, Taxa Distance Matrix, TaDiMa TaDiMa <- as.matrix(obj.dist) # Add Inf to the diagonal to avoid self-connecting edges (inefficient) TaDiMa <- TaDiMa + diag(Inf, ntaxa(physeq), ntaxa(physeq)) # Convert distance matrix to coincidence matrix, CoMa, using max.dist CoMa <- TaDiMa < max.dist } else if( type == "samples" ){ # Calculate or asign sample-wise distance matrix if( class(distance) == "dist" ){ # If argument is already a distance matrix. # If distance a distance object, use it rather than re-calculate obj.dist <- distance if( attributes(obj.dist)$Size != nsamples(physeq) ){ stop("nsamples(physeq) does not match size of dist object in distance") } if( !setequal(attributes(obj.dist)$Labels, sample_names(physeq)) ){ stop("sample_names does not exactly match dist-indices") } # If character string, pass on to distance(), assume supported } else if( class(distance) == "character" ){ # Else, assume a custom function and attempt to calculate. obj.dist <- distance(physeq, method=distance, type=type, ...) } else { # Enforce orientation for sample-wise distances if(taxa_are_rows(physeq)){ physeq <- t(physeq) } # Calculate distances obj.dist <- distance(as(otu_table(physeq), "matrix")) } # coerce distance-matrix back into vanilla matrix, Sample Distance Matrix, SaDiMa SaDiMa <- as.matrix(obj.dist) # Add Inf to the diagonal to avoid self-connecting edges (inefficient) SaDiMa <- SaDiMa + diag(Inf, nsamples(physeq), nsamples(physeq)) # Convert distance matrix to coincidence matrix, CoMa, using max.dist CoMa <- SaDiMa < max.dist } else { stop("type argument must be one of \n (1) samples \n or \n (2) taxa") } # Calculate the igraph-formatted network ig <- graph.adjacency(CoMa, mode="lower") if( !keep.isolates ){ # If not-keeping isolates, remove them isolates <- V(ig)[degree(ig) == 0] ig = delete.vertices(ig, V(ig)[degree(ig) == 0]) } if( vcount(ig) < 2 ){ # Report a warning if the graph is empty warning("The graph you created has too few vertices. Consider changing `max.dist` argument, and check your data.") } return(ig) } ################################################################################ phyloseq/R/ordination-methods.R0000644000175400017540000006774013175714136017625 0ustar00biocbuildbiocbuild################################################################################ #' Perform an ordination on phyloseq data #' #' This function wraps several commonly-used ordination methods. The type of #' ordination depends upon the argument to \code{method}. Try #' \code{ordinate("help")} or \code{ordinate("list")} for the currently #' supported method options. #' #' @param physeq (Required). Phylogenetic sequencing data #' (\code{\link{phyloseq-class}}). The data on which you want to perform #' the ordination. In general, these methods will be based in some fashion on #' the abundance table ultimately stored as a contingency matrix #' (\code{\link{otu_table-class}}). If you're able to import data into #' \code{\link{phyloseq-class}} format, than you don't need to worry, as an #' \code{otu_table} is a required component of this class. In addition, some #' ordination methods require additional data, like a constraining variable #' or phylogenetic tree. If that is the case, the relevant data should be #' included in \code{physeq} prior to running. Integrating the data in this way #' also results in these different data components being checked for validity #' and completeness by the method. #' #' @param method (Optional). A character string. Default is \code{"DCA"}. #' #' Currently supported method options are: #' \code{c("DCA", "CCA", "RDA", "CAP", "DPCoA", "NMDS", "MDS", "PCoA")} #' #' \describe{ #' \item{DCA}{Performs detrended correspondence analysis using\code{\link{decorana}}} #' \item{CCA}{Performs correspondence analysis, #' or optionally, constrained correspondence analysis #' (a.k.a. canonical correspondence analysis), #' via \code{\link[vegan]{cca}}} #' \item{RDA}{Performs redundancy analysis, or optionally #' principal components analysis, via \code{\link[vegan]{rda}}} #' \item{CAP}{[Partial] Constrained Analysis of Principal Coordinates #' or distance-based RDA, via \code{\link[vegan]{capscale}}. #' See \code{\link[phyloseq]{capscale.phyloseq}} for more details. #' In particular, a \code{\link{formula}} argument must be provided.} #' \item{DPCoA}{Performs Double Principle Coordinate Analysis using a #' (corrected, if necessary) phylogenetic/patristic distance #' between species. The calculation is performed by #' \code{\link{DPCoA}}(), which ultimately uses #' \code{\link[ade4]{dpcoa}} after making the appropriate #' accessions/corrections of the data.} #' \item{NMDS}{Performs Non-metric MultiDimenstional Scaling of a sample-wise #' ecological distance matrix onto a user-specified number of axes, \code{k}. #' By default, \code{k=2}, but this can be modified as a supplementary argument. #' This method is ultimately carried out by \code{\link{metaMDS}} after the #' appropriate accessions and distance calculations. #' Because \code{metaMDS} includes its own distance #' calculation wrappers to \code{\link[vegan]{vegdist}}, and these provide #' additional functionality in the form of species scores, #' \code{ordinate} will pass-on the \code{distance} #' argument to \code{metaMDS} if it is among the #' supported \code{vegdist} methods. However, all distance methods #' supported by \code{\link{distance}} are supported here, #' including \code{"unifrac"} (the default) and \code{"DPCoA"}.} #' \item{MDS/PCoA}{Performs principal coordinate analysis #' (also called principle coordinate decomposition, #' multidimensional scaling (MDS), or classical scaling) #' of a distance matrix (Gower 1966), #' including two correction methods for negative eigenvalues. #' See #' \code{\link[ape]{pcoa}} for further details. #' } #' } #' #' @param distance (Optional). A character string. Default is \code{"bray"}. #' The name of a supported \code{\link{distance}} method; #' or, alternatively, #' a pre-computed \code{\link{dist}}-class object. #' This argument is only utilized #' if a distance matrix is required by the ordination method specified by the #' \code{method} argument (above). #' #' Any supported \code{\link{distance}} methods #' are supported arguments to \code{distance} here. #' See \code{\link{distance}} for more details, examples. #' #' @param formula (Optional). A model \code{\link{formula}}. #' Only relevant for certain ordination methods. #' The left hand side is ignored, defined by #' the \code{physeq} and \code{distance} arguemnts. #' The right hand side gives the constraining variables, #' and conditioning variables can be given #' within a special function \code{Condition}. #' See \code{\link[vegan]{cca}} or \code{\link[vegan]{capscale}} #' for examples/details. #' #' @param ... (Optional). Additional arguments to supporting functions. For #' example, the additional argument \code{weighted=TRUE} would be passed on #' to \code{\link{UniFrac}} if \code{"unifrac"} were chosen as the #' \code{distance} option and \code{"MDS"} as the ordination \code{method} #' option. Alternatively, if \code{"DCA"} were chosen as the #' ordination \code{method} option, additional arguments would be passed on #' to the relevant ordination function, \code{\link{decorana}}, for example. #' #' @return #' An ordination object. The specific class of the returned object depends upon the #' ordination method, as well as the function/package that is called internally #' to perform it. #' As a general rule, any of the ordination classes #' returned by this function will be recognized by downstream tools in the #' \code{phyloseq} package, for example the ordination plotting #' function, \code{\link{plot_ordination}}. #' #' @seealso #' \href{http://joey711.github.io/phyloseq/plot_ordination-examples}{The plot_ordination Tutorial} #' #' Related component ordination functions described within phyloseq: #' #' \code{\link{DPCoA}} #' #' Described/provided by other packages: #' #' \code{\link{cca}}/\code{\link{rda}}, \code{\link{decorana}}, \code{\link{metaMDS}}, #' \code{\link{pcoa}}, \code{\link[vegan]{capscale}} #' #' NMDS and MDS/PCoA both operate on distance matrices, typically based on some #' pairwise comparison of the microbiomes in an experiment/project. There are #' a number of common methods to use to calculate these pairwise distances, and #' the most convenient function (from a \code{phyloseq} point of view) for calculating #' these distance matrices is the #' #' \code{\link{distance}} #' #' function. It can be #' thought of as a distance / dissimilarity-index companion function for #' \code{ordinate}, and indeed the distance options provided to \code{ordinate} #' are often simply passed on to \code{\link{distance}}. #' #' A good quick summary of ordination is provided in the introductory vignette #' for vegan: #' #' \href{http://cran.r-project.org/web/packages/vegan/vignettes/intro-vegan.pdf}{vegan introductory vignette} #' #' The following \code{R} task views are also useful for understanding the #' available tools in \code{R}: #' #' \href{http://cran.r-project.org/web/views/Environmetrics.html}{Analysis of Ecological and Environmental Data} #' #' \href{http://cran.r-project.org/web/views/Multivariate.html}{Multivariate Statistics} #' #' @importFrom vegan decorana #' @importFrom vegan metaMDS #' @importFrom vegan wisconsin #' @importFrom vegan decostand #' @importFrom ape pcoa #' @export #' @examples #' # See http://joey711.github.io/phyloseq/plot_ordination-examples #' # for many more examples. #' # plot_ordination(GP, ordinate(GP, "DCA"), "samples", color="SampleType") ordinate = function(physeq, method="DCA", distance="bray", formula=NULL, ...){ # If `physeq` is a formula, post deprecated notice, attempt to convert and dispatch if( inherits(physeq, "formula") ){ .Deprecated(msg=paste0("First argument, `physeq`, as formula is deprecated.\n", "There is now an explicit `formula` argument.\n", "Please revise method call accordingly.")) # Create the new formula, RHS-only formchar = as.character(physeq) # Error if only RHS. Formula-first syntax required both sides. if(length(formchar) < 3){ stop("Need both sides of formula in this deprecated syntax... Revisit ordinate() documentation / examples.") } # Replace with (presumed) phyloseq object. physeq <- get(as.character(physeq)[2]) # Create the new formula, RHS-only. newFormula = as.formula(paste0("~", formchar[length(formchar)])) # Dispatch to (hopefully) ordinate,phyloseq return(ordinate(physeq, method=method, distance=distance, formula=newFormula, ...)) } # Define table of currently-supported methods method_table <- c("DCA", "CCA", "RDA", "CAP", "DPCoA", "NMDS", "MDS", "PCoA") # List supported method names to user, if requested. if( inherits(physeq, "character") ){ if( physeq=="help" ){ cat("Available arguments to methods:\n") print(c(method_table)) cat("Please be exact, partial-matching not supported.\n") cat("Can alternatively provide a custom distance.\n") cat("See:\n help(\"distance\") \n") return() } else if( physeq=="list" ){ return(c(method_table)) } else { cat("physeq needs to be a phyloseq-class object, \n") cat("or a character string matching \"help\" or \"list\". \n") } } # Final check that `physeq` is a phyloseq or otu_table class if( !inherits(physeq, "phyloseq") & !inherits(physeq, "otu_table") ){ stop("Expected a phyloseq object or otu_table object.") } # # Start with methods that don't require # # additional distance calculation. (distance argument ignored) # DCA if( method == "DCA" ){ return( decorana(veganifyOTU(physeq), ...) ) } # CCA / RDA if( method %in% c("CCA", "RDA") ){ return(cca.phyloseq(physeq, formula, method, ...)) } # CAP if( method == "CAP" ){ # Call/return with do.call return(capscale.phyloseq(physeq, formula, distance, ...)) } # DPCoA if( method == "DPCoA" ){ return( DPCoA(physeq, ...) ) } # # Now resort to methods that do require a separate distance/dist-calc # Define ps.dist. Check the class of distance argument is character or dist if( inherits(distance, "dist") ){ ps.dist <- distance } else if( class(distance) == "character" ){ # There are some special options for NMDS/metaMDS if distance-method # is supported by vegdist, so check first. If not, just calculate distance vegdist_methods <- c("manhattan", "euclidean", "canberra", "bray", "kulczynski", "jaccard", "gower", "altGower", "morisita", "horn", "mountford", "raup" , "binomial", "chao") # NMDS with vegdist-method to include species if(method == "NMDS" & distance %in% vegdist_methods){ return(metaMDS(veganifyOTU(physeq), distance, ...)) } # Calculate distance with handoff to distance() ps.dist <- distance(physeq, distance, ...) } # Vanilla MDS/PCoA if( method %in% c("PCoA", "MDS")){ return(pcoa(ps.dist)) } # NMDS with non-vegdist-method if(method == "NMDS"){ return(metaMDS(ps.dist)) } } ################################################################################ #' Calculate Double Principle Coordinate Analysis (DPCoA) #' using phylogenetic distance #' #' Function uses abundance (\code{\link{otu_table-class}}) and #' phylogenetic (\code{\link[ape]{phylo}}) components of a #' \code{\link{phyloseq-class}} experiment-level object #' to perform a #' Double Principle Coordinate Analysis (DPCoA), relying heavily on #' the underlying (and more general) function, \code{\link[ade4]{dpcoa}}. #' The distance object ultimately provided is the square root of the #' cophenetic/patristic (\code{\link[ape]{cophenetic.phylo}}) distance #' between the species, which is always Euclidean. #' #' Although this distance is Euclidean, for numerical reasons it #' will sometimes look non-Euclidean, and a correction will be performed. #' See \code{correction} argument. #' #' @param physeq (Required). A \code{\link{phyloseq-class}} object #' containing, at a minimum, abundance (\code{\link{otu_table-class}}) and #' phylogenetic (\code{\link[ape]{phylo}}) components. #' As a test, the accessors \code{\link{otu_table}} and \code{\link{phy_tree}} #' should return an object without error. #' #' @param correction (Optional). A function. The function must be #' able to take a non-Euclidean \code{\link{dist}}ance object, #' and return a new \code{dist}ance object that is Euclidean. #' If testing a distance object, try \code{\link[ade4]{is.euclid}}. #' #' #' Although the distance matrix should always be Euclidean, for numerical #' reasons it will sometimes appear non-Euclidean and a correction method must #' be applied. Two recommended correction methods are #' \code{\link[ade4]{cailliez}} and \code{\link[ade4]{lingoes}}. #' The default is \code{cailliez}, #' but not for any particularly special reason. If the #' distance matrix is Euclidian, no correction will be #' performed, regardless of the value of the \code{correction} argument. #' #' @param scannf (Optional). Logical. Default is \code{FALSE}. This #' is passed directly to \code{\link[ade4]{dpcoa}}, and causes a #' barplot of eigenvalues to be created if \code{TRUE}. This is not #' included in \code{...} because the default for \code{\link[ade4]{dpcoa}} #' is \code{TRUE}, although in many expected situations we would want #' to suppress creating the barplot. #' #' @param ... Additional arguments passed to \code{\link[ade4]{dpcoa}}. #' #' @return A \code{dpcoa}-class object (see \code{\link[ade4]{dpcoa}}). #' #' @seealso \code{\link[ade4]{dpcoa}} #' #' @author Julia Fukuyama \email{julia.fukuyama@@gmail.com}. #' Adapted for phyloseq by Paul J. McMurdie. #' #' @importFrom ape cophenetic.phylo #' @importFrom ade4 cailliez #' @importFrom ade4 dpcoa #' @importFrom ade4 is.euclid #' @export #' @references #' Pavoine, S., Dufour, A.B. and Chessel, D. (2004) #' From dissimilarities among species to dissimilarities among communities: #' a double principal coordinate analysis. #' Journal of Theoretical Biology, 228, 523-537. #' #' @examples #' # # # # # # Esophagus #' data(esophagus) #' eso.dpcoa <- DPCoA(esophagus) #' eso.dpcoa #' plot_ordination(esophagus, eso.dpcoa, "samples") #' plot_ordination(esophagus, eso.dpcoa, "species") #' plot_ordination(esophagus, eso.dpcoa, "biplot") #' # #' # #' # # # # # # GlobalPatterns #' data(GlobalPatterns) #' # subset GP to top-150 taxa (to save computation time in example) #' keepTaxa <- names(sort(taxa_sums(GlobalPatterns), TRUE)[1:150]) #' GP <- prune_taxa(keepTaxa, GlobalPatterns) #' # Perform DPCoA #' GP.dpcoa <- DPCoA(GP) #' plot_ordination(GP, GP.dpcoa, color="SampleType") DPCoA <- function(physeq, correction=cailliez, scannf=FALSE, ...){ # Check that physeq is a phyloseq-class if(!class(physeq)=="phyloseq"){stop("physeq must be phyloseq-class")} # Remove any OTUs that are absent from all the samples. physeq <- prune_taxa((taxa_sums(physeq) > 0), physeq) # Access components for handing-off OTU <- otu_table(physeq) tree <- phy_tree(physeq) # Enforce that OTU is in samples-by-species orientation if(taxa_are_rows(OTU) ){ OTU <- t(OTU) } # get the patristic distances between the species from the tree patristicDist <- sqrt(as.dist(cophenetic.phylo(tree))) # if the patristic distances are not Euclidean, # then correct them or throw meaningful error. if( !is.euclid(patristicDist) ){ patristicDist <- correction(patristicDist) # Check that this is now Euclidean. if( !is.euclid(patristicDist) ){ stop('Corrected distance still not Euclidean \n', "please provide a different correction method") } } # NOTE: the dpcoa function in ade4 requires a data.frame return( dpcoa(data.frame(OTU), patristicDist, scannf, ...) ) } ################################################################################ ################################################################################ # vegan::cca "extension". # formula is main input to this function. This complicates signature handling. # A new method with a separate name is defined instead. # # Must transpose the phyloseq otu_table to fit the vegan::cca convention # Whether-or-not to transpose needs to be a check, based on the # "taxa_are_rows" slot value ################################################################################ #' Constrained Correspondence Analysis and Redundancy Analysis. #' #' This is the internal function that simplifies getting phyloseq data #' into the constrained ordination functions, #' \code{\link[vegan]{cca}} and \code{\link[vegan]{rda}}. #' Unlike \code{\link[phyloseq]{capscale.phyloseq}}, the formula argument #' to these methods is optional, and results in an unconstrained ordination. #' #' @param physeq (Required). Phylogenetic sequencing data #' (\code{\link{phyloseq-class}}). #' The data on which you want to perform the ordination. #' #' @param formula (Optional). A \code{\link{formula}}, #' specifying the contraining variable(s) format, #' with variable names corresponding to \code{\link{sample_data}} (RHS) #' from within \code{physeq}. #' #' @param method (Optional). A single \code{\link{character}} string, #' specifying \code{"RDA"} or \code{"CCA"}. Default is \code{"CCA"}. #' #' @param ... (Optional). Additional named arguments passed to #' \code{\link[vegan]{capscale}}. #' #' @return same output as \code{\link[vegan]{cca}} #' or \code{\link[vegan]{rda}}, respectively. #' #' @seealso \code{\link{plot_ordination}}, #' \code{\link[vegan]{rda}}, \code{\link[vegan]{cca}} #' #' @aliases cca.phyloseq rda.phyloseq #' @rdname cca-rda-phyloseq-methods #' @docType methods #' #' @keywords internal #' @examples # #' # cca.phyloseq(physeq, formula, method, ...) setGeneric("cca.phyloseq", function(physeq, formula=NULL, method="CCA", ...){ standardGeneric("cca.phyloseq") }) #' @importFrom vegan cca #' @importFrom vegan rda #' @aliases cca.phyloseq,phyloseq,formula-method #' @rdname cca-rda-phyloseq-methods setMethod("cca.phyloseq", signature=c("phyloseq", "formula"), function(physeq, formula, method="CCA", ...){ data = data.frame(sample_data(physeq, FALSE), stringsAsFactors=FALSE) if( length(data) < 1 ){ stop("`physeq` argument must include non-empty `sample_data`") } OTU = veganifyOTU(physeq) # Create new formula. Left-hand side is ignored. formchar = as.character(formula) newFormula = as.formula(paste0("OTU ~ ", formchar[length(formchar)])) # Note that ade4 also has a conflicting "cca" function. # You don't import ade4::cca to avoid the conflict. if(method=="CCA"){ return(cca(newFormula, data=data)) } else if(method=="RDA"){ return(rda(newFormula, data=data)) } else { warning("Unsupported `method` argument. Must be 'RDA' or 'CCA'") return(NULL) } }) #' @importFrom vegan cca #' @aliases cca.phyloseq,otu_table-method #' @rdname cca-rda-phyloseq-methods setMethod("cca.phyloseq", signature="otu_table", function(physeq, formula=NULL, method="CCA", ...){ # OTU table by itself indicates an unconstrained ordination is requested. # Formula argument is ignored. if(method=="CCA"){ return(cca(veganifyOTU(physeq))) } else if(method=="RDA"){ return(rda(veganifyOTU(physeq))) } else { warning("Unsupported `method` argument. Must be 'RDA' or 'CCA'") return(NULL) } }) #' @importFrom vegan cca #' @aliases cca.phyloseq,phyloseq,NULL-method #' @rdname cca-rda-phyloseq-methods setMethod("cca.phyloseq", signature=c("phyloseq", "NULL"), function(physeq, formula, method="CCA", ...){ # Absence of a formula (NULL) indicates unconstrained ordination. # Access otu_table, and dispatch. return(cca.phyloseq(otu_table(physeq), NULL, method, ...)) }) ################################################################################ #' Estimate the gap statistic on an ordination result #' #' This is a wrapper for the \code{\link[cluster]{clusGap}} function, #' expecting an ordination result as the main data argument. #' #' @param ord (Required). An ordination object. The precise class can vary. #' Any ordination classes supported internally by the phyloseq package #' should work, ultimately by passing to the \code{\link[vegan]{scores}} function #' or its internal extensions in phyloseq. #' @param axes (Optional). The ordination axes that you want to include. #' @param type (Optional). One of \code{"sites"} #' (the vegan package label for samples) or #' \code{"species"} (the vegan package label for OTUs/taxa). #' Default is \code{"sites"}. #' @param FUNcluster (Optional). This is passed to \code{\link[cluster]{clusGap}}. #' The documentation is copied here for convenience: #' a function which accepts as first argument a (data) matrix like \code{x}, #' second argument, say (the number of desired clusters) \code{k}, where \code{k >= 2}, #' and returns a list with a component named (or shortened to) cluster #' which is a vector of length \code{n = nrow(x)} of integers in \code{1:k} #' determining the clustering or grouping of the \code{n} observations. #' The default value is the following function, which wraps #' partitioning around medoids, \code{\link[cluster]{pam}}: #' #' \code{function(x, k){list(cluster = pam(x, k, cluster.only=TRUE))}} #' #' Any function that has these input/output properties (performing a clustering) #' will suffice. The more appropriate the clustering method, the better chance #' your gap statistic results will be useful. #' @param K.max (Optional). A single positive integer value. #' It indicates the maximum number of clusters that will be considered. #' Value must be at least two. #' This is passed to \code{\link[cluster]{clusGap}}. #' @param ... (Optional). Additional named parameters #' passed on to \code{\link[cluster]{clusGap}}. #' For example, the \code{method} argument provides for extensive options #' regarding the method by which the ``optimal'' number of clusters #' is computed from the gap statistics (and their standard deviations). #' See the \code{\link[cluster]{clusGap}} documentation for more details. #' #' @return #' An object of S3 class \code{"clusGap"}, basically a list with components. #' See the \code{\link[cluster]{clusGap}} documentation for more details. #' #' @importFrom vegan scores #' @importFrom cluster clusGap #' @importFrom cluster pam #' @export #' @examples #' data("soilrep") #' sord = ordinate(soilrep, "PCoA", "bray") #' # Evaluate axes with scree plot #' plot_scree(sord) #' # Gap Statistic #' gs = gapstat_ord(sord, axes=1:3, verbose=FALSE) #' # plot_ordination(soilrep, sord, color="Treatment") #' plot_clusgap(gs) #' print(gs, method="Tibs2001SEmax") gapstat_ord = function(ord, axes=c(1:2), type="sites", FUNcluster=function(x, k){list(cluster = pam(x, k, cluster.only=TRUE))}, K.max=8, ...){ # # Use the scores function to get the ordination coordinates x = scores(ord, display=type) # If axes not explicitly defined (NULL), then use all of them if(is.null(axes)){ axes = 1:ncol(x) } # Finally, perform, and return, the gap statistic calculation using # cluster::clusGap return(clusGap(x[, axes], FUNcluster, K.max, ...)) } ################################################################################ # Define an internal function for accessing and orienting the OTU table # in a fashion suitable for vegan functions # @keywords internal veganifyOTU <- function(physeq){ if(taxa_are_rows(physeq)){physeq <- t(physeq)} return(as(otu_table(physeq), "matrix")) } ################################################################################ #' Constrained Analysis of Principal Coordinates, \code{\link[vegan]{capscale}}. #' #' See \code{\link[vegan]{capscale}} for details. A formula is main input. #' #' @param physeq (Required). Phylogenetic sequencing data #' (\code{\link{phyloseq-class}}). #' The data on which you want to perform the ordination. #' #' @param formula (Required). A \code{\link{formula}}, specifying the input. #' No need to directly access components. \code{capscale.phyloseq} understands #' where to find the abundance table (LHS) and \code{\link{sample_data}} (RHS) #' from within the phyloseq object. #' #' @param distance (Required). A \code{\link{character}} string, specifying #' the name of the dissimilarity (or distance) method supported by #' the phyloseq \code{\link[phyloseq]{distance}} function. #' Alternatively, a pre-computed \code{\link{dist}}-object can be provided here, #' in which case it supersedes any use of the \code{\link{otu_table}} #' in your phyloseq object. #' #' Note that \code{\link[vegan]{capscale}} #' with Euclidean distances will be identical to \code{\link[vegan]{rda}} #' in eigenvalues and in site, species, and biplot scores #' (except for possible sign reversal). However, it makes no sense to use #' \code{\link[vegan]{capscale}} with Euclidean distances, #' since direct use of \code{\link[vegan]{rda}} is much more efficient #' (and supported in the \code{\link{ordinate}} function with \code{method=="RDA"}) #' Even with non-Euclidean dissimilarities, #' the rest of the analysis will be metric and linear. #' #' @param ... (Optional). Additional named arguments passed to #' \code{\link[vegan]{capscale}}. #' #' @return Ordination object defined by \code{\link[vegan]{capscale}}. #' #' @seealso #' \code{\link{plot_ordination}} #' #' \code{\link[vegan]{rda}} #' #' \code{\link[vegan]{capscale}} #' #' @aliases capscale.phyloseq #' @rdname capscale-phyloseq-methods #' @docType methods #' @importFrom vegan capscale #' @keywords internal #' @examples #' # See other examples at #' # http://joey711.github.io/phyloseq/plot_ordination-examples #' data(GlobalPatterns) #' GP = prune_taxa(names(sort(taxa_sums(GlobalPatterns), TRUE)[1:50]), GlobalPatterns) #' ordcap = ordinate(GP, "CAP", "bray", ~SampleType) #' plot_ordination(GP, ordcap, "samples", color="SampleType") setGeneric("capscale.phyloseq", function(physeq, formula, distance, ...){ data = data.frame(sample_data(physeq, FALSE), stringsAsFactors=FALSE) if( length(data) < 1 ){ stop("`physeq` argument must include non-empty `sample_data`") } standardGeneric("capscale.phyloseq") }) #' @importFrom vegan capscale #' @aliases capscale.phyloseq,phyloseq,formula,dist-method #' @rdname capscale-phyloseq-methods setMethod("capscale.phyloseq", c("phyloseq", "formula", "dist"), function(physeq, formula, distance, ...){ data = data.frame(sample_data(physeq), stringsAsFactors=FALSE) # Convert formula to character vector, compute on language. formchar = as.character(formula) newFormula = as.formula(paste0("distance ~ ", formchar[length(formchar)])) return(capscale(formula=newFormula, data=data, ...)) }) #' @importFrom vegan capscale #' @aliases capscale.phyloseq,phyloseq,formula,character-method #' @rdname capscale-phyloseq-methods setMethod("capscale.phyloseq", c("phyloseq", "formula", "character"), function(physeq, formula, distance, ...){ data = data.frame(sample_data(physeq), stringsAsFactors=FALSE) # The goal here is to process the distance identifier string # and dispatch accordingly. if( length(distance) != 1 ){ warning("`distance` was unexpected length. \n", " `distance` argument should be a single character string", " or dist matrix. \n", "Attempting to use first element only.") } distance <- distance[1] if(!distance %in% unlist(distanceMethodList)){ # distance must be among the supported distance options # (which is a superset of vegdist). stop("The distance method you specified is not supported by phyloseq") } # Convert formula to character vector, compute on language. formchar = as.character(formula) if(distance %in% distanceMethodList$vegdist){ # If it is among the vegdist distances, pass it along to vegan::capscale OTU = veganifyOTU(physeq) newFormula = as.formula(paste0("OTU ~ ", formchar[length(formchar)])) return(capscale(formula=newFormula, data=data, distance=distance, ...)) } else { # Else calculate the distance matrix here, and dispatch. distance <- distance(physeq=physeq, method=distance, type="samples") return(capscale.phyloseq(physeq, formula, distance, ...)) } }) ################################################################################ phyloseq/R/otuTable-class.R0000644000175400017540000001221713175714136016665 0ustar00biocbuildbiocbuild################################################################################ #' Build or access the otu_table. #' #' This is the suggested method for both constructing and accessing #' Operational Taxonomic Unit (OTU) abundance (\code{\link{otu_table-class}}) objects. #' When the first #' argument is a matrix, otu_table() will attempt to create and return an #' otu_table-class object, #' which further depends on whether or not \code{taxa_are_rows} is provided as an #' additional argument. #' Alternatively, if the first argument is an experiment-level (\code{\link{phyloseq-class}}) #' object, then the corresponding \code{otu_table} is returned. #' #' @usage otu_table(object, taxa_are_rows, errorIfNULL=TRUE) #' #' @param object (Required). An integer matrix, \code{\link{otu_table-class}}, #' or \code{\link{phyloseq-class}}. #' #' @param taxa_are_rows (Conditionally optional). Logical; of length 1. Ignored #' unless \code{object} is a matrix, in which case it is is required. #' #' @param errorIfNULL (Optional). Logical. Should the accessor stop with #' an error if the slot is empty (\code{NULL})? Default \code{TRUE}. Ignored #' if \code{object} argument is a matrix (constructor invoked instead). #' #' @return An \code{\link{otu_table-class}} object. #' #' @seealso \code{\link{phy_tree}}, \code{\link{sample_data}}, \code{\link{tax_table}} #' \code{\link{phyloseq}}, \code{\link{merge_phyloseq}} #' #' @docType methods #' @rdname otu_table-methods #' @export #' @examples # #' # data(GlobalPatterns) #' # otu_table(GlobalPatterns) setGeneric("otu_table", function(object, taxa_are_rows, errorIfNULL=TRUE){ standardGeneric("otu_table") }) # Access the otu_table slot. #' @aliases otu_table,phyloseq-method #' @rdname otu_table-methods setMethod("otu_table", "phyloseq", function(object, errorIfNULL=TRUE){ access(object, "otu_table", errorIfNULL) }) # return the otu_table as-is. #' @aliases otu_table,otu_table-method #' @rdname otu_table-methods setMethod("otu_table", "otu_table", function(object, errorIfNULL=TRUE){ return(object) }) # Instantiate an otu_table from a raw abundance matrix. #' @aliases otu_table,matrix-method #' @rdname otu_table-methods setMethod("otu_table", "matrix", function(object, taxa_are_rows){ # instantiate first to check validity otutab <- new("otu_table", object, taxa_are_rows=taxa_are_rows) # Want dummy species/sample index names if missing if(taxa_are_rows){ if(is.null(rownames(otutab))){ rownames(otutab) <- paste("sp", 1:nrow(otutab), sep="") } if(is.null(colnames(otutab))){ colnames(otutab) <- paste("sa", 1:ncol(otutab), sep="") } } else { if(is.null(rownames(otutab))){ rownames(otutab) <- paste("sa",1:nrow(otutab),sep="") } if(is.null(colnames(otutab))){ colnames(otutab) <- paste("sp",1:ncol(otutab),sep="") } } return(otutab) }) # # # Convert to matrix, then dispatch. #' @aliases otu_table,data.frame-method #' @rdname otu_table-methods setMethod("otu_table", "data.frame", function(object, taxa_are_rows){ otu_table(as(object, "matrix"), taxa_are_rows) }) # Any less-specific class, not inherited by those above. #' @aliases otu_table,ANY-method #' @rdname otu_table-methods setMethod("otu_table", "ANY", function(object, errorIfNULL=TRUE){ access(object, "otu_table", errorIfNULL) }) ################################################################################ #' Returns the total number of individuals observed from each species/taxa/OTU. #' #' A convenience function equivalent to rowSums or colSums, but where #' the orientation of the otu_table is automatically handled. #' #' @usage taxa_sums(x) #' #' @param x \code{\link{otu_table-class}}, or \code{\link{phyloseq-class}}. #' #' @return A \code{\link{numeric-class}} with length equal to the number of species #' in the table, name indicated the taxa ID, and value equal to the sum of #' all individuals observed for each taxa in \code{x}. #' #' @seealso \code{\link{sample_sums}}, \code{\link{rowSums}}, \code{\link{colSums}} #' @export #' @examples #' data(enterotype) #' taxa_sums(enterotype) #' data(esophagus) #' taxa_sums(esophagus) taxa_sums <- function(x){ x <- otu_table(x) if( taxa_are_rows(x) ){ rowSums(x) } else { colSums(x) } } ################################################################################ #' Returns the total number of individuals observed from each sample. #' #' A convenience function equivalent to rowSums or colSums, but where #' the orientation of the otu_table is automatically handled. #' #' @usage sample_sums(x) #' #' @param x \code{\link{otu_table-class}}, or \code{\link{phyloseq-class}}. #' #' @return A named \code{\link{numeric-class}} #' length equal to the number of samples #' in the \code{x}, name indicating the sample ID, and value equal to the sum of #' all individuals observed for each sample in \code{x}. #' #' @seealso \code{\link{taxa_sums}}, \code{\link{rowSums}}, \code{\link{colSums}} #' @export #' @examples #' data(enterotype) #' sample_sums(enterotype) #' data(esophagus) #' sample_sums(esophagus) sample_sums <- function(x){ x <- otu_table(x) if( taxa_are_rows(x) ){ colSums(x) } else { rowSums(x) } } ################################################################################ phyloseq/R/phylo-class.R0000644000175400017540000000127713177706002016240 0ustar00biocbuildbiocbuild# Methods related to using phylo in phyloseq, including # phyloseq-internal calls to ape internals. ################################################################################ #' Method for fixing problems with phylo-class trees in phyloseq #' #' For now this only entails replacing each missing (\code{NA}) branch-length #' value with 0.0. #' #' @keywords internal setGeneric("fix_phylo", function(tree) standardGeneric("fix_phylo") ) #' @rdname fix_phylo #' @aliases fix_phylo,phylo-method setMethod("fix_phylo", "phylo", function(tree){ tree$edge.length[which(is.na(tree$edge.length))] <- 0 return(tree) }) ################################################################################ phyloseq/R/phyloseq-class.R0000644000175400017540000003727513175714136016765 0ustar00biocbuildbiocbuild################################################################################ #' Build phyloseq-class objects from their components. #' #' \code{phyloseq()} is a constructor method, This is the main method #' suggested for constructing an experiment-level (\code{\link{phyloseq-class}}) #' object from its component data #' (component data classes: \code{\link{otu_table-class}}, \code{\link{sample_data-class}}, #' \code{\link{taxonomyTable-class}}, \code{\link{phylo-class}}). #' #' @usage phyloseq(...) #' #' @param ... One or more component objects among the set of classes #' defined by the phyloseq package, as well as \code{phylo}-class #' (defined by the \code{\link{ape-package}}). Each argument should be a different class. #' For combining multiple components of the same class, or multiple phyloseq-class #' objects, use the \code{\link{merge_phyloseq}} function. Unlike in earlier #' versions, the arguments to phyloseq do not need to be named, and the order #' of the arguments does not matter. #' #' @return The class of the returned object depends on the argument #' class(es). For an experiment-level object, two or more component data objects #' must be provided. #' Otherwise, if a single component-class #' is provided, it is simply returned as-is. #' The order of arguments does not matter. #' #' @seealso \code{\link{merge_phyloseq}} #' @export #' @examples #' data(esophagus) #' x1 = phyloseq(otu_table(esophagus), phy_tree(esophagus)) #' identical(x1, esophagus) #' # # data(GlobalPatterns) #' # # GP <- GlobalPatterns #' # # phyloseq(sample_data(GP), otu_table(GP)) #' # # phyloseq(otu_table(GP), phy_tree(GP)) #' # # phyloseq(tax_table(GP), otu_table(GP)) #' # # phyloseq(phy_tree(GP), otu_table(GP), sample_data(GP)) #' # # phyloseq(otu_table(GP), tax_table(GP), sample_data(GP)) #' # # phyloseq(otu_table(GP), phy_tree(GP), tax_table(GP), sample_data(GP)) phyloseq <- function(...){ arglist <- list(...) # Remove names from arglist. Will replace them based on their class names(arglist) <- NULL # ignore all but component data classes. arglist <- arglist[sapply(arglist, is.component.class)] # Make the name-replaced, splatted list splatlist <- sapply(arglist, splat.phyloseq.objects) # rm any forbidden chars in index names (e.g. quotes - phylogenetic tree). # Right now, only extra quotes are forbidden. splatlist = lapply(splatlist, function(x){ taxa_names(x) <- gsub("\"", "", taxa_names(x), fixed=TRUE) taxa_names(x) <- gsub("\'", "", taxa_names(x), fixed=TRUE) return(x) }) #################### ## Need to determine whether to # (A) instantiate a new raw/uncleaned phyloseq object, or # (B) return a single component, or # (C) to stop with an error because of incorrect argument types. if( length(splatlist) > length(get.component.classes()) ){ stop("Too many components provided\n") } else if( length(names(splatlist)) > length(unique(names(splatlist))) ){ stop("Only one of each component type allowed.\n", "For merging multiple objects of the same type/class, try merge_phyloseq(...)\n") } else if( length(splatlist) == 1){ return(arglist[[1]]) } else { # Instantiate the phyloseq-class object, ps. ps <- do.call("new", c(list(Class="phyloseq"), splatlist) ) } #################### ## Reconcile the taxa and sample index names between components ## in the newly-minted phyloseq object shared_taxa = intersect_taxa(ps) shared_samples = intersect_samples(ps) if( length(shared_taxa) < 1 ){ stop("Problem with OTU/taxa indices among those you provided.\n", "Check using intersect() and taxa_names()\n" ) } if( length(shared_samples) < 1 ){ stop("Problem with sample indices among those you provided.\n", "Check using intersect() and taxa_names()\n" ) } # Start with OTU indices ps = prune_taxa(shared_taxa, ps) # Verify there is more than one component # that describes samples before attempting to reconcile. ps = prune_samples(shared_samples, ps) # Force both samples and taxa indices to be in the same order. ps = index_reorder(ps, "both") # Replace any NA branch-length values in the tree with zero. if( !is.null(phy_tree(ps, FALSE)) ){ ps@phy_tree <- fix_phylo(ps@phy_tree) } return(ps) } ################################################################################ # A relatively fast way to access from phyloseq object components # f - function name as character string # physeq - a phyloseq object (phyloseq-class instance) #' @keywords internal f_comp_ps = function(f, physeq){ sapply(names(getSlots("phyloseq")), function(i, ps){ eval(parse(text=paste(f, "(ps@", i, ")", sep=""))) }, physeq) } # f_comp_ps("taxa_names", ps) # f_comp_ps("ntaxa", ps) # Reduce("union", f_comp_ps("taxa_names", ps)) # Reduce("intersect", f_comp_ps("taxa_names", ps)) ################################################################################ #' Show the component objects classes and slot names. #' #' There are no arguments to this function. It returns a named character #' when called, which can then be used for tests of component data types, etc. #' #' @usage get.component.classes() #' #' @return a character vector of the component objects classes, where each #' element is named by the corresponding slot name in the phyloseq-class. #' #' @keywords internal #' #' @examples # #' #get.component.classes() get.component.classes <- function(){ # define classes vector component.classes <- c("otu_table", "sample_data", "phylo", "taxonomyTable", "XStringSet") # the names of component.classes needs to be the slot names to match getSlots / splat names(component.classes) <- c("otu_table", "sam_data", "phy_tree", "tax_table", "refseq") return(component.classes) } # Explicitly define components/slots that describe taxa. #' @keywords internal taxa.components = function(){ # define classes vector component.classes <- c("otu_table", "phylo", "taxonomyTable", "XStringSet") # the names of component.classes needs to be the slot names to match getSlots / splat names(component.classes) <- c("otu_table", "phy_tree", "tax_table", "refseq") return(component.classes) } # Explicitly define components/slots that describe samples. #' @keywords internal sample.components = function(){ # define classes vector component.classes <- c("otu_table", "sample_data") # the names of component.classes needs to be the slot names to match getSlots / splat names(component.classes) <- c("otu_table", "sam_data") return(component.classes) } # Returns TRUE if x is a component class, FALSE otherwise. # This shows up over and over again in data infrastructure #' @keywords internal is.component.class = function(x){ inherits(x, get.component.classes()) } ################################################################################ #' Convert \code{\link{phyloseq-class}} into a named list of its non-empty components. #' #' This is used in internal handling functions, and one of its key features #' is that the names in the returned-list match the slot-names, which is useful #' for constructing calls with language-computing functions like \code{\link{do.call}}. #' Another useful aspect is that it only returns the contents of non-empty slots. #' In general, this should only be used by phyloseq-package developers. Standard #' users should not need or use this function, and should use the accessors and #' other tools that leave the multi-component object in one piece. #' #' @usage splat.phyloseq.objects(x) #' #' @param x A \code{\link{phyloseq-class}} object. Alternatively, a component #' data object will work, resulting in named list of length 1. #' #' @return A named list, where each element is a component object that was contained #' in the argument, \code{x}. Each element is named according to its slot-name in #' the phyloseq-object from which it is derived. #' If \code{x} is already a component data object, #' then a list of length (1) is returned, also named. #' #' @seealso merge_phyloseq #' @keywords internal #' @examples # splat.phyloseq.objects <- function(x){ if( is.component.class(x) ){ # Check if class of x is among the component classes already (not phyloseq-class) splatx <- list(x) names(splatx) <- names(which(sapply(get.component.classes(), function(cclass, x) inherits(x, cclass), x))) } else if( inherits(x, "phyloseq") ){ # Else, check if it inherits from phyloseq, and if-so splat slotnames = names(getSlots("phyloseq")) allslots = sapply(slotnames, function(i, x){access(x, i, FALSE)}, x) splatx = allslots[!sapply(allslots, is.null)] } else { # Otherwise, who knows what it is, silently return NULL. return(NULL) } return(splatx) } ################################################################################ #' Return the non-empty slot names of a phyloseq object. #' #' Like \code{\link{getSlots}}, but returns the class name if argument #' is component data object. #' #' @usage getslots.phyloseq(physeq) #' #' @param physeq A \code{\link{phyloseq-class}} object. If \code{physeq} is a component #' data class, then just returns the class of \code{physeq}. #' #' @return identical to getSlots. A named character vector of the slot classes #' of a particular S4 class, where each element is named by the slot name it #' represents. If \code{physeq} is a component data object, #' then a vector of length (1) is returned, named according to its slot name in #' the \code{\link{phyloseq-class}}. #' #' @seealso merge_phyloseq #' @export #' @examples # #' data(GlobalPatterns) #' getslots.phyloseq(GlobalPatterns) #' data(esophagus) #' getslots.phyloseq(esophagus) getslots.phyloseq = function(physeq){ names(splat.phyloseq.objects(physeq)) } ################################################################################ #' Universal slot accessor function for phyloseq-class. #' #' This function is used internally by many accessors and in #' many functions/methods that need to access a particular type of component data. #' If something is wrong, or the slot is missing, the expected behavior is that #' this function will return NULL. Thus, the output can be tested by #' \code{\link{is.null}} as verification of the presence of a particular #' data component. Unlike the component-specific accessors (e.g. \code{\link{otu_table}}, #' or \code{\link{phy_tree}}), #' the default behavior is not to stop with an error if the desired slot is empty. #' In all cases this is controlled by the \code{errorIfNULL} argument, which can #' be set to \code{TRUE} if an error is desired. #' #' @usage access(physeq, slot, errorIfNULL=FALSE) #' #' @param physeq (Required). \code{\link{phyloseq-class}}. #' #' @param slot (Required). A character string indicating the slot (not data class) #' of the component data type that is desired. #' #' @param errorIfNULL (Optional). Logical. Should the accessor stop with #' an error if the slot is empty (\code{NULL})? Default \code{FALSE}. #' #' @return Returns the component object specified by the argument \code{slot}. #' Returns NULL if slot does not exist. Returns \code{physeq} as-is #' if it is a component class that already matches the slot name. #' #' @seealso \code{\link{getslots.phyloseq}}, \code{\link{merge_phyloseq}} #' @export #' @examples # #' ## data(GlobalPatterns) #' ## access(GlobalPatterns, "tax_table") #' ## access(GlobalPatterns, "phy_tree") #' ## access(otu_table(GlobalPatterns), "otu_table") #' ## # Should return NULL: #' ## access(otu_table(GlobalPatterns), "sample_data") #' ## access(otuTree(GlobalPatterns), "sample_data") #' ## access(otuSam(GlobalPatterns), "phy_tree") access <- function(physeq, slot, errorIfNULL=FALSE){ if( is.component.class(physeq) ){ # If physeq is a component class, might return as-is. Depends on slot. if( inherits(physeq, get.component.classes()[slot]) ){ # if slot-name matches, return physeq as-is. out = physeq } else { # If slot/component mismatch, set out to NULL. Test later if this is an error. out = NULL } } else if(!slot %in% slotNames(physeq) ){ # If slot is invalid, set out to NULL. Test later if this is an error. out = NULL } else { # By elimination, must be valid. Access slot out = eval(parse(text=paste("physeq@", slot, sep=""))) } if( errorIfNULL & is.null(out) ){ # Only error regarding a NULL return value if errorIfNULL is TRUE. stop(slot, " slot is empty.") } return(out) } ################################################################################ #' Returns the intersection of species and samples for the components of x #' #' This function is used internally as part of the infrastructure to ensure that #' component data types in a phyloseq-object have exactly the same taxa/species. #' It relies heavily on the \code{\link{Reduce}} function to determine the #' strictly common species. #' #' @usage intersect_taxa(x) #' #' @param x (Required). A \code{\link{phyloseq-class}} object #' that contains 2 or more components #' that in-turn describe species/taxa. #' #' @return Returns a character vector of only those species that are present in #' all species-describing components of \code{x}. #' #' @seealso \code{\link{Reduce}}, \code{\link{intersect}} #' @keywords internal #' @examples # #' ## data(GlobalPatterns) #' ## head(intersect_taxa(GlobalPatterns), 10) intersect_taxa <- function(x){ taxa_vectors = f_comp_ps("taxa_names", x) taxa_vectors = taxa_vectors[!sapply(taxa_vectors, is.null)] return( Reduce("intersect", taxa_vectors) ) } #' @keywords internal intersect_samples <- function(x){ sample_vectors = f_comp_ps("sample_names", x) sample_vectors = sample_vectors[!sapply(sample_vectors, is.null)] return( Reduce("intersect", sample_vectors) ) } ################################################################################ #' Force index order of phyloseq objects #' #' @usage index_reorder(ps, index_type) #' #' @param ps (Required). A \code{\link{phyloseq-class}} instance. #' @param index_type (Optional). A character string #' specifying the indices to properly order. #' Supported values are \code{c("both", "taxa", "samples")}. #' Default is \code{"both"}, meaning samples and taxa indices #' will be checked/re-ordered. #' #' @keywords internal #' @docType methods #' #' @examples #' ## data("GlobalPatterns") #' ## GP = index_reorder(GlobalPatterns) setGeneric("index_reorder", function(ps, index_type) standardGeneric("index_reorder") ) #' @rdname index_reorder #' @aliases index_reorder,phyloseq-method setMethod("index_reorder", "phyloseq", function(ps, index_type="both"){ if( index_type %in% c("both", "taxa") ){ ## ENFORCE CONSISTENT ORDER OF TAXA INDICES. if( !is.null(phy_tree(ps, FALSE)) ){ # If there is a phylogenetic tree included, # re-order based on that, and reorder the otu_table # The new taxa order, torder, will also trickle down to # the taxonomyTable or XStringSet if present. torder = taxa_names(phy_tree(ps)) # Re-order the OTU table if( taxa_are_rows(ps) ){ ps@otu_table = otu_table(ps)[torder, ] } else { ps@otu_table = otu_table(ps)[, torder] } } else { # Else, re-order anything/everything else based on the OTU-table order torder = taxa_names(otu_table(ps)) } if( !is.null(tax_table(ps, FALSE)) ){ # If there is a taxonomyTable, re-order that too. ps@tax_table = tax_table(ps)[torder, ] } if( !is.null(refseq(ps, FALSE)) ){ # If there is a XStringSet, re-order that too. ps@refseq = refseq(ps)[torder] } } if( index_type %in% c("both", "samples") ){ ## ENFORCE CONSISTENT ORDER OF SAMPLE INDICES # Errors can creep when sample indices do not match. if( !is.null(sample_data(ps, FALSE)) ){ # check first that ps has sample_data if( !all(sample_names(otu_table(ps)) == rownames(sample_data(ps))) ){ # Reorder the sample_data rows so that they match the otu_table order. ps@sam_data <- sample_data(ps)[sample_names(otu_table(ps)), ] } } } return(ps) }) ################################################################################phyloseq/R/plot-methods.R0000644000175400017540000035731113177706002016424 0ustar00biocbuildbiocbuild# # extension of plot methods for phyloseq object. # ################################################################################ #' Generic plot defaults for phyloseq. #' #' There are many useful examples of phyloseq graphics functions in the #' \href{http://joey711.github.io/phyloseq}{phyloseq online tutorials}. #' The specific plot type is chosen according to available non-empty slots. #' This is mainly for syntactic convenience and quick-plotting. See links below #' for some examples of available graphics tools available in the #' \code{\link{phyloseq-package}}. #' #' @usage plot_phyloseq(physeq, ...) #' #' @param physeq (Required). \code{\link{phyloseq-class}}. The actual plot type #' depends on the available (non-empty) component data types contained within. #' #' @param ... (Optional). Additional parameters to be passed on to the respective #' specific plotting function. See below for different plotting functions that #' might be called by this generic plotting wrapper. #' #' @return A plot is created. The nature and class of the plot depends on #' the \code{physeq} argument, specifically, which component data classes #' are present. #' #' @seealso #' \href{http://joey711.github.io/phyloseq/tutorials-index.html}{phyloseq frontpage tutorials}. #' #' \code{\link{plot_ordination}} #' \code{\link{plot_heatmap}} #' \code{\link{plot_tree}} #' \code{\link{plot_network}} #' \code{\link{plot_bar}} #' \code{\link{plot_richness}} #' #' @export #' @docType methods #' @rdname plot_phyloseq-methods #' #' @examples #' data(esophagus) #' plot_phyloseq(esophagus) setGeneric("plot_phyloseq", function(physeq, ...){ standardGeneric("plot_phyloseq") }) #' @aliases plot_phyloseq,phyloseq-method #' @rdname plot_phyloseq-methods setMethod("plot_phyloseq", "phyloseq", function(physeq, ...){ if( all(c("otu_table", "sample_data", "phy_tree") %in% getslots.phyloseq(physeq)) ){ plot_tree(esophagus, color="samples") } else if( all(c("otu_table", "sample_data", "tax_table") %in% getslots.phyloseq(physeq) ) ){ plot_bar(physeq, ...) } else if( all(c("otu_table", "phy_tree") %in% getslots.phyloseq(physeq)) ){ plot_tree(esophagus, color="samples") } else { plot_richness(physeq) } }) ################################################################################ # For simplicity, the most common ggplot2 dependency functions/objects # will be imported only here. # Less-common functions will be listed in the roxygen header above those functions # but rarely will these common imports be re-listed elsewhere in other plot_ functions, # even though it is often good practice to do so. ################################################################################ #' Microbiome Network Plot using ggplot2 #' #' There are many useful examples of phyloseq network graphics in the #' \href{http://joey711.github.io/phyloseq/plot_network-examples}{phyloseq online tutorials}. #' A custom plotting function for displaying networks #' using advanced \code{\link[ggplot2]{ggplot}}2 formatting. #' The network itself should be represented using #' the \code{igraph} package. #' For the \code{\link{phyloseq-package}} it is suggested that the network object #' (argument \code{g}) #' be created using the #' \code{\link{make_network}} function, #' and based upon sample-wise or taxa-wise microbiome ecological distances #' calculated from a phylogenetic sequencing experiment #' (\code{\link{phyloseq-class}}). #' In this case, edges in the network are created if the distance between #' nodes is below a potentially arbitrary threshold, #' and special care should be given to considering the choice of this threshold. #' #' @usage plot_network(g, physeq=NULL, type="samples", #' color=NULL, shape=NULL, point_size=4, alpha=1, #' label="value", hjust = 1.35, #' line_weight=0.5, line_color=color, line_alpha=0.4, #' layout.method=layout.fruchterman.reingold, title=NULL) #' #' @param g (Required). An \code{igraph}-class object created #' either by the convenience wrapper \code{\link{make_network}}, #' or directly by the tools in the igraph-package. #' #' @param physeq (Optional). Default \code{NULL}. #' A \code{\link{phyloseq-class}} object on which \code{g} is based. #' #' @param type (Optional). Default \code{"samples"}. #' Whether the network represented in the primary argument, \code{g}, #' is samples or taxa/OTUs. #' Supported arguments are \code{"samples"}, \code{"taxa"}, #' where \code{"taxa"} indicates using the taxa indices, #' whether they actually represent species or some other taxonomic rank. #' #' @param color (Optional). Default \code{NULL}. #' The name of the sample variable in \code{physeq} to use for color mapping #' of points (graph vertices). #' #' @param shape (Optional). Default \code{NULL}. #' The name of the sample variable in \code{physeq} to use for shape mapping. #' of points (graph vertices). #' #' @param point_size (Optional). Default \code{4}. #' The size of the vertex points. #' #' @param alpha (Optional). Default \code{1}. #' A value between 0 and 1 for the alpha transparency of the vertex points. #' #' @param label (Optional). Default \code{"value"}. #' The name of the sample variable in \code{physeq} to use for #' labelling the vertex points. #' #' @param hjust (Optional). Default \code{1.35}. #' The amount of horizontal justification to use for each label. #' #' @param line_weight (Optional). Default \code{0.3}. #' The line thickness to use to label graph edges. #' #' @param line_color (Optional). Default \code{color}. #' The name of the sample variable in \code{physeq} to use for color mapping #' of lines (graph edges). #' #' @param line_alpha (Optional). Default \code{0.4}. #' The transparency level for graph-edge lines. #' #' @param layout.method (Optional). Default \code{layout.fruchterman.reingold}. #' A function (closure) that determines the placement of the vertices #' for drawing a graph. Should be able to take an \code{igraph}-class #' as sole argument, and return a two-column coordinate matrix with \code{nrow} #' equal to the number of vertices. For possible options already included in #' \code{igraph}-package, see the others also described in the help file: #' #' @param title (Optional). Default \code{NULL}. Character string. #' The main title for the graphic. #' #' \code{\link[igraph]{layout.fruchterman.reingold}} #' #' @return A \code{\link{ggplot}}2 plot representing the network, #' with optional mapping of variable(s) to point color or shape. #' #' @seealso #' \code{\link{make_network}} #' #' @references #' This code was adapted from a repo original hosted on GitHub by Scott Chamberlain: #' \url{https://github.com/SChamberlain/gggraph} #' #' The code most directly used/modified was first posted here: #' \url{http://www.r-bloggers.com/basic-ggplot2-network-graphs/} #' #' #' @import reshape2 #' @importFrom igraph layout.fruchterman.reingold #' @importFrom igraph get.edgelist #' @importFrom igraph get.vertex.attribute #' @importFrom igraph vcount #' @importFrom ggplot2 ggplot #' @importFrom ggplot2 aes_string #' @importFrom ggplot2 aes #' @importFrom ggplot2 geom_point #' @importFrom ggplot2 geom_text #' @importFrom ggplot2 geom_line #' @importFrom ggplot2 geom_path #' @importFrom ggplot2 theme #' @importFrom ggplot2 theme_bw #' @importFrom ggplot2 element_blank #' @importFrom ggplot2 ggtitle #' #' @export #' @examples #' #' data(enterotype) #' ig <- make_network(enterotype, max.dist=0.3) #' plot_network(ig, enterotype, color="SeqTech", shape="Enterotype", line_weight=0.3, label=NULL) #' # Change distance parameter #' ig <- make_network(enterotype, max.dist=0.2) #' plot_network(ig, enterotype, color="SeqTech", shape="Enterotype", line_weight=0.3, label=NULL) plot_network <- function(g, physeq=NULL, type="samples", color=NULL, shape=NULL, point_size=4, alpha=1, label="value", hjust = 1.35, line_weight=0.5, line_color=color, line_alpha=0.4, layout.method=layout.fruchterman.reingold, title=NULL){ if( vcount(g) < 2 ){ # Report a warning if the graph is empty stop("The graph you provided, `g`, has too few vertices. Check your graph, or the output of `make_network` and try again.") } # disambiguate species/OTU/taxa as argument type... if( type %in% c("taxa", "species", "OTUs", "otus", "otu") ){ type <- "taxa" } # Make the edge-coordinates data.frame edgeDF <- data.frame(get.edgelist(g)) edgeDF$id <- 1:length(edgeDF[, 1]) # Make the vertices-coordinates data.frame vertDF <- layout.method(g) colnames(vertDF) <- c("x", "y") vertDF <- data.frame(value=get.vertex.attribute(g, "name"), vertDF) # If phyloseq object provided, # AND it has the relevant additional data # THEN add it to vertDF if( !is.null(physeq) ){ extraData <- NULL if( type == "samples" & !is.null(sample_data(physeq, FALSE)) ){ extraData = data.frame(sample_data(physeq))[as.character(vertDF$value), , drop=FALSE] } else if( type == "taxa" & !is.null(tax_table(physeq, FALSE)) ){ extraData = data.frame(tax_table(physeq))[as.character(vertDF$value), , drop=FALSE] } # Only mod vertDF if extraData exists if( !is.null(extraData) ){ vertDF <- data.frame(vertDF, extraData) } } # Combine vertex and edge coordinate data.frames graphDF <- merge(reshape2::melt(edgeDF, id="id"), vertDF, by = "value") # Initialize the ggplot p <- ggplot(vertDF, aes(x, y)) # Strip all the typical annotations from the plot, leave the legend p <- p + theme_bw() + theme( panel.grid.major = element_blank(), panel.grid.minor = element_blank(), axis.text.x = element_blank(), axis.text.y = element_blank(), axis.title.x = element_blank(), axis.title.y = element_blank(), axis.ticks = element_blank(), panel.border = element_blank() ) # Add the graph vertices as points p <- p + geom_point(aes_string(color=color, shape=shape), size=point_size, na.rm=TRUE) # Add the text labels if( !is.null(label) ){ p <- p + geom_text(aes_string(label=label), size = 2, hjust=hjust, na.rm=TRUE) } # Add the edges: p <- p + geom_line(aes_string(group="id", color=line_color), graphDF, size=line_weight, alpha=line_alpha, na.rm=TRUE) # Optionally add a title to the plot if( !is.null(title) ){ p <- p + ggtitle(title) } return(p) } ################################################################################ #' Microbiome Network Plot using ggplot2 #' #' There are many useful examples of phyloseq network graphics in the #' \href{http://joey711.github.io/phyloseq/plot_net-examples}{phyloseq online tutorials}. #' A custom plotting function for displaying networks #' using advanced \code{\link[ggplot2]{ggplot}}2 formatting. #' Note that this function is a performance and interface revision to #' \code{\link{plot_network}}, which requires an \code{\link[igraph]{igraph}} #' object as its first argument. #' This new function is more in-line with other #' \code{plot_*} functions in the \code{\link{phyloseq-package}}, in that its #' first/main argument is a \code{\link{phyloseq-class}} instance. #' Edges in the network are created if the distance between #' nodes is below a (potentially arbitrary) threshold, #' and special care should be given to considering the choice of this threshold. #' However, network line thickness and opacity is scaled according to the #' similarity of vertices (either samples or taxa), #' helping to temper, somewhat, the effect of the threshold. #' Also note that the choice of network layout algorithm can have a large effect #' on the impression and interpretability of the network graphic, #' and you may want to familiarize yourself with some of these options #' (see the \code{laymeth} argument). #' #' @param physeq (Required). #' The \code{\link{phyloseq-class}} object that you want to represent as a network. #' #' @param distance (Optional). Default is \code{"bray"}. #' Can be either a distance method supported by \code{\link[phyloseq]{distance}}, #' or an already-computed \code{\link{dist}}-class with labels that match #' the indices implied by both the \code{physeq} and \code{type} arguments #' (that is, either sample or taxa names). #' If you used \code{\link[phyloseq]{distance}} to pre-calculate your \code{\link{dist}}ance, #' and the same \code{type} argument as provided here, then they will match. #' #' @param maxdist (Optional). Default \code{0.7}. #' The maximum distance value between two vertices #' to connect with an edge in the graphic. #' #' @param type (Optional). Default \code{"samples"}. #' Whether the network represented in the primary argument, \code{g}, #' is samples or taxa/OTUs. #' Supported arguments are \code{"samples"}, \code{"taxa"}, #' where \code{"taxa"} indicates using the taxa indices, #' whether they actually represent species or some other taxonomic rank. #' #' @param laymeth (Optional). Default \code{"fruchterman.reingold"}. #' A character string that indicates the method that will determine #' the placement of vertices, typically based on conectedness of vertices #' and the number of vertices. #' This is an interesting topic, and there are lots of options. #' See \code{\link{igraph-package}} for related topics in general, #' and see \code{\link[igraph]{layout.auto}} for descriptions of various #' alternative layout method options supported here. #' The character string argument should match exactly the #' layout function name with the \code{"layout."} omitted. #' Try \code{laymeth="list"} to see a list of options. #' #' @param color (Optional). Default \code{NULL}. #' The name of the sample variable in \code{physeq} to use for color mapping #' of points (graph vertices). #' #' @param shape (Optional). Default \code{NULL}. #' The name of the sample variable in \code{physeq} to use for shape mapping. #' of points (graph vertices). #' #' @param rescale (Optional). Logical. Default \code{FALSE}. #' Whether to rescale the distance values to be \code{[0, 1]}, in which the #' min value is close to zero and the max value is 1. #' #' @param point_size (Optional). Default \code{5}. #' The size of the vertex points. #' #' @param point_alpha (Optional). Default \code{1}. #' A value between 0 and 1 for the alpha transparency of the vertex points. #' #' @param point_label (Optional). Default \code{NULL}. #' The variable name in \code{physeq} covariate data to map to vertex labels. #' #' @param hjust (Optional). Default \code{1.35}. #' The amount of horizontal justification to use for each label. #' #' @param title (Optional). Default \code{NULL}. Character string. #' The main title for the graphic. #' #' @return A \code{\link{ggplot}}2 network plot. #' Will render to default graphic device automatically as print side effect. #' Can also be saved, further manipulated, or rendered to #' a vector or raster file using \code{\link{ggsave}}. #' #' @seealso #' Original network plotting functions: #' #' \code{\link{make_network}} #' #' \code{\link{plot_network}} #' #' #' @import reshape2 #' #' @importFrom data.table data.table #' @importFrom data.table copy #' #' @importFrom igraph layout.auto #' @importFrom igraph layout.random #' @importFrom igraph layout.circle #' @importFrom igraph layout.sphere #' @importFrom igraph layout.fruchterman.reingold #' @importFrom igraph layout.kamada.kawai #' @importFrom igraph layout.spring #' @importFrom igraph layout.reingold.tilford #' @importFrom igraph layout.fruchterman.reingold.grid #' @importFrom igraph layout.lgl #' @importFrom igraph layout.graphopt #' @importFrom igraph layout.svd #' @importFrom igraph graph.data.frame #' @importFrom igraph get.vertex.attribute #' #' @importFrom ggplot2 geom_segment #' @importFrom ggplot2 scale_alpha #' @importFrom ggplot2 scale_size #' #' @export #' @examples #' data(enterotype) #' plot_net(enterotype, color="SeqTech", maxdist = 0.3) #' plot_net(enterotype, color="SeqTech", maxdist = 0.3, laymeth = "auto") #' plot_net(enterotype, color="SeqTech", maxdist = 0.3, laymeth = "svd") #' plot_net(enterotype, color="SeqTech", maxdist = 0.3, laymeth = "circle") #' plot_net(enterotype, color="SeqTech", shape="Enterotype", maxdist = 0.3, laymeth = "circle") plot_net <- function(physeq, distance="bray", type="samples", maxdist = 0.7, laymeth="fruchterman.reingold", color=NULL, shape=NULL, rescale=FALSE, point_size=5, point_alpha=1, point_label=NULL, hjust = 1.35, title=NULL){ # Supported layout methods available_layouts = list( auto = layout.auto, random = layout.random, circle = layout.circle, sphere = layout.sphere, fruchterman.reingold = layout.fruchterman.reingold, kamada.kawai = layout.kamada.kawai, spring = layout.spring, reingold.tilford = layout.reingold.tilford, fruchterman.reingold.grid = layout.fruchterman.reingold.grid, lgl = layout.lgl, graphopt = layout.graphopt, svd = layout.svd ) if(laymeth=="list"){ return(names(available_layouts)) } if(!laymeth %in% names(available_layouts)){ stop("Unsupported argument to `laymeth` option. Please use an option returned by `plot_net(laymeth='list')`") } # 1. # Calculate Distance if( inherits(distance, "dist") ){ # If distance a distance object, use it rather than re-calculate Distance <- distance # Check that it at least has (a subset of) the correct labels possibleVertexLabels = switch(type, taxa=taxa_names(physeq), samples=sample_names(physeq)) if( !all(attributes(distance)$Labels %in% possibleVertexLabels) ){ stop("Some or all `distance` index labels do not match ", type, " names in `physeq`") } } else { # Coerce to character and attempt distance calculation scaled_distance = function(physeq, method, type, rescale=TRUE){ Dist = distance(physeq, method, type) if(rescale){ # rescale the distance matrix to be [0, 1] Dist <- Dist / max(Dist, na.rm=TRUE) Dist <- Dist - min(Dist, na.rm=TRUE) } return(Dist) } distance <- as(distance[1], "character") Distance = scaled_distance(physeq, distance, type, rescale) } # 2. # Create edge data.table dist_to_edge_table = function(Dist, MaxDistance=NULL, vnames = c("v1", "v2")){ dmat <- as.matrix(Dist) # Set duplicate entries and self-links to Inf dmat[upper.tri(dmat, diag = TRUE)] <- Inf LinksData = data.table(reshape2::melt(dmat, varnames=vnames, as.is = TRUE)) setnames(LinksData, old = "value", new = "Distance") # Remove self-links and duplicate links LinksData <- LinksData[is.finite(Distance), ] # Remove entries above the threshold, MaxDistance if(!is.null(MaxDistance)){ LinksData <- LinksData[Distance < MaxDistance, ] } return(LinksData) } LinksData0 = dist_to_edge_table(Distance, maxdist) # 3. Create vertex layout # Make the vertices-coordinates data.table vertex_layout = function(LinksData, physeq=NULL, type="samples", laymeth=igraph::layout.fruchterman.reingold, ...){ # `physeq` can be anything, only has effect when non-NULL returned by sample_data or tax_table g = igraph::graph.data.frame(LinksData, directed=FALSE) vertexDT = data.table(laymeth(g, ...), vertex=get.vertex.attribute(g, "name")) setkeyv(vertexDT, "vertex") setnames(vertexDT, old = c(1, 2), new = c("x", "y")) extraData = NULL if( type == "samples" & !is.null(sample_data(physeq, FALSE)) ){ extraData <- data.table(data.frame(sample_data(physeq)), key = "rn", keep.rownames = TRUE) } else if( type == "taxa" & !is.null(tax_table(physeq, FALSE)) ){ extraData <- data.table(as(tax_table(physeq), "matrix"), key = "rn", keep.rownames = TRUE) } # Only mod vertexDT if extraData exists if(!is.null(extraData)){ # Join vertexDT, extraData by vertex setnames(extraData, old = "rn", new = "vertex") setkeyv(vertexDT, "vertex") setkeyv(extraData, "vertex") vertexDT <- copy(vertexDT[extraData]) vertexDT <- vertexDT[!is.na(x), ] } return(vertexDT) } vertexDT = vertex_layout(LinksData0, physeq, type, available_layouts[[laymeth]]) # 4. # Update the links layout for ggplot: x, y, xend, yend link_layout = function(LinksData, vertexDT){ linkstart = copy(vertexDT[LinksData$v1, x, y]) linkend = copy(vertexDT[LinksData$v2, x, y]) setnames(linkend, old = c("y", "x"), new = c("yend", "xend")) LinksData <- copy(cbind(LinksData, linkstart, linkend)) return(LinksData) } LinksData = link_layout(LinksData0, vertexDT) # 5. # Define ggplot2 network plot p = ggplot(data=LinksData) + geom_segment(mapping = aes(x, y, xend = xend, yend = yend, size = Distance, alpha = Distance)) + geom_point(mapping = aes_string(x="x", y="y", color = color, shape = shape), data = vertexDT, size = point_size, alpha = point_alpha, na.rm = TRUE) + scale_alpha(range = c(1, 0.1)) + scale_size(range = c(2, 0.25)) # Add labels if(!is.null(point_label)){ p <- p + geom_text(aes_string(x="x", y="y", label=point_label), data = vertexDT, size = 2, hjust = hjust, na.rm = TRUE) } # Add default theme net_theme = theme( panel.grid.major = element_blank(), panel.grid.minor = element_blank(), axis.text.x = element_blank(), axis.text.y = element_blank(), axis.title.x = element_blank(), axis.title.y = element_blank(), axis.ticks = element_blank(), panel.border = element_blank() ) p <- p + theme_bw() + net_theme return(p) } ################################################################################ #' Plot alpha diversity, flexibly with ggplot2 #' #' There are many useful examples of alpha-diversity graphics in the #' \href{http://joey711.github.io/phyloseq/plot_richness-examples}{phyloseq online tutorials}. #' This function estimates a number of alpha-diversity metrics using the #' \code{\link{estimate_richness}} function, #' and returns a \code{ggplot} plotting object. #' The plot generated by this function will include every sample #' in \code{physeq}, but they can be further grouped on the horizontal axis #' through the argument to \code{x}, #' and shaded according to the argument to \code{color} (see below). #' You must use untrimmed, non-normalized count data for meaningful results, #' as many of these estimates are highly dependent on the number of singletons. #' You can always trim the data later on if needed, #' just not before using this function. #' #' NOTE: Because this plotting function incorporates the output from #' \code{\link{estimate_richness}}, the variable names of that output should #' not be used as \code{x} or \code{color} (even if it works, the resulting #' plot might be kindof strange, and not the intended behavior of this function). #' The following are the names you will want to avoid using in \code{x} or \code{color}: #' #' \code{c("Observed", "Chao1", "ACE", "Shannon", "Simpson", "InvSimpson", "Fisher")}. #' #' @param physeq (Required). \code{\link{phyloseq-class}}, or alternatively, #' an \code{\link{otu_table-class}}. The data about which you want to estimate. #' #' @param x (Optional). A variable to map to the horizontal axis. The vertical #' axis will be mapped to the alpha diversity index/estimate #' and have units of total taxa, and/or index value (dimensionless). #' This parameter (\code{x}) can be either a character string indicating a #' variable in \code{sample_data} #' (among the set returned by \code{sample_variables(physeq)} ); #' or a custom supplied vector with length equal to the number of samples #' in the dataset (nsamples(physeq)). #' #' The default value is \code{"samples"}, which will map each sample's name #' to a separate horizontal position in the plot. #' #' @param color (Optional). Default \code{NULL}. #' The sample variable to map to different colors. #' Like \code{x}, this can be a single character string of the variable name in #' \code{sample_data} #' (among the set returned by \code{sample_variables(physeq)} ); #' or a custom supplied vector with length equal to the number of samples #' in the dataset (nsamples(physeq)). #' The color scheme is chosen automatically by \code{link{ggplot}}, #' but it can be modified afterward with an additional layer using #' \code{\link[ggplot2]{scale_color_manual}}. #' #' @param shape (Optional). Default \code{NULL}. The sample variable to map #' to different shapes. Like \code{x} and \code{color}, #' this can be a single character string #' of the variable name in #' \code{sample_data} #' (among the set returned by \code{sample_variables(physeq)} ); #' or a custom supplied vector with length equal to the number of samples #' in the dataset (nsamples(physeq)). #' The shape scale is chosen automatically by \code{link{ggplot}}, #' but it can be modified afterward with an additional layer using #' \code{\link[ggplot2]{scale_shape_manual}}. #' #' @param title (Optional). Default \code{NULL}. Character string. #' The main title for the graphic. #' #' @param scales (Optional). Default \code{"free_y"}. #' Whether to let vertical axis have free scale that adjusts to #' the data in each panel. #' This argument is passed to \code{\link[ggplot2]{facet_wrap}}. #' If set to \code{"fixed"}, a single vertical scale will #' be used in all panels. This can obscure values if the #' \code{measures} argument includes both #' richness estimates and diversity indices, for example. #' #' @param nrow (Optional). Default is \code{1}, #' meaning that all plot panels will be placed in a single row, #' side-by-side. #' This argument is passed to \code{\link[ggplot2]{facet_wrap}}. #' If \code{NULL}, the number of rows and columns will be #' chosen automatically (wrapped) based on the number of panels #' and the size of the graphics device. #' #' @param shsi (Deprecated). No longer supported. Instead see `measures` below. #' #' @param measures (Optional). Default is \code{NULL}, meaning that #' all available alpha-diversity measures will be included in plot panels. #' Alternatively, you can specify one or more measures #' as a character vector of measure names. #' Values must be among those supported: #' \code{c("Observed", "Chao1", "ACE", "Shannon", "Simpson", "InvSimpson", "Fisher")}. #' #' @param sortby (Optional). A character string subset of \code{measures} argument. #' Sort x-indices by the mean of one or more \code{measures}, #' if x-axis is mapped to a discrete variable. #' Default is \code{NULL}, implying that a discrete-value horizontal axis #' will use default sorting, usually alphabetic. #' #' @return A \code{\link{ggplot}} plot object summarizing #' the richness estimates, and their standard error. #' #' @seealso #' \code{\link{estimate_richness}} #' #' \code{\link[vegan]{estimateR}} #' #' \code{\link[vegan]{diversity}} #' #' There are many more interesting examples at the #' \href{http://joey711.github.io/phyloseq/plot_richness-examples}{phyloseq online tutorials}. #' #' #' @import reshape2 #' #' @importFrom plyr is.discrete #' #' @importFrom ggplot2 geom_errorbar #' @importFrom ggplot2 facet_wrap #' @importFrom ggplot2 element_text #' #' @export #' @examples #' ## There are many more interesting examples at the phyloseq online tutorials. #' ## http://joey711.github.io/phyloseq/plot_richness-examples #' data("soilrep") #' plot_richness(soilrep, measures=c("InvSimpson", "Fisher")) #' plot_richness(soilrep, "Treatment", "warmed", measures=c("Chao1", "ACE", "InvSimpson"), nrow=3) #' data("GlobalPatterns") #' plot_richness(GlobalPatterns, x="SampleType", measures=c("InvSimpson")) #' plot_richness(GlobalPatterns, x="SampleType", measures=c("Chao1", "ACE", "InvSimpson"), nrow=3) #' plot_richness(GlobalPatterns, x="SampleType", measures=c("Chao1", "ACE", "InvSimpson"), nrow=3, sortby = "Chao1") plot_richness = function(physeq, x="samples", color=NULL, shape=NULL, title=NULL, scales="free_y", nrow=1, shsi=NULL, measures=NULL, sortby=NULL){ # Calculate the relevant alpha-diversity measures erDF = estimate_richness(physeq, split=TRUE, measures=measures) # Measures may have been renamed in `erDF`. Replace it with the name from erDF measures = colnames(erDF) # Define "measure" variables and s.e. labels, for melting. ses = colnames(erDF)[grep("^se\\.", colnames(erDF))] # Remove any S.E. from `measures` measures = measures[!measures %in% ses] # Make the plotting data.frame. # This coerces to data.frame, required for reliable output from reshape2::melt() if( !is.null(sample_data(physeq, errorIfNULL=FALSE)) ){ # Include the sample data, if it is there. DF <- data.frame(erDF, sample_data(physeq)) } else { # If no sample data, leave it out. DF <- data.frame(erDF) } if( !"samples" %in% colnames(DF) ){ # If there is no "samples" variable in DF, add it DF$samples <- sample_names(physeq) } # sample_names used to be default, and should also work. # #backwardcompatibility if( !is.null(x) ){ if( x %in% c("sample", "samples", "sample_names", "sample.names") ){ x <- "samples" } } else { # If x was NULL for some reason, set it to "samples" x <- "samples" } # melt to display different alpha-measures separately mdf = reshape2::melt(DF, measure.vars=measures) # Initialize the se column. Helpful even if not used. mdf$se <- NA_integer_ if( length(ses) > 0 ){ ## Merge s.e. into one "se" column # Define conversion vector, `selabs` selabs = ses # Trim the "se." from the names names(selabs) <- substr(selabs, 4, 100) # Make first letter of selabs' names uppercase substr(names(selabs), 1, 1) <- toupper(substr(names(selabs), 1, 1)) # use selabs conversion vector to process `mdf` mdf$wse <- sapply(as.character(mdf$variable), function(i, selabs){selabs[i]}, selabs) for( i in 1:nrow(mdf) ){ if( !is.na(mdf[i, "wse"]) ){ mdf[i, "se"] <- mdf[i, (mdf[i, "wse"])] } } # prune the redundant columns mdf <- mdf[, -which(colnames(mdf) %in% c(selabs, "wse"))] } ## Interpret measures # If not provided (default), keep all if( !is.null(measures) ){ if( any(measures %in% as.character(mdf$variable)) ){ # If any measures were in mdf, then subset to just those. mdf <- mdf[as.character(mdf$variable) %in% measures, ] } else { # Else, print warning about bad option choice for measures, keeping all. warning("Argument to `measures` not supported. All alpha-diversity measures (should be) included in plot.") } } if( !is.null(shsi) ){ # Deprecated: # If shsi is anything but NULL, print a warning about its being deprecated warning("shsi no longer supported option in plot_richness. Please use `measures` instead") } # Address `sortby` argument if(!is.null(sortby)){ if(!all(sortby %in% levels(mdf$variable))){ warning("`sortby` argument not among `measures`. Ignored.") } if(!is.discrete(mdf[, x])){ warning("`sortby` argument provided, but `x` not a discrete variable. `sortby` is ignored.") } if(all(sortby %in% levels(mdf$variable)) & is.discrete(mdf[, x])){ # Replace x-factor with same factor that has levels re-ordered according to `sortby` wh.sortby = which(mdf$variable %in% sortby) mdf[, x] <- factor(mdf[, x], levels = names(sort(tapply(X = mdf[wh.sortby, "value"], INDEX = mdf[wh.sortby, x], mean, na.rm=TRUE, simplify = TRUE)))) } } # Define variable mapping richness_map = aes_string(x=x, y="value", colour=color, shape=shape) # Make the ggplot. p = ggplot(mdf, richness_map) + geom_point(na.rm=TRUE) # Add error bars if mdf$se is not all NA if( any(!is.na(mdf[, "se"])) ){ p = p + geom_errorbar(aes(ymax=value + se, ymin=value - se), width=0.1) } # Rotate horizontal axis labels, and adjust p = p + theme(axis.text.x=element_text(angle=-90, vjust=0.5, hjust=0)) # Add y-label p = p + ylab('Alpha Diversity Measure') # Facet wrap using user-options p = p + facet_wrap(~variable, nrow=nrow, scales=scales) # Optionally add a title to the plot if( !is.null(title) ){ p <- p + ggtitle(title) } return(p) } ################################################################################ # The general case, could plot samples, taxa, or both (biplot/split). Default samples. ################################################################################ #' General ordination plotter based on ggplot2. #' #' There are many useful examples of phyloseq ordination graphics in the #' \href{http://joey711.github.io/phyloseq/plot_ordination-examples}{phyloseq online tutorials}. #' Convenience wrapper for plotting ordination results as a #' \code{ggplot2}-graphic, including #' additional annotation in the form of shading, shape, and/or labels of #' sample variables. #' #' @param physeq (Required). \code{\link{phyloseq-class}}. #' The data about which you want to #' plot and annotate the ordination. #' #' @param ordination (Required). An ordination object. Many different classes #' of ordination are defined by \code{R} packages. Ordination classes #' currently supported/created by the \code{\link{ordinate}} function are #' supported here. There is no default, as the expectation is that the #' ordination will be performed and saved prior to calling this plot function. #' #' @param type (Optional). The plot type. Default is \code{"samples"}. The #' currently supported options are #' \code{c("samples", "sites", "species", "taxa", "biplot", "split", "scree")}. #' The option #' ``taxa'' is equivalent to ``species'' in this case, and similarly, #' ``samples'' is equivalent to ``sites''. #' The options #' \code{"sites"} and \code{"species"} result in a single-plot of just the #' sites/samples or species/taxa of the ordination, respectively. #' The \code{"biplot"} and \code{"split"} options result in a combined #' plot with both taxa and samples, either combined into one plot (``biplot'') #' or #' separated in two facet panels (``split''), respectively. #' The \code{"scree"} option results in a call to \code{\link{plot_scree}}, #' which produces an ordered bar plot of the normalized eigenvalues #' associated with each ordination axis. #' #' @param axes (Optional). A 2-element vector indicating the axes of the #' ordination that should be used for plotting. #' Can be \code{\link{character-class}} or \code{\link{integer-class}}, #' naming the index name or index of the desired axis for the horizontal #' and vertical axes, respectively, in that order. The default value, #' \code{c(1, 2)}, specifies the first two axes of the provided ordination. #' #' @param color (Optional). Default \code{NULL}. Character string. #' The name of the variable to map to #' colors in the plot. #' This can be a sample variable #' (among the set returned by \code{sample_variables(physeq)} ) #' or #' taxonomic rank #' (among the set returned by \code{rank_names(physeq)}). #' #' Note that the color scheme is chosen automatically #' by \code{link{ggplot}}, #' but it can be modified afterward with an additional layer using #' \code{\link[ggplot2]{scale_color_manual}}. #' #' @param shape (Optional). Default \code{NULL}. Character string. #' The name of the variable to map #' to different shapes on the plot. #' Similar to \code{color} option, but for the shape if points. #' #' The shape scale is chosen automatically by \code{link{ggplot}}, #' but it can be modified afterward with an additional layer using #' \code{\link[ggplot2]{scale_shape_manual}}. #' #' @param label (Optional). Default \code{NULL}. Character string. #' The name of the variable to map to text labels on the plot. #' Similar to \code{color} option, but for plotting text. #' #' @param title (Optional). Default \code{NULL}. Character string. #' The main title for the graphic. #' #' @param justDF (Optional). Default \code{FALSE}. Logical. #' Instead of returning a ggplot2-object, do you just want the relevant #' \code{data.frame} that was used to build the plot? This is a #' user-accessible option for obtaining the \code{data.frame}, in #' in principal to make a custom plot that isn't possible with the #' available options in this function. For contributing new functions #' (developers), the #' \code{\link{phyloseq-package}} provides/uses an internal function #' to build the key features of the \code{data.frame} prior to plot-build. #' #' @return A \code{\link{ggplot}} plot object, graphically summarizing #' the ordination result for the specified axes. #' #' @seealso #' Many more examples are included in the #' \href{http://joey711.github.io/phyloseq/plot_ordination-examples}{phyloseq online tutorials}. #' #' Also see the general wrapping function: #' #' \code{\link{plot_phyloseq}} #' #' #' @importFrom vegan wascores #' #' @importFrom ggplot2 facet_wrap #' @importFrom ggplot2 update_labels #' @importFrom ggplot2 scale_size_manual #' @importFrom ggplot2 xlab #' @importFrom ggplot2 ylab #' #' @export #' #' @examples #' # See other examples at #' # http://joey711.github.io/phyloseq/plot_ordination-examples #' data(GlobalPatterns) #' GP = prune_taxa(names(sort(taxa_sums(GlobalPatterns), TRUE)[1:50]), GlobalPatterns) #' gp_bray_pcoa = ordinate(GP, "CCA", "bray") #' plot_ordination(GP, gp_bray_pcoa, "samples", color="SampleType") plot_ordination = function(physeq, ordination, type="samples", axes=1:2, color=NULL, shape=NULL, label=NULL, title=NULL, justDF=FALSE){ if(length(type) > 1){ warning("`type` can only be a single option, but more than one provided. Using only the first.") type <- type[[1]] } if(length(color) > 1){ warning("The `color` variable argument should have length equal to 1.", "Taking first value.") color = color[[1]][1] } if(length(shape) > 1){ warning("The `shape` variable argument should have length equal to 1.", "Taking first value.") shape = shape[[1]][1] } if(length(label) > 1){ warning("The `label` variable argument should have length equal to 1.", "Taking first value.") label = label[[1]][1] } official_types = c("sites", "species", "biplot", "split", "scree") if(!inherits(physeq, "phyloseq")){ if(inherits(physeq, "character")){ if(physeq=="list"){ return(official_types) } } warning("Full functionality requires `physeq` be phyloseq-class ", "with multiple components.") } # Catch typos and synonyms type = gsub("^.*site[s]*.*$", "sites", type, ignore.case=TRUE) type = gsub("^.*sample[s]*.*$", "sites", type, ignore.case=TRUE) type = gsub("^.*species.*$", "species", type, ignore.case=TRUE) type = gsub("^.*taxa.*$", "species", type, ignore.case=TRUE) type = gsub("^.*OTU[s]*.*$", "species", type, ignore.case=TRUE) type = gsub("^.*biplot[s]*.*$", "biplot", type, ignore.case=TRUE) type = gsub("^.*split[s]*.*$", "split", type, ignore.case=TRUE) type = gsub("^.*scree[s]*.*$", "scree", type, ignore.case=TRUE) # If type argument is not supported... if( !type %in% official_types ){ warning("type argument not supported. `type` set to 'samples'.\n", "See `plot_ordination('list')`") type <- "sites" } if( type %in% c("scree") ){ # Stop early by passing to plot_scree() if "scree" was chosen as a type return( plot_scree(ordination, title=title) ) } # Define a function to check if a data.frame is empty is_empty = function(x){ length(x) < 2 | suppressWarnings(all(is.na(x))) } # The plotting data frames. # Call scores to get coordinates. # Silently returns only the coordinate systems available. # e.g. sites-only, even if species requested. specDF = siteDF = NULL trash1 = try({siteDF <- scores(ordination, choices = axes, display="sites", physeq=physeq)}, silent = TRUE) trash2 = try({specDF <- scores(ordination, choices = axes, display="species", physeq=physeq)}, silent = TRUE) # Check that have assigned coordinates to the correct object siteSampIntx = length(intersect(rownames(siteDF), sample_names(physeq))) siteTaxaIntx = length(intersect(rownames(siteDF), taxa_names(physeq))) specSampIntx = length(intersect(rownames(specDF), sample_names(physeq))) specTaxaIntx = length(intersect(rownames(specDF), taxa_names(physeq))) if(siteSampIntx < specSampIntx & specTaxaIntx < siteTaxaIntx){ # Double-swap co = specDF specDF <- siteDF siteDF <- co rm(co) } else { if(siteSampIntx < specSampIntx){ # Single swap siteDF <- specDF specDF <- NULL } if(specTaxaIntx < siteTaxaIntx){ # Single swap specDF <- siteDF siteDF <- NULL } } # If both empty, warn and return NULL if(is_empty(siteDF) & is_empty(specDF)){ warning("Could not obtain coordinates from the provided `ordination`. \n", "Please check your ordination method, and whether it is supported by `scores` or listed by phyloseq-package.") return(NULL) } # If either is missing, do weighted average if(is_empty(specDF) & type != "sites"){ message("Species coordinates not found directly in ordination object. Attempting weighted average (`vegan::wascores`)") specDF <- data.frame(wascores(siteDF, w = veganifyOTU(physeq)), stringsAsFactors=FALSE) } if(is_empty(siteDF) & type != "species"){ message("Species coordinates not found directly in ordination object. Attempting weighted average (`vegan::wascores`)") siteDF <- data.frame(wascores(specDF, w = t(veganifyOTU(physeq))), stringsAsFactors=FALSE) } # Double-check that have assigned coordinates to the correct object specTaxaIntx <- siteSampIntx <- NULL siteSampIntx <- length(intersect(rownames(siteDF), sample_names(physeq))) specTaxaIntx <- length(intersect(rownames(specDF), taxa_names(physeq))) if(siteSampIntx < 1L & !is_empty(siteDF)){ # If siteDF is not empty, but it doesn't intersect the sample_names in physeq, warn and set to NULL warning("`Ordination site/sample coordinate indices did not match `physeq` index names. Setting corresponding coordinates to NULL.") siteDF <- NULL } if(specTaxaIntx < 1L & !is_empty(specDF)){ # If specDF is not empty, but it doesn't intersect the taxa_names in physeq, warn and set to NULL warning("`Ordination species/OTU/taxa coordinate indices did not match `physeq` index names. Setting corresponding coordinates to NULL.") specDF <- NULL } # If you made it this far and both NULL, return NULL and throw a warning if(is_empty(siteDF) & is_empty(specDF)){ warning("Could not obtain coordinates from the provided `ordination`. \n", "Please check your ordination method, and whether it is supported by `scores` or listed by phyloseq-package.") return(NULL) } if(type %in% c("biplot", "split") & (is_empty(siteDF) | is_empty(specDF)) ){ # biplot and split require both coordinates systems available. # Both were attempted, or even evaluated by weighted average. # If still empty, warn and switch to relevant type. if(is_empty(siteDF)){ warning("Could not access/evaluate site/sample coordinates. Switching type to 'species'") type <- "species" } if(is_empty(specDF)){ warning("Could not access/evaluate species/taxa/OTU coordinates. Switching type to 'sites'") type <- "sites" } } if(type != "species"){ # samples covariate data frame, `sdf` sdf = NULL sdf = data.frame(access(physeq, slot="sam_data"), stringsAsFactors=FALSE) if( !is_empty(sdf) & !is_empty(siteDF) ){ # The first two axes should always be x and y, the ordination axes. siteDF <- cbind(siteDF, sdf[rownames(siteDF), ]) } } if(type != "sites"){ # taxonomy data frame `tdf` tdf = NULL tdf = data.frame(access(physeq, slot="tax_table"), stringsAsFactors=FALSE) if( !is_empty(tdf) & !is_empty(specDF) ){ # The first two axes should always be x and y, the ordination axes. specDF = cbind(specDF, tdf[rownames(specDF), ]) } } # In "naked" OTU-table cases, `siteDF` or `specDF` could be matrix. if(!inherits(siteDF, "data.frame")){ siteDF <- as.data.frame(siteDF, stringsAsFactors = FALSE) } if(!inherits(specDF, "data.frame")){ specDF <- as.data.frame(specDF, stringsAsFactors = FALSE) } # Define the main plot data frame, `DF` DF = NULL DF <- switch(EXPR = type, sites = siteDF, species = specDF, { # Anything else. In practice, type should be "biplot" or "split" here. # Add id.type label specDF$id.type <- "Taxa" siteDF$id.type <- "Samples" # But what if the axis variables differ b/w them? # Coerce specDF to match samples (siteDF) axis names colnames(specDF)[1:2] <- colnames(siteDF)[1:2] # Merge the two data frames together for joint plotting. DF = merge(specDF, siteDF, all=TRUE) # Replace NA with "samples" or "taxa", where appropriate (factor/character) if(!is.null(shape)){ DF <- rp.joint.fill(DF, shape, "Samples") } if(!is.null(shape)){ DF <- rp.joint.fill(DF, shape, "Taxa") } if(!is.null(color)){ DF <- rp.joint.fill(DF, color, "Samples") } if(!is.null(color)){ DF <- rp.joint.fill(DF, color, "Taxa") } DF }) # In case user wants the plot-DF for some other purpose, return early if(justDF){return(DF)} # Check variable availability before defining mapping. if(!is.null(color)){ if(!color %in% names(DF)){ warning("Color variable was not found in the available data you provided.", "No color mapped.") color <- NULL } } if(!is.null(shape)){ if(!shape %in% names(DF)){ warning("Shape variable was not found in the available data you provided.", "No shape mapped.") shape <- NULL } } if(!is.null(label)){ if(!label %in% names(DF)){ warning("Label variable was not found in the available data you provided.", "No label mapped.") label <- NULL } } # Grab the ordination axis names from the plot data frame (as strings) x = colnames(DF)[1] y = colnames(DF)[2] # Mapping section if( ncol(DF) <= 2){ # If there is nothing to map, enforce simple mapping. message("No available covariate data to map on the points for this plot `type`") ord_map = aes_string(x=x, y=y) } else if( type %in% c("sites", "species", "split") ){ ord_map = aes_string(x=x, y=y, color=color, shape=shape, na.rm=TRUE) } else if(type=="biplot"){ # biplot, `id.type` should try to map to color and size. Only size if color specified. if( is.null(color) ){ ord_map = aes_string(x=x, y=y, size="id.type", color="id.type", shape=shape, na.rm=TRUE) } else { ord_map = aes_string(x=x, y=y, size="id.type", color=color, shape=shape, na.rm=TRUE) } } # Plot-building section p <- ggplot(DF, ord_map) + geom_point(na.rm=TRUE) # split/facet color and shape can be anything in one or other. if( type=="split" ){ # split-option requires a facet_wrap p <- p + facet_wrap(~id.type, nrow=1) } # If biplot, adjust scales if( type=="biplot" ){ if( is.null(color) ){ # Rename color title in legend. p <- update_labels(p, list(colour="Ordination Type")) } # Adjust size so that samples are bigger than taxa by default. p <- p + scale_size_manual("type", values=c(Samples=5, Taxa=2)) } # Add text labels to points if( !is.null(label) ){ label_map <- aes_string(x=x, y=y, label=label) p = p + geom_text(label_map, data=rm.na.phyloseq(DF, label), size=2, vjust=1.5, na.rm=TRUE) } # Optionally add a title to the plot if( !is.null(title) ){ p = p + ggtitle(title) } # Add fraction variability to axis labels, if available if( length(extract_eigenvalue(ordination)[axes]) > 0 ){ # Only attempt to add fraction variability # if extract_eigenvalue returns something eigvec = extract_eigenvalue(ordination) # Fraction variability, fracvar fracvar = eigvec[axes] / sum(eigvec) # Percent variability, percvar percvar = round(100*fracvar, 1) # The string to add to each axis label, strivar # Start with the curent axis labels in the plot strivar = as(c(p$label$x, p$label$y), "character") # paste the percent variability string at the end strivar = paste0(strivar, " [", percvar, "%]") # Update the x-label and y-label p = p + xlab(strivar[1]) + ylab(strivar[2]) } # Return the ggplot object return(p) } ################################################################################ # Remove NA elements from data.frame prior to plotting # Remove NA level from factor ################################################################################ #' @keywords internal rm.na.phyloseq <- function(DF, key.var){ # (1) Remove elements from DF if key.var has NA # DF[!is.na(DF[, key.var]), ] DF <- subset(DF, !is.na(eval(parse(text=key.var)))) # (2) Remove NA from the factor level, if a factor. if( class(DF[, key.var]) == "factor" ){ DF[, key.var] <- factor(as(DF[, key.var], "character")) } return(DF) } ################################################################################ #' @keywords internal #' @importFrom plyr is.discrete rp.joint.fill <- function(DF, map.var, id.type.rp="samples"){ # If all of the map.var values for samples/species are NA, replace with id.type.rp if( all(is.na(DF[DF$id.type==id.type.rp, map.var])) ){ # If discrete, coerce to character, convert to factor, replace, relevel. if( is.discrete(DF[, map.var]) ){ temp.vec <- as(DF[, map.var], "character") temp.vec[is.na(temp.vec)] <- id.type.rp DF[, map.var] <- relevel(factor(temp.vec), id.type.rp) } } return(DF) } ################################################################################ #' Subset points from an ordination-derived ggplot #' #' Easily retrieve a plot-derived \code{data.frame} with a subset of points #' according to a threshold and method. The meaning of the threshold depends #' upon the method. See argument description below. #' There are many useful examples of phyloseq ordination graphics in the #' \href{http://joey711.github.io/phyloseq/subset_ord_plot-examples}{phyloseq online tutorials}. #' #' @usage subset_ord_plot(p, threshold=0.05, method="farthest") #' #' @param p (Required). A \code{\link{ggplot}} object created by #' \code{\link{plot_ordination}}. It contains the complete data that you #' want to subset. #' #' @param threshold (Optional). A numeric scalar. Default is \code{0.05}. #' This value determines a coordinate threshold or population threshold, #' depending on the value of the \code{method} argument, ultimately #' determining which points are included in returned \code{data.frame}. #' #' @param method (Optional). A character string. One of #' \code{c("farthest", "radial", "square")}. Default is \code{"farthest"}. #' This determines how threshold will be interpreted. #' #' \describe{ #' #' \item{farthest}{ #' Unlike the other two options, this option implies removing a #' certain fraction or number of points from the plot, depending #' on the value of \code{threshold}. If \code{threshold} is greater #' than or equal to \code{1}, then all but \code{threshold} number #' of points farthest from the origin are removed. Otherwise, if #' \code{threshold} is less than \code{1}, all but \code{threshold} #' fraction of points farthests from origin are retained. #' } #' #' \item{radial}{ #' Keep only those points that are beyond \code{threshold} #' radial distance from the origin. Has the effect of removing a #' circle of points from the plot, centered at the origin. #' } #' #' \item{square}{ #' Keep only those points with at least one coordinate #' greater than \code{threshold}. Has the effect of removing a #' ``square'' of points from the plot, centered at the origin. #' } #' #' } #' #' @return A \code{\link{data.frame}} suitable for creating a #' \code{\link{ggplot}} plot object, graphically summarizing #' the ordination result according to previously-specified parameters. #' #' @seealso #' \href{http://joey711.github.io/phyloseq/subset_ord_plot-examples}{phyloseq online tutorial} for this function. #' #' \code{\link{plot_ordination}} #' #' #' @export #' @examples #' ## See the online tutorials. #' ## http://joey711.github.io/phyloseq/subset_ord_plot-examples subset_ord_plot <- function(p, threshold=0.05, method="farthest"){ threshold <- threshold[1] # ignore all but first threshold value. method <- method[1] # ignore all but first string. method.names <- c("farthest", "radial", "square") # Subset to only some small fraction of points # with furthest distance from origin df <- p$data[, c(1, 2)] d <- sqrt(df[, 1]^2 + df[, 2]^2) names(d) <- rownames(df) if( method.names[pmatch(method, method.names)] == "farthest"){ if( threshold >= 1){ show.names <- names(sort(d, TRUE)[1:threshold]) } else if( threshold < 1 ){ show.names <- names(sort(d, TRUE)[1:round(threshold*length(d))]) } else { stop("threshold not a valid positive numeric scalar") } } else if( method.names[pmatch(method, method.names)] == "radial"){ show.names <- names(d[d > threshold]) } else if( method.names[pmatch(method, method.names)] == "square"){ # show.names <- rownames(df)[as.logical((abs(df[, 1]) > threshold) + (abs(df[, 2]) > threshold))] show.names <- rownames(df)[((abs(df[, 1]) > threshold) | (abs(df[, 2]) > threshold))] } else { stop("method name not supported. Please select a valid method") } return(p$data[show.names, ]) } ################################################################################ #' General ordination eigenvalue plotter using ggplot2. #' #' Convenience wrapper for plotting ordination eigenvalues (if available) #' using a \code{ggplot2}-graphic. #' #' @param ordination (Required). An ordination object. Many different classes #' of ordination are defined by \code{R} packages. Ordination classes #' currently supported/created by the \code{\link{ordinate}} function are #' supported here. #' There is no default, as the expectation is that the #' ordination will be performed and saved prior to calling this plot function. #' #' @param title (Optional). Default \code{NULL}. Character string. #' The main title for the graphic. #' #' @return A \code{\link{ggplot}} plot object, graphically summarizing #' the ordination result for the specified axes. #' #' @seealso #' #' \code{\link{plot_ordination}} #' #' \code{\link{ordinate}} #' #' \code{\link{distance}} #' #' \href{http://joey711.github.io/phyloseq/plot_ordination-examples}{phyloseq online tutorials} #' #' @importFrom ggplot2 geom_bar #' @importFrom ggplot2 scale_x_discrete #' @importFrom ggplot2 element_text #' #' @export #' @examples #' # First load and trim a dataset #' data("GlobalPatterns") #' GP = prune_taxa(names(sort(taxa_sums(GlobalPatterns), TRUE)[1:50]), GlobalPatterns) #' # Test plots (preforms ordination in-line, then makes scree plot) #' plot_scree(ordinate(GP, "DPCoA", "bray")) #' plot_scree(ordinate(GP, "PCoA", "bray")) #' # Empty return with message #' plot_scree(ordinate(GP, "NMDS", "bray")) #' # Constrained ordinations #' plot_scree(ordinate(GP, "CCA", formula=~SampleType)) #' plot_scree(ordinate(GP, "RDA", formula=~SampleType)) #' plot_scree(ordinate(GP, "CAP", formula=~SampleType)) #' # Deprecated example of constrained ordination (emits a warning) #' #plot_scree(ordinate(GP ~ SampleType, "RDA")) #' plot_scree(ordinate(GP, "DCA")) #' plot_ordination(GP, ordinate(GP, "DCA"), type="scree") plot_scree = function(ordination, title=NULL){ # Use get_eigenvalue method dispatch. It always returns a numeric vector. x = extract_eigenvalue(ordination) # Were eigenvalues found? If not, return NULL if( is.null(x) ){ cat("No eigenvalues found in ordination\n") return(NULL) } else { # If no names, add them arbitrarily "axis1, axis2, ..., axisN" if( is.null(names(x)) ) names(x) = 1:length(x) # For scree plot, want to show the fraction of total eigenvalues x = x/sum(x) # Set negative values to zero x[x <= 0.0] = 0.0 # Create the ggplot2 data.frame, and basic ggplot2 plot gdf = data.frame(axis=names(x), eigenvalue = x) p = ggplot(gdf, aes(x=axis, y=eigenvalue)) + geom_bar(stat="identity") # Force the order to be same as original in x p = p + scale_x_discrete(limits = names(x)) # Orient the x-labels for space. p = p + theme(axis.text.x=element_text(angle=90, vjust=0.5)) # Optionally add a title to the plot if( !is.null(title) ){ p <- p + ggtitle(title) } return(p) } } ################################################################################ # Define S3 generic extract_eigenvalue function; formerly S4 generic get_eigenvalue() # Function is used by `plot_scree` to get the eigenvalue vector from different # types of ordination objects. # Used S3 generic in this case because many ordination objects, the input, are # not formally-defined S4 classes, but vaguely-/un-defined S3. This throws # warnings during package build if extract_eigenvalue were S4 generic method, # because the ordination classes don't appear to have any definition in phyloseq # or dependencies. #' @keywords internal extract_eigenvalue = function(ordination) UseMethod("extract_eigenvalue", ordination) # Default is to return NULL (e.g. for NMDS, or non-supported ordinations/classes). extract_eigenvalue.default = function(ordination) NULL # for pcoa objects extract_eigenvalue.pcoa = function(ordination) ordination$values$Relative_eig # for CCA objects extract_eigenvalue.cca = function(ordination) c(ordination$CCA$eig, ordination$CA$eig) # for RDA objects extract_eigenvalue.rda = function(ordination) c(ordination$CCA$eig, ordination$CA$eig) # for dpcoa objects extract_eigenvalue.dpcoa = function(ordination) ordination$eig # for decorana (dca) objects extract_eigenvalue.decorana = function(ordination) ordination$evals ################################################################################ #' Melt phyloseq data object into large data.frame #' #' The psmelt function is a specialized melt function for melting phyloseq objects #' (instances of the phyloseq class), usually for producing graphics #' with \code{\link[ggplot2]{ggplot}2}. \code{psmelt} relies heavily on the #' \code{\link[reshape2]{melt}} and \code{\link{merge}} functions. #' The naming conventions used in downstream phyloseq graphics functions #' have reserved the following variable names that should not be used #' as the names of \code{\link{sample_variables}} #' or taxonomic \code{\link{rank_names}}. #' These reserved names are \code{c("Sample", "Abundance", "OTU")}. #' Also, you should not have identical names for #' sample variables and taxonomic ranks. #' That is, the intersection of the output of the following two functions #' \code{\link{sample_variables}}, \code{\link{rank_names}} #' should be an empty vector #' (e.g. \code{intersect(sample_variables(physeq), rank_names(physeq))}). #' All of these potential name collisions are checked-for #' and renamed automtically with a warning. #' However, if you (re)name your variables accordingly ahead of time, #' it will reduce confusion and eliminate the warnings. #' #' Note that #' ``melted'' phyloseq data is stored much less efficiently, #' and so RAM storage issues could arise with a smaller dataset #' (smaller number of samples/OTUs/variables) than one might otherwise expect. #' For common sizes of graphics-ready datasets, however, #' this should not be a problem. #' Because the number of OTU entries has a large effect on the RAM requirement, #' methods to reduce the number of separate OTU entries -- #' for instance by agglomerating OTUs based on phylogenetic distance #' using \code{\link{tip_glom}} -- #' can help alleviate RAM usage problems. #' This function is made user-accessible for flexibility, #' but is also used extensively by plot functions in phyloseq. #' #' @usage psmelt(physeq) #' #' @param physeq (Required). An \code{\link{otu_table-class}} or #' \code{\link{phyloseq-class}}. Function most useful for phyloseq-class. #' #' @return A \code{\link{data.frame}}-class table. #' #' @seealso #' \code{\link{plot_bar}} #' #' \code{\link[reshape2]{melt}} #' #' \code{\link{merge}} #' #' @import reshape2 #' #' @export #' #' @examples #' data("GlobalPatterns") #' gp.ch = subset_taxa(GlobalPatterns, Phylum == "Chlamydiae") #' mdf = psmelt(gp.ch) #' nrow(mdf) #' ncol(mdf) #' colnames(mdf) #' head(rownames(mdf)) #' # Create a ggplot similar to #' library("ggplot2") #' p = ggplot(mdf, aes(x=SampleType, y=Abundance, fill=Genus)) #' p = p + geom_bar(color="black", stat="identity", position="stack") #' print(p) psmelt = function(physeq){ # Access covariate names from object, if present if(!inherits(physeq, "phyloseq")){ rankNames = NULL sampleVars = NULL } else { # Still might be NULL, but attempt access rankNames = rank_names(physeq, FALSE) sampleVars = sample_variables(physeq, FALSE) } # Define reserved names reservedVarnames = c("Sample", "Abundance", "OTU") # type-1a conflict: between sample_data # and reserved psmelt variable names type1aconflict = intersect(reservedVarnames, sampleVars) if(length(type1aconflict) > 0){ wh1a = which(sampleVars %in% type1aconflict) new1a = paste0("sample_", sampleVars[wh1a]) # First warn about the change warning("The sample variables: \n", paste(sampleVars[wh1a], collapse=", "), "\n have been renamed to: \n", paste0(new1a, collapse=", "), "\n", "to avoid conflicts with special phyloseq plot attribute names.") # Rename the sample variables. colnames(sample_data(physeq))[wh1a] <- new1a } # type-1b conflict: between tax_table # and reserved psmelt variable names type1bconflict = intersect(reservedVarnames, rankNames) if(length(type1bconflict) > 0){ wh1b = which(rankNames %in% type1bconflict) new1b = paste0("taxa_", rankNames[wh1b]) # First warn about the change warning("The rank names: \n", paste(rankNames[wh1b], collapse=", "), "\n have been renamed to: \n", paste0(new1b, collapse=", "), "\n", "to avoid conflicts with special phyloseq plot attribute names.") # Rename the conflicting taxonomic ranks colnames(tax_table(physeq))[wh1b] <- new1b } # type-2 conflict: internal between tax_table and sample_data type2conflict = intersect(sampleVars, rankNames) if(length(type2conflict) > 0){ wh2 = which(sampleVars %in% type2conflict) new2 = paste0("sample_", sampleVars[wh2]) # First warn about the change warning("The sample variables: \n", paste0(sampleVars[wh2], collapse=", "), "\n have been renamed to: \n", paste0(new2, collapse=", "), "\n", "to avoid conflicts with taxonomic rank names.") # Rename the sample variables colnames(sample_data(physeq))[wh2] <- new2 } # Enforce OTU table orientation. Redundant-looking step # supports "naked" otu_table as `physeq` input. otutab = otu_table(physeq) if(!taxa_are_rows(otutab)){otutab <- t(otutab)} # Melt the OTU table: wide form to long form table mdf = reshape2::melt(as(otutab, "matrix")) colnames(mdf)[1] <- "OTU" colnames(mdf)[2] <- "Sample" colnames(mdf)[3] <- "Abundance" # Row and Col names are coerced to integer or factor if possible. # Do not want this. Coerce these to character. # e.g. `OTU` should always be discrete, even if OTU ID values can be coerced to integer mdf$OTU <- as.character(mdf$OTU) mdf$Sample <- as.character(mdf$Sample) # Merge the sample data.frame if present if(!is.null(sampleVars)){ sdf = data.frame(sample_data(physeq), stringsAsFactors=FALSE) sdf$Sample <- sample_names(physeq) # merge the sample-data and the melted otu table mdf <- merge(mdf, sdf, by.x="Sample") } # Next merge taxonomy data, if present if(!is.null(rankNames)){ TT = access(physeq, "tax_table") # First, check for empty TT columns (all NA) keepTTcols <- colSums(is.na(TT)) < ntaxa(TT) # Protect against all-empty columns, or col-less matrix if(length(which(keepTTcols)) > 0 & ncol(TT) > 0){ # Remove the empty columns TT <- TT[, keepTTcols] # Add TT to the "psmelt" data.frame tdf = data.frame(TT, OTU=taxa_names(physeq)) # Now add to the "psmelt" output data.frame, `mdf` mdf <- merge(mdf, tdf, by.x="OTU") } } # Sort the entries by abundance mdf = mdf[order(mdf$Abundance, decreasing=TRUE), ] return(mdf) } ################################################################################ #' A flexible, informative barplot phyloseq data #' #' There are many useful examples of phyloseq barplot graphics in the #' \href{http://joey711.github.io/phyloseq/plot_bar-examples}{phyloseq online tutorials}. #' This function wraps \code{ggplot2} plotting, and returns a \code{ggplot2} #' graphic object #' that can be saved or further modified with additional layers, options, etc. #' The main purpose of this function is to quickly and easily create informative #' summary graphics of the differences in taxa abundance between samples in #' an experiment. #' #' @usage plot_bar(physeq, x="Sample", y="Abundance", fill=NULL, #' title=NULL, facet_grid=NULL) #' #' @param physeq (Required). An \code{\link{otu_table-class}} or #' \code{\link{phyloseq-class}}. #' #' @param x (Optional). Optional, but recommended, especially if your data #' is comprised of many samples. A character string. #' The variable in the melted-data that should be mapped to the x-axis. #' See \code{\link{psmelt}}, \code{\link{melt}}, #' and \code{\link{ggplot}} for more details. #' #' @param y (Optional). A character string. #' The variable in the melted-data that should be mapped to the y-axis. #' Typically this will be \code{"Abundance"}, in order to #' quantitatively display the abundance values for each OTU/group. #' However, alternative variables could be used instead, #' producing a very different, though possibly still informative, plot. #' See \code{\link{psmelt}}, \code{\link{melt}}, #' and \code{\link{ggplot}} for more details. #' #' @param fill (Optional). A character string. Indicates which sample variable #' should be used to map to the fill color of the bars. #' The default is \code{NULL}, resulting in a gray fill for all bar segments. #' #' @param facet_grid (Optional). A formula object. #' It should describe the faceting you want in exactly the same way as for #' \code{\link[ggplot2]{facet_grid}}, #' and is ulitmately provided to \code{\link{ggplot}}2 graphics. #' The default is: \code{NULL}, resulting in no faceting. #' #' @param title (Optional). Default \code{NULL}. Character string. #' The main title for the graphic. #' #' @return A \code{\link[ggplot2]{ggplot}}2 graphic object -- rendered in the graphical device #' as the default \code{\link[base]{print}}/\code{\link[methods]{show}} method. #' #' @seealso #' \href{http://joey711.github.io/phyloseq/plot_bar-examples}{phyloseq online tutorials}. #' #' \code{\link{psmelt}} #' #' \code{\link{ggplot}} #' #' \code{\link{qplot}} #' #' #' @importFrom ggplot2 aes_string #' @importFrom ggplot2 geom_bar #' @importFrom ggplot2 facet_grid #' @importFrom ggplot2 element_text #' #' @export #' #' @examples #' data("GlobalPatterns") #' gp.ch = subset_taxa(GlobalPatterns, Phylum == "Chlamydiae") #' plot_bar(gp.ch) #' plot_bar(gp.ch, fill="Genus") #' plot_bar(gp.ch, x="SampleType", fill="Genus") #' plot_bar(gp.ch, "SampleType", fill="Genus", facet_grid=~Family) #' # See additional examples in the plot_bar online tutorial. Link above. plot_bar = function(physeq, x="Sample", y="Abundance", fill=NULL, title=NULL, facet_grid=NULL){ # Start by melting the data in the "standard" way using psmelt. mdf = psmelt(physeq) # Build the plot data structure p = ggplot(mdf, aes_string(x=x, y=y, fill=fill)) # Add the bar geometric object. Creates a basic graphic. Basis for the rest. # Test weather additional p = p + geom_bar(stat="identity", position="stack", color="black") # By default, rotate the x-axis labels (they might be long) p = p + theme(axis.text.x=element_text(angle=-90, hjust=0)) # Add faceting, if given if( !is.null(facet_grid) ){ p <- p + facet_grid(facet_grid) } # Optionally add a title to the plot if( !is.null(title) ){ p <- p + ggtitle(title) } return(p) } ################################################################################ # plot_tree section. ################################################################################ #' Returns a data table defining the line segments of a phylogenetic tree. #' #' This function takes a \code{\link{phylo}} or \code{\link{phyloseq-class}} object #' and returns a list of two \code{\link{data.table}}s suitable for plotting #' a phylogenetic tree with \code{\link[ggplot2]{ggplot}}2. #' #' @param phy (Required). The \code{\link{phylo}} or \code{\link{phyloseq-class}} #' object (which must contain a \code{\link{phylo}}genetic tree) #' that you want to converted to \code{\link{data.table}}s #' suitable for plotting with \code{\link[ggplot2]{ggplot}}2. #' #' @param ladderize (Optional). Boolean or character string (either #' \code{FALSE}, \code{TRUE}, or \code{"left"}). #' Default is \code{FALSE} (no ladderization). #' This parameter specifies whether or not to \code{\link[ape]{ladderize}} the tree #' (i.e., reorder nodes according to the depth of their enclosed #' subtrees) prior to plotting. #' This tends to make trees more aesthetically pleasing and legible in #' a graphical display. #' When \code{TRUE} or \code{"right"}, ``right'' ladderization is used. #' When set to \code{FALSE}, no ladderization is applied. #' When set to \code{"left"}, the reverse direction #' (``left'' ladderization) is applied. #' #' @return #' A list of two \code{\link{data.table}}s, containing respectively #' a \code{data.table} of edge segment coordinates, named \code{edgeDT}, #' and a \code{data.table} of vertical connecting segments, named \code{vertDT}. #' See \code{example} below for a simple demonstration. #' #' @seealso #' An early example of this functionality was borrowed directly, with permission, #' from the package called \code{ggphylo}, #' released on GitHub at: #' \url{https://github.com/gjuggler/ggphylo} #' by its author Gregory Jordan \email{gjuggler@@gmail.com}. #' That original phyloseq internal function, \code{tree.layout}, has been #' completely replaced by this smaller and much faster user-accessible #' function that utilizes performance enhancements from standard #' \code{\link{data.table}} magic as well as \code{\link{ape-package}} #' internal C code. #' #' @importFrom ape ladderize #' @importFrom ape reorder.phylo #' @importFrom ape node.depth.edgelength #' @importFrom ape node.height #' #' @importFrom data.table data.table #' @importFrom data.table setkey #' #' @export #' @examples #' library("ggplot2") #' data("esophagus") #' phy = phy_tree(esophagus) #' phy <- ape::root(phy, "65_2_5", resolve.root=TRUE) #' treeSegs0 = tree_layout(phy) #' treeSegs1 = tree_layout(esophagus) #' edgeMap = aes(x=xleft, xend=xright, y=y, yend=y) #' vertMap = aes(x=x, xend=x, y=vmin, yend=vmax) #' p0 = ggplot(treeSegs0$edgeDT, edgeMap) + geom_segment() + geom_segment(vertMap, data=treeSegs0$vertDT) #' p1 = ggplot(treeSegs1$edgeDT, edgeMap) + geom_segment() + geom_segment(vertMap, data=treeSegs1$vertDT) #' print(p0) #' print(p1) #' plot_tree(esophagus, "treeonly") #' plot_tree(esophagus, "treeonly", ladderize="left") tree_layout = function(phy, ladderize=FALSE){ if(inherits(phy, "phyloseq")){ phy = phy_tree(phy) } if(!inherits(phy, "phylo")){ stop("tree missing or invalid. Please check `phy` argument and try again.") } if(is.null(phy$edge.length)){ # If no edge lengths, set them all to value of 1 (dendrogram). phy$edge.length <- rep(1L, times=nrow(phy$edge)) } # Perform ladderizing, if requested if(ladderize != FALSE){ if(ladderize == "left"){ phy <- ladderize(phy, FALSE) } else if(ladderize==TRUE | ladderize=="right"){ phy <- ladderize(phy, TRUE) } else { stop("You did not specify a supported option for argument `ladderize`.") } } # 'z' is the tree in postorder order used in calls to .C # Descending order of left-hand side of edge (the ancestor to the node) z = reorder.phylo(phy, order="postorder") # Initialize some characteristics of the tree. Ntip = length(phy$tip.label) ROOT = Ntip + 1 nodelabels = phy$node.label # Horizontal positions xx = node.depth.edgelength(phy) # vertical positions yy = node.height(phy = phy, clado.style = FALSE) # Initialize an edge data.table # Don't set key, order matters edgeDT = data.table(phy$edge, edge.length=phy$edge.length, OTU=NA_character_) # Add tip.labels if present if(!is.null(phy$tip.label)){ # Initialize OTU, set node (V2) as key, assign taxa_names as OTU label edgeDT[, OTU:=NA_character_] setkey(edgeDT, V2) edgeDT[V2 <= Ntip, OTU:=phy$tip.label] } # Add the mapping for each edge defined in `xx` and `yy` edgeDT[, xleft:=xx[V1]] edgeDT[, xright:=xx[V2]] edgeDT[, y:=yy[V2]] # Next define vertical segments vertDT = edgeDT[, list(x=xleft[1], vmin=min(y), vmax=max(y)), by=V1, mult="last"] if(!is.null(phy$node.label)){ # Add non-root node labels to edgeDT edgeDT[V2 > ROOT, x:=xright] edgeDT[V2 > ROOT, label:=phy$node.label[-1]] # Add root label (first node label) to vertDT setkey(vertDT, V1) vertDT[J(ROOT), y:=mean(c(vmin, vmax))] vertDT[J(ROOT), label:=phy$node.label[1]] } return(list(edgeDT=edgeDT, vertDT=vertDT)) } ################################################################################ # Define an internal function for determining what the text-size should be #' @keywords internal manytextsize <- function(n, mins=0.5, maxs=4, B=6, D=100){ # empirically selected size-value calculator. s <- B * exp(-n/D) # enforce a floor. s <- ifelse(s > mins, s, mins) # enforce a max s <- ifelse(s < maxs, s, maxs) return(s) } ################################################################################ # Return TRUE if the nodes of the tree in the phyloseq object provided are unlabeled. #' @keywords internal nodesnotlabeled = function(physeq){ if(is.null(phy_tree(physeq, FALSE))){ warning("There is no phylogenetic tree in the object you have provided. Try `phy_tree(physeq)` to see.") return(TRUE) } else { return(is.null(phy_tree(physeq)$node.label) | length(phy_tree(physeq)$node.label)==0L) } } # A quick test function to decide how nodes should be labeled by default, if at all. # #' @keywords internal howtolabnodes = function(physeq){ if(!nodesnotlabeled(physeq)){ # If the nodes are labeled, use a version of this function, taking into account `ntaxa`. return(nodeplotdefault(manytextsize(ntaxa(physeq)))) } else { # Else, use `nodeplotblank`, which returns the ggplot object as-is. return(nodeplotblank) } } ################################################################################ #' Function to avoid plotting node labels #' #' Unlike, \code{\link{nodeplotdefault}} and \code{\link{nodeplotboot}}, #' this function does not return a function, but instead is provided #' directly to the \code{nodelabf} argument of \code{\link{plot_tree}} to #' ensure that node labels are not added to the graphic. #' Please note that you do not need to create or obtain the arguments to #' this function. Instead, you can provide this function directly to #' \code{\link{plot_tree}} and it will know what to do with it. Namely, #' use it to avoid plotting any node labels. #' #' @usage nodeplotblank(p, nodelabdf) #' #' @param p (Required). The \code{\link{plot_tree}} graphic. #' #' @param nodelabdf (Required). The \code{data.frame} produced internally in #' \code{link{plot_tree}} to use as data for creating ggplot2-based tree graphics. #' #' @return The same input object, \code{p}, provided as input. Unmodified. #' #' @seealso #' \code{\link{nodeplotdefault}} #' #' \code{\link{nodeplotboot}} #' #' \code{\link{plot_tree}} #' #' #' @export #' @examples #' data("esophagus") #' plot_tree(esophagus) #' plot_tree(esophagus, nodelabf=nodeplotblank) nodeplotblank = function(p, nodelabdf){ return(p) } ################################################################################ #' Generates a function for labeling bootstrap values on a phylogenetic tree. #' #' Is not a labeling function itself, but returns one. #' The returned function is specialized for labeling bootstrap values. #' Note that the function that #' is returned has two completely different arguments from the four listed here: #' the plot object already built by earlier steps in #' \code{\link{plot_tree}}, and the \code{\link{data.frame}} #' that contains the relevant plotting data for the nodes #' (especially \code{x, y, label}), #' respectively. #' See \code{\link{nodeplotdefault}} for a simpler example. #' The main purpose of this and \code{\link{nodeplotdefault}} is to #' provide a useful default function generator for arbitrary and #' bootstrap node labels, respectively, and also to act as #' examples of functions that can successfully interact with #' \code{\link{plot_tree}} to add node labels to the graphic. #' #' @usage nodeplotboot(highthresh=95L, lowcthresh=50L, size=2L, hjust=-0.2) #' #' @param highthresh (Optional). A single integer between 0 and 100. #' Any bootstrap values above this threshold will be annotated as #' a black filled circle on the node, rather than the bootstrap #' percentage value itself. #' #' @param lowcthresh (Optional). A single integer between 0 and 100, #' less than \code{highthresh}. Any bootstrap values below this value #' will not be added to the graphic. Set to 0 or below to add all #' available values. #' #' @param size (Optional). Numeric. Should be positive. The #' size parameter used to control the text size of taxa labels. #' Default is \code{2}. These are ggplot2 sizes. #' #' @param hjust (Optional). The horizontal justification of the #' node labels. Default is \code{-0.2}. #' #' @return A function that can add a bootstrap-values layer to the tree graphic. #' The values are represented in two ways; either as black filled circles #' indicating very high-confidence nodes, or the bootstrap value itself #' printed in small text next to the node on the tree. #' #' @seealso #' \code{\link{nodeplotdefault}} #' #' \code{\link{nodeplotblank}} #' #' \code{\link{plot_tree}} #' #' #' @export #' @examples #' nodeplotboot() #' nodeplotboot(3, -0.4) nodeplotboot = function(highthresh=95L, lowcthresh=50L, size=2L, hjust=-0.2){ function(p, nodelabdf){ # For bootstrap, check that the node labels can be coerced to numeric try(boot <- as(as(nodelabdf$label, "character"), "numeric"), TRUE) # Want NAs/NaN to propagate, but still need to test remainder goodboot = boot[complete.cases(boot)] if( !is(goodboot, "numeric") & length(goodboot) > 0 ){ stop("The node labels, phy_tree(physeq)$node.label, are not coercable to a numeric vector with any elements.") } # So they look even more like bootstraps and display well, # force them to be between 0 and 100, rounded to 2 digits. if( all( goodboot >= 0.0 & goodboot <= 1.0 ) ){ boot = round(boot, 2)*100L } nodelabdf$boot = boot boottop = subset(nodelabdf, boot >= highthresh) bootmid = subset(nodelabdf, boot > lowcthresh & boot < highthresh) # Label the high-confidence nodes with a point. if( nrow(boottop)>0L ){ p = p + geom_point(mapping=aes(x=x, y=y), data=boottop, na.rm=TRUE) } # Label the remaining bootstrap values as text at the nodes. if( nrow(bootmid)>0L ){ bootmid$label = bootmid$boot p = nodeplotdefault(size, hjust)(p, bootmid) } return(p) } } ################################################################################ #' Generates a default node-label function #' #' Is not a labeling function itself, but returns one. #' The returned function is capable of adding #' whatever label is on a node. Note that the function that #' is returned has two completely different arguments to those listed here: #' the plot object already built by earlier steps in #' \code{\link{plot_tree}}, and the \code{\link{data.frame}} #' that contains the relevant plotting data for the nodes #' (especially \code{x, y, label}), #' respectively. #' See \code{\link{nodeplotboot}} for a more sophisticated example. #' The main purpose of this and \code{\link{nodeplotboot}} is to #' provide a useful default function generator for arbitrary and #' bootstrap node labels, respectively, and also to act as #' examples of functions that will successfully interact with #' \code{\link{plot_tree}} to add node labels to the graphic. #' #' @usage nodeplotdefault(size=2L, hjust=-0.2) #' #' @param size (Optional). Numeric. Should be positive. The #' size parameter used to control the text size of taxa labels. #' Default is \code{2}. These are ggplot2 sizes. #' #' @param hjust (Optional). The horizontal justification of the #' node labels. Default is \code{-0.2}. #' #' @return A function that can add a node-label layer to a graphic. #' #' @seealso #' \code{\link{nodeplotboot}} #' #' \code{\link{nodeplotblank}} #' #' \code{\link{plot_tree}} #' #' @export #' #' @examples #' nodeplotdefault() #' nodeplotdefault(3, -0.4) nodeplotdefault = function(size=2L, hjust=-0.2){ function(p, nodelabdf){ p = p + geom_text(mapping=aes(x=x, y=y, label=label), data=nodelabdf, size=size, hjust=hjust, na.rm=TRUE) return(p) } } ################################################################################ #' Plot a phylogenetic tree with optional annotations #' #' There are many useful examples of phyloseq tree graphics in the #' \href{http://joey711.github.io/phyloseq/plot_tree-examples}{phyloseq online tutorials}. #' This function is intended to facilitate easy graphical investigation of #' the phylogenetic tree, as well as sample data. Note that for phylogenetic #' sequencing of samples with large richness, some of the options in this #' function will be prohibitively slow to render, or too dense to be #' interpretable. A rough ``rule of thumb'' is to use subsets of data #' with not many more than 200 OTUs per plot, sometimes less depending on the #' complexity of the additional annotations being mapped to the tree. It is #' usually possible to create an unreadable, uninterpretable tree with modern #' datasets. However, the goal should be toward parameter settings and data #' subsets that convey (honestly, accurately) some biologically relevant #' feature of the data. One of the goals of the \code{\link{phyloseq-package}} #' is to make the determination of these features/settings as easy as possible. #' #' This function received an early development contribution from the work of #' Gregory Jordan via \href{https://github.com/gjuggler/ggphylo}{the ggphylo package}. #' \code{plot_tree} has since been re-written. #' For details see \code{\link{tree_layout}}. #' #' @param physeq (Required). The data about which you want to #' plot and annotate a phylogenetic tree, in the form of a #' single instance of the \code{\link{phyloseq-class}}, containing at #' minimum a phylogenetic tree component (try \code{\link{phy_tree}}). #' One of the major advantages of this function over basic tree-plotting utilities #' in the \code{\link{ape}}-package is the ability to easily annotate the tree #' with sample variables and taxonomic information. For these uses, #' the \code{physeq} argument should also have a \code{\link{sample_data}} #' and/or \code{\link{tax_table}} component(s). #' #' @param method (Optional). Character string. Default \code{"sampledodge"}. #' The name of the annotation method to use. #' This will be expanded in future versions. #' Currently only \code{"sampledodge"} and \code{"treeonly"} are supported. #' The \code{"sampledodge"} option results in points #' drawn next to leaves if individuals from that taxa were observed, #' and a separate point is drawn for each sample. #' #' @param nodelabf (Optional). A function. Default \code{NULL}. #' If \code{NULL}, the default, a function will be selected for you based upon #' whether or not there are node labels in \code{phy_tree(physeq)}. #' For convenience, the phyloseq package includes two generator functions #' for adding arbitrary node labels (can be any character string), #' \code{\link{nodeplotdefault}}; #' as well as for adding bootstrap values in a certain range, #' \code{\link{nodeplotboot}}. #' To not have any node labels in the graphic, set this argument to #' \code{\link{nodeplotblank}}. #' #' @param color (Optional). Character string. Default \code{NULL}. #' The name of the variable in \code{physeq} to map to point color. #' Supported options here also include the reserved special variables #' of \code{\link{psmelt}}. #' #' @param shape (Optional). Character string. Default \code{NULL}. #' The name of the variable in \code{physeq} to map to point shape. #' Supported options here also include the reserved special variables #' of \code{\link{psmelt}}. #' #' @param size (Optional). Character string. Default \code{NULL}. #' The name of the variable in \code{physeq} to map to point size. #' A special argument \code{"abundance"} is reserved here and scales #' point size using abundance in each sample on a log scale. #' Supported options here also include the reserved special variables #' of \code{\link{psmelt}}. #' #' @param min.abundance (Optional). Numeric. #' The minimum number of individuals required to label a point #' with the precise number. #' Default is \code{Inf}, #' meaning that no points will have their abundance labeled. #' If a vector, only the first element is used. #' #' @param label.tips (Optional). Character string. Default is \code{NULL}, #' indicating that no tip labels will be printed. #' If \code{"taxa_names"}, then the name of the taxa will be added #' to the tree; either next to the leaves, or next to #' the set of points that label the leaves. Alternatively, #' if this is one of the rank names (from \code{rank_names(physeq)}), #' then the identity (if any) for that particular taxonomic rank #' is printed instead. #' #' @param text.size (Optional). Numeric. Should be positive. The #' size parameter used to control the text size of taxa labels. #' Default is \code{NULL}. If left \code{NULL}, this function #' will automatically calculate a (hopefully) optimal text size #' given the vertical constraints posed by the tree itself. #' This argument is included in case the #' automatically-calculated size is wrong, and you want to change it. #' Note that this parameter is only meaningful if \code{label.tips} #' is not \code{NULL}. #' #' @param sizebase (Optional). Numeric. Should be positive. #' The base of the logarithm used #' to scale point sizes to graphically represent abundance of #' species in a given sample. Default is 5. #' #' @param base.spacing (Optional). Numeric. Default is \code{0.02}. #' Should be positive. #' This defines the base-spacing between points at each tip/leaf in the #' the tree. The larger this value, the larger the spacing between points. #' This is useful if you have problems with overlapping large points #' and/or text indicating abundance, for example. Similarly, if you #' don't have this problem and want tighter point-spacing, you can #' shrink this value. #' #' @param ladderize (Optional). Boolean or character string (either #' \code{FALSE}, \code{TRUE}, or \code{"left"}). #' Default is \code{FALSE}. #' This parameter specifies whether or not to \code{\link[ape]{ladderize}} the tree #' (i.e., reorder nodes according to the depth of their enclosed #' subtrees) prior to plotting. #' This tends to make trees more aesthetically pleasing and legible in #' a graphical display. #' When \code{TRUE} or \code{"right"}, ``right'' ladderization is used. #' When set to \code{FALSE}, no ladderization is applied. #' When set to \code{"left"}, the reverse direction #' (``left'' ladderization) is applied. #' This argument is passed on to \code{\link{tree_layout}}. #' #' @param plot.margin (Optional). Numeric. Default is \code{0.2}. #' Should be positive. #' This defines how much right-hand padding to add to the tree plot, #' which can be required to not truncate tip labels. The margin value #' is specified as a fraction of the overall tree width which is added #' to the right side of the plot area. So a value of \code{0.2} adds #' twenty percent extra space to the right-hand side of the plot. #' #' @param title (Optional). Default \code{NULL}. Character string. #' The main title for the graphic. #' #' @param treetheme (Optional). #' A custom \code{\link{ggplot}}2 \code{\link[ggplot2]{theme}} layer #' to use for the tree. Supplants any default theme layers #' used within the function. #' A value of \code{NULL} uses a default, minimal-annotations theme. #' If anything other than a them or \code{NULL}, the current global ggplot2 #' theme will result. #' #' @param justify (Optional). A character string indicating the #' type of justification to use on dodged points and tip labels. #' A value of \code{"jagged"}, the default, results in #' these tip-mapped elements being spaced as close to the tips as possible #' without gaps. #' Currently, any other value for \code{justify} results in #' a left-justified arrangement of both labels and points. #' #' @return A \code{\link{ggplot}}2 plot. #' #' @seealso #' \code{\link{plot.phylo}} #' #' There are many useful examples of phyloseq tree graphics in the #' \href{http://joey711.github.io/phyloseq/plot_tree-examples}{phyloseq online tutorials}. #' #' @importFrom scales log_trans #' #' @importFrom data.table setkey #' @importFrom data.table setkeyv #' #' @importFrom ggplot2 geom_segment #' @importFrom ggplot2 scale_x_continuous #' @importFrom ggplot2 scale_size_continuous #' @importFrom ggplot2 element_blank #' #' @export #' @examples #' # # Using plot_tree() with the esophagus dataset. #' # # Please note that many more interesting examples are shown #' # # in the online tutorials" #' # # http://joey711.github.io/phyloseq/plot_tree-examples #' data(esophagus) #' # plot_tree(esophagus) #' # plot_tree(esophagus, color="Sample") #' # plot_tree(esophagus, size="Abundance") #' # plot_tree(esophagus, size="Abundance", color="samples") #' plot_tree(esophagus, size="Abundance", color="Sample", base.spacing=0.03) #' plot_tree(esophagus, size="abundance", color="samples", base.spacing=0.03) plot_tree = function(physeq, method="sampledodge", nodelabf=NULL, color=NULL, shape=NULL, size=NULL, min.abundance=Inf, label.tips=NULL, text.size=NULL, sizebase=5, base.spacing = 0.02, ladderize=FALSE, plot.margin=0.2, title=NULL, treetheme=NULL, justify="jagged"){ ######################################## # Support mis-capitalization of reserved variable names in color, shape, size # This helps, for instance, with backward-compatibility where "abundance" # was the reserved variable name for mapping OTU abundance entries fix_reserved_vars = function(aesvar){ aesvar <- gsub("^abundance[s]{0,}$", "Abundance", aesvar, ignore.case=TRUE) aesvar <- gsub("^OTU[s]{0,}$", "OTU", aesvar, ignore.case=TRUE) aesvar <- gsub("^taxa_name[s]{0,}$", "OTU", aesvar, ignore.case=TRUE) aesvar <- gsub("^sample[s]{0,}$", "Sample", aesvar, ignore.case=TRUE) return(aesvar) } if(!is.null(label.tips)){label.tips <- fix_reserved_vars(label.tips)} if(!is.null(color)){color <- fix_reserved_vars(color)} if(!is.null(shape)){shape <- fix_reserved_vars(shape)} if(!is.null(size) ){size <- fix_reserved_vars(size)} ######################################## if( is.null(phy_tree(physeq, FALSE)) ){ stop("There is no phylogenetic tree in the object you have provided.\n", "Try phy_tree(physeq) to see for yourself.") } if(!inherits(physeq, "phyloseq")){ # If only a phylogenetic tree, then only tree available to overlay. method <- "treeonly" } # Create the tree data.table treeSegs <- tree_layout(phy_tree(physeq), ladderize=ladderize) edgeMap = aes(x=xleft, xend=xright, y=y, yend=y) vertMap = aes(x=x, xend=x, y=vmin, yend=vmax) # Initialize phylogenetic tree. # Naked, lines-only, unannotated tree as first layers. Edge (horiz) first, then vertical. p = ggplot(data=treeSegs$edgeDT) + geom_segment(edgeMap) + geom_segment(vertMap, data=treeSegs$vertDT) # If no text.size given, calculate it from number of tips ("species", aka taxa) # This is very fast. No need to worry about whether text is printed or not. if(is.null(text.size)){ text.size <- manytextsize(ntaxa(physeq)) } # Add the species labels to the right. if(!is.null(label.tips) & method!="sampledodge"){ # If method is sampledodge, then labels are added to the right of points, later. # Add labels layer to plotting object. labelDT = treeSegs$edgeDT[!is.na(OTU), ] if(!is.null(tax_table(object=physeq, errorIfNULL=FALSE))){ # If there is a taxonomy available, merge it with the label data.table taxDT = data.table(tax_table(physeq), OTU=taxa_names(physeq), key="OTU") # Merge with taxonomy. labelDT = merge(x=labelDT, y=taxDT, by="OTU") } if(justify=="jagged"){ # Tip label aesthetic mapping. # Aesthetics can be NULL, and that aesthetic gets ignored. labelMap <- aes_string(x="xright", y="y", label=label.tips, color=color) } else { # The left-justified version of tip-labels. labelMap <- aes_string(x="max(xright, na.rm=TRUE)", y="y", label=label.tips, color=color) } p <- p + geom_text(labelMap, data=labelDT, size=I(text.size), hjust=-0.1, na.rm=TRUE) } # Node label section. # # If no nodelabf ("node label function") given, ask internal function to pick one. # Is NULL by default, meaning will dispatch to `howtolabnodes` to select function. # For no node labels, the "dummy" function `nodeplotblank` will return tree plot # object, p, as-is, unmodified. if(is.null(nodelabf)){ nodelabf = howtolabnodes(physeq) } #### set node `y` as the mean of the vertical segment # Use the provided/inferred node label function to add the node labels layer(s) # Non-root nodes first p = nodelabf(p, treeSegs$edgeDT[!is.na(label), ]) # Add root label (if present) p = nodelabf(p, treeSegs$vertDT[!is.na(label), ]) # Theme specification if(is.null(treetheme)){ # If NULL, then use the default tree theme. treetheme <- theme(axis.ticks = element_blank(), axis.title.x=element_blank(), axis.text.x=element_blank(), axis.title.y=element_blank(), axis.text.y=element_blank(), panel.background = element_blank(), panel.grid.minor = element_blank(), panel.grid.major = element_blank()) } if(inherits(treetheme, "theme")){ # If a theme, add theme layer to plot. # For all other cases, skip this, which will cause default theme to be used p <- p + treetheme } # Optionally add a title to the plot if(!is.null(title)){ p <- p + ggtitle(title) } if(method!="sampledodge"){ # If anything but a sampledodge tree, return now without further decorations. return(p) } ######################################## # Sample Dodge Section # Special words, c("Sample", "Abundance", "OTU") # See psmelt() ######################################## # Initialize the species/taxa/OTU data.table dodgeDT = treeSegs$edgeDT[!is.na(OTU), ] # Merge with psmelt() result, to make all co-variables available dodgeDT = merge(x=dodgeDT, y=data.table(psmelt(physeq), key="OTU"), by="OTU") if(justify=="jagged"){ # Remove 0 Abundance value entries now, not later, for jagged. dodgeDT <- dodgeDT[Abundance > 0, ] } # Set key. Changes `dodgeDT` in place. OTU is first key, always. if( !is.null(color) | !is.null(shape) | !is.null(size) ){ # If color, shape, or size is chosen, setkey by those as well setkeyv(dodgeDT, cols=c("OTU", color, shape, size)) } else { # Else, set key by OTU and sample name. setkey(dodgeDT, OTU, Sample) } # Add sample-dodge horizontal adjustment index. In-place data.table assignment dodgeDT[, h.adj.index := 1:length(xright), by=OTU] # `base.spacing` is a user-input parameter. # The sampledodge step size is based on this and the max `x` value if(justify=="jagged"){ dodgeDT[, xdodge:=(xright + h.adj.index * base.spacing * max(xright, na.rm=TRUE))] } else { # Left-justified version, `xdodge` always starts at the max of all `xright` values. dodgeDT[, xdodge := max(xright, na.rm=TRUE) + h.adj.index * base.spacing * max(xright, na.rm=TRUE)] # zeroes removed only after all sample points have been mapped. dodgeDT <- dodgeDT[Abundance > 0, ] } # The general tip-point map. Objects can be NULL, and that aesthetic gets ignored. dodgeMap <- aes_string(x="xdodge", y="y", color=color, fill=color, shape=shape, size=size) p <- p + geom_point(dodgeMap, data=dodgeDT, na.rm=TRUE) # Adjust point size transform if( !is.null(size) ){ p <- p + scale_size_continuous(trans=log_trans(sizebase)) } # Optionally-add abundance value label to each point. # User controls this by the `min.abundance` parameter. # A value of `Inf` implies no labels. if( any(dodgeDT$Abundance >= min.abundance[1]) ){ pointlabdf = dodgeDT[Abundance>=min.abundance[1], ] p <- p + geom_text(mapping=aes(xdodge, y, label=Abundance), data=pointlabdf, size=text.size, na.rm=TRUE) } # If indicated, add the species labels to the right of dodged points. if(!is.null(label.tips)){ # `tiplabDT` has only one row per tip, the farthest horizontal # adjusted position (one for each taxa) tiplabDT = dodgeDT tiplabDT[, xfartiplab:=max(xdodge), by=OTU] tiplabDT <- tiplabDT[h.adj.index==1, .SD, by=OTU] if(!is.null(color)){ if(color %in% sample_variables(physeq, errorIfNULL=FALSE)){ color <- NULL } } labelMap <- NULL if(justify=="jagged"){ labelMap <- aes_string(x="xfartiplab", y="y", label=label.tips, color=color) } else { labelMap <- aes_string(x="max(xfartiplab, na.rm=TRUE)", y="y", label=label.tips, color=color) } # Add labels layer to plotting object. p <- p + geom_text(labelMap, tiplabDT, size=I(text.size), hjust=-0.1, na.rm=TRUE) } # Plot margins. # Adjust the tree graphic plot margins. # Helps to manually ensure that graphic elements aren't clipped, # especially when there are long tip labels. min.x <- -0.01 # + dodgeDT[, min(c(xleft))] max.x <- dodgeDT[, max(xright, na.rm=TRUE)] if("xdodge" %in% names(dodgeDT)){ max.x <- dodgeDT[, max(xright, xdodge, na.rm=TRUE)] } if(plot.margin > 0){ max.x <- max.x * (1.0 + plot.margin) } p <- p + scale_x_continuous(limits=c(min.x, max.x)) return(p) } ################################################################################ # Adapted from NeatMap-package. # Vectorized for speed and simplicity, also only calculates theta and not r. #' @keywords internal RadialTheta <- function(pos){ pos = as(pos, "matrix") xc = mean(pos[, 1]) yc = mean(pos[, 2]) theta = atan2((pos[, 2] - yc), (pos[, 1] - xc)) names(theta) <- rownames(pos) return(theta) } ################################################################################ #' Create an ecologically-organized heatmap using ggplot2 graphics #' #' There are many useful examples of phyloseq heatmap graphics in the #' \href{http://joey711.github.io/phyloseq/plot_heatmap-examples}{phyloseq online tutorials}. #' In a 2010 article in BMC Genomics, Rajaram and Oono show describe an #' approach to creating a heatmap using ordination methods to organize the #' rows and columns instead of (hierarchical) cluster analysis. In many cases #' the ordination-based ordering does a much better job than h-clustering. #' An immediately useful example of their approach is provided in the NeatMap #' package for R. The NeatMap package can be used directly on the abundance #' table (\code{\link{otu_table-class}}) of phylogenetic-sequencing data, but #' the NMDS or PCA ordination options that it supports are not based on ecological #' distances. To fill this void, phyloseq provides the \code{plot_heatmap()} #' function as an ecology-oriented variant of the NeatMap approach to organizing #' a heatmap and build it using ggplot2 graphics tools. #' The \code{distance} and \code{method} arguments are the same as for the #' \code{\link{plot_ordination}} function, and support large number of #' distances and ordination methods, respectively, with a strong leaning toward #' ecology. #' This function also provides the options to re-label the OTU and sample #' axis-ticks with a taxonomic name and/or sample variable, respectively, #' in the hope that this might hasten your interpretation of the patterns #' (See the \code{sample.label} and \code{taxa.label} documentation, below). #' Note that this function makes no attempt to overlay hierarchical #' clustering trees on the axes, as hierarchical clustering is not used to #' organize the plot. Also note that each re-ordered axis repeats at the edge, #' and so apparent clusters at the far right/left or top/bottom of the #' heat-map may actually be the same. For now, the placement of this edge #' can be considered arbitrary, so beware of this artifact of this graphical #' representation. If you benefit from this phyloseq-specific implementation #' of the NeatMap approach, please cite both our packages/articles. #' #' This approach borrows heavily from the \code{heatmap1} function in the #' \code{NeatMap} package. Highly recommended, and we are grateful for their #' package and ideas, which we have adapted for our specific purposes here, #' but did not use an explicit dependency. At the time of the first version #' of this implementation, the NeatMap package depends on the rgl-package, #' which is not needed in phyloseq, at present. Although likely a transient #' issue, the rgl-package has some known installation issues that have further #' influenced to avoid making NeatMap a formal dependency (Although we love #' both NeatMap and rgl!). #' #' @param physeq (Required). The data, in the form of an instance of the #' \code{\link{phyloseq-class}}. This should be what you get as a result #' from one of the #' \code{\link{import}} functions, or any of the processing downstream. #' No data components beyond the \code{\link{otu_table}} are strictly #' necessary, though they may be useful if you want to re-label the #' axis ticks according to some observable or taxonomic rank, for instance, #' or if you want to use a \code{\link{UniFrac}}-based distance #' (in which case your \code{physeq} data would need to have a tree included). #' #' @param method (Optional). #' The ordination method to use for organizing the #' heatmap. A great deal of the usefulness of a heatmap graphic depends upon #' the way in which the rows and columns are ordered. #' #' @param distance (Optional). A character string. #' The ecological distance method to use in the ordination. #' See \code{\link{distance}}. #' #' @param sample.label (Optional). A character string. #' The sample variable by which you want to re-label the sample (horizontal) axis. #' #' @param taxa.label (Optional). A character string. #' The name of the taxonomic rank by which you want to #' re-label the taxa/species/OTU (vertical) axis. #' You can see available options in your data using #' \code{\link{rank_names}(physeq)}. #' #' @param low (Optional). A character string. An R color. #' See \code{?\link{colors}} for options support in R (there are lots). #' The color that represents the lowest non-zero value #' in the heatmap. Default is a dark blue color, \code{"#000033"}. #' #' @param high (Optional). A character string. An R color. #' See \code{\link{colors}} for options support in R (there are lots). #' The color that will represent the highest #' value in the heatmap. The default is \code{"#66CCFF"}. #' Zero-values are treated as \code{NA}, and set to \code{"black"}, to represent #' a background color. #' #' @param na.value (Optional). A character string. An R color. #' See \code{\link{colors}} for options support in R (there are lots). #' The color to represent what is essentially the background of the plot, #' the non-observations that occur as \code{NA} or #' \code{0} values in the abundance table. The default is \code{"black"}, which #' works well on computer-screen graphics devices, but may be a poor choice for #' printers, in which case you might want this value to be \code{"white"}, and #' reverse the values of \code{high} and \code{low}, above. #' #' @param trans (Optional). \code{"trans"}-class transformer-definition object. #' A numerical transformer to use in #' the continuous color scale. See \code{\link[scales]{trans_new}} for details. #' The default is \code{\link{log_trans}(4)}. #' #' @param max.label (Optional). Integer. Default is 250. #' The maximum number of labeles to fit on a given axis (either x or y). #' If number of taxa or samples exceeds this value, #' the corresponding axis will be stripped of any labels. #' #' This supercedes any arguments provided to #' \code{sample.label} or \code{taxa.label}. #' Make sure to increase this value if, for example, #' you want a special label #' for an axis that has 300 indices. #' #' @param title (Optional). Default \code{NULL}. Character string. #' The main title for the graphic. #' #' @param sample.order (Optional). Default \code{NULL}. #' Either a single character string matching #' one of the \code{\link{sample_variables}} in your data, #' or a character vector of \code{\link{sample_names}} #' in the precise order that you want them displayed in the heatmap. #' This overrides any ordination ordering that might be done #' with the \code{method}/\code{distance} arguments. #' #' @param taxa.order (Optional). Default \code{NULL}. #' Either a single character string matching #' one of the \code{\link{rank_names}} in your data, #' or a character vector of \code{\link{taxa_names}} #' in the precise order that you want them displayed in the heatmap. #' This overrides any ordination ordering that might be done #' with the \code{method}/\code{distance} arguments. #' #' @param first.sample (Optional). Default \code{NULL}. #' A character string matching one of the \code{\link{sample_names}} #' of your input data (\code{physeq}). #' It will become the left-most sample in the plot. #' For the ordination-based ordering (recommended), #' the left and right edges of the axes are adjaacent in a continuous ordering. #' Therefore, the choice of starting sample is meaningless and arbitrary, #' but it is aesthetically poor to have the left and right edge split #' a natural cluster in the data. #' This argument allows you to specify the left edge #' and thereby avoid cluster-splitting, emphasize a gradient, etc. #' #' @param first.taxa (Optional). Default \code{NULL}. #' A character string matching one of the \code{\link{taxa_names}} #' of your input data (\code{physeq}). #' This is equivalent to \code{first.sample} (above), #' but for the taxa/OTU indices, usually the vertical axis. #' #' @param ... (Optional). Additional parameters passed to \code{\link{ordinate}}. #' #' @return #' A heatmap plot, in the form of a \code{\link{ggplot}2} plot object, #' which can be further saved and modified. #' #' @references #' Because this function relies so heavily in principle, and in code, on some of the #' functionality in NeatMap, please site their article if you use this function #' in your work. #' #' Rajaram, S., & Oono, Y. (2010). #' NeatMap--non-clustering heat map alternatives in R. BMC Bioinformatics, 11, 45. #' #' Please see further examples in the #' \href{http://joey711.github.io/phyloseq/plot_heatmap-examples}{phyloseq online tutorials}. #' #' @importFrom vegan scores #' #' @importFrom scales log_trans #' #' @importFrom ggplot2 scale_fill_gradient #' @importFrom ggplot2 scale_y_discrete #' @importFrom ggplot2 scale_x_discrete #' @importFrom ggplot2 scale_fill_gradient #' @importFrom ggplot2 geom_raster #' #' @export #' @examples #' data("GlobalPatterns") #' gpac <- subset_taxa(GlobalPatterns, Phylum=="Crenarchaeota") #' # FYI, the base-R function uses a non-ecological ordering scheme, #' # but does add potentially useful hclust dendrogram to the sides... #' gpac <- subset_taxa(GlobalPatterns, Phylum=="Crenarchaeota") #' # Remove the nearly-empty samples (e.g. 10 reads or less) #' gpac = prune_samples(sample_sums(gpac) > 50, gpac) #' # Arbitrary order if method set to NULL #' plot_heatmap(gpac, method=NULL, sample.label="SampleType", taxa.label="Family") #' # Use ordination #' plot_heatmap(gpac, sample.label="SampleType", taxa.label="Family") #' # Use ordination for OTUs, but not sample-order #' plot_heatmap(gpac, sample.label="SampleType", taxa.label="Family", sample.order="SampleType") #' # Specifying both orders omits any attempt to use ordination. The following should be the same. #' p0 = plot_heatmap(gpac, sample.label="SampleType", taxa.label="Family", taxa.order="Phylum", sample.order="SampleType") #' p1 = plot_heatmap(gpac, method=NULL, sample.label="SampleType", taxa.label="Family", taxa.order="Phylum", sample.order="SampleType") #' #expect_equivalent(p0, p1) #' # Example: Order matters. Random ordering of OTU indices is difficult to interpret, even with structured sample order #' rando = sample(taxa_names(gpac), size=ntaxa(gpac), replace=FALSE) #' plot_heatmap(gpac, method=NULL, sample.label="SampleType", taxa.label="Family", taxa.order=rando, sample.order="SampleType") #' # # Select the edges of each axis. #' # First, arbitrary edge, ordering #' plot_heatmap(gpac, method=NULL) #' # Second, biological-ordering (instead of default ordination-ordering), but arbitrary edge #' plot_heatmap(gpac, taxa.order="Family", sample.order="SampleType") #' # Third, biological ordering, selected edges #' plot_heatmap(gpac, taxa.order="Family", sample.order="SampleType", first.taxa="546313", first.sample="NP2") #' # Fourth, add meaningful labels #' plot_heatmap(gpac, sample.label="SampleType", taxa.label="Family", taxa.order="Family", sample.order="SampleType", first.taxa="546313", first.sample="NP2") plot_heatmap <- function(physeq, method="NMDS", distance="bray", sample.label=NULL, taxa.label=NULL, low="#000033", high="#66CCFF", na.value="black", trans=log_trans(4), max.label=250, title=NULL, sample.order=NULL, taxa.order=NULL, first.sample=NULL, first.taxa=NULL, ...){ # User-override ordering if( !is.null(taxa.order) & length(taxa.order)==1 ){ # Assume `taxa.order` is a tax_table variable. Use it for ordering. rankcol = which(rank_names(physeq) %in% taxa.order) taxmat = as(tax_table(physeq)[, 1:rankcol], "matrix") taxa.order = apply(taxmat, 1, paste, sep="", collapse="") names(taxa.order) <- taxa_names(physeq) taxa.order = names(sort(taxa.order, na.last=TRUE)) } if( !is.null(sample.order) & length(sample.order)==1 ){ # Assume `sample.order` is a sample variable. Use it for ordering. sample.order = as.character(get_variable(physeq, sample.order)) names(sample.order) <- sample_names(physeq) sample.order = names(sort(sample.order, na.last=TRUE)) } if( !is.null(method) & (is.null(taxa.order) | is.null(sample.order)) ){ # Only attempt NeatMap if method is non-NULL & at least one of # taxa.order and sample.order is not-yet defined. # If both axes orders pre-defined by user, no need to perform ordination... # Copy the approach from NeatMap by doing ordination on samples, but use # phyloseq-wrapped distance/ordination procedures. # Reorder by the angle in radial coordinates on the 2-axis plane. # In case of NMDS iterations, capture the output so it isn't dumped on standard-out junk = capture.output( ps.ord <- ordinate(physeq, method, distance, ...), file=NULL) if( is.null(sample.order) ){ siteDF = NULL # Only define new ord-based sample order if user did not define one already trash1 = try({siteDF <- scores(ps.ord, choices = c(1, 2), display="sites", physeq=physeq)}, silent = TRUE) if(inherits(trash1, "try-error")){ # warn that the attempt to get ordination coordinates for ordering failed. warning("Attempt to access ordination coordinates for sample ordering failed.\n", "Using default sample ordering.") } if(!is.null(siteDF)){ # If the score accession seemed to work, go ahead and replace sample.order sample.order <- sample_names(physeq)[order(RadialTheta(siteDF))] } } if( is.null(taxa.order) ){ # re-order species/taxa/OTUs, if possible, # and only if user did not define an order already specDF = NULL trash2 = try({specDF <- scores(ps.ord, choices=c(1, 2), display="species", physeq=physeq)}, silent = TRUE) if(inherits(trash2, "try-error")){ # warn that the attempt to get ordination coordinates for ordering failed. warning("Attempt to access ordination coordinates for feature/species/taxa/OTU ordering failed.\n", "Using default feature/species/taxa/OTU ordering.") } if(!is.null(specDF)){ # If the score accession seemed to work, go ahead and replace sample.order taxa.order = taxa_names(physeq)[order(RadialTheta(specDF))] } } } # Now that index orders are determined, check/assign edges of axes, if specified if( !is.null(first.sample) ){ sample.order = chunkReOrder(sample.order, first.sample) } if( !is.null(first.taxa) ){ taxa.order = chunkReOrder(taxa.order, first.taxa) } # melt physeq with the standard user-accessible data melting function # for creating plot-ready data.frames, psmelt. # This is also used inside some of the other plot_* functions. adf = psmelt(physeq) # Coerce the main axis variables to character. # Will reset them to factor if re-ordering is needed. adf$OTU = as(adf$OTU, "character") adf$Sample = as(adf$Sample, "character") if( !is.null(sample.order) ){ # If sample-order is available, coerce to factor with special level-order adf$Sample = factor(adf$Sample, levels=sample.order) } else { # Make sure it is a factor, but with default order/levels adf$Sample = factor(adf$Sample) } if( !is.null(taxa.order) ){ # If OTU-order is available, coerce to factor with special level-order adf$OTU = factor(adf$OTU, levels=taxa.order) } else { # Make sure it is a factor, but with default order/levels adf$OTU = factor(adf$OTU) } ## Now the plotting part # Initialize p. p = ggplot(adf, aes(x = Sample, y = OTU, fill=Abundance)) + geom_raster() # # Don't render labels if more than max.label # Samples if( nsamples(physeq) <= max.label ){ # Add resize layer for samples if there are fewer than max.label p <- p + theme( axis.text.x = element_text( size=manytextsize(nsamples(physeq), 4, 30, 12), angle=-90, vjust=0.5, hjust=0 ) ) } else { # Remove the labels from any rendering. p = p + scale_x_discrete("Sample", labels="") } # OTUs if( ntaxa(physeq) <= max.label ){ # Add resize layer for OTUs if there are fewer than max.label p <- p + theme( axis.text.y = element_text( size=manytextsize(ntaxa(physeq), 4, 30, 12) ) ) } else { # Remove the labels from any rendering. p = p + scale_y_discrete("OTU", labels="") } # # Axis Relabeling (Skipped if more than max.label): # Re-write sample-labels to some sample variable... if( !is.null(sample.label) & nsamples(physeq) <= max.label){ # Make a sample-named char-vector of the values for sample.label labvec = as(get_variable(physeq, sample.label), "character") names(labvec) <- sample_names(physeq) if( !is.null(sample.order) ){ # Re-order according to sample.order labvec = labvec[sample.order] } # Replace any NA (missing) values with "" instead. Avoid recycling labels. labvec[is.na(labvec)] <- "" # Add the sample.label re-labeling layer p = p + scale_x_discrete(sample.label, labels=labvec) } if( !is.null(taxa.label) & ntaxa(physeq) <= max.label){ # Make a OTU-named vector of the values for taxa.label labvec <- as(tax_table(physeq)[, taxa.label], "character") names(labvec) <- taxa_names(physeq) if( !is.null(taxa.order) ){ # Re-order according to taxa.order labvec <- labvec[taxa.order] } # Replace any NA (missing) values with "" instead. Avoid recycling labels. labvec[is.na(labvec)] <- "" # Add the taxa.label re-labeling layer p = p + scale_y_discrete(taxa.label, labels=labvec) } # Color scale transformations if( !is.null(trans) ){ p = p + scale_fill_gradient(low=low, high=high, trans=trans, na.value=na.value) } else { p = p + scale_fill_gradient(low=low, high=high, na.value=na.value) } # Optionally add a title to the plot if( !is.null(title) ){ p = p + ggtitle(title) } return(p) } ################################################################################ #' Chunk re-order a vector so that specified newstart is first. #' #' Different than relevel. #' #' @keywords internal #' @examples #' # Typical use-case #' # chunkReOrder(1:10, 5) #' # # Default is to not modify the vector #' # chunkReOrder(1:10) #' # # Another example not starting at 1 #' # chunkReOrder(10:25, 22) #' # # Should silently ignore the second element of `newstart` #' # chunkReOrder(10:25, c(22, 11)) #' # # Should be able to handle `newstart` being the first argument already #' # # without duplicating the first element at the end of `x` #' # chunkReOrder(10:25, 10) #' # all(chunkReOrder(10:25, 10) == 10:25) #' # # This is also the default #' # all(chunkReOrder(10:25) == 10:25) #' # # An example with characters #' # chunkReOrder(LETTERS, "G") #' # chunkReOrder(LETTERS, "B") #' # chunkReOrder(LETTERS, "Z") #' # # What about when `newstart` is not in `x`? Return x as-is, throw warning. #' # chunkReOrder(LETTERS, "g") chunkReOrder = function(x, newstart = x[[1]]){ pivot = match(newstart[1], x, nomatch = NA) # If pivot `is.na`, throw warning, return x as-is if(is.na(pivot)){ warning("The `newstart` argument was not in `x`. Returning `x` without reordering.") newx = x } else { newx = c(tail(x, {length(x) - pivot + 1}), head(x, pivot - 1L)) } return(newx) } ################################################################################ #' Create a ggplot summary of gap statistic results #' #' @param clusgap (Required). #' An object of S3 class \code{"clusGap"}, basically a list with components. #' See the \code{\link[cluster]{clusGap}} documentation for more details. #' In most cases this will be the output of \code{\link{gapstat_ord}}, #' or \code{\link[cluster]{clusGap}} if you called it directly. #' #' @param title (Optional). Character string. #' The main title for the graphic. #' Default is \code{"Gap Statistic results"}. #' #' @return #' A \code{\link[ggplot2]{ggplot}} plot object. #' The rendered graphic should be a plot of the gap statistic score #' versus values for \code{k}, the number of clusters. #' #' @seealso #' \code{\link{gapstat_ord}} #' #' \code{\link[cluster]{clusGap}} #' #' \code{\link[ggplot2]{ggplot}} #' #' @importFrom ggplot2 geom_errorbar #' @importFrom ggplot2 geom_line #' #' @export #' #' @examples #' # Load and process data #' data("soilrep") #' soilr = rarefy_even_depth(soilrep, rngseed=888) #' print(soilr) #' sample_variables(soilr) #' # Ordination #' sord = ordinate(soilr, "DCA") #' # Gap Statistic #' gs = gapstat_ord(sord, axes=1:4, verbose=FALSE) #' # Evaluate results with plots, etc. #' plot_scree(sord) #' plot_ordination(soilr, sord, color="Treatment") #' plot_clusgap(gs) #' print(gs, method="Tibs2001SEmax") #' # Non-ordination example, use cluster::clusGap function directly #' library("cluster") #' pam1 = function(x, k){list(cluster = pam(x, k, cluster.only=TRUE))} #' gs.pam.RU = clusGap(ruspini, FUN = pam1, K.max = 8, B = 60) #' gs.pam.RU #' plot(gs.pam.RU, main = "Gap statistic for the 'ruspini' data") #' mtext("k = 4 is best .. and k = 5 pretty close") #' plot_clusgap(gs.pam.RU) plot_clusgap = function(clusgap, title="Gap Statistic results"){ gstab = data.frame(clusgap$Tab, k = 1:nrow(clusgap$Tab)) p = ggplot(gstab, aes(k, gap)) + geom_line() + geom_point(size = 5) p = p + geom_errorbar(aes(ymax = gap + SE.sim, ymin = gap - SE.sim)) p = p + ggtitle(title) return(p) } ################################################################################phyloseq/R/sampleData-class.R0000644000175400017540000001351313175714136017161 0ustar00biocbuildbiocbuild################################################################################ #' Build or access sample_data. #' #' This is the suggested method for both constructing and accessing a table #' of sample-level variables (\code{\link{sample_data-class}}), #' which in the \code{\link{phyloseq-package}} is represented as a special #' extension of the \code{\link{data.frame-class}}. #' When the #' argument is a \code{\link{data.frame}}, \code{sample_data} will create #' a sample_data-class object. #' In this case, the rows should be named to match the #' \code{\link{sample_names}} of the other objects to which it will ultimately be paired. #' Alternatively, if the first argument is an experiment-level (\code{\link{phyloseq-class}}) #' object, then the corresponding \code{sample_data} is returned. #' Like other accessors (see See Also, below), the default behavior of this method #' is to stop with an #' error if \code{object} is a \code{phyloseq-class} but does not #' contain a \code{sample_data}. #' #' @usage sample_data(object, errorIfNULL=TRUE) #' #' @param object (Required). A \code{\link{data.frame-class}}, #' or a \code{\link{phyloseq-class}} object. #' #' @param errorIfNULL (Optional). Logical. Should the accessor stop with #' an error if the slot is empty (\code{NULL})? Default \code{TRUE}. #' #' @return A \code{\link{sample_data-class}} object #' representing the sample variates of an experiment. #' #' @seealso \code{\link{phy_tree}}, \code{\link{tax_table}}, \code{\link{otu_table}} #' \code{\link{phyloseq}}, \code{\link{merge_phyloseq}} #' #' @aliases sample_data #' #' @rdname sample_data-methods #' @docType methods #' @export #' #' @examples # #' data(soilrep) #' head(sample_data(soilrep)) setGeneric("sample_data", function(object, errorIfNULL=TRUE) standardGeneric("sample_data")) #' @rdname sample_data-methods #' @aliases sample_data,ANY-method setMethod("sample_data", "ANY", function(object, errorIfNULL=TRUE){ access(object, "sam_data", errorIfNULL) }) # constructor; for creating sample_data from a data.frame #' @rdname sample_data-methods #' @aliases sample_data,data.frame-method setMethod("sample_data", "data.frame", function(object){ # Make sure there are no phantom levels in categorical variables object <- reconcile_categories(object) # instantiate first to check validity SM <- new("sample_data", object) # Want dummy samples index names if missing if( all(rownames(SM) == as.character(1:nrow(SM))) ){ rownames(SM) <- paste("sa", 1:nrow(SM), sep="") } return(SM) }) ################################################################################ #' Cleans absent levels in sample_data/data.frame. #' #' This is used internally by the builder method, \code{\link{sample_data}}, to #' ensure that the factors describing categorical variables in a data.frame or #' sample_data object are free of extra levels that can plague downstream plots #' analysis. #' #' @usage reconcile_categories(DFSM) #' #' @param DFSM (Required). A \code{data.frame} or \code{sample_data} object that needs to be cleaned. #' #' @return A single \code{data.frame} object. Even if the input argument is a \code{sample_data}, #' the return is a \code{data.frame}. Because this is intended to be used internally by #' the builder method, it cannot also call the builder function to re-build #' the cleaned \code{sample_data}. #' #' @keywords internal #' #' @examples #' # # # data(GlobalPatterns) #' # # # SM <- sample_data(GlobalPatterns) #' # # # DF <- data.frame(SM) #' # # # DF <- data.frame(DF, col1=1:nrow(DF), col2=paste(1:nrow(DF), "t", sep="")) #' # # # DF <- reconcile_categories(DF) #' # # # SM <- sample_data(reconcile_categories(SM)) #' # # # sapply(DF, class) #' # # # sapply(SM, class) reconcile_categories <- function(DFSM){ DF = as(DFSM, "data.frame") return(droplevels(DF)) } ################################################################################ #' Subset samples by sample_data expression #' #' This is a convenience wrapper around the \code{\link{subset}} function. #' It is intended to allow subsetting complex experimental objects with one #' function call. #' Subsetting is based on an expression for which the context first includes #' the variables contained in \code{\link{sample_data}}. #' The \code{samples} retained in the dataset is equivalent to #' \code{x[subset & !is.na(subset)]}, where \code{x} is the vector of sample IDs #' and \code{subset} is the logical that results from your subsetting expression. #' This is important to keep in mind, as users are often unaware that this #' subsetting step also removes/omits samples that have a missing value, \code{NA}, #' somewhere in the expression. #' #' @usage subset_samples(physeq, ...) #' #' @param physeq A \code{\link{sample_data-class}}, or a \code{\link{phyloseq-class}} #' object with a #' \code{sample_data}. If the \code{sample_data} slot is missing in \code{physeq}, #' then \code{physeq} will be returned as-is, and a warning will be printed to screen. #' #' @param ... The subsetting expression that should be applied to the #' \code{sample_data}. This is passed on to \code{\link{subset}}, see its #' documentation for more details. #' #' @return A subsetted object with the same class as \code{physeq}. #' #' @seealso \code{\link{subset_species}} #' #' @export #' @rdname subset_samples-methods #' @docType methods #' #' @examples #' # data(GlobalPatterns) #' # subset_samples(GlobalPatterns, SampleType=="Ocean") subset_samples <- function(physeq, ...){ if( is.null(sample_data(physeq)) ){ cat("Nothing subset. No sample_data in physeq.\n") return(physeq) } else { oldDF <- as(sample_data(physeq), "data.frame") newDF <- subset(oldDF, ...) if( class(physeq) == "sample_data" ){ return(sample_data(newDF)) } else { sample_data(physeq) <- sample_data(newDF) return(physeq) } } } ################################################################################ phyloseq/R/show-methods.R0000644000175400017540000000575113175714136016431 0ustar00biocbuildbiocbuild############################################################################ #' @rdname show-methods setMethod("show", "otu_table", function(object){ # print otu_table (always there). cat(paste("OTU Table: [", ntaxa(object), " taxa and ", nsamples(object), " samples]", sep = ""), fill = TRUE) if( taxa_are_rows(object) ){ cat(" taxa are rows", fill=TRUE) } else { cat(" taxa are columns", fill=TRUE) } show(as(object, "matrix")) }) ############################################################################ #' @rdname show-methods setMethod("show", "sample_data", function(object){ cat(paste("Sample Data: [", dim(sample_data(object))[1], " samples by ", dim(sample_data(object))[2], " sample variables]:", sep = ""), fill = TRUE) show(as(object, "data.frame")) }) ############################################################################ #' @rdname show-methods setMethod("show", "taxonomyTable", function(object){ cat(paste("Taxonomy Table: [", dim(object)[1], " taxa by ", dim(object)[2], " taxonomic ranks]:", sep = ""), fill = TRUE) show(as(object, "matrix")) }) ############################################################################ #' method extensions to show for phyloseq objects. #' #' See the general documentation of \code{\link[methods]{show}} method for #' expected behavior. #' #' @seealso \code{\link[methods]{show}} #' #' @inheritParams methods::show #' @export #' @rdname show-methods #' @examples #' # data(GlobalPatterns) #' # show(GlobalPatterns) #' # GlobalPatterns setMethod("show", "phyloseq", function(object){ cat("phyloseq-class experiment-level object", fill=TRUE) # print otu_table (always there). cat(paste("otu_table() OTU Table: [ ", ntaxa(otu_table(object)), " taxa and ", nsamples(otu_table(object)), " samples ]", sep = ""), fill = TRUE) # print Sample Data if there if(!is.null(sample_data(object, FALSE))){ cat(paste("sample_data() Sample Data: [ ", dim(sample_data(object))[1], " samples by ", dim(sample_data(object))[2], " sample variables ]", sep = ""), fill = TRUE) } # print tax Tab if there if(!is.null(tax_table(object, FALSE))){ cat(paste("tax_table() Taxonomy Table: [ ", dim(tax_table(object))[1], " taxa by ", dim(tax_table(object))[2], " taxonomic ranks ]", sep = ""), fill = TRUE) } # print tree if there if(!is.null(phy_tree(object, FALSE))){ cat(paste("phy_tree() Phylogenetic Tree: [ ", ntaxa(phy_tree(object)), " tips and ", phy_tree(object)$Nnode, " internal nodes ]", sep = ""), fill = TRUE ) } # print refseq summary if there if(!is.null(refseq(object, FALSE))){ cat(paste("refseq() ", class(refseq(object))[1], ": [ ", ntaxa(refseq(object)), " reference sequences ]", sep = ""), fill=TRUE) } }) ############################################################################ phyloseq/R/taxonomyTable-class.R0000644000175400017540000001271613175714136017740 0ustar00biocbuildbiocbuild################################################################################ #' Build or access the taxonomyTable. #' #' This is the suggested method for both constructing and accessing a table of #' taxonomic names, organized with ranks as columns (\code{\link{taxonomyTable-class}}). #' When the argument is a character matrix, tax_table() will create and return a #' \code{\link{taxonomyTable-class}} object. #' In this case, the rows should be named to match the #' \code{species.names} of the other objects to which it will ultimately be paired. #' Alternatively, if the first argument is an experiment-level (\code{\link{phyloseq-class}}) #' object, then the corresponding \code{taxonomyTable} is returned. #' Like other accessors (see See Also, below), the default behavior of this method #' is to stop with an #' error if \code{object} is a \code{phyloseq-class} but does not #' contain a \code{taxonomyTable}. #' #' @usage tax_table(object, errorIfNULL=TRUE) #' #' @param object An object among the set of classes defined by the phyloseq #' package that contain taxonomyTable. #' #' @param errorIfNULL (Optional). Logical. Should the accessor stop with #' an error if the slot is empty (\code{NULL})? Default \code{TRUE}. #' #' @return A \code{\link{taxonomyTable-class}} object. #' It is either grabbed from the relevant slot #' if \code{object} is complex, or built anew if \code{object} is a #' character matrix representing the taxonomic classification of #' species in the experiment. #' #' @seealso \code{\link{phy_tree}}, \code{\link{sample_data}}, \code{\link{otu_table}} #' \code{\link{phyloseq}}, \code{\link{merge_phyloseq}} #' #' @rdname tax_table-methods #' @docType methods #' @export #' #' @examples # #' # tax1 <- tax_table(matrix("abc", 30, 8)) #' # data(GlobalPatterns) #' # tax_table(GlobalPatterns) setGeneric("tax_table", function(object, errorIfNULL=TRUE) standardGeneric("tax_table")) #' @rdname tax_table-methods #' @aliases tax_table,ANY-method setMethod("tax_table", "ANY", function(object, errorIfNULL=TRUE){ access(object, "tax_table", errorIfNULL) }) # Constructor; for creating taxonomyTable from a matrix. #' @rdname tax_table-methods #' @aliases tax_table,matrix-method setMethod("tax_table", "matrix", function(object){ # Want dummy species/taxa index names if missing if(is.null(rownames(object))){ rownames(object) <- paste("sp", 1:nrow(object), sep="") } if(is.null(colnames(object))){ colnames(object) <- paste("ta", 1:ncol(object), sep="") } # instantiate as taxonomyTable return(new("taxonomyTable", object)) }) # Constructor; coerce to matrix, then pass on for creating taxonomyTable. #' @rdname tax_table-methods #' @aliases tax_table,data.frame-method setMethod("tax_table", "data.frame", function(object){ # Warn first text = "Coercing from data.frame class to character matrix \n" text = paste0(text, "prior to building taxonomyTable. \n") text = paste0(text, "This could introduce artifacts. \n") text = paste0(text, "Check your taxonomyTable, or coerce to matrix manually.") warning(text) # Coerce everything to a matrix, then char-vector, then back to matrix. TT <- matrix(as(as(object, "matrix"), "character"), nrow=nrow(object), ncol=ncol(object) ) # Pass on to matrix-method. tax_table(TT) }) ################################################################################ #' Subset species by taxonomic expression #' #' This is a convenience wrapper around the \code{\link{subset}} function. #' It is intended to speed subsetting complex experimental objects with one #' function call. In the case of \code{subset_taxa}, the subsetting will be #' based on an expression related to the columns and values within the #' \code{tax_table} (\code{taxonomyTable} component) slot of \code{physeq}. #' The \code{OTUs} retained in the dataset is equivalent to #' \code{x[subset & !is.na(subset)]}, where \code{x} is the vector of OTU IDs #' and \code{subset} is the logical that results from your subsetting expression. #' This is important to keep in mind, as users are often unaware that this #' subsetting step also removes/omits OTUs that have a missing value result, \code{NA}, #' somewhere in the expression. #' #' @usage subset_taxa(physeq, ...) #' #' @param physeq A \code{\link{taxonomyTable-class}}, or \code{\link{phyloseq-class}} that contains a #' taxonomyTable. If the \code{tax_table} slot is missing in \code{physeq}, then \code{physeq} #' will be returned as-is and a warning will be printed to screen. #' #' @param ... The subsetting expression that should be applied to the #' \code{taxonomyTable}. This is passed on to \code{\link{subset}}, and more #' details and examples about how it functions can be found in its documentation. #' #' @return A subsetted object with the same class as \code{physeq}. #' #' @seealso \code{\link{subset_samples}} #' #' @rdname subset_taxa-methods #' @docType methods #' @export #' #' @examples #' ## ex3 <- subset_taxa(GlobalPatterns, Phylum=="Bacteroidetes") subset_taxa <- function(physeq, ...){ if( is.null(tax_table(physeq)) ){ cat("Nothing subset. No taxonomyTable in physeq.\n") return(physeq) } else { oldMA <- as(tax_table(physeq), "matrix") oldDF <- data.frame(oldMA) newDF <- subset(oldDF, ...) newMA <- as(newDF, "matrix") if( inherits(physeq, "taxonomyTable") ){ return(tax_table(newMA)) } else { tax_table(physeq) <- tax_table(newMA) return(physeq) } } } ################################################################################ phyloseq/R/transform_filter-methods.R0000644000175400017540000013754713175714136021042 0ustar00biocbuildbiocbuild################################################################################ # Function to create subsampled dataset # in which each sample has same number of total observations/counts/reads # Note that the subsampling is random, so some noise is introduced making the # relative abundances slightly different ################################################################################ #' Resample an OTU table such that all samples have the same library size. #' #' Please note that the authors of phyloseq do not advocate using this #' as a normalization procedure, despite its recent popularity. #' Our justifications for using alternative approaches to address #' disparities in library sizes have been made available as #' \href{http://dx.plos.org/10.1371/journal.pcbi.1003531}{an article in PLoS Computational Biology}. #' See \code{\link{phyloseq_to_deseq2}} for a recommended alternative to rarefying #' directly supported in the phyloseq package, as well as #' \href{http://joey711.github.io/waste-not-supplemental/}{the supplemental materials for the PLoS-CB article} #' and \href{http://joey711.github.io/phyloseq-extensions}{the phyloseq extensions repository on GitHub}. #' Nevertheless, for comparison and demonstration, the rarefying procedure is implemented #' here in good faith and with options we hope are useful. #' This function uses the standard R \code{\link{sample}} function to #' resample from the abundance values #' in the \code{\link{otu_table}} component of the first argument, #' \code{physeq}. #' Often one of the major goals of this procedure is to achieve parity in #' total number of counts between samples, as an alternative to other formal #' normalization procedures, which is why a single value for the #' \code{sample.size} is expected. #' This kind of resampling can be performed with and without replacement, #' with replacement being the more computationally-efficient, default setting. #' See the \code{replace} parameter documentation for more details. #' We recommended that you explicitly select a random number generator seed #' before invoking this function, or, alternatively, that you #' explicitly provide a single positive integer argument as \code{rngseed}. #' #' This approach is sometimes mistakenly called ``rarefaction'', which #' \href{http://en.wikipedia.org/wiki/Rarefaction}{in physics refers to a form of wave decompression;} #' but in this context, ecology, the term refers to a #' \href{http://en.wikipedia.org/wiki/Rarefaction_(ecology)}{repeated sampling procedure to assess species richness}, #' first proposed in 1968 by Howard Sanders. #' In contrast, the procedure implemented here is used as an \emph{ad hoc} means to #' normalize microbiome counts that have #' resulted from libraries of widely-differing sizes. #' Here we have intentionally adopted an alternative #' name, \code{rarefy}, that has also been used recently #' to describe this process #' and, to our knowledge, not previously used in ecology. #' #' Make sure to use \code{\link{set.seed}} for exactly-reproducible results #' of the random subsampling. #' #' @param physeq (Required). A \code{\link{phyloseq-class}} object that you #' want to trim/filter. #' #' @param sample.size (Optional). A single integer value equal to the number #' of reads being simulated, also known as the depth, #' and also equal to each value returned by \code{\link{sample_sums}} #' on the output. #' #' @param rngseed (Optional). A single integer value passed to #' \code{\link{set.seed}}, which is used to fix a seed for reproducibly #' random number generation (in this case, reproducibly random subsampling). #' The default value is \code{711}. #' If set to \code{FALSE}, then no fiddling with the RNG seed is performed, #' and it is up to the user to appropriately call \code{\link{set.seed}} #' beforehand to achieve reproducible results. #' #' @param replace (Optional). Logical. Whether to sample with replacement #' (\code{TRUE}) or without replacement (\code{FALSE}). #' The default is with replacement (\code{replace=TRUE}). #' Two implications to consider are that #' (1) sampling with replacement is faster and more memory efficient #' as currently implemented; and #' (2), sampling with replacement means that there is a chance that the #' number of reads for a given OTU in a given sample could be larger #' than the original count value, as opposed to sampling without replacement #' where the original count value is the maximum possible. #' Prior to phyloseq package version number \code{1.5.20}, #' this parameter did not exist and sampling with replacement was the only #' random subsampling implemented in the \code{rarefy_even_depth} function. #' Note that this default behavior was selected for computational efficiency, #' but differs from analogous functions in related packages #' (e.g. subsampling in QIIME). #' #' @param trimOTUs (Optional). \code{\link{logical}(1)}. #' Whether to trim OTUs #' from the dataset that are no longer observed in any sample #' (have a count of zero in every sample). #' The number of OTUs trimmed, if any, is printed to #' standard out as a reminder. #' #' @param verbose (Optional). Logical. Default is \code{TRUE}. #' If \code{TRUE}, extra non-warning, non-error messages are printed #' to standard out, describing steps in the rarefying process, #' the OTUs and samples removed, etc. This can be useful the #' first few times the function is executed, but can be set #' to \code{FALSE} as-needed once behavior has been verified #' as expected. #' #' @return An object of class \code{phyloseq}. #' Only the \code{otu_table} component is modified. #' #' @seealso #' \code{\link{sample}} #' #' \code{\link{set.seed}} #' #' @export #' #' @examples #' # Test with esophagus dataset #' data("esophagus") #' esorepT = rarefy_even_depth(esophagus, replace=TRUE) #' esorepF = rarefy_even_depth(esophagus, replace=FALSE) #' sample_sums(esophagus) #' sample_sums(esorepT) #' sample_sums(esorepF) #' ## NRun Manually: Too slow! #' # data("GlobalPatterns") #' # GPrepT = rarefy_even_depth(GlobalPatterns, 1E5, replace=TRUE) #' ## Actually just this one is slow #' # system.time(GPrepF <- rarefy_even_depth(GlobalPatterns, 1E5, replace=FALSE)) rarefy_even_depth <- function(physeq, sample.size=min(sample_sums(physeq)), rngseed=FALSE, replace=TRUE, trimOTUs=TRUE, verbose=TRUE){ if( as(rngseed, "logical") ){ # Now call the set.seed using the value expected in phyloseq set.seed(rngseed) if(verbose){ # Print to screen this value message("`set.seed(", rngseed, ")` was used to initialize repeatable random subsampling.") message("Please record this for your records so others can reproduce.") message("Try `set.seed(", rngseed,"); .Random.seed` for the full vector", sep="") message("...") } } else if(verbose){ message("You set `rngseed` to FALSE. Make sure you've set & recorded\n", " the random seed of your session for reproducibility.\n", "See `?set.seed`\n") message("...") } # Make sure sample.size is of length 1. if( length(sample.size) > 1 ){ warning("`sample.size` had more than one value. ", "Using only the first. \n ... \n") sample.size <- sample.size[1] } if( sample.size <= 0 ){ stop("sample.size less than or equal to zero. ", "Need positive sample size to work.") } # Instead of warning, expected behavior now is to prune samples # that have fewer reads than `sample.size` if( min(sample_sums(physeq)) < sample.size ){ rmsamples = sample_names(physeq)[sample_sums(physeq) < sample.size] if(verbose){ message(length(rmsamples), " samples removed", "because they contained fewer reads than `sample.size`.") message("Up to first five removed samples are: \n") message(rmsamples[1:min(5, length(rmsamples))], sep="\t") message("...") } # Now done with notifying user of pruning, actually prune. physeq = prune_samples(setdiff(sample_names(physeq), rmsamples), physeq) } # initialize the subsamples phyloseq instance, newsub newsub <- physeq # enforce orientation as species-are-rows, for assignment if(!taxa_are_rows(newsub)){newsub <- t(newsub)} # apply through each sample, and replace newotu <- apply(otu_table(newsub), 2, rarefaction_subsample, sample.size=sample.size, replace=replace) # Add OTU names to the row indices rownames(newotu) <- taxa_names(physeq) # replace the otu_table. otu_table(newsub) <- otu_table(newotu, TRUE) if(trimOTUs){ # Check for and remove empty OTUs # 1. Notify user of empty OTUs being cut. # 2. Cut empty OTUs rmtaxa = taxa_names(newsub)[taxa_sums(newsub) <= 0] if( length(rmtaxa) > 0 ){ if(verbose){ message(length(rmtaxa), "OTUs were removed because they are no longer \n", "present in any sample after random subsampling\n") message("...") } newsub = prune_taxa(setdiff(taxa_names(newsub), rmtaxa), newsub) } } # If the OTU table was transposed before rarefaction, transpose it # back to the way it was in the original physeq object. if(!taxa_are_rows(physeq)){newsub <- t(newsub)} return(newsub) } ################################################################################ # rarefaction subsample function, one sample ################################################################################ #' @keywords internal rarefaction_subsample <- function(x, sample.size, replace=FALSE){ # This is a test # x = sample(10, 10) # x = 1:10 # sample.size = 50 #system.time(obsvec <- foreach(OTUi=1:length(x), times=x, .combine=c) %do% {rep(OTUi, times)}) # data("GlobalPatterns") # sample.size = sample_sums(GlobalPatterns)[which.min(sample_sums(GlobalPatterns))] # x = get_taxa(GlobalPatterns, which.max(sample_sums(GlobalPatterns))) # Create replacement species vector rarvec <- numeric(length(x)) # Perform the sub-sampling. Suppress warnings due to old R compat issue. # Also, make sure to avoid errors from x summing to zero, # and there are no observations to sample. # The initialization of rarvec above is already sufficient. if(sum(x) <= 0){ # Protect against, and quickly return an empty vector, # if x is already an empty count vector return(rarvec) } if(replace){ # resample with replacement suppressWarnings(subsample <- sample(1:length(x), sample.size, replace=TRUE, prob=x)) } else { # resample without replacement obsvec <- apply(data.frame(OTUi=1:length(x), times=x), 1, function(x){ rep_len(x["OTUi"], x["times"]) }) obsvec <- unlist(obsvec, use.names=FALSE) # use `sample` for subsampling. Hope that obsvec doesn't overflow. suppressWarnings(subsample <- sample(obsvec, sample.size, replace=FALSE)) } # Tabulate the results (these are already named by the order in `x`) sstab <- table(subsample) # Assign the tabulated random subsample values to the species vector rarvec[as(names(sstab), "integer")] <- sstab # Return abundance vector. Let replacement happen elsewhere. return(rarvec) } ################################################################################ #' Agglomerate closely-related taxa using single-linkage clustering. #' #' All tips of the tree separated by a cophenetic distance smaller than #' \code{h} will be agglomerated into one taxa using \code{\link{merge_taxa}}. #' #' Can be used to create a non-trivial OTU Table, if a phylogenetic tree is available. #' #' For now, a simple, ``greedy'', single-linkage clustering is used. In future releases #' it should be possible to specify different clustering approaches available in \code{R}, #' in particular, complete-linkage clustering appears to be used more commonly for OTU #' clustering applications. #' #' @param physeq (Required). A \code{\link{phyloseq-class}}, #' containing a phylogenetic tree. #' Alternatively, a phylogenetic tree \code{\link[ape]{phylo}} will also work. #' #' @param h (Optional). Numeric scalar of the height where the tree should be cut. #' This refers to the tree resulting from hierarchical clustering #' of \code{\link[ape]{cophenetic.phylo}(phy_tree(physeq))}, #' not necessarily the original phylogenetic tree, \code{phy_tree(physeq)}. #' Default value is \code{0.2}. #' Note that this argument used to be named \code{speciationMinLength}, #' before this function/method was rewritten. #' #' @param hcfun (Optional). A function. #' The (agglomerative, hierarchical) clustering function to use. #' Good examples are #' \code{\link[cluster]{agnes}} and \code{\link[stats]{hclust}}. #' The default is \code{\link[cluster]{agnes}}. #' #' @param ... (Optional). Additional named arguments to pass #' to \code{hcfun}. #' #' @return An instance of the \code{\link{phyloseq-class}}. #' Or alternatively, a \code{\link{phylo}} object if the #' \code{physeq} argument was just a tree. #' In the expected-use case, the number of OTUs will be fewer #' (see \code{\link{ntaxa}}), #' after merging OTUs that are related enough to be called #' the same OTU. #' #' @seealso #' #' \code{\link{merge_taxa}} #' #' \code{\link[cluster]{agnes}} #' #' \code{\link[stats]{hclust}} #' #' \code{\link[ape]{cophenetic.phylo}} #' #' \code{\link[ape]{phylo}} #' #' @importFrom cluster agnes #' #' @export #' #' @examples #' data("esophagus") #' # for speed #' esophagus = prune_taxa(taxa_names(esophagus)[1:25], esophagus) #' plot_tree(esophagus, label.tips="taxa_names", size="abundance", title="Before tip_glom()") #' plot_tree(tip_glom(esophagus, h=0.2), label.tips="taxa_names", size="abundance", title="After tip_glom()") tip_glom = function(physeq, h=0.2, hcfun=agnes, ...){ dd = as.dist(cophenetic.phylo(phy_tree(physeq))) psclust = cutree(as.hclust(hcfun(dd, ...)), h=h) cliques = levels(factor(psclust))[tapply(psclust, factor(psclust), function(x){length(x)>1})] # For each clique, merge taxa in it... for( i in cliques){ physeq = merge_taxa(physeq, eqtaxa=names(psclust)[psclust == i]) } return(physeq) } ################################################################################ ################################################################################ #' Agglomerate taxa of the same type. #' #' This method merges species that have the same taxonomy at a certain #' taxaonomic rank. #' Its approach is analogous to \code{\link{tip_glom}}, but uses categorical data #' instead of a tree. In principal, other categorical data known for all taxa #' could also be used in place of taxonomy, #' but for the moment, this must be stored in the \code{taxonomyTable} #' of the data. Also, columns/ranks to the right of the rank chosen to use #' for agglomeration will be replaced with \code{NA}, #' because they should be meaningless following agglomeration. #' #' @usage tax_glom(physeq, taxrank=rank_names(physeq)[1], NArm=TRUE, bad_empty=c(NA, "", " ", "\t")) #' #' @param physeq (Required). \code{\link{phyloseq-class}} or \code{\link{otu_table}}. #' #' @param taxrank A character string specifying the taxonomic level #' that you want to agglomerate over. #' Should be among the results of \code{rank_names(physeq)}. #' The default value is \code{rank_names(physeq)[1]}, #' which may agglomerate too broadly for a given experiment. #' You are strongly encouraged to try different values for this argument. #' #' @param NArm (Optional). Logical, length equal to one. Default is \code{TRUE}. #' CAUTION. The decision to prune (or not) taxa for which you lack categorical #' data could have a large effect on downstream analysis. You may want to #' re-compute your analysis under both conditions, or at least think carefully #' about what the effect might be and the reasons explaining the absence of #' information for certain taxa. In the case of taxonomy, it is often a result #' of imprecision in taxonomic designation based on short phylogenetic sequences #' and a patchy system of nomenclature. If this seems to be an issue for your #' analysis, think about also trying the nomenclature-agnostic \code{\link{tip_glom}} #' method if you have a phylogenetic tree available. #' #' @param bad_empty (Optional). Character vector. Default: \code{c(NA, "", " ", "\t")}. #' Defines the bad/empty values #' that should be ignored and/or considered unknown. They will be removed #' from the internal agglomeration vector derived from the argument to \code{tax}, #' and therefore agglomeration will not combine taxa according to the presence #' of these values in \code{tax}. Furthermore, the corresponding taxa can be #' optionally pruned from the output if \code{NArm} is set to \code{TRUE}. #' #' @return A taxonomically-agglomerated, optionally-pruned, object with class matching #' the class of \code{physeq}. #' #' @seealso #' \code{\link{tip_glom}} #' #' \code{\link{prune_taxa}} #' #' \code{\link{merge_taxa}} #' #' @export #' #' @examples #' # data(GlobalPatterns) #' # ## print the available taxonomic ranks #' # colnames(tax_table(GlobalPatterns)) #' # ## agglomerate at the Family taxonomic rank #' # (x1 <- tax_glom(GlobalPatterns, taxrank="Family") ) #' # ## How many taxa before/after agglomeration? #' # ntaxa(GlobalPatterns); ntaxa(x1) #' # ## Look at enterotype dataset... #' # data(enterotype) #' # ## print the available taxonomic ranks. Shows only 1 rank available, not useful for tax_glom #' # colnames(tax_table(enterotype)) tax_glom <- function(physeq, taxrank=rank_names(physeq)[1], NArm=TRUE, bad_empty=c(NA, "", " ", "\t")){ # Error if tax_table slot is empty if( is.null(access(physeq, "tax_table")) ){ stop("The tax_glom() function requires that physeq contain a taxonomyTable") } # Error if bad taxrank if( !taxrank[1] %in% rank_names(physeq) ){ stop("Bad taxrank argument. Must be among the values of rank_names(physeq)") } # Make a vector from the taxonomic data. CN <- which( rank_names(physeq) %in% taxrank[1] ) tax <- as(access(physeq, "tax_table"), "matrix")[, CN] # if NArm is TRUE, remove the empty, white-space, NA values from if( NArm ){ keep_species <- names(tax)[ !(tax %in% bad_empty) ] physeq <- prune_taxa(keep_species, physeq) } # Concatenate data up to the taxrank column, use this for agglomeration tax <- as(access(physeq, "tax_table"), "matrix")[, 1:CN, drop=FALSE] tax <- apply(tax, 1, function(i){paste(i, sep=";_;", collapse=";_;")}) # Remove NAs and useless from the vector/factor for looping. # This does not remove the taxa that have an unknown (NA) # taxonomic designation at this particular taxonomic rank. tax <- tax[ !(tax %in% bad_empty) ] # Define the OTU cliques to loop through spCliques <- tapply(names(tax), factor(tax), list) # Successively merge taxa in physeq. for( i in names(spCliques)){ physeq <- merge_taxa(physeq, spCliques[[i]]) } # "Empty" the values to the right of the rank, using NA_character_. if( CN < length(rank_names(physeq)) ){ badcolumns <- (CN+1):length(rank_names(physeq)) tax_table(physeq)[, badcolumns] <- NA_character_ } # Return. return(physeq) } ################################################################################ ################################################################################ #' Prune unwanted OTUs / taxa from a phylogenetic object. #' #' An S4 Generic method for removing (pruning) unwanted OTUs/taxa from phylogenetic #' objects, including phylo-class trees, as well as native phyloseq package #' objects. This is particularly useful for pruning a phyloseq object that has #' more than one component that describes OTUs. #' Credit: the \code{phylo}-class version is adapted from #' \href{http://cran.at.r-project.org/web/packages/picante/index.html}{prune.sample}. #' #' @usage prune_taxa(taxa, x) #' #' @param taxa (Required). A character vector of the taxa in object x that you want to #' keep -- OR alternatively -- a logical vector where the kept taxa are TRUE, and length #' is equal to the number of taxa in object x. If \code{taxa} is a named #' logical, the taxa retained are based on those names. Make sure they are #' compatible with the \code{taxa_names} of the object you are modifying (\code{x}). #' #' @param x (Required). A phylogenetic object, including \code{phylo} trees, #' as well as all phyloseq classes that represent taxa. If the function #' \code{\link{taxa_names}} returns a non-\code{NULL} value, then your object #' can be pruned by this function. #' #' @return The class of the object returned by \code{prune_taxa} matches #' the class of the argument, \code{x}. #' #' @seealso #' #' \code{\link{prune_samples}} #' #' \href{http://cran.at.r-project.org/web/packages/picante/index.html}{prune.sample} #' #' @rdname prune_taxa-methods #' @export #' @examples #' data("esophagus") #' esophagus #' plot(sort(taxa_sums(esophagus), TRUE), type="h", ylim=c(0, 50)) #' x1 = prune_taxa(taxa_sums(esophagus) > 10, esophagus) #' x2 = prune_taxa(names(sort(taxa_sums(esophagus), TRUE))[1:9], esophagus) #' identical(x1, x2) setGeneric("prune_taxa", function(taxa, x) standardGeneric("prune_taxa")) #' @aliases prune_taxa,NULL,ANY-method #' @rdname prune_taxa-methods setMethod("prune_taxa", signature("NULL", "ANY"), function(taxa, x){ return(x) }) # Any prune_taxa call w/ signature starting with a logical # converts the logical to a character vector, and then dispatches # to more specific method. #' @aliases prune_taxa,logical,ANY-method #' @rdname prune_taxa-methods setMethod("prune_taxa", signature("logical", "ANY"), function(taxa, x){ # Check that logical has same length as ntaxa, stop if not. if( !identical(length(taxa), ntaxa(x)) ){ stop("logical argument to taxa is wrong length. Should equal ntaxa(x)") } else { # Pass on to names-based prune_taxa method return( prune_taxa(taxa_names(x)[taxa], x) ) } }) #' @importFrom ape drop.tip #' @aliases prune_taxa,character,phylo-method #' @rdname prune_taxa-methods setMethod("prune_taxa", signature("character", "phylo"), function(taxa, x){ if( length(taxa) <= 1 ){ # Can't have a tree with 1 or fewer tips warning("prune_taxa attempted to reduce tree to 1 or fewer tips.\n tree replaced with NULL.") return(NULL) } else if( setequal(taxa, taxa_names(x)) ){ return(x) } else { return( drop.tip(x, setdiff(taxa_names(x), taxa)) ) } }) #' @aliases prune_taxa,character,otu_table-method #' @rdname prune_taxa-methods setMethod("prune_taxa", signature("character", "otu_table"), function(taxa, x){ if( setequal(taxa, taxa_names(x)) ){ return(x) } else { taxa = intersect( taxa, taxa_names(x) ) if( taxa_are_rows(x) ){ return(x[taxa, , drop=FALSE]) } else { return(x[, taxa, drop=FALSE]) } } }) #' @aliases prune_taxa,character,sample_data-method #' @rdname prune_taxa-methods setMethod("prune_taxa", signature("character", "sample_data"), function(taxa, x){ return(x) }) #' @aliases prune_taxa,character,phyloseq-method #' @rdname prune_taxa-methods setMethod("prune_taxa", signature("character", "phyloseq"), function(taxa, x){ # Re-define `taxa` as the intersection of OTU names for each component AND `taxa` taxa = intersect(intersect_taxa(x), taxa) # Now prune them all. # All phyloseq objects have an otu_table slot, no need to test for existence. x@otu_table = prune_taxa(taxa, otu_table(x)) # Test if slot is present. If so, perform the component prune. if( !is.null(x@tax_table) ){ x@tax_table = prune_taxa(taxa, tax_table(x)) } if( !is.null(x@phy_tree) ){ x@phy_tree = prune_taxa(taxa, phy_tree(x)) } if( !is.null(x@refseq) ){ x@refseq = prune_taxa(taxa, refseq(x)) } # Force index order after pruning to be the same, # according to the same rules as in the constructor, phyloseq() x = index_reorder(x, index_type="taxa") return(x) }) #' @aliases prune_taxa,character,taxonomyTable-method #' @rdname prune_taxa-methods setMethod("prune_taxa", signature("character", "taxonomyTable"), function(taxa, x){ if( setequal(taxa, taxa_names(x)) ){ return(x) } else { taxa = intersect( taxa, taxa_names(x) ) return( x[taxa, , drop=FALSE] ) } }) #' @importClassesFrom Biostrings XStringSet #' @aliases prune_taxa,character,XStringSet-method #' @rdname prune_taxa-methods setMethod("prune_taxa", signature("character", "XStringSet"), function(taxa, x){ if( setequal(taxa, taxa_names(x)) ){ # Nothing to do, return x as-is. return(x) } else if( length(intersect(taxa, taxa_names(x))) == 0 ){ # Informative error if intersection is zero. stop("prune_taxa,XStringSet: taxa and taxa_names(x) do not overlap.") } else { # Pop the OTUs that are not in `taxa`, without reordering. return(x[-which(!taxa_names(x) %in% taxa)]) } }) ################################################################################ ################################################################################ #' Define a subset of samples to keep in a phyloseq object. #' #' An S4 Generic method for pruning/filtering unwanted samples #' by defining those you want to keep. #' #' @usage prune_samples(samples, x) #' #' @param samples (Required). A character vector of the samples in object x that you want to #' keep -- OR alternatively -- a logical vector where the kept samples are TRUE, and length #' is equal to the number of samples in object x. If \code{samples} is a named #' logical, the samples retained is based on those names. Make sure they are #' compatible with the \code{sample_names} of the object you are modifying (\code{x}). #' #' @param x A phyloseq object. #' #' @return The class of the object returned by \code{prune_samples} matches #' the class of the phyloseq object, \code{x}. #' #' @seealso \code{\link{subset_samples}} #' #' @rdname prune_samples-methods #' @docType methods #' @export #' @examples #' data(GlobalPatterns) #' # Subset to just the Chlamydiae phylum. #' GP.chl <- subset_taxa(GlobalPatterns, Phylum=="Chlamydiae") #' # Remove the samples that have less than 20 total reads from Chlamydiae #' GP.chl <- prune_samples(sample_sums(GP.chl)>=20, GP.chl) #' # (p <- plot_tree(GP.chl, color="SampleType", shape="Family", label.tips="Genus", size="abundance")) setGeneric("prune_samples", function(samples, x) standardGeneric("prune_samples")) #' @aliases prune_samples,character,otu_table-method #' @rdname prune_samples-methods setMethod("prune_samples", signature("character", "otu_table"), function(samples, x){ if( setequal(samples, sample_names(x)) ){ # If the sets of `samples` and sample_names are the same, return as-is. return(x) } else { samples = intersect(samples, sample_names(x)) if( taxa_are_rows(x) ){ return( x[, samples] ) } else { return( x[samples, ] ) } } }) #' @aliases prune_samples,character,sample_data-method #' @rdname prune_samples-methods setMethod("prune_samples", signature("character", "sample_data"), function(samples, x){ if( setequal(samples, sample_names(x)) ){ # If the sets of `samples` and sample_names are the same, return as-is. return(x) } else { samples = intersect(samples, sample_names(x)) return(x[samples, ]) } }) #' @aliases prune_samples,character,phyloseq-method #' @rdname prune_samples-methods setMethod("prune_samples", signature("character", "phyloseq"), function(samples, x){ # Re-define `samples` as the intersection of samples names for each component AND `samples` samples = intersect(intersect_samples(x), samples) # Now prune each component. # All phyloseq objects have an otu_table slot, no need to test for existence. x@otu_table = prune_samples(samples, otu_table(x)) if( !is.null(x@sam_data) ){ # protect missing sample_data component. Don't need to prune if empty x@sam_data = prune_samples(samples, sample_data(x)) } # Force sample index order after pruning to be the same, # according to the same rules as in the constructor, phyloseq() x = index_reorder(x, index_type="samples") return(x) }) # A logical should specify the samples to keep, or not. Have same length as nsamples(x) #' @aliases prune_samples,logical,ANY-method #' @rdname prune_samples-methods setMethod("prune_samples", signature("logical", "ANY"), function(samples, x){ # Check that logical has same length as nsamples, stop if not. if( !identical(length(samples), nsamples(x)) ){ stop("logical argument to samples is wrong length. Should equal nsamples(x)") } else { # Pass on to names-based prune_samples method return( prune_samples(sample_names(x)[samples], x) ) } }) ################################################################################ #' Thresholded rank transformation. #' #' The lowest \code{thresh} values in \code{x} all get the value 'thresh'. #' #' @usage threshrank(x, thresh, keep0s=FALSE, ...) #' #' @param x (Required). Numeric vector to transform. #' @param thresh A single numeric value giving the threshold. #' @param keep0s A logical determining whether 0's in \code{x} should remain #' a zero-value in the output. If FALSE, zeros are treated as any other value. #' @param ... Further arguments passes to the \code{\link{rank}} function. #' #' @return A ranked, (optionally) thresholded numeric vector with length equal to #' \code{x}. Default arguments to \code{rank} are used, unless provided as #' additional arguments. #' #' @seealso \code{\link{transform_sample_counts}}, \code{\link{rank}}, \code{\link{threshrankfun}} #' @export #' @examples # #' (a_vector <- sample(0:10, 100, TRUE)) #' threshrank(a_vector, 5, keep0s=TRUE) #' data(GlobalPatterns) #' GP <- GlobalPatterns #' ## These three approaches result in identical otu_table #' (x1 <- transform_sample_counts( otu_table(GP), threshrankfun(500)) ) #' (x2 <- otu_table(apply(otu_table(GP), 2, threshrankfun(500)), taxa_are_rows(GP)) ) #' identical(x1, x2) #' (x3 <- otu_table(apply(otu_table(GP), 2, threshrank, thresh=500), taxa_are_rows(GP)) ) #' identical(x1, x3) threshrank <- function(x, thresh, keep0s=FALSE, ...){ if( keep0s ){ index0 <- which(x == 0) } x <- rank(x, ...) thresh <- thresh[1] x[x= A}, A) }) #' @rdname genefilter_sample-methods #' @aliases genefilter_sample,otu_table-method setMethod("genefilter_sample", signature("otu_table"), function(X, flist, A=1){ if( taxa_are_rows(X) ){ genefilter_sample( as(X, "matrix"), flist, A) } else { genefilter_sample( t(as(X, "matrix")), flist, A) } }) #' @rdname genefilter_sample-methods #' @aliases genefilter_sample,phyloseq-method setMethod("genefilter_sample", signature("phyloseq"), function(X, flist, A=1){ genefilter_sample(otu_table(X), flist, A) }) ################################################################################ #' A sample-wise filter function builder #' analogous to \code{\link[genefilter]{filterfun}}. #' #' See the \code{\link[genefilter]{filterfun}}, from the Bioconductor repository, #' for a taxa-/gene-wise filter (and further examples). #' #' @usage filterfun_sample(...) #' #' @param ... A comma-separated list of functions. #' #' @return An enclosure (function) that itself will return a logical vector, #' according to the #' functions provided in the argument list, evaluated in order. The output of #' filterfun_sample is appropriate for the `flist' argument to the #' genefilter_sample method. #' #' @export #' @seealso \code{\link[genefilter]{filterfun}}, \code{\link{genefilter_sample}} #' @examples #' # Use simulated abundance matrix #' set.seed(711) #' testOTU <- otu_table(matrix(sample(1:50, 25, replace=TRUE), 5, 5), taxa_are_rows=FALSE) #' f1 <- filterfun_sample(topk(2)) #' wh1 <- genefilter_sample(testOTU, f1, A=2) #' wh2 <- c(TRUE, TRUE, TRUE, FALSE, FALSE) #' prune_taxa(wh1, testOTU) #' prune_taxa(wh2, testOTU) filterfun_sample = function(...){ flist <- list(...) if( length(flist) == 1 && is.list(flist[[1]])) { flist <- flist[[1]] } f = function(x){ # initialize fval (a logical vector) fun = flist[[1]] fval = fun(x) # check the remaining functions. Compare & logic, element-wise, each loop. for(fun in flist[-1]){ fval = fval & fun(x) } return(fval) } class(f) <- "filterfun" return(f) } ################################################################################ #' Filter taxa based on across-sample OTU abundance criteria #' #' This function is directly analogous to the #' \code{\link[genefilter]{genefilter}} function for microarray filtering, #' but is used for filtering OTUs from phyloseq objects. #' It applies an arbitrary set of functions --- #' as a function list, for instance, created by \code{\link[genefilter]{filterfun}} --- #' as across-sample criteria, one OTU at a time. #' It takes as input a phyloseq object, #' and returns a logical vector #' indicating whether or not each OTU passed the criteria. #' Alternatively, if the \code{"prune"} option is set to \code{FALSE}, #' it returns the already-trimmed version of the phyloseq object. #' #' @usage filter_taxa(physeq, flist, prune=FALSE) #' #' @param physeq (Required). A \code{\link{phyloseq-class}} object that you #' want to trim/filter. #' #' @param flist (Required). A function or list of functions that take a vector #' of abundance values and return a logical. Some canned useful function types #' are included in the \code{genefilter}-package. #' #' @param prune (Optional). A logical. Default \code{FALSE}. If \code{TRUE}, then #' the function returns the pruned \code{\link{phyloseq-class}} object, rather #' than the logical vector of taxa that passed the filter. #' #' @return A logical vector equal to the number of taxa in \code{physeq}. #' This can be provided directly to \code{\link{prune_taxa}} as first argument. #' Alternatively, if \code{prune==TRUE}, the pruned \code{\link{phyloseq-class}} #' object is returned instead. #' #' @export #' @seealso #' \code{\link[genefilter]{filterfun}}, #' \code{\link{genefilter_sample}}, #' \code{\link{filterfun_sample}} #' #' @examples #' data("enterotype") #' require("genefilter") #' flist <- filterfun(kOverA(5, 2e-05)) #' ent.logi <- filter_taxa(enterotype, flist) #' ent.trim <- filter_taxa(enterotype, flist, TRUE) #' identical(ent.trim, prune_taxa(ent.logi, enterotype)) #' identical(sum(ent.logi), ntaxa(ent.trim)) #' filter_taxa(enterotype, flist, TRUE) filter_taxa <- function(physeq, flist, prune=FALSE){ # access OTU table OTU <- access(physeq, "otu_table", TRUE) # Enforce orientation (we are filtering taxa, not samples) if(!taxa_are_rows(OTU)) { OTU <- t(OTU) } # Coerce to vanilla matrix OTU <- as(OTU, "matrix") # Apply filtering function(s), get logical of length ntaxa(physeq) ans <- apply(OTU, 1, flist) # sanity check if( ntaxa(physeq) != length(ans) ){ stop("Logic error in applying function(s). Logical result not same length as ntaxa(physeq)") } # Now return logical or pruned phyloseq-class instance. if( prune ){ return( prune_taxa(ans, physeq) ) } else { return( ans ) } } ################################################################################ #' Make filter fun. the most abundant \code{k} taxa #' #' @usage topk(k, na.rm=TRUE) #' #' @param k An integer, indicating how many of the most abundant taxa #' should be kept. #' @param na.rm A logical. Should \code{NA}s be removed. Default is \code{TRUE}. #' #' @return Returns a function (enclosure) that will return TRUE #' for each element in the most abundant k values. #' #' @seealso \code{\link{topk}}, \code{\link{topf}}, #' \code{\link{topp}}, \code{\link{rm_outlierf}} #' #' @export #' #' @examples #' ## Use simulated abundance matrix #' set.seed(711) #' testOTU <- otu_table(matrix(sample(1:50, 25, replace=TRUE), 5, 5), taxa_are_rows=FALSE) #' f1 <- filterfun_sample(topk(2)) #' wh1 <- genefilter_sample(testOTU, f1, A=2) #' wh2 <- c(TRUE, TRUE, TRUE, FALSE, FALSE) #' prune_taxa(wh1, testOTU) #' prune_taxa(wh2, testOTU) topk = function(k, na.rm=TRUE){ function(x){ if(na.rm){x = x[!is.na(x)]} x >= sort(x, decreasing=TRUE)[k] } } ############################################################ #' Make filter fun. that returns the most abundant \code{p} fraction of taxa #' #' @usage topp(p, na.rm=TRUE) #' #' @param p A numeric of length 1, indicating what fraction of the most abundant taxa #' should be kept. #' @param na.rm A logical. Should \code{NA}s be removed. Default is \code{TRUE}. #' #' @return A function (enclosure), suitable for \code{\link{filterfun_sample}}, #' that will return \code{TRUE} #' for each element in the most abundant p fraction of taxa. #' #' @seealso \code{\link{topk}}, \code{\link{topf}}, #' \code{\link{topp}}, \code{\link{rm_outlierf}} #' #' @export #' #' @examples #' ## Use simulated abundance matrix #' set.seed(711) #' testOTU <- otu_table(matrix(sample(1:50, 25, replace=TRUE), 5, 5), taxa_are_rows=FALSE) #' sample_sums(testOTU) #' f1 <- filterfun_sample(topp(0.2)) #' (wh1 <- genefilter_sample(testOTU, f1, A=1)) #' wh2 <- c(TRUE, TRUE, TRUE, FALSE, FALSE) #' prune_taxa(wh1, testOTU) #' prune_taxa(wh2, testOTU) topp <- function(p, na.rm=TRUE){ function(x){ if(na.rm){x = x[!is.na(x)]} x >= sort(x, decreasing=TRUE)[ceiling(length(x)*p)] } } ################################################################################ #' Make filter fun. that returns the top f fraction of taxa in a sample. #' #' As opposed to \code{\link{topp}}, which gives the #' most abundant p fraction of observed taxa (richness, instead of cumulative #' abundance. Said another way, topf ensures a certain #' fraction of the total sequences are retained, while topp ensures #' that a certain fraction of taxa/species/OTUs are retained. #' #' @usage topf(f, na.rm=TRUE) #' @param f Single numeric value between 0 and 1. #' @param na.rm Logical. Should we remove NA values. Default \code{TRUE}. #' #' @return A function (enclosure), suitable for \code{\link{filterfun_sample}}, #' that will return \code{TRUE} #' for each element in the taxa comprising the most abundant f fraction of individuals. #' #' @seealso \code{\link{topk}}, \code{\link{topf}}, #' \code{\link{topp}}, \code{\link{rm_outlierf}} #' #' @export #' #' @examples #' t1 <- 1:10; names(t1)<-paste("t", 1:10, sep="") #' topf(0.6)(t1) #' ## Use simulated abundance matrix #' set.seed(711) #' testOTU <- otu_table(matrix(sample(1:50, 25, replace=TRUE), 5, 5), taxa_are_rows=FALSE) #' f1 <- filterfun_sample(topf(0.4)) #' (wh1 <- genefilter_sample(testOTU, f1, A=1)) #' wh2 <- c(TRUE, TRUE, TRUE, FALSE, FALSE) #' prune_taxa(wh1, testOTU) #' prune_taxa(wh2, testOTU) topf <- function(f, na.rm=TRUE){ function(x){ if (na.rm){ x = x[!is.na(x)] } y <- sort(x, decreasing = TRUE) y <- cumsum(y)/sum(x) return( (y <= f)[names(x)] ) } } ################################################################################ #' Set to FALSE any outlier species greater than f fractional abundance. #' #' This is for removing overly-abundant outlier taxa, not for trimming low-abundance #' taxa. #' #' @usage rm_outlierf(f, na.rm=TRUE) #' #' @param f Single numeric value between 0 and 1. The maximum fractional abundance #' value that a taxa will be allowed to have in a sample without being marked #' for trimming. #' #' @param na.rm Logical. Should we remove NA values. Default \code{TRUE}. #' #' @return A function (enclosure), suitable for \code{\link{filterfun_sample}}. #' #' @seealso \code{\link{topk}}, \code{\link{topf}}, #' \code{\link{topp}}, \code{\link{rm_outlierf}} #' #' @export #' @examples #' t1 <- 1:10; names(t1)<-paste("t", 1:10, sep="") #' rm_outlierf(0.15)(t1) #' ## Use simulated abundance matrix #' set.seed(711) #' testOTU <- otu_table(matrix(sample(1:50, 25, replace=TRUE), 5, 5), taxa_are_rows=FALSE) #' taxa_sums(testOTU) #' f1 <- filterfun_sample(rm_outlierf(0.1)) #' (wh1 <- genefilter_sample(testOTU, f1, A=1)) #' wh2 <- c(TRUE, TRUE, TRUE, FALSE, FALSE) #' prune_taxa(wh1, testOTU) #' prune_taxa(wh2, testOTU) rm_outlierf <- function(f, na.rm=TRUE){ function(x){ if(na.rm){ x = x[!is.na(x)] } y <- x / sum(x) return( y < f ) } } ################################################################################ phyloseq/R/validity-methods.R0000644000175400017540000001171513175714136017273 0ustar00biocbuildbiocbuild################################################################################ # Validity methods: # # These are delicate, because they are effectively at the S4 infrastructure # level, in between "new" and the constructor. Some of the issues that might # otherwise go here for a check are handled by the constructors. In many # cases it desirable to let the constructor handle this, because it allows # greater flexibility and transparency. These tests should be limited to # conditions that are not fixed automatically by the constructors, and/or # could not be because the deficiency/error is too fundamental. By design, # we expect the validity errors to cause a fault before (nearly) any action # by the constructor. # # This is a special case where the accessors are not-used, in favor of the # S4 @tags. E.g. object@otu_table instead of otu_table(object). This is to avoid # any complications with the accessors interacting with objects early on. # Perhaps this is a mistake, but its a very limited case and won't be difficult # to change. # # Also, for now these are not documented at all at the user-level, # and are not expected to ever # be at the "user-level", so formal documentation probably unnecessary. Lots # of comments throughout this code will need to compensate. ################################################################################ ######################################## # otu_table: # # # * all values must be numeric (otu_table()-constructor should probably round values by default)) # # # * all values must be >= 0 (no negative abundances) ######################################## validotu_table <- function(object){ # Both dimensions must have non-zero length. if( any(dim(object)==0) ){ return("\n OTU abundance data must have non-zero dimensions.") } # Verify that it is numeric matrix if( !is.numeric(object@.Data[, 1]) ){ text = "\n Non-numeric matrix provided as OTU table.\n" text = paste0(text, "Abundance is expected to be numeric.") return(text) } return(TRUE) } ## assign the function as the validity method for the otu_table class setValidity("otu_table", validotu_table) ######################################## ######################################## # sample_data: ######################################## validsample_data <- function(object){ if( any(dim(object)==0) ){ return("Sample Data must have non-zero dimensions.") } return(TRUE) } ## assign the function as the validity method for the sample_data class setValidity("sample_data", validsample_data) ######################################## ######################################## # taxonomyTable: ######################################## # # # * all values must be a character # # # * at least some non-NULL (or equiv) values # taxonomyTable validity function ######################################## validTaxonomyTable <- function(object){ # Both dimensions must have non-zero length. if( any(dim(object)==0) ){ return("\n Taxonomy Table must have non-zero dimensions.") } # Verify that it is character matrix if( !is.character(object@.Data[, 1]) ){ text = "\n Non-character matrix provided as Taxonomy Table.\n" text = paste0(text, "Taxonomy is expected to be characters.") return(text) } return(TRUE) } ## assign the function as the validity method for the sample_data class setValidity("taxonomyTable", validTaxonomyTable) ######################################## ######################################## # tree: ######################################## # # (Any rules about trees appropriate in this context?) ######################################## ######################################## # phyloseq-class: ######################################## # Because data-index complete-matching is checked/enforced by the phyloseq() constructor, # it should not be checked here, or the constructor will fail validity tests before # it gets the chance to groom the objects. # Instead, the validity test can check if there is any intersection of the species names # and/or sample names, prior to any attempt by the constructor to prune (which would end) # in a mysterious index error, anyway ######################################## validphyloseq <- function(object){ # There must be an otu_table if( is.null(object@otu_table) ){ return("\n An otu_table is required for most analysis / graphics in the phyloseq-package") } # intersection of species-names must have non-zero length if( length(intersect_taxa(object)) <= 0 ){ return(paste("\n Component taxa/OTU names do not match.\n", " Taxa indices are critical to analysis.\n Try taxa_names()", sep="")) } # If there is sample data, check that sample-names overlap if( !is.null(object@sam_data) ){ if( length(intersect(sample_names(object@sam_data), sample_names(object@otu_table))) <= 0 ){ return("\n Component sample names do not match.\n Try sample_names()") } } return(TRUE) } ## assign the function as the validity method for the otu_table class setValidity("phyloseq", validphyloseq) ######################################## phyloseq/README.html0000644000175400017540000155363413175714136015320 0ustar00biocbuildbiocbuild

phyloseq

Article on Improved Microbiome Analysis

McMurdie and Holmes (2014) Waste Not, Want Not: Why Rarefying Microbiome Data is Statistically Inadmissible PLoS Computational Biology 10(4): e1003531

Presubmission versions ahead of acceptance (2013): PDF version 2, PDF version 1

Latest peer-reviewed article about phyloseq

phyloseq: An R package for reproducible interactive analysis and graphics of microbiome census data (2013) PLoS ONE 8(4):e61217

Interface with microbio.me/qiime

See the microbio_me_qiime tutorial for more details and examples downloading and importing into phyloseq/R directly from this public database.

Other resources

The phyloseq project also has a number of supporting online resources, most of which can by found at the phyloseq home page, or from the phyloseq stable release page on Bioconductor.

To post feature requests or ask for help, try the phyloseq Issue Tracker.

phyloseq/README.md0000644000175400017540000000406713175714136014742 0ustar00biocbuildbiocbuild # [phyloseq](http://joey711.github.com/phyloseq/) [![Travis-CI Build Status](https://travis-ci.org/joey711/phyloseq.svg?branch=master)](https://travis-ci.org/joey711/phyloseq) ## Article on Improved Microbiome Analysis McMurdie and Holmes (2014) [Waste Not, Want Not: Why Rarefying Microbiome Data is Statistically Inadmissible](http://dx.plos.org/10.1371/journal.pcbi.1003531) *PLoS Computational Biology* 10(4): e1003531 Presubmission versions ahead of acceptance (2013): [PDF version 2](http://arxiv.org/pdf/1310.0424v2.pdf), [PDF version 1](http://arxiv.org/pdf/1310.0424v1.pdf) ## Peer-reviewed articles about phyloseq McMurdie and Holmes (2014) [Shiny-phyloseq: Web Application for Interactive Microbiome Analysis with Provenance Tracking](http://bioinformatics.oxfordjournals.org/content/early/2014/10/02/bioinformatics.btu616). *Bioinformatics (Oxford, England)* 31(2), 282–283. McMurdie and Holmes (2013) [phyloseq: An R package for reproducible interactive analysis and graphics of microbiome census data](http://dx.plos.org/10.1371/journal.pone.0061217) *PLoS ONE* 8(4):e61217 ## Other resources The phyloseq project also has a number of supporting online resources, including (but probably not limited to) ### [the phyloseq home page](http://joey711.github.com/phyloseq/) ### [the phyloseq FAQ](https://www.bioconductor.org/packages/release/bioc/vignettes/phyloseq/inst/doc/phyloseq-FAQ.html) I recommend checking this page, and the issues tracker, before posting new issues. ### [Bioconductor stable release](http://bioconductor.org/packages/release/bioc/html/phyloseq.html). ### [the phyloseq Issue Tracker](https://github.com/joey711/phyloseq/issues) This is the recommended location to post (1) feature requests (2) bug reports (3) theoretical considerations (4) other issues, feedback (5) ask for help Search previous posts, and check [the phyloseq FAQ](https://www.bioconductor.org/packages/release/bioc/vignettes/phyloseq/inst/doc/phyloseq-FAQ.html) before posting a new issue. phyloseq/TODO.txt0000644000175400017540000000057113175714136014765 0ustar00biocbuildbiocbuildPlanned feature improvements are publicly catalogued at the main phyloseq development site on github; specifically on the "Issues" page for phyloseq: https://github.com/joey711/phyloseq/issues If the feature you are hoping for is not listed, you are welcome to add it as a feature request "issue" on this page. This request will be publicly available and listed on the page. phyloseq/build/0000755000175400017540000000000013177723156014557 5ustar00biocbuildbiocbuildphyloseq/build/vignette.rds0000644000175400017540000000053513177723156017121 0ustar00biocbuildbiocbuildRAO0.lh$G9@xnOiZh?8 k61KE57Q37[۬#|u|2`1 }IQ'TQULE%C/% [׊C %pR,pc< ' & O@hR٫LhfJ!mzUgK3;Y_̩7P8I@Ym~HHuxwAhÆxl JHW:RF`?͖eW]QĈr\G/Ҝ7I?phyloseq/data/0000755000175400017540000000000013175714136014365 5ustar00biocbuildbiocbuildphyloseq/data/GlobalPatterns.RData0000644000175400017540000152270413175714136020236 0ustar00biocbuildbiocbuild7zXZi"6!X])TW"nRʟXg%>e@P M ]Q_(g5q8SLŷwa.`GΤ({zIWWM® ,v01IFê@sPI:a2YZsDMKph8 wψeL\|dw"RBuNj\e vO?OJغJ+x#~IM]w4) .5w[K {&r-NmmOJ>&F<pǠ6_{@lxWTc'g~js=RkK~ܰBY8f28Kxa[1dkmhh.Ylڟ9l3^€Ph[ ĦxrxkԠMщO*ziQ*K>oTv<5dgL8/~MJ~L}!Nݮzy1i<*IX2(^\[ AȒS≳m5s-G|7s+^+2 LΣܛf1_ub-o);H:S} <vTNX:E?Njm;/f+̙ŵlءo!Fv78G=b0=Ejd'S.3Cc˜{8sy8<?M<@/*jEp-h' &*WfR1.{OAB&j0]Pba ,d~iv,úo;. Qe,N/X(MJwB dže*'^ɍpO]xpypXAaoULY*4} g|m-&s{ZjslM/KY|4$T;voOw#{U:NZ= Ag/v91'MiXw8ʽI 4 qk}arh>F"c4f):n 4%LLYZ5MêȊ'RKaJM9]0j؇+75PsHڭIpLcT8Rv0Uǿ  !!G:l0#-WdQǐN7i1.?'+Єh1rh1@Ĭy|24X"k:nҝ="Oj@ވxV*aՓyQPM~3.wI5#bۏq򯥉sOʱ~? mF ޽Lvib7ψ͟P>mc +D>,Ms0T ULIش#Nm>@b'݆mV`8-@ΠvH<o^[R"HtVwB(!B8)Ja⋲O~,BʗC`u8E BOHIJwEs׸ҝhjnrA&#:@߀>=4PFƁVW>B&Ey p>t ĿΠBsrNaʭ| ~=/?I?sZXuDpt;i3G>xQ{Q8ؓg-k?7aaҼ%*V'08VA M@Fȑ9|*uX>ePx$]m% ל4uxQ<+S $%J7 ^? W\sNl!>ؐ$3"!nj/aM[Tǜ~8iA _+Sk Ys$O-V'%N(ɫ|IS%N.c$褛Z=Kҕ{zooϢaKgTi!dtޯo[Ȕe%?IXCm6 |Yi^mbJ^sSޒfIOC|j ,:\̡4S<VMRמɼ$Q!('+à?qD b'm x51`@ c2P7zo,,Q#zπPMwKbx:>m3,6F$nj}ՐjS1 qDl-I2 rHI"oԇ?--5T]dGŭBO&kq8D|._p`çȿ$ILe*Ԡ,ttVVTJ2.Qd~p@Wjz#>M#(|2XeJul cF1a|SFgdɯ,au\&~JVh@D2E?"$bR:soRţo̢:]$`]!h8(dF|WN6)CDf\jڄ4aP [s.r ¡, rS@q%%y̯K]FU T~TAt!Bo q\ԙ8{$IZ5xQ>OQ^K3d)˺UMȔ[<ȍ g9k=>,)K8ΫP=uwШoq;T)Nur2gf -jL>WǠtnr~?,41Ty'K믆btT߷Zg l|怹6uԢ+XrK' @gۮC-mU~WG'kq/C": нٴD=F_ړ_TƇ"OJtSv_71&&V6Rz)vLF*1Hk0io9m*(:=u>5xyU+LCu5iN,= |Œ׊6o+y^i\4xv+FjLՍd} f+ -cG8j}r1YefHYί?{08ѣg#n>ލbW+(As^H<׼!-RP)7_@I}rRsIy%XDIV{%?Ov2;HΟL{>Iی~H w Q3x7JAT4B_Wly?7IK^/9n$ke<0?IqSgOS,rmPUގao}q|8~8++SюS" i )uYw%ϒ!y/%%#H%Q-|SK{s-3?dxr1KJҚ Cd\e7ǜ0 8Zw1.3|h9ǡ!0̪N $~D'wm?@x{C]ݺ[Q:- <:$%* ظsU0 NXUL /AbՂHH % 2]uP^͖%Ԁb҇9KʶrWؑa.kНqcc[{7ON/ahBW:̷X~ O7!3z眫.!#u&B}q~ _[ AP\{[M|LKY .+iR%a?N H% ܖZui,b#H~Z= rV˝J1 5c"Lپ CiK= :hJ{Qώ˟R3Q0^F3,ze;\TXA75(#ySM/ %jQ!2YF''JPX 1PpC:?;w]cp+{7{u5xT)5646SOѼaZr?6↑_T9s UbXr}T%ӾjI$ˏ6]h+nf^v|mR{t&b3C(ZfcrS,eTQc5L84xHFW$YYm2Kz>D/4\m[[sqa<K=tc<*ly"hZ /bb$rMԍs-WRec@'{tNy7/@702_3<kWxA"&ٸxYaޛgIVM uk5`ڿΥj 6w ÕŨ!8[ҵ c ]" HxhCky3>.b; OI끮Ou)6t/;Kz)k3d]$J,o%aQ4IϨ:E;%P\Ex~'Zzp1nk!ZUiī7AUQbSA$W6IRU3U⒵, $KB]ԺH?Fk:h5*,VYdcu&>NŬ#"RFP0QX5U`]n)#t./AnBΦ=ӯ!j[@Fcl%~ɳw1yj2xUʬ%w.OdF}jwF$n{ba'̝$ʮ$zt|DٍdUK9#^iHy3BmwPͷYn>I#P8d&֛PNȬ'alA$?_v5)]_]!@WJRhU#%}]{5\(.b17ݕoQ`Đ w i,_;-.ހr 8 5U!N̏)ql'(<>qי>D!'7_V$"2TB8!SqN4FmzSu" `*eo簊# JOGVI2?Y礛0*Jɖ+XAT*g2yv 3:L?=$oא{oXsq&<(Z6`_M|>Q$|9rO]PVEtaCkvYJ>T Mc(9zHR*TP 9f-UPaY VσJ=9R_ڷ([TcA;+%7v0Z"Iᶱ9Jz~bGyJ A:1؂kUޥɢDԑgӸU1e QRh67r2)bR\n"ia31JjSAkH->TԵ&5܁Վ圈Gdb=NSccyyGՂ U`G tD뾜/s4*rW'{1!~~kFSZp+tjLJa^7$0uC&(5dpK4dMY(>%\D^6ӝXE#?.C3<:KrXc[ǰo$xvOˡQ>Z( >ku \CH恝~&g #T5O}~&ΫBũzrj:xG u;Lޥ|XݢvK3*[]þ-V hTL5 H ^jp%#%b11(fu!w *}?K}$Guak#5]]^5:,[2/bII| (MbW[Q.KjW}n]uUy\]%-D&b\LqI68xڎ8QN̷"Ђgl9%p<A2ܥ5^˳;(My:Cwˆ}uP>a.KDz75H%O Jy֓gb-c(!еPwm h(_.掰+8sۓV 9!hkSa-ۖ{k(c:V*+_DgOI@:8r?>R>(`gb9 pD 著"g1X~2fPMǬTOi jø3;Ll΢jyG։5왜@qBF륜P*Dk9`{o}2H%_2&sP<m q= ~Lѡ;<4'^i5#تd:-:G)Rqsn.Qi#ߥH gAn=`4 ^kQl\/(g;/}HyD\ЂY{z~㳻 T-ԑ##ȿ"xܔ*k-/aD=mh鍨;ʕȿ/`Mө1SfLVj|1#c*#D@h ɱgݢM9QNTm?`Op/AdlDߧK0+|©ī*"Xk99?ANhwQK Bh1?[RwdcLӫ'1Uhst8$QAܟ )wՑ^ƙ]#yM) 7Z0lBj0lG6~rpIp.4{vMP8yE (L}OMBt*Į#s}Ajs:Hϻ4ATMS̉SۑY ͻwڣ7nicOfJDB." Mqn<#|N#| D-坲Tw|xգ9NVb)7O3F^y;h򠑏*GI'J@YWln8/wG:l&#|i+p{19LE~Q0Áhp=4]N^-kܾ 1~mIeT3C#?fpnbJ .z]۹E6scmDgCh~=v؛x{FYYn3,Gm:q5Ǻ%|p0r VC-uHNJ9sFXOe*n6尼BWvEJ z[^{@B?gw?s,/l۝k> a@}jmiz)̲0-e>b%΢X1"N'<+bR 7vEʄRh:V2r=зkt5MxJ8sMTC mAi]w, Dg^BY;I&zP*he?tV{*2gWmS8M; r6p6))Ϸ./=p ڝk9gߢ(S r"XH +#֐÷CTUj4N\읺f5z sO }Ov|L2ȼM94?c:MsFWz$RpoPBN,l6nJ5VyEO~gd!ķ!# cI@/@DmQwMOW˟Ýыj 3lpuLK""ˮɫ bA=1$!{e/gsf+Тu) /IWưkь=ADOMAHx&.ƹdA@Ka[ \Zq6ͬ ^&EX'J$1TOEyR.H?*e.h/J}v0^("EFF4|A fWv6h_$stҁ[,zNo>,_˟*ԥ{Oˮ?F cM'0w٢dߎ22CP,R+Y=߿i~EC[X}V@"ҋxZMGde0R#{ ߋ7> f#4qZEu8do[ ]S%fipSzfR7j6J|dO9|?kd?9*X˶Jo՝>yHc(4[]O•y1yN(0a|#%(MKjH3kOJb[# ҿ_YH╤cϯDrZ;B3kMh/7aɵƝ*꿎 )7O4pڅ?4ja25A' 5M+aDD޳V)#FuqY2H!ʿ_L)Q68h߷$.ghC&:σ8G8;T͞Qq 7JsfO6/J!sFI5zbmِ%+5)cXqtg *06~f3k]R[ G~IuE6E¶=WY+l@ F L+&ДEtYh EHݒ^x4t0SL͒Cه 9v= zn]4MdCxv"Xx5MӉ\#E5l+{O M Eo=10#XqyYO71(cLTI֪`bFG78MuyXD}VFg?@3qnưG=> ]Y0H&W x$g$ SnヺΡXq!B#ULCE _5|y@V1>4畻=U~@ \hQav殀*3P w֗\tz ʾ*f-+h- ͔EM!P) W;,$юM.ymi\PWLf//B?yVd\c^pRhy#þe٘f:5aP`wkp$Tʦ#,f# [iۅ<3p]ϿUh1-*KDktbFr&n?1E#K-V?4hJu=eCAkxwZ+xeqI 6Ec0 wŘcQA룥J8^c;xClȝ!?ko 1b1ehߖt.^~cZAىNr8'kOZGܙfY$ 7@r `j\HE%~GVe23SN|k2_;0$8gt7ҥqkI>yXyx?hhEhaDV#?+ qx,3҄%]ecnM؆?bJ쫅(ŖhĄiJb4J?G@kp+M\'h]'Y~?3-H| fEaer0]ѹr>3 2$Mh=CUt@\]gSXf؜KJlۗ!WQ5-.i+EvTM(_ h1[CC0b841߷rN`%R^t3Ge2j8le2gJkɶV .tckmQw 8nzwr-A/,+Gvp&$ -3T統ޗi8f4*j(;5`L.>ID?RE(%송yk\E-]<`Do]\{<F,p+J! +U=Ծ?`\*7 V{iz{z9+_. S/ϫ.ҿBL,v$/X}Mo,( Ю+($f bH ȡM85urVii5ȑvok8)բg%#Yn= =&KĤdmA>V-vT!Аf8S`D=D4BwYU6-h2CQ jhc~UM.8/>6SadX4:+aH@rNTLe׮V$̩wY"<3C] Nr o:@E|XP(ٓ9#Y["3W(R/ޣ 'fdμEo&fY ^G8%V Zih=⥌#=>qIrJ7)Aš:UϫcOXQL# Z\W®rpSH~.&,dyu%v_%4BL?t^Z}/2rKe{״%YbDsjxݜwy\؉BЍ{*ʅ#녀{MkޞcV.O}Lp]uctC"Z5-[B/ |n7)yp QDXg(eA[\_'1nqs>ÁKXL{nJt*lFExce8B['7 gGJS Qp"nxB8s, @GjE=e4'͐ʋU)N7Ghd6KÈ%EMq*-ۑLSϤ6ИUŻ'_$vOt<W"h6.n35q@7뻠c-x Knc`r$f H5.9ߝj⟐&$ÅN ḅ{"e%![vж}#<.ڎaäǁo/<8C"X|nl9:)kJ!ھE5Z.a;zS{;&tc'*?!*d`˔ҴNkA_`7Kg]<_IO4c vtkgoE)'+1 6n$%5y5u5^ñ*6k#I0jh#*?ja3NLޓNAD`4.fƞN\\Ү]0EE8H H n\N̪>y&i觿w7]ޡQc^jB ~g/#U2Ȣ]b(irNqD4Z,Pp>A;9vٌh4FSV i g6Ʒ,/)|[.paGCacN+{N:LW2 2OG[,?v}f>W IOtQF`दw[}9"=>#wq@ib>eV\F!:%SCo=&g׏lI#yLY4HjU@)#|GԾr˴EXհZ,khd/.r:;:l-땝Bwղ g3_<Ӯ J4Mj:x=Ai -%&sp @N<rQabyw [7ti؁Y0JyXld0>ϐgx PU+ཙwv\jc%dA! ЋܷlܦkɶXHW~DjG*xnb$&IMf|rƥQ^/Eh6W67QM>;"H!0 Nd_bp}>I[' Bĉ1 F3 I2tJDlş +* cHVA]+?;:RꙂhM ٓӑ wMjDn:p{=JZŖWV$!Mq L Rg5GvupM'.8dWW!7[OH)4_'#[%Rh5vE=|XV`nzrH6-_ڔrP*3tʬ_LұՑwtG<m5kPVƊ@`U"3/#N![7Jv} 5j"?u0w\EI1 bbn@a&}K8 u't 3 Q ZzRiR]<-;j%<1XLUKWڃ+7DJtoGp5:a)kѯ/f'_G^5)G`j4}R2ANv)ʇT Qje=؝ .4E>wIwW&?r_`GuF\aY94Meq !KN .PvbsTX\ai歨S/KOۙC!/kb( ͐*2gyb)Pޕ*n~?6^ٞs0ViiT/ឆc-j!?X?K+K%MTy)4mEqqߪ"fvcbQ*Qu]ҵ?2~Wa;I5 PM((%ȏŎd89[SM+kNHt;_X\kBi%Y 71Bszlq*gfuy&sf6<Վ++3nͩ5{$p{ Ͱ"UJ$,\͠!6Ңw|Iz@3KOitB;H(dR*'>ο'G$XHs!:WpOELr^ěkvk \#F&'KZ娬€BlIʕ);B5n3]ОwL6M(hn;OuVX8eyu0ҫ D2E;TfMVVl nHyǫܮT$k_v 0Á| Aa?ֳKNkQ n7 = w6̴>ԃ'G֕Ϳwo]-I"k1-rUdup*͜4GqΰQD-qt'/J,  q>Q!Z=nK IkʛKMF}P\>HS뜃4]rbu_F_1kuZ2!hH͊>n=I184p$sA dr\fNbz\갃LY+}nGzЫ1/[>eQ ϱհ DSc7{Lţa* ^jB3nI2Anۉ vw~E_4@^\B0n}z\Gc|G'U;~GиЭYJ]r6(п6־Ϗ$ #x9} lrR=tXG%\}H+O:9p#"N&! bxzU@XpFY:to!h=~eGRX6>i0hNSҍԻ |YŰB@]hon Tʱl6VFLgp9?-[;_:ܦH /-c||}MakkY ke G! %d' %od}频(Xǒ6gHcp3SA!764Z@z}$MQڒJM]dEI b=腛[?Ÿb .83 vz C5*C@jD3SB[Q0y߼)mkr%H~JXa7K{*dzKG̟e¡ ކ1)įLu5s*kgqLU13;6=D k=BVi/ >6(.1j7-t3%P[(M{/j޿t84Y7,*}:$RզDb{\Ֆ9e{Ң4Nnqϵח O ]kC=K|ѓ%(ͦy`:!CӠjԽ'{wIJx s}X')6J٥-Qtu(*U=)lw/siOLW?<JLj=?p1Wi*6¡N+\&Ei܁|-`vZ2iT:L 1"14#% ͖L5]]&i-Mi)\fz9vVh/(8K@Bo J Q2eh$*dRvO7%pa/[t+ޥƣjV7OSD>O1U~J@u"@8$--iOLr= W5Ms|b.C7֋L$T]\ΦNfw@h.qwmɫзR?Ez '|̥1UmM1qҞOшbeCVE6FRH_T_E@zȇ Gn?x.I,Ji[ꡕ^d-j]].a'jÂe̡&zS7 pv' Sv]. J'q ~5(`JsR3isV3ÞH٠w % [W~a}?wv7h]ypk6!wa1HkW36L Hҩy,O-NbLॸf?L+nl9L#53}wg媲T< {Z>v0,.[ˆ Q2.IC"L^ft/"tUUMv{f sk3Sl7c;kgDX~޹䊐ޱ ,g٨sنk@# GJ:HxmFgTuؓxBmjeࢺYlZ1#g}Wv٢W`jq N\w/dVrF k T-Gƒ+ߋf9݂˜T~@Ū+/zR-$tɣ=5kզ cOn-ʡ:]c Ӛ89ď:e;fW@^\d["Z_͟ju]fBz׎FVC(yO5uۛnI߉?.V!`6hE=#JRM<Ġ}Les{6&DhĔGu{ ~LgEMI\yBF4s:}?Ij詌 ]&Hz)0Uw| -m]i[ ܈ b]OF؜X 5Qzt]D99)t6qa': -iT-O *4q3)2P!| kA/y^P)n^ ϫ~iHz_G1< bǙF, `8qA9A}Qv;J Fu5Y:ki'd oT^:pҎyne_VP1ϋOL噍$h\ }Swg3UF)o3L$-9_FR{B{ԏ]M~F#I:iuwVF젨L82n%RX.66Pe `2z(L4[]AA{E8ry72^ZB8yQӂ - r5x- ֬^BcWGߌUJI]7I +;F#e*:Vw;;؇5~hWE\˕ʼnğaIP')@쭧{SM2D˱kȥE#սK,Sx?]\!q-W !ҷAx!QiMpB8E CO--њa]9(>׷lVLvTڟS;4-d4ѮH =nTEX%,i1g94-RYOIw ]+܍ w  &qS=s>:.=nZ׀=/LCb TFw]깖*BMx'U>}# a4wDu:=RdPHK>Qds{PٱRa z n̵QB{@<(9ёg8>ލ1'wщq|) 0m[&b:UV,wk7KlH 1_%6NH_Qa f2 n(u2(Nz7X6.!-5;$#!HIbg3+ezS<-,bfXPh c2*I kz#VRp~\ Zqr2v27hקU`nl>Q*:kgUЀ:ELvT{iA'JL%{ c}GKJ倁3A2YT ¾~o&)~w^ʷB tAn,IcC>isU{I|(cHoeπ{*MKͲPä'LeXbI{:5vvUͅG=c=ـ0t 2$Y^nOenAP^/{~t/Է<)v㔴3b5<'rk2Yo GSE!(; {ō1WTM}vs=Rހ %rY Kmd |_|cDKqHNTD$m}n"y@ɜg9<❄zO/5KdvxkoD)akq K][=~E9{YtX#b-!-\]ķў Ma b$}ϥ4"ob-H,;au l5h0̅þ{.ØWkw&yNb6G+o XwDSbjALμt;0,5 zHGt0ג=+Q:F 3sp3On$Ѝe,$*5-~ɯnGf½뱱9q[l5\a/㣐=t5dqpEcS_n`ATa42ͥm@^ $uk0΋%#B&CԢ@'?_/G2 F{4~_MoJ![m3- _Hgs/25i"+P>3A?aA W"‚}2m%twGՊ;EL lް׾  <\9Zr =}G2$}Yo,twΖ=@o0T9mΗ1镬{I7DI}<|TjpA2z`떢cg:xcY1vP'XA LeZ :H v&gRe4`N}ej}I!*q;A84վiFX"XbA$l"δw AR% Ϫ?dYכz5E9G@AqDpz)͂e0G͗n=fff1_"'mh.fwu}^L h&܌*q Mۓw_ F@z|#׫=S]*F%k$uۣXቩapuIkqڊl$Tn~'eYq0I=r=4Hug*"lNbitV֝KQhy>bOG}BCNiV}=N) ~ '0a0Ujn'?GPߺΏV2\AIm]!;*VCj"B`$,6dRnm?wVĵ-hC֠5@l3VyA *|Mhۥ؇VOY̻mEYI1e௩xEoVhV}5OTBLK?#6\؈Q p4r<_|*s& #I Rc\p.0VVE v0h5;@ be8*NcK 7 3_!2t~ @QB Tz[uҏ9ج(ͬszLe7%wV!t& s}+#+lUBn}V)(xb,91bo=2xN›?]`>43/٪ev@-tƤ,-pY fp}0 /zrxi(K>r0Պ_\A <_l^"îK)O »LxՏ]u(T᩻k] y<x$Alh'tIvz81Ҍ:,gbe#@ *rJrƳZC"ޮJHZbAN2Gak\ ch{,?A+$^@*@,?[XJ~5pEGP(jw7EnęXznjv!-nbىHheE?= !"$"8yn%:;KD}9-S_q;fC9 :Z}ak6p tҾ"@~,dv^Ώ}ک2k"C-F:~*.%LNTE;"/[ lo%*!tcY_|Ҋ]i\8p4@(FoFVy #[DUʙ0[RxB7*,IF9;1B-e;(0+%YsE &)l n8Wή$27gvioڰ%7lqY%^.~1K0nu2tt]= xC67/tV$A0oTD[|ߙ# G.Tf!:p'XYy\|sṜc&"dQ2>H8[]j1.g0=~mԗ9!U``EG!9ǣV$hymǾϊ훨[C)_2-ș|F 襫< YmKVRףL-h.E~+9Z2( X?3 nDYzEuB_u9`xyЙpT",d`t|T{ ð`xqp+,9/AxU"=%5n$-MЅ醄MR#Uo 0_5 x/KG[- 24kGt6BӤ0~h$3``Gő !A[:TwG[TSHF?a愊sk3;޳UKmoz;Vs˃8#9OjGT_&$ S?(@U}w Nͱlil_~9EA1y 7Iǵn)㨠D;\ć 宜-PY8KP^DactUdi 1WaPҋ-thyx۳"a/~B9O㕵5{\%;&M$y,y?< s^A\dwj936+Ԇz C|Z!r1Vr"j rZh`AE,}.RQ݅c | t!X-;Y,^7@ nneH >Í{$FfW"؟=,'V_ bF%mG68QB.rBߧy\ 0j\q MD`d*CsPLgy<Tm#ePrLF>tI$qgu(f,nWNT:dc!wlM֛T<\,&UcM'SӺ L=+e\^OY>^hx W? c(*nzt~ ƒ/v^8<!='&|{%S y=N?l@0Z-ʀIr/űu s b!:LOd_4ҤlPHi:wOD-&xVAFu$v_^>92'cn683snک!CME@ἆ~wYsÝo U +]?FPyoMÃGI(%7ҏ o_zVN+A[ˡc s+K:>D*);{htZjh5g^8KUw* ?z DTvQErc߬ߕ:>MVS̢\;8$ﲷlѢ*@q ;dGN̔5PiHoN!.-r8{wHĻ'9AC HfZ>v&#|Ȗa_:iAOwڦ%%S~íOx]&&;/+?E`g9W?QT2WUJ) Ǝ+H!lz_Xk 8*R@`YOy9S'2~RWf$EˌKm?7#܅%3Z7|&f}##y2bt$ٟF zm_t"l2WoeS@h%_z ׇ/>S1j$^28˦XP$|E&b*+}"8w)gņTGSHj1f2m\gEo{ȊB VM2f =!1֪ѩݸ3gFd.p1^HzaVLasgqĂX^&fb)WlAfdGy6V43 ʱ8%s(Fži_" W*#U_ {yvoj#D{Ke'(Fx&s+z9119T=P<]=[Svonm7vOJF3pO)䪝m%1nb5Tmz q~Xf( P1xG^dyjy6ԆB=~: .'#-`}A싉须ڏN^C$4LBm/c/Y۰x2Mkn(mgU6R$^hٕX9 .]+ r{}3Ŧ|Iy۲&C%Cж{Fn k+B,ڬ{1<[A(6릥?s&{_~)Ŭt[:;K{u[;vxE r"dy}ReE =ʰ*\&DZ V`wM1븭jf0g9yut $)|M1#o j6O(>-޸w7eEU*<(˟i5xnᙹ-{VnDrTuu\G2Iw戾X1%H+Pv9:לyDg`/>!Cεe=Cz,;1 53b9'p^r:nM]L p]d2s6㑲)t"Y[UCֈ f +|>MY(HӶEc}iu# |w ]M2 +,"1AڼŦ2䐛_F9$47YRoZp];+^Mt)" $)aQy}]歒-=<%=-cxAQ-!im6 G1_퇵]UҲ.{ycm!Y'}kTXٕWrE|<")sm5  HNM*U.]`5S-%I vZ=ےmgmK0i,kd[j3Gˉ3_i~ w>S, 9=|%3D&֟E& 䆋e0zN q{ BkZ^Y~#T c5MdZ4LT舏@uܶ*^D2<̈Za{9@MQ{_ BgRQ6`rviBvfdU`ruq H䎥> 7&^c^̨GWoCl].hZNkH*א fyB'K@P6e!*x$%"®w4i9u=UK̰LdNP!taDvzBQ0K-_O kջM._BB%b]Jz|z@A 5 IŶ_S+Ў]*svW;-}- d0n_2fKjq ٣hB>\p1GCCelݝm֏2j "$$Msv`>FʰDisSg%3xD(e΁Q)_׎^WhM/=PEiUj:!İsHVOÄ́VbhP)T`/8yxPʺGd 1X4z+0d{P=jie8z~9؅[Vs%>fzL$үs*S2 jV(PΞ};ʖցNe!R5cŚ`0 x譏+bVQP,O&&`xs,"߇PߣEI'F80텫PDAmod͆tXGhPtM(Xr{ O e# bU] KX-/\D!h+I?)rv ,̚9d;l &T&N_ӛYŸ 6~CJ*Ѓj\ gD}(-m\W}S"_v|S,QܿTh7ۂNSjL|0 DD]Q ]MZgoz4Y.c \^MjHdaFsn%a"Mx$8~K_h!u7yma zr< Y ? aNH*I-ɽD6xE-F\ h؜ƮcʇgUb@ʹd_ 6:1|Y t*ʥY-D^q=+3$A9:[]]+Jnɱw;(4ɴq ?ܠ JvyR/&Q A-9_3"%-Av]Wa!Ňy&SæZ^k!ȶ|cq@xb ˨̈́U6 ;5m7_hYz22KL/Y6JpX@|@1SVQrtg}Vhg%xqGGdľ )zȻ%?ʼn`{AEdJ y:D Z^pL!ui-{'AӫXg =j "{X'e D w9Jk&$o;D[+?#JWM.^ ŠO\tTy2xU{^Bt2XGdxM[쒿yp;VD< E&lm[ VTt jX(7b# mFrR Jx6Hma3?;Z,m?c!R֘B{gj/S/kHX , ;d,F<ȈrB\m. uA9PЌGfv[5a"|>Ly8 i:Ju?}fs\EoGU3q>L[.<+\BJmAlTVhJi>S#D꼢hɠ,9ǝD{߾ %I3E_ޗ-@PA^`ZukIM -S1H: pXM_U<s0aStG]kXfIHK: im{#ney]k8A+Dz8[B[V'Ez<>\NFf-%%@u ݊ghZaTLn~/cY+WlԷ|SC Ed8=jEtՒRFqd;FFG#*X ,Bb:raIK׼&!`k+\ A,%ْ e.f i}Bߊb QWmErelXJ1jY`8iEIX/Z,جBH`~t%,Hh{9ʺ|/֝6!bg]O98ڋ;ñm-Ji D )\5nY7Gl |*n$oi%.c"' }}՚=D:OE%BOuㅘ"t]OD;o Y]GQʔJ~ƫ}h.ȵGZfۂg4e}HUR5"܇+جͤ@>%ZNӗn]i-nePVw1ݩՕi[b׎H+xkGba&o`Ykk!(FBu.zͮTcIds2)D,k SP26{FCLYe֯0t6ֳta!SM=m>ZXŎ3I6vf0I(d YfGw s?e@HGvx.ui3BQ^ H->H #,e:php:Yݖ\A)%\dYCP|GК撟eDֆ i–`݃;YHg;t#'exQ:yyG0*+0]&W30&x\gnj`%V>)ڹG]{x$)NR/澽llC4zmDe3C6 ;z0 uG7K9R;R0܊o 8]pozL3Pgl`CZԫ2ϔ=`R'ux|8..O"+"KCS{K}r$"[ Cz8,izUk _fJb8m R.;j`.Xe!;}3 ~6LQ3FbEbg(f޿KF$`]}!Ez@ N܆l#tSU x_N}j}EDLczJS ^gϖP6lZr||![?:cಁl_9TX<9#:9FP 2 KI=|t_eZd+.IJ@ ؙRs]%\&.\#ײ!oas,ZAHqx {JttE̔6# vEěRoNi.ֶXx&w-2`w7i0l؄&gRLWOS OE2Cug'eAz܃J5x$dSFJS,$=Y<4Rcs{rY4PNA_c#=,Yƻ0~EUN)Hۘd$dy>:H}9̷Z[mALmw">K )YʢVu'3~ 5أl5e N|%XL,L@|^]rs}c #ce6UF+&w&  D_^r)uR= SE`:݄qը\$IClIPZL&Im +6BgsF2Zcn.w$5ׂC:#ON]ՌMʴuӈW2Ry* b_&řa(`gY_y%!T6^H(ƣ_d{<&-촆}fٸt9Rx߽OdI'0@yL<>=yK)?Q]8eAh >.c@W^Ɗjf^Ǔ!_AHѺya )ЇR*XM4.!I vCH6vI>);j2Y8e`G6/+6 `EP4l8R8ÁT;VDK RP w~FE ~VzP IwBkM 0΀/&tKtZkʕp䪀7d+}ӸBRM 1,U *KQQD&6HS2gXLeY{)Sҧ : [v≎}K16y\!UETIRn .bw]4Aݷ0eD%#oPQ qDaŦ/3_Bwv/Y#s?VSCYW#HpS>dz~leendf-W-~S"]: .& 9>{vx釨 >n;F(?Ǿ"D|& 6ä 3D4m捻)(z[XSZ̃+UT@q25*-;())~>1\;Z FPǜ(0$gnhU5w_q܍?lAH:X+_==&ww4h+E)]A?%Ξ=7(܍mb}~@)X*rt{=Waw5j`c ?s]34";!]*,)Kh*/ց@˜ oS1{op`E"WЇթih4N;8Dv͏_Gg θ#MʏL%xUtz'Μ*(B{¯0!d+ ?e^݌RD ?HSZYH &сNO`A2^\p( )}_K0 8e(P |7λ7uUG+YkKQImc}芕hDpY]`HOow H}6m JޑU9fdp$&Wx4!&*J&+n4MʅM>;u2'Mm\uq z^t+Nk}΢*ϩԘx`JtQkѭr#-Ӝ]sJqkf[teep]J$C.֜"Xȑ#=i["+r"Y50gBcBO +v7ND̔0IZn30GACXLcl2AR@@n1ԬJ_|⴫fA's1Њ[~y|z/cqJPjSM^qT ɌU3qh{X)ڱ'E[6/Hy\&n"@(疇&ɮ?'v9&Qy d|gON6G;%6t(2:p d>ICov:vXdոy|?/MR"h.͎K4&hjXM=2`fmP\zsz})ԝ۩m'@^|YM.ceInV>FrL sbtjxry gyohZ"NR=-2=7")۽&}[{)5z5)SwBe!"Lt5h/~4.]^Fvs@Z;XN S₳ k8Ұ%6 q)9[S ID?7XɷwWhGCz; ̖e1SST9gR\5iI/8t\9e_'AEgk>6sygԣy\e!0\wCªz:)w:<\EIﮮ+2e"7S: (9ċ4aSGy$DG2$D.aW1IDimQ+Xlk5dP0i< EN%1z%PhJSPRcŽ.+kCl6ޞ;-\X+n1lR!|1׏.E]QrIRD7p!(O/ָ ގ t'(KPeZwD;GݰI$`xk\t`^SO߶j?Mr=^zW{?s'%|9\sY*6gv"dOu=ҺŘ5ZyI*(EIQ!>Ǚ]{+53h }CY'[Cx'_Ðźzivk&P$ToWG3=/֡Hw=mƧ-SH@'V2|z3+Jکa]fP@+UI"lL!ٌQO+^[y^clN)m#p)R=BQG3ANjy4'JKɤ{R?IY`N^Ud]EO󈴣"=D L_u#%7;3ؽ¿߻Lit$\Uxl( )|oƨ$6[K^èI:wSlP-9u뮧P *҃] o ZM-^?J/\UҞܸ>=6'C.KZpM=Qm0Ú /o XU{x;!a' WU+mfnx x: >Am: ?A-x/c"JO e+',1wpBY+!p0]t5E7qp g`hi(#\G0k(fާ Wbj8m-5鳑+__vš"z"=5Φ0gs>{7s.+(aλcNNt(7\6>7󂮴bWbh\ ةJRqŝQzX2 DY;U}hT:XZG`(P,G_mWg$*Fއ~RvIbH]򰯧7FfMk+0`C h0%z"3$xֲf#i8AFLD<.Yhy|rgj dMGZydoѾ.iB6'̎;@.hX7 j:4MTd1QGɉ>++}3ޗ'q4ӗ4gd|bIo4=,ESF%@tHye@"Bu閣yE/b)9qMۯm1Zp._S=GQwDGW̗R-|hܺDvcUU k:lݐ·@q*{oEYbj4E^5I6K=@k#_X hoY:*qʵӵEҬ3&"3Wʺ;{ZpG9.4B^N09+ez.sZ `=twQj3bЩ[]Lڬd:g40R\:3a+gru@&\RM|ki k9 YzYPj? 'rL"7;Z\61w? s?oqeb\fcL|9W@"-i?bu{Ÿl+s[ee:㛓}gGuX`/3oo#{%!3rUR:3#2Ibcғa|G΍ZLKA[䵥W% 3]L\=:ɳNBtnos}=oY?&qiV[MƣbzbP(YpOzBcsߗJ'z:-<دTZe%;G Sˆ4#*BzΌqJhcj!2q*t.*k/4TJӻ[cwqkDbFֳO pdnȎCf@f(OfrG!|fWD OR#R63mx_;?!+(l2(RR"Ѥ%;Kj-~#ZJ T}ͲOY[U#vw.Pr9h&T>`/</׍h\z/ԯCJ ĩf'NVMֆy!yXqb"q? SjTGv d@] s+.Z}K~7,^B+|T ?_Fd6p}znq1fƴ{B kh"cO -+|ւ~̓@юhL!N? w{bu+. #Iض%~t7,|cϥL)B_õ`pLrTdAR[;ԫ}a([z]]7 /\1mm8ÿ5-E_=BCxF}&5iTH aj^{wS^̽B+0}sZkdSdz o|n'8`Kp @'^=D!cëU^u >Ix.o*.2 /_["tU &]LV]#Y:[Au]y}'r<-c%xza(:V/-Ǝ,|%s~0s4T8H'0 :{NJgl[X5WXqG[ lE0RbרOT&"}ju-N7z8 ds{,E({' Q6;+LOC_z@@h"s)ժ<89rs`}4"4wb07)BAT}P?VE3.@sQmixe p X`39i% r O#'=zBgZHAu~r ҩM<ӐƷ|KNq[҉sŵ\!z1Tt^~걐b&}h ǍGk ~|h'6X43(ogQ(I}|_2d~+!W{;U\EgEʈ&x5&Qy*IJ7nKl"}51?OՌ SxW3.BHGp{5 2=C!3Nrx-@gG2^ I hQP~/A>^g\Aa*Bܖt[LyYqŰ .Qy5: .Uj|ג-{x;Jha on ?<ᕃeRz bpXY]anw$L|?η؇#ᠺpS#|3Ac;^Y"*<@e^V._hho#?t.8w&@n[8.Y3p)5o,l NP#!@}kj͋s bC=1&?k8얃/&0wЬOŴ}X]e}+^VQu[*o(`WEޠM<~0C~]Ce'f#IYLcHJ5wBFKL~ޑ} &Vl5b\ba@MN cفr͕Eqz^Xrx w %c-(BtLÞnbMƥX8]:m_W^~;?0< 2#^}0gЙzojVgٺM)݋U])yGP$ff$\oc-~k_#^6_=͛;ņ4(`9zHO^aK8$FD>cˉL%8 vX6sio~vD,%d6tlQ@X,5f$Dq#H/+2_YRT{0ҧL9,0IUoӽcGBW@]JٌT4=oUhrsՓB 9_fQu#΂]H9NZt'PfKymmáKWFnhFhUb8(3o+hhGJhp; ;4)] t9QjbZJypɤ!HrccSXd;ʟ-Ӏ &qFr`US1~;.1Ve~98sfĚycQ^QW p-Z?4B@AF ;LMW/7+lR]uIOkr֚uV;& Ի$XYk 0MXy; 73`@ ש%Mye!M#ImRpkspfbW١JSɗC ?]['{lYٴ[3^b曹 P_xq=3P[vF;,Mo.Úv߭&- |.sy6r`W[L--RR%hh#hjQ;l ר2ƄL-@IRp#UR1{rvF>` iO }bW!QV+U3#𵁥"=1.x-Hɑ1%8ZD%t5PO+f҅џ6JCKcO#ojQ XwP W8`"B-BŷA=Tr2Y1t|8Ϻx``hZ،z^BUXB(5*x}q>M9{}% &h('RZsGӈ ӽOԌW6B4-\Oݭ?\LW4-qyD{*p4`J+&ю&sN#_t̨̍7lScfqD RdIi G `!ݾͻ%=кVMIkTa/خ4BRXA @fJV؉E%DvgM$'V첇l!p]H~f$x _qhG  @w41Jkft/h* 1yXce yk *+_Oɞ죜.ϖȌ Z]Fv7]۾uBMC筿/And%O ]."a=[ NTƖ,smDSRۊ29 j.^A87Đ *vYJ`|ګ>WA~jyw优ƸevS&Y*p*vӸ N#SmI_c@^)&;E9o8n孰sԪ\ysP(_G~6&!C~zݤ9eOk-Q gOf)vA/B!Qm)K!ICɬ..F5}i^xYzlO2P ,'YiN`֕G^rLpO#Za*seO!֘:AbFdUYc2ov? F ;?1(Ge-qnWlб@\MĶrpF#5_g(_7j*ރ٤2ԄqlR[[Ъ EDzRwh _P-,=мSHuOq›'O\ Zdb CoeOLx5:05]lع"&{? +GufA[kgdY}j !?<#[duyU=8f}n5`(@sdGŎH,1mnP54ɣ>chf]u^G66J4*BQ&E!OyC%DiVnw.o?)>@7?j:_H蝏!:2ϥ NT!CUȝRCϦWLj<)эhiިǞAڌK|^#=ӖoC{oVu_ɕO Ɔ&Q1e<6zA#Uw/^tyiD;2IqnQ<%ϭU2κ+z跥`(%T>DM0oB[J[MZzF]RJHgKB#[8"]1]疏tmt[z#`f(ZL i7{5oZ!k$/Z A\gf1QIS\-XhK3ݚAHG;.ӌ\'?R)Lԧ'1䬳ݧ4|KK]yqyk3vK"3M@ &30;7G搟%) Փ8/$Y6I:#4_ONb.* ; 7A}颈,W EF?\'t] H`R$|"Er! pu1K['h7<>yv.r"CTGk!,fDMn2݆W") \ҡk}_$*ٯRS[ғ qANZ(tŠ.! kIliVZ&?dD}V\vi+i1)x9XM L ұbtQRrw _<@D8+}~?;19}E˅bJotn^~&_[eˆ,֕BBZeEYKh8o"| V =zF^=H 'b ˌ ԅ6ŕBG7'knoj m>u_7C9Y/rwTJ֙vxKz->W<:?[h!4_Y\w=h4 hpBH{jߕa1@Bib0"蟴L[E EAT=b H3 BÓ{DTTxngy~oٗ":^Hd7>qTA (d1L6?gN SY1 H=2!uRy-jCl l5OaM2HKRw3 ÿ%[2r)h3^3*ҋ[1p$碟3*%$q@Hȣ =L0wpŎf<39$+ˑ'XLu|ŊOˈZ$.ڽ nT_@%'3 u[Ψq'5"eX,i0FJMuNdBs^E_>afS%I F&>.)wۯǶNY( :]pP YH`{!. bL46/lk3#y?|ӆ<sդ9/^ŷatDKuxm o#q1:/=4$Dž# huK~1u[ze}Ďt!ã̸5?(Inw6r@u!}<}ޚ,6x(@޶&},{4i `IL%9AceN79yQW&wƳvH,"B_(tR@׮7odЛ2 H6A> q笎[+~BU=T}j^r^YcMEWE٠s.=wHˢ|Rb0&aEcBmUIc~yϱxO+tAklǏ40N偵Z2ZDRK&<6KiԿr7ZҋxB-I5ԇb{WUY=t̙#Dr=>JN\R4i#If6};Z@ZRKYpL}QEH:9U/JkYo[7+j˂d>⹞~&`OQO' ވ_\fZ]V5:$ys&#O,#"oHZ~KV/ħshu;K~{K}/>H8kL |lSq(/BY_tF[ZqFgUr^#yXyNӹշA~j>s2iNRl,Y=!Mbc70A: G[ );CË k?SjK8B]>wB2èOԈVG\JH́Ұu~pbSqF"tNQ0b00ّ`ҳf6^m"i{#`yHN=KySC>ڱq+۠I7 a=V=Yɻd$O)*v/84ח X]868_mڇQi^MftҼQ8Oj' io&̶|?<UtT+&\tOD-ʋ1Vxa !|z l# N'@ 3>lV@Q9eKέ}Rg}?$F=VtcG8<#P ̮E]D=I +ޙf~:|ɕBɮ@J_Zp|61V)qq'LZ>[*fU(Kpڡ )/f t}yh*hPG7#a}ِ$~+pʤPvٿXU0JP;KEG{C-W2 8Ҫ4ӷP`TAT!굊]ggGwB O4w5x޽CnC&V]g>3w,:^'gw̓GH%$TW8N>E;x FaI%=AuE7*Pu_ apS6HՈvܷ0={p6\z$YkYx<"WKJzOe W_ppH$OlS[| w%pYD-). G n@@mK%+4qkHhStj~TbF4F]I`AE{3C~DYӂu'zC qRi''HG0_Hw$@`ϠNןMqkj ɠřtV 6|۟+˳Z'k"u 4"Y6̀+%Wl6CBE#Zypgcd*Zrm})LŲV41M 2F"e+^\@xqP"l$߶^hޠ vQJȑtaƳ\:I,w$c&aD^QQkkLŅ9(#9М(= 9 BZx(_4 ]b1+/>k:SfJ~," *Ak"/5!0ϯA5Aޟ4}#?դϼ*{g\(u%Ys|nPv;av+G#NS"G<[>js3(]gG|?V>neI脢N[9]q"\$B Q׷1YBlWf%mӐlC3a8(cIT^.|.b]e-˦2Q/nӔMucעl(qq9x4HGTŸo6,&KKpBJQ*zҪJGF`[#͋~m$R?MJ4\{eS<(mH2HYHJnAb_ Z*'KW'J?S ;!櫿XPumtƹ1ae o ڪ%Yu X{e5[M ƦyH&d*AWrN$MVyd 9HFB=&aLE^5Uڳm-HT0[JDKVaӄ7w-E$t/L)tת0A+Z-zŻK_D$4 hJ-oy @5CD;׽Md?*sILʈ'̆3mbFY"o UtX=23q mtكF,;KP`-e0bN>J ^KF uҀԶ'hr:}GMyhY±FesqmP%TKʵ7LwQ Խ$\iuiSk;P1{ԂAE6MLo!`vPU}?ݺZe>jd,PQa“[)'0/`cn wa7\`\fTh֖Ըr_?(]lA={$Uqk8AlygI?1ǚ!'Aܗ.%ZdKA{oHG175jI_S|j /\썆m 10,DcJk/ժ у+;u*E7XU?={r"x[9fOS!-Lۄ?=ɜ{o77Y,TF?p&'@ҽ# =. Ĉʇ΢"gw~}QOXr JH4p|ṨEega+zee7@YY/d[ds?V[('۳q0;^,s$F$QR}Еg5sĴx7aMh-m-yc/sj!ck0Ѱ$z}տ]&wInaSap\KIJ W6T `5ef_ƒ"o4jۣϣ~Y$>)H.|^R6@{ 37D71~2J<Db>lԒjzrc֓aʩT`Itdۛ )a^23Vpkl(ׁ 5nQ#KoCdfTOᱺu`T$u ӤV[}c.ǣJ;@ߛ؟+ViQ8ۢ~&U'ڷ+@+IQR/g'A 5;rR+.6vz-) `u #b2b`1~'X TC YC:}c|<-~ħb9%w)NIxL*EZ;os<ߖ6 ` lEre΃B~H2sPUTkuo+i_ʰݪ]x|W^LR;i0M[rQcZb׭[6ZOSX/[G6fޭk@zJMJ{h)! Ϥ&8:+uwN2d{ffR]hkz?ߍrm]( G{1jT֘.]vS9֓IdMΚYΜ Mי]/ >W&_5KO h VMӛNP1:̿0SMà 'Gz/%4 iwf @`0DvVևYeA=sa% e_C)44`׿UMo_>ny?4Zx=zUwvᆒؚ#Ocd@Ke09pʛ+1߿LZx6#gF`=iv! ф+7)x,ۅQ%,Cqi5"I!h[Uxͣ0BG'lV*(k'o2ڱv[K?Adѕɘ2v e{]9/qͶp4ࢷ9 &Sv3l8hw|<_@Q*ɑ`3@KղO3A^yÍ$ .m\΂2'y4ΎrӛY컮Jz@]Ai=r2<}qv?"}l1Sk.8 ^$^X^s!^[]jËV w;*t^`*U5#L>Fpc] M&7yOyYmCf&dvf-:m;Cs*Bu_,g'!fWmcOKu !VZn &m5x'm9C\"9ũbdmmU`0瓴l٤3E?qG SDeoD8g.v'5'l/IbbɣגQxbhi1d !! "Y߀&Ni.8EVhaVg7rL\׉yaE\e*%og 4j҅~ ~W)!^ 2Y%:9(SQwĦy'#jt(l0ٖI:5m(鍠<7y^P.05?QmJ?xۊ2Nf98[e}xyˡp/0ݏEcH#WA@BwQ狡@"@"f6ƯPr &THΜ[=FLYO%wjВ€t%H  !<4fUz\k&ԍQay.kga[#&OVINہ /I*;Dڐ{T,q)/AX ?(YZ4-b*%]2f.U$bc5φ} l[,lO)܄JȼL,stIDW*]%3?yTuWNVD ,|5\~,4 дB3I#ǡIeo Fm-;֫enAbUpaɍ|>$E/JXT:|f5(Yvn|޼!, 'v.Jf4nNގcӇ(C{ oݫrd2ʲHRq6q(0w [w2 _dh.5%VtmceB&-{K1Y%'cc@T=#RrfΠ|~WOhryN|pN_ʸ}oe%"lofkaI6D8$=i0a +I R y1ƒ>b7#8ŚE"G,|e) `Ov|lX6x첔Js$3›\we+U&:+?H2L=,r1oM%Ü+όd8op[P\6Ӛh;r$-v8bܶL-ţ]`^ re)#',*ѩ_#Fҧe=;yrLJAiVMb-v"M]mc5 i="X0Gܷ&=#TDGBԆ=j80ouuBm@I2é:t;Su 4>T}/g։/?fr3 }+[؈VЮ+B*)wȮэmtMgYB7۔9[o4NZl Y=-PrF=kP:vsyHD).dXXwK Mu]¬pͤfOO_kes` .9A ݭh7]&zn7>8Kl匚 )&_wkԖ | `YFhA1kda$/3 8z!i7nSKFJNBjwNF@ң('lyoQ';h`gbUG/aWahf/^ǚ@|fCᦊ>I'),duGYg;5ȍrƾhñiHqn5kSCG^Xt@lnJpQx5o˦3E.9Ĉqen$bOՎW\_utVf/u g\H '摏&ʺi: V*{lCq;+_qgXUR'ӄ%(jc0<ap2'Q9=g`?Y/X;"$gqZܫ D͟n22:+H[DX6dosw\[| Q.X"E`^!fVnA~C(^.Χdi{CP^x0Gb\?ʕI}'; 46(<ŻdtԤaDBPqz3/Oܱ5_`,)^m&{vnX?> L.5~Ra O}u_z)Yuo^3MFBޗI:eьhnC8}/tTEY>H(%m#C|oHr Q>dZ20tF-k٢߰\88z؍R̤V5ɦy$ m6aJHCq$ Ee260;,{nah)U7:AHЦŖfc>n2y#&F SP7Z`]g..Z|nvJv% .Z3 `- VEp_ xӢ>52βf+e>!M596dށ˯=<$` FXPSp S(bpuWcA^nuM P!' yH7XP:Om}#?c\=3 q]Ⱦ=\AGDhpjKdBM5!}pWۃ!ew u>_8ŔdB9@Nz>w3^ >$ lOHqBs6*s]s͊ +Ky2_@~vx4vbutbI> d_M!YY(# [90l7ִ1ګ<;W,NDzmLRTwH1w7ǽg㥙9 :lxs&<; <Fqp%A3yX(c#4km̩bhQ ۗ5734S}1ФڳR&S+ ǏM7 yFKo/;*''/άgvIAVԅ(Yع 㲎P5V &:DΧ$ N8= 3EMj%|a@Fb৹3i<Zˋ'I3JL1oElAA}?xXFvKc|Kif bj'Oݮ/:o~5I^+b#V*xmCad:QmܨArroTRg>`uv(.)u l;={Ssr{u3'}ɿO:MOY@yުelEc;?ȜLjz/o4WF}npJ0M_ BS;1?2U#sg]gآ<9i`\Qs9Ejeŭ1ye&XՀv_Z da7f=NjGFgq0<܌{ Qj˩i֟د*,k K ^PyaЀmh1 ޔ}MۉɎ[][C̥3q)WP)6 L N2?_C<\HD"@\3*D͈uv q/jm OL=2h}&5pנwπP:*ezDa\ gAW M|w9M]bSYYGrxBҭx`Bpk}ҝXl{zYjg ,ƺr|&oX>dbY:hUim@ֵQ*ӌ ~e"^v,ݱx"ξRE.&AZ.OUv<9I㼹NMiJ?2 ~9w-.7%c0iqt =\&b(`_;pjYU@kN'mu).P6CW]gQO5h"|A|dXc٠凋W..^3?-WU,%0zj gݼW!T`!~~WSQW2zW֨hU ;@G 6eR ]'KHݜX):5_ZC=B[P^Je"e~G`I}Ð'3+oG&EȞ@ёΡy*atQnR D?)hQvR+Y՗ Ŗ4²y(M#PG2ف|HU>t ;1#GB۝pR9Td\̣/&^f$f `Ȓ1VYd9 ֓߹1&TmO0x]o xfoUDB;a^ kPѼ^T&=xOآfKn'ؿV2[FXjCV[=s51ធQC9H?y۸t Jdߊ HXp*|[+'3'z<z5EoŤb͸cҖ|5@Ĉ h-# O~EӯRo}v2A{O -DN ÐX͈H;',cBRh|}%CRV&MGs41K0#qLHFD^T ˷IwLUc!p75kPKqNT*Ջ=ca ۙ9y1ʢ>IWnG 0Ju_\`]ޗeMNnRC%&fC{+^:}?q`d ߴÒso)vQs[ȁA۬gM݊LTl/"HȊJH <:pgۻxq < 1EamǶw.q0NW 8ku(a]"@=YDW]'jh+Ta&8g<].}ˁQNZ0 2dԮ:fN"JueޢY"UarLㇵ ;|'m48{Z{i e磶nMr#_7j:Gk9d=uk5r[2T bk"O8ꤟY"R_5 雸'4?rFe7][qxy-G,xXoOhn`':{%_*X (oOd <GMV0ouAm: ;}x0o_42*R֐|s*D]w'ʸ /”4ǁ3kJlgg ?V Ȭ])r5?[_bCscMr~rG@:PMޏ(/#j3 Ҹj9>&n-lFZZxNARbmi )*e.NNR7D֎bp3*VwgmxTUj D8ک_v'5ϝ@f$w% Cu #S' e p`9^?\Hl+dse !sb2]%W[{<ҽv񔬒WvHdݝL)ZSܳ@Q>k&-1T:͌k(`̍ =$(QbV|Xc;Yr9)D) kbe )i{t(& C G(fqΈo 3Um|M1amn(}PӖ,<ɔn1;t26 DXh},@>Πh_ M%p9i@}z4=:PA5MC0d޼s08Ѳo0V/G`zm'sWdzjA{!X-3E$rdf 3֫ͷ+!bQ{KmP7P;W]ȵ$.A"%Dp,&\^[7oVK/I&\sKxlvlJu?}C_!ԷR3֨-pakKלּiGk#U8pVfvW[僸[.Lu M@__. V$ xGyZ㠢Zj9ݤf/UhJG11Π[Ԟn:cka_=q&uh@_ba8_2ۤ礌ٓ j'1a ]8~wqѐZfp28XY'!\iBBh(הmX-3഼m47a sZ'9h'N#~U2jsW6e<ȃG*pࡅS|7NWOzp_? IKaF2}[[Gݦqkz$<:v_ve#/Cl)S[y6`Xx|n,Q4}+J瑷9+ҁ\|p67-C v-yn33j,R>5y f,(@9']I7N(*I jaM5b8\m6&z|YI߮hNpDULegU@d2) DHΏ=e 6e!'{/ ̡&tIϰy2I}$P uePCZU,{o75JMڈbғ MP=JQcռ[٪;YAlzn/+&p,.L_6֬^X#Ҋ #%vWmLcqkjk}Lm \}h(sv#e_Z‡Si^ 'Z%XK+?-:JܖPA;[bo'y'erx+S͇z& v8Ԯ,_epr]j\UPX.j QDrxz,}!:&CJ8c $ bo;=!bqLSx ь&@21~R˰_&zʷiLYc;Fx<./Oة,d&&%:S0 !Pf DFȒ th8y`@Lja=oyK C%i-x:2!Nd~6mZD=R-Ŗ=_O@trp7l_,ncOsE\j8q64шԅz^Was1Qxt!K)K0I+d|*"+O |y>@}%}7ͷ0UY_j \s&m@MLM$-Bv)^Pح?v/;](,6 _@Nrq _u˞_ʴjRGN-^:}F,>߽` (kpܱJicB153TgFօ|iVJ3CJh{i9]P8tJrvZKCdDAy`P ϒoI:q8J 8cշ ?CuQeYڭU;%i{a^@J BʃUmvzӼ+48-hN=$jtHNP"`}վ[IUgJ=V4-f#u$- ~ $HӱIӖ VBvVH6C43^7vҡ |M3P zcu'l2EK%yftk L--d]0"K}Sx{樏c`Lo@G(JA<6.O1=N1OVaBSFƼ0*AG`7ڂlv#e}Ato#fW7&[`m(/.;πKUN(HƜh[[(G7,Y9g۞=S}d6/nq2 J?wآC|8:2x2eQ#9髸V9BP!l{<DXgN[Cٍ..&U(ԂB>j}Z<4ߠ`ۛp! "RѕQ +,6{,r~"ʑp!3K(~9X~㢎v9 *Fdj~T,r!NJwgɆVvہ[ܟ{ؿpd!Vc\pŠ]Ҕ\^qrd" g:ytsg209!lr^ZD4\sBK>/y\t,Ii!C1;yy>HU=a zWXĨ݁8[tiA «$;րЖUbb祒:;/8^d.ou 7%N3 fDxA:5sRndm_A-9wL6 !|4,!U;y<C? KZ+A ,jpk+I\#/Ȭ3u[W;&+tהZ|a?e&ށyRHq ds,7HRt0hsˤM{Dŭ ѽ#U򖲯Z# cb d`plC'Fɷm;Bh>ʹ.ȢP4}uo}<To*]4hv|V0K僗)&9(*Ub_2l--cMk9@mjA^/쇰C`;O,aSGp+vlyu"}Oyr |κmW (ϹI"OL#wQ-4bq $o HhD1NtMy `"z\"Iw=)$52k抟jpۜ* \{vj}ľ(9Ge0mxy$ʏSDi*3 RH!ڒJ}͖ (ܡ@e>߄ks@%9Lׅ;rTIG 1]398)nx+DK2hMvޢeSTWA' y1k1I!zθ1 6+1&2%qryPGE`1wk.q^N5]* X[Xo;I!=B6X梮?ZSF^`pŘié"Gyy _]?or 5"by(-iwNsU s[;OxU/Z7Y1g]W?yߋ^1tb)eM4:5tXI9&[X`=2hSZ_N ;V٧2h¸I"÷f5":%3Bvyۡi[ X.R I_2 gg-T~Ys+G5ԯ[&zjgg\y䆅%7+Ε[/Ve)x I_]M58$-=ԁ@e/?UxN|Ѵ_Q} r [w{I2,/F ;VWJ|rWлxnh'x(103!fU=-wF0hxDdri7QK"9[)zT2xvLw83{VX,Lˠbɚg  #בC%a/XOe.:sb$^{v1fIA B筡aSY#pÛATQT@ Ge/x \9nFNv`BZΥ ~2jy;~ L[[SUxrM|$E^%:xvU ZR2S( w7A{yIA[s7؀lb ? +<8㯫sb_$8ۀ`40FTRLv+xa`8t^1yO.7/vbGoU+x!o 9 i.-$hLwӑ~ǸKJOA1EXW[~e<6\GU+x"xMR8P o,5~}ra x_*nY{ T~%~[5~hBFT.$!OVW*meiDr2 L/ -](Ay IQݜwO1Tg8PK'дl6շ|34qHQCp%;T82HgU򠼧K d7m0G*[m#ƽU5Ş?>^O}Q};֞$nOJR ZV^u Y͑Jjf: /,`GH[H"-:k+g$.'@}*tcy0|/!$&s;S8c A8cGr^?Rm4wߎ񜞼].rrJZ  J9Z_ds\072|`=r梃*_FU^#DR5c"\xGtSOrKPEꎛ|U `=X6p(x!|՞H~;HD8>bf8`f{/Bq0hd–2Ie XXT~65 ioƮsنO Ρ!E΃nkm`nw^vyh,gV{<&.Cًa!Sxžyo4͉iħw2_S;ҽ'on0HU$#&PPZ'`ٕ ysœDe#u;oC|ӯuk%P +H9|`H$)Ž+ߗM= t`ܖ$$oz$)VXy&q=:2BCz!++K־="F"ӟb?se*-YvHJ8/6m`,cuFWxKY6UӬzdK` U6Ä=G7ٙ~X$fQQT8-s1u/tv/\Zf@|G͒2PO:*nGŤJd #AlBA4;X&Fz/ %e+4lJb*PZaDFVS%}&)GhgqC9J)K jRu3D[~M ԮwRlB8!yPI&(YV_;05Z//6"(HTf9YEQKO(j[4mSsi|v%6M"yfͤ敚=EB Zy74Ruwq-Yjji_gi2{`qK^'22 :+Jmq={'_UXգb0(k_1wjs1K-=SRhm24'W@IU謳8DL!]i꿞)TuIBQ =wj =x˸3VPΖ/]~^k-Y[# L`&]m"kkRk*Ei2;,ܞJTe¦t8ueX$Z7{Vյ%&(FTpaΗ{`6qlܲ9[l_-,F7OdzCHYOK[|AFC."?{?d{1,+AoǶbozEnX>'nz]I k, etkh\›™䧢iq,nE/'^vSRF@= f8l9W?#lr1\ -vP{Pc瓼=u "_et1P%Vn#dF ܂'s\΄%.9j'oKfJXKmaȣhr9HIFCTyH׈m˙?^mﱮuEݮm=7d1ve^R"e4N ="a.l Py ^@\~!zˆy=eEH\lcX_*7FeFf~ׄne]]ECE`;_Gx 2w(C);3e2,vTXt1=vfjw.H[@n8IOyqRWƠ0>*[~3叾![j6<׃ދ<5?_R̲ࡆ\RE+2]GяYg@dRPaRE#ܻB9 Nf[v?G{ob <| ^NPLMH"crC]4YÑq zTN0-'P+Z~"ĤtaN" )9Q[`aX >!׈^aSձoGwȬ%jO(W ˙zue13(L")ٸX Uu)Y_ KH۴Aw!O2H=CsWu*)#Ÿ_C||4H?mJQ*S(ђ i+Pe:fQ,.[Ȗt&mQ8X]2pFud+HC76_"CD 0PK^3qht|8Aq% PQcwF[ӐBQ#Д١%THof thGu'A4G,PU$L"R0a#ְSWkGoj_'܇̸3EuuG({qBN_}Ge]8I|Az`N2xja #|^A߃O?geNN$9؄:ˍP$d&-ƞwփ (nH7b,,%KCq*-(^6h4p83܄ibSMv&nU H׫aB?(kVDn$ +%O.48k_ѰHטuzP >OwL"}A lchԍ$P9íb{uUӃhd% oTLv#R9uMKGnB{nk yQ,KH7HGuj^D{(`+Ta_ɱ"p?GnQttx[>hpkd[L~0yR\hӚNu6_o岲_Ћy)j(̉tUbM/.A-VE YxU وh6 4TNJtP2+0+!T# f]H@^XmP Ȩ\W d_h?MXy*w"r?Ȣ3^fp}k0QPUX.?S6mJW?֪-5[jhx(NeF9INr ^>Wz<ƅrkSt!IHohMoNNzY}P5h 0Iˊ{_-ڪjEgT} "чz=O@^ *ZBoOE{ʣTM`>j@N@i{Z jI S ͥXVaSLt@yZŶ=#%b@? ĞB/Zv:gV*J?[`<,Uxm(*c#呵jںiH%bG eS ws=OXRʄƉb 4 *j-6jK.[_ 2eNZݳO m};LR/H׾Z](r+# X,EdKAbV̘z*n3&=`9|hYUt޸ozjxP?ELJUT$ [2>j5@LU/2TQͤ58> Eվ4=< "ATUщ:FE YaϺ%|%reإ#Aj֢Hlʈ\| cc2;_weCze*(^p|[`Hf0GݏOdؐav]ֹEo3/|P+՛=A7R9hrv(")A sdz2WT ಡ6V 読lymaN7@7ArV^:KG׏_,!Nh9|K!DIJF2 }WjڲDH28=qvOE˝'sѹBq nV*.0bcRU[?m}^Qp~8:TXnr"2OO,Vrrmx2~M‿!d RMyh!ر}pHP6Z} w~Jy6YϺtl%{Tm!A/]O@ό~j,ʬõv ry~VO 3 `+7dՠ25bC}S-hS$\oP:@wކbSՉ.0+ZWBC/K,wN ٩fKW+*$ B.U%p88̌0_RuϚ %i `"u@JjrcYƒgUʟ;{rɾׂL0̼xŤbgĀcJiL'}V,<:Ŵ:XC5FFNIdkSo'ls' jrpvB U6Y944񹤃UK1P]l&̨gQ]X4%j)SA;e^)[a08㔵üGYykR67n=NF:.'5sUS;هDjily*.T̬Ux9EmvimdRB!C^ Q3L3'TleS8rRd@ >TZ.xv|>d=x]Ou MjKXvLr:ـڃVW!zip8Nw6i;aܟ% >sPEls;dS+U˚\ۂ:e(o$l=ݪğW0z[_:bRrفv9sA'Qb/r1`5aT&ԛGD #Bg?zRǫ4t folKU XzՆwTOLJ=]#FtN+Չn%( L&6]UJpi($@wduozS- Aamɀ~{6s(hJ]Q̭_IPL-)0|L:G뢌;Ƕ^N_:@b 3 +^И9P>ǁ , & 5k#39 6ZwwEyA7}ɳ}ck4uKƺ+~%hyĺv"EƓC+ (ݦn"PvᚯŖV#y\/h ~p{Q/㬡( I06yBɼCv(f_A](tBqޮ}:/DhE"]3QcJzPk[1beiZd yDS} z8e#RY"t}Ș N]=I1OxUv(8L_,Z1VLB--G2_ejbPODuOMyK;&ˎ yc_0[Q- GlI#_P^,iDd-AYs 8 UTl"5&!:;=楃 olc"̩k}0:$Pk&)~O~St|ǥW&OZ9"=HDgĕۜN*5[SYqU(z6$c^~jH˜mOk(qp*B_-Mz<£'RE2 EB](LL xc)]%8\.P%lT!a&F]z[+'_ jVkLA{k;-EM'_ S/eʐdMgNrK#"Ֆ7hʤễ|zd9cVp1kJx-Q>zn aې(ڢU" C*PCO ``՛m>V-CV)D%?W_AK׷"V:ވ ('׍^[)sYX).J"pN@D-n&t> =$f&`S70yE.Ӧ7-TX 61HBv/JhwRLpzkalؖhl +_~G v[Bt <6/h?+!:ϱTz()Ҝk{ . $5fsT dzUd1j~2](6,!`Co;maF_K;D" &T}8N@7t%mO+ؽ筲V_vI5u&AsƩP$rP9v0sА xAn $G< JO\*B-EojL5&ޕM$qHN"xwo]C@QK&!&SHR v?H=։٫=*{EWUϙ5xrd0Mw?WkL {m4=(JL5Ng-Hu eNH coֶ(O/|AIeĎi772=w~60֭l?56[0>ys"fEg7GU0_r\l?ɢ|jt`ocO=< A2sDU#I׃1B0tZ#iK.T˗WҞhmgT_dʱx JB1v%^'}$H63w׺U6r3oEHzӌ?c&c^ |+c6AW y5otسHLN5,J>*\!Aiܐ">I' 8p*ںr@h U'"9>؈ vASVb _r L7#!ݜ4BzJu`eEV5 +]Qu :Y&N"C"n<"lӫ,!>dtxυULhlX;st3w.0UM59٩ƅ$:{_9XRpNF2${mUL}(iKH||3f-%gsk㞎iB<ޯJ <>zb+?sv>1Kd_o-!Z/7[bDi",Jhܹ-` bLm CIEOأe=JזRoe :jqs o7I!Ǯn* \N.:R|ʠY"L^ׄ(*uk1'eGv #laعt}uXoK毶J+0x#=ZLېĪm%X&>Lɕr3FɰrjW|/וtm'lMp!w-Y5WCN'U3fEc}e*yԚD:sSfZ0}S<1d^ފyڜa3݉4ح"/;6[9bbjxF>Mh4}-m3V0^т_j88UpӨUbMiYk}N+*}{\+Iz~Cgp;/;>0z Ni =bSmH|R+VɤZD;_0[^>֎.|Nw+_WKtu_=R&\džnAK?2 Qu?;nFUsS$r/bq͙T]Z5'dÛQej%ֵ.'s7AMn~L=ϾraC!if-zׄ,;>˸gYcKBfsϠ Pơ%sii\B)N2:; f[xMJZZ _rBܻ698dHlnS3W3I$2*sñqyfkiZOFC8H!eR9O"xa"׽1f7iξ~uԵ[۩0n׊\oku(UG~"TԄ仳O4<їHQYh}N9'ѦKsj5a+˧ou8mk~EpߧzG9UbhjSq;T~{Q Ĝ(j9jhD7o_J87Rڿ-2ɣ.MԜσJ_$-d ]"zcC)@]2m;;h`&f#ӎevPEV3e'"eA=48Q 率DE5p0\}P»wQz\(b _|>;::6XUe!46)&F!Vd&'nu!Cngua$"{O,CZTuم:ʼn'vi'h^$tD7R'^x^SC2&bT4Mll§9²`W\P`(tZ)x c"bxeFA$?XEW9у]C0a'ڒl6峙$U>.G{ x}nuz [H}5(/oVd~X)pw-w&A^)0Q R|m}-cDnj[oT(6Xs{ @(Yt_Nt_"$_{' =(k&lghFJAuǠfnRnڄL`k'x FUyQ]ۧt }3p ;g& !ԙ /dSVAf O_pAE:t={pQM'XtwNm>ؓށQT,˳2X(tij sS+S8o>V29Dɶ3|E?wUT7~}C67Z 98u&\ E;bM+(8Z建 Lo).C"y )r[~gK'V~&)ZO&Iʾur>f (;/u81UK: f ?ica.zmv0åcZBJ/87{Ҡ[/QV{o?ޟ$'(n!׷= Xqj5p1<NhE8)E9FGf>|Fy_b+;{SM3e">) 6t*0fHkX>ɟ% *35fXɩ[G @tV{tK rLU# VL~4[_)?Hq4`n钉>#HNi Z;r`&lD)Kg%4@h!jq , z3|cު9K]P9ǢC7Vb3s\(BN1&U's'"pmS&K׭5J0 _^ 諣%NI/BW&pafixN~ l,-:x_VJx2'3%p(`?%kV37df}ٶ]tPOaYJMeJzk8m|ݿ{C.&9EIg淏8zCa\}zjg>Ecj0%6 Ad/5niFFoI+o"-N2ĉi_Wq06d (Bx֞P\;l"X*Mu>@G3p! %6~Yk]]ۓԻLӘFGiTV%*kQswrCzwDSVp;&=[`!Z.hVZ? w\p}hR$a̓cQܰZfXK.uF0@;{s&>M#θjF`ky@b& {p^DB][2y?'*YǤpIĝP9O,2px =kLUI+7>clgWZ;|~X[QSKX$Hy]Ħz^/,9MNIZM(w&ﱝ6 $u|]tJ%wnWf$m 8}B~G}U5'ih au).G0n\z5#v`ydvU~_s{%b^Z %]njd}zI>23\`%Q)O~1XǛnj-& CI0Ӿ7%jPQ?i%`8^v"@Eyo3$Vg^^q Փ|9Jv4x^!aF,0惒{Qm2˝@ńE"C/@7}K=` &euY^*n\p{*IOFRQs2o4pl4լvܬԉR-hה#CzRx_ƜvKfF<=`|p7q.HE9ې>g"Ri 7i=كzXD(^8c0 XۖuDPISYkSWWwXܬ[bmj ix$f*,"LyJI \!1*>]F{NlB \'ŎgOjB(IHYXf0'8s?(ZmҠQK[ijL_ľr_5e!B P#oBΆm=ZpWai{ *6oO#[+֝.י,ny,p\`w#6+[m2lB-ռ僚쵕U9t5 Sx/` Qb]Rјifgto^OPR UH(OGr|J"M:_&r4 3F?u >;L1-`Lz@N\b.l2 *@^-e%u{UOr64>^*EG!dX@"s$wk}\J>el['lO6f>՞i4i |3JCJ"oLKێ({^j_%fj 6 Jspkﰗd54FvP-kƗ/B w Q!.F)Av&˶fϛWvq$otG[?%ӄd@|_mBzѹ&L~4U6d"Khiݾ bX?"OfB-sgBL 7 iQ+ BlX%ߓT !&7׏R\,_®r.H֝~xu孞;rIyF䢑Pjn&63xե@҄}8L}{Lzvt8!mTk7U?ۇ`<0wyZ0ʿTL@h!LgɱN@d3 2;AUQ<$= c 9(|B#8vV9ӂ?ealXK\/p>^:fzH1_Rhl$.MW-Q*dXwl*IV-ubw%60˻ÊL}B,+tR]%YJoן9@_s1 vֹ&I׌oA-ݜcp:9\ɜ. j 19}ف}1^[Qru'iaAQ2S"Z۸̔&vV#6r I* /#63s&`Us!kFEݴq,%intD^f$ `/͘YJgogl^кݻ=kW|leщ-7e鵋 Y_h` 2^6X^1Ru%uⰠpg_uN>(Ac% p`^'lO ^/)w<LaBA;r0SFbA`r PKwC f`:tr[OO.ѺOE [ uMXE׿O~3"C/,x֐9Og7}-Mr͗~GG z,N[,%>)&lKbݔ}LSɿǦ5V$cb.cӭWqHW_TJ>~erɢB%o\JV.e~}', 5jO  Jr=HW$հ}23F;%Jx{k rGp* A+!:{ll[y+.79wPXبl`!:^+-Wwr Zy$iL<Nm\G#ù4/B/ ƒ)߄LJzIuMz;A)UZ*ȐrQADKN ׺:rb_ym@cشy:O5CVe( wo'NF`gvJ롋_69i,ET6K<ՍUoEe<O#8l2;$mHCiA'"}̐N/kHI>flFS@YTw yth ̄ NL8 }\^btJb-=^*:yKtnDh`AYfdhL=>{pM񊨶@ ^A.ʜW2ܖK}+ԩSSaeeA"yXݍ% a,x1NŒd ,J!dy:{]$Jz˰/Pt=u8|F׀sW=_1ٻ{V{]BkuѬ |&FxKe^Z={lכ(/-DbK!הtkE ,UiF dMAgW Kwon HMۦΘo #( v֥ho"詞)j#Uۖ Qx3S!1VS\phs'̮@{3J+sW`[NLar>XN jׇ&˵GUQT6pƠdGES/>#xM|c~_tbGa f0" Oc;q#?-wWjܧa:|]g ڪh/% P&QX?WwsUn=oSc*Wcq1 \)dF 4*b-Y 32F'i0 %#Mf{/ KV1 W;cFgp=Fj,Q>`5^ (%v*NBJl"g)v- \ygc˼ݨeT1]eӅQD[,, ?&Hq2_*Gj%NB(6ePj ,1e۸S GNCz"Y>Sd9Z1fr'F)WW&i6UxQs:L/u %`0}.KI!c˯UxsXeCaoAzŒ>idt-1RsD]j,,x-C3Y`"s>RQ($[| .@7yEoL N[GxhG %GPfMjs1O@B؝VUC6N5gSeVc1= Ϙj<Sތ x '[ @3at # Uqn"s:>V I+LJn)|fD@9F[}L_k3 ⮍(-f#%'e{Uź!)4ב1F_1JI߳"fQO I?ڒ J,ؐt:q8wø+$)vz'Gͧ-mG̭E֒sGĿ󦬽vSkkq>ݝ#g %*W{2 qƄ9# 8ۛoXJ%V-Q񪲙TeA78g1۞q>Y$r'p72qzVL0M٨łۅYti$!bWq˸΍glR%| A1{0^&l}CD/4FT}&ӥP#IAwf€=;" #g죙|/3N@0>?;qdE乐P"2D;d%Ua\P"ʨDz/U-\6 nksP-M"pWU%N\diTFZr .$$I8b)n96mڤۓ+I wыA:+(o9'DhRQOn]׉=^-^2> MX*djkƊ+?R(#j`vo d w;kj>n'g'"c{QLnpHJ5}`9mb̦< |m.G{gqՠKpK3q/56-|Gƞ}+(okPPX5eFxE3Zs?J ʆJ55q(HEi.%vht!L`xyhP%eXw>DRtLJ÷u_Z%՞Wb}֊-kbU8m@ъ] $pw+JI1n^[:dn1Zj`پ*m.a+J-2^nFI&C6Rr=ƈ]L2[2`₫ϺWT[p,@⼸狴 Ku-iI-LJ҅EJ7Ѭ`Q6UY\ |3yKK;cY#|l#2 èү*I:\Ƭt@,1YCtf W' Z9Ƃ4v6*NǦ Y  z 6XsI%u׶>ȩ!DHa\|mp <574h`OL :ʹfO3DaR>mtٗuNORq(A\G>SIӴku3`/!r *9DP2ngnzC}#t,!K0@Hei`P\3"z>optK+6͠ȟvVZZN%-O9lb";3'?XkTP>H74÷8m6JSVǶh$-[oS?ĺ}SMu2 mgsHM?-%D5SfJyW'}@jT3uҒ͗ =7LҢgX4[N** ]"&'\7I0Uvz"q8K,̱I)o=yMZKb9?m*6:xu샦& ݧo6 PU2h947u`c?߮$*irő.Āт4+;]YTz:)tl; OoԱbReoWT ʔS}m=pCwֆ4$o%#4~z\jC.$q@ۜI<.;C> 5wkON0]ϯo8|Q&.:um<ϻs4w)LtIL1Wժ?$j |7Te2;ǂ9ؠ)~¯F󬠬[=8B|ґn0'@ћt+*rz, l;dB]9B)eQ[X}]]^y<^Dc$g}UN ${J3c߼‚v fJ8 3u ]r &xd: 7rzfQyiy ED 9RllL+}f]7aw1iA'WDƬo34R "FE@ʜEO\H6lyv[_$7wL ]nl LxAv/7Žܦ8"~h@}dv0enMP!,:R 'O~q.zYҿu!i(㉡qsG]˸2^\ 7DIhaFci6 wm{#c/d( _ԛh珍:/ < h=^IbڝR(&QY#fNXwzgm+ "mlչ4ՓN*!'m^DWd+qѩ+bh>tzWRYct^o ]rѰ8,_P~\dcRy>DfU `"޼!v9j˨+G[dd-CSShDx*g4fpNHɦ\u? ~Ӭ7d?ĂSPil9m?L(ykk#κ<-Bs/+ҥXX."}5~uu„" :C,ڙҷL Z'7/bK :ѐym_ޜd"p6Y7ajQ؄8yX,"9#ѝ^7ሥ^nv4K`T!jnmTqm-vȇG BU[#T$tjnv bڍ- ajbf0[s:|=@٬>?7nkC/y"R9)un43$z`Ψ1>h޴(qW0i )}o3$]c޽*Xz?/~V'%l:,1J۽8KI9};f M +Z pKK}HZA2CPgȠ$,T 권\cՓ)QMBdDNiz 59s4/Nft/v%< h*7LV e%7Pkh~H#]'e[4>AB7چWmݚњBgE6|.TOfKʌ!eY*I_ Q]Uݥ F^Um.cnH?N,q[1yso V>eʘ<:55L;H1~~$:cEМӵ\K# /=U;xY.]&$218C7p ?D-* 4750y;Ir FS0R3 gkgbb"2ۊOSǫE)s=l"qɩ0IVíc=[7Vf ߽>>~ !GZ6sy"$n#:& ={I w[,ݢJ 8Y#X@2  1L楾Uk7_vB,X!!RXA=ipB1Yd(Jְ*wܽk~( &R^h ތP]w.ğ+ԍN6"I[")$Gϑ,/|=^?Zbva]ٸJz.*[YMJv`:P2PzjlL^V =z!s1+Fh0vVFmܶԐI Lִ N@axzoJu5:n>"r؍7Q$qB쥡p. ݊^ dD DN8VM:ϛ]`K2_>_,=3U{t$qMT17>6AH,GPɡ5qܽ#HA躯O獦?St|!t6J7t3T7RD.P*l&V/ Jy)4^|V7i.)Cze@DMYSb=,^Y_.v;n`@td)"}$&jBrNz`^(g^/iORxqHc{_CDKB]xW?<3;+ϾR],#\AF)P2:6g~ȵ""Hq#t;$oCE*e^GY.u2$^xi/$08#g,D1ɜ"\x2!SI)JxF N,oˮHۀx0P>]&lLϲy(\0&?ܣNuL, I]зn$ }Ī^O\MP PhXk+ ^W h4(Q2/OA'yMH|K( HhTYmЋٻ~&$ѨbDgnCu@8={фob,+#K\(5:CteA+&V'S&/ ^ JqN V#e kxU3:(m{v`2w-ϙT.]&-U\f^qJi#K;~@_oKR Jٓ `lLuف!G'¥Uq%՗d«wf;e:bz^9}:28G !w>$5 'ٴ#xpv[bzZaE2I6f ԆX4 :0s#]ё[ S6 )2SU'T ws=⿠m>XUvTӿ! ɾ#$`ù34漪]):Hai̮F3\$Ik~O:A}v ] r/gYkcqm2r Tu-lwsYw |!8Ws'mz> _`:{hpW.#|?l04=' ?ݡ_o\ͣ=e>7X3SDoo٤|T}:,"FAN8ϳ{+p2ٶt PoC,ԂxGɳ Qwy8DwBe@^;=krSҥb̼=$&ݫ<6WWaOpTOO^3NR?I,}5 ͏Ji߁R Y ;I:|]^ ̓7 zvu7#k3PQO4RE7>ଌxukX*fw[PDfa"Q{OW9$emP*"NI[\vi)N`!} )\#CyI@?tdi-w{7k+Yj.f52/aCC86<B[!zS-|bB?o6rj _5rUFjiPFNG2wF&cJ].K (06 T}@u? #,Cw5LAaHqc5`B30&*0 w*RhOMbu!aMRrcT J, vP1hgm[vk^6*vHߟ?L>ӻ52HKo=TX`WfZ _T1[=; HdQFAGs_TbT6r7kVKaОC=M`c0,Ͼæz,..O IcdLE4k%uTH)zƝ*'YNue&,Q,cGi=;؞IJ2\~7 0|!嫒OdRjV<^ D X;7(&:reKZ*yGz"Oy^L[f LwhcZܰ@ՅWC TѪ[0c]EJُ^G^ eBZ Nv?=% F\Pf4EĂγl HJ`_lIQy39SꂛQ2:ge3vko`S,Eu[| \[$}3N|[8i hx?t“Lto,kS2/a],b1I]:.v,$կ'Q ٪RCi FYu;ɕ5cd,^ȴ^KBmt=9YůUj [K49Wگx`h(V9lcmœ,y}q[鞱#5 yfM(&0|E\̻6@:úB% @xI"o H;j{]TVCż%3nxA%rAʻc.5ה N.$#hrRk}H}gKrZ^Ќ]lK:pD#u* =(skChRRAA ~ yU._a=ׄρifqrHh}2 qϳ[;}?%hw&4YШ5bB;A"%J"pCwa- P[QsAY ҊF1(Qp!yk C*?J4#<4!tY>ӑ$9G?bt)*.56{[w.P^1r %p+jnJ9~QbXq .^M.l[_B!zlFq'Vfb|_@==CqdD;_-kzQDImaL;nhMl+]? ݲ?kk*7&Y{SFQdzB)GK1lj2`\W;<"4O3ut[/ ,Ļ\wEr'V:' YmE9dY\G5XixTD]huqy QW'ڇA mu0z%QYkNmZNxhЌfs}O'or*f(/jWg9 Cu|\S~5KML~c(7ˣ  !o }IRwyVK?{PE=` In`*\G]Veg#y_3ݮS:EZf͌]8&2ny:R>N*r@/0qK6Eklu8u -Obpz/(1c#8b12v|ᑻ9q0tP+;59u^ik˭Ta-gUjFVO@B!īPu̔w8*,^(9NfPV' !JE־C^[8jAlR44at2^XC>+*klڮ jF)~Gs^lUfC@m(ӌe'xrW^F(Q^tѺN$mi!3r@'GMx-6/UהxH c1bxdu(O(Fa Na[|1:\d9X B-9@@q J^c̔P߆D_9_) _v_<L?`i~!>P37%L=!TOMN PLw"kq~#<iJ_%/~t&%;$jC?!=U1m.T zIp F߀(25Ki<z߅,DQq̡ח m[𬻝md:%p!En0RDYGXJ("oh W07i'~290ep8Dü O i][O۹Eј:2@nTٛq~o4Dru}NtPO*2[:x+(˜\pCweש0̂*!҅=ʨ"d`Ql.ǎ8|(ci9LA$^+a9CVCvQAN~ޟ?T ,t'd6 BL_c-J[kX/nء%^wc4lxŪ4Rg)>PXi-P.جD3NqHN29uՀ*0w`UzH{'3â;Jv+n/0fYWQk" du}ǕwN8i8x?A);m HX|۰MڡINA: -CXU 'AU+ZF æ͡pxaiG(s=cDksܧ@Q],yΚqC_Ae,ZDB,dZ ـȔ~$CٟsK+7Hlrӄ8hw0l1)z60;UB9xƮ\{eGLE#In%K~c9Zݓ} Id<]ρ֟:rjd"O¼A G"įЩa̸P3ũ"-ș8ל}s2O["ޚQ!x}0ꕷ-n{FĭUuPZU24YSxۭ=ײWO^eyZ p_~8DV7bz) `\V |r$}zR%B^]-? ;kp\yTgD_F#g2KNLj|JXFGzp> x6Ens;;vD^)H 抷tcd,Pzp\vXJ3,w"gٜ0JQ5E@-#H3%b šf G uMC!rPL4)d"m*%k t[i R<?Zhn XTH]#z5O{KzqhMGz~J^Qa#UUC99O3,'ɺY*iȢ}1`XhiP ptSrڑ(cO߼r}dr$_Micaa*$ZDWǚ sߞ4Л[l/VL3yYzJP2R9^Vokر uy80PWnt`:`iyѓfG\W${M? -@dlW #p`.qԯ'DžKqau,/GSwY_wc4'XA%p-"U ]vx{ǗMSf\r,rG*%:b<vx9br4PN#1"f #~nP$/]{. }X$s 3) D^1x&.ZpEPZ`yKů9+S0M&9D7X~ы%\e \>z7zp_TrY8= F9>7A+\BO 64 1ϱ7܄Lw@!M :d/sde7pG\vuyW7K H{hAk]ex)dvѮg:򆋗Hl\H& j&7 M1 JT{e58j|qf#;<-DP@MKG⭝?)uB=|9ć*嬢˴5)*\3'+g -UK! ŝ[Tӡ[C ?`pE over7)ޟiabI9v:^,T|v@`tbCQ !S=޾Q{SQf[DWə}KD4FV۞k>#@ 8gI9(wKp1F̐jUN8}\j&!x=$&͔W7x<_:# ̪(;:\ QcT8o(O,/.,ߊ(%uVNYk-š~xJyGҡqD/m#h۔a+n[ K TN? |:Ob%on8 ?NsX(-G ɿO,.xW*N~feFv)G ho)9B*}qWeV;5ʛYG2n=zZ21w4B{{MdlQn8;&jJ(۲,BQBh$M Rܘsѻϛ'F?7002zFUkZK\3RpO%Wyd"$x(وw 6zHk4 -3\UIS(q xLڈ@OYě3DswĸyOQ ĞᔩzXΦa)FQwkkޅrV#(9k;Th\n]n}kQ2VCGވ!)}LQevM1]>֠MIfV<> &\\!j~q3Q^wms.:ui. 3_lnwq`OJu'p4QlkǙaޚ٢xϦrӵ&) |+"lO X]6>_3Z5h`GqS~@1R|A"6 |;<92 /T&qv/4 ޿0 }0N+-7LPN|CMAoh}\RHh\t&GlCKwW9ȴ0*]M.%K5R"VJdE=cw'ӡ<{dN┰B@!m^MW*8/V.yUoWȼUeM<,Bx֙90Z1h*Ύ[W?K-zkB< >~6`b=d7F9E#ͣ5Oh3lYEYr9\֊{,Oeh2|lVU췓Zx #oBԹYT_DhB>Qt)oM;C?cv _Qd E<ŋimaMt)»o߸@…su'7 $ : g@LoL[Sv/ := DcӆM fQ A}Q4$hJ6}o%̬?eF9[yٺ<+Rd2]4]D*Lk"gu9!9uϗfo?J!ck}uj١ ?ux9yQWQ ^?1nIG:  (ɼ[8n^wRnreۋTPVuBPuI$Dv n>~nnML{ FAToD"~{J{nR ŗA5'`$<#Ύ }_OH.fF 0=L~oKRABx/4rj= Ts |mukmVmW9SbBAU+9vb_6J.^%x"{v)k;{ὡ`Gxpq5]]016fb<<~ȒC;^.So(@ H֊g#EjFFlCV"oXA)Pd&e$4M0/&rHԙgD㩧SF"&K+'%8@ꨍ%i4UD^Ix.lB*Fŏnv-ȍ' G+Cged#"؄n\?bwkRkA7dm=$2ȵܲ Hc8qEx'`WG3J$bՂqIS$eZ VG#ÏyYlkdeYDN<DBIhh%.}9pe  cɷꋻ(ԟ-ŝKV=:-[]ǗҧImT+Llg$ܶP{lKv2G_-K+] pnO=88:s @&j]ni&" 4*|?Ɉۈ.}x{KcI;xGzWG^QC|LJ\Dhθo!*t23IZ "5)(J}CTa?Va)懁-$F,을wOB(tmt Ssl%@.LOwrS3Vўp4rmUH֐m;M웘~ꎅh;ƇWSHl;n!(j9ņ nܷ[ b@+ ݊\.CZ'Pn-Hmq D>'^4Rzn14Sox9q4\ުGeS~M1ړ#ZU5iv{N0|fsC"7X#$'HȠQ9jIK܌2;͗ u:{"w-ne]'N)ºo⫙g*۷xGo<]b俥 iMCɶ"UGRmD'χFzvdo_*:Kx (z}acH9'9]M RDȝpVWcGZ oFf` o;/ bpˍTSW)=n#\r˰bIFmX!.XbT^cebna@\dR!7%g[gl%K-rYCn.ogoP3Rw&,~pd IHn&`~'mFz&e \V ~YI#J-q^y N I&ugJ\Nnx$'uaNf,$˜qҼܸɪFdxNcK@_寽8ZYR&JA* ND =>T Ymb)4cjY\C} 3^r}8pQ>ܑN! sC0a]0 K+^ׁӷQ|wn~8pjmI꾾2 gr210|V8us>w`0лRzgY1#qk_mKW{|*E:j܏ [B R78|Vl$xP3%v8֗nrn1O Iz͟q̼] YO5YK*UB͇p$FOy!C* jbbjϝj G/amM:&ؤV)5{ cxMV/R!>Xg:HmOhwBBE:Bч8iJn` z+7;^gKuv[UvW8l*lT5!V@ _'o{ga}E[=s.]8Q=E+ U4wmV9:͜Kvq+'y|,TytCe!4,膮fY;I4=,9GAYN\<#@W+Ąpa3WOPc m@ISרUw+oeņMwʥɭ!?dMǣ]Es4BGêfe&L#YXYBrޚy ߢ3!OuDdKg/) =aJD:>8blr j"q$a-|g@Z3y{.CpȮv{Hxʞ|{x.폽j]HeG&ϵ]/6+UIQĭ閌BYi$VO8v̊ԑP"X+@9-MMvT 5<@អ "0&&y|{XD"Gk.juoy'ԍuZ“1Wәdi#26ga%˭wY/3]''[eJY a[wxenQ(EDT]| ]PQ3&`PrO;YBtEPs$~);FIקA ΂*YRT~:,Rzz*6XY4Yh/6\;Z)RL%^ . UD9z{tr=Ƥ/`m þJ(ɮxFnCAĪ%pY,\GLi4!2$2.H$0p]TxbX5z Fj3~eSěܷԟ~=-T "k $Qo 87H >5A!Isg^dD6(f0O7 mBX'[WW %D'Jp_i~'<oaRڄpӥh$c;ze|l#{Ɠ_*gU+^jELІ'/dU  ^:60x5RI"g\_k$⒌$$"Ok$8@YV EM"ZKѪq(ؙt')]qHXbeKVXG"U^~_X܋ %UZFT嚖 o r#^ejp=d,o-sɒN J{)wh5mj!3if; A?,mP_4-toͬ$Ԍʜ  <#Hΰ(ff/6ṳ{q?n A] x@ d,96p8 oPY>({=f^%ѩ9jX$gO.Eդ[!8c{uZ}᫢+Qv (P |zCSu"`&K߀amp)7$R>'_tV.gܘ?$o!z-&ѵ$߅n~ $؝D [s1 4Y-E/;E~يW--˛_&=FԳ@۬>5'"v"(&&Do1OHuq3ugi ?l6Qu2gF~cda;wRY¼Bhwc[Đq>0(,Mi1ajǬbr0oE*7Q-p 'c{n/!+֏]Z+ iSAd+exr$yks­n?C*t%kl&>B%G+I(q-F];קA@HD,x;cpŘ$,\WwwNuzǁ Y j&u+ kpIը i:yN2-X`wzs֒)WL>؆@EqOͧB4HyktN,}>W)<fpl􀕶(+;Q YN?1ОE:P;pqrS{1tEi\ey/}2!ztq*gx%jܸM&۳D1!;%4ݘ Q'YoxlәC^tɑ (:c>dD$Us+C85ttlǭNs^u0Jm?\QPT6lll(.ϯnj&ᚔ;2[Npysx-bRF$$.5W.&iB'x,~\H1Aᯑ`EAxӏ + A tWMS?ktDكW 9}V _[ u l?E2 7Rm]QR#7g4Ikea}b׳0s|76]X*MdpOe28eFW#2s"<޽F JSîf+s4c=dm[8P:ۤ Jp! xψtCqdrGm[ JpnJbxc2RcѸ7YFhJMx>d so wv XY/YsA6Ìx*m&5o#;/Z @h%Je#5c\-Բ\9W"0 ezBv=-%K7oC wpo9ic;CmC$~TH I;LjJ6s[J G̙) 2!O{` 9k0c2)b!yݟ^2zqYsx KQVB,oܧl7 ]Y~UwcR%"4ն}ÌV7iq@EB8jkL$`{Iw2u?T"%79=GyO'6%KGLigN)kUSg-e(=Y'ayjh6Op[KiM{?BE4{魀d3犕k/kS@'|'k >bPXD_(7 ΑHNvH]r\:!30R\xW/v I OcH.XZ凖!0ݼU/zOe_R""/[M(7.2#ҍtS 0{$vI,؟${lghi a EUzbW[?--QȌ&c"RbKGpKyjK"_T& F3ߌ">گ {&(|i@#os÷B;2Qį(TW~|IaO"*yP0 xFg=E;&%IowG^Wo`_XyJl {$WcM=3@e G:SrI/v]nNف'슧 3UQEp7ll92hvooePuA,ߎ%s%HP8a}7_nM?1 ۱b@ɀ :Q? M*ɏ:AtiVѷaA#YUwŗZ>C1S|Apu~F+yܧ֎{4ẠW찛D]ȆNG@j \pfrN"3C [hrTpJsbw?lֵiDC}=otנO%O>n4z,b!hrVĖ zxLj$qŅ.!dw}~el^\^>{dUE д ,bW~(I)j\!UoDׂ&YdQ'5k ؘ~%dWlLc۴kOHTr011~=Dʧ mO y9h)YJB-x|t҉AƋՔĭm+)j*-&<]і5/qaAMj_Ć.ֳ]`zBJLˑC}n}EsȆB%T鹜AXYEӕvfhd7\/AVq |׸MO*ԅcx8 K:mŕS*iss9H2\&{̥V`xl@a 74/=+^݆*sDg6TESܦcㅮtykRhڐD2 d$TPipg2^i<:C ! T~C7vΔq*_0Kk,Rʷ+6D>ɹDބ~_$Ve*, ;p]IϑJcbvF)67zyi@_gb'kCy"\Hmvx~.lwB g͠X/Qܪ"/D6qN`Q:tsJv!_&K #ߜ Ba\nO۪_s[CΗSA݅'9M"n`'OlLU3ߜW1H|oDQ;Z rOI3tDt᤭NbfY_K3w}馾m*6 u 2hG;Ym;Ҭ׶hL燯NNܘ$nמc?'9r v3A略aU p7VJ?\fyy4!ؔ4! Ҽ ulVPyN%0F9Wh` .j#07ۍ5(m&~pN־+VigWjkQ]a`NU_<<,7Cg X ; JmOnHg5Orƚ1fe@d6͘dPpyAa{W\J901dM@A+Ŗa7I5 6dZ(;.{֧ێڵx&ڹ4䯏zbT5.x@X 7,S^^Л4b`A`5:-@zycP[HT}R dvɔ@uF}tTSr U(.'iVfAGЇ.^(xZw%USƗbMb^= ;쥿t̳,rGS HH'9 du j){aA#F^ԫ2ۺnV"lK?&-~zF?#$%9°TssЬ9/JفزTE5xq/dt`J+E_:xV>tsP<~᯲*4,11v3d+jk Gf7Ӳ1n+`[pѧYXdAd4C{D7YA.ۍI+2jt}g=ƫ*G~mruҒE?><]\B>Cb!.ORR BH9Ύ̹Uj*?j A_<|ƬT'd ˷IzЋX4#&/)Wَ jƯMJDSH6 usT[BRS-.KZV4[W`*1R=cN*#~f=b2򓓐.Z>`$*\y>z/P|, ,nRNKpх+X3;VYн#8-ƼWFL tjzBowkEJSY*T^d+ʄ$u9sDOaT_xX/9T=m@3qg'э +88[1ͪ˦E M%~[Pn 3g+VS'r^Һ'N3G7vY[Kij$]b]9グt_!ϴ1i/93w7ؠNR GJ`[h%ak=[h\-4ۨep66yXgoqsIi]iLqk7{ p׍r4ˆڞoq`&n0FDġ3@,_a)uk,b.S}?ED[y @%xLoViX^QHaI^cXQQiz!S yz؀fQwu_6ZPc"ICO4IB úyH g?>yF.`㫚2d5k6c?S-yMhTacd9hm6Z,>9!!aXf27B"7^PބrAG-Je pRQwYL4ղ=犺o1w{N)R_~Ue($}ף ꗯH#[yBU~jYLpz dWLX6@2!oc,탏Tq0ϔo@0Y ;x~x]%j 8xߗÃGOb ѫcN6PE$ʘ:=@ME3ƓV23%W#$4?'yTP4/ +XhkΉSVsZf(ј6F'ٛoW[t{{_:%[d|uتUA5._9Ju7|714QyēCI;vyI6GiUcw(K:r /UEFOe0`VuM:xurKLhz0WB>w;b>c./O+G 0GV ͢GLk%1IQ͇JQojj z![ Td*tC%S\mJɢ]KNJ+>9㮾˪ڛ>్;2 V@Opbh$X+ٶj_6vcm_H+PR`ɮ ĝNLV'5?"aa)qM]*;ۙi.]2/0d=R; 9!ŠĒrT<_.JDy~Lu'u_0Q/}TPMzD|Dgoiqm9rGƧIх# ukT{sИJ!=sVg3~O؛R<yV=%}}p Z`_%L.:,i8.)}f7 #=Ll$Mʠ_=mF7hOu \H3X8nyu6 B#|B`T'E f 90]2`|Ii(d2O8Ȏk{!v}"[:8WFqsSf=* m1VA~pɻYOظBMS97Bj#'H*xq\yܺ'0f OҊx-*OgFch황 R% ,s[Y!9ؾXIY+4_gA[;W?$!"b-wI45օsWI?9a`S†7U>~J }j%z5Jb/ -BɯYN"wFve$d7}ffAL*k0Դ|G>@:XQƠu {2fmEZ޵MUmCc?0@tPP>yt_1q HyS,,S3tn`qMsӁgPj)agmY<j)ŴuTsͨNk$wL_hxV,"ƮLYPG6 N=#L}%nP :ϻ,'X`?S_qXI"zDPnBa3d_KWHXjt8_TÖrg᭖[X ޒ3|E_)Lg?y^C'޹VROm1i'̬NJ`acEF.<:U4K{OFu5r. iQ]+d:ziA}Wx?rܧ%Pq{_{,}oCZLTi8\7sb^gXŎ!"+77:;(Y}F:8eYԧֆ ]JvLK81Ekl">f"3JҒqPj{fʁtVYiځl 8dz9d \*`fFGI'H\,z@,%zȖ?C]P1s'H."YB'nM*9QIjˁj8]>gE%Z9E}p2F|!'+G@^X7g{K}i҃ N@P.öjCFRʯVkVe{'ZocU)<7gߓ*h>]*/XA"oDKaU(kֹ?v:G&nb_sqgn2 } &Si8$ uHBkzd ך~ks`!۟p:P7PA!6XOm2^3 `(K{gB҈ t NN$X~`5HK}M>h{ nj0t8S.3,jMhbg1633<},Z)L*^.^4Jab>k-56Ҡ`JB~?pKޱkZ@5z>ʞSEMU%WދB\N_*FҕD'; Kx"8N":+lPy/ ) X*]odaמ޲7>ŝ嘄X}󠢆^9eQP&iVa,[H}1\t`"CV5^E9!HCVAZv.pX{T 6jޙLK1 |X7H~,s "/ {UCQJK~'j*epa4e&{W:iR0aU<:%7 <1N]M: X;9 =QHg{xS- qªG3X/&FYlzO(+ɢH=%&6}ع3gg05еh˿rlx>\Mrd=eiF)?YmۂĠs==0[~Wjhu|H$€icӥem/jQwhS;~kr_H7*<7NX Du*s`p*|K]F\@n/XR⸹'~m/"Sٮ%C|dG~e^,W==r3,=k3ԞZA`kvn OCx~ENe jI]rY,ؑGR-xl&!żPU0hO#m!G:x9O}fJa7Vʮiqg:XIv]2ng/ǘ*%H͵GJZt <niG{{l' >;m 對V8MuUlQ^FNUA f m˾P^Vm A>Bizp;EK7NbPEGI̺[^d \JG gKfo+՚i9}/ꇶbfg}(>N"hu NџCU`j+>y"V=i'2DGc~`_4EF#) ./}E*E "OJaB0_ֳV\butGavcK謿R3mMIG/f O/.{ˎo 2h|Z>僊,yI/G} m[ge⶗ K̭x)HaYLtWR^j-`;@ #"m}>p[FLN{Di\r>GV+W˒!#T4Mq O;^ lFSI֏_|n;\Z^. R qr@IFri}1. JTZ]>ng~LtXc%qmK\=cjGKӄ(Zw-[2uz\{Y3hT/Tl=댝ۥZn@VcQw(r$v0'H~żT5v "x+Gg_~—҉j_3zŸ9[$ONF)dڗW3𙤖؀7߷oQLRA܈!`E991%RdC^efO$nf튙e\5ULqC%[\'.h˜K<Ձ(7q\ԩZOoE˭7^8(?4576:]ؔ 0ظuy, <~ڳ;^}U}'G[ɇ=_HK8LR6vSUZܓT.Hu"2n [UKu-XcH( _f+ȏ1 E 7bldTHz@x(\eO.,bw#{7 l^(潀܈rh;Yp_:J[G[z?|LSTPEVE֑~jSWk|#f.׮_Uq:wd〡yT {nQ r -W*70B]B63%ܾy#L-&v.oA(koO.?}nc *#kH%{~/}. 0U$H ]dN&5C­Ɇ5?&AvxrrPOZ4gR_ɚ]Ai5V8A8Ia-("O-ɗj kkE ~+iG}cO@N fE|<='!`A&WD¹+H0QP}!iEFi1 0+Pު-@,/1MnrU+T/ByrP*Q.-! v??޵]tt;kmD@xxX<̱KVºjbE#; SaL 00hPDo,i\D=4]2G4S R  t} Gz䯧jXjMjw4|u|uWe26<z>օT~R6lw[m>)cd4s}%-frpxnېyf(Cg#~RL"tS4^(9r8X,!I~aQEL8'gkY h+BL1A8e17Yӟp3)qm*Ѿ!UnڀyN-ﳝ!:U Q ] Wbco?YW^PVQ$MOc+Kȧ ZEAA-wx˲nO|$OQ'"9)c~uW21FWlpupK6oYJ)g3y#bc \b<ģja nB_. }]W[irP@O"(#~~ ~jsJ݈߇'7?oV>#DZm27I-..@pp_!ϰ쯭|3dPb43ᙣ+D.jd=X½Yx_k!nR\v q=]Jr] <*v"@e }b8K^3AW nG Of0"N8,Jo"]cʡr݃butY)0j3hQ=hx n[8%Kفp3gVϮ<v`y3  SJh9"|ż(c `fj y8:? `^kmg0F%Ol\[lB>‰~6F0Ay݋~I# Q&G=*#+ jxd= ཛྷ8XVŠv̟"R2^q1}K 0~η/qwC(S5VxO د)1Dt%-]ƕ%qcFĥbMWMo2j`[sX-|G>BUN?:a?YvG7cRwR=g*HAoCvv?'4~2 63%8wVYVT?T>N8 uF47 q^ޗERUg"Mo[Ɵ!i+=F#3Tpf-Hrl#mʄS,4sFa,,%t.Z4-@Lqۖݑx02SQlK,~oz^D+: dM9THaC8A҃yDچI B<;o,(5ІV/1/KϢJ3uz0Vj%HJD @@4^MzJr  p"S,L>Pt*k Oj}{]tilO)!q^!jX9`/r6RQZީ_c uAd;UʎTUr.;/ pd Nqguڗ X|! DPki19p{wR/By,8/1_LX,/tq.+rLT#}u+Ue]/`'FAw(PB6o\)zd n̸??G?|wgRPZA'yʭ{D`w{ՑR~H1_F'+ފ;\Lb;JO3OfۑMҙ6TILBev9Ics_G$kܥor)QCjH9>4\۱MuJд )21nɓYt8 K8R:M2 @n6T рb猠U Sn]#Eu촣'cV+2jZCf7t(4父A,!(*uPA#c4 6Ltcź'j!0 إz)?c?oE|3hOdդCڈzh+qެ;dFQ[ɜ_4E;)YT\n*#h\m[$rpY#''[׿Iq^ƅQG)׏j:!4y<7kf0kz}Y|y{YB7nG:(U9c\=^d:ύNھC>zc|-sbigjmY 5gFMbpL@9w'ᵘ2jC[?gy? [6a>ŦRýhA0d4㵽؏Y6 [ 䃻ӑRwVM(V Ǧ w~! %iA>1Wa?r y.\\_2C2b^GYT}%1o-] ħbˮm*ik`S,)q%& 7hI bok :,7G~}פs+Q< gRV*'3鱰?ͺ7"+w_La'֑!sX%ύRuOq0ʝL23t @PJv+䛼noKS%/Y3NJ{oܽWH&D W~캴{k R*}i8wWi:zfOz3asUA(کիMCU?.-&QME6 TN\bV4!>|+ vJ?lm;H5>r9onA_ݤ6 ocFk(C abN814he~ɕow G%̛K8ą%oC%V!yEȸ",*G1c ^`N)xX`.ȎI6U6A:N[vy\Qǜw 43YUň~IYdǬ 3Mn>Sc/si9Kn+SAQ R3Mv x{ 5 P JfnBL Wb$u{Z%o'aAί1gn'XQG#K$cD5; 8L֦c- nGq<@~=9;!Rdǽ(4|ˮg@wDFÄhxmղᬬkF}ײ4dIPjx3A8`sשs:;|y %l_]1@c>E 7m0Y\cLآrѩ'`tGv9nvl3B3sC!;:TKDOcq4 ߎwT25C㸀I+# Nv1¸iʔHS>u[d?Cr(܇t\Y=Am|=rͧa WoL8z a9~ͮ=q3.&]0Tdv"lnw@Z|R*=rnˢ>'cRe|d]&dcr4ρP5d`q=E gg~\K*cZR:Dvl[qʗ~#oEvQ$=vvDaHCvt˺,4T`^STjMǿÔx2M[p+O'.<4=$faNyHL+~Sd|җ%LE>VԽfW kOj+SN79 - QC &:SȍRAUՌv58 {={y ݽIx.%2W] HN1d yEg[dqb;>UI-&ۻoR`>;1g6ɓE8ϟJ|A/7-RE @{"4(P H6߿1#QG9SM{HCiǖշhb F##-glH,~Ӵ,5g\0zF,<%B>bi 3GL@͞TX(tILȗ;h@܋aY#"Jb|x0$wy 1/AԀ3NnvJi%\2eYt"h#k{s) ,?aЙTT֒XbZSߵYyt`Rsm\N ,qƥغCTJi.qt Aq%ۜvQ{K!ɦFO-z[㽗e8NTC Am$hV",(/9;5vjKP{X! )yzWATC6=3>b߉⨏~UD-:inOjFWSPg9Q2 Dy19Oi@EjKހ7J 14,+76f r~, T1 MWKIgFn$zh))nƹj*uxe~`,=Xi2맫_+g#4-?_ϧA0tevC1Rk5V e&T,iJI2BsYFq#C34oav/܆KkiKlPCNW"`GfsUw*gX7 OCyj5a,]<[Wc!5$a,"hDy>r9x۵2 *A_/Tӷ5(mk6~(S^5>^(Q#6BygQdO-i,o> JXE=њ 4$g%pʺo$$ͳY* #!*: ./1f0;fȶ>˓MXNe]Jd&S=R$PDuKY{G1;#AGRg~vÿWe:k-ͯ{kTשs- ؤA^f909uYq?ȁP)hFī g j=Y X Wbhv]+4:<%%qϥ%-?OŪZ♁jmx6^'.3vcqz{L jވR|s;b@F" WJqWzoGk l/P=0/OK ūf/>,ޯYj?ɲKT^F2&'2Zq0dQjНKɟwp3;nm[4f\++@AX:gA 袬خHac#]gj̈*Ny$U9(~J͕p /t9ϭQ(vn'jCoj>ATKB S/ j WkkB!A:Uc qR66%"e1zۊ<BCx/f^ k&ro/y8N{^[2?G{ymCc-1KR/9.(iT`ކ,G(KLF惍V;9o$&#̜ئII:[1)T/gЍl _{'<&)<#p%LM"++ ?\Qn!(w1*U^[xZZ{<]K>|1 H\q <g&SFeeFx5Ktz?欣 -ķ,F3}? `[mƪ,Dخμ[_ ~f]2ֹ}5IY>el-*\{uոQ*lrzo#=$D; wװ?Vec~Z4=7;y]E@B bf(?;c1}[ˮ0^dT+k"P1 ~dS8NYD&L:zbR45@DTJoo챊IǕeIv5V!5<˫9;i.)0t)0!LG>x "27`9Gc BfN[otiRnLOϱem#g0,!s"`R<Վ}߮0l _[ո6ښ崗=\a8aF0-yBa:| dļ]A{p%| R~ MKkb.5i81(W3Y?1XPMt@l \忪8V[k/Vd~F0A9 a _DMK:Z'_Xxg EdV8zEEZع: XC&+* 20}sBtR6&O׺gʦdHȞD<|GKuF$*s%Lh&k J5HCI瓩҃&m؟nn~$6i6C  kCdfKױuZj^)haOm h#NgcHx& /+>R"Xڲ Y!ͦϢY 7tryQN͎5LĄM\!>RM7YV2R{+4,qsGe@=3m7AZ4:)jW1M)8?lM̐{.H,d(rew AXk]b;o&h ͒SK [%# Ԃ.Jٿ !1ܡ3ؒ[:Æ+uٜ^+}Ak3e7uL+ǀ-I󆸩)!?CyXb۫?KN`x[~'xh#4flj۾eۗ4.ЀMaF@kl#d!:O-npUnnZHs\Ƕ'搎X!`ŒOr(H끮f<&Q[fJm_gc<T/ ')KzB}~R;JÚ? nfs]ó < b٪0|QZ av(qp@U]QN%׷|=Yלx"hy6oRXK͗`NꙆxY6yx `KLys|8 ÿj% hJ,C|9j *  %$3} "k ځ$K9Ah߲C`[b2FjS[F.H-oKHp *xgF]a7kTD;%κwj ?tDY"R(HG cʖ"/ 4BP‘PN$}zo1smnJuڥBAo$EN肺 *VjtJ^/5V[v2d0-;Xwe# F5)o%6>K7{=ޙ,uٍ(Toq옂tv $ /zW6״+{ZV8T>t( ua xo*Be&Axtn¶0߅= MXT [$4VVUT7|0h8(~5&hԽ?]9YrA<;:0Ȱh])iLHkK~b?O<&Iok[Dtxй}L-R=(1 oix_ LLD,du2'vqxY TQJ~쥕~2 ;ZB ze("4Hla^@`"Hh*(_N$wr2?e%Ç%Sg\Gq`F8A.n^TX,+ԓPubyûz)=~)蔌O 1ͭZ*"|UHo/DO^<~CxoGlm0_BFWͺ wFrS>Ff/)PQײy vuLٛT[kLpYvW;:XbLU;.F*L.Ȣ &&|{ ˋXOG|qlS9w湮G$kzhV+z& ©Ʃ=:ҳ@vUn g>-jm5OZPMr0ͦe֒@{Z42y3 y/i6SXxVRu95ÛO@O;Yxj]Dev$z;>"7Ӯ |0{.ۊ9~q5t.'plh WIޜ*2)͜Ӛ/Lͩ[,gDwͰ b/~•/Ga<GYv BãZʹH3uVZIXLcWWV1;gM6Fe񋞎YcraHR?Zb"-`>:hYLeUQe!< Z9{blSH}PėKS:hrͭIDie[}dCjI|bϩ'9Ztɡ ,2ZdeMgDqQDÎ*'Ame- 4v%j?QT&E4{B,􂓋uAn$NN"$þX2Gn({/G6> }`luvc|X."Џ2uw#`WI2\#7/> =K%uN]N[{Ï$xP>,n@^_e`A<Fho U6MGC.5 d';I+OG6feb ۅަ%faJwr E}:X5 ubx,"_N0xE*fIJ rI3'ӘL1TemTr$&3_qn*+'0s棖7C~{ee5"$P>49O7ښeݖKJ6YhNW!x4 OxK`JBF8Bk6CE vPX7E6;=""CeͺjJpd#G;}$åvzG-S[BD]&-4;-B_aqMcM9]DABa:kh 3EIFeWɑ,@]&hD7co?වVw2IKн`ig{O/F92.vpYbw@6 B'J=82L:}3+:5%%dipGٷY2Hav`}dSvJ D9edkZ {K1i)*n8}\f8YoB']_>SHQ,_^M磼p&~V l;-SBxemVdwD: pԎĦR` .^nTe b|T}^⋝-UEc0<۴7"I7 )G6~Q2TDd,ʞDbwl~|7 $tR H4-r3){ײ.p)9\ʲ eBD0a !*?J%Χ EgXk 95ĻG O#Xpn&_}4s!}k'İoln̯3paek+ f9SZ]Q=ƛEk\c,eUaiQR 뫤_HcD_j,\mga;hQ?v֜U7@$vccixL+qnyF``qeO^1qΠ AHPE\M`&#!sO':9bNն}3ゑjG227vFd>bnad7#RbYq,5.2>d!.] X'y*$Qu7$ad';$R4Vnk>J#S"<Ƒ݁g3UR(n@a/  =algF?(@ۛh 7I:a'jI14@n\UL'W>8̰>*YX) -v3˂$]%E@)<"~^6ڪC`@3l <}n=m`_cJL\@ߏY'h Wie`r< UOJauċ_ .n՜b--Z_qt[}Xl/bxƠ 1+ո~_$B&_7A'VDl1Hry&}.8EfqxQ U,Ѐؤ\ᔵAZhEԹƥ3oMHe}⡇V:z&* އvYN+U 72 o |8[f e*vo3!fU4CSh ]VrOTmt?9;4`޻1N~C`7B UK*Rѹ~r򕉥0 U!3DVȎw%t=Ԯ C>ڂ''v!'Bׁ~,4Ac $Z# EO@<\tA#u{;M bev=}8C˸-'+J,nx/)M|OzAY2 ( ֢Txl:UdwǒnTzp??^[q3e9@`71I0ݎ—ðH^nOij{?6 +> d2| bD ]R<#M;A\,i4/b#Rv,L^CԹUz qڏZV~z̋0dkzޡH33)'N(V3o _@!| Jqj}czۡzY.FXr<("tJx҃׍M]=-/3 =l.40;Q),ؽ{-.תAȟC tc Ay̪h)A؈ʠ{Z{{K; hNR!+WV*Oϰ:oh0y~>Fk ܐ1@Vd.1g 9=BArJh)=kzj[-X[Wr[Q ~&#L k`]XCLc3_S: ' *-x-y c}9;'rNjM> ͣ#FX\YSmaⓨCu:}fLܑϥEMtIъTX~>{e煖7f85brW_ Z $ n201V΁@NvIΐICT(e }xOf[=S$?#Cj蝀}_h.{@ E~b`4 /ll-o6__Vוw'5A*m./lù9 0#\ ҾX='pҳܳD]~ͷ~ZYh$H%# 4.'` qXp.hmW+2 ͋Ͽ/T 9%<+k.yBl,~ukn ϧ/smRǰ1o"}o֔9EfwBsԳNdz ))~ } Í@MB#ev^JnI(k5G)t\9D@LKx*{ճâd佤VJG&0_:a׷[Z?6.=jƹ£5AZshڮ#AwSȁQnPѪkNtKg.U? bW:>k0/2`8Ƭ>Y(Q 0xY`}r$vw3MIaGgP1KlS3۪V9EuIKS^<.PV),?TeNH084Әv-J8m˘#5ZjH[GsԷا+-]Z$8DŽc @ 2>]D<`0a10c5h\70!܅a֨*4)e9_~q[]x[4Y38N5 Q 9Avz8&#`ˁֳyN ?2 !}N6eiW0~.hϫp+6}cKջlb,tl68Ϙ-կ35~ \GA·B #5ά!So5DӉ@M/.u}`w? |5 zKѕ#!{}q9s)לus|iv:y}hOx- p@ԬI[QM[4VZoe mᛯE#檗HL(*&SG䝓)w /]?SEzy=%4ʘ&Wew}B"G腆%6ԌEG}$ 9]M2,xKS`V>ƪ x9~=r[lLri+(! >"Og)^Ǒy+뾱yY~ks:uhx?7 DKPB׵3C'אdR#D'8ṳ[MTI  ’MICh^z֝P;<,tZe6"ؗ@W*E glgD1;B j:TA,WDdo-cJ8sOK[[eML,usSzm#ƱM=>q'33MR>`q/;<zۻ?Ms U\FK]Db!k\g(:IJ-C-/$\S_gtаdBu~S63F^{.u Eho{˾aY*H Uc<Zu`p1КtCCNPc2]SvQJ`6ؽ 1a/ugD(w#^*U("w^msˢdu8xB!2Qk1)s IG@g%?cL 0B-IKi_ąTw`=:}c%aa>ݕ1Bz#MBM+mKpi'pN q&UӁ̦XtyX 5W%wc_US}QE%`l(Okj9M Y$Oq@țm>u3>@P*a%mexSNpjM AᓰⰞ5YN@ y5&RLwW$"{V 3[؇BTJY6.9Mx{:gVs[wP %0}* [ܰbh:.(duc`߽gu#e.ezh\G2XI5' Ftw`T.吗KV>X-˶*tGRQ3̂`ag쟡ր%!a= @Ve>5~iԋL}Bvt;JTGe4C}%mTjO;}{hT#ȁy\8'1Wrdw+nsm7vH]+> ,'<u,pzԍLUzBkpKӢ{c:C>_ʳB(1.4mSbDyl^,HWT#|<`˥>c? 'isA2qfLfʜO-ӷ?=ۖS0мl&2gOX92ͯHcaMz)_-iI=i.G2TJoV&?,@pr ll)kǥMP,*Q CJRB{/6%V:DV! ~F Qd"gc@a4fj<]Bؾe_2Oǔ*>\O!mVw@^ӋM87JCQp%U<)g3>5@b' j' dxt\B=u+azɚz_V!m(ɜ)[JMv5H.7U;SPƑ&Lhj ; _1EƵ?+Eө@D/#`K8H 2}O1agF?fP@h"&{0ߛP(kdkMVatv"FeUpV~!qi'kf!f/t'=AG=)L d&th(IEҥzYSlwݺТl)WsߦO7g9A_O"L)KWaGbwtvUTx{ãs !|励 tYTSMZz7cS q EƬxk]tB"NOÆR\n-m"M.1fϿpZÇnW?YJpwJ2i,Og)(LPn ZccTD;ԉ${=)i` x^9qc~8HZK3 ?A.B*1QnB b+֚:+$٢4|ҴEp*B5iܰ yAu]d(Z1X- 'sf&8_\ILeŋ7vǭp8SGĺ0<Vrvb[}ݔ8M(GY:p -و~m<4D@_j{n,\l|DڶRIZVlIC&G+ix0_q%>ΜjfЏ/JW 3.RK辆= zQc"X&IlPɪ(^h;BKZD ::깇O .8;G7dv\Wq =-+y%bHyi8 02@P1M),3zy\b?Ļ[ :gt8QdzY@>Dauj^lgLLf8Rcw}+ԸZ֭ <'YT-NA1d``ߕ/q!B){ck/}֣'KBSݍjǠvZ:E۫`ʐ;V8w$SVNYp{Nϧ%#'aVnOV),=1" jl_ՂKwZ\#X1E'yߣ2S+U/ȧSaWm|N&hʟMi}iYc8*5-]%,d͓gFx0 olJB/r8>HllIB"l]lrSȿBftt39U"ϪCFz^RCJQt.@q)ibx/q+AK C-E"F%xn$anT cs7Xa"7du$mc6LcWQv2YL.(m =qɤU[3SeDڒ C<2jN5㸊=A@0'%%B9¬r%\"Wjw0 )CJz ۼ8T)  5)3g27H(\x{tqx+6#82%7ʎ4} ^X6p#)dn&P6oZ?11CWy:Dzdg!4uD O`6]xPwKBک}hRE薟wl@.nݳV>ۿؒ+Fa$NM SZh[s}$5Ѽ;fCvo䧷QtND.h,fZM]`dh]miFgt Pzz܏T 7,W`ruBU&[ܜߍO >TEe0:zj]+pRxN@ 0R{=~Fg~F::r)I&ǟٛ|+3ԃz/ Ae ; ܋iġ=K(>25d",bd͊NM&e+{|wf a26x0:`-.;Ɖq]OZ d߂SнlR)[]*eRޓ>{ OG"SC_g8wppR) DN []jfMlNu18fƓaݍ#쿲\_p틉7լLP»#\}&n@> T U{EX6%[iV{VeQFM~S?+l<\$i`~"_Q5gGRMn/mSQ],tQV6kfGh$8n 7 :OOkǣM<؟^h@:q i6.1n@Eŕx^ޘGlHŅ˼(DSK q̝.4򐹭*n7|>k&efpZOya@4!+%<` .Hi9%ݎjf6iOdmdWG\1jW/ -TX(VO+inVAg|aTxp0Wk3&#jaOR&Ȇ8;.uLV{ǖ *+(5[C/[\!V{wBXxJ\ nd˽3_fJRUUAA J tZVJ*:62ꬄTt̍ÌQ`qh㓩{,4,F^J?67gg~gigUĹ%%F(^Z_Ͽkt M7M Gr9 û C-K_wL4O 4W33_> ;ݳUhqʋ.[܍e dWUZ9oV1{!+ӗ*?'MYL0`욐AvI0ruЮw>WVWZ.tu?,m^ Ƒ f &wS:Ƌ/=3G 2V6z6<(bK\9" У7q$"`GֈV~w ӗqë5+ zgCf~s;"4U4]ri%7MVbC3D~^f&mbAT<վPRRU@R#¸0>YC}y}ސE1x (tp;46Z<3,J +v1tpz<#ZdmH/)ʱ $aoe1$|xHG>U8-,#uOf.$j%c9?(%,g 5ZqOΓ||b5E>[ݻhMco|Lۻm](N B%/@|,/3 B%=mT!n+[N` 11 =VB% в8s@eNK%9nNA ʥW +m~w\t#|I8̃6l4S&(w%y3Ikz郺Guxx`/.jY^y!1bHHdta,Fr_1`D6=)q-[Jhqg`m'jT]1)9'bPQ#ω1Gͷ'ـ{CvQzݾhZmo])0| 0=v[fspw$ ?`o@>H1ț;k@ *:aV0 i @ FM`P(>5 4w)>)쀐lPzDV ǔzF9 v}TG*^:8Wa<X)4e ߔ_˼dH=7No 2(ƷoJflSeO? M")aqLp.\2\25ޡli `2 -3|E>5BR"+ mcTT1D6%whulXGG ZLE!{oa=D̳ea[m@yZD S0'؁q*r !<pX/~{ QpvYe20-;݅>Ű9Ly}D+*~WJY3Wa%Fi0hrՀk/Ėc]εDmgN%]ףt:V!,0^%{S Y0#G")fǑt)z{wK[l}0ӂ#v'HQ@Hs|<<{ xAҞmw6!޳`qxHto- wZY\%D)VVnHGj\'I SZwNcq;L%0#֔e$nb J3:${ƷMj {קU*`pn;i꒸ٗs~٠ NԢkByF$~L#}r3M;P(hub^*3SNnܷ6X61a1_U*2& $͔-FqJYkxH(7ĝIzv!r {yB3jՒ){em=' A%O n3'zwG00s/-wh+@+xXSA.p4wB:}}usi :?m 7X"V]2=Y_77MG%#WUU2-=REF=(ks#uaӰPPީ~[Zsn$8/uZDVB߲,.f, X}+5e{5x?=0{:(bbkyµ[)O>sQϑ`IE8궗%?ͨڛ`9o2WxewǬ+Eluie1t䡜NL=7%M+1BoNM% *7XJ';W$V}_͸k9Qw#Ԋ0~nd9?7`Ӥav34LT|wj=-@<0N4{hukC' \$VaXIڈIL\x۰W_ ӈ8yAe6v ʵ+ұVߕzlPjHxk"tKa_|P%,A!ęUxo^(@p;AWM%2Fpz&&[9#];a.eZ,bWR"/ &lz=ԓȊ_$OƮ-#xg睎ˈWMr |2b qv]2"I eRe#z}6dP-R^mh`tP'Q.l4H lfom:=RWt dUS[lUqn\W}k5hwD1.&LG#azt#<4dpkolֹ_-UYIyb$Q)|yrźhL5s* T=㷭PI!\ʃSs"-%hI^STȄxן'b8Zg1%TpDɒPbĝDN Oh;\>/P!U<^xt\ۥ" u=i* ^[BB c(k-2Vbw=NQ, X ;SIK!yqԞgU6ۓ[`bo cr zr 2i7~(I 8kE }w@VAd 3*."qu8e$R)t61 zøS V [k1Ɍ0^sوW<\X{ HN/x!&5eh<3E=Jv\ZL8lzެQmKyi2U. CDzؘ>!)(E OQ9G6w_94ԮWPs8P\R@<3 !7u<;I'6V &R_g0h/'3 ~ͻŜo>QvͺU!!\E¶*H W(e5 ZC ^4ߐmxծBdEF"iLH!獯+\ۤſ}t~sZ 6=\w4=AQylԣ}w,y^1Uj0h/~$ގ9)$.I٨OTN7<)31t9 svu|<d %BP?=%Tw'*8(6o[j/^ˁG@i@[[uFL5fo Oeq1p2$W'zn" >ijQS_'8`P)Ypo|ʯWʻP4FyRg.#t5@KqF+3= ̪[)@Hr};K" 7+hZH$'bD :|aP^4^*hH}lEGk yÿ#UBl^c9ϛES-mPt=_͑KaDNϼ u&ctILZst논* m]!!(czD/N, 0I^[ʀr#XVM :0tM/QG eϠnX{.*p Ϧcϳ7z݈:O6-]UrB ɧ2V/(!JN5%tn:[jVIxN~P>1B&/qZ&e EXjs9az6<{V _?> u4h 2cFcm zGhC8e\N1rH/,[җe507LLثL_NCȸ9xQNE) (C`i9 p0h.șmuĿ5>Y/vr]|%0yi7JGnik+:SXfiHL#[z#/D %L X\#eʖnZI[Ӳ4"txpl+_v>.(91f=́mlhZ=<ފe`3>Fͯ--e@M[I6zct`5Iwp5&`0$_;翲5ނ@Xtg ́$_d_r`\k.NƬxDi ukȖ_ʟiݟlMi4) xFR]T9sWÈx]n`sK}C\K+HC,SV솕 TpxUCQ>+[;9yT䦒 O>!{Xv{ FD=hxQ~O)=Z?c5K*t0p W'IYU-Z[7)v8NϷ"&͖(0N,K5Ue?Va4ci裐Ƈ&/V+%j(@gז|]d0YQX'nRW"wqAװN,e|ZFv2[ł_P*G}4S0֥h2@;!(~Go' ^Gh̞> YHrl-Hur P&o7B8+ BPZB ,( ])pc?1v盛fC^ `COfwՓ]N{L e _bx9̂(똸yy}43iu6d ui첛SW..'~ىkz-ͦTpeuÛ_Px F@Jg;%ŊH`./"YWo1[sq5:P6c+J=GR @q⦘id"V p 7} 6`$L$Xw,*Kt$aCy` ޿/.A9ak?,QDqb2ף@]̺{]+@;LR&cHw1ԤU?,,C\XUj5r,sØL-Q2yK>iVǞru`~IW@tq2 b5FTNs{?WEE&2{h瓀d);'ɛiㆄ*-W42 {:?^m?Z V4!h/'P(O3/8#t3U CSڠ^%-!-yq-("d93QU)GZK.%Wi\'!pl7]KY[A=~kn&k7˃\ =h= T=o<zayvsXD|_+\$La֗[1SC@.J.N fy\z@F1:?c6'uS>WUx/i8/i5UIs3dZL9߱Z~>U,<9q 威_g@ <(ޚ[HcGPU5kEZ=Urr-y/݇{甮뛠Հ,ƜGvk]`qTqwc/  "&7Ae{wf UA7_ 7{z,;ٙ0r`FIԑـw!fJ !WL-%v \_[Bu?kVS(!ㇳzHމKqA:8;^~I!e |FYhJR=I Tުi4yD7o0|k\{(W5jgȬw# ՟[`W3 X\r1N! d9^fOm8E'afiEӱvP.T'L\ӛ}MACʽEi\]@ u3)/+8TzgjЦSO$\Z C8U[4c=%5hU% \:0Wd`n5gmR{MopىqwIjjɪ[y@6ujh`_4S f<[ ~~'^3K]z)WEngk8d `ru'!=wEL1CUѳPh^nľj{ 7ybES6>!mǪ =sš`ay*D|YB qpidX\qb{%-JbGp,gy \7h7>8t#rgq>A=gHi*jfRFo̊v<<L[,dPxDns}$3gn0|6 rҫTɓ*@DG(R@Ub,I5.'gKMa0NQ"qA#MB#x8Ɋn`em\O\(7ϓ#iQU9PI] -< ,`!G^65ܣݬHq'Ep>r m*{˵uTv 'n{`39JnLn܃(Qo %ۭJ9ZCpMY]D8ʻ9I]E~8b vثl,;lO-MU/WG Eq!$쨰gi_S Q>]ETT]FFUV=.Ү7~c3Jkr^[dg5[{k?>3o S*/*TFثKrV-37J+~|AOxR˜)@on4c }veUDYЀIK]S}'e+) <1fr{b G4_zjތ߈S:S˚3nR`=i}Eh1kyY=i+Sn"Uq9ߐuw Ӊ|UuPE0 TPLw6/K,~|7Q ȺbAC rD *gRWABX(DDNt˝&>sqǠȧ‚ɛ򺺨i([(ʏ>%vqDmHIrɇ$D0)|wǏfgʚ8"+0b=O!j ىB]N|䶵n  `K[n A})&(4Lت-(i*< ,xki& >FGToPp|'XOB) 3\O' BofqNW7#2NJx"u /R`}@s Bgwu ٷ?d#u=t?Êgj ^cZԄ )}AV /Eik2wnv$6Ԭ9:0g,$[k Ygw-v2g"3CxH舶gpo_E){H$4,6w]x"E3(լ{|m\-vlmQ0 Ӱt/pqH#" %ƕd6sxw]2q,d׫]i;51തh8jw5tm[>X VdR hL504U-*(R S_oެ~_!6yE[c bMZ/r̤s& FY8sF*!'0#l [ BUN"+ f)( $_[9OI,egnW6FQ s-*f hKɖ؛w|jd 2S!xTܩc1.٣ P"uX$hK)U:7fawû q Ħ>;", '?Pk+7j9Czv-*n<;/ ~q:;=4U JCG$~>g Qocn㰟ѽQNOMXf58 ;"~GA5ũ S Hً$2s ,@2a .y`开GV" 1X3MA[IPǛ!I $vh"Y4&iZ׆sp@GfCېIaXvcxT|wNؾ.ԊV_A㛲lHk+p,kd +_͖ٸQWS`rX{F$ovU*Yu1Vݾrhv&Ε詞ʋOoU)>M*}`Fk6ۅ2ә9}rHA#cڃ!I?Xp/2zU.TZSNaiOC‡|c&+P+ׂEx^N|õ2]r7ƘQ*-_lv F*;-/\+%F2;Qvio"#vq7.-L 9=4ٗ/R"eM}1=-^Q`.Z]u턖3e%-q, t j{ G&A;aAky, E 5wH01YFK 4m0!~"^09a?흏W9At"X1$g`,Y8I@$[+Z"[~Z{B9Va繚6 p[Z0M h2mX"QA;%~A6@x RN_ee,SZj4t<& 'iP[W?:.~׭,sǘcuLk^9;Ihے+eL_90-au5uy{u="ۯxszB*qlmb^%j <̟d 9j1 -gd=gi$ͱ *'Y"zs,=E3<ƶ}^^y"m;g-H )usdsC2n5  9r3tP~?"WwӢGV!+ٞcy 0$uͅ`-=J߈+o0 Ƃ&]ݼ$0ص:=O^\ ~|eoH`LLkʫIR3Bx)V-U:l^͑/~ .@峧 ;icK.&k c*ΐthiiB=Yh٭qYܟlCRH6Vuޱ|bM弾e tD<0&lO4)m4Mo}rkFTX+h'| zŲGOګ`{%T/1 Hs('lM7fPU_@zz~UA{عK*-7F{n:.Xы;LN;.&lT=dzE0KVJ9]v^l̂hjeѕ0s؁S>2Jޖ/‹\VR{OcW~9 8=i ^ۖ8Yxxtl<hCR.B>t}i:Ŕ$a\&]#1DP$?4Fl]E*۽LXr#.bJ@/`{A3`|<~ +Yq8XsvlW08JΈՐF'PC-= ZKsSL-;#3?t\7>mxl*~m6A}OѳB918Gfi 䫞 1u7 WSݿɴL}gW M{r5L/ u=8EbޖQ钱Ɨ*vLߡvK#/8׃e ?)ZAٻTi@y8y hACaڰ3{[? 8~>״X|2U,d~Ϯ+XhY {Sb :AR3[CLrwvaq@\3T@Ng1g TpG 'vFFa p[PzƤR3#oEԤc4Ap:CLny/^~8- x~'ppN {vG9D$M8w\{H%a3߽sHgw{ĢX2/$t鳲eŨ#e\'XxS۬?MV``sי/9vZ"x=<|j$W+IlOn%?<DЗo//[,ZŌ2{:*IxFĔ6޸? ѿg+.z'=kF[q]=j;@<#</IyCǕ0$-0PR};钎"&1j Ezp*"`B .SBKdk`aiӛdlŃyp 1']sh5kA3 kU}=5[E9?uĘ0%Y>*Ӑ |QMK2Ǒx H*~]Ż7(|G)+EdpX{"@KFVvm2ksLf5s3+~Y_r|PqW-`Īy[x,C|ȑ{Bfĺذ^* ,M =nO$B_tJ Lާ`6袰k^6PQlPdZbTݵ[r׆Zd=w̤LZ&z)V}< O0MtbuQ@euwሟkfZ(PTQYg@ tܚ MK 9qa^>bzԏ1Ipyו/'ȀCJesk TJ፡vsVi8{o:+ݎXdɬjfsBO- !)kk)LИu ܡV-K DۋvbP@ZcñX])0?%SU̺{ w=H`r񹞛ʩ-YVUtu0Ee׷rk|=yd D6[3&S6O Ti1OvC|Z&QI:+lqNϘ%GbQ9 ބ-׼\Js~. '}l,ʧhDV  0U}:> KTkTuQʹv6\lRߓ ciLΑ@a-4zDmhI2bTx7G45DUU26|GDa~ 4 E9]{N<~w} ~Lr95]&F:_w+n6=Ck Qd~ zmg:dgR|Ἶ8Pf|-a(&RՓ?T2 IІlZeCM cܜiVCمcou2[էD(MPU͞w+2< 9H9 ;?N4"Q}/%D eWOVL} Kڭ{:/7RkqhYc0W9$qq+p]wheL_fa=L^l1Mňx{Bp/0'7ccO%oUKY5?Xq^i ztmBzLvoq||JY MA)id vg|m'9j7CEcHT 蜲f+"B$ξ.򫕀RfT4IB4@wG9 zx0Q7_&V!rX6\x3`?h͂q9 ?יWUbX^tLٕ1~ i  w j;ThشrVg+}#U: |ehqf7 vj-TEA(4vw:9x9Ozz nt53-j\Yٶ&:Æ n謐>U-h&ؿfU'fX Z,ýuaw%&-RG8Un&Cw': D[pQcB?lq#v,twZjS!MvnHkhV^*Wu ( $NejjDbmjj䩛s0gC9z>66FbC$^Ne]Břk a'Xkq(Z~2D?EF"Q@>alb 0|tFUKۑ4!z2[Val{E8DA#p}P2$F7ԟ(2-~&2V+L{#_RC;́~@/.½b2\KkV&gHn,ww8U6ygK^ 'O`42i|JLȈ~"Jus::O#eFhW[ٰ'}h h ,/0ޙ6i@4[s%#>$e8Z5=Gg̩ l=j Xc+0_M=DȔzn{pw7:Xø' †3YQ؃@$8[+X]RbNFyst9&n4c v'geem3Ml)*mT.񎇸S %dˌ-Md;hod;{c=QnC Z#-m =c!T,Hb|"{ŽwBFW vn٬愉*օQjHFe_դ:ht~¬PzkKn e(5[1 5N//UPap6t 1V4vsRs'4XLBONE? $bi"_/Һr)]*<`>[p/UǮLF{djTE<c,~lPqq`+&\3u.GoȳG\םRYνLf_~6r~WiR.MF0Sl9ek_/;duoHuTHh&s?BׇܘEjNrSa}6M zG^%hol Ϧ̍fv'rCƪI6>MY,Y*Qp@ ![kB>`bTc1wxӸ?tJ nWv-ìU(%! 51>o0 YLV|ynTrB&S4E7iYk=50_mHqP0}g)*,S4p*x $A`S1_>tlC3OqWm#{P^p (B /~|HX2nװ#Ƴ2"jd6TjI @l- 8(0IL vdQ#±盜 PW\d8a(Q.&o=l9w/Cݶ'֔X>4)$Q?oq `6-7\\{k̔gn`"LɄn,7QC@Y e!tIxs}jD1(o9 N#[AX#f>4|t>?6i4Ԟ+]+ \mlڸ2&_$"g.ʐbqk`?SMky ]Mid8Ŧ]'׾i%i,r {|3BR)\5䵢8)<Mr.|ޡ&#Vg05yޜ61ԥ瑖bLl8t99JMLqJX.Iś(4%%Sdy\亂J~h|G￞3L ōH+-ÜW0N0V(>EF(}L+½,DRmWq4@<@:}%K[4 (ar%xb|zrt[(o$ Lƽ Jw?\kDƣ.*&(Kn"wO[V[`<iZ[{')]a\y\KI Z-4 I𚗍SLz35IQjh16WWcBvySr6Ry5^D(Xfs9{5B{5J{!Q3~i'et Cr:Z1X8kO m,gqȇ9O.Q6o6>!j!7(,yv>1Ly1+" hEؤq8 td a,SoAiњ .PFX<,?W nݧY~YS1V7`51S&w:Z{q[^"! ǎ% {6_ߟ p{^=1j+T_NѴsX~_{ɟAH;V3㮷%>;Pۑ>N|%U@)-IJ;y x>s k03uL[Œ[ V yYK m3 4J׵Kvq Pg-2aˊTm TW٠`S&V\c!!g} !sGj|heIJ*jZ#h8T30-yj`!z] Mo'Da-~㬟"48qcԸ$F'o+LM%a!1ڵn 13-ݲu!8it ¿$^*dMIK<~Hޫ~0{ `7&76j?z aƼEZ~PPUXY|0b1fZxøK(P_"\vZkdn%Γ8c}Ө"[e*N%^:]NZUJVsKMOT#.ױHբhb;SJ+2_vDZ)R'WFh0;*2@`&qy$Y->M\ܚ Izx}9t~*aЉxTVD#xҼZ BtR['F=)!fI߃2uހeϡs ߰G$15\ ;q#s< Ս8'ڏ'NU0˹}:^8R^sNգ'C۬gSnfV1Ux7y;(j!&?zVţZ,W-\O,moz-jcB"B8汑pAſ5a;埸c PVc@a]?*_m "Ң+*DѝQ2aLڠN]Q _f9:x 9GGg'w@'y?}.y7eT^sn3QgsV,2|XٍQAze.o3æ4c5˷GZ^񐞛bHrȤ#R&Oa³ֵ;ߓiP@elKu͍۷d.iNWR| 0(|.T>zN\BTK 1=ߌ0y;]-?Q6-t<%5"d,eQѶmʱ p={{<8]THUրÐtiJ^qAUG;݃2{neawqNQ^߯#C%c=R@ka%`!OucTZi%4ǘ`9%jr$0*X˘-Mr'o4tg_3q N1w27(^@$|S(A dRw`rvl!!4+{wQTt%sE ;><lL= 'AKO5w/\ίlenUn#ug{z@7CbkrP- N^EVœP 8 Šv}!s SE=_+T&{_ 'j4[_Q7SE?/s(o!ՑUYW paӆW'́ߏy-VO%2\ lV*ȸ^x$6 /6CB¦OIJtA3~IPXۄGoziȂn^74cV(3cǷAo~1; gf[k0=q0'洏 4-w"xZw*j9&vƅzNن-c0'4w[-*Hi8`?dnB)AZ}3s斱 j P!=q 4_#l>A)BW5ƺxVNyHIRaMϔP)_ShX#X+ "RVڗ9`ǘ9qW._Rd~'~ߦ}UYnH`B-T:F l+B 9ګ/ 5_ҿBFHٯqD G柃EMe(ɰ˗ΜJp\( | gP8 rRD9,6 7/܋d<$,.@-Sф &6ɿ+[+7 { Meyk}zEq9auzg]KB3i+p.M%*o.luEZOЉ6] [9 a1ei7IZV_=Aqk|1u#OlaV%B#GV]WwB+>&9 ԬhfB H\DߴfR[?~*5DwOA~'|ܮa5HX٘X`57h!\L Q`JN3cXO!gOc23'e#/el#BZ9x3ZMjqd ¦JGE~3yN)EG2(3Rd-I/ǀ_*p.j XW^#'iK zsB;`(/GįPgKeSaOo*J_=5}BJFP3abXͿR6u^E󛤹xgIn:K苓?/CxʓVmQ1t##ވTD?z +kk V'֚u>e-j.PoO%,WN AzGVS+؟؂I{R6S6F~SJzcG@=;@9%+y]@\AacЂn3*P19U0Ȕ-`ص}sr^-(q ktMF,(a^KG`Wf%A{4{GpUYF .yR&5LBΧYTT^ \ꆼՔ-V| OE%ob<rs:4=z@| 6{- nf'Cѽ &!Bp "٠&͗^60n/ 6b`1zM0JNɴD֙,%=1S`7G!ϳ;FA`eB㎺ӎP[/&P,’;>&Py؛^7yx]k;֧Jj,gU mf8ߣUK8[>wvsO%ă߀Zg k[HŷL6\.v]5¥-;=&z'0(B`Ul2ڤգQ9TaTG *z/relT .Yc"yC]XK螏|<9gVrТZZTۑ=Ѿh2 A;#Jc@V#'vK(冩C{d^iN!T$Fy ?C/>poj4 u.}].r( pG;F;M5hVM˰en  sW+Z5\ăpZTBX` Q5r)* *)f`Cυkc*B:bižlqפ~zQk? D A="Xٴ7}}bn\+eO[[VфBA~BџFޢx+h޹RC %w`/u"g.ʸʞq,}EkDfwmC4DDFϏ'#Em|k;Gm;# >+`}ycH_ CLw^ُ C=l1YKYp\)8%CRCqAOtB׫ќ<7e q$b+:'9%SOx3[1] q'{B֌/y.SRh>DZY\M2&]e,*2-ץ ,„j&U4٤?AX犃K!m\Zpmo ;Z ٘<IL~gCfTȿƢ J:nyK A;NiPX\Cl s\]_nBƇ%iHlqqmڕUAbL0wi죯orPU6XeYCAK<;@=+lF?j'"b3#w6GLI# ?OOF#:w1yhf8E7pa|XyKKM̰zzQp"̏]l2 ݗ ķ x83fF)Ҷy[Kj6 ܑ5SȜmaWr#K!FC^qLDNץIH:6C {M@٤fk! bU*5ysw`s gJ%:f{3>-maQN|zcFܫFI*<78^tkj!;9]䯂>]^&TAhw!,6Cx.%D۟ /Ox#>*oxp&0pRb${xyk9l qE"n1-/',S(h|t )_Yg˚;`ŷ$a6>2$@^$(&~&O>‘z1qk We'mC2x%@K۝|hPƹ z!]C'kDK4bD ?#n=I&DT~`VqM-3% Ϭ)J{.hY>Q4z?zt|-ӄwvtLdnVR\:gXuK`Gx *zlCvhDeJ {୶;gflp41uPTS5)_"BF0x'Q 1,W߂f0P{?M|c@.Xp@f^4B&N2dMYɐƾ|v7!Q+}fJXeA芄`KJ,hx,j\/;D(oˈVU}ÿKk%s4%]3vHK[a'yc S-VB9{/jasدV${wa 2fix;$mx{ \xC-3VƯX4C|Ief8f\%(zHv 58ZA fᪧGY_vbKͫ2yv˫P?URyפxѬQCp:Cz2-4:"u8 ":Hhu{]C4 5Ky%2"$A[q>⥙-[1*mv]3IT[3RkL 3gQuCAOϭl\w-9-N)_މUcHZrw"GwQœfrlM-BLGDS?k./VUD;6qt:E.1%NIn01ANg};$^our;Qf/쒿Wi}pnghM{-8Êk[ws}B0eymo0EH7&Nj!/ t(P* |r4{ }ue j\|>HU6s,sJO10{n(XT#ؘJ7]|۠W>+" ,Th ºwqs|h{H^^wH,?Y6ŏzbGQlt6i7@Jf [#`d|˯?B<Tn#̝Q+vrK#v?8[̋|lФ`~Ur8 UOb(r 4[ FHP.[N*QN9iG9B^"U$hkݎ/hvUwrX7I1tnT4B%jYGnW"AyM]j38G3bbMGdh^d' jYN̗ٽC8/'5n+=gNӻT)4nqM<"ZR*ӧ&Di. RMlʐe'Ϩ1 Q{0̫iw}nɄq ̒G',Hkî\X)[2 볇nl~T$0/2\(ktIJnPBhuV _Bk3GVuO#ݘ)+uRT:p#$RPnI%KVQA/G=0>~WboFtɏYu-6X (+G·[/]E*K>ދJ)* ԖXA2iĤpΫVr75B68H(/ Zw>4ia*pwHА'Nju6="4+Tm qYL:*߬ >\0[ƂFFxpÎ-->QO pg9>1&ة ^єKQ!p AUrmML ӊ8o*6]=>TIU90=LNExR 0Rr-?",PS bST6ɻᠵ 8+|pRC6;s#G̩l⻧ɗ'7 5'y0:6~Ө2J[݌pb2nZ*aW2ooCm4w'A:YJht$K3_RїEi~7)pL²AnE4>fɱޫmq.}Y|v} ΨSZu&/Tφ(B%Ɏ8aUb]bMdYKA)}ʹM=IxwOA@yd Rѵ` *d(Cu[(0(O\H d SRu |kbL,W"aeFKg+=`25$PPJPw(4~.ܨS\MLv |LIxZ[0s6d˞zIG*T>hͱKy,d AE'}i1)hxHn)$B H-u;7̾Ns(RVLW061R"EW9(wgV?8^`#7w[۫5SWT~D{ά}Lm7}pO3.8$ڪp-G)>Op IbEvɑ:!B>#?%=O(OĪtesp#eBF5\gs ?K\AZ.HM#/38ډJeUBLC$,n`coJp" AE6ح"[F&V6zNB EhDV)_11+$ ߬ 71Xe;vz5+Pְ}yq8vS/iPij|Q0/+}dM¢XƳ`#G]E~w%Ň瞥!p s.4TϨr[)W[1L}O"Pdq1qnec {MT@bT@wlFӪ V\28 uc"bk~v`)KRV~q/c2kpp NRlsHm`Mq\5Y'CedAq\xc}|G||6xՆńEԤϱ%`'/.dF+ɋ5MIȟtnKx3˽2LAow3tbo<,œMo-==*v69ԃ@L2~a'h QEL+Qyܪ2DErN԰Q@C 3}"rE޽݇DV7bp@wTDHc[htp|P83ҔԲ}7 {$p'޿R :0]:L9a~2 3{q^lmMkLj!1qm^5TV?$| )>k l]b-u^C@ǘIG qO.nhRscDˈ%5 :UQC]Rےgś, 2g=&}M4՗4u3h{0mxؠS\(ta -G^ F ?w\)?/ՑЌeYlHk8)`={7\OUo1nʿp9a>|9]vڊEmx3+Vrwuv*Q;޺7=_aRsSyIE^Fr-4#6ˊ GA{b+#L:Q;6ƟF:kl@(=su:kUiTQtO!im^ _hl vUAb ڔ")' HG7>R+׸2Y״^i9Z4'9aY7AK6fHOxP gՒpN4`!Fd0r-HJ ← %N1GIr\Jx{ےVzfPs٥`6Z/=֓Z(0y*(!|&2zIkaʐFpd hp+cuy&~Dmo,hKc/ (/5cBa "&O?Qt6/3ũޫ҇ȥv &j )})\Ks/"=V Ejq;V"+]}oEEvAlF 'VJl:w=DZ 2zl|,t}34D"djKS74+@͖'!85 \)ܒX9[<ОJ׋]Ό-ٹZ"ČN6?>ֳI'uvSI%kWۄٽ ~~8RRӜHݛIg,x6.G\&9̵`u*?ӠZq&\KX&ջgiq&QYi Jˈ>D$4$A  B| ;GPs˾ Co]LWvIp}Jًk} ~44 {2{7xf\cR8}ӒF;/4VV/j"`1E8Ѱ=T{Lv=Jl"A] hhv55$zJquƝ@s ߪVt00ԅqA'Ts]oMMs>c,5ZvB1FN@)GyTA=:w 厽֌P`V,P*Q.a *Vڔ_ŋtm\OOvbş롼>f;Z \XAH ws097PMm*@ Uչ'THOupS,(ld11hq4^RWfWL1JY}vpX\8MP6Cte9ZC5<í#%;3 ͈=jN Ĕ:E1mŴ7͒23]Aޱ*W|K IK[x HiT4@qpC5tTg0Fqr5J5~_"zjOez&\ztJ"k 6Br&P,S }"vOPAw촥r{%d$_gTu%PBk(m^yWݟoFkYfr"ٷR@<$0Z#ˈ~:ǩTuf౅mU}msF[] 0>{Ƴ>J6Yf J Dx0*M<,F klvm?0W78*hA|;ȗۦ v͔{BfEz[˼|;#q9Ov~ɞV] 7#B?qpGo4%* Hb5:/'dަ{Ii]ʴuJs;?wI\|^٤>m|d cҔힾ\Owt>tW슟Dy/٦Rf@zquo)R5ZJe6.q*B7aC^P~eGR{&DԅصayݦS'*T2s 8Ri-O&|n=ؘ:o;RD qF7{YDZuW)U"E?ؕW%d5-RfͦP,Ml{ᅬ^Z(=Xo⡪jFc2vj& W|x G~L)w1>u% A!+AkFkeOԋnV媠8H[514̊y^PY^v1EG!ӧ?:딼*B>纩S)?~)G0N!ho:\j#nuh'|u RʬėL@Eڜ̰ez!3ݬ'eξGVwiYt́Ab/-z?C-fPY$I}B]-uc #^:m `j5)1ڮ(XGf@Ƒr=k  ѤdA 2ASfB,HQX5^+ }HI 5oj2/u+` ȞYbQlv=?#1IF7dlA۹,::ʱv@/)nNB_ö%-=4jVk_6)L@`9n#Lύlac(i X Sr]c;[Orf]ȼR JZ*ʷ{ə䌌dK()q R ;,kd J U;!`#IR+-!P8Uoi35P7MWd 9l \u~Ioj+說Pɟ jIsT؊DFyc֋&B_ p|bq2K 5 .y1ԕ$s~n٬` _Ku6ʂ q/%sRߝv]zRE dzTw.$h3i7)f!9 <(?@ri%'|Im[! >Yv !_jzQQŻVaPM6Ǎσ5$:$.b\D#N8{ZV*GwHBz+b8KږE|>$PGK wlذmyDZl4zYT.kۀp ~"B&t'sjÎoT&G.⼩f#)3͊fetrG&fuy*+rJl+**- 5UIǀ|j|{ER E7]06H5C"O0EV~M{J ߒ-}kCVCw[<vtUr& D*{TY~DZ@AR<# G貏b3yã9q"d.TG0.@d猁ĬM0OL##-Ǟzʼn{cpSkpbU]X7ޗn#=P/yi ˛4Q G7W@;w *TvvcS{q޻N ۬iblkI1ڧn|yܺ6qXsZ CĴNS2d;G2)߲&q؀GBũ;^bz6)Ոr?}6.Ng<2XҸ"Q{JX}襢Whopx+!UVרpF\ O Kb}߉@-Hl5Xpbj3\i!{u9c"*J l'+qu;9>q<u~ T0Fl{B6*'Y3:.mpxkcS`nD*ž,x%~=q3)akS6?]ii_:`}~!:|ejSSu=-ax(KVfչ]5条Z@Г3D}Cw:3̞~iRs?r{\Go vRjDL1`3]`^BHN`0wC UNz~QmLD { ]dA7ZfT3ËP?s Y~.?zŹ"ODwPY; —ZJ" | 9m[yrX,SAVO$C=`eUUTmZ2s }]#A&b<9v+c ۜ+ 88C_Opry|ub8u 37hZoĵ^5$hmiUJɭI;IO} 9R;BΨLCz :VoS3c<AފOVj3cij g\2"хxY6HR'To_O\8~ym߯,љӾx..@<)=S¸ ǧjT@}C櫩5WNK'lM)H65&h(忕1"E/CCYBG=h*eqrJ-uC_n5[|tF`HC&W h%Hz(ک6 fmc %t7Aal ) jC |z2QM4#=H$l q&MPw:Y&)pyukuY~Q1#z|X|w cpԯ숼&V{1u3 E𯲳z^ o}ut測1؈KfXtJaX15 c1!#a?dsit*#&NwFWTUWUpo%W UdZ&o6 M6@ȗMX##_^F6qi#?JrHhW3d wɗ[:VТ&lU^ ٮ%7)=g&ko J"PN/Km#s`}G԰ì] qЈэ)wüڃ&Z楅Ug9LQ? {+2b1~5(:Z(zGL"JAxA pces{W E0"*55wǚ+[jWg*(3xetq5fs72%zOG g=֫[0:%@2eS7"_3IMз1MbCacV/s8x ڱ]7,޽~ s=țhftbGp_@?Pn {ͬޫ7,UKz誹2}G>Eӟk+z/1.>cp"(n-(k kk/23B Z9%0aI41G z=U D[Q"ӨRJU F׎H,Ta,9=<L`.sURntE NQZHd\){6v4r(ؼk?M)1Gcf.#M=NېA|Oy-h^~FPL |KPZ1(Wb4q7_ptڰvS@UjN}3p~8^R[EV)n m=UFm+xU@[\U Cg3#usG s ̊lՏDZC[$tx.y)$i t"NbA%mR7׹"4F++jo 83P,)&uRKwC9t4u^(4wf37RCqN6D ?ճiJR|ϛAsAQ_U>͹{V7$,ڊs 'ֱuӁn0 9 6z[VU'vۉbťiL{8 m,"Q;2 O[#33PQy$;-[c8Z[Y4JjTNbUj9k*L>%cG(SC++).wS1@,r QwTBG:d4yasK @6İ툊VyY='y53^q^OW_6I y~ppG~dVF|l}\?:7r:Z:{y{.[Jdk:HXDQJ"|@O8SJq>62]X},3Ex4DKWOaWX|d”x@Ӂ%ܱjV< ~>a0 PYByo6W :/=ζ[;b;yvdE7ID D<kHCI*X5Tj]h!NC:F~UsG.zk0ʝFl t0< щ4'r `)1u`v9 c_F;|`M3Thʺ34&mZS6mlY+;A5+ݮP:" !uۅоH (WMwU szeOګhX [Hc a ? k=췪bg0ptޥ-"CY.N!c৬V[j.^F5cDZA'Pde"w j=IѝKu^/ʉM|U nft#&Ae>ŷ-q )UTY8Gt *WxW̳%*t!$B4u^U#B5Hy5ld@|J0 <-oinrHyYK@l#6d_i_/HgV Z蜠I s\Z VT`>nlE #\uzY*L ’ K0|.kkZ SGEǴI􃍲v2W7Zc/sg Aj%:(aف4c#(AgILŜ\*K]X^ t<Nz҄54/Qn{H`fQ ^]4>o͗Ylb0gznk IkRw4 !YK6[*f/3$2N@/9KkZ ts|'f`@&ҵ> 9J\m( z.1s?(OE nRl{]G[A'3#a N Eqɯukl˩FGLJ7BN8?ť<җ%/gTA]?C~&0uI?oY抛N/( GZ$='7qA ;5MC%ÍKv=5E =rCԑCطlHK̐PfOh_3ʭ.0U8vpir 6`!؂ %w ]0͍(OE^]0bӽ̛K h<.ɿJ tRAv'ݮ܅u~?LmX`ĄPzZ'}]); Qe/sяvy9nצC{JΉan (Ÿu%|"_MX6<7֕xR786>64MqQ89G^X9JH3T62#Ѷ>s%pR|p=ېZf/fF%o[q8Lk+Be 3e.BZx=%٩>&mwrol~ucޮcUSMh~viX@ATf#Pb,2)f׹K\{U(v@:rQw4yNR&Ұ1_pvgx:R>=$̕ Sou(I?C<&+ _Y7 PYaHlV/棧B}Mt{P KϏ U(_LCHi)B[`/VwrED,"Κ6~ՃV} s)!-']TNdCӫ~^R y'|C$Y6<]QfS=\V!s25ծAwwHDXc>DϧG+z#) ^ 1i,Tvn 4!<YW7_'b XO/R95}Sͱ P=6a܎@+J޶AIɄ?7o'y%:ͅ'5NJMABLS>醖"3e~Lv_>v/ KiyݰuohB, i3.\Tؔ|:%@$&z'Be4Bhz:ϋͱ;yR]r6^2У^~Q"n8l9 vFXlUR[9q; + 7JS_ۗOr`0 bLuY5]:S-cmad恵1B73XJ凳ة<&)*`G@ WtX;BgM+:j^5>@ M\oO֡VB%(z*Š-(5#9 @_7g :D»wUXقl ng3-֜%XQ'Z2'e]ƥ"W[:Be~ƣ!&Ѝ.[˩\bxձS"*j1^, 3fSJ9;EݻSx|Df]{h#l ݶA^ڑՕ?j1XdTi6 [fzڞAX n},KetT^T ~#bU.kw {}'l3)ZAPaSǸf0IeբwtIW0JV͐6MDS%1~L=*kʻ"}XU??+30lؖ ]PlJdإa`.Wa/9V!*m;21i®q&l/gji.۬ M2OaW_Ѽߦz fQ.a`d"Ɓ%bהHLXOe8LsGTʤ,tXOW%oQ ے!#=hv0rK?_;gۇ<8')(F- x"/o>IF#[FͧM.x~輘Ȗ>㡟qSUPRxz*.0HȂ@oԽ/1^!RfԔ$ az/nKdYhMv$9l&1ׁݕV Dy&I$+s=ZkrXF9oV'iI"lRpMx<, I/RŒ).p iÃdh9d]*Tw(.nvJBl4w աV>Ho .l0 .giNjT,m+}UŤ(΃laF*}i'| fqkjMEL 器nxxh_MMJ-#/kr *n&b;V\C4m`ijL/µ=v_t3ݞ nR%,+kz.wGT`H~s| (:a])%/se*"%e׮YG`00Ӳ+Hg%2/3Yt6㒍E2!3&Yp5^Z9eM99 \^:EkSy@j 7dNSit 3"<\<cH%:DͿ ] *H+Dܳ1&@5We?F\5o 9DO"Zn3ss0> |[Bc i.D.D]ĞC *mFX"@9{Dv.4`I~hjq{6xGx%c,,ؘok}<'Ң9 !չ>L5/XKylvSfZA`\π)0v_98cԛ 'MJT/{0ldObm˨lROXN*C` duzgaBh Ϯi8|VcͿ 4Qk?p^Y3i 2z]M0+J a 6=_&x6O+cmH#~[`$ B-ei[N:s&胹.5MnP7+i1 ~Ik:F.֦Q0N = DE^^O>76 c{'gΘ9]N/6]~kό~*Dr"t6c_9b_fl3OgΙa&J.j~Q .C!^~)Mr$3׉4&E{[l5\&.QFv @aKݪXTVPc@\&OD?18lAב_"^H£%:)MH F6OW.bo#bbAbhg.u +p]4&4#.q,%CJ`zsB&멖ƫgJ}GMrpJ>öezsX|22zUc' kL>vgIӤiK Uwm8dsPgk;"wBRsikF2et#0>U)n+YPPU`ܤOu(0jג b$UH C7q^ًbPoPцdYQbv-SCwPxE]@͉n-AAcAhu2-Ixۏ4"( Y *lx[GzT` <yy(69l6,d;!y?5y{&yO}8nI²~2y~8݇[J^`,z+!cL"diL\VՎX5|X@SZ;RDetP\-+ڮo ?[Ch$/g^o1keX}wϑ]RG\G ĎB_\wlL@`wB8d~6B3MLߜN졎df5&3/bƉ~6< iG nVN)IlTnB[0 niW\"1v.Mqv-D<G1RR\<䒷_ڻ5r(z2H59hǁ'imSAT}d@_J1V;FMz!!R+Xu|GmUEJ |w[¥죅Q[Ғ95EN||AƣRgeDB`'Np[k^=)Ji-&,~ÊZifMCSx tN0H_4 #xy-w+$/)CO\k/jԼ KnD-Ĝ794Zj&.n$D_3jT]YyG0L+̸#u6#۽/P>8[*/k&]LH@5)X#~'YH>0.eWCף,rVPq2R2B~?gKy8i J`MY1-ROtlԓWވܖLr  ;=O(/(clQи"V&-+K ^Д6@5FIHOW^ ᅢ%Anj|ΔNN H+e,؉R>dD0LM!)u9G 7{:ƥM=e:UFߝ: jFkIоQijhB/2&I4R ;n9Z9*tVYB~Ϸ3QxJr*[/}]J%٘UYBI큖\K}E!aBc@~nk2Y^3-bX;\ޱ'3[Ir$`De֐τ͉YUX yC->*}Gһ'*! ORط0|*At% ME3Mo; Y};rjn}i&?<jYV {ZD2 J['HZ΁s">(*8Py+ƳfLzy . .%;GV`LTťys2*rU+j|D`/;\t QJ*8%+G}꘦!4{+DmZ]gui*PLM y8gB Us}t4#G'MpxFTʆ&L~Io-his,Jӭs|v@c1aTބ ν8,O{G87ͮiT*sZ.߽uu䎜38BM [RPFE asS1`ج:D=84ʢie/ Rcž׶NX'zFm N40 Bg(~.<1+RRƋp+ #?;ՙfm5bktE$㑑t/sl(n l:aZcL@ _9,j^#i?jJMg{Nfç.r ;3̄ލwU:3 #$= 'pPN9"OQ`L;x E9AQJ %6IL`G37<>#d4}qg*_8WxIgv;K|N)ad Ns˵e}EZagd:yk07k+T&Wq3 X&H-A Mysk+xgIpa^ }hb'94B>X4+'c0\b=PfsNa\- Zq5 @ABEӁ|%Z4.ϳT꫱Lr$ǷWkmQɢu2G* "ԾxX/286 = dL+@  sF{sr#2^ M>L1Nyv|oF8_?e5)FOvňVɲb{teT'7t9U}|Ҷ KG\E!.ɝbIm7}^[^@f28 R qbi x asa{yϵJW/x%^ApedA Gj5X r׻<ڔr P߳!BfanBQu$GYIW O6"ڇ>Ӊhk >.\зt), s/z?#:'O|3{O/܇G:eK1JGǙfծ X( "VE˼Lx=S'G&TNn(a:KI y8ԅ(q<5Ag s-ܱ\&ck $LN4#%67=ɘD9Rsf'9 ÿs!XyQ8fvbxfgZJ3a#4by@Jn=K2'ϬvFP>x> l鄯sudA=UB3QDO,<~Bt۱ݍ(H{uK7['T|#Ѭ*.gqJ5j~}qMw:@TpcaeO\{2S+;)y: I(C ZaI>88?Y獹8h] F.ct? NS7'n\soRљ|IJ) $aɗyFaY 91;m3:Ib@k5@[jjz#$Q >@Cm!ً59UOF=bRwf`vb˞=Xh?gF0A!/.G.{)=gŇ0Sd97?ng#uSjŢo~+-8L2?9E^?+d`VSr~g ݃.OĺO~s d/)؉ 8a!i4G*<ʬ njl-߅JV3MD2*S'κ([5bj><!eGr8jT}b1A?ɞdjYKD@9Z-uCCR BH_Z9]L[LLŭBd>9ZJ,k!*) FOyE>kdKU4f3hWmn,75+]2)*!$3{k^ %-XjIȜRV{ac? ofo w dR<4tm|?_<+4k3=(CEr̅ӳ} -QU%0 @֡] NҺ,OTedxocg( ?"eAgLH->ʶA=x$W 8bV^fgƵ#b_k7'5mĔK䬍Vk(㒝{,4٘"?J/h\~k,h=ơ* ߾1ߵNJ|Wj|H@[Ӗ#ynfN&ѻCl0 N{eشb(Jy✩e _SkV<weRT,zu~F!>v;\ tSx-x;&U[L34|Gw6zyq]um겤<̅+jFM;v!ʆ 0x(A啈/ىNa@8[% .'Ӑ̶Ln.G`ބVCܗ"_g7OyЋ#n HfGج?sn‚S&x|?˾WxtN{az"g*BPvWK,Z7a |kqnEu Kp'CV]6zPg=Q=_$M zv9ۮM~cMfYx<si"[p.d 3YɈ4#0 bYGds[?^ƦAP0fQ;waU;`G#҃2Nb8݁Ћiqd Xl`: [3Hu 94 4if9Ic;As!(Ka[P=<92KqbkYy589itνEXύzu3s] ިz5{e]`| ) [Ë 31I|E7y;31ߣe&,N;Ҭcˆ{vtr 3pc{n4;A1) @k-bYVadWnч%s etM5'P:I^-.C`I,6~[|lȿ=<#XV~4VPa1fe2zJy'QT;T.sdF b>oZoyԚsߢ1á1Ȋ[{>{1wcS d4} ">1Ze´n)dDxęLqY_o ]H['#άk޴ϛ2Sۑ3aL~KqFd<<͙Wz Pa>),=RW#CIeRqgDs?"9i呸mY(=񛝐N!ՀjK63{Uit#]FAqJq%NyMM93xgbL`;'=""뼗\P4IO_5f9ak1hmU o)X`:ev(8X ~]&y /`7 "tsݚ @ oU EO-fmg҅ RGHbI u~%ɮ+mEP(q)fu_+3zSF1b,SY Z/Iq;Z^Ժ0J>z>!,ը3D5lGke/NR  'Fx)E&<(Ǿl S7e09}kG} K6)G=,+ ?D3{pkB1lr/ ig:B1ʮV*&Y*U:16ׄ@ v U5w'U[G1e!Ekr<8"<(DPGPx4'ؚ k=+&j9W9.xHN+PßZ2cG/84.W2ξDGdF!a.0$!wЕ yR8}cSi{v/eU|J[M4VKҹj8o~,O|mI:_iOJL,r0,X`:7@rlaЩ`aE&̌ʫq&!f;.f J@Ř5며XIQ:RIgRE%k6vo' R@u` ;y5Ī jAz[ 6d f3?BU6C%l,(OvBH]ʺ.W|2eи\ 2w[LB#.qzMLlI. n=-ٶc]2'3MQ&Z;ɘ;u*cx GQ gIv~4 UE6dNj qw춑`X8&a=;'uWx _f+Wvy[^ů.Uvˋ^͵{hWgFPΔt\@I 4Gy*mAz;%63Ì7#mW.6/wZۇL4T=̭aiLW/Pzh2^\FQ4C1~3M]+^,0RQ_xWؼnV% _LLa2SĢd)6& X>$xL8V,e lMybu!V&q<^5D}-T*#R,"> k mE?N9>uQKJM T$*H;:,bCV!F#0dd|FXm4~}2cqh`-Wg_ǔе`+$O)hw0 9ziϷO׵w_L/'&.fi5N4,6F_8iSbX/'-%Z+4=ׅ/(^;ŏoq^Z r!vEw3Rѯ{.m ݞ'' a֜p4d7D23k5?WI^ySyTd K1qT2"?i;)ႁ>#2pVh]vKѕ|^; W[\i)`a^Ѫq~g`EY B4\i3u-E>=^{Ry=AW&c~?jl ԅkȡSOzWbY-.y͈jԃ ;u%K{Wx#gE[L^": w/ 21-: P=oV_F Xȧ6%CgY9qй$UtN'{i={-)7Deu5~L76i闣C ۑ+ VxN҈M|K WG\!wS <7_]5Խ.C)Y( 1kF UHd0^4鴜 ,XԘ8TDouzovFT\Z Y<Z W%VY{#XC{8h4tgH5ĥ|8HJA={eq?v,zDXTMxkbˬ^k3Dj l4Dmtƫ[?J=g n~5-ogodEFi)K6kXO âsEf^}x%dqh`bfxɝc6˟Ռ&-tG+Yi{L}3{Rh. 'dxư ɩ*qvG-wh[<LM)uUG75K=oϚ!4T৿Ұhu_Jhm u=^Q2l3asq|E2T/u4C@hp46gˀE^i\:X ΈjGevmo_b8oT(,MZPSbr_݋vHUIq>qпdߎ[aw-tw#0[h]# u W@ "N#(&PʋXص# _7 ZzѐQj ?!Yμ!RR<s3>7Xb$iR0i8++md@ɩCL;)X"Y.NI"iګC~l xn ~N"]xoh_V/pÑr k~3{gaG y_qy+6SJpWJ֚ctz&+eULi9+䦧 s>f'v㎇ Ov-su)el[Y27-|pB'%dz fo'EwxL( XUdw rPq8=n9z0c% CZ[O 'UbʹYER\fww*!QQ}K)WMc8w~ERi'+[jR*y|qkz,LlAT0 *h`ɻ^sqٺ+WM7ZF;-K /: jhxKY#> 瞌$3^Yv+F%.ٛ~ v\lV.uB>69Q;o<fYk5GaO X:EaWkPT׍[.kpyZe謁[ګjPꨗ1C4-=Z\um3ߡ"㳋3zblA}请mO ,u7Z`I3Ro%Z B ΃SU|00$]Knj)wOJ_ocNw.rzS )Tjeo,5 ]wGnH목8˸˷[ǘ3j8ޥ;#42oWAh8^CӍb[k! %C,"f,|8{rbYvA9tVi{[l+{g%vg̛̤ٞ1CѦ2z)]9TZjՈlᅗ] +i{FdjF.GDSYS+Fxa]x 7i=&cZ?KǴ=L4$N݇5axҨM[ z sLpre1٨zTz gϥ+S{(;+{N_@`ZxTFa8Ӿػ v+ç$hal9{$Y4i@ܐs\?A\ѓYH!ѯ kj0v*-ŧ ^jI`¦G!<̡)H:tTF30!Mƺ2L7om ϶1˯u+x1d6F2#CY'˘Cu.Ƕ&^&#n2j>A# D⟖٣y5Ұmns4޺{;׭z\mr*jpJ4I,J-S8Gs*Fna 8ޞx7  3Ou_eD[}7OƃV(z렝nfN@DE8E^#ҦizVQ\zuәB]>P>Zxb6uK\ښ塶I} tA.yvi`0_[,B;L7R a?S2 U۵T\33*C T Fd1Ej<{*9q@m\CSkW܊NQ$*u>B_ǡP'WBNԨeI?PB.%8nĨ=f2.|6@MO]c1$&wFߛt9?l W߈ຟ+XWl~7㗃MG6:qRsN'W" yx%֪Q.+(lG=0ISI7_oɌ90v$N^`eaU8YZ:OFiY:J7<.{v3ETiL8˨W]: L۵fڴ'5h^L[D{K؏9NRP?\GAj'\f7Hr]0{{&oԒ P(Jų@o}%q?uVSN# ZNJF(8LM݋ʦZlɸ6A搬UUKa_c5KmhP82!v8ke֛yq1D!Y\FaBh&,g+^4hp8&hQ9- uɲ&6?xG-/{ $ۙ_TPR^s~ 02EuYU*8{]A]O=〺#uY4ɯ 4R9rRF0pPpsqG>5xWBp۠?z],-Cڎy:{s&]F(8D0*fG0c.n.بH2k(4~L4ېĉr~`?SCR8@C"߮5\[at3hHBrE풬`U:HhDOLJe'Zy->{B|啇iYqRrQsL@]zǥ3?1 =oPԗxn-)IŹ|A6 ŻS|n~,ϙQ0,K˪̙h~9[y8%a<3/E@*}C{1P5-EƖ6sqiUn=@PnTg7jhckT*720ïr5__-xPɕXNmNF%YX2h C՗X֠Tw/舓 Z55uX7( M`7q6-~&7g0LxGMJK=#Q1tu8[v6^_U u=$FJP\R 9o*4&ⅻE4"V7 al$8Q8YwA{%`[ *Ro^ [ܸ&`sc?~2-=vByRf< Z'NJ79ըIw4 ,#\9826: 8;Ki/nHָ&3oՆ`;HX?Qܔ9DdܱWuD]ֲNco- ~ _2J`!V Ui%gR|_~KHxbsT᧪E ²]!XNx38@ףy./+I铀րA$$j8<6? uWQ˨i"M^G+{`(D[[bcxfjm8%-U*[\h )u:ӅAyˎĥ[{x%?1YKoI?' XcŽS%,3tg=z b1$;Q_y.o~9E['r8IŌqcu.0;m!Ox~8 UA̱Ob s|ax ׌GŞ['i*/89nYo2d3ں}.xՀU/ germd"*gmYP8-2VVz4>QE!QwwurM 몭i'ġV;ACwCKvJxPHN<,+s]8hKKt6$6\{a-iū|YAG/G3h44_QhɌ&JROw16NLVu>`7";KG-I(A딏Iܓ"萏xe2Q֗5(юs9e(/Q0^IӶ4|!ĀMTZ8v ʌ%>廄56.C'C@pgWc3n޺6y VjqQ[拭VhbNÀEǎR+rp\2-ݥ9j^>4Y '~G< :7{qP[l ]aiL /׆؎'4T~EYT`$v3 ']27M,ĀQg {h5lm#4f8Ygk#8MjuT ,Fqe]̞_āu4߻0vz֧%>ET4[5T/X(}qzżGglꅫ_ruY7 ZM+$|26UFXn~ |A}oP9jW,zP) HQQpw~QoاGDH|.¬%h Qgeag6؄T` =@>U/&3e9EN~DPv#+XC`jgڸXf?Vώg3GVKA3l&rhQnoss1rb/r9] m60N@B).Ը6eI2muuЦkoTeSŀMQ|ST8%Ƶ DC?2*\ |ԅmu/DR;#b;=H uXMf@0?b\y3``QawqRH(jD Pz1͙XMet뇠=ݍE2a6\Si֥g5ǜ¹ :A;r)O{ K9RrW4LL uθ]UHho |V⼽f'YO6V^Xf<9˲YW%V}iשږG)Y,[IpR&}Q,cd0P,ܼK(e,nzɫFqa7=z3::]j~Q;XWFIc="lx4D/iRXdw@fǭ6R)w=T;Tܰg/|X*h8mÑρ[ZK*JH, GI$W2nr?IM`x8ڀgd_OƩF:ZH?N Eٕt0eWmp_H㹩@sSʤ`+YPcq{ ?ÍJZ$#ZnOq\8=*"\`$ꇹ \`BRX iukE~v׵10A0J}Γ##eL S1rT7m#t҆*vςl #"6:}:nF,qKj41~Jkd^~6lXb<(dy@ Q$Ŏ^0Jfc[O,Ih+& 1 %S,~A7zTڻz(}Hȓ|ew|?a{(HJ 5a4 RcT#vShB=2(he8$Vx)!fe&{]Yi,aʐV ЀDiSZ UsKOl$W~-&Dn_4~o$ P3יsuþQ~4MԼjHM=!<Ԫ]s"P_MMGbH{SvnltB[,Ed  eR)U6{7;9sp|U(P ?ٟl1h.lU1:NlWMAZ4IzL9+7Fȉ:2sEZ~#psJ"6ь끑i\J]?}G)-&pl+M]$hFnuJr}#JM49 K;+yCfshmwIh^Ss˼_ rBM]9AbWlѾ`= laut)*+GJxY`y&`tfsdLjΪ! ҍ/E7_Z˔@v~B] [wm،&\^D<ӀOik*7Upj )zSwpj9m.ˋ)2A gK @뗄~TeQIDyMSR|A&oo0Mdz h:6;fޤ!~y{}BtbAEs/WYWk*{"b_xts!R)I /q*4rZ8,F؟A A!.%وM{az/pi:3ojq¿YD1{HXF(p Z|w{y^ =۶>-GGK6q11b'sd4@(FJ99,ΣwQJj;Df}_aJK}զEԷYZ:yYs&>7,klZQJac >Mh -RJ8nHd pѼUU7j!1|l8 uDf|о(J|6Dõ%dwH~_b53KHX9 ;Rւ'4D~ܟ9&Ҳm2|F+&om.֯#ה?ѐLˢb=OKË.b^UYLZ\9-u L+8s-GU(ʇ9pmkiWlj~+<jbwɺgy~O3[(V0]`> iO-l7nw{*}?5C|R$z^ mm~@}B6YwmM1'rg5}[R"opș.Dh'(>O򘝮bO?/t@c Gr@`?2"5¢A,+Ođ4R )x_cc%ac'Wn|厅g `$7HX1=mhgqykCY2r>ЗUo{a5 w F _ˬcoV(oofK.TiiAGPZTb]n+)ۥYk0=Զ6iiJPՁ0#>DNcJT.`4(1g꟡YK\(f^jOc$jF<*%:iXΆgҍߔ*D$tȲRu:OEr~E*f^|Ak3O!$,y4=עDג- h qVaڱ r9Ñ4J5;'LrA$]ӖjmJrݦUk7v2=܅P3J<-Z`S$ieUF~З+k)["򘨩 %C m;IBx$#2)X*Ƚȷ◼h?,K|tFg4TE"]J壪Z#3bU9C|) 39k82^TG?suHb,jyHB8&M/=-1wܻ)v~cl~ +Q K~>ƣ-ŗ834Ӆ}П*kYW,BKe"|j_J, Ulaz~8)GZoF !+q)ncn^3g-RL2PS>M۱LqQG,_s+t`8Ն{ @ٙMD=5|s!O9j'$?/p1eud '͎4z|031?cy#P6 A\M6|'?GRS|JS.,Z5i<]#4 <`3\ Ol?rMPedA;^^aw=C,a_,?'QB/ i q]e56\Vr;&Ӝ}σTll+]nWP"T)')#n?Hw3:m~CgB=FFxkTmg,oEͲ3~HR̃:?"Vi[iΆ. CyNQEΩ$*$ê(+<Xɬ6!T 8X\mX`Ͼj`- n|htPTT p. Gz^'w[X=#RzT{cme{qr{xqb_ʺ LtD3=a=8o$5D徧du >]"ӪicYPg!鸴-]cW=hIot!Ώ̖b&LIG)|yQIoQ==$;.3{iehsO6-]/Im'F^=H`;bHCV0$ZG 9aZ YR) hd3~v7)Ue4'4U57cfw2+âJɽ4is~ilP+.:^EJz3±p,w~̞1^,]s/,H#[ ]؏!xaoE3%o7"X~V9_YN/h.\2G;ݝC}2UoǤOzk(t+_ʖ۽љvg,筡"iC0|4G!vu]ۂ6\EݿqKn+7#đtaA,gF*IMJbRHxʝJ؁&Yq|)T?915 Vj6d  mmF[.-RDnPVf/9\]v5"0FJe[#kR']nV_gFTBp_ᅇ/ ϒ'w ;OFo3Yۨs \z 󴻻od@qȧ)a&XY=Tcko3]˖ՙH)_#A˒V1_Bwy_"G7 [YoRNS4"L[/Rq R?he>&c15[[B)$NbR.h6Mk_ Zm~QOmCu}'oS t|G[& qLL1A T.%wjjx@#dTIrE׳59VsD]rҜo oĹ8|-! k+兞sswBu+ u_&\gQ٨1+Fk&V-cm;s=܄ұDcHG|۾~zvr3vț būEpMfF$šz^MiLԼa3RWG6K gf6?ws|X/QRDUGβ8kErc,;/NN–rC>))$9߉9!m胐3%1J!(-az(U6f@2{EsyApz.B_nՃEUu?Ǟ,d{q\Wx:jK:N?ݐԢMҌ9wι7p=O#0hCH {+$6`q֟"atwj;q,WP V"&`33/ &C>ӠE]_ hEױߣ-"ب@PI:k?2sHeVYNV[>"x<1Vlx3im&"j&ڶ'E串truXhk 0GN*ݩKG7ȆUygKt%=q'3 \z԰#CeIhn^_y${}Pr  \Rkb4' lrT &% ~4 ! t ̭N.S=Bwa}ycETGp*tm>=/ʥ"ޡz뺉~a1;`Kk֚?ʳ.Nq42+9=KR+r6ňA`?iĎP̈`/d AM.#zy%?R/ueZ-yb :FklF8x6u{{ 3MJE>XqYBjȫA[TZ:8?ꕱ7qԒ@USrxApl x. ^i*AWACYs>~f 'O~-1sTٰmW U{Z>4=T ̇v'q| >d` !E 3 R;DXz؅)7y AI~[>JrjxSdK, Fè}nm' W0̔8DDN*WO|QNwcgtR7^-L lqD !D|UHvu⡺moO qb:]lÀz`]H&ɋG想Jc>)e5B;qJ $&(vD6pc) KbLN ZoӞBOQ7:FUd[)7!)yD-Lr-;G-2~2넝RΘ.-AP69m=;<0Tѡ‰$/΀7r-$e=QXR^;z<(^( S/%2/`=?USd{Pa{*0Bv+ʍh88ÝhDq鵯׈ E. B\xE2t41.=+hV)wkVxe{[bc}6)PI&A}%)"Xs4 Vi!߃9LKu}XAE&%Uh0**9VaRδ8H5&;^e'6" U[ԩP5}>VLaFb85kREx> ׈ 㚌TjS(RÓ!"iR\ LuHHZN"8COmUn8ۨd4^L#Xd6m k?6L[ۢ:؅mH#*,{q3^( v_X8S'аe`iiVb$x ~^|JF,&_L7]PSPq_{QVPf5+HJi,! T>ygC>Q%jkKm0"ts2Y4FR ,bīSYjrp"5dsV-gw\U4}'fUsI(mk#:% 1tރc"u6wP6P3' ii,0*[NxQL*lf@v'[ ?V2J:'0m 1 sQ٬"r8UHѡț*-LOwQ*K,eQ*ߵI*S w#%U)yaL!nd7ѡ|?S;צx vEKO L?e-vR G<jof-*L` ųՕE8l%J[`wܕ1my"reVTRIa:R&͛9bXA٘3؋6 ˖iLj7}E$E(1-}}7ΏMQpԎ)9{Dko-<-&Z9vӟ 6ȋkt <f4ۥK)s_ ?Ԣs +~J(GHbAƊovE hw0ތDC(QFU@qA漛̎NDYRmCA4y/:H7V !`D\q~nN"ЛT2{y*'6@tgi,WDMY- @*[,`_rTEh0xe0(bA F 64,O<N#crz!#%SsڌǒzᕄK.}#lO Z(ށ@9eg_t"݁az=Ks=:t]uV4K\5sĨ eA?TLiR,B]x ݁EH ˮA:qq\c2.w"ҩ.ݎh+.2su}:um;}t6[|xVvh].#;=]׹|(8,& f/k1;k{;4a&O6;@c'5jl\$7K;8~!xFiJ'c#S+DKpC5#rG`kjs.^p]7@A5Ϗkg/mfM9H*Ut,5]Z& 3yBL7c8(X?{vR}S֕\&ں驈 ~qg `O{bt U"%Ù8R?B|萭Vڔ&D.d؂EjMHI),2zh ؎*aN<5ɥoͽ4CІgD\e7ٴ8iSx h50)?ͣ稯sb" 0G6*:'{ZA މ lL/v4mSj5h׽|dX H>nBP`BDaz Y1̔vS\T@ۅʱTxʧʮKD; {\Ղ lq"zR Tl7&ݘ+NYMr;B?fouSf jO?ήĬ$}JZib̻䞲CU Q! \|IۖdY?/ ֍Ādmn1 l_ps YvУ~_st6b0(V0[衜z%@, mN5Ct#WsrfHk@b$~h[\& VdxL7xh[1{[bgZlC-| >a‘0/5UB!}eD`!<S>jƥ ;VZPMύ4d"%.^шEK؊oHȁ%a?~Qa!7B%UFØ1V(ʥ@}}~'y;$7ΫchPα»EiLV@Su+1}c )LGk|Ci>"^sM5|}e%t9_gˉ{i@ /+Qɺ'\89/[*Pc"cn6 )&5x]@0g$aL;Dw,f Է@Z UF?#)JgE7аK}Ŀ"+QԬ$Q\EiC_\`9b[%q]E1h<"1}PٱQx2O+oFv m+CjzaXd̖qbmUR&;Mǭ梿lGoG!JGrj?:)wc,WZ'9H=o_I'GH$ O6riNUОQuGH RI 1)43U;A[gIU 䝈c3-83.Dhf9.?4\IΆg;PId|(R*QU -Vᳳz8M")ob܀s˽٨iѻaWIݒ~Ip$)\KgjRP\;7CJonҏ?5 s>8i'O6unuYN> d$\3@; į%AK(1Y1SDgoWtX+I35Wh|*AX4{Lϩ}2JbRlM\p8ja#h1h#.PgIwA=K&9OO@AIba44q̄ZKԳ`eF+Jaa}5(H倒y?(K}ޢꭲkI_3N:gxؼ"6nXʃ.eGjpmZ}xo?]_\Kq]0.^HW2݊L[/]u@%PMI 8m}'-(> Վ71fB e&'f뗙lb"wJ+48 xG:ɀfkD>tadx13kx^L Zet 29t,("7  4A>z/aW~ԙ\8y[ǹRgnA变[E)D4lqdǪ|*G>E~.J@97)U?Q^%րCGWQR.tH.$v)uEYSn,%GuDljNz*{#alnY%6yׅmVTOBҕ{ *7DkzSs<mKg7Gsl +baֳ|P]֟^Vd?z_ q O%r:5o li!Fv_,pBK4%JҀn]y!ݭKC~AseV]Ȭk ;Qi?Y.SYP27.N8$aI|fQ2lC]bs;sᄃn ោTW@^"y/B>;˶6 Kmبs81_`sXlb*bF/[;R@3 seRmdpcN~:u#IJ-Ȥ)yʞRAJg`uuJevGZ\$p*7'_󼱾JU ׿qp)GlhۤDZVRp0Qn4"wJr>K` O1*4g BM`TEznݐ|embJJ%~E,Wϯ4 d#.5E5(l5u*dK}5T/ݢϾH4ͪԇ7"qެQuإê]0Z`ukT<*ϯc']_,.>t׿ kzuߥQ.a7)3u#X_PhI]xmr]ى{h6 A D3l- 9nn1겳1<܊ĜkYMvXzO&=%%/„}a+rG6I{W,E"1"4`,hӀqC·hZ5Mi9 i'!K44# =۫`:LĪ^ ڂX $⡵.k ouvFJדQriz0,k mK7>WOWt[* t,<`J\=fiI(n=D2a V -٘\<JRl=դ#PQ"JL*u䛾rjܑ.kF+za'>Qy':Ǚ C3+bDP9Yޔ4P?u9\AE1l/k2ňQ$+[ 7G{V T_+ܱO`bPɔEIddhO3qtz9Lipq[Ė, kmt󏧎*ƹ0I(#(<_]+7v*=mWR!QOS|7HzE՘ a3QcJ*Xq*wsbz T[mڱD/ 1鳩H-ЦLe zd8EtG>f;o:,>*phEBcAv |i uD5RMBV=%=QF i&*N}}M|{+QQTm4^WV[ˡliSrM1&LT f +e#Ün͛+״p[ќd'H.9rr' jpXL1?* 'xq ۂY+Ya$]9T$zhl$WMӸ٤Nd]^dUo z[3#>GU[;B>n NZdSw ŖN*φu.-+7zC&J){yП*Nij:. 䯕}Yg!k:%bɲ4V WW*77` }>zn/]wGE'c&K̏[SY64\2t+$B,vKDc1=Qr;o@V0cu^'EpVFwԝ8_yD#>̰SE*(569V)O)vk\C1]So@/mH%}G>䮙l-Ŭo s]/7 K*נ e_>ԩB287kY8` ߁oh|I l喕xe[dKםմ`Z(a ]/zfO GVaezU/gSröy1$ѻks=W@GCZR2%rkyFWI# TT`wzrc)$LL"_tn:r@!zGyIbIDWC- rIj}bf9PD?QsCbml^iW-9Eџw5. a Tyw2`>P!&@2jZsѶy+ n(]4t\j&62j7#r;<_vB9abZl?gJVTN<_O(3[+#{,۟?LK N~j+-WRsBҼ\D$@wctwX-! L}Š~XsIU1oxvLp#[D+N)H,%j}d K 1S.W`8ZDxzszA3y~i8lG[&$x,MwnI r{J8R# ˆ|㲠ɨI#F,)NNjT :t1+ebKg3o6i]ohc E犮,? &CLAC-X 7MTQ/$/Z! RjqgGrn@J&riճcGQ iqQ0eaay͹P,5f[ԓmŕdh 3\DCEXC X"zPLqf蔓 "I4vłAA%kwNo׭p~.9 fbo$"7'  g'ٝ3W3|pȩVY$ ǘDZր?e;QŤ>oi+vtb6xѸv0 tz6Gn?ٟ )!bmy G0_?Ǭ|W$}1qy0(HS3궫%fBtu6ջГsWh<(,v'w~Y REo: %?V AEVqD{_Q d[? >jT=0͆Ccb< gYY mbF`vb]$M3i$6z񽃛{^ݡZg9ыNQA$@ {\3IxNRIãUa:ZeӺWZjǪ,5 g;•;Y8*(U|R_W|85!vTbQ4->IvJ 4碵tH=PHգ =ȉ^y8c}xQ>HF]kT30VPL݂wab%,َ}_yuyߛa]^È hpZO%(/vxgFO.O>' lpb8rl9mNjY_~P-rPV#ͤ>a%+!FgTY\ToG4uٛSYeU`j̣a{LnuM-H |i,EW٧˫ю1_6_͂*$s)LKTh2PlϨY=KG(w2<3E_UOF2()%֥h5:5R,I )G-Q[Q[=JC񈞧l!ف)h1urOjOQ#0`R*cWubF ,{??`찿i[w}t [yK^ \8OɦԷ 1kDCPa6U#(K˼_Q2fBrLd&rZ;Po8;R*2#AbE,&A|!"ܧx!}d*`W^\UT2uLq5іȊ.LLL q?# ҘWBjط o&X#4Q+dn-vOaקU|X 9Iͷ@[@SG 5 ,;A`Ɍhf5Wָ^m-ѝsgnmwݳ\&,qxy-)Q pZ|J.Wg\6 "LjM_b<([6,ڒCmL ^{,sw [ ODE Ȁ}Mp(eBIísktD+__|qHM TFtҭD[ 뒟>:Vؓ\-!5|c=qg fW4pd Ղ(TK612e|k̸]7EZf6F2w AgTKtT HAhJl%.@LO, lcaf8Q@ox+J')N<0)8BmLTwO=7. ,R(Fp7D B,ͦc+$7Ɂtp__e`"Y{8g}#V~1y|Lgj9ݽl9|HTޖVX6!"{l<'p|^ټ*B/cj96ж=V̗= 튴^+b:Wlc Ƈyl_Y;3S[xjMMSc/H}q F)m?UKWos}Ԧ-H)$#jR[}H2kϑBI:em)eDmk7R~)[mԺy,Wڰ)U.ܠY[ JYscdBEtpe,2}SU"Nzݨ*3T[UmsD1A&6@EUF&{kmdABb~4鳑>IA_V@nyZ3B1t0ys5& W%,i;Ut .p4ˑ@genmzq 7Sn*: ۑ]g2UU!Q,pRJn=3fllpJd& XGw^O_} *|qf:BjIr6+K_؊luCY[/ߺA$4@|>J3?}ɦ5_l0Jn;stZb:5VvT y!eO"F?PX }^Մ܋ A(&:T~V΀ϋqٺk.ҢD~EƐͫS%eba=@|ڇ˛S5B)nN?ܡei_DTIF\!Dg6v,@& Z½> ;&ZUGQ Ȏt4l;j()*xw%mEP`B.hRHA/%-f Sd\|9}8dX#,)ݹY5ٚ{=zahQ~)KӤ8"'mFu_-e%Cblq\{1az2V-rB SůNwWYl%LX _ Y*[.j_irWE~Z(ka;\< x81HYLwv.{)2 8=8e:bU46x|UC:yM( { ie_? 5Sasxdi{xL{#5 ,v`uE{c+.Dut%,rVG,:e0?!8Fm&v[P G3[ $X>aK} Fn9돃?A 48A/qs5U6׺`g⟎C]{REj7 `[tU~\#\@Dp gx<o<4dh0n_ߦ%cY< o5s"YqM3#Se~k]6a0a1aOna;"?ZY=?2gJQ]u6/P 0se)N`m=@JbI>o 99{a"j#] '՝tTt X[?bjK/,^5\TuPaB"Qt\_y/_ յTzjYI򚯓+ NJϛs|n+EK` ]rmGI+t01)_y>Co'_٨_L8 KRs*447Ѧ0To+8*<+%>ߍt)9$Kq]śf)! B޾C ^16>pnjP)g53pp&@:jnF{#FS95Y8/jnlh+mv'tn6A\8np/9j^#A,+.UЧZH1lt#bPTbRڙ3n4=<.}`|jb^bۇUM$r{lyx'wT~5ӽ5WxÓu;݅?3槣Fx/s-|E/x0Fh0BP֘Cvb06RPJ wU=.Q9Z<D:>7y<ԥ[ʻ3R mRK^N`H>.>?@fۼ 8 AQ6VG?OV^2$*RΈzk D;ƈ9aTOӢi- i~s4kFU-q< &* WfL3猙I3B@cHPߓoQU7|JbumR IQl7v"of*o* )mPU,ċj!@/Ù!/(q[SaFRlg4bdГu|wD/]hCIͥH69@vX)ɦqG7W͑H[POSYg]5`:"BAyi=50lb8_Ep72 FKġ3=9IwGȳ`?gXҹ'q̡jzdP n.OͩMadjb$"KeX.;.2Ӓ~*Φr!,H_olp$֢B.NإJ܁R."gՋ:K@Eq(Ӝ=I-|}ڨlX'Bu7&]!̍OE3|%qWD\N鶋)Rd~'1]^){G&Mp*w2£@<1OvA-+Uɝvq(n\s&t;uHhs L׹ݯ\$3[ooz\$I'-baKtFg)Y {͡A#`@ls!}җT~3kf\!t~qFq#mW4O|1K3G'jK߾25ad5@*s;% . J;p5 I1ܵf]9VnRmfI!V$'LeT=wtS);#lgɲ-%\(IĠ`ubվq^1( ?!(1>f&PBX.$)hv!Sڨ>@ <8ԟ5G4 j{dJ-7w͵cfPA?~2<,g>kez{F8""0ͶDM^_h2~uۥB /,٧ݖvо5 pABEƚ!,SBO-0$&I5BUw3JsIlgJOOSȉH.\2i !SQf$;նgy0)~@ZK1yʹ \~Zq/ʒuðl_`@ ɬ BI⯦0,)SӦzshle>ElEHKuI?{NPg@ɄQXd&LiBZJ D%fk|I?eWQU6&L_'m3QE1{ּ;֢ swg5G[DFې/5H@n7AM/l-d1ߎgsEvՊ|:0xa ը20@˒rw}9Z訹܃Y]b76[dEAhƀpDP[u-"EͅhE c-@.ɢF&FE$OܹO-R4?Ms:f-necRgwo3P/55],[+6pT+wP8!  ?U(.5*|yY?2l`s`Rmm"78atEk϶@6+y{8#I@V|La1xdžw ,&p_5|1ȕb%Dzv_9҂QDy:x{tpahڀaӋKoJg7/|A]G^] 72#0Eߛ3OtQT*vIW,j&+&x>SyhbcѺYLe3 5L+mbX^,1&Uj8Vr X[K:7$$74ZriV 3ik;hJ:ilBhb%8 J!%@GٚspXvy/C'}<G׍ ņ5o Ul&sSG"fRAjTSYvu\%l4N5{ [Y  93s<׮?u[:<ԿKDL[[<ޱ); P8}p_r ɸں[!0Zo06.KS˅$+֚9ޏ).>ה o@V( @[ǦH. +L=OA9 Hy"3dY`?"^QNq@YN{"hճ5\HB>=3ʹأ| G 03~fs {Թn*7j!T'A2wnLd:!I@ZvGv%Sg[ndv\wU)<^et8Dv6). 5bg%-Lhj9Kv I,My{.K9.Oolzԛ&cmݲ>?Ƥϊ[*-m~JM4 7t{d;a }EI))hT]x. tK<2t~C f՛Iʳ) w2jIP]錅gWTG!2#OIАįϗڔh,-@u)kL:^&1r2`43m?O#\RLQu|.=}/(<$oXvDjՒ/D2M|=̛b L@D_%88=cDa/l@Ẳ?ljz͏s%R ײf~$N'IvLRc-ϗfdwppLlҙFV5ueT8B5cגLy2-&7&[ kTlPHβ2H(u R|um`6lE0%w&ǎf3LOGl%eݪ{=/34!9ԧe`%=9P+֍(B8^<3Ct9Xʝ{]Dz2OJd(L\J|8Gqe{ok_6G5(h tyPJYJH,F#ʷ.h=\T֏M5g \!3nΡ@DKiQg^㲕wWp+__|{ɜK'C vv}B (p}1.|%\:Ȝ.PI񌓪D+R,9ʫB8FQHCy|I3Lgsnt&.w!t,#ŁzHw [Zh%G 8B r!8VRp*1xvsɑZ"J/yQ:#EYzoVi'J疔b8Y:K3k\#k `ϳ%7:h5 8*{v ZXbp>1/ ?5*>QPZ_DS8˾{d YxqCC7:@10|JF0I/ݕ離"CuFy{\clDt j # F|c5z7iqa/L$'Π' m( e|^)C L=V' _F +83I$Np/2ڧ=xw\6cu  21 dZ/+{[KArBé d`=v.30D 4-9lN Ī.Rk?qpT!' 3ǏV5#M3ǯ`[Po˝1nu<$ z,AQ&u{t ׄatl')W|d/$C ЭVvqfNG"Gٌ0TXPr[ǀcNXӶ$8(8}WqhkJ.ß7f-O?6xSeUQ~=a*$8,k&rW,þ A6p + &;̤M9iN6NڞK4,齭Kft"~í9A2>-7a +a,%g8Lzmwe·~#ߩ ?Ր3(%OqNR5s(+a|py芮0vǂO($ߧ^jp~[ėV~Ԓ*@9qV_a_aFˤ0sd3l6A×#kVfr&-xt%8oȔL|y "n%q٠<7J3kC4Oq? Eq`6<ӢZc{1>V6p?YhmVi4~0YV%z`a&hÔ빉g-gCaL:+ߣ#.(*~ j2sMW{4Nl'z=j% "]2D;(u3V=#N* ˉl ,;29|9}| \ '(io}eAX5îk~pDum|ZO! 6pe YW+xnkpkי́y#GFf+q,6)-oRH !Dꜭ$Rm۾%^`I{:4iVI5a(*g~ 3+Hdt `~Kfs(0Y ?a(\jfH$yhy$F)'Aѫ&7l s;,@?[Y(LqZDY¬=ӻ)WS @y{bQoRt`,0yZ0HH]Ws_J+⿃y־:^Jhf¿wy3`%#0-gh2xxft3٧1+f*ԓxMd+P릖aѓe5B>d.h|AFܩ~էZY1F!TK?&޺){A{%RDdyd@:X*5ӦQLpwv bIkyġphja_&wP#/y˭YA53t R:P_?uf-:OM6@}7'"WI[-w9̿z,FGI܆ǧ-H#Wd/:lzMke:!M<1~Ɓ#gӯ0[\303=@'7FVmlY SMBf;qHq;+7XyDT}裒#^Ps,n$FYq$dq'F0pM Ĥ|Svt:/`]ȂCCFR.ήn{f - Fx"YV5P%;D)[&\]_.E˱: i9EݣڻG!5b{|L;+Sz9MhcXcpSvfO GZʹ ijs qN}uLEcl#K opxp}hQ}urW~/{+P8)jQpQ1Y>/`R-}5MGGT2 9 0|NAq丵yAgߒb[}b0H4ocfu 2coͣ'n p5kZ3ףFETB2iRg -8L9T8wB?T񟡬I?p}BFO Lc5c>H2}~ks"1GCw9?G5T_;7Za $`}p K0#\x!ohWuy5'a\s̄؇Yxb^/=[c4P]'x@J#X?Ny{EfG.Xr@4iwI U 1绲gz75fsc!Ъ\>YV̛@[h-?^6_:ǘq TU7k&*a }|[ H剙m2Uq+@U 9\Z`IA>鍭|[ڡX3pg,V5Q=thRJѪ3Lm}A/0$>LU[0nv^vQb @+&z\ÙYnmT(3?0u.Z9K }(O"IqPݴ8&ϧՐ3cZܺգjsԖLrX^{ԦH]o g5ck4**q]ֻG:W9X K3&N' o}l,ơoYZNJˉ4@JvTn|71~]8Fa!Omg%C}7v[bB`̯+egr 9fլe['\8 f}(cJm Ԛ )P<^UU1&v 'p`"nڣ a=A"a7ֵ0x5uy `0OkQ:ad*{DGih[|eм`1W=,)%zػvc_ TMH8-i󗣹TѤ>q =btDPH=Iz/_]իKK ր{(a 19om݄F='#+P]Ѩ GTZQ̣D pۦ*$ \K?8@D$+$t &>A(ae3T5*CC^z[r+47c!5@~.nCm2 y4m&Xt$F2#zY~GIp >(6Ay5%D.<H9ӳ7<h[H[`  5}^0HlT | /Ѧ߆^cm⊈ȄB"Չ"+ F!k8ԪNW%M W7C4vCl}J'˶%^BUB} HJ7 vjFbnT"Jpp7'S C DF$ Od!xU9nhLrۅYLد;*@[F7-δ08 T<)ICϬjii\=# 3H@iٵ:)_-Tk d O\_0FJZP3qQcs9nѭPMi zh`j Mfɢ^oxcĥ>7Q||m;{y`ͰrcD+?ZW8Ͷ({N* !] ]7]bJGVKQK{}70 FUQ_M#pY_5'|wp1!fD|Ä DU48E 3 9p~ ЙSھ)1;C"n%ؿZVܴ <{l}@Ιs{m6G ^tB\ɀT¹@֯Bdr{6?8M äa#/282ix1U"cѹ]a)oyd:]0Hb 411[?(!X\ D' n҈}vF0۶3(YÌ~ƣ ek$< 5O-`g !ldX@Z5r2c'ŤD,Nld񶆬xʇر׼2,EgaNFCv /-w@oHt.euVpz $<*ύ01omq? xF-8̓8'ډWh`is(~'ƨ[*5f%Nnic+d L2z _+&mL ayL~9:0sUPF16szEx^w#*-^-}EfIȴA(ɷ _)gVW[]^VL!7EZ-tB(['|e+DƙKORǡAAkhZ|75^Z?=w'VMP ao@{ݿ| 愽\ K5bP h~)jͮDa~{QcKZtCyoǪR'jt ࣖXD6W5vTtօD/R> 5S5dˇ+ cx1Bx7aKHԫN@@f\kR,Z*+d$\^U f:ܴ^&5:\~gw>^#,k>#OkYZcٶI%6E]úka<2(} `PUrkAȁz旰xYKblx\-dAEW&^ʪM(*X/97&ȕFr#/geMlnq& p0릏9d~{ȫb ߱{嗽)-Hx*Kl:&{l*l9JoKC&Lh6~&@6f$^: v`7 SV $eu|v\8Hs7T*)JFL@98aJI0ܖM%rQ(jexJNln'reܥHDX@2a`<2!͋9W̳/(Q{M߫ERh9o.NV,XDCjю KFq(Q+fѭj^1P+ ɎVy$ͣϽN!s̚0e,goF >9P"U|ʸ/LBQ#5E& gƷ>C3 !.ְQGG _xD}+Jjw~yZW6@]G7ưh +آNΔ푥_>5/3t?INFʍF췊fl+S%'7>@ȄdAKf?ݟilRċ23^؞7 &3@,s‡C2i@Ccww b=XxsJ 7w ۰,|o;(:0jXݎ"w  7/( Ge'Ro nhd4xC >䋹l'n# 6l~z I2 j '`sd \Pgg57컀qLi#"228-I)G{μ1%X҅ /ڀ-L~ 7ڶ;B$qKJg9o/3na#ȧf0 MΒzN1cW@O pħ2zvĤ^5  P-%Li/t2_a4Gj+}Z=!)7+!ĸM迌J7- l:&K}'2<#b=E萌g=͕]٭8 舭A}~+HP`No5>wٴ#" i8C9".:}&Y<[(-Qu1o\rQ :H#T4s[!p;@ `;rprzc H?R=)E,&<8%DXc-D9xWGo"r{$a½h^Xxq&WtCgzC<|rE\X8~#QC<z "m &TP4b&T ?&~tØ?J@0V̟/:O4E$d3MzTl)R S |. wgvwhȩ6ҬRfB-P*voUmnѓ*w{*C̓2RKhy0U2UhРs'}yMԘY}pfjSD)⧝%:8 Z3QO\C1dHJtW,90 -޲):=;¡|J>pC&fIG)'Mzu"i<+pv-`jƤ' dQ)F*/p ?<s %ؖx!N @Xuk!-A:fNU-_)fp@UGhsoxcK.P!ӖssiX}(٬E8PahS)ߣWJ )[t.1`9V!άn9$|H[I<蒼|$]-6\qR>@Ö>p {!Kho)/I$xq: rDl}ڣspגsHTQ~Tfr8:5WV1NROM""pfPz~mf٠!ҿX9TVY5vT*ѵ1Zk[868f,C]+Nř({d<}[I[e'%,7VkY/I7[{ƫMTz~j\LZBS<=ƘMv7 xju,3XM f#bVV[/onxxJ}NNam/!ʋj0d;J][sճ-V+r~em@2d7+*@cxօh_ׯ^9K1'2ba+ʭd𨨁&MAJs b,&X|_Jhy[D'\.|%*5C20G7d8ϱ uZ彝a76 zUd1#NC &S<#85~ޟ1ݗ{xKk1AO/t$1m9?1L_u+DtgH}ܻ;l+{I_^2 ":Pv2%1 cSJ!2~׭ؽ:ό#F@e&G)xywOC*5fG]}>IgmA[ZݗSDfù*,s0)F#wAaQnop>`zbxLWo6e!"wʿd^}CmX˄#┚u ®"*q?N s")WL"1h_W/.vg}rw&) YV#q~%]hvvs,"jqrNدo¼Y][mFě?+^w+SiUω-xM0%xՐ"͗ZL'KQ_|&>K`DJQC9"g:Ղ *+zN:KEeflU+-hud =CwK~Uta u-r><þxV2)py,( #IFbY'*DygUz.;Q08I_DZ<( ŵ5C;Z@AO/сh|.v྾p~&bI;Kv.v5qwC4/?6WWoݎǽ;1R ( _YN&Hk19|&bjx':Sؗ-A}IXz’0 C+){΁ܡz۵SbpenGd\q6Z|LV=Dݣ4Aw3T^M1 }Bט ֊Nw+K[F&2d)aq#IE[T+}OD󲂐'IuN;!l$KKz|d/F->(xsI24lȄinǁv [ݻ;"\+mm=\H7r $OE{$+s3)v,5ް#\?J?&RL]}/@H=\{gFϵ=IfM:Uɣ8H 8APqGCH"yqM<<ǧe[g}쐍M( ;!.˦/rִ.Eۙf`2zQYT6^C\~jy<*"b]4aAK)p-;ژё0xk[EiB3iぅ KscܔMbZDݝ0o?A QAXCģ?쉋5QNjX[jDsXؑ^_ eʙxCb$ CqLB/o40Qr_:3}^LT;Oܲ[sO}OQ #CKr6q=KlQV4~(nVԣZ V~OW"b) `À?Yba]r@|mV[7vJ!M C&ؤ j<֦I3&Eѷ7-)&@3!-HyuQ&#Ώ0O/=A'˖u!&3ѹf5tj &Z 3XF^~؉p*=19A b!h-OVIIU‘kɝwE{Vt噬˜fwR03*1pbΧ p1PK p5r';~HAl^'(h%5Xwd7S܍,MJdøY6U23>y6/mƞ9CkVOH>͈ot40nwŎZ#WOFtBJa[떊:y4t,r-p]SBнg_82zj%xtg)PX7?qgwk E;@<\~5OxCv3ۧhx%5 ;~5.I&F49/A'Ƃ VEM\گc嵇/)9EX8-W˟S)/Pe\tyH.:B"|q坔޿;J)s*jg^&-Uelb~$, KE0AؤKbrQ9kAk20u(vYLb-y]d^wYMt..E UXo/Z={8-nڣ|FtYhJraAMʽi%ZN&h|Pb܋XE@Rb^ϴIOs8"w 2 1|&kb\b!XQ*rZ)a_ým<.. "LͳskJ4끤 ~[$8u.ESzxsC䳩<teC j# Xp* ^ PN(. Hf.ƦC_ - dPQj46{|.SK@!rM]dG_nJmصçDDbS7{-u=l L2R7Gj))cAM?4HK^Zdmkh)8MZO aC6ITYpvs \sPRtLfO] ='E2} sZ9͍&l蘑oh[!A46'p8g||3I$#`B^EcV=̋ @͕O~A޷9#qoiC9Vw{RBlA)nBOJ>X X!);ņFD TE=d]$㨮5q>=L#%';Nn Jٔ @++m h{ tk<;PgP}@fc bJ28u(<\\kcq!)vUx;xj~x2EC;}CB#:9#01 I׊q'O~ӗDUY{rD,(boL$X}tأ?MGE;kr=a2EE?5VϔsRMgA^Rښ/Md?/pt x%'H1!>O070E6HAPܔ5/_Z.+lvPJrˏ5Q|q_jӸM eA~*h'rV10$YRs$^kخEk'+P*F2S'ۓCNlN9X .YRoz)~n^ep^Zu7c^']bך rMZ@2ƨs[=p hC*5Vh\ dX͇K903_9 S kn/;=bsJN-9/fUL Ar]u3M2[=Hl&bxNec S4QFHA;'D[m䓣} Anq8Ѧml}$s0.|Fᵑ 93_r;PL>: {&ͯǾ{0\5N.h7[k$ WM寲pnGl!o%Vg޲5ίx}4 @\r0i|8nvuNڿnol]UXě[mDH9E5Z|y%(iTclNL Jُ\z-X]  JO_vowHT:yLKmMzl^J~1# kFoS I !ջEYUnH>5^m~]a=o nK]>i.:i!T q˔6)6,;->mnsz!i8+r=jL _9?YR}R 'L4Ep&䐔(LԶGnNzI11|Vso3(wi.VyC@۷ڱJ"5@CRk"&A.(E3abj=N9QL~BYnWZws5˿^{@]Q ᵊfe,.m>VZcȬH~.ޥ 6 U:wK49z^h d 9&a C4.> o b><1CW !by ;zx%ZE o-7mf@R7ǰI`LOdz fyxY埍5q "Qm)fIQK%b֓G:+tkn_Kt?gf{DH{AHBqaӻK i̺*!`JT҂MŠUq~x9!rLBRܷo{CDˎdl(56M6ƏK-+2K E{ 8R`';@+yN -vhR?^UVs%9rD2 |DYJ$X9pT-/pxur_9ܝD arw2ZAtM5mܨNUFFz4 W"y,Bw+_le)l+4CR6IC M)]ݑJU ر=7H"uÝ+^pДiP{jY$d ɒlQf.znQcQoUt Mw<; 㑫|ܰzsV fqb `*͹/bңIQt_n%D O,Ez_X7o ǟ~A1O}i\CA7qe SÉ2K ȫ#qԞDLIo]' 4 !~|\X~b WT{/_FѢ  TF.5m iIumE $ Ca_7X2;|ׯgGkbg 8;5.6\ !H҉/3)k#gAEj)˶/ Q(]b@s8E؋=>W2ݟI+W/>"Gsй i'cEpRkHjaJ j+0j )\"sL*~"砊}X⇧vgPxx9@*MGŭlbd|+L6蛨/luuT\c`hәvM7v>zp#JhA:"9),ߢ˴Q%R彃8M,tMXeirPM.'(IzuRę^#%3*qoDTwB[@DWeA<WʠoտgV߷06gʛ(/Fw hSV,,mQx+{ԨQ|@$'"GTDȶ&Z_K& {D;̉i>ޛQ || ”>$kɨ\:&~Xp7zz~L&B!')jޜx'^Ow^^=jՀ җ(|.AfGfػ:H-B==o^WgH씉(v~* |NW1W3TZaztnvA$ XB2Ύ,TD-#7 !ɀS{W/͓0VugP1$-d}/CCCa+xޝfϸH<}z؊RH Kq=ȡىE?A.CIبO.@fRxV%ԊkVh-',UU訠_˸6KJq"n;3>.[fö" NFl[m 5ym+"l U ".xD=oroneaT@~1tw[aڲJ (7r9x~T{=%2Im=Y`Eg j-ȈXړp#YS1GW +;dq Z@ܜ(n4 fO3Zb\#hXfp!C!-8x;vK?&[|:@Be]MYC px% A7:{)}}z:..ccU.8&:)lu ˁ 9 3p2nveԸ RL/rY\5 ,@PА6Aۖ.f3ݥ&+Q\ %c3AMJ{΄t^ئoPD:B#nDpG'@%#0B|])/bOf$n .7)S撒xXTJC4SVPELX w\Ov#INǎ 78,_o &eCkќxySD]l{jfO =Q4TaM7ćOu6^o) UG{vm/BuXuz mE4͘O9Մ՟z<9Ds(3[zʧAģq<ʖ -bV@ˠvyZgLžRELv& <{?I%o=a79.q0 ϩM$JnPGpZqJGy@(5u rduoh;P/H{Z6cpk^@%y[y*V6ѯь tuĹW8bz؋=zlu`wr cF2 $LG={SN3m1".r8[nlӨazfC?+a=5P 唇.ю&~ H_^&m&69I+$.G C!UTZ?TZ#XkΘQ윽Owot"bHd(^ Cr,QyߧM+TmIzɾV^, l;?s% iftxW2MYYK/~Z9J/T"[PYa\ko+ߏؗѢm 8M,t};lqd2JIjtWYT{}քぅm_sW= \V?d3JZg^_u;n͍ 9fMJB`u-|BU t>GCx"U@}51Ӛ]9=ETߋ'CKͿ|0z}KQ/Gx?iՂNA #JͭfiRg> 4}tvskɎ=_5,b(J[\QT[#VqT =$إa/+F 6Is2p&Hpv$oCD㸹lAo<)a ŭh8R^mL]vP+)>VNPvG]ÕI6cKSt:"^jlړ-S# h1=Y{, FN8`;ꢖ7a"V>&Uu.1;E0ɫEKC7WK-rY]ߛўA]=PПOҌڪ<~7CN%nrIj$Ôt^6O[G2ou q[7Tγʼ?FFary2vupO 'OͤV􅶓jەͅV)>).>XYpA .>!F3[$Z k#CYw*a=w`iڣZش]Z{/fW;m]pGMg(~~v,䀙țDV/~k̛| lro=~dR[+ Ȯf<#) $cɈ\@V=o`a 2gJRG[tp^ tboK³豝ʹq} 6r)Ykh}7I^ll4GƆ(>.휬= 2IyKB4>E$/@&6#߀Eq̳M@4lQB3aKVș;ɚ&Gi~7k,.kgSKRnqePԲ&u'S#ZEHݷ"1|"P3ݹ;b!e:ITnZQmdq@B_<þ|j4 @&/J81}hl$sYW3*q G=R2LE_ԛN(olXvylJc6^Mt>ǃ ɰ5 8E9,CQq[uyWxF[Ö*ʾY[Hf|~M~ܢS%$z&: * W,4 /RzÝ'{1Y^Ji 9PjJ(t!< iQͫzb+93O- (pHB:^G . P@uc'e'tJuuX|60ḺHc5P}V5$0ᬏ -\[7e|29v_hΕ,m.= v0/nyVV4ϣ 'gPJsEI_|apݕ-2Ljh(q1ʔ7lNe5 ͋f!wM;ѣ+lC UʱslȨUfa#tBx5}YG^:.W0'T:BmD6찮hF\cWTEiA7FlyސTs-ȝ&cGT=VZnN)Zr.gīdض#lJxv*_<π \B7WìN8~uHQv\/֫Ѐ|[rޙB /)X:dʼnMzqϞ.'s$G #fnvǯj}Xbn8H7A(59oȈZLN 5:/s,qpf"H_?[mRl [lk^4.B:xtK]!іa;w%“'уz Uw Qqd+_i9j#|Ulfx}1k #m2Dأm vv^1;JAf51aYQ! i=. LJJy!w=dpHE©2kƏH3l I1$0ܳX·6',=B|syVVs4))\XC$y EG&1%W$IcO4D*m[?;d]N;ZOQL \{4 ΖDg x&IVɗI)8 G߳y4a v9>^L-ׁ31֍D~,9PV|.\rmy^12W 6S ,Qb Xcc/77Pnv'n]7Ѣ7O3BFoP{q jLvN-c8zqEy^lЎz:NZ6Wƴfm:q6,>v:C\h s_͐v"vքĩL=oʽm AWXcU@R i4Kgp5s8z[e NU/vicl7~[qcIXI& d'TlFvCskf8}N0 P/黾n햮` SB'ʃ"\1w@@l^=4CPV\}2hSLI1C6Y9>,GJVmG%g_}~c<^(鬄VRŶXWk4QObwLakQi2M@:"z{ɦHݺF _"Nc y^HauAC3ǻ.pa ,]N_D:z6Z갈P,^^3ѱY63hIĆZ$(T3f e,{6EWULUdWy^2P-i$/Ƨ*E:PP>5lEZէ8 MӍ;eMXiz@|yؓvPQ0=*P\JhJwd5v3OU$/)Y0Fϳ`UKfos̘Ck}#ӧIHi Lj->]l=M#a62ʏBo:KzY% Vu: ,Z`H[똵;D"ۀ~@ץ"xtn'b2@7F1֛L#:(IAF :i^̇0+I/*9>^O#-^fNZ.l&#Wlk60]@>rr+q\%up weA|CUMBk )8V|VoЖ{iPrgjrS]Bkn^Z8̬?|ډDεCxC<ٳ&)C67 ?bqn{d aDP#,EbΎT{[X0´0 ݝ!5Y7'^vuj!q0#I-(n@ӝSR{ӏ+=q<+u8ؼ73\+Qpeu$f~-hJt q°g.:SʬbxR⟱gx'R٘qQ*农n;3c`MɐTWp ڻzf4@~8.))'qH@嵰M̠)k/ B}7'Eur+(k0fa 6b1!޽eeѣ_1T|rv֑lWG6rB#ft+{&8ߣ:.ĊJ)ZyjSR,..FͭH8Gs=Do*0?RцeN;DJzpߓESdy@e˒,HCVwklN'x ឈx3K=Eu ?ƴhDYMzsuE$>ASn5[];:)8W^N YC鰕d?rbL21=++AŚy1"tyER0;(S0ɾK5:~ڃ׽P#sxCۇY_ ˹au|DǍ0zQgP .džJ1Yϣ[#ooe>}#&@[Ĺy(;N^*&-؍(%^01kI9цB+~j6oW.>m_6|'b!uJ@SS/1ƉԒ6=9>JW2F^IG]j t|dtTNf˷`Ōd9'CAP}cY~"|0˹%&, /&ma/fZ{/Br` Egʒo5r;&<<6 ym#e|vhP.ßI5Ueǎ.SByA0QPqC0Yގ;Vi \x׮IHRvnC5.vc=_R0AV+ /Χ":A%R+,1J }A\H8".75{ &$4VfGG,vR.l2N? BYk$j+39<00\J1y0{6PW` *`s Mݤ|7fej06 ό>KBK6ϡK׃kPYA_%DPl=|9@֒qV;N=KCrTg X4Jygm6i#HF4UKK6̌B:=2UdO)N$V8HZ33S3e֖n3:795PWY,}Œ.[ ]2Di8:RpLxəzaf/!}<j| s-@*@z@eu? L>k60`M])&w\_᝞IsCĘzSc" Y=] [N\=s4i"&:!0*'CGIŘdWȆK95-ڭy̋?cCQ6]dz.!RZE5:[& ـăgQ(8@g_?0Κ8Q[#EU L](?'~J00s}Hփ8#< 4oZVcBTk{FЖ{N 6sbYwC%96<(48T!?.ƺyxmL.'|Sޮcy4q,s+}hIS@ *m\ѡ?۴/}J]F#隃 mtu AnJ4k2_ rN`$,g`,I%]R=p94A_#i 1sksJsWA<#MOlSW"$) 9gW wzgAVs˕TT09e=ٟ,Mkǹ*vnAZQ<U! 7P4|K;HGkcFw-XL1=}zؿARV)x jNI=;>aEhnJn˘_`dw.Amߚk0wۂGj3!q-z7@0X`.}7e'6*Dʲ(7XM#YzuLګC&P_ e:*[f[ _/NT~E4v[;(DžPTl!0$6={N?D ϭ'YVxFX*b{> #;Ax{/=#!?e2'ZďףdwͪtDJiķz{;@|f-<9x̔k7:)q\.:Ak܈8GWKgmS [n{_B$dy"nlNbAgJ+עTv~X!Fov#e4ŏ lHP,F;b{gIg"2=M>h|iU}S25T{1y.%8ic~bĦv ڢxI؁i &+ꄘ {[ v6&'qMG^hO(~A(Mvgt-tgq^1LDrNgq[\If)BpfflFS4FB,OVZr*HmEx!z;AC(sCvN~+% 1g*ԓx1CTᰒPe*tr#Eu`qjd\@Dt>ZT@,sl:EA缏;>=n܉*1/[dpnη vl< _K٢x3t)v8'%3A,kUEƝ4lnEj{}wVϮ+q'6ˁc-PR;%*Ib TRI-M7t uN~@G>暩X*&xzV GmjIyȒ/1vq;Txr̔c؝?3Ŧr bY'"SQW TJIY fR0xC5L' X|+ul G? P4Y vDkTM901G hqJމZuPߪ c tBTI'*Fe#=e<vH^Xh=YM4GQ1*2L7:I.Y4Hti_ V TwbX/~XC!sJ9N/U$%]ݻke}h2Y\%@{x  Ԟ kމ'- c(qi%au yO0xB)LԮҼFA Zdk@ H v*Dù@ՁR*^2Ũn;Xg&]@C,*ArgQ6v7c-x?eJVsU?5d #/+)0=QؑbV|pz7i|0[!0ZH~6d~ޱ`EBWC"$mXL]+ Rq>,~p/ h'j ĸ߾ZF җ5sYqW=ʝR$Uu㺧M4~%{9Eg`aEM3[YhO)OBdf QXoU~b0g(X Է P)ҹӓ:1Q 9۲PRb1$lFAyT`mck;пug #}k١?:l>B?Hf`8[7l9-֕"sP[922if@r^#ow̏ RdI:lJIel$o7;L9xLـ?D2]:ȲsAu~-k|ܔ ;Z`/Bo/^-XODs5Ҷi Xӧv|B8$;/4+xJ;mRFLF}FÂl Ko.r?/ NhoLqwy-D>n|#+!8\x0.fn srG9}^b ζBm 0Cn׺"hG6OUg`:ǧK+۲j>}&b0y?xq+ 7`}e&lчEi37]>sɚmS v"qڻ=~YHDP\(@n~-!8m܂) zfU5v %OYx産mESw>:ζ#uCx[In`a|waݖ0l ylKk%ˆrXd`Ly ݠ"tV'R^uϽ2d 8]Z׶G!6f&-!_pUPO2۽&X?Bz^}/e|iY!*@c|1@}Mst)^yfW ~s$銭9pبYsQC}sNb罹)m=υN_vx&gx{wa~,|{;dsuxrCo; $AX^]>ơp\_0$#ά#R**m\RgYF!J-N[n[ zOy~#<:v"V5yϗ:Dڷ*nrgWZ:L1.$Zـ4^[j:l-W `El;sb""aΝUEGn4^^d/qhZ/B6()#Q ø*m $E1gP *xpHHQBpY$UFwo zzy=9"c;z{Ne4]Y:k%&J}rĞ+ 銫EYUfXVK':DO9/5JK$fL 7¬BN7Ꮎ&b-50^! = $JRP>I/W& _?x HJ Nw%f~ݩv~ߘ4DR'v~4,OwsTj{S6t HS;r`fbKRfh4-~xRCs^]L/]4jsLRǔghS&ⵄ &6Y䛶i 0" 2t`t4l3 3ס4O|! eh5$ aF 2CN&8\!I4>(X%3jVz=j[tN2f(":rT p~_^3.9#5xMbTh2 )It@vGSz- @w1^DzҾtU2oq5׎ /1eޙ>D<Z\pOQ猴= lGVN]?rЌ=FNq}oѐ^ m6P3틐appڿj0#sc<7e9ST͘b<ҮvV=yijlܪ䆋іT6cb90?t>JECq5:dmHC^ 깍EB{ؠl2 >?ew^IP|aJ22əQϤĴmIa[ALfsE#L&]K͖[1?᪹.VC2v%,"|ߦP}+Q9z!z~;a;K#NZlDl7FF >V?wwkO81m>tW_'\1C\9򩟺B4`"{Y( ,  hԈcj' 󽘊ȡBx%a8tyFyg;YƼT!M܇Si "ݛ~Sc2IIuvWx&lp~|/CNP*YD"z_5rtoIa2ḦX!(t_]JPtmd:*!/tF: R˪;ǵw܊>2¯70s,SOG1'G+6#`->O٤)"-p3eBU'!sj8*ީi=H0VPx訥ƨR=tS>RhUmꗽu a0WR4EjY!;yd?"DI <҄$5v@&\VNџ\/PRg,<ދiC%$\,N%z㦭I^!b2K93Z$-??74*LǼ18L2Qt7<44]_erK.j.sY^ٚU^R^t5hRkvTyA"J ==hu'?Ո@7uM)F،ƃHKiRivm6)Ei.@oŧ m2r[TV騳ܱ %w5_ wLR445T22 hd0JIS 5Gvf!hzKS,sj57}L8O~YAmؔ *+_%Yٰ-\[bIM_RCv.4 "@!@6yE t:MbUU/U{BӪkgSiހݘ3LGv oT õL*KERj.TN]sZP ``1qX2>Ng&'[vfS\2%~;4MXDsW2f8nK2ڰ Fq&64/ 9~P+Mʊx2ę#RZHzۧy9z[Tzf(D[KںUSi웋n(62)%q PsGoHJ/>F2t }fρ1/(q6 s;șJo&STjU?FS)\내uo=)pkK%b店]04 e聡:c:Z웿{/]Rv2,qI20פּZLPԏCk7xP9%LQ #LN7b$sa. 0IM y?u1P wYUMsaVjhqaq@]j}c:-yVrTߞԜd^MG%ENl%6D8-3[c'.U !#̼Zmz_GRf00 UCډ9X]UT%7nk Ujhx;PBRn:v#)|#BE89 S}Ӝ,O]uB ۖvgĊc Q5~DШsu\{=ǡQӛ4Ky1#?t3 40ƣe5sScV[nk"3Q#=q?6+u3}AkSUF]u'yJ#Ժ]c)$)~p)l|9Fwi.;ܛ^Y$4CtC^. ^1'F %uN> ;N2׿r7HCA5_Ďԅ 9ͤܮo*P]|p!H`ӕӣR3_ogӺp#R6)ʤ]. B)Cs;)e\׳1i4ӇHmh)K5\{Vtr-.~btC@oAy>ܵID̑>83!'$fN693Lo𲯕4?ek|6]v\t{Dfҵ"| 5›r-O_BYQ_4w4R`hG%MP!zrLS_Z=hzDh>AƿH.!/^38u.E'zۋ ʷ^O'%=FpflŽ4Ipjo^!)ig bhf;eya+S4@&ĢX?YyQp8< ٕKWdg{)|O]>鿗DÒ(hG▙;ORN/\'R^IiIWRAO3U(C|! ε@U$yM87e0M^c(Twq;$Kx-BH1FQ̋D1R:>Dct  !_VTJ=wKǨ;e㹜.>^ax:ԝy5j^ͣa$ XCh+Sb]%D8/ؕdVJݞ!uS9{=W|g_k=v@ EfamDWTtY[}c=)f֫> ӛIAc`QtEל^+ r26gGeY(2,bh%㰈AF}EXtuu S;g%W`JHqS s6VD l]?Z}Br^ vmtI#HCGc|*0v q7 ^ݏJyyփ[]mu7]je{A"x Z[1spQfW,rE6~F wQ$수yaq0̱)aS=Sc%<Ї!v۱3Y_%Dݦni'-寛U\Cmo;9 )pH .%'x;qK.i87l6(q`EɐQ}h_dR%铡 _M0u ZXj%\c@j*? h|=R2!ҠhZSZ2_RI"iOF{1n# ʧ>HЩ.CO7?ΒofӜ|ע4)W`hs稜h:"B2q5x\VgA%9{$t)Q|'>[B:š=E~A~Ve}{{Ϊfddf+>'&F럍d~rX@k@QeuAmq8GR1{IsM/qA8ImW{Jd PM&(2ej=W%]%Qq7> "fHFCImpr` oX3pcSYHV@Dy@6e7m4,7AEAE9 p=bV@Hnw+= 'Qˣ!&K3S{tQ!.ΦVpkEaaC/+š !5A$18q9r2Wy vL q@U->tb!H eUZ&.NՄsH|PԚz_͂7lGSE|ȱفʷq-ˊĔCT H bSg%ȢG $:Hhhݸ ™be,q^xlmNL3AaL8ZH(#/(dxj d{6Jg=Dh߀0;FUP {d˦xf -l1槌@=M8f,SAId|guU܃MIojJv"7}iø[ Frߩif.2c]2ABzSżx]D-Ymw Ơl`m};w+%tppvE RyV0C˼FwڊE:I yY<$~)CJmg,im[@efbv^a,h~mZ2lS+}){#GOt#J߆;Oxj䗙h4,ǞlCՈE1JU _~8-On~]-`xKu ږ zɹ46U`lSCLncݴ^D_ Bz9~3v 8oߛN*G2zE x%ƜXQ~>_>q_Y!}tbp6LMK~HB5#HVi߬ҙ,yuS6N|v0d•eF}ZӁ1kj{-_01 ?C~;B(LSկ_L.[YGd (D֋1% mܓp#h7\5Ck͊Wmߎ%>#x1SyJJڈ7'LS]WׄtXdl+m֗GLo{0O/& txc^5KpE?=b{w6DGKi?L6gnIf?| )"-nvjӾv4~He@Qg S#s-ü*D\`t'&#ٜ1CTe97W")mA<[hka\)jSYcoc lv(FulQ:Qݿ0|mOA¿h~d ȹʋ@4.xGQEc V̱+ED=,TZkbS>L:zvZTwĚ"u̪㮽GmHLN?8 5"(F[,R$n=H,,?\s:gܧ> des X(3b^6wiGSf:W2J'7]KUsi5Tj^rdn _ 'ڐoqmB Ar:lLamK}jeG֧SIFdOEaf e0d2`Q[fXp)NYn$)~O?c; q2ƃm*.Ǩ=iu >hNfpAZ:]~W3XrX:y'B6KL {4 mCz.8Kq.6 cN;k&:mG'ѝ1ΨtIN4>QOK:( w:$ &uk rv<4U %k\ʷ41\7/qxF qe$uP=i}4e$ \٩T6@3~1k|8c0}=#.ET[VX @u<:~;G'CH$_%];$ MZ{vy2.CjD9G_ʢOʏQ֗{fQW6 [M ,ߩâ:_OtVteWu70WMh rP`?g2Dm2:isC™BמtBiјLʢ6'9^k\L6# 3V=ҺQwF3shBiXMHëFA6WV20Rd);zJO 9xųt+O;!{{Z||L2mѷYiSp=Z8j*@ϩm.\bkYl#R\'@nΉY4s)Y4U\3w?_6I_CO6cy}!j *)Fv4$i)`\*>F^W2`k:v]#aW-(^kdNVҵ\6$B`ɠ|j`+b0e0]=4aĭ͚9e(WlcD[2Zpaۈیp OaHRFUPIoϫ(=דUV]LW2G~k{.Ljz$vu/1X odX>&hdR}.Y),Ċ4&>FL1<[Vwwzڬ&{jiWvg'lF[qhg{=|ViYbK՛r㢞zÄjpbCƩ L6 ~v%#k%!6XuPof^4@|]ŵ"JO7dվ(Q3U7c c5mp[veF҅3rݝl}LÓ?5R}H]Z~e_zC1oȽJL/mt ] .#nD]K}g ;7}U{ҶGnjJi%CEd vCZ[Õm 07rwSgiUƆe.d ^"R. `W'h|iilk0#׷Ͽ_9;v"/cc$;(w6uwz-[qMr7#)r~uw7N{~&ǶE5oWCLeο+zҖמkqށc^(\xA֗$Ud!\Qj 1-B.@2'*2.=f՚Pq2vqp ˭+O~ymCh?;qx9'#-x@=$H% Nse 9wI7n,ilxpGMd˴XN_v8ч]"_;ox«VKu+&5niZ RcdB9kлN2$F4,"ԓ8Oh֎䥊#_c"{YAکHgrzb]=6A"kV_1Q؟&iy(H^a的)wwVUΔ+PF[*y'UA:EN;P۶7Q <32`eLw}-+-&7TxxFB{mCާ[qfZ*,bVͶyJ"ׇ5uEUɉS,uM6̜el!})/nI@/?mL:QLZtcd,Bff+;/3D:;OT~qtL9Fz)W\5mt[A5V2Bi³]t|i9* BzgVHRIs:UWv,6~F4T+ΩoK(d$|6_I@jY׃W6#!7JtoI B?.Nv9'AV^} ڍ0$r#˸(-8TH6}'RHY =d;* 38~\& ԃ is$O|C F(ngi Mh<=_OLwz7z Xg X2=3bKϣ&V&g3凔 JVVȔX BrltF7Քf$@l̋2<@f G}|O3X2?˗٘q%ehєIxžV ?_<g>joLH+ժgӗxEU>ht2a5c1q%#v8>ī'n+;;-|%dH;}a rdq=%u#@0V=k3HGdb} hgoˇ&ig#bd]Ő&4S*^a3'FV0xB|{{Mb&0# ܑ*_92SPR (/ɴ0Za}G %3v?d'oR3q!V~ti!נ̟>͚tO8"eս t/QS$Q`V AQl9)JHK4 V4L ((#_ V9Ǐ'!8TB#M.`fY{xӈn}1 _ N %jq#_Q|yݒ~h$T4r /_|w"315HJ>2aXAK<7a~ ̬-+ ƄæPq̔[⟰-m1լ|C@FQZ=>TRG4lYP6ElBH a^y<֩˘n T\yXAƽJM? I==_Rdp_}E/\kْܱ(Ү2(l$k1{o]T푩1Jފ)_{_-.0a 7WG _p^F@X=ktK˟eyoIC_1ʑ3mdSܱύ7 '=;rkˀHI'P@^߀d=\˘N$@QaNl ͘tF:ch*Pm;Ӭ{k'*ec2P۾c&VgnS*p"8;uS&HR=7m=ώ4ö&dUЊ):.٠i>&XҤF\᪦7\0nT, П0fujV_x$\xw)kKV?Q.{MqҾaڌy@XA~M&2#К:%_p|amN1BݼhJ{._|@;"j1^:]3kaH-/sfo 'OB " T2pو&e /b 4p۩Fmn7$}/D{Q0Wa7vnd ۊ&W2v0R M(ovS[(etfmM&v8jZΉ0HԞF9<|-nfqswGs ^4;}Z +T/.I9|F޴qפZHY|W'9#*A^B/PR:@n3`Ft6[z5_s`5 SS U9QTu :pܴgж$δ.0,rd^`h'ڥbnmsٛn謥mbT.W}4f\olœ` {w#l!02) Mh׺Pe@LSa+vY$,[6\e:?(CJ_XM .<ۤx?qFOcN2f~,$7`|.T:Ur".ʨA?gS|Z2G;l@lFyʄnW.;lƊIo1RB7H{1F%BN2+3&=2@ 6*7Wq,lĎˊ $ A'T*bCRWcO scyy@@,4QdžZU}E[##د/2,&Z\vlTW"`OȠatDSyuy}XT$& -RzMj 6hd$9DUQ%ܔ8;F`#"]Af3P#Rx(ѕ`|k"xb{#ߣSU<`"IefdzqT`4am 4? V;e mm t),0}X`` yLuٝ85HT=s|s3 )[Ƿ)Zz ATMYcD_+yH#A@=$Up!`+Y[i kS2SX}y6 Z5l{]5?4j #VF{pژ aw%*9~j(=GAoum,!;hH疪Pc2wxS; %;CeMƴu"~ el)UQ" z!VlMBA'Wfe|[ܴ,&Т6ҫYH'0 DjtG^r/kSQexzlgIaGE˳\i=]Jf#^ #69ՙgxK>|Vn(ƀKC[8)*ٹ\wbҬʃ=x\gPT pn. Ki YC'ESi)+ϋp.Zi.2wd% 64Lđ}O%@g!ҩ6Y5M./|OH]brok>55|DbM&@l$ނ4m $Y)ለeoL|X "i$=1pn#.oq v͟vn/F¸yk e*RE6U"a(fTBa˒crs:Ȣϵacp*)V$s:;(́c;l '~s8X\uпnz cuR R8rr.!k Dv|&@ mR,_|p!2@7#$LIАpsQXSU@"d2 UC46,\:I$*χ,bw3\f\׹GѪ lp8AuOR$Gc8W=`MQ d 3 'PR:'Q?(ҍ{g^hDYL'i#0޳úb#m,|qF)6A؉`wtQ&:D!( %IFz&"A|32pɠbo&fQ?m][J9+U9{~xYd*-/U~7Za CV{oL<[dXc|9 ;i  Q" {I }IECe GDA|fg|t[tуT(\s[AFElEz#P8nUЌВC[Wc.fÁ\ [}!f7"cAfK62_2:i+]~J ZyO$TUpRD2;:J5\DGߣG5NI&]"F0eG9=^75c/0pD/4^mvo9{| : 1)JriKf9@з&S'W[0vsٸwXWL^zSEF!":dQ销LuTd+M?<$Oe;/q (ܜIgqX͊(r+,2I }w$ {>fxJYa >uA-Qݕfp*`ڥ&[{[3zvV/dž#9:jǤ ?J?ܳR*QkuPT﯒qggqC=~VErC2)?k 8=$*+B@w VRmDȨb\!Rз[>D$HЧYXs S+= 2{5rZBt 2-h/ m.]Vzrr-XEr Q>`N\m)laaE %V_osRt{u7e.n(;%~ʪ2=fmSwv%.j( |ҽFx'?˗9HmOhM@5Qbuj!c{|֎{O K/Sѻ24&w LcA~5t$ hg;GToAZ gv/J%& .ea@lGEcebY$[C^V MEh- +6O$d_@m:Ci{$n;KB{ h`lg\3 Q5mke9^"l/.L(>2̽+y\"Īb\jRn?gqq(LM3 nvJvv;cpʟ z;zٴ0䘻t(iDO ;Z5'rzOKߪw-W ýSUb.TA95GVAw,H, &Z DDd5az5e133V>Vj,y7B\ LQn5PE]w<3h_'A=n!u,ofTg/EcOɪ8YXE-;[}{MXI2\=MNļʳ C>@ 3fYE]msl$YrJtYp{5]oPP/f)A~'_i{MMۄIQA c8͉e8i\}D^MҲ2{}X шMɃf*g_*;R`5C÷0#S#y*1y41)0~I!NoP}/ԏ/m2crR&d‰zf +Q+X:a U[F$:.ӳlZv께# Xѳ_pQ#t!1IMBeHݩj'ޤ*߶0L B||quSBBz(sᥚ8),;T#^;f/\ >@8ˉW#&JT`upQ kG__>nee42EUZ;a8 Yy&pBMh$m~Nc-i^ٟo!w} 1PH.RR}Z&AxzUte* :->∲&#C$ EN:Dcԣ`*:r^n攕a*J@ތš29[AN5޻7Ws=q;@n-nMg .M2hDu35ȸt]i`4˝EqC~zkb%j[ n,]>&l$}UpE+Dm tЭ#q{rίr(:d0ρ P2βux0-hmc[)T6Xb~2kΗ} VvSr QV k`ZH gUgG 5L}&6tIB%f:ɉC}nGZ;D&B0HII*'{k_ R \F`o^I{lQ2$)[-. "DQE cjnk8]hm;3\w W$yԃnD`gGɨ1_0S\¿X=i* J2(np+cZp^-`n6B2K]9FB.2I _Xc2ZɠF#kZAƶ;zq; Nrh#V)U`$3 x~OH?=1L&pmz)$%izG~ʟy3a3cbRt2ʥfk!EFյ[f/:|[B@ D$/w3PLkb2a z!ϼ;d'nkҜsս2[koS1 aO3tҙpkJsý0l"+gІ{LuSʠi#} VGJ쳱|zNr^EIv߇l|x-'I]*N`iLM-p7ku௅ DCR{ԛ&X/˻ ;t ůuֹ&G+l|-ݪuafKkh\\ZY'hw44Qϩwo7TQVrDpe<23 ǙY.`kRr+]'#s%hlg?i6M s<k|<Ǹ:Vz)N&4p jSiTz9)D721Ox mK!#VXJ jj_> G[Gz1Rc4 tߠ2Zo0FrG:jeXɻ,jF=wcH9U[WT'Q8KœiE96:Y"KY'hJ]DPN{b:ۣb$K½%k̟_d*9)/C%=#bWYSLd(*dZ~GU]CK!$#("ooX<8ٕMwBpsL*6P,t"q͊[\",DfdNas;nfbQ6ͳ?7I|Axel`dd?y'h"Wy&IXdl58AX: IamgЛֱ\_+>pP}{w/C+CGVRLk+oV\87(KPA8@PԴ#utň"Pm K݆s$!TNw\ ؕݼCy<*I770 -GR  2$'pZFt`(~xJzmvb/HG6ъk4JABqml, J,bP.p%D.C#LS*2-&ݞY5c lS4=R;ۭǼ tA JƆ6wP^oXQ3o(d`dL5H,VmFJwJ2m+ ŒS`i뙉lXz9kP> Rm;Ct${>v~O^ {ۡ{@6VoD\roimΙmNI_nߓ /ɬlM2͇z43 Œ@Ovgͧ@F^&B1'|JoNڽTFw$1Tr,-zHb+u < w&Ciւ¾Kv| ȋ>T5j't}Lqd] 74Vzҩ"eSL;]^4mDbOkꏔx(۱n'(R8'S۰RM ^2ee.7JDdY2IJxeL5#T::L }^"ͦbLvnެ`w}" ']^0FE)Ǽ'(;dL-C]_a[0Q׋>,.`n/9^ в?k=*-|"껪n=>&5K b/{ H$¼G:R[ʟ$3.W-ۣ/r8ER9޵s*D o̠ z\CyLwim 6HQZ`gr!4Ѽl1q_k‘+:P4ٳQ}ڮ[~veWؑv ޖ:[ B$!*`#ƌVVjIPn6 {?<.3n-EWH/ Dhʉ?'p+d:3Z)!Fԋ|W( y֎x.,O^Fh)_S™6,,Q Ji^ל0B{If/$p&vΒd5(牳RI/2 ̹6VPsm 0| NĄBEz&Mְ}0؃,GH?>zTDX\]+0{~-K 6/]#M #1!9ÏӇ}ݖC;OE~+q,[h\D ϨkKf&Vcx*B ۋ3@{n^P0aD0218jg"*q}O``R458T|s.(ײ哴KN?Ӊ}A]S;!Cy]M,l5&9.xDF$K wS٤41饓^_}*>|cDb%h4;rOR#5͓OoH\+az6(JCSuQ#eʭ:댫话a%8VRX(J&Z4GWiw3&LIǮ,wrd%K>iYSq-f6'<Ԉ_(DN=-?,6Sq쉞E{p7SI1Ϥd1@夷]ӂL~H/]hE#? iX~y B"Fup(rywa|dl3AP`lRY 1YBzk6 C8Z.~ڼB9~d9M9G)^Q\a@f 7@y(d5-!,kkZxXd2y!Ow")A)\;*3 D'JM8܁qroDp[Ӱ5Yay|r^>NM6[2ؖ"5F  ڧe`(Ňq ț\44dDB6@k"9tՒKU pOtD>B聡J?x }֣ajNs",5'lfْ,Sϟ8ᄬ 8P` FFh0*4*zotٲG(vM)phL7'Z7`ʋ(D!4'6e;V}ۥR(vXtEIbrz7yw{MƥDf!"'V=)| 0t4E3mf:>$ ف2$7KVLe|X:W ,bi$ͮ:CDOH <.{ V-F(st\p_0Z=:5xBCr&!Bzi/<ˋj u]\fRWLZD)^SPekKaT61SpޝjRínpo)X!z;ĤT݇RHoXS t p^ ]_Z?vaZehzXrpm \?'2]~n\n,:^ݡX}t˭’ WR>-8U!ڸ  Eև+~")@#cO/(nRQJK>9Lm%m2ҳ)1:SC}獄6<|Fغ|csu8}==Sy\UlcT"`Cӑ~7v8/BI2TyJ@h|(ɍ\5V-_17t&D kh0Ѵ_ !,QB Wne5Ź=}Q_x-kS _f^-&GWu2*??CU>b30XrN0ɎՑ6Ϊgp@«_=cG eZ0XJzS Ax,=XN~7ų(5Q`b;;nGQc.l5d Õ|BPd'PuG |iW*G<cD\# IeiF yMDV#N1)۩!YQI-eJ$?<@l\ŘT]A'8#OB:U0o@*HzP`7z|m,b~ yZ_,,L+ɱARHlQsz蠂:K~a02-Lx8n *sѷjok^Ȭ2" aKRD&Aj$Y vo_YPuh I2-뒥}*ҔEf D:ؽ}=ڊoL ^Т0>%fjW:yұ$tf#?=DqhJghwXZΣq+&S#?\q?a-NVr3k_oPe>!%ѝ49ƈ ȥglIޓw M_/e5U?eWPW]+j˝ 8gxN`rf;4/ 0鎱 7(A`M{*T)d#F(2F*0R[OOK?oi6yP/s wPHClg^@5y)2-毌;%pD*횰{|Ү"xY g%1vA1  e%/ޑe>y!:9$0Klf^>VPߢfOџ:ȧs)=q yTjŻ#N3RG!>t̡ci)r8*m~1c㿯s1|juN6@畏?|;3A61b/Yȴ@^ׄhOWYF֓b|m(Sܛgqe#NvNS/ p+?RǪ 91^պGNY㼧kG8.-P}ދ& f-khVI yE\G$xqRM)k -0ţ&Odv)!%e!~}~H~])ma= Sb< u$cY<+C|=B# ^YۭckG5!|,&K?s  yy΁`] /Uםit ;1uKwdZnLE [ڡ,QB|ߌmLvɋ@}#CH ޑ畝ӹöAFnc4s4U eqFIuePlw`126I(a Sj@WYvFչIo9H⤪[M?z JA BI=φ]Fn=^55yዅe)jj[{4|J1ۘl5}O:j#Ϳl \yh3_$Eȃ95hm#䕓:W|WͬMگ[reKړ "}Y *˻iިzꐄVOs_u6(gkJk=TtYj `7K۾yAO?$N YiʝilP'[n◨뎎5`xNS`&òY*plr `3t/0N'-'z(uWG()_sEK-Y(بfNFh?t2oJL3]gcK栺B_1g=&:c(?ݐSM{nSi0b?&xg?©q7.鿍Qd6U_f#RlEFQq$;zD'_?_lw~ >GTɢ^Rcթ1)' I\*a/~-qP>ЙKcK 8d1I$4[|y|暍!5k bPkN4"OtJO?fNpv*^9޻R\w,/qV9&)f$ϙ|]3\Ta}"l+ݫsrV^ۦDi9|QH? ۛ OM GV "ϰglv'ϻ01HcA;ޚu d}OXڵm-Ƿz~SG]mSU9Wma }d0w^)2Ùc(|RA~`HA [X*ٖd][؍[e:įM8d3%1MxH|qj| :-vN«pΕ\*;rE旓\61K@?ZbٶKԊm[/`vܘ?_;M2dUZK/OE^P.)'\bcFL~AYVzYm#];ΪQ Y'ՈLkmRړsIM K˖*uQx΋U Xv,Nhp*A4@?NsE Pzcv/LXeVQK-շ4HgU3O"ԉU횤E3BZf#\gSf?8OZ܊6̂TK)2Z+]EJ^]VTf%Wm+v/ rC03De@ٺS#l u7^RF +6ũ3j(n+9:sZWRONNU&x`]t a2<`q5v!Tz p Bt5IXJߒy-4[6U= ݴm\O+R7Q*KHx`b)&?@@ᕤ%*l7mcjs YFvԙ2U ɞܰq*( ,Bu^*7Ě9$ס>hkY?DLC hĮS2ţקo z NUKbC7﫲x!\u%Y䁌[vԛKG~d°R-`>\~+VUĞ"s k͇e0:5>*0X XM!/.zXUhMM]IKz{ڏ/y\X/Bl/Qixdʍ\[` :[ Y7NMr񡘈x`]=;50Joy/_ipyF']cfu&rE$lrAe6Z4G;?F"ٻWNR (U9Dr Ek\`OlG BQh3:~QXgjJq\_&m.]L@;wn,DBhؽN㎟j iwV{V_IUvͨhėNN>Q-/W Q Q2P;X V^캩8d֞=cJfyƪRXV=bi4*8P鼌"# 4Su](zv㸨wvwy4UV]1Ze9[^Y:nb bgEoUN`fAdrn, #[:&jE۹,cnzП-@pBs}7rqD9uG)1J|M} 9^yֶ-^(B`Zgy%mlƃ(ze]YXqvD1q2]Xv#7,LQA=cukH&"L A:[̫շaPԩ=5+^!ЉQfFaW/CbO]\ɵrЛG~21W\͍*uoc%H2[bFfto/լA,6+~"še*vʵx{vSF{/˕@?gǡ'?f:uyqX[Eۢct&*X#ptȤm>xrP7fKA\_Ԭ$Kv1t: ֲ Hںc*fJ&gt!AΥ} W}GIZ tkxMk_ֿ+תPg,Y5m[jxGpxۅX׀ B !Vޞ׊~J??e;rbJ+)02fdJ0LFbf?ٳ2wȧ׉]Y)MbloM@ų .k28VOZS"5r+LÇ/,hYrg ~mtT2yNk Z},G47N;=7^"VZؼ>^֎{V-wXa>\+!Eh>> [hh|#P@P榔_,ۃKLc3&"pu'ʗmMnun+nS*S[mcz MUaW3ʛ10JD+eT@cŽmGMS΂\%~b~ xW=jY!8)V+/j!$[Ka _2ooLlބB5ݕ&a߯tBW*Ibߥ0{-&X4=Y&uno՘-Rà%7W3BBw_,# u*U! B&+Epem%[joAb:/I`d@CΖ;GqmWlHq> 9Zf̗J@uIrGdmz8OD%aWP^bD@PqjYwoW]bÿ @.[ֿR@=i^Qڬ;/:< 9 Ҥ AZsgfN#$MS2H.*X۱wkI6Pvw]̐z{8ښ#gwB)ǟ~o QN0624L'J6Ku܏dԐK".g#'ԯ/딁Ļ:%ڑĭSDnl^ڠtW~*ڶK+PJFZeVU0h_#4%hRy(vk 罆p5݌{4Kn$1lIGt`}8Ρ?yv}{+Q[]؛l,ɣeB.ы;ܤ JŮ!S])rUeD`i#3=ANfw!M TZT̻@T.t )z۸Rgnkc,<'<0&18w^k"{+wY;"J6SQF|gJħϼ{% 9K_gs b`^tUjm~7#\99BBd(URJC}< .ldXFl/@Ս:L%?坏 S d ٳ WUIbDR lՀIgb\gxk/9*:Ձ:#g~.ԋr YM.:՚N(?J2j醑[b/A\?>RG%XdIg:+ @< ?.B (\<06/^@Z9c׳gѱS)ԪzzmOD'1M.J=]4)Of2~ǝQcFodbnYwLx`Q"ט1?dd-l9[y} N?Ty-yeBՌsQ9 p͆1> S?cLS}e6K{vX+BN]L'@b]Bϼ<5lցٖf6TaT:l>*,_ș:xV6ybUlϛ%3NrFZvT8=U7$x8xq0~P|BN G~sk=5 j}Y=|XdzAt&I|5qcrPV}^N8$1jɃtԪf3sot,7伅I/*nZ:?c13؍]eM fn6--|/_ӳ1S'-ԋtD~2VЂ }|GZqO}hWm_;C Co \H1/(A RMy潖b..rC{>jȡmRNT/cY^ȩxft %Ss &&DY:- $_@ €Da^=15BӘ2G\RM='e./M'g&GWQ(yҝT=*j- k_]Vl)HEeF&@{` qݸc'({!K!iQyw,jk6VqɃUIb3GOU'T`mAZj1[XzI"$ٹzOI'R2_xۣ\ߝpK0斂Ḥ}w醒F.[k$s.mPpOz0cR3F%{_"ֈn4RO9 ei[sXլ}FzC@&f0+=%}1^]WBx1şM& ::5zVkJfY3(GLUኗt*Z m}E"N7+~\VW~*%ݬF[jHX7W-jh\Έ F&xvY`}jgIs_ϲ=l@ǭZCH_4R*쪨e ī|lba@:XoĿgD 2Dzj86{/w-ߐ7 *ϗ@q)JlBI ,w3ISBVmLL֗{x=Ok~"puǍ3D5qd3;4\=-ܨ<3h{uVjSUS/~%T5DC"ypI(f Af\Eb Zyc|3"3ZhK>l/NLO MEJ'Xةj~9+%ikR+ͣ9v,> z?%mrѾnlx,|[k|*c7̙'?[ͰErOŤc)lR<(,J_bHEj5|DJ# 1 0355Xà?M"g*MnUUliE(;l\ŏ $;8tآ%8j`slUEwA@rM$^jA8ȳ(ܛ AӉE7}z&u[,b sڤ9_}TCB& hd{_]p̐khZw%|ty=J*(ʝe:n^͑495ZG ԫ:( 4=WR7 h2!a/mb~l vSo/.<2Pq!O1(_49F \DQ(&S&}mĔz2pq~iƘ\oo^(`9(YySBr;nlp&GE!7UuN((c!nQ~'rn&?̹UqȌl0*M#f=(kt>϶L7~!O#b[O DBYyZlB;#G=?/kjg4J"1C Y=v"{dgNGΗNy/ c'>ǧZL֛> _Gu0p  #0 ކ*1,q3YTAAC;oCcW-`i'~qdEԁ+#S/bTD+Mh( c h'ZΉur`Kh56Pt\n5XĞYQ庺ѮNUtޜ%H44'qm4(~G0y! hKh.:\, (?۟je,@tHkR(Ay3gF#9]y'k0S'ImMN ¨iGpKM0@K[uNkBD1O|fRID`onW0Lv/9hHUk$zP޶9<,/+Ovw@fՆ hѢ12Foba6_B M b(MŽgo 3-뵮}J#FRڕkcXPN4>u~,8czRiB1 v|tPX[9ՊPz|2׼%nng~sn͗wUJngdI9sWNHj WuAS (%l9MsI!:`O?btRЂ32VhԯV_Dvj} ;m++ X*=?d dDӔ0og",P<ޙ-hof9p:,bR1+۬A iKULOy::Q@W4$]Q\oDYka Pw:{U0e.)ҞWd`i ?.QMO Y4&_t($BIƖQ%"ضVH( =%).n[\zj*n<4WTJh1ޞ @K+9@`Jc?Z;no+]ܗKaB諐V;]@ݿ'< Cy+N&!8[ƹJ %+~٭.Ó-^{/u["CӅMVg@3x8 A89k6PA{jgs#X|[ë*%#h[6wХ7զcPaؘ,ZdqH]"rFbrLmV[oP O[[j/\!ScV뺞5B؆քz}UhfxEʜ΃8CwFD7`"c8!YNʋ so^MVuRj &\3 \/^|5+kz[w\?N͡d5='j24QoM-:tEKӡ7Ii?+MG"IƄ/7xhO~Eiqѷ{i9uWznK朚&,.#7xMEa؉:` odi/!' qF&{s֟f0;!/ B#{.^6- XV(Ju-n*sQ.-= I Riܐ+zayY+/!NiDt)pB=Uݲ)RB.*pLr/>9q(2+gm?`Ik (b;˜Y0dOB@3]GM?Y_~4W*I(e8pvs0pWвDI&OڨxsS3 J1`X[{Ruetߢp\zleT7^/2q]{Zh[J6:hq'\4xwPLSrX_K^n\Svu ]1n+ {>x.i1Y 8׀ VQn.[.(5D^*L4h]8TQˏ%b󦆾n EniS߮-Zz`~\1s6Wfv?*̸-P4h%>o^*c=Ҭ5{{AsuR@0:u؇.ye4d03>>W@ #CһLm* k]4ʻ[?kxlWZYiIm|$qITll˂T^)Sa@CitE//8MgоFd¤*CWA/z⸱&A)C# 3leϚ4fu |,5L'~ɁDkvIK&/% |bwh8n7>|׮0ʳE׏3X:yվ

b#ŇNw?Og#HD5K 5NkbJ,{;5AF}9>1vO9j9aLO}2gLa 5=|GIV4;UC=-̇D4CvΆFWH* h݂JIN^7nԌ\?}EIZaJkkӉoc $bv>?lV?>=]:ӻ-#?Wxg(?:4-1WT0+Hna\Nkz|gh;~ Ժ;h vܓ]bpZˤ:6_@Ugyk \%S ZfU!/@g#p˙Kte;+CaTZ?tW3|TE!-1kx^2,B6J)%}ց>44<ΰV0=Fh}IBcm٥ SaTnwv*r|Ťc${# YszBO/LYb?5Z,@pm"1r8jqD9ʰ{tAq\S %tFsnYe3R-[j47bNK_~r5绫)dz[srֽ;y{``(}~XO'&Rxh}ZIU!ɏ5B(m;ΦWfz&?Ƭqo 5e:r"m?Q_>eW fm3pr{|v"Q³Q-ˡuVX x"z8jjAOC3!.k{6ک;ր/馚cԀyMGqBNfSU++O|FOsM:OQA~}Y\ӑk8"g3A7OṪpxE{VmM@ n*m HzT+:xEx^wHO`cG0hc3q-[ݭϻwe7p/1w&\WCHYua}zwM,t.iocYjQ V )QawQJuNbf&3Qk7jM7=m&Q T,L-t1` FZM֣ Wq Jhz=²Ɛ*VdOϦ$IΠXyiJT/(HJf]_cq|q0ĴLFgLeB[?!_AOdNIHb (LwPl Kc Gh_?ҭל gg ]jx|р؃tBP1?ں&kGN><9 u6jbf 3ՙ&ѐ+c}#gM_ 푰'N@D~2*7Q=J%>x|94#\Fóxu7pAWJW:m_/~kY$-%`,YΏ7wl2V q0H8?ErȎlD%bKҼGkĺⱨtx߰23}k.p$Kd= EYdt9Ʀ1 #|GMI޹=W.BacĮL(1S\G$vawu7˿Kyi,I=aG'L(G'?nh/2aJglyTP/qk-︩X09ҥGM:斮@/k9F9039>ԋ1ĠnDt D ⽷aJ9&{\P6JlY}z,dadN&udCR>mMI isO~ ʳ釡tf &^m[cXшn\$c3@KU8y3 KW3"}2Z>D=؊6&tC*WLDOd5_¤_(zH4vWX-.mH&UűKg7iؤPN P'# P)r''Y]UNq@cO#Q25͵jK(Thz~n/DNt8`~ʶw1df4.8l@S1^*C6M|S)!c#Л$YڹL^WG3 l&϶7GD~21oZ|r8;+ MzGWۧ[vKnӎYmƘ# Ew8ѝػEI5jwG8RTqJSTHdLȼ ǯc9*6`zj k~m+d\QjL*>5عPyP5B6W/t/8]͊4k=?:츅2 oW`2a1~k 2Kk<(6LT:lN@E5 9R\l>ibh-+ -!h"G4J(#3P,;u"z@pD̍?gYMK @L&09RLLXw䂡|mspʱoi 4 R;&NcHySQ-x?3#ۼf-)OE@ɵ5'3!6X2>Lu궙;J Rqx+5՜~j2`d;3׍DF5﬏Y ?{_hɽOp-HrYr\,֮4eaoZYl]H~Uژy}}pS"I hC&TnM[dՀK{ZI_6S"ޓ<M ]TtC=noQ0>0{V+ OWDn15 oQ@?6=1^Gc@n+H颐kWb޺)]wƐY+Ah:)-˴8Kڅ">z,MӤ-Hxs$ߍ-{z-?G.!r'b! "7(ңC}ԳW_)A.}9y]ԃ>;0ٯfhk5SSvӉ2uMt U['c{ 9 WdI|ܫaP= hFg'|v1Z 7$"f\K"NҕS)pW9;FF{Pu)e#? eSkDjl)YH%ND$ڈ9%fw gC^eVA_,iXg*at:6a=P禮\֭~,#sVdeFK_fsp3PKʅNq36^̆셛aQ$j,|:EMUSV["= !9 к<)*/ xJ%4:KߖRx|u>=;:f=HM4}v ]rV>nZ{CPq7@!H3rgt.yq V?!yy~ "w]g(x~"u)_M24TO߮lSnj颻 8/,ߎoze GL0*N=[ddڍIVeL>;o2D̥UztX+LzP[[C pN;$:BJ.oOxV嫜R3"ôMAwɺ~Gt<åNi~"j]][kT {QI֖0Z桙';^}*g*''}MTbLgӷ2gc]e9\I g}{QDrM#̥1sCqM,luw&`'zk.?grwj^yN[Eʫq(ަG3ģl:z@(=w]C6! `6%O6k4åj4* +&gkx@Lyb[>LM`:ΐt:?9=~ LA_QE6)ܫ fs+kċNe9P$OC&e'O,QEݹ[VQĬ6e'Vb,CiֳaprIKY` L_!`Txqyndϼ<9=ppb~DIϸJ^ο6tnx.*j%vD`۩::gr"_J)Ra ?.u,sE/lV[ *g2N7&%ڕJKK_xn?N=ǘZûqӢKKdܷ9`=U\8Պ7T7f PUт.@e͂o7\my៤j;P M _1~)"XDKJ&|jsFg2k(ìGW~|K-KZ 5X*sf N-KADƾ?;Z*X.)"~dnHöHd>I@7]F>%&^c3Gvʑ`n9p`tz:gCwQs*Ze?bd(fD,r94Yg;lbb?`gZ[*&~.oz%F8%(TkS92T=M3\7o$DrX8'!^m֠bO@o+D%ZޓNcs:y rAI٩(ζ?V$1B!IcM"C› 4*cV!ao!'f sk}_}M5lj =& 3]qbN5ұ4NcA鉄cT<lF2o%CDް(Hʹ@X_l&A8v<8 : ڪ:}}z+lsS<>Ki4&[te?  -mr\{& =˹QƄЂÞi?%48[I[เIξ%hNk A$sR˩89yݤHXb"! H@}9i>uTGd ]u{wyr0ɏ08JpvXڟLoU{qb"51<7"cG|?O@$wװ-yY] tՆTRV b% w"PC |Q6BȘJ^N9KTذ ܠFMz̑l#1L\>obH|ͮkHR֢T]&أc曯? E-p3$LF5 ɽڑ,ae$A'Wwra wu* PqRܱMxX)Req=U@qx?= [pR~?ԋgZI,ӱ{@:ONٵK]% |UgmakFҫ\?a٦ gO#JA/qu2%L>}!<8[D+ ۧ 3op9:{÷xRl5뒺15*ŧ]dr_~I~ɿ^CWaXYzƉH'R|,q?͖!MQWP4Pˬ-O.F.A0@JS4+H ͠QxuCY5XSƉ;$[P/D<)Wk~D)5}.L ׺4Rc,7,ޣ5dKM*B{q~B h$r߸_g+=y}ՈaA: 0g?$p `NƷy03qnfE|R{ץvt7ҷw#L@r:M{amM_r>@B` FHcOag-ruTM::dJA|2}Ʊ|ǥg'}EC+8V4@@kLXp'J;jh&@@v"q8<_.gL%X= D^h ?477%ܠq K//8|{iةgYvDnK(P' %>8W^Ydcd) с$?=6)kOuR'=!Hh-:3^lR cv􉂻:P^n:`cF.QT@:־vK$ eUDЧI<9\(uߗmvn HaF^9e׵.x z5*Zx8 ܡ3yAP쒅g+Txecr@s:n׾2;fӥPN( _>EHR̙3$RD@ Wh oZQ`t"F;D٨ +"N5Qm fJ*;| dÉ@%hk7*C(#a7q^fU? AQFOEXz ⛂`g N[hՁuƖ|tLL"Uۺ&H͚BPJ=[ʝmĒ| G W Vg?+~ sO03 >n LQ0@a]g(7®alvi7ֹȩF൛ƳHa^tjb &3؎Y԰@n|6M+ң.ZFٌލƸp Eu&cYoU9{RE̦5F'YdVܗDDҗ1RԊXfXa!|`YRyM-\[q]@ ~#^;u4k"T3ڶF2>NUO)$\ UDg_63: 6ҶW6b ا@Ket(cj.Pd>5-oG%Y{;N61!DVxwY_*r!*ΘL<*Gd#-$?bPn=<~hY&۟c.!@g9]kû2Jp m$8.SL[_Uhm$x HS3 e?XZe4;I56J(&|Rnb E@bj HH$7kMf(jGHIkOEmqYeFxPA*L2"ه1(`} $*R~ӻzwi4コl8=p *oIr5DSqgfGZYJ_Tɩ@lkŞ\v.V$M"P- ˗%3-9#59" C0Ȥ)*{%V"UYE)Mѥ=4 /C:`!y|.4p=$k %FFvO~glsQSl7=}lWz=I8rLX EZ̠~jy qos+iu;㿀g^wJfN5x#4sh.˔,,dn{kY$'HSms;:bWЯ04*e5EOtsOHGsKo'BRviiC_)Ӑz G&.?t1{?;y9#N6xj1L/vIdc.m:BV)Ri1=34J ee(,n3h`9}\r*T>)-\"xWy6|\V<1iRͻ-V0ʣXjJ;e_˦/FIβdw)o6̳$ ΣWk~D&\d ,)دkp1eCbL:NP2P.&tyeCn1E7!f.†enM : )eE"MLKT$DH8#My~#ğXs: \llDܧ#%Yr⺈wGpoj<( /E9xXjnKk3-fm[sUwe$n*%:ۣr?xr{CL*! ~'sL "%w־^\/9Ǝ>jr/^diepq*;}{lŁV|X`IWbeFAYNJ_(I}z71ЈtBM/r}*uO-_KZumIu@t]]XsսǡJTT3:rf,j=@}I}`h,ݚM 2FZ+z,3R 3ƥRdR־nTb潡'ScNu\-z<8jQSmZa2xr҉{$9dNYG;h< z/"ԑ>^aH{_郴M݂-̢bA3*t,:/L;pFt{>v[,m[WwGݵ*:+`G#7,2W+gBxjQl&㘈8: q_Vp^. v7/T4 jO Z'shS;fs r]]xCzt,/˜0 9LJo2i-xQEݥR7]̸5XB'Jʾ8TuwAq\']8"EW\j3fX5 1 RjJ`!*֩aIpQFʻ0Oل-{" qr"!XS~%㹍h(JL,nNj|6͇hWj1jڰCQ9w_e֥ݟb\ޒg2&@O$BVy/HW[R<֮E_s!ܷ /oN_! ;YCyWbQHr,IMA/ۥÛ> r`O?#,T'UN]p챥!Ma(NhN'/ciڧi١1,{D_D^!N]Redb ֚bxs IQ"+WRf)+ޟw&6J\n2TAIaY|u)Z}%q+wꖏ<,ЉzqD#'a/.{F\WN)jywjun 5kb خ;9} ɕnSaiٝpFKmrٓ #7cU?ikE1UX9[VO`@UUzp 1ieqt U?G<\Q5:*$"|} |rKLz`vq"MrM~5WxS=VeY:)9v9ig5Ij\r og@xOZ(s V3ckE*ϔ [^=/!cmM$ ??}_}jNdPEkp)7[AoIѸO/ƤE/?]5h|ۘqr$6c[DYb@(.LM}bJ .ɛ&'lya|0,Vvc3zEǶ{́>[)X}5{&?-po5uq(L6Q1uyxSjMlXb瓕 127h=A-I8s8 "Њ:j{4`\xA@oUO 7@!kF3Ӕ/YeMDL -0n'>Ftf]zgt3>Ft $Uxx@V29,#()oGH iUΑ( ӕ<+Qv31xՍMrKFr:_}v{$/ K`)QwhKr޸Ge`M!6,MyJ( >˚ j Buwuőrͯi_{U+i9E$a[VJg>gيp;#ߕpCC QQ9g\0XJHaE3v4)_`\zTxM9-jGɈ ,1SzTc%ߟe(.v6 m)XA)ӗO4ܧ-^jHߑUsqYlйZ6G`%mqhOD KQq/3C+j<,ғIP`)+6lfXtFY^դtz#`AQL^=~朆FNb:<֬#d*/yw0kh~N#?.b O:qPq)ȕS۳ʄfj|k#(k(QΰQ0,qgjꯄRRS}^)ϝk*!%2*YcpvzA6bpe92FqUL~Rm9nxZyQGG%X>[mk%FRw#{%y[:'՘4&N-`$ Nj]/Zڱ jBlqְHRS:/Q̥.՘kiҮA\nl5ֈjKS>FdmʜYcfs}HϨtɧۙ3v6oRybY;1J@d_3ÓօF?pnWF&^3Ni(QKvzs%MS:AJ9(<82qbk$7#5񷂇pm3TaE81X;~ š_T,uT**,1$f+~~ǧ5LIǖ\{ƿߘCl4xl̒oRT/6P//pF;UjZG S^@,"Ha֎RFߢߍaw%269\VT*igmiQSdO>} Bmd98aH%0O&!!9IZ%~W̡^٣PR!!רob[⤀bB}H+!lY4rjhU8\+ \gg0={VD`TC#v%&Gse +uNĆ"Mq1n3McP7]f* $__wNX= V@͞ $X_V*wVDvD=/|c1X8RTDE  {r%y{_)gPtr@:r-'P::D?-ox$[SaF>!3xP.DՔld ?=Xp!Y{&ɰ+rc4.rvE/f {U!qQG}̶u,mA )O&R5GCCߚE>D2tPp*X :Df>}j*}(qZ#DW"xn]Sk`l9͗n!7hbB4/O?)e6 0|hmka'X\3*&W?\Qm'i t%$lxI}6֥tfvl?THd6퀰9Y9i5dm]Vr`,y-߯0P>l@tGJϾH9AHYjvwĂr'(W.~@uKzYEQ) ]WRDgeȕt=ָwfq{rzq-Pcd?[o )7ҋ5~mz:{4U0tB7ޛ6 :i?XLW{1>׿K3Pu;I$f]%w0GL6MkQjH?`WנV25GvFsd`)TG)hayW4&\ m=+ 1V:By#6K#j1a+2Wפ.l2蛴7 \ NN(yJj: cטFL&"܎Ʉ993 NY)aO3$b+DKT2PG4 EI"oR+ՑrLr? 9ϻx(b'R|JpmEdXLn/\SȤSacXزiYIrkLO zokaΟ7U!NUޱ#ۚ9̦xvY :l#ۀcxYD0k/^-|_Ϸ!ɂǂ8H M! L"0T箟^:$rrˢbOCv^Ŝr9w;삗[5?*wS8]wz!%gq8r%9$?K _)@ ),9G$̥ zHZQ+6ƏC OܙGSvc ʹ(_U"RjnkDfj7xb;O\Nџ@%ƟcB[GiWm-vaYpQ x;BلVI?}0Џ\zx8},ED+5 ߿*C!+Ag/702D)* (1<d1y%?Zg 'n1jKS섒0tM@4cd[- ;Ͻ>|)-_%crR&-xf?Xtcӯ|ȖxTAUPZ ɰ'i`p)RzL[#=q݈C@כ}2~hw)osu9I5>~ yl0%/Fkssˈdם>5`\zw2`uUbt(B}3$ɈW>wDUNFFacޘW?H=7CLJ=4 l]^b󖆅w讟k'XQ0(YSk*$0 *)qop$=@Դ饲)<yP:QhW)NٮVVf Wcv)>17?9w2_[u`co_fk>>Dvmif^ 6tsSB8u0tux_ md?"ҹ%z&I%i Dc xEFBE 2-VuhW64xIeؠj\  t/} e U$;iL )8V";Z֋趃2Y RN(#gԎwagM٥&wOeS*YԐҦef/`l,f}~Vi_/K̊JR<4` Pf^.`KCP OI4G Vd?d cKd ؛ snHqu5WGp ~tBKʓ ړAxIueU,\/5Sv4P󯞬2$2>i& KXV 4k ʙ_#~|~?R/O"LobvyX6_$9ش5OmQ۩8Қk'jnb(j@K4E9)Sleہ O,|Fb UXL_ܷ}9zR&ih4LX7]uz] a&8]HH?ڑ1zon-~DqZ Nv#n-l P}gٰO]6aZ)V/ s{[ݜ\ :`ڒã '>a a@I,d"XGnN%40%xN_)E닗ۂ Dߙ-eY)so7D?|~Ttzc) 1P'G|;\c6qA(EWဢ^aY16g /E7OJ;,!-H''̋doP$g=>Vp̢]c:DȇTf,Ň3fHL'?0+AR}uGnw 3ZeI9?o=m%T)1j5`MpfH;s_] 7 it 'r3*!ЉFdd"cq&Au|B)VOF;fBSڈBVM{s᭾N.䵹i}lCY UvIU^LڧuF:pQ4'`NM|'Kg?Ô'̽-:Bе? QHa4CKp5c!(7۴4˭Tq(V} X\[IsQa|QY)4L.V]f?2趴icqJC=p)LEVwUbph=Y>of^T"HctSG#E2ȹ8LJҖ@%m4P5|%hx>oؙg@C97oX/Hf2:!k*[f|&q4yKV58 1bƪ2ѐ?Y2 6C;u:io{\uV,`j*U u d1 ?qf z}| ѡ x̌dT˞jn!`k LR6k~V; xd-ㅳ֔/d{םyQţhUnL|X[R!$잶^TdJm`^4 SFT:-ch ^<C—!2X;>, 0Oe!+nlj`Dҥ;O1"{Ej?DjK$Eu`b>|*gtٓk-+ާKr@B[}#+,>s~)߂rzM.>x-^pSހޥFC{_"f"0`T)??*zs?DI!lW2LXscU_1Oz_^~G5!D)صHi_[ʹKS~Ԧ{1XzLғQs% ed+8yEfOywrd^t@-Z4*Ri}7 oB*=G3}iE'z5R \EY N<>Z )EiNl?$ŌlGsET#Q_҆bnѯlؽ\M x:`ι>eCNh夙L}yIp-x1ce9+Fΐf5_QwLpېyϑ0?f$b+:&hbik=Ã4dtDY՗6yȀaEY]ȳ䰱NL_m n=-=!8Ԏrj)Ik@"^4lA`Z T?9xϔy(»~X3nVFd*NwEh_&mFk=JM<DnIo`.v/`Dv =f+ϴPݻ[1ެDp@3C&p@ 2Pf(m?rI&d]l5%2߈aiY;O =8|TS8V0PS-H(օi X|Fjƿ#S͈fҩ]%a1;rq~q 7?~\:`@KEӃ7 I?y]蛋Yt *G%,oE2{\;B&mB*^mpmMvUuE6%zC4 m<%h_,rrF-J.eO<҉p9{ ;ATN UJN?oئҵ® OHDVk \lrdcJۏCЁ3/=LOhFrtB,ɜJ1.N,_=;sBYTp1G|L)}(M`!$Qhݿջ\ pG* zSxvV]bX!7+jհUԲ1R7p)g'FÝB# %'5oẠݒWJ K1܅ASHBbftUPvZyƾ(q4 ~(7=Ȩ=-M EZpZ`5H{L#uY8F9LɤIak+ ߤsfěe[I.MrscU?yawy,>xFh;z7; xvTm2~U^.AP~bztp}'Fyv^SHPJ7t^d{¤XpJ6֐s$݁E-R> & ZPm~OLSMT|(oj>  dFQV7P (pOLӐlH5nW(^@aP{|Z$YQgC?F<;'ԉ墼‰"xۨ2kѹ'«(@D{[4etk! OyFeX~p&`{S\fXd'hMŒway(b, 󒢁MD|ȝ!c]gv)yXYԌB?κZv Ʃ'H+D Ԗ3cv\c[h]HHJ{LrSmQcGLn!=O?A0YV O_#h9y8͝m|~Uaaaa=R< ]Tsv<˻߈,XUum%@N NruEP߿C(Uj@t5;\0>l[}DlEb5cK$B;Ev 3)ȟx\!5wyA_.Z*)^Hek>4ŏAjAgB';q4J1`f8H|^j5H5`XZAU_MI92ʊ"vJd]-1mr@k&mRIE2Ս{DMg R8)x*EoUhiS,oRܔZFʔ(1vΊq#h_ AZ#̍K֒oUo*7:Iy᫑Uol (#3%n84th#i(qBxHJ;cZ ?q$o?Rϭ{;DW"Y`i74y,LG ;LS㟫*ԡ5%V,ʙ=d6׭_q|R ;>K[񀘶ya,OϓbVWxE޿\.WoyHU`gzٮvTR1,#!`-ǚi|,9+6]{E2揾,Gc_]um;ʰ)\t3KXF}(ɭ4пƑn<nEnNrd1$C{1\@ D νT_(ZJ_ R ݬ4ۯ=Z^jIF|nrԋ|K etqzVg|eǎ>h!݂#m'带ӗ{_gڇS٧Ⱦl*hRbX]u&.HFq0Q1m7γ)C"' zn1f$zJp swD=[kV3(VsͲ-2VsKF1*_?ȃ Ù+ӿ5:r1~`x Is+%<@X~=!bmŁ*Ub7p34â)n! p)Γuk<,  -KET_?ꯩno)2?0MNAZBb4/u9rճfkt%徭5~h⪾kfEXs;Y ? IQRQtya6lՔMܗ_(2Tz1zPm'z.MqY@D))_НVfe;PG\Q]J8).]Fuaoص[*ɘ1i_/~ϧ,J.D.bH@#C~N&ڝg~04@aKs2,F6Ь|PЮos,x5/9jAS2 X0"&yD/Khg*cZxGr2rxXyĢZ*ⲨVT я"ҹc M/.H_tP}ɥkh[0_Eb+9ҝN wF޴!NlHwnpFoQ|YQ/v, S**B'KH.Z$?nIt3NDg|R2CS9"zѬ3RʱF5<~k6T{o;tE\d?l6?P,YQ?;>bW(Fa+O)7#ʮHQz!󊿝i1 G BrplKDM:jY՝gjD_ֱeM~^Jܶj4& PHl?K9b(9ZXCg>PXۛP\L|EQ[e٭%2C IƠLUWi$pŠΣSEb1T2 4T'vey:.U$} G&Zϟ8_NSn%P~"Rq.tjuہ:L$YPv~د3%MT)矊LQN헖0< c`ʤԂW91bUOU X3B..Qz~1*KR`Ԃ}̓u/%gQK&q9~}2IfHU¶X?rQz{PQ\AHa$5C)nT~zБKY`KW-J 蝃&:zt*ß.v-28ތ}3$\P˘juT %e֞ŌkUaR??&[#y$WP?i &b`Fϋ= z~Sx{̭'6l`A$%MP2WYwAM}Q!ۚ~~hU7\#`ݾXDefQƔ_EzL\wmuTSlf]L"`L)7j{ s 牥~(4@d졣 &ۊy}k*k lX .РՖ)b!7`|Qɯ,?~cЛH륮~P?V~x>sKFы"6-{qlzfI w66y)P _r-8Tމ>x#ΚrpXq-NnH>Pl(XDvR7{7gPɃ:d 'n⃑ rna+ef"c$z't(ς薲LT¾ NP+ycwLMb(ڊZIM4PlF%[l \S`*l8:KcĔ7 T_}Q?7S?IS5(l19L~',s'vgw T,PBd# w颥|yzt|vLQxSS H7M*h%$&')X\x>NWnvu-"Eă {O_K;JX>SaGD1m.5l/+A*zLbɽ}eh)q4yΜI]5@8h#{Lc Fqelit9΍yXX,*c"vS!} թWLywTzMr6ً?~t ,)nCh'3GDߍ?`0K*854abzĬ`Cpc]ED#OG0#r}oJN1(3d2?ApRh@Xc${o xAl`5*Q,+K[rL˹~ Iq ʝ :4R珴`Lza>C x. , QHF*V':4ޙ hČ%O;ۻ> 8_O[lxY@`iq ~TOαh`uJ҂CK->a`>Cc6HsA34j;hCY;HzaO:jF/2WL4V(|Nĉu\Q4i%Zj][T85,n+3SELns:KGS~[J [O2j@U>_QJ_| ֆ?.+z ad⬍;K[{g:G9c 0Èw./azQA&fo`P258z~eT<1Xؖ곯Ϸuo%ގ=R|HS%І}(׭3yrinf@nuɲ4 ]^ArlWqozfR|hM̾pV28+ru.cŵiǍNۯohƯ0?/翝^aϦ !96: p%kϽ{ /I^\#,nuXJJׂ) Cd*M !re?䪦^> juώBl.qDns UuET6q.Z;wh̽ч,e̢W7[-٦a N2M':IoiL D{a:l{^kO2Ӕ4dؘi7f9_@J3ddp՘3{ӥ՜`.HDX c;ORadbcy0[Я1&/ג5n4ELMI@¹&pkX\ݪAN3gHr:3#4DO gT0)*`E>T$_cg/.m'ߔb-=rCM_'PGaT؀p!W4Cv}lǘ+4dm?h1 ,Yݦ2 :  zlsvk *u Il a[%9soew.@LO)80b MqJڦiCLl>] '߶$ Er퐩#X-vWYquK2 gNf¤v;5X/YSdwNep (q/<\ﯜ3)嶫XI?t+00jMz"d0Z? fF@Zi31bc 4A\V4< ,Lg2r RaҺἴWwrT%9XyGf|ꍙ+(Bo 47fiC\e=QظmGQ>R%F]bha Ѹc/T_X)˯.l3d}:@꺵"BXhf*mOK ю,Μ(w`wG!_d'Ԅ1J8aD_XZ]y ZSj]3қ/-Sf/Mlm clDʵl8A(6U&lMxJ AP..ki,!qQ 鴋i'0i W}qV;"p4 $?X36 gac(s\fr\sS[R @o,jE`vr7-=uS[H8dXAjC(uk+ͭ#"h\gw`㷋}a!l4JBҞ%եqYl/&W  ,qb;}"%V]~hOlXeЈN ݚ2H!H7ji]h00Why o`cU ʽb͏ 7<{35/D򧀩y k^K';| e)[\'C~wz Q>? T{uYn Ąo!;B@ن aD=L{elA` 5~KHyj7*,=`tP.*Կ=GAx؁Ls)4n?lܩxMoA2I^9[ [t}A8_V a/tr*>qvTOV~3h|$9#Si|# 7 Ides 7S,eF>)rOGYڗ1KHdwa™Y"n{^e"J%p@]y!4mPbaf'T!#I*\b;A%y"LKwNг%$YJ7|%W}y/|P\*n(^RuBTglGq[J?Wg {qN|P j\IVȢ(C@~X/X ͙M5X|.qϰ:bj9 @7\ ٜT:.4Č4VuoN. Qsw=K muWqqKJ=:]'Y4Ib v@4=Kddzfmus2 Gl$zgzX x\UrtۡFC׸qc c¼p[jfY>nB*6kmhV́Y aT3jCXeˏ~4U~ICrԒ|yAkÜ'cw?~a=4{H1|PkQYsTPb:8sg޾rfJlJHUaČÔ&x791͇YOr܈tEhu/)[Qri}h4鿩X^&\?E:kI*?M)Ԁ?]NꪮUxe,j>$Y\$Ǹe4jQ"%K*iD TfRC^sN⥶) ŰqѨ]eV70XA؋C?d2` ;kp v S8Lr}:");[6̎^HJ4M>> =9@gAC3%I!ߓ(fTAk?W֡paȼ?ƽ4A"E:Q&۰"uE#8TE 56Zz8kv߀ė' 'nj3Zdjlye08>m``70ajjWi\AM3Amc/>ѵz/J&fVOp:z4 ۫ow|L%n7u +7m:yж>w<mC >ϣ>bz/]ACe Ӡ>䗶|is5Cx)X:ɷ!M.D:ہo*P4av|0I]u:yg:_ w#o|}1^=Ci=4G18i,"(pSU'[pT S_o} >)FqϞ]C|"/jHMLlj}Q]I=%Ujy_G_ kءO,I BsM˲j.{i9(?9^}].1WL9*n/_I0B&uB1㯓g]8>uޝXfiD_Z[`P.8nO4(aɔE#ހ敼 iE#Q7~%j;B"lK&nmpבY-G zqg,~EMi` v8C,iZ ( |K̉t*ZqYOM m)Mp! .c;6ĩ|0{>m)d}]8B'5@`Rn*]plS,rF'Ni\Nx!WfFl g0 z}-%em(5x'٨.num v˴q?2E:1JH}( E?;yNKn]A@& e <۸Xll^ٷJb_:<'$5qGy"JCX{: o7Ũ#O<&1mqdyW-TѶ8lh=W/KLCCrR} N(s ;ZAX5ct w\߭;t9aLo6ļ$\#P"`{(KV%tu8=ߗ SkLV}XE9ǕQZ͡sDYQZ]xTHW+L$KvaflP+cUg]=bGAʛRKv-풘[tc޷{3aəp [}8گY8rSoUH2<'&q:BQyWӄR퀾`q'e΢l3oiDʿ;[NJ03y02QV5ZAՂȬ;dZF!90"/$F=]bnfMSx#~x7Y+vmn_ۆwΧ!ɟQ>dswٚe*TA@EؠƇGKnʗCͯ_AZZȩi4( ڔVh;-O)RS'9ECb^+2A}}9ϫ^gOdKt[ɚx*2EhJOP !6ɠ:ۗy .U  zb<;v]ir$WI冑QPqQ5qoF.K}&) Ur?;⪼*n'rN<7l4IIpWg66dA[HMFZ|d#hޡNSA˜(x,l^Uag<|T>db6.8'/ˢI܃qsb-Ѣ |E!ll,Xݵm[x/hI\Q%r ;;52Od(T.WHC :3uiu{w =^LTF[ǠyRV8" tRx9*Kk,0ELjgޛr΅ėY1"!HVecrRUgtbPwҪQ; f(&~/ )y2v|hC]5PQ ٍW.ҍvcK-W??Z('-Ɗ t2@C5!nIs1T]6/nԉ H24P\-AUG9+u~ZBob]yfm:+鍭>Q/|D2u:"kVa)~uĶ0/RAOFb-,#:dW ˯7F7˕QV2$e*]wb[0YBZBg,E5w(ceAvщOX/1{b*qw7yj{9,llhɼnEׅvcbX,?S"=l `Օye]kIK)B$rB+HC3_0=:]VV68J`ƶ8qkV+Q]k۪ߍ / N` 淰.ڼd/=98}PQ7JUWݼ,i#)T$B:8D3;y) Li| w OҢ.RB%WG';χi?-lDh;heuLȆ4BľW\#֦ +omy' ~U15?GQi;@0@:fޤ^#]nk bgQ2 m`yyYS%yBZ 5FBГU_e0]o X==S@ W pZpIgz*cm˜ ]oy N,(sYpZFَ&vm 㹶B0`Y;ҹhOo~WizRt{ru ` J^R 5 !'81!WEbHlUѲQ9?w[Dp"&&`=2 -B_̎(S!N; -hO[٣&LJʁlɏpg% ۄ7<6j$= z=RZ.S:)[c۝#r-5t Rxybݛ^\$TI`їl 4>- WվCNլJķJ/{3.э.80K2} Gd [4w~ū_M҂pK\2[y6):gBb{ͨ4zR]jTP" m&睪f~FΖ \*#ah,GV(-Xawʼn_t/k(!x`9ALcp8o 22MrowECGZzJNeZdW^e~βj~#xsQVʅJ;XCgn#ATmBp7m-h '26:씊ç0Ep`n֯ he,DRׁT7,.{:5Cスъԥf@ =|оԂ56gYRkGainiVG\oq~C ,:5vK!N*) A2%u em?ׄ^kD9 pCKK1SM_ /.ly 6'ɨ}~.uhU29i"(M0kbz>ξ5Fsn GWx3tTo 6,ቷ|2Ӟ(:Ig6" fTu̿=##r[},^{zE4>MEtv'U*ȯ']F$;y4Fk]JWj| 󣹆,va%A_G_~vGcԧ,'mb؀A'E8QB$6lR]cMI@v^Ksa.}O-{B>;l͇&jAQ쾷 5Mϧc5MY2ҷ7oly B H۫ vҴi{Pvc"EZ}$ Ucuf 9SnX p7?WbۃDn3q3l>tCi]sR2}gyQ)G^ d֞H]%BNo^[sE8n0lB>!aNR>Rd"bv,q^a溳q=xq T,9 Y]:PD6+R@ ژp~ t? 8, s}X[ӊG|y}x=5$E'=Q\ 114 xWҪŁ\yK8#!74<&o7q#k9u7sȃ涜y I:n;r*t;W?P#-!^f/K­Wq5"l QnmaCޗ-c#Q,qcu.)-[w d_h@+wKW;%-\w;xbMnvA57r7,>}G0,"(Rq̧["-{\BБR&Z>QռЙU2g1vl( +d)Y?$"$iرcR|qT'FdkP)#O59UfΧwL>{"6@tQ)E?Xc\V-.Cʑdΐ &QiqsI^y!g䟈ɾaTyDNfI%7e{D顬~KZ^ia"t. c1Ey1!,"ʞqKT 'Kq(Di\-hql}rmT5џRyP1˥:룞R?9wvY?}.?kIpˈݱaȺE%0Pr@S>5$BB_ZcϲW\R[ѣ{ K4BؿoEuл0pS?( x1QB\@r^@K]Η}cL*$|=ogjq4{P}UN;^'qd/Z5x`mB2Z=AeYyꥹF>~G<-{\56*:0?Y*ʡ^WtC h?OJ gVlHLu^:%fvw,MI\%6*D}b*Wo -҆7d?W,$ /X6'HkKu2,kԁ=WZyQgi 9v;yΜ(l{3#ũO9j}JEp<0ڣ E6\7!{z&*2])ЪT5wwC3qэ6Zn\r7d hn@/?`luRqGS1Y/7a)oi"LYKf9#OpQ*ʍx7ÆD5tS00/*F/(<큈a JPNtVy鵔]7N#j8o84,w^BTFR(ʛ ?[[/x koSb=o3^w`;kia =Uyu Lh;Θ=ܡC7Qw9QUai\h@AL]w-QOSRuanɳ\ߚ9wj#&)8FI6+Z- n&AuOV+h|GZYE*y"掞>iL]xdr^:E&nj,y(Hsa&j'`6MFbHei}t%#d\uZĽMx^_*|?=Q ?"H]Ml (ֵR%7w+1ATm>d5]VY+5uM7S* }Ν/c P0ޠb_-P `kmAMqps3[x?^!N,eFKr((P3|*~hw7n .o35Y.%/qnU@yR!QrW'QJ{S?&N n!dXGDn9<Ի5iްvak`i@R.ntg_[jv̜i7/pnٗK4?pdAwTO, ed `]ZS1hvp7(ck8)7u~hW)4+ ,ںV;w #sj2yGETFMsI0 >{1nm(}ӇҾȊ1`L+Em Ds!-^ig53EA(,5KRi=TlS%xrO!N`!B.q[rj+@O5j^k5 *a+/!`I-L<hG}&Wm,Rrem2^gc %Î:?RH&+0mmܼjڅqO&!8ŌAs|)yIr3Q9P3-OgCzsH)VJ0 Cj 1\nsO0SU6PQm$̾'!p)r]1>U@51RET#M3}>mY%e.C.gt.Ap D <|e"/{1$+S"mofIn;J0 u=6_lju |&6a힢\jxf5SJr@9gh{jUpz =&a{hsib^V7Q0bw EcfI{B6S}8Fֈtğ'6qP@/ Y#1,m g<_ Yk]IoK`{ӏd1R?&%ϕz SՒW6WZX&49v|wg%{qr4#膌j2IsԀf"6/+UF*Լ]mtȱt=T']Ҕ"CTgptۜȢV|W TkÆs` eQ>G-k f_>9.d4 yKRzUV)DWΉn1za&B-P-]B> ~jV!pu4ȝGv{#jIv2lG!psl͙&Qk;kwh%;W~fg*2һ0%pW㹲#vdT1ZR9B.S)P(||P.s :1_';.hoWofm}gb‰__aV/ yhG"`ԙhS$8 D^Vi S{gZGHc)KZ_/ g c0jJh|wOGˣ +HFCgEյaATHK kZq F͏hG%͝Z靂WWtIŌ1ƵI'6qXdα&Z%ħoQ@ N ڞbhJâ4pP fZo/>ގ.c^oz*ݤkF ă79pt?AU U:5R٣6&;〩$(ıdS47@B\#ōKiV"`;UsjC]C6LZ^ 9Wf]`rq麓oB`~5ŏ|bu0iaٚqw7~zz M_쉅rA ]J'FӃ-]=[^9AZGB({&W.T]MzaB]kQ_ 4ḑ E7\j BB}KhDXRB#;rb:V2 ʌkG .[ n n :Bz^/{ywe|=_֜ /hq]CL>~z]v`kD( ecOqA Q#` >?o}Y>:H2ѕ I ?PE ~%\ Ilя+N󚗆ȟAТ{ d{O+@nΥC/ QJJO;+$a Å/:fi_~0v儅o쇸dVe8|)/XTkm.O"  oO w^¯H _fi+8J|#&(Ze~)tmLQ[nB8X߻`IxcQDzM}Z -~Mc 3r7s&q .Q߭VYiV/Ϭd\^6a傭6 +0urUzL"证D2܀գXvӧ;΁aJsm&JD=Af3ce.M Btg\} (+HDBf d8InD3`t5uM4954b𲜹Xk]fA#Րŵ)65J씕)qj"[?mIF7#JL>k}W|<Z눎kޚa;AR;8E%qEa;XlXl)}0$ź2'ʡZh9F_8wnpm0`Z߻QV`E4tuTt--R%Kmm7,lbpAk=~8IhޣmȽ)qψ54&X8]U?~ų#RTH~*V{)izOO:`ښvi~ϺS3eߣR8bDk}QBfyfzbA4.jzqwfem ΄'h꾿n1@Ξr^Bmk/'{€߭7)o#.zB1GX!1F-/f$}nUA:cb :,vDcݲQr庖U C˦:}UPGK d~EB[_ ␏)ޚA̔9^㴟; :ɍW,5Z3bBW+57/ 2@k_HoG?Iao/GSgϼGQXX{hcz4^iUmVEPT]ҍNKU+h:".5areamHi .:CC >H h>bH+#>ҦX~wUYSzq6__4>L1Zڈ8l9D& DQPT0ReէG:L/{&BTs"ꃐݝJe1ʅ/0u\@:mG[_Ox>o//fRX)QOA w6eSc=Eſ ? ]A6ׁ1KAtyRNzlZpaOg842 |zv;ǧ1` ]"L^ 1GT"Ka@@ ⍢-~!Wd,Ԟ{fs,'G;YGjp; x&,F~k!@kAŌ ;ہ,r~v&(EI $K ' Ɔݬ/P_xI#v- plMblt&ex$>!ea#Iv%Żr'O lOXOI^)>0+t?*SxGY\9fRX7_г[>o+3'd}_$'!Z &g9l8l Bg_VxD7t0zˋS:LN"Isv޳/G$<$+sT (Bo%`( A܄d[p!+{0R'-cFvcJfrդLR5 Zе_T쳓@wG'rTk$Lx Vȁt]F  =AAtAg~aAu0y7Gxw›Ǔtw\$QI0(U?+M}1gPKwT rˇ >ru 0(kFs "(9r͑'fk0Tb?5LPyJCfn@xdB+4~vR xgA%rTLZ"i%,%2[Tàcݷ\iP|:m_oN T+qoo;3,4Bd~aۦfz͑_L+I1K X,5G! n`=FmB=L^.*j9& =e9י)#{a |ˑi"e\R"fh)*Jm5>Ǯ5$| D1 ր+4W5Tot ZfDw+yw0900C…`̶(z7Qe )j[PCKz4$sB"/ӊm2MF56ٕqC}O)XS*ng~u#ח;!2GpHVfA$4(Ȅf9}m>VwYb)XBĦ?D}WQ Z3%3x0cZN+=e:WuljĎ˅$&ͮ6 !jN\h,&x 4_%P 0 I zNFR^Xu:)QvWP W8+/ ١*Bd+Dp˰wȳъ!ɦ+5b)l*ѝ@0}a| #?1sp>?]Ek)ԟ'V)Ė\YV!">H,)'K(S`L=s¨<"ݾ &RV=iŌxoJc3_-]ه׮oO(J|?~~u胋(lՁEAt W&+]L}6c,_yin`Qƌki`a SK(iakO;HkoZ={RĒs-dˉخFEACy$O!_c&cC'?5|+\ .ocYu<(iN40b}|, 3QR*4ClSx4/'J٬aNb攆_pV )Ti'/H:E$gxQp:]jx3 PkSEb_=0x pv_@\I|bS6(ՆMʫM@A&YCh E펨FTKQRbkNGI);;|un[)EpꋚI9ԩ^u#;&won>[zMWӔVۃ_YJP8'AZ4TxVE{^z KEUHm(y^%0?*߈+)P7/YP `>ܽ#8h`=r w"ƚFZE2ꟻ3UFTI7X?Io L'sK ;·';*xCw O8I9~KZZ>X6:G/j>DT(rZ<|9w>8e5)?^}'~ NG~q[GtM@hLjږZNص;GoxlzTptѣ^M ^E1|mJ{#0,O~!\0I3/ guڳ8]v_1ej(;лkM"L`Jў8E0M℁'j">ԏ$sԮ;ϻ(F=Vz1QKhMs/? +pg쇅ÕP3$yg?3S&3kRE!D?SD:C/a(뜳"˯ 'ھD&,qn߃eyF'(1{uBr#3 3qd~ Xy_4Bĸkf"\8:H8>lN?a˽uJMDi2Kb,ڢ}wh`|howO%>(khl&Ղ P5 GB.NoѶԳԵcQ<;u]8y NI{*`$D'⃻XݎȲ#&3`UI;/doBtN .`;$T,JV7nt^tTs]yx$ۣ#/ǜ@cA-~gEpd&> #zL_l97l[}~)#jW<&PO^rZ9Ց% ; [~1A^jŰDDt9 gdV$l&M)܌,*(ĘQ$ȏ"(\C-Sl5[蒅`W*"ѷӅxNKZKSҟ%-DHHO6 +FЋNEW3*mTχu`EbEYEha4jK]R׎7q|b* djn^M&\ 7!En?[XU \a)N042MmOf,lld[F*r="[6 A<  !5H DŹoH&+Iq;8"ilKuXRٽ\*#Գ4U a݋ȰVYcqC:dQp*%Vѷq[;|& DP wF͌Ԡ"(?:^MO]XQt 3U(YZ^;2-qFcجcrN/kFPegˈdHr3vC=+ h<5O$ۨ/Ibg]>}ESc:VJ/$=[g(FR^NUsWmwxJVr laKm迲ip?V+ykJE]u#00"7d*Jjċ+DM96$N6 UDz*k(mj `TT˞Ўi5הaIdsҒ!5PpkvUFd~1!z@ @sTmAyvo/h_1sʏ^E`e |uǣQ2|7a$\ȸ]T׈pMUUd[%R}f9Y @XUdQJ`b#`Rs 4H9PK7]p3&Ժ vAMa3坚hwbjgARf07(T|&Ljdy $Фtexk҈FsM|8`=B$>WE8Tί 3Ki~9ZA9wgi+%V c9Yپ!T5R7DF{x Mf_N!QVEr=4$# bjD<$A%~ 5>[sj00a{>{VPxhK@UjЯDM0`̜娫́2s.| }C<ǣבvA `zE򾹘o9E97#ICn< ~tXYAbEM-.'p:E-oyy¹t:MBµ֒ [&(MLjYh憣I`펺j ՔxB{i-0-̮F# [t mwd+&4%=6T؇9L`wH/jzBzNJ';yki1!)n6ZtKeI04"3lcpb^hzE/dDi8nD<rh9\E×Y@Zo{@{#>eXJ1th  =A%r#d:-HJAm-pROȦ#5MiS؂LRt'7{BGٞrv6E; dy6Z%-zuAE7p"/xtp96B&Dg'+d{rZSc;Al.D_LVkश7u~s^+oT6yd7a%X|ui ]㴞q'T!ȴWǻrZGzK_ҥ/l/JoJ9ɹX7CPkpKboۤ5 jgxm=e ?WDa=𼒿> NtrCnaiv.o r,+InN2IMRތ]6⒯飓8mA@ץ;pɒ Ǹ-cNi 7@"enWФkй524O3]٤׮ZqTaT2?ፁNNPȜň-?X sdvsTDPZKOwhԢ92 ul <,-Hvr9q#_сu10վW*XT5rR 2nϨ\&\*Y+p2K_a$PrȾnԛ m5z{#pTBSKt AQQt|xRvu`6FfU+j c]$sS0h#f;-\Ea5 9zYb s CW- /h폋Ew`W^pj)7 j/ռeuL4y \ }y5_MCSp[v+3T}-8N?9ԉL ud)#+_Q4Ve(*7q*JgZzkt Fukv-)BFT4d >EP=rxq \ìY~!JeڛYу\Tdy:= lZ0RzBζcJbZ9͌!GjކOo^h,]la&.TD3mLxzgb5Z{(b]7O\UG:xKEVEHB$#[ !GΧNS[J/@Ti~:0H#tKh:_ W3D"Q;+Ecg;iBnL>C/hW>ll ^Pv$( b$3nP^T4c3JAl 36óQO o$ܺnD>0Jϕv:*%JΫN%geGLRp_0)6_uTS?O(U.ĻX }n.a@U 8$t-Qn8 ]Qt)T^Oh)"Xi֮?}3.d@=6Ko ysxGW+9 p`z<mJtnbH3ʓD2 DT=^nyȪVe~NQ|emiMe}'C' vDCΘq$ay"/}ro5dNl˞v;w&K]'oõfE:0g dGxTnϤbɖ|ۭb+r {kVj!}.qahxssy,Iqh'jْ~2y# &~/m1>Blz<:wQd+hjr{g@~\פ?^5dO4ݼ\#U;~|ދ.`yC&iLj }]q! yhcoftw-;ʿ 9NB?Ċm~J:N/l8H^ˋ؝+jPv xr<@kcB7NEz]}NTЄz) \76헆n8PؚXQi軲 & 2A~7Qbܤ0*]GH%T6``@55z 7cn<ٰٛk%:"7&o*|at`=gZ0 ]R/- vde9)(NFGX28&tn?1 (;4u"'%=RJվk]c>d>6l|hH~N4¿O6E(26P憖o>#sEk1V:9:46\^Thݣ)N{?iMH_hy:ʾU \ Zy4s둤ƪDN?7bσ+KJ%TU@6DH>Ig~`۷3,cIߴ8k= ៕<ଢ/'Fpp4XTSŕ؟G%թ *ʥЬդ $%+( OT,173y68%T0MؿSBJ-@#&u8{RwZh+jiK.Хm|T}]/OQ' Kì;Out!ٍa魣Ӷ,!8 Ӑ$.4?F+N==p̊ 3TdX*Q~ uQTpͪ77٥[<|S朗{f.Z&9ʥoվW'_y-eW[s|hpg8t!7]AgM 2#C؞&F7`?]e 8$6}g;׿X6-<Kq%C] žsH /;)ȥc8=!vugƮ'00!ױG%jyYES}QZ` l]9Y%E@OܖSF/df789R1|&/m-c[KH0#:*ջB,CQ"WMYn"FoW۞_S<ҎЈR!>=3"g3cFVCxdQꕡ8.ݮ'?RVf=)(ƨa6bykh V,]29877h es !;< >8bK@5O[brRʹVv'8C;nK`D'B{b?3*Zf; .;'rN18/ENhffE3oĪҔLe#3̑˝9G>R~l<V7`㶖]*OvAAUB<^.`%?H +gӠB8^ "=όc uUУ|tn/'i2 dBcRH5ͅ)G]q ^"9bGq$y~Z( e%+@dz2,9 iSGo# 60b'8Z[ZI]@v.z0%U&aI(9 "ce-Ӫ_-mpjEf[+XUSS@ńRͶ}~-Qⱅf{0y%$࿉BE@l&u Bx1RRs'[$lluN}PDqn6ݷcSAste+PdNbOѦ0w? ΪH dn| 5#}9J e"wx>5@h LZzP0e K]0ǥt^f0: ̶<(u_ `QmG!]zF|5焳md^`VO3 O@ 8gFE.{y ?Q)צv `EHEKLȠ1Qo cua^^4QTB۪>K<"jp'v.Ā/Y,NW?v׾1n [Ы6<,5?=7QnJ뇦rs5X@}VIG*/RALko2W9E!Zڐz۲h)@ܸ* @6Yu?d՞%v~r츈!% G3CtO;FrdiSussR/Dɘ¶2&mf[F4`ݝk0 =mFm?#:*oTugmGn R,o.Z`lE\a u @De4~ǣKD~W[^2f2:haw>&<~;|+'w4w|"hjI֑ޜxR-~Wx^~%{$9LyYr1;bb%weOfn dښ u(<-%Zl;T&ի#RpRUsN9Xqt$Xsɠ(x>E7E\WzdIp+R{eJ E7) ^n b_>cY8=Om@9}2s9\ o2 S^ noykB#lqDLlǪNfƲ|֟g X E-^1};xHUeW{"+4]g?^#7t>9HrF E^9y/Cw]H|Q"^L[xigk^"J6UBqԂʺ7K g!9z ,`Uz# k n_ q|K$*K6/W58YP otzY)sK.oɺNY+;M(0*{|oԂl6=e"*β2dBx!;\jolS,EhQcdEE>U(1`,"\fߝ\@NmУE^C73mc&TȻ .@8Y*nt+ONuIBƦjAZ&w!}̸5ն;F5a\ M Uanb34f\X4It-spG# [ !n;%]8F&o72ߏ1RG#_ GʿJ@exBj݂m)d!!D$&NH \V @v U]W *!9ଁO%76`jE^$d[ץ‰WHcN.Mw.61e?G('m*L?;=1&,}JrLaWH| nZĶg@/M<*@v{Y&1К ` ֭.6Q~ B ηm-fLiktf ބ #VO ̝;Pp0rx6zaUe~Ѹl7>Yi?y&Ej8NW ] \, *w6FE*QPn-;`wNV8:*i4\jxm=M*Tja¨G^\@ZuqP-qAzEΎ̊Vrl=KWZBMV8TMeڧKUUӾI+GDm' Ӕ dOV[(cHehE@=W**,bwaZ~tZœ|[D#cEV_;{=*؆!yy@mD;E6;*Q)汔`pZq"9g$~̈́h$)7j.*}b0wT%~.fe"= ^_ׄPatȿYTπ@)fL:ꈲ K*^wkAI }!e@wӕ\4zyJKūìL^Օ4uh"G*,|o0mqmQNﱏ! Y*p,16(t7(o [zl<}z^E}(E\LJwץy",){fl6y[^ol=@Yi%)C}סws@ @<3@SRyeATnD,`ڤ:ׅah ^5ZǯFqrwb+ޒ%|$=v֗46L3@uj{T])7ؔjU/F: B @׭VP,-7.Pn|D3/݆b9o氏4ĻhoVȟvY."lo 4<8<3/4&3,ݐWѳ+(7IUH Aq'Á*[KE{$+|04eԧp #tyxrJw㼂&m@M?' }RKMyT3"<\2iOV)}(owY:zaM^lSi Z"Y!v*A@b!JAg/|$91qS wܔcE r  dF*6<κCcՖؤbj3g3A()S年d0R#!>wMêsw)ZeR넾eRCIǧ[ "i6Gw4.jml/9n5תG'1=:N:ɬ8!X{a-!;piA+]/GA3dR~&C$O< :V;G^vX(N%Q{ADiғ/dV1ۈ"SX4Z^kqhPu"aިA[^ΕmE>ӽL<4W9l$`%>ӴsPϮ:S#ŐD&<$TWZe)" c}m Lclz騃Uv. k:Gj?#i u@`H<Ұɳfu1fu q(@}p9c-c@I6k_]<ׄ||ӂ-RUNH(d|Y"QY{e`QK.c9I52i;[Jd25 7Fc[I@ur|lO|4Rz?],Y7IU@V1+$z< nA>[/s9$AlnΗGkN%YVJB-iij4Нɑy~&]y {CH:u=n1\ZC1onfQs^#sKhv3R#r=t",r6N^LU&X?tR-^S˺kP  ..kSK2IdY8.d Qݐ;Zk,XE\3G3d{E [5 P!{@(#L(v0P@KIixCya0ˌ~D/j~IWP\N5:dCnky A4pܑnxyö\df*dliJ&I$,8v9s&N,#%9XĚn;pf\8`Ԡ7:>̝ ضP1p&3&AGco|]/'> weSc&h;}<8m79?)=17~| -5z5fS[ҭ#Jn~JeY{rŨIS"x5Ɵg,^EX?(W1GOؤ.^ͯw˘ʴB#H X_!~t݈ 'W>$&62> Bs&Bgr6RgMOuv4'f۱I;y>FLgC*߰7}[uݩX֜ý̨dxVƑ:va.y<䘴d"?+^[=a)a$PkNڡܱb]. _ݱ'7$5VhaHkiۨ9N".ڋFft P %,G^g9EV!V=,n`WBqn +@~--Ϻ̯"s:ހW%8Jm̌WL&x5hTr_0>>ӹ^j&`ywMǞ>jz 3zZj2r#C񐚵Ł3iu~`w);/=5fB8!Ŭ9"oal΄z2i`Kii'DԸ=`n=ឫZ+b3 )^ν֖:#! M$pB-(}U! .”!TjJ={nU*̒.G0O~dˈ;?WE5F2Ev-C DKOnk&vƣvө?ŮQĶ ׺?1-#M)Si8J5>&iS[xU%hNa٩ ts"iQ &YU*Eڿ*hoAmxe߾e `NDZV])x{$_r͖3i:MXwWK|#OwH>V#Gҕw9C@BsۇP ̼EA;Jzò$˖Sإ͵za AS哫C8r!\$Oy"3 H%O{}](I0c6d߃y)Ж59c. l=u.ElK3̩qI$'yar͢sBsIܱBN\V< w1` U!yGts'KrX 3q#jfC~,jNM Hj.Q:E@Ѡ¤Eg=J/e%_5|k$jʆ+0sF}f UЗ<~5{'gMXȼ ]h=ߦT򵯩GLv΃Oށ,v.Ki Dl_.∎0=~n+u+KhŔEDL*=jd-srXU1P ֽ=BQӑ5O j.Ȳ# C1mO\ܶA;hxvs 6/q5޹[VB|4?Ⱦp$rR>ravq,Urŝ?LJju}mg9-_^=BVG&W֔R阤l)@:#+J/޼ #}T>irU~@/*#~Ug0?S܌dȒS8B^)VWRN&lLI^y8M܃oEd? .JJ+^A Kɛjr&R% 1 gu[ {Wo5)~f͸g\0 yΙex7igGU &JnvR3E+ RU`N%B-xq!ǹ dob^jw$6M&ث!䂨,}!!FGkQX`Ll;A]n N8$1"sHI:bklMrqgg%C4 _t>2aU*Ȭq f-٬r̺СWt n"P1,f,;]|OlƖMi8ۏDHKSE$&,YZ9!%ĞL 1 IlZdAx~x )#3[?'|zwS 4ZuQv̿D cRIxsњ.v?zuܢPA}UwPN>$DL>Oс>3{ ʆ('ή’Hl ݄T#Ru)bت^+BZtUM;ŕ鸞|:m0\ldOF4@Nvli[oZ|kxcB{m_}͵4=8Uņ.)nئ5E Yñ͗P ,8hwL!^O/^Ktzk@YʚnɎ4NKIk= y"@Zs;-D L?ټQ1~0Ol%Vy@}oA1š2RC#H]x~4v"NJXt]"{y G5" 0@kRg'3]?T\ԚdkTfKs1A"oz~aq5/׸DLbn1%/;73C)Ri!J>"l Cr7W$ NR{.4l ԫ%M݉ĐſNmJDUY|(DgͯhԽwÚk֓ViќRbi)([Uߝ3IwA引M.zq~c( sz'e>MОU\qNFPuIkDxi#[A4?` X68\'eV55WeTKa eͪ@ȼHyz.m#y2/s|k=6c< 6lK)ÍO,2#/3wwΓVm ʄ /z ,(AJ )+7*2;YN.PğǫՁا-賌"brhZ+Þ# Ybz?f֑&,Bth-=)M֫[|<x<8JL q˼o0iMJ̕Ss`w@`]t׌S^|]{Ia={GudV8p拏Cߨ%8n n>wEhb㿑6r)+Swa1@E@T3Ȍk4"e6㟅ʍ].ϦfkTEpX,d]/C-/6qcE)3=}CA(8 SԤmp09,2EPerB]D5t˦HyQZ0֭!4 tPg01YSޱe`pPe&`W}g!y!iCJxp3&:Vd+DB9iP^Vֺ<ifDzG ]&XQc_x)L%-Gfݸ{N0M&caG btz70G);ʹV?Čds0l5$wZj54#^?MceQ9Cmڇ6RaҎ~V:?7Aw~n~.nFNϹSu]ddPY] \kRۗgⷲDt^^N3NmHr_+0Z./rLIM?zkCq8<{|\6g8L1ƒ{ۮ~&u2׺J7 vg s|j*MEx8Kdv>غ\6T: %e:uIF6&YNb^"gL^G'[( [-ɪԀ],FXw‚J]ݎ1A$Up|e#+!жH ^2*[~ғNaӄ&IUE٠ӈYXr'eq.Uc-<fbf6U~vFug%Fv `r?3.Ik' \POT,dDL,hL+,D7Rh0MZ(CUHۦ&ͦ+ FQ'[cߩ|ѽӣ.X`+2(żͥgT${H 7AW\1z]ҽ/e_v $@RQ0H2lm%eÍzc\{>|8[џF;]'ޤbEOFe7rMʱ+ cDfF8[`,9U%-]vr<.LAttGPsԊiFzKFB9^;={aN,h\Flցʦ*KҖ!}744ۆjٌFfhr=2ZŽ;Hf-s_|B0\;v$ɮ9*|ۼ+`V 3\B1҇ ڱ)n|i Xd3L_A1"Ye8P҉VPFL6}zyt)5EܙYRXR?5g OWk*F\i|4m(Ha;~Z6Hѹ|Կ#SC%Q16\'|E>쯧\o'/2n'$7)atE }5ACƎUS7WM ò(,7D%S6Y,y*h͞UXL 2RRh+O= z/k[Xuǿ2Պ @V|S}LAٷ‡✣Kt>5CN=@dLkoEo8.ZsWL@}L "7'Φ6 ~n&OɮTH䎨IfRнZEyƜ(I6`!52|JmDq˜}joJU@Wr7Pjoѥ׃J>]1 4چ`% H'ȌZV5#2K3XuR;3e*̅kK>/TQÆ]׽I2^ yE96 ;}MAzW/B!<)5Rv6rVǀQ 2%J1Ri[1'vww}S|8s(:U&lؘȁE_Icu]{ KDEp@$-+B$4(&*Uoxه5kP!y0 #7[#%ӗzVx~4 ^B(j=ҝ40tN&ye~yC|ޛ{f@I+Bu/eU,l ^9bY=41^6 ;T9`e;hd=AYRNEXZPSal̼32$,R8Ԛ}TJk0*]3^ :aOE.B=$Η2n h'I:jW5鞮)]M!.wzEyNtݝk7γznh|jSu4}bJ&HUP5oDRehO6긓Wi/'[Q\^m F`hL;<rk%^`]r0)Æ*=џd4I[ʫ .bXƊR['yD,@P#zYE;Iw |#r1jZ3Y2ݥkG6Ldݗ"`@ڇmr zNHZI|)Y [aW]=;_>$?+Nhۍ}NtQR6&` e`֩էƸ'K5"U/~\U]1 WOVW#7{JгXՆwlGx>@,:A$_&솉]+S?ph-))6{ޠUTBw8@TtOW4M"`2Uoݞ`yND;P] $<Lna*%/tas8-0 Hm[/)v|9/^<YQAMvރއٕ;{L6$L$,@)PmN/y ,~یvEc!-هkZfXqgTTMmv(>1$y"85 897 R*_i)"r7x=.2yTXxL%J/~zZB7"γXP! N _|"D>Dw05YTBݙkUػb9!SJ'j@S"Yh ! ^ewn#2 $a8dR4ƏCE-yyQV%$Ɲ$i3 l0xDGnvC$xﭦYml5کl,Yk(yLjP(-[q|,l'L(˄9-HA:4wlȅm ma``301^yXS{o*sʓ] Hk-#kfЎE& CcH9>{t2Lց]'Xv[lڶRKhWI9<<ؚgb2 Rk߇<ә (EgGi/wYV}z5$J|FeO7Nf+[nپ"4 n;?X+&x GYf?NH 39yb4O'sx_qļB ̑z9E]:bX);C6cXce a!3}{T +?ReYLj bfDS^VLIȂ6>@_m mStF|L:F J[z:Tq~@#5vљpU%ig̱S7M%|BGg2QL'6t1" QZR{-.T/)GQVK83SLʳz-v זjw3Rzps.$)zɁRkF1` [ 5\=m؛@I%ڃҐ)@c+JS+a^k3(vZ?0R퇴&οgSG|q') M%k%+n BXWdv})gL~oHXI4ujsb{mN̫je(K BIO OQJe!{(tBBKX,W +:{bLv; )ISxtBnC1?p:V5;[)Ղ ,,rڽsyv2QJ9qg/;I Vq'=[Z3;4hN=juKtZh5'~n|:GD<0|wF޿F1^ ^<ڂLW6 Ng֧-b@,2Zyd>c6=_407~7<2":YKw3@ϣR*Syf-Ms8nm#ԋʶ =AŌω ! Q*̙ZP fOfgIObҶYv;9iﯧAhX %*U4Ee~+ޖD&Ul}x+255GA'4Ѱkt$K]5| ;/L%<P^8pOO|9[NiHT3QOnˢk\^Gܛ̰vӼr6^YV<0Mm[p`y0Qb~Ƭ@$sX| G R7WÍ:8-Α'ZOi.=^c`zNɝ\\m/TК=$۔% 24`t1ejW>jT]8ZWqe.UHKR`'Cē,g v,S~gyқIt{ mt> FqpҕdĽ1T@[>$WaUQ=Tڕdc"Ba8 i=FK4çZc ˅iNm/BQQJyB xh +X\YQ:@ t^aor>FWL=7-W/\0/7O24 _Xpbb/n;EG)WP5\VϑQv+ %@X_ Q5c3B5 w5_FvyFr͵rp@v1\He3%CdsX5ewbV?\@/r~+7,.J (E>L ^K) ̏m3LYa?4 8ܵ@KR=Ah_vӣhn==A"9a" IvcŕĴDjzct];9w&1w*S6EӺɞ\t?u` 'e>gz,f8gs)Gxt֠D5 S%UnH3-4I6VՙH7JZp `i03xYk8r˽50v:eed2 ՝tbXQquTV' `H o{cDhab+Y4,N]Q i|dơ|O7gĶHYm0v:Y6Kb]CZܹNXyTL;MĿDJ&@Շ#PRlN>#\2Sn{͐udCj޶.WxqPNP -}2h(-1sqƊgaL2?̚L)o^9/m(HH׷āsc&tq#,xނa<쟚 9 9N%t`U5M cya|Z)6Ž٦j| ,J3baT\tਊxz{tsY&1#>Uj>mti(aLfIYL|l:?Q2PrlG: 4YQ @NßqD+x[_&ԕDP1N>:~_ۓni w|Tawam(ɜ' <HH;~@` hFj8WfZIɣVlXz}t$|؊Y_-,aI/ϩ!y{xw@9>@Xֺ8E,R<7%̷Æť?lX<8ZK~_PFc>I xEqDpwպ0N qA(7yAfW?&S9-k5n+rN WqQ4ö" ߤЛ/F(E3ZE՟WM*:7 RAf#S/D1;>KaM71?u(/^@1mu6 a媒ѩ׸WIVuowcG rPt"eIk2TT\%q,chT&ӏdևIǻ[:Tptg5m>XcdH%XiGOHaMwzX=->D< K:#)#k ̑wVAc6LT)W@>3p6n=a-R{z`K|#beI/\Kn眹-" ]厏v~?Ń^|}7M,d =UBziݮ?)<}Y3$EeY*?WI5g|3nǕ1 w[j#ylORTm'iC6wXa aEʕpBR~&m0",# }9 3%5dH~¹xVq}g̈́jQq 4UXr3&_:!(M%7zV>t0~IJޔyZ@; ЅH>¬yJ|U\|vh>^xf *[7M$Ԩ;XAyA0(G ٚ?&)Ci\fr_-'wMKT^JuxOͯ&8~ߞ>̾]m%ʻ,d$K\D "bY )3жY"J Ww)m4$8)u00WE#avY }9>Ɨ$arAC'2F݇%~uq o_vŋ3Xŋ'#[X̝@E}NLd$ ҺJJs֦q";$|6[x%+ЁoX5-^?,BmC!n-˓gVX%-B/{ThLLVVӪཷT@BMŁIM (TO<)ʰ6CToZJ5N d\vcg#+ +Ŵ b r{b9,@o"":dV [|^7qTd0Z9lfL&m+*ِ J"*Dcuųt0[rÛ ̜y]8O4`/0/4fY}DBF+X'.W Y_1>|Ȑ5.ZlU|ѣ5j61XJ~msnTåq?NmΨῒtVZz ᨎ.M }{M1HX6g(i >.٪eͰAqao^{4`m9ٍ_.Un4RH7onĢZ[~灁C+<Ker .?h\Zz w<߆gu>Aig7>Nf֮3~NQh\}!E_A_י16xL6,м @D{4 3÷[蚃ſ9bD[ץAl0 -A dw#40^'k&nmL&Y}ArEz}%|NnA ;P_E)zmZM~&M~!!B M~6f ·c00F[, ݮ4DiKnFNLG⁍,je"]H)Bvw+ /KZ~q0>d-\ю301vc%Э߁ahRj[nw8D-smy:sh'-:LŅ,_(zf+7ㄧyMeԫL҉fm3B) Ź6\eQ[K)yL$G9֊6c&{B!^ݗzxZ]ly=~KJ>؆mJfK:sH#Sf!h˱;!OjǪ mac.8'Vƚ.40ؙ\=fAoNuJGd`nkJdp@5I/cRFE7[͵iRĮT{>7~)*S un+/!S`.tUDF#_4= Sυj*2|n1ww6C˾c9)3 yZI(ZvɺcܙSO_Ӆ!\N/AJs%o 8n1M2C9*׮¾ߴ dQl.`@_Ϫ?zdU7bȚ8#r9 ަ _ wͫRy Ps :'=mY-vĊ?tk,JwAz34+"v9)w6UNGk5[vI5=?IPT/udk 枒% !7t#G(;yh5Ĝ ^]@YoK"R.8Neueot-p=$CMBb.?|tg2  uVZ^нcK-ϕTe$CUJs![gȖ403Zi*'O{sϵ;ȗ ot#=VGZ-$b-t@ɄPgXw4 *J5϶Ƙ$k^"3600JBC V8 c[S}~/ ʈu+IrMt;dH}<Q9Z`r}8տԵ9J>t &'L_L\Uo3$ NU$J|: z)rmA iՋZ},J&1# b ;+" ENKaS( eq$@Cۺ a?w }h~v6gACMYKG{(O-Q*}ïKk\#vT8h50^Ng sXL{ :/IGqަ~ZD|mB|9k ZcQB](lQjMa'F:z^h@\^!BsXaL6B $ I8 hծ#Mܙ򋧮Ѭ` LՉjqb1od]D#C}W$$(vқ jDD$ ŁҴ=)8zvAVhm0Cg{0$~ 9\GxJ:)^կ6Rvޜ,UN*mҤ;=jW~%ɠ9zb ~J& _[{8[ӶEo9 J3. * wr_>㔱{Աu "&$wǼ]ƶmqbN\b-Ly-zd+;,5k3[jO[90 6a6v7e {۱+yV˴ 0K8$,e+@۽ mgb-Ho^܅v3 83 ߟjENa,֚ Ĉdeۻ&{D?%͒y5.ϒ]Oq &tFI}d(C/n'+lN4-u 0dv@~e- )9b H|~>+ӂKPq}ec:F&mvE:ޒmc)uotAM:!vhi-M-ݱ+I͎HagQ#.+V0"!\N>=%=QZu4#ri%=%]"ha#0{^g]&9,wj2|uYUgNu($6 )X@˚@ot(>b/Z?t/$Dv. Sz[8!íBK6ap%qwu>>@SWNa_[&*JD=VX'dW 21cɳ )5  erQ&sr-&Ya[+斣X!2 "y99RZ?} ]?=Wo%$oycƖ=mVEnD$x)K|(̯{+1IiUza^Y @,>^DZdդ*i+d,¥eOo);8̓*}\~ LLV5TY d|8喉X z)1-Ӂa穐J\?(*lS7Lg!L) ')\{6+RI&lX@5f n~eˡqO0$v* EԫA!]JΡLXpn膊P\Ra=X-c;/#hE?MT~R'OpQ/dFRC6I9fMH*/F@zwE/t+|CFx 9aԗ5`%4(6^ wCpKLȾ!8oIv~)Zbb==Z`$Lq߰Sq:1 -& lf&yB8u^Մ SKP2~<I`0gCM:6åTvl$i+E&$~zV*N:FX7 {0p]ĵ!>z%v)-u=jΊ\f\G [7qHȆP.bLCZl ybK[4O^EnQPbLpF4wfoG0p[h-FdR>|C$`G!NQcZs)&G]j^Z3( E)/ÆCPɫ)\0}SMƇ5W Ho3O{:(ɽO2t+e0l "jPqL^Ӎ10WG.#f$9uh<'Qfa+t=>Ohg]վ*MJU ~o$-@ly+\[0ЄjrA`A jN .2>d'_O3"j[=]i9y]Jyw-JSO`9>l  GWH4xN4j 7a6Rw _|ޗE)Zl '%xBǭa}K@U,t4sPgИ0K?!ja|a0qH X.fğa*4jZ ~LgyЩ$h.%r>'iު)3.ëpu[#OM7AC~Gi!sm~ubJl#qRt@p_$?|-.l%_V^q晧eݢipB/ t +Vwlײpɮх 0+w Obw&%1<|wVw߀+e"| bd9)x۸.o-x>oy1u&Vl~Q!b|(6pNm? mb(̔!mH@`0XZf^:lF-\Fqky'^rU&h=T(o}FuȊΐ-g$1_:ZXv@;;}>XI< wo zj=@$b/ܛsRJBp‹e-sl1hݹ+ 9wK>l}UV=tҲYyL$XIlйgߐ'UOR']˯YH2dA zܨS 0%N]Y||?gfdn!ZҸI&}_+$͊:* IeY8Atb0 v,- eh}mjO'^aHR8~=Խ w|%WRMyd:p{|>Ԫ/eKScRE0-?zmXwrЌ*߲`_\tܸpK4"%Q g0W[ZqTC ]0GQPX;38cb}{Wz!sZu &\@nKad}8wYyU-A*W -(jTZi3qyٸX[@ŇJ9쯆.Q֫Mֹ՚ ٓ<Dʱ\A T<=Q2gМvchøȖ zߪ* ʕǛ6bPpZ2i@mtz6ahDyD.I,ӟwb~7 vZjalrpq`"/?sU)5G1Z_ʿ?|R{V.@䓐N' vwd;E}5t=2g\ZmADR`:'H5Jgj(D#} POw4y%L"< D?Ս*vG5Ά4]zPb,)t*L 3|ۇm#Xɻ\l?l`9{wĈ$'vElDu'΀X8eεm*+NaĨ2?c7eKJg\XB,M/|5G,krsfb\̥k X3"W'oP)Lo:E"Qun2_uUB 5bІbC i{էC] D$F 7@ց%v x5s<à;ہ0xe:PԾL6mI1>@i.kbbG~3LU0DhBCl ]Ա()" iy4*&Y\eG@'bzNB)P^:9ؚy 7&U\EaL}Z$6qY 4AU14΀#É}֬{mZ&p+DHپA<>oTvԞgjaE1(z?\ep=g 5 ru>AǺʓ1qD>J潸eK m"{X=/2GAa2`]H]`3[phmQ>b:T*I5b] 7@&gjCdeJ)=)Yꊫ|#0]1Npqcb6gz}Ǧ*BA~X#LTW}I"ҿP?AF޽$ks)6#4*9tHQ522sղ }L9Wzdm6  !z?ncQ٤!+) v-[`DcAǔ{yvwN_gRx8?)-)1S/^*&3: 1)).?6yztݬYLni޵N@smKCX9Vz\RTnm~ [U83-WKF/>rBv~4]7Ny^@Ο՞ -lېOs3B!$NI%TC^i8mns_w,6b[Xw5SSHEЯCCbpUQVlBr=Yv>FnI>]sT4#rձHʄT8I^´iÊSެt/[h *u mi6NA̭7mYod*7UE=I8lXley?/ -r%* coYU蹠dYMq(Rg܌o [uAO.J&7l䮪W*G#)0}]l*s%=^v~0m~ZhS 1 3n3u{cymz(Ӌ:ԕ\I%l@ܨBcQ{DZ~KUs) 5W .dYVdW62!ҹp+!3ZN{5PFR^MNNۈKtd|Ȇ\κ7IrX?sE8 NG13\G]В:jl> UL֡ 3>䢞oȸ~B?^g*G 4DqĎoI{='QPNg{{l~ ̕.Дk(ϭUA Ȓpa3`BxOe1EΥǚ_8UP!&,hJ|뺗jfkyXV?ឺ\d.x K+lpUII6G(8 ܮ:6W _d ² L:pK=`bĵpq@nvOrii_r*wwlD)7~M@W0Vxߵﰈt<BqctvI0>xUc>fᨅA `"A|t+9114;\cHvo*ߛW<꫹*Ae06; Y:3@0`W)HtIU"3_rE8Qad2# B5y 'T^/F_WƐ5Ois{Q܍XG/LIofz/َ9k~},^5z5'"o.',-U!qA963F+xrduuc kHƈo}M_ ҂A ZAQf _C*Xzt%#rS[~"p-g^HOg0/ z6Yۋ.>`q:= VmC[.rlfeWҭn+ҿG~U̢C--λ$jx;/=0R3Z<@FjMf)mY;#迵b܇%^u4o`8u  d|~*H܁diC3*Un]t=39LݨOX(Bx]Vq6 |e S*ڑZ" aW۠p0/~PFi.ҭ7 HTfYԊ6n75>25uF%N#OZB,4Ƹvoy;`#=Ջfy] C؜c 3~70D~A'ABE}WܵlfQ?wt02;eW DkרQN~9jP)#ͤtQ<x]m #+5>R|cϨ,+t8/N'Q,ltҽfy;GH'ڴQ3K@ haUE7Ig^*,, He*xXr),Mܘ\ @4BMU\DwQF/RZfjexfA,Ҙ $l(UUV_v5 "L+qT 0%c5yr Ȕf3<?G{gPVVk&- M3PbtB Gr0F-շ[ȽZ03Pׄ/wI̔ոh]>t7[n@en'1/kjD4}Csɀ[i%|sPlW'\ *asA^rC `{cK9a)_LtDc^ͅ): *G6y&$AePgu&92E٘0"'*bdC`25чk#h%VmG ܂࿘n dj}XC񭏸,&շ&f?źS'E}.;gWi.IH==ΉHܰB\TS/!o%sRez L;=7,3_'t1ٷQlmh6s>F ;m=WAԗ۱}Jytk&E0{jcZCx,!(isAyR_ݝTHadV:(:洳X;Fj4"3 B:Q=%iBo!,ᘬ> Wqe M ^[pi 9N4bBCҚ -Ҏ -1VKi"Yఴ{$JoG)La$=qyp7u9tsȘ MR~77.Ejt` X'{0sBmCHQ/<;Ize 6r&\!ԚpPO!:.au7x26RxKZ0* 9U^3rj Ē <3iҿ:Ձ.-`k ObADLyCSKXJ5YԅҎ^vȶhMSLegꤐ[@o }H|@:l̶U+MP|K|GNs`\[84#Z.dC+~_fbXZ48W~[iY]g> Ǩ_HXtN#6>\W̡*z7Hw_ꈔT\*fѥob;<0V>_5tk9׵?L>Ïj=m1k Jbi߫ gm+jqpԝ٘AǛBIW:zW88p1HktyZ 8U'ϱ[f1G\O; X`WgŘgɞ7<|W O< /NY%a=.M[v1%r.ĩ`Hxf-xKi+%|)t\-~d8?њ` >B8ݔkx8-rmsMޘ9yҟJח8dӚ˸E]EXAcй*~\x "`[6Y?6Kۣs=GSp~g;MݞVju]\bu"C>#U\J5S(q`m[8S?\d^&9 t=S 6`N_?caNo6h D)lsBE={M v;Jh@[)4'Ό:'fCDV,Ya$\uس]bzT_D@ЗCU"2"?\O5_K< ("'1م]}AKƒ ߅TPb\gϞQ`sKcoa (q7,wc |]s;֑^cNPnۥK>SHce?txWV9@w>BT|`#_s^I{dZ4}v?^[lwhxbǝ=SQ\"P(/->PQ\Mܴq,~䝴FIBYj^)WBEz$%o7ec I 旃ɶ`DcT~'f;}z _.8> 4iGĔ9d lS7R?܊Y2Fc^_.]* > ?P q5o`p\XA CnM1p:yCd'SS,W,Gi%moYanG)ƎwTw|q|7?e:I;}\tW`g'5pZ=TL +.n?Kmm,L'WeOP`Q7 "lqNP2jD-KpOCz:&pitkɶ_ Xh 7 FjW =cHq< h㦺YC9_ny-Ͳϒ1/ro-rw`tMzMJᆈf~ 35Rb=cnFŷTpN8fe/cGoBm.(e[Hy=bȵp]6hԉru2]0D j0`^ ޷YHmJ& p#.t $N^jͺ xwqx.Iȹ)=|OZ<ɼӳ~g3PgtV.?l3nhY= i_lqP I/R Qx{Pp3=?C!r=z ޭ&};صQ|8\fju}'Α)/[N$ b.b?} &8DCadž0?;EI{%ĹjMz* _MyjKC4yh/QYdჲ|9؊'CJuy E8:x`::]""a\8L$GH~\\{G;i󢐦j,0 K31S -=jZlK=YiBS\'Kz=!>cn(]aXQ`"9$W6#Ձm><0(pʾH¶r3-nk>v4F\!6׿Ce#PJ^Ǽ)=,Ye&UXMsFP?`^\{|#ዃs&TD.^Ko.tm|(+~Zrz}58?B]D愙'^ԓw҃ƙ%8wJ<^~'pqn~y߁:RXn 4$S6?eJL\e@LMQDkznoo5a/U'o//p*v-.Zh`fHڛݼ_H{ oj_ndDoG9 mAD^*5p{ֆUf 8|eZ5 <#AM Kָ]2̠ϵCjp!= Aj/Kr1< w}׫G6ؠk{=]; i{=U%( }]<`'V-QRCt<bj^zm7&Oۻb6 Bmh2}g *9~>V6!'xXc2YY?r&6R4{(/`PWvBenPNYr1༮pzk2@rUZ??d&F82'~$]{.[01=d]HanܹN )#ޢ))!A[v^tU˃`!J m1i\TWPu=J/"OUfG9DBs_`,X@P ǀ1V&S9L9*ҵC8e+7-0re6Y|e,ϺD#(D{p@gEߑ92\{C;<\; 'A||WSoDMn%N*|]{.S mᾞĂȝ$^8D;EPw S%W%r-]rKCoF]"m;߮~-.F<\q'[,iЕLZU /O1Lv}Xx&8 2fܷ+;9-p>kia ep#JXQ0pa1,"zC#;dEfYj H{'ά8jz3ŀ/̍%)?Ih^8mhpp*f=ĥB~+P\NHnvXGwR_:WRF+{H-ܦscwu)=:' ̎y,4Of/ߝh.ҥBe)v]h'>n_ 04X|f[~EY#E(ṠdB&>1`?H}H0O ;Q߬T ̂m x 55T\V\g9h)Q{nS*&Mh+5J"{}ea1o02ӷ%-ק9 &>$Mv) w|i+H\K YƟ$ug}@T *z_VKkC8xc==~ۧb1=wyYg]hEۆ 2XBKW=x[l[y\CO07\r?ʎkw.evd!0TibR[ƴuWBSy찔\bQsLΕ_"4.E5R뀑ot*=u$zWUҼj$~I~!!G7Я2=s&BIlgy ߽~vu^89)dнBK`yYz*خ$dIWO{Gi. ilMIXIC& ;ǥU-(y/7=<&RN1 :vWSq_[yfeQ5$3jrX5,S-rXpW-2Fw0kMIhJQ >- d<`{>iWWhTMB`GqeX'}ߎ\rWK8$$shKlɊ-Zu l"O^:]>PDk\'V#@_ҏd;O[8iEy{R4fuoḨ$LOF<sw$OQ.O ۱Z1éŖ9̚՜>?1蹰?T@cSwyb{eX6|NzP1L9B;vMoWC8PNߐs3qL6a T!܎-~Q{,,N ϣx [e;)  >BuwxfD g?GjuRBֵ]T6W?V :a m5srD_'rPnq#ne/|tRjn@MOK9N>T {esuPGի[}f͗:tW`Uz[$*3u„=R7x!8| ]vpP C_ato^lǭ;.V<:E,b{|m+!D/#v'CHDx M@zjGf7E)D 1/1'_e8(cWտM>TN[B?/!)5P"t,#2VvnNe!*jN~}d1h-Oѱ!qC&6XIoo3_1l1g7onBÿx5.(PFzKc>e0Ш{*NG&;,W}#Kѕmit.n$9:%cf L<2K+?}mI 㸤F>ۊ8 HBJ(vUby34q ^M\Rx. !Z'!7&E ۦU[K9|~gj"8!)LLF6$1 1pgN ek!GTV.B%Rn@A5q4xv ɄA[ H,UP(Z1ަ(SAI+P<|vLt6mۼhp>y umWl؅)_QB+ӵe&?şkˎo(/TOMbbSnw_^ˆWz#.Ϻ(R'm@l('Aot- O&̹#MLg1Rx$ {aPnt҅w_^mQ7sįL|f?͹ǓE>^-=0 |9MN$gj-Zfvb.JԫT..5L^.1Qtż<%sn{:&!N d{Ƕŧn(WG ˒.Bo` Tgca@v)z֩5W.2rP;|jQNT ݑN>TO\#PMr,w+S+d1)vCGqƄ31?~l0pfeG7t&!\{e>H :W*s6fV+)ȢÒJd9IT0m?AI.9'A9\8:#"ЌG3ΰqђ]lJal(>hHu@mdCe{G 0E_t.pYʼI>\:/W(sי*Y0-c%z+b.B$I6:8HC!߈㼋cN,ZB=s!6־x! }{X p2t0#Ӌ7 װWg~FTHa`]6q[Q?F)Rgc]cy} w!^;ܙ\fkud-Q7I]{SDRФ49668ejxwg(OxVpC{ Pq3x}dbcЙd'/a?&3g hx-ٶJ2&> ~.ٱ垪^lΏEk֩{D9 ǿmg\Ʊ鯽g6&UeAEIC = @0u'/n#biv9sߐksq'Q ]d [C[NS%A=SOBW 5;IbąyR$1Dmcӎ|tYwoh^cO옿[;XGd1 $uCqJyMƤ&cZ`8:}XWfl×8LC2|oJ)̧/BXZAq;K{%ëR+x@.C^iR~Τ>[?&~M p~tc#ٛjB}շ]bÐlf:v_ݳ+3E*$oDwt]EYmpCUX%2 _U`bqOdR͚^)ekE'A3nGZ#@A_20:|P3.4`kR*@/HqZGCP Xk_!Uh6`vG5B:3O'-=6ǹE?&CO3G/F"Q/ $f[=gCx'a*1h2YKcZAӓurA^$;;M tSH^v F8V·j~>`4CZ]v R4t%cw&Yq'/.N>y+at>jq+]z&tKא4 bp1*a٫"R>mj<12m> zYxinWsc|kII8[Oh,/e] H |9b'ƢHB bî\B,[jNtR$fz WtjAszЁ K}0P2dj(3ڛtqT Ty0)C$)y^N! gZdEdXM[hBsلPA}? ,qnG _YռX4U-r K+/F-ZʃpZW*(<§)C: is'|zn.ÔSݬ>̫¢ L{f-IVE3rV\ɇ0Vv,Ga>^9#Cq׭c {#% !θcQC+N_\\N6Ȩ.^L;gJRW+B| KAuȇx[V dZQ( sC@T~IUK_V٢ȾRզ?K*>>U" q fG}-ɒ4 Ae|$ävËh/x2%"$,aV+()::$~y嗤9݁8 _8߷ Spϧ*#4,̒ΓZBP?zOy; JjÏ.^CgS!jcD*r+,\?\Bf`ljp TI3w%w?If0,w1}4@If%iwP,CI{q|=m9Դ</? 2&C)!ݓQ$+#MY1 LPA"~"hF2pd Ih9*&^y|o #nXLR6xA1l7]AS7'a7k9H;OJ@KJm~jOG3۬OV S-HRW, # o!B9@&OrBRYbzrؕ7k*ΊO>'K1.&q*ǾaugKW&guk@pj!6;{ M <$)N1=8D 1LiQ5_dOR~+ݿymoQBDXǡK7Jbȋd#ת`Hwi,F岞,^/+ .Az>Y6TG}6 9-W{Ũ8- s9H)g=w.".=9k0v.9akWC 4Kh-qխ 3YNᠢGQ_=4/q!_b}f*}ҙ~K! F\AX!W^7?\(iKPhUviݻr (>{9oc֊4KIkab92$3gL1`[jdUmG# wL|'Zv?=mj;=WOz`'T[JVI ƴ<E/3:? oЧNhtRVzNq':LFRCk'UѦZdܿ 0j*11 iiDy@E"76o.tVL-;cγm`1nOt~\a\2zqNƒLz&"0<@-ZT=I\fFHs8 N1U󣀞(UVQW'K/|Ӭ= ><7WYw9QU%m33?)Ǘ&uS@ .ŶXB;5Ca{ S`D­G~ei1Ʊ d̟7,NҎWNi.sbfRF5aށE5k3.Vz_CY5>o&P,謪]]6\1U\JADfU7Tˣ^ݶwNa`?&Brs>+A_V:4Q"B!~)^NepGwOV+o AϠ/;X{Xi_BVY=G<#e̙-%e/?!mvZKЪ-K:+v,Ny/ݑ Ba\3%j,uBUFn>zrrb \ؗ˜"kov\քTgj.cGT__ ^b3wyJv-/?w˪K-C9&@'@MXZR97>׸{MZ||`VcQ6z asǵ!8I c*Bty86 Da'v4LApaԉ$Dr"w8d,XmR+5s^3gjSRLL (7F,dn23LOKNhJ^jܸ?@-G1c$&nYo0$:QGޅ6́:Rӧ pѱw(!wʨ#L׏ZaK""VHJlz} zn8vYl"dN~ ,%59'w2'[^āɴ)z6ü'p^_n}Hv5W˅~÷~M]HZHGǚu- V$Nx#m/QEP4_pne{o~bs^3{هOfV>ϕf/kߋdS{dG+ze]p:6m !=??6bsT+V9 j tWP//J:+rSgsRV^$=='غͬ $*R/d|(s; ˑy<>HҠǹREw[0]_iPhl˫Y; KB@ulMdo/|oePU.tdcMθE\X-Y 8wޣaҮ,Wr'qvk"y, hˢ$j_SֲlQ[:O Ln:t۬!Pxs4sZhέۺc |Bv\MXM-U$,mW clB|InH4-3B5[l$-&80Ja t=OJ/\Z .[yڿ hwOAwYhaw YhKl6[l+Pr=pyw7DT2A6dHqwBmx𚵽c?ُr6"Ѭ,Vjo;F"GM*թ@f  4ǣTnr=KbQMQOX\s;҉؏Gd( μ* cہzL(s5Y%{AFZYߪsxdm 6;I]x(c8Ŋ&yQ0vM~spEŮv{j1.pf>]g*jH}]#֜8V>h^rW6&GVk;U`ab3s0cNjn2n( !NW |zC|CN]2|iʛPA eei8 /YeݠH&}'td'Yˮ4(oU4KYl8g:?:ر\N}k5e (6Un/ED|Qxax8;Ew~tƒgb*< 5h9捐O7= Ŷ-jG>SNql7V_ y&NǪw`ּ/,ysf~pT#si #QqLBoNw*)OSlJBFiQTÈnnv=It$9ν7sUC:>Z6.Xo!˺" y8?̜ у$?Z M_>XZ ]N[]Axki.oHreH Bz*P4sOҧZm]}YzFwC/l[h dǶJWDLD!|u^OՖԋ*iw ?Ё솏|[2LRXdž6&?N9 Sr4(ӥ y,c_%*8~U/a<#w(BuO [w>22]MyڶS|M=H+c8)MVcd5 SG'dHy7~e:B/彻oo3'jKsJbiidT!PvChQbfG}ѷO!ͳ=67dbi̚0]ob<ioEׅpc(mq[OZ͆`zyoYWs>C՞akYbsn:D' 8},Hj|X,HdgCxB( 0Ʃ 2m9f Li A%W5J·KCQBG ? c wP z ȿ^JCL4v/=<ЄfK)C-ـԷ;<qUhlg^DX!ƹHW  '19bZ$:UGbXM {M%;F''D!wYz֙w_m$~a^ryΆ6[I`^$ߞ~Wn!N5 Eu*f=& Ԧm̻l½WgFqD(䴄 F*uZ2~ƌ]moG#k.Z Uu1λ4sW V6KPo ͘XjiN+QyuD*ök(ȥ@zZ䲜YSEX[毀W v:Mŝ!ʟƯ#ugC@(Np!I؈;{~G#\HH* q;$^މ̽ E30u,;B>YY'YkE` v 4@>?8ɕ"xsHV/4%nyoՑ3+MI`suMѤ-ӿ09tK|L4|'_i>-ULmx$\?c>&_vx$ yIؓPͲZfQ|SDJ`xɘ-3ۊCo~}{E?y+ޘ:HCΊٯӗlaU}ËͺD'u}[;T'e7ooCC«J_ɱֲ)5_yvURH˫Ɵ!e!@Bb+[СS$᳥H. EhMxyn #.6qm+(i@So@Mk=r>9}t |SZQok C$QS{ >/1 V F%KHeج>Y26 "M WH%&xdeBm7zϓV7akep1ѐ;F؎Ѧ֝`H((a.g]F^!$9i|l  5׸u#v ͍t'ϱ3Ŗ|]uC^Ϯeb Fw'*݅UD}u=JcpzGCMJ? w.gI]d(yXRNaiגYt$DfC~iɯ{c>#81D&#i:ʝN5eO۵[^&MM{ &NI/KwPT0 OH*|@nIxh~)oNZ @50:UFR3$ъELw+l/hV!՝B_ fs`cuYq+13̼nfO m.!^qE/y9Њ ]::4dUu:E@ӡGw- jݠ?7WW5 mQ>N؛=1rLz l"鮘搶>2sYKF60^odb J*nR%0L'}xI(>Lהb1Χ}I?p5ѓ_~{]۵3V@ mǥ7-兾'#M yaV/xNIVQ{%=3okױș!;^F,B+L  !$d7ܻ4) \.Q>ս |hız;lk{HA -zEAx=8Ę'|Sp"*HlNN 2`0Q 7=7x/wљ+%9D~5CY(jqV }7+e>* BGs:d¬e;,j"gT1c.j[ouG: tίD+f,`+/GrrC/˗NA+ RQ4ի &ry$ w%*4|5Tf|a>HvnHe%ӓ'J3c)rS$3شVg +x() ܋a&8ol=2ic,Qy3HKX0LE>BE}v,5Kþ2[^of0(6i}ͧ-ÜB#ȩ A<9JnPS>MrQr6aR#lbk+ty* NdB4ΌnU%&`!VC֒SLpq$ h{Aʖh +3+õu؆,3dAaTEra{&t^ƚ,Br&K=Ȋ+_v3[ X 5;,U& S{\[C2[ 7D[ 4ر7FxeglKD:>7^y|[ғX&REi@קVG,8Dohl[#\']ba*1H>\@%jƢ]y\_8ry͍HQ `Eɍv}(;ٛ;ZŕIJuh /2gd" ፸/܈1;1=\d5Jֽr{60 rй5p|x vg o -~bbg >zU|de8^ie2 RKrTdeg:J{uC9jp_pS-gbܗ5p:w*F0+3^nUZE)GQaX4?<(~:iKEvF0PcE?EE8 _iy$7jW j&nD. cozv ֍_NjUfa<\ [ޮ37Qօ͋ët(ZɁR~#l_ޙ <"Cnaq( ky PRy+1GM47cqޒ3Jʀ)(9Lg;Ǹiji{htxavA՟&dU L(8"S&K)q#%8 -2zS,aXrG|i!V1K ^tq' wNFo bԗıV|o]i'o um,HDDs;jG/mWz%5pu>H0u71䶒l`mVGpS XȲ{7q^׎:i|m?E  a|Mmq~~|c )S [Z OqZixtH/:psZ %hbd$joy+*3a:b X]֠q?@' FJ:ChwY15jTwJ-4@-cq'3jfַUy@< CÎ s`Y,vۑ&a>9?=@ڻx'`뉶S[ˮxm*zXLy ЂfVs܊B[fZbeNV$5ŲNI]АKؿkxh+"g " ILԩ|l_4 ðqد`rJr4)Y&"uN7cSFU%-(%tqMkcPޟv1ǹ[//WgȪB`$%sHFRK֚obꗾP7{cJZ3 E>yObe]ӛ [ηr,EF 嫬Ȟ{I{SB2!Kp`­QkV>`~qY泃:nE Z +C1eT3+pM9MZ;}:eKR~Fso"r*=̠ 0jUTOc/XX޻ϷiUP/"a؞B*`yX d%e+t zPEZ0JNK+a)]FngE7SЩVb 8_9ůg p EWU$#,OfXor8o+Iw{_6wB|@*Bc^Jnv:7/9kcjZ"-u QR&Dd92X 3Hg𦞊9 s"ɖԱ5A^ NǷ O9/D`ݖA9)?B(w VsZD3ci̷aYIJ>_ai``PbO9Wh@º%T Wop5e5A̦95j=jFtФ(\I{:[-%;T h#zZVig[}ninlW_:VNG݇ LUqXzWs)#PI Ƥw9D/u$Br#BW) ~)ó6lafJ`o4Ü]tDSH/{?Lvdfɣ_r7o̾V? TNYC8#l{D5H  [!="#E*%L J)\_ҷ~"u:6sdV@A\K J c $v9J)>;du}9pK;Ťt;x uD8d׎}%CMS&}kOw`ED%ĽK4Z|Z\G8: ֬oXR;gFvC}?PH,EdE tF/Ff I.(?Ucj/`##[SM֖6p)/=†Ҩq Q'PɺZmf98ǸxX/1 yvF%Mڣ.-搼=>ٰAnb5_b&Dܙ5ʼBԛG~e*Жv9f{Jσ<5GC9yO;DP (ktcŶvDHF(2^ } Kn {L>^2.b%s!&!g6kI6VSSѪBƱ)?c,9NA@/ Ո|m*,wୌ:׺K9E/BUˡ*¹ h!)*һB  ˩'x˿b\q,X.)ibFs}.q'2dV+ O9)k89N2i'/|@o!6'#ٌ{ OA\k~gAH {|d` e/dKZ,zM@3,/^yìfD}bę/1=K]"|$6۵h1*V}!wkmƜ&<ӻc7YmhAoU6!0Oj|3V;8c1DזI2sf(9xΓh<]y6۬!WYx&'T J={!j۷pʻ H U+Ԇ4vMQƅF!]#buxRز772*N,XA|?VðS-_iPj6sC0Ln1ׂ.ϮacNmVbrK3o~ bKsO ky!3DrWH-umq]Dw̲H3A1l8U_#b"(Ĕ2@yL_u6]Djft5jUL^ժ+b2B<'o2}%h c|Ooc0p}7Ó'0"M+W_Ik9'zPV_;Q# Q:;uz40 Vh_pqJ.8Oow8Am<=vVԣvtX,Ǝ=Зu{ OҳpnPO!D$lrJz>f/ 5I,L'Ay^r oJQi ؎Sُ baS\zU`.#9QK+T4JCfب-.=elkmD{jx%gOwBk&6Y1S@jK3iq.{Jtj \rwU].Ͱ"`69ttGYU,H k[9hϢFwo.@Y!댖 !r^Vខ-H㫦,Ymvg$&cT'4C߻Vhz1pSBm,ʙ 9CcC*?ߜ- Ve0@JVYpȀMʥ IԩgIddȝi}'%, ;J];zi:r8^*<C T{uy¦MOcjTYsmڶ&ri5/ꣽ9,JD$q' }]ºR,_ǻ!ٱKtU+}8zSZY`hG@W.x zMHi#td G:!d9X-B1ɼ0u*o-M1_9(ȐK{S};(.=cbpwUA| b?"M-lރEi?> (jfx7[>q."71 Y1N3ޕ(1TF|F5<x\*Ix:.;YL͍1I"߭ hZaLSֶby~y%znQ9 '<ϥh^^VNMm((:h/,/So9\ԄtbR`gQ5$yJb$|XSGd;\צy?;se\˻Fb:7ԛXynh"'?l"Ꞗa0vD@`zrg%fdu8й-K{Eȍ~8e9Z Vb2>cdX"`x|PNrH@ ʋ O2h|TiA6`<kllm5ULv Mnkhߦ~u߿43GmPc#2SS}HAdRLkjl?Be4BN Rhw] +oTIɅΌx[_e\ֆH&_EdY1=|ǢM]xL`\&fw3BAiTTfLPK,2mSysB:/ukk]_ ~˖yQZzH*z:PIKGr ؆u"oK\윁C7 $Y{!s>M. jY YCOX}';/7;Z^Dک _-*DH2XGrCI>7L̒ՄRjo4g"ߑ:k6{*Zi ;5Wy-OO6,>k.\oihLH`ڹ#0P`-!H4zVTAK&KZF`D§S:6FeXQ3HM]1л1̜+m* NJ3gR7L4z$ӇqMo˥yQL-=] X;2.5P/-IDWaGMavdWo/w?0B$2'3X萶_/ k^njгdєB7h3+zpt,᭪ !~`K}JmGv(Gfn= ?6ÁUlTo>,uS;fi1)-ZA,;t?«w45s,UNQ<8xj]'R rS_iv0Y(&ygڷcSu4uqtLG\VJGlOmC>Ss#aZ/6[s]y0/I$K8{;\c~#DomBϷ jWDlC0[3?'XVhLqo^ )Qp'/2;^6SZ6-3+RsH,񓿭&9<7&h&HjT @WEd15(4RB1< lU&)(:\,CL-CW-K'q&h*@ܤ'mե9QYzԢ:EUWdYcUȈ'{ HY*S7/X=vΙzjM>BObSpvʢD|*ԧǘá>[9D0'lP~( -s!^o)(c #RZwwtiÁ_ B 8D<Բ; b%@5ejs lHZ-jP ZR ZfqZ^}:fzxD|tHS~''e[֊{Sn9PM~o5R;K eE6gO5<׫ȁ(9O/\ѻGG.@mb$hzv bH oDԍyDy pG3pVX$>=ŒLB2lؠw`]C-xX<1bܟSj ;m1MHmw`mKs~8 6*m7ȏvpCpVXL%=>`-.(*jM=P Zc~Y+m@RIa_wȭEX={ ?mEׂɼ.S/19!vhmti0)+ '.| ooe\XwxdjUÔy)vF=I*ad9MR_OFwqO3gV"yIIcQ~nuG*~JDQ)WzzaC8K^ttU.4q4 VctT*YҙSQ4kլQ>ARP"Ph1$rhkƐ$x%@&0iYuTB#]|e%tU.HpYT3AK\YI!wF>GW矦` N<'SǙ9"_ـ@]_{# Օ|>QiMti*0:\/E25hA 6w߆IMgTI-U}Ě+wliWHʹxS5|}J{#[Z" g#wƺyjIIkcgc PظFQ LdQoL\oE!1Py^XK_8nd Eƫ5,nh=/bf;޲ڙ O?l;I10JG\2_8mi, 9)Tܴ5M$?u94 YGtD}OQ[)a@ZH'4>\>Qנ50^k 0>?`1*@,rA kwpkk+K*cyhkOR]!:4 v&-1&t x'nY__3=}۸7лsFCci א YM!8E뇭 ,X?Y^QfcMЍQV3;W6#Ȣb6!KPOz|*'m`lŒT-/WG/VX <^ypzc b?@\kpuU+ſs<5T"zVM[7 Sx%<ɦZ,ZfG#aM"Dr(Diw(]TR[Ps2N<19ג?$s#x[$[ g:\,FJ6|Mg~*LuY%ONl t#_ip]j{$C3@U9-Tㆅ;Q5NNh Na s36eG`ԺG׈! չ{X;>r>xַ'Co( 0Wzm{=*&dq*K9LUzP  TnBC5n<1kbmt8׋OQ!w,Z*8lÑ2$Ӣ@ss.Y[k r\DÂq7 9:qx5\BgCT t![P9"JyΝNہ@[bmVvɓ&+C\'lJg$cIh0&=;vK iv!%qJcxz}SWE*e-CX6# MOLcOzPIGgKoyo:c,VǼ-_wV9:OhIewFti^lz&pRn]_q`z CBjq2eI+jѨPMn$gQ s^|&uW쪍p/&!/+qxʦϷ>H(y-aviFCQrL%nRrA)ʏE0̺g:<덭 Td|GC ieW≵wh.6w۞8Sr}>{S{{cSHt*~Y;҆H kvo'*8,I/A`NZqH8|f|Ą+6ҽg/['P? ?x̂XbU,B:5Jol'09,0[,56LfqRHTPXv/&/=wVBHB-كC .cx7±BN](_xJKZWYK `,5pc){,Ya#k~&'k71xCuP6vP+ᡳqU-vm PtM۠_輶oC}#| ${Qpw'aQO=nqgg'yAyQܓVG޳dja\{clr v΢,')RrK>l[.rٰґ BȮ/vVMO ~|ʇn}8> ׹p*6scyPie-fA_抆o-_UUƂqzOc:c,hl r#B}"B4f o >-p6*wpʖy-Xj0oE|îZ]}dU T!]mq Tdߕ^ȧVAo(n!y[r/?8k"k D\pͣ{csY],agLV]RGTu|R?jM)G*h^_o Jgt+;H]-ƞhm~"Wˆ2pXcϤA]-Q=T˞ 77b\)K .9Se)Ɲbp"R18a-w)~D/&|GdN /8ʟ}n Q}G=?؅f|5Z֣|$P%aH`dA,.N~'K9k6ScV?jj΅\NjT}(z7+i NEQDa*Qf}YW].~Vg(3xM_w땈K= HkN'³~{ewgi8CfO.y3$и)#:jF KaChrRǨ=F h.4ecr y1o]Mن/ 9;BPA|4C-Ez~xb%JlF3M}_ay0!$!-/'AͷX^3clŏb&ӂ0#`9pIEUbVvL%EAe"湴ʒr̼pp* L6"&`4]PhUxq1yە- 7(¯aus]ZK0Hi7ͅP9ԟŕ&ZE#&UJGqcF Z0$PO+67<]T<:2c0rV-+VUYXB5h[.'>rհ)Ly.vg~ ^ [Pd}'e-TKA_x"t;5{)3,y):3E a=违ezbAkxVh1;04}CUGJ۟?7rbsQR]18;o&> Ve[gs>cD2ta[9Gޖ>fT=F12GЗՂ'cI("9ҜOW8hy`>.ٜFNw"E|OhyѸiHl?##-+E:X-#C*^//k =,b#^q~%oHD_3FGBP]8r7f hEg-SY cplĒH*CA:ZǕDE[eTP2a 6N; J%w=yҖKQR aHP>k[w}zG~ VF8NRĮ](&na.3z#wk88O{)(x[d Is參RAɟ7= @H 2 *'aؽUL<΍3\Ađҵ_5ՅlNߦQGf9;prbp1Qj#`S9?*mMAE+FXNa_, {;u\^kZi챢V;bvM0CÐK%5*.==_41tJ ~'eg<0dBQNc*ScYI41_vV{0vIa%hB6[Ƣ&fjwO]2Ёf;"ǵE*)RSFs@o;xB<3'5գj3QOs,]+tqJOIGR;枭l5Zbaz5% ꋝ: %-Jl_=l*Sѵ*]~cjBP0!e2>atd.p}rP%w|X~۾3!Yi=J\K.:Jd86`+;}=8hTk+i;)|I!%bQZ.9drnfIgLLJ`f{l?@Di͑h{?nQ"VjЮPY:h-4I;C&i-&DdW >`,fqN|Qᷱ1[b~Cƃʘ2FdǕRWVo G)NmZP4&L Q@}3/a~L6R1nY#X|d/[g 5ZNY6wp =Lxy壊R O5`HϤp8I@BH`wIJIe)ڭY3ֱ4/! mq$0&]N?:BF4)-:Bs\-A -|9={zdz"gucK͙!$Q~keZYs͞5'p mv C2í7r7G1EKPw6:%4#DS|-&@h\qӖu! 򘣺nqGZՏbrӗoR/^ijEIjUnf]'Z{bWt3 FBqNwmnߖ-i'wE|ԟ&= lL+2nK0N+ w {)'ZdVu dwTx¶_l7$Sm`\:>~ځ" ۟A&sn*Mp}!CC-Sظ\P77b¦jGzu~)=[(l{gI+;@2C_in5I.[nDź/ ߚbfVXyVE5cC((cɚt{FP>z= /07ZN9Ҧj)Rds+$=ZL {wqn1%֦G~2 /G'kё1/gΆs:I9|ma]..Idp8kIG z?U/lsR\/FUj ~=i9QD$/2YF{*hCbƙ}40xI]ӧVp|g6u2'%@̫j$ H!g 8p`c=ʎ{J٫=TSPX.W<5o/cG+{!g w 7Eij21u7*Ϡ g F5<,*.J Kc`w"e:'wE;W7g5/j0nY@~k"kQDȼs/:8۴[G,Rhlj҈gHdb%AI` Oے6Dv`'wΆmhPܚ)A~*Cހ!odѽ(j8"  v (-3w`gVI|c,į2s@Ri{Bי3d_22yG?+q/Z gFl2(&FC< ̽Gyz,Y^(;4 )}*+!2&|3 J tCD:* cEnw0,2'lN_|둬aN1aBW8gHo/-rda3[7ÂK>s9Tߛ4-CO 3T|f˩YsQh1{ͫG$ '?o[CF:Ljj> {ٌM-ia=;)IMRCueZ0tUxF?՞m#h\+Kj]qW˯#;O6 |g\Dò9_Z:WЪ ,񻗮 &@1fe!~5Ұ%%!xv|؁;k_S]UXd_δ \|V@Fjc1֔!5odu_7- crKArΊA\2v wh 9DXd<T3Ė1)mtej'eJH{0{{$Q;ʡ ,n2z$Y]W۫'s>5zȵֽK$OrEƻ>5/٪!X P}ggU(zk~?zsݐm2+)cIdr{jq򏫤K1W `_eC=|մdzH[w[PJD1|;Br~o-A<`b/ U ®4t (!ųJ:)GKDztAYI@kj*# bxfu O:k@uŎ-yV9Ļ(=k8G. pd1\`p{FkpTMgӫQΊRh8MZ/gPW|/ &VB}!`N:˵ˌDӯ]Q +:<︂`D[94:Eh)Vv'󡗕<`n@ۙÃow6oڔU =s;fƛfgMaJ(Jt,Ef.[8 ĄBʘ2y\#dX` MgKuV&9d;6e!FN΀# nG!+}Z7ÆShj["/t^娾l+=U! :* M. d<7Cx.=\Cҭ3Ȭvya'lq#];?kbU/Pk]ިF3)bsΖ256BR;9-Ah_E F`S-+!&qcǾo#$bo zv:kzG<8XbK. ۺ=ӌK@/iջ8!V_&*eK6Y 4}3F/})D36c;uVm&_1(|f{s)jal0'|l glKqƊ;@qB-\R5ż+湥Br+AsSr18 U#ӳZ\d3AڛY vv!'=Ǯ(ƳXSťU&ܔ+qr&h/}P {[ )vҸJ4~)P5 Jގh8N"/J^Nt(p?3xUe"v;.jWHҘgGj _p^W&KaCfcrZ|lg$^wwaDxuEq~U+ ``Zbx*n=d٭m ? )8]#ArGnjFe^YuͿȸ]zm*Y+./h[.3YB'|/m?b@ZOB캖p(L< a0aIaoL^C5a;xY,UyW&ֱ1%U? mvm]Hc 2c|ɞ%ijz k(# Fh It n;%OBHlY; edbbt?{t!?7R-Ϗ9?)D[VCO&r\AU0Y&H1'^xNvM``#eAV9ڭGgוlq0 WpAɣ,Dhj]>T){jKiCemzfL4 zӀZ|`_# ^)5DY]TGIxn'+~Wlp8Jk6fdU =qT14?dP^[rHIr4JH!*a6L>:||[O+j Dܧ߮|"Z1]!RY;1X y݄k[⸨H<)V*\$? EU &8<%AU5uݽvJ\S!ϐWDGj͝KAMNhLBOѢ3BHuvvi TUţe+'2GHMv2Wy ߎ#To 288JbS'q{ӏ¸uQcs?r)؛p4 8-Led!%pŏfqvE3\PK2SۖUVwf)1~+&tY O]֧eX#8ۘw'z3at hުMy\fUiL@;],8-`rTί4%Np%`KN+~ZO(web se6ujFG趱)LPJ>Ɯ soi۸@)6 }=&O˔Qytd A&>rSf,+[:S?W\K5Ur4&i~]HZnΎ`o\K*p!Dlg=8χZnx}BWvOm_I $tNLY-x+ DDD^y]'Ѣj Ԡ۽Vki u ;Q(q]gOX J3/OYa@UbzϪ]1?u[V)Dm)"( ߉Wa_˭VsC-obqvDOB1;sg6!2|yOo=YgaAx3`U  pe k(uR'Ѐj`+!^-v;460ڬBT 2sz#eG0p!cY!=XNXBV? HK iwI4d%CLIe@F$Q{M5yQؼ1@|[ya>"H/GVlܡ1cah!sa颦jN64)5vNju=2rۻ}ƋqS`a'47 44{ҳ?HI}iќ YXK?w|exb3udl# $$ix8ڿ4gx~Yօ_D-VZw0hL&_3ڃ/+߄0gu?$\ܿtKNwbJ1tjfV5u# Dy9FTE5bJ_C<$xy~^k&%c&"dh\HOg(\3VJ#k楄.Ѡږnnf5VpN ;r׉bGwS|ݧl+SV~{Z-!xXCtYZ0ɤzrQgn'+A@HJ#Kl ,$|Ok4]-RkQBg="lA* n]KYjZ sxpc\; c/7uFɁ>aFͮGdUĢ5YV؉K7;%hgR[ԔԳxՅlљ fENDM(XWӱ0sl8&{׼c(8l (#?sutwXrZ\?'UD#ukK[Y8RP!* щ#Q5G̟6g4xf#WC'ŷI6an,FnDD![)5O[-w0Gl2dc× jB!k;콒\uv˩jiD} .O8Ł k |sߦ/)\|A=))uiҬvK)3ƧaizaC|[dQ3W8Wr㣹π9J#eۋ TacPV% {Sa|SwOqbzE4˓"1aT*MTQTӘpL8l؟V9uaNIe<]AH^Ot(!Tw&P}}od#@C'stBnnDGE 5dyE~1-#\kcE=܏HB0l9.qֆ8o^[78p $  ?(zh NOO|QˢUDWrtIR&+#B׳=ID֖\uB__.ob1 3;hG!8h9%'.U'՝%D}t:V0sюߑ^]/T]ntBf4vLJbu^}LCmvi!8@;$Yu«^0uЖ, %B=mA7o3p?/S{BvG Q?xCo2Ytu l6R*t@8@KbIHY QVȮR+ .ox|U/7>d gMt@#S[c`px^-9N{luÎ"djRcYM`d{$~sV4Y\G?.z+oY tq C sI!W.cE BBS4vۯKUvټN %KH\c1/ZQЅӓzO9-53|?$H_ suݝT0V"#;/R 徵ӕ $^8>~nx~Dqdd͟l']~`&"@ҷOƸ8?Cۘgal&$Y 溂bJZTRsqW Jl} 쉂L(. T5f0ۍapU Ұ_{~F>/ f_ݘ>^= 4 ,)d@b9F15.X|тCL 5Xx=! E ,ǀ΀)(h#Bَv?^=넴rRHd2jFu A)wo`.h2չQx:ژ2s2:5;FШ.#*uW+3fpĥoSRՃ@zC?"!'tTԭi[ A~Z'gl*u" "ٛG^/=*g@G`83,'Nh`лV@s5?C+alGY? , PyC^X$f%om`Eud( g~P7XzBF2p_]=>`V@i bQ<ٶ+뱋n3Y'.%䍜`tK-Ogږ}Olٯ^\97/Rhzi# Fx{B'w,BC܍VcW`EK.$O8EZ?׼MW]"]06ťo|ۍ]*R;WMԻqjZ[TwMQO#_ON@QK!&3wT_1vQ'[bT^:5Wwr`W~耛;|}UcyY[0xEQ;~W]85""`3mYHb\tG25Xxx2^^b'!:"9 tgs6h@fWr 5`V%<^̔v{Eq).w,\ *"Ɲ6T nQ[]i~nZ:?zf)Iݽ!Pm(qG#>#+];:F"*jg^&쾝ïYtiv8fFL ذvصJ@3\<"2# b6_=h| }8觡%E9cdcQ++›̛Y#X ޜN;s6zyuK_<|LBu3{p 0`~/)z)Y%ó[SkKԥ¯Q3ZG o(5bA;gl7(wabkA`rMx%%T]Ͼ;ϒz3/u^J b#:@x:3Z(1|HX60i%)Lr7*Zn,]5X}NO YQ2іTsl_ 8a4Xί&1qh ϔg >@["pva=_ȻEj=Q=,PueD?kĬ`DDnO[_qJ,+wp[uhxrsĂ.7hH4&չ}؊M6U߁C J|R;03xAYw_ѽ Gm̓R0tJYg ug 5W6뾝1rTi8 ښ&+oco&s"37=c۾5 Io{ߋnϫTo\xX r||l1ߍV5ٝnՌXYP˞FNօxL }%jk\#7,lw_Yr;{M~JLo$瓆g)P= B<47v=mcͨDY^ ʹ #Bj vaUI@Bs;^6o,veѺEvz,!pe%I;.z..|_Dht#/. h3(]Mv5KF،X!GƬ7&sŋ3cR&8bH$*d\C1 EѦ#95={FgbQpRK)> 9دYsClS B&26› VfMOZKqk+hx¾^ /mj}WI0%r:5h=9)ȐP2"O+w&M\S'm4Ц_(.EDʣ 183=G__W.l?y4l\bkUB $!h 59~p&1 @KeYjyኄ*a!qVXKGu d]/_=B1iUצ VOz'FZl`HBНA22qapUhHmHh@ucq̂@MHae;&b\:kU>w.%6SdՊN$/1 aɠ@+f1olnU#PRZ'2e D~} {" Zq\2R6#iaAhxĊ#XUմ(N Xvg8qe38JrXd3{/uC9:>w75[酾a!vom떟vyHt.s6"/+ڳK? #Gĭ4O&OF 7ed+*Xm%=4AV5*냼+' JƴHN> (f&WX 9FPkl@Kh[.HB,l$@YX9jP9c3Hd;jmhjnZ,K]`H0;Dk({gY 0fB?9@$(1j EM-:p9vKfΫ_cqEE=5PīNDN-Bٛ#ȣL fH+D)>c$BdT16ВB1ٮly0zGOֲ7U#o뀠XY+I8sZ(N!U?9.T Wq!+L@ikFjY 1gt=rP) u1 8X֖ mz3< Ɇũ%r©Z?0+T[rG.ݬ1ᴽ߃,q e)KyW^|HS#ʥJ0K34upK٫I&w~ c_i?x.N\\{Y2<:esHT{_04Rͻ>ilX G2,VV:?[:M k_PdWs˽.l2"= d'RDqC($'n1#]Taְ'w,4L SwA^́(+8/ \ ܌_E#Zbg"Rq_ |pŶx}]Z^w=])637)I eG{4 Z==ms Gp$cxA?,3D;^/|9ѫhH_'ЗK ԋ\dZ$'N?t &rND]TnEvHd*7 +Xr~=9#@Ve4=K_6eR1>Ef׳;bّEm;}TH4l=M)8/Zڔ8ƒ+Ƨ|gBG(Z ,npadaSo'Za`<ݤ䌹I$T infуtP |WF3/e*hHS(=*qCE![k.#ocBOpcq*'޲A?tD LRUi4pbC'^`_ ?Ʃ` ՖP" C^0yAɟs%Cm`vgF?9B"R%40/^dq6VI s_Ui3hp nh~=FP4.Z 9lVmLweqZɺh:bВl0w0޻ fkx:k }=WLi;cntڌ0.NJ9[K]|z']y90 A -P;NZ[Wz[#Ɩ)h @+ =sT%Z[ah0+EiC8ۃǀT˥*>A.o!%%KSh<0q *|;MTFmo92 '/!+wVg9wBJ^|ބZ)1ٹ\/_Mt0;[h^fSY ~9)ў9pl_\2}.:/,΢ {8 ; u7_{:zqGA#o& *Z;[4RD·kw+ʆab͓tP%(Fqi5LB)y<$'ILMp"c.'13l%ф#uii/>^NJ-ru}C3 S>~t)$P =4[#_uKQAD_# cp^FJ"[;05BmwE? הoMAm #+$%fЁ0&۠;TN9<6wȄϪZP=`͞Cx;KkIP hH,]y:MAɍ]x6CYݬAZ%ngUaG I#J[ ܟ1|xr{D y}b*YSJgeڳO7чj FW݈ ‹ 6 QfShl}of<1WFў+е+edn ćvOH@sz& @gYTq<_.f4 ;[ «Pȕ~Xl}Ys}w? Oڵ+' D7:';$_f`w]=ETk@zKV4D2lEkk']z!TEey^R]wPraq)"v= 6oQگ,l4t|EU@ږ9Ƀ]CIGb`5s<ňfG j!7cv& GzUVZL>]eDIy/LH1~!Z?.\(.zB;Ab+0%nUմs}&L'L-~YP-@cHp'痗N{I0[NG_4PIVM! TCBp@AN<D}q@ø,BLj_7\leB%c CeR^!lEGWVjkt8ϫ!K?j! *ǿUL .j6:z0MvQVvXzYcr qX c,>VDWxi[˙qk\4Ã?CsLG=ADowbȣ7KsgZoӆ[ؑ~cE)}~^\]&.=b$y IN~ 05WF.W4jHzg@}e} i*֙28}EbK2 wȕ6UG~5>U1gJ!yʬ?ޟ6nrr)Uj|1BE8!j?J0rG:Ηʘ~GU(=J[& ?QU9 yߵ{=Y$J1X8TJȹ7bxȍ[xb^mÝI\$ [ܭsYL8d̠Ir'G>_p9@w~Vv-E3}:SK'#-(2seW\!bsKDT &c:6rHGyy(i]# ̻>m;fv+,+{ulo~8l{ϛYώY=T2lDPd]&Ms6W1 ~<#!n Isv'_7O~jP.uxDġNbE\HF ? ϡ) n9 {,` ({>f3/Vs,J wѸlp/:Ld482O^c9-)My:_?%aU&qfZ!//Th!ϒ瓌ýzU\Lzk-Y Au|Hcv!KuP!c#~3M % 'I8XS0HSb , s$svÏegA􌥖uR))<pS+Pg\ T*m#.GjJ_eD\ۚy5v_X*܍C6<Wiq?בe͡ {湹BK 5ێʸuRMU>2E-| ;q8\[P6+`d|lsA4c }ȘE:Z/őqѸЉ2S.&0嫂 %|&ISY̷t9b NH<cc,t`.\/'0fKmՔ},ϕŠWL=rRX{JGGcNa` |uF*ThYA9od"Tu-a_㯋#Okl,Ms tLeu&]m"m ԇz(!97'ugΠS.mbPO\D(k6шqV修Yd z7͓LAi4$k$ȴK/{hXz"%OE5nyS ` gq(rcԢ__t> xp9}42~pJA"͘{ĚlQ/{paZ.݂cYy|zGƴ?O~}l!0"^(tVdbSrY05~<;lyc[T# 6&UMǴ+$_ˆ,G(drÝ5yqxuŎ*cᗱPDD-ԳYyq]ģKnA"md;Avb,}诛1sʿX"0et$~ǝ(LhƓOsْN}w'&3h;E{ / <:k L]}=VRu Oy(rWk=)0LCdwtn58^VBupbӫDz_2pOќ@)rI\FG@F/qyy{UL 9",+/8i_LSw +2N~[ eсiO1juUy0<,Y8bP-5g }awQ일3VFy8T^"^xC%4a6=-Y6KC̠6MՀ~JۚNw˝YLix甡#ܭqu#MnIEA=N6ҡi#sa7ٹvF*~$Syt73Yn͏Y>!LPV)"f@ BsJXj1,/h/֬I۳ǣX3M;<|Q0""$sM'ʿ4_Ơ{jk͗Ji>J|8_y[3_~ۻ_kOi r;Tc3O4aNѝ.M90> PXҡ iڴȺРC~ [Nk|̬ ^cCxl0e1៸Vd*,ݳIq9~0*2򇲅s?ISwk%1\.+kPC=u u"Oo89 dLB\>hI`L;|z^Ĉ{-Cվhl߾Q4׀}ND,:Y Ta`.Q$*gJ0h8A6qW+ǗODig /nXuMt?z~mZ'8? XH9{3?yA^X^fx۶`A,3JTw)TX5i=ql_rWVqcVطIΆo *l[Y 5 x3/(O:„v$~$-` {0 Rv2~N|PߎeI]ϕx;p3g8A eƆ ~mQ`KHbږ\~x~_dƊ}+0[oXɼr.RU;#|:Ÿt@|D2ۊ6qd9ge64א1fǻMk;%0`_9 QbkZ7ڹU`q/(9yUQ]%ߩ S͕0<0M1e^o.۷A4_ZGSPϻAk僋7dH~}ZJ0Ջ{ ukZ 1L" N?z-~ؖƻgs4W#Rpe pfY( - e,6?}a u)dy-"")=Y˼dXrb[sF;n7OCCH{ gZ+:)ZMO ~WTP[6Ys4hy|M\^ۣ]9O?]:+X#0O'4YE'DU-3[7=^k2.hXlA,_oL6b2 [t=Wx@Sz]'zH֎\K^]Flk ˙>EO?5¶浊$tH 7]KE>nqx{p|cJc_װb>pgXJ 2Y&e2yۛH}Vyi.p=s1y$b0Bűc6 =ء[z~@ +ʾ8SH 4V!_w*@t:`\Ӽy~i"nDh$ؓP#[#xy!rфnoj[յ <%,kuyfƀ)ܧ]7t+r(f;"y anq5/x OA+:lv"1} ~aƓ12#0xk"!jV4NglIĽQ^ct}.SWq6kEqe/`&smlUF߱K Xt3V>T0ppgT;f\b'U֧ZT ׵ejNy\LEn9}憧hq-U!W-iA(0QO `:* 0Vo@đVٷJW^X_QQ0g<{M0M@ (Vo/2<ɝvV'Qכ6n[23/\85r4;ؐA yt#| g) M>sk``skhZskUGU=¼CT$!,*G4W!Lx'#iHWW7?h%cF0.~j,L|F9E%IEɥK>B}] ?o'@&YcB%ph/Uڹ[}E?jW]f@w SS.fp`f>)@0Џ_k$!al*\Ἤ$#}rƁzD*zKqؐYG T IaULTwxsǂM/#`W+ x3X#"{.%$ta2afbZG W&0nÓs.k.L"6[毡B3]$#ƿ"7xPq?nb8,8N}pg;>$ BG2pb}u\ JsYf>KaׂTsDn[k&} )?;C(?^.jp #UdseWV6}:ב~4f,zޟC7G¾tyܡpF_mOIr-;",@p2"B;N|K1E}b Y\/n L 8UDB4BjxWN#GNur}s. >fLqB[;R}e !f -o9.?b3]0X ytpj'fISů5F52\Sr-݄xF<\D&0 >3&\ JBGYQ0*d"1JTW Ѐ,U 0W.6A` Nj%20U90ovCY|<,G)p}~0ė,&hD~'G՘b@EIGF)ΈdX2]\Ó>t0 ]hX $Jpg!JD@8?bK$i8*μ:\2ށ1+X{1]ke?;# DD[ ř4|;~,l06Z&mqkX:.*7r~30"@K,ӈg˿'"ȥQ]iY?-^ʿkYHY }`. KMw)og`^nF_ӀLOÑա*j,1Ğ65W:\#K}Vy|&isz9T<ŠvʌWBLҟ6VZ@Ni3.3mŎL(4wQUw;JCHu7( =;vkho(F:IOܻk lsS?vp@D!H<蜌3*X+.FO&kJ`!ud cp X7Y$o~(2']"ʵzU o3SRwl{c8a7@`3Oap)ӟ т|SٻVy(&K{/gkp~' ^ЃdK"@<%{U@7l$9}FDJpGe[e];G$&u?SJPr=p^|=ΐm!Uyb{.8c4zp>e :k?} Dži;>Д珦l,,p9^i z 214:2sY?s&l{%b;ۧWJ^Qv]uE;%M]J{䚫R fa˗`Ʌr>[*]~XS/V)_}Bdxz=9'@:~=?N4:"2Xe}+Xu+ڈ1a$"aRv eG0Vffϑ'x1 9{LFYVfXTTH^3.ޯ5iP3EFg1ԯncEh`]?pih]ͷq.\#c6SԨlζʥ`+Eܼڑ=N9 q>2Q@psx 4rz,էXAiZ<65tDZѮ؃2眆u>Kkn|YBsP;ʳﮚeYsnzjx;/>)~1Wp6$P6["sg ]uLDj"Vvwa@Eo·Ji$SuWkHOEelOP8\Nd.;@Ai#)ɩ2YG'@#0}Iw+"6)ξKYJ+/-< #;*~tDSv,^-f(=svhj=O'Tww=B~"sqB$j`+k3mf'GsiUu[U!-PJ`@"Gd>NgݐP\T}n4"S ZmΉa6{JHyn nsy,YPTL~S"p=rz7@#w{Dejf#E5*nIAƲ6שfOSP̙ڛ `ZBSն㢮\041 fCM*_\d"{‬f^{+5;82,{llG 䬛蛈"ɴ mqE^L4oh)7gjE%{)SFnȁ,phC0RWg77frSYԲ"1IMY0O==ZdE)AR[[ .g>TVglENN6fjmğGj0AQG&_ aʽaΤ`JVgzj1h2oh ~ U|B'{sِ(2g#CsՂp?0cb<8u7oPo첞![fMF؀ySQ:TFfI=Q2qKc}|NRS|ѕopٴJ1; M"߶Kx}7jvSՖItմh H7 s*_MrcIMTU<6HsԪ qt~J$r&X\9Pcy2ٿ6 jիݓlUWa7jAYx H+Jvs '\Ui&|I+;ohcdq6$Hp'{^3R+_a4@m./?ncaX@vd) &U'mqCroj;Pq_MdKT$;Ew]6k2ưB=[Dؑ(1KǒՌ9w: hr 225(?_@rٌe1{zң- z7R]SI$n{->jgD6֩F[̣Qpnb.xuj<00Þ[ña)0–r\%.҄c9ދwWRR23`kTB>;*&$1kwn:w +a'z? 1/("6H z vpϧPԝұ XBXbV1.oN.zJ""̌S4V $XLxFkΎ[lͰ} o_p~وЄ֡)`Xɋ in>* K/ݺ^iso :[Ug,ϭ-)j8ex #ܬtg?6댇)ḻxF,d鼵\q2p/Dp@*ptXȓ+DCTJZMKZ".Xެϳ բ~68?;W3c}oٞ]UExS̘✶FWy\~!Ql Y!XtFE%&{jXEƝ~TD9(Z}ҩo#&xO5mp|(AR~> wL EՏfrmnKZ$Ùh-r+4 ٘O:TlE3OKbm @.!s}ߥ}viCȊQež9ս4!w@(3h;]a&4+9W5,PUUܷ:77'+W@I8D8_E>܃?hLՠWAKvS:sFe}M=w-g> ji [y |pC!a0D|$ˈzbd״Qa7`@4 xT Z |RemJ6ņRIp[/KE 7~B`J`rmA/"Ũ tCֺE-;d2t98b#ႹI~?VTz̕Lw S{OHU(dM6p쯚]>MY UMWcU19E@yhiFwn%TXK#=U棸s ܰ ":G'zUM!(<|\A=R 9Z $" bo˼nZ݆vBF=|ۦlש{^Sayn΅uĮA,$wPH\/veGC"=(NEώWQqXڃʔj6[6[-o(Ŵ%58YeB ]رSb \_k/}ɲspÿ*BN\ khu=h;٬8[5{hl;Zc\?[xZ98oQe4Y' GxEaK _4O0>9V5Tp4]$@n(ˆ?iZ^PBeV߫t a K;^ #FFX6_νjN+V2ll!,GRXmr{uaw%:nt$7bCs="_* i^{vcÍuJ*/`N f J-"3`QӮ˓ca3AgLʻY}:)L_@&"#VQۧwq. _Yd/oٟ5@x@8I%[;> 0]u)r>Y?@Pܑ9o8)b"ҫ#f T_8wL::U)2渢TuiOZY (8#%>?U\y)'Ji|#_g9>?{B??c`[*zП_߼ğtj aIkNE9AV8qE"DV\69k)ɶ/~8><U$pюI$TS ʻ\<W+9 ^Fȝ46?$Ilө#htrL x7rR[8+x6:@Gr~@> {PwII9)GTK(ڬ~9qN{'(BbܕsYpmW-&kR"US22mye$ΖX+}&9OUtʽp^WgIjN'TRPgx>jEfe *Չ[tyh} 3MꖛY<Wȝ `v]ř/6 2~n썥^vI( - Nօ&jݬX5oqκ\FmΏ%kiٿ%Sy;˒^ ʭ*!$}udT^acFS"9 [H!Im"LX`!D-?/zgwW8bfYV.eYZ_y홓ܸ:;j6%Y?;/Ax;noA6oP^ FfW(u |kR:7opxHڒ*c7ya\Y[ j}m|δ _\<1r̓#!t5#{S, o"b᷊^`u=L)Pٯ)aA gU ΈgJW#vB,ؐ蜧f#vjq~'d Z'Xh8бB9+;xeO䭈G t^K2D}Hhq-EWu{Bt t9.vNM2l V . S4b ҧAG&rFVA^B(0Ӌwo 9vYDlŁ Hb"$:mFhKi1bn;|XI<~F;"^Yܲ?BSTHɵ 6Al3+-;ezџfy"M4xӆ69/ WsM.=orqՖWbhW?V^ Q-0nq83!qWAFvm)é莒.91\RZj%;Pʒ#$uץ2EiJ)IN@0'N@bb eؖ{Je?_e6Jh9岣9KKl] xƳc$ `4'XR,TuMړGYy۪Ŋ3V% K>5_RErifFNז'zɊ d2 21IgGub(9؅*FG϶\,W!#ۉȽԍ0w@g׃Y%Q|q~l&Ҹџe-÷+E/4$e?X`bVTo ݟZu=m\&IqeG-(Je;j*P߲ )ݱ <$$m^(imid ~D>(v:Y;ًJ}u$TT;}O+Ś\.be y<%:_QBg>FeclCA!lFu8%oE2%91T_nI~6vZsI)8WRX4/{LUBnn WqcWcUpN.l-td>K1Id*I|o4J6|"͠~UYW[NBxKY@{ }X^1ؚʊʧEQs|1uȂ, l-qqS5DP [!FLQU\@hS.k /Tm}W7%=9(ƍ0ukx3z}KԩwtmwtAvؐ<8Uxrk%[ h06y+XĹZJ4gPyu7j*ڬmM.)Gt>E JK';gz wKxbe0hTU9T`pڻ?`S4F6C7'~O@z1`ɍ^Ԫ]wɅ HTe5 =D6ЖkkAބ-BF+$(E QUnsT|yVu;/9EVAG;Κ'TC+Ua&{i5k5֧cIW+si¸9]vS2lPzpUAxqyrq[| ea1(yr,30TSJf%Ǧ6ze'?U#0 ^ЉSbx'h+R;zV61LLv@-0Cpb`<066<ɕ NBH Br_蟎jKTyi1{&XDF 8HVa:?=^ 2[챪f)Ԫ@c]1braFU*}eW\*,OUїc6\WK>}oQᤰ+a\Y2rQucF:OIwK7:% qw\0 33p- WGw2%P;Ue~7[{54aVtp8LȔY(|tZ1oʐeawOv!̎!"Ih0E9}s|e}6^(vL`M7gVb*${0OlBd&+e\CI/LgN~zr)0چD7`A]YxEu?3uxyhߟ:ҿVy52A& WXtW\ao4V]`3 [$ A궿aNjQ"JmN2 @ҁ[dPTА zTv}L=sOoĈ&%]A rS"X ؤs^]th 8ҍ]&v E%t{ƞ:dl kڝ+}q ~f\nnW Tsɇej\WaE tײ1 #F)O`A\ [c^YK{5M0#am.il}HuQ#w6>No7ǻˁ)|gr躛ti5 W.T(wbGK4(??!l19wt{XmYlI}TЩCoD JVÂSZ8; );\yx /n1^I(곐])(ȘV<0b.3l_ӓIQ)Gkf s6Ǩ;1^BD|̶}8(Aoxsã <|M: Bةg 7MЎV&VoGl %: ~\ϵ/;Q6ԓh'd׈$o~l8[w!Crn/~ʸ`&tj6X̪P1iPi=t\Eˏ#[fB$_^*n +xmTJ"N^ YQRDʵj'$|R툟gSJ,_`/d/^[d\3ɉHp=THKOCBdÁkHj~)>o3<)$?Aȸ/, 2YY^(/fulcCi*Jdk,~Qx.w,1kB7n8/@otgtPA ~WdH"ܥLz!4, b &?C(YRebo3hY Ct?.qkj{)ZE8#@x#XJ'k H`瀣1Xi~6A:PH8V8z)1Whx_mPq$0׷C7*~d 1*i)x‹=^r*zߴo´MƄYͷ?UfsK9_;c`k6<¶EWrj'2\ZO~LmhiF|%3Fm2';t yJ%p n'ZY' -ۑaܬ I/pd6'zgȱ8 8U\EŵnW:D=2ona.RCv6 G0ǥ4Mfװh} ѭAt8GNfY&`2Ona=~A=}`C=lzP!n. z/fJ-} q5ކTwg\eوo[`^P!߰}{sШ˿,]Be!x/a؞]ԝ0MH@`πaETַ~9 gX9 ߞpCg$܂ta Hf"A4Aw,l- `Ix#R 5sWҏrhNM(;z#X>^?pge+Oo`&;It ?6]Jk*a ;G ?9-ۊ1-H-=5@=hq&~ؔI* | Z0f濯l-V^3noSd7b3qi w\D,{7..Ŋ[y_dYH\'ą>[Kx]uA b9}ǼU-\V`Adt1~ݓ=l!zR)Z*Gn"Mkt@}ΰZ}OM)z ~;W -9d! is㹞RcOe[a :Sw@\)Mx<\*nԨˈXlC^l4zGOrBn,79Px zx3A@тz*`)\EpOJba "V^rEH40Q |^z-_5%#^LR Pxwlf^?^2JzUp Fw$GCL^Bvַ? wL)*q$4s4%HX5:z˛.JyQδd/xz ۇQIiɈ?ڂ;Q4 WHΫz{_-2)lRջW7>۝ RNއ#{.CLbU\̢DO|t"N>c₢G&) '01N(iƗ, 2DGE1r<^x{( F ɮp]iX4m:~D-t9J2s98y!JwqvQߞ'WȀe^! +f ϔ[: 8x%~˚Q !MUtv(]I0p gt skm1A>LV|ux-V[ST%E5 -┘^=u s2mE:L }:ڳfC/{X:d,U3gxw3am{9>l_- $/U@GD4(H'7J} i*؟J` ^VMyBgH__id0G}HE1LSF,.O``3Ztg}Ģ&2Fu/DDԵIA_xvIBQ$/I80%ݻ:rii߾l}Fm^kp8P$*zy^J앾TӐа!WTJ2 J]1O2^9kYGY4)ũ 6Ȩ3zy:nEʙo `ɃUOS8IxvEV^4FU ,-78fw׿?wGZwGZMQ>|p|d:ζq-` $@SKDl"\q xvZm>ugiY^VD ӱ6,_E+qza ʛ#~ǷD:fv%-2ae</u*ckJMc<!jRN kct~fh9& ~3[*G6ގQT0*^Hm6-׻Jڨ( [0؇+9L!kS?U0L$vT-}.b2;r%eM% b(/<$)b Q )'9ئR.r9UDbS~ae\ <1ݭDn!:dH2. q[MbAq., O#Rs6.qg۞(Peݣ躑jj\أ4li/)!}ذfn !h6p62'/8y eͰ\T/"uKHfh8>F "et C~vJ3UMaxO7d5u:qESש^3QhfKBgLF4# n+pes4Nux3hL(1d9j;No"ո͚uJ_:s9i (=NJW IM[d04ĖP0,]ywv(xN)ȔLc5]vRxU5; R$?Qҍfa1Q!FE-^(z}Thco7ҠWftGQm9UVطh0p8Ʌme:gkt'm~8԰@ZFU&mpzR:']dXȁF[ ASHB zm\1\)Г\ rJJ7'fTaX~nG@ÀVCq htR&-\ wʎu󕪯Ȟs(`#RV!C;ԋ3YGAk1I^$]+8O`:SGAvZOr-g@n'E"G#>&II}rנ# G Hh}Iq84(M!C7:|OUr]pg旮Cy@?{tu ၂品3׏a;햦eɨ[;xT q*Yc בO 6t5sub|-gDY%EH298i ]m[M;32ʿ E*PN(12dv|? ؽ"(fi R'F? piexya7?Ur lМ%<Ad12)eJ\=sr|秼\4Q|bڔvDa8"01N1 ݘ7ICA0OLy{ -)9L}zu!滢&=ݖZN^K{/^\/?l#W ZҙI>"He6PڎJD:@qk(œݡB{$&SW$$^*RH>^+ɻNDZ;tTOh;&ўV$og`#nՔ)mf;ۣt^$T# n1`v>_E,i5$,z AzoP(F)iw\&S|r9Ou)|!ҽ-iHN7[| #]d`J($3"c e]no y wBMr2IWTESҊ+Ƥ3q[yRE~`>B\PƷLGivy o}!# !zԄ"A8tO3@ a3a7Fܩ"L'oDRaS3~)ŰҖ1OڅezbXf,WiZ*7S;Ƣ/xDN{`(y%=6 d?a#m\i%W5tĽ{/Щ#wiZy;WgtMM)v[Vn BǕZ?7hn8M )`Gfϯ1<GGx|AwϞ1Gg"|/z4_j$lYJ5̌tl f[VeUοFwUa{ѝQF' j!߱+h|\B*MW蘉us ӸǛγ"6KkczA y/㐰ԺTjesdI!D5*1媅MwRE]|GPqDŽ$};WG|gx_ɅwdW"A*QZԬ!ЭJĚ㤼X)C.X\fWjSfK? ^쨈Rf}(7;I\Zb<*Q22~SMD9㏞d-_?K]Q5tٲCl7fun hK_'t@ya9ET:3B"B\_jT;\<6܆~ۈ&°}Yn$j1'"r3auo;Ky mb73pͼ>_~Ix^>e@=9 qML Ղ2qngB:3ԓ%_x{Ӎ$>)2Cd*VsZ %Q6Љ:+-D;ϭU)5)_1{(j@JH^JRM}q3K9zo‚& fXwv{4D C?*F _2߀(ڣ;1,Qyre͇ t]CG@J^x`M+Biۭ_D׊((9l!JgQV+lO;-C_b)a;UN &SUZ Z1󽴆Ӯq^̫gd!m ֥_2 Yȃ~Rtc-n8ҨJϕ$sǘ=;T Jso_LہnAeI3Z 3Vf(U ݷr&k_[ kNYڷ0 SH_i{ʚqzezAe{ˍIy1 prJŮIUFQ^V2y8$lϊ-= #w1fc.?]c<1ޮ6Iaǭ7k `*kNe9K<" ^cքĞ̛nd@"c$s58N`B-ekEz[vy!m]g8ƚsuKWncGCZ"pC$)Ltw3B<0׸ _FzEA SbF}}x_E(zF?m+ ,u(ICF-re|#Lp zEpMn-sOҸA vi$($S@;UֳJoq?Tj' “}IyzroX&Wj|RzA3AR%{%PhscDY܉L{hz5`ɱ贐BA2JOIm\*L:ݸ}ҨtifZryv/iDm*ޢ ;{FlD^߰)tRפw~ !W ǁuy9lw`qϔIYuɤy> &4JMWzO6XE <"h[\Av^.|q3xՁ^Z2¸Yܑv:d>V#q "ۨ&to+k]>;e2&o@(#{|3d缝sYy83zu!|kkQ$mI~fVC#c*?joC"3o6nmsL!3d!a4`pR0L2kDlD*qs/Ir >< wzd3|G>8'Pq0hd1Z75UT@YXYr}6229 |k"VLEl-D-ݝbswx2 52cBv&4 _w,1cI+0zr}W;̶˟L Xm@",[,8 eۨԡjWA6Nױz; ~P#XFaȑ⍦*MfTbk,U 2hy.͖#Yħ#QnΫ ~uqMp^X0HF9Xn?GC":rioӖ/0ûEQDU\H8qS?`FVMg&uA>̽ zXeBLL~ ^HsWEMgI#F<؋=ZoK bL@W&rdyd~]E ݨ*y44wWJE(kڣ`NFCR$,tlVWl.y>?8ӃY/oE09i=mONW64xkW\9(tOWqI,=ճ  ̩E;qaNF+6m觜.4C:ͪ^Oy\]0v< Ϝr!.~Wx7d]ʞ39ZrG{|.z!yXik9/l/XʥhE_ 1~z5<%<<'{*O&Y/^xѪ-Jȃ\9*Uek*kEjxh/8~uD k?3_~dM2i0_۷2VQ=A /q2؞/eXŒ.7Z=Oۏ3Wo޵o$Ք! ޯ]\0v \צ'Гy/k\64D&-)ne)kא:aF:{lǂ罖~ vٿӄp;ӌ^fs?y)hS)]Ћfɱ1nC/1LbJvM!QvH6|̆܀n!+ڢI~;ke}RyVfTΉG1yҀ˿ p؊ޓ Š ?PSp?夘-؍Ï1f"zE7QS,'nLF\ f犛X<ޗueڕV7J.^Ub^>l7𠰃c^Qg6•w fFӫ}3bpdr66QFFN"+BŘ+L%/Ay*ǜe) n^ˀ o';xTJps!kGWV x)Q&X-4^g^`iE>wiK`Z#e?z!ڞ 3T?j/ry+09SMtizL{)d*-wqPo} Kw"W~ZHѾ?) dk0M.fy K8MCĿDBOBpw&:im(TaY X^1g: dN0E94mϼݽJ MmzT'o]VMU' @2 bRZJHY%o|2޸QTU1o Ke`-/>y̭(]㴴)i 7ƢuE^kUnMvU>cA׳̑q=$ 30vb'r ~3[I[ty(iJ#{GC`Vq$г,Sp~li[:Xyu23)qj@_a2+5KeN\ vzkȰH8y&3A ̌cT# sg b8XX؏flAwlq.f,#m_Pk=) ϯoro 4ΡE͢:'QbYne`VRFƐk>%\GL %.s(WG`TĄD ."mxcS0cE.]=BLHva=,Mttn؉\Gs˒%`~+='ށcw8J"^]\h tM춷TO1#{_놐 +vaT;eўY%+rD*^LږC@둔#WoESy!\=G**a W AVD|U9ZZMozGA9sHM8{ ˆ;tl v-k] .h9m 9$< )]m\|쭙}7vgW {=- fpA[lc}GUNU僛E~%U%'/ia%ÊFV  m2ԸnG{'dmyBV]@{ 'n)j %:Ŵvbܕԯe2A$=8Zy'S'w4r4,EiD8)vTp)uTx(&ߩ0@1-]I=LS 4 NԷT_5&/!L*R3"<^G sQ[]S(R(tMl24 *TVob>FMѭ'L2#b0[̤4C`ۨe2.Gp7nOZ"xii0jomTd5ae=Vfbd/ +\tؗB`4S>y욾ˌwR!o[rc@hAG#ҟW˸K<=HŹѽxU 'TكJbn̍e*I85C7aO-|0cӎ 0%s;*}#ӗL"tvf'xBv˫ÙѲ. .Vq<$s.tӡll_9h/6+NL>X?1 nF×*rʷכx~Ѷ *欱3s*~ܗY֝ZUOD~πՆdW.j#; d}[9M:Ӱ \es^f2(>y[ٍJ*`_R7or`فl'hS7O[hFF .+TNYy9Ⱦ))~5o@gbp^~OΛ-4`n84ÆT'n$˨mtPQWt⽀K7=$ ]G}]zX줥ੜj\ڐ|vf['0@gi˩J`8]Kȑ [m]r2a2>"R|pհoA$eM\|nlgۼ>;]rxf1XQ|N=xH@>|$^4,%LPս6Γ-_d}VitY5*n) DsȖO ;*Awh?]r/]R#63S-^4\|U$ވd" M[[ ja\{M};1݊t+BwPvP܌h#ID1#Vn_]B mG0>PZڻҜEH!j֗rWҵcE.XZ?nXH#5`/vah؅y5tb=w(Q&T@Ú6[_#7jb|kc $`vI^ L`Mg.> Ÿ=a@%I>~7~ECL=?~'ܑpテbc| \PR͆+TLE=0o/a\B6zuV4)ROdHquMn䜍GF Y-9etBWO*qnߺZQW{JI%[1";P;^Tqxr5j?ENXp/9B >%(gQusL'Q2F ҇*~5J;֌ѾL'~PF8dNdž#3=GJrox)/1#Tߥ= 2jrhṷ-4]y09ɢjXxz)+蔛d78)<˰B9v~:r͈fA*VC@ w\^!Bʸ )~Hl9:u֠t5,Td㓨Ыnt<#ir0;xJpxgG5Ou.$J^B)[ (R8g:XIΚR B)1d Ck+h2V BU {zlBq8i(g T4NI{`lB-*$VˮU<( ҪTɓbng:/~W\;$$m ?~d )ށX'橤p'$( m}lc ("b7yjo$@ŀ|5\WRoطOhAg;h7ainoJ؍~X뒟h jo"Qg_/7;3BOSzՂUbiefҙUw[ EEi5:G0V Lk=lf9-P܄!uX2du/AhQĬDpRUjf?殜m7#F?7f$V"_Z 7*P$KMs~mC<+'+5bD,֫gDHW7 s]( 2!a[zWg_ Zf!.:s_ca< ؉6Ui g$K8`5BvFVBq`31ѹKOjTkB CIf btͫuOa9Όぶ!: U]#ZsIT'ne3 9^yxs0UNx>]Kp0'U8N9X_ͺ4,l *2Jsq\S t6?r@V$`ʏ6Mo@vJ?g iSHb7rm|+:[f;uxU]JO5j=k~*͠SK»k@Ԛ7Eh 1ɾp,DxÃ)eӮՈSx^Nf3b18ZT1\YX@3`=BVjp>{%j+xjI'HvQ[{"cڙ^|ͯBhѝc11)/Cr*V_6J3H[<Do_vk2D H?JkkJ}i+s·Wic5Cqm;2v1v0כÃHd EEKoj* YEO`tNTS"! su?g2mIrg:S=zD۝ i5d+ҿf}56GP^$OUt}ijw9Qm^} 载*Du%~԰3`W}i_M1\|M,JW,`k+CXS{U6"^"4g{GSSw29(ӲI>F4WA:(\5z{:CGl*XO7 $BqGM/]\טwx:ob;H6: dj%Fvg_4?>mH>UZ=E;- `P$៷Nd۾FUKvD{-| *jf,,ɅKj1Ly-.еyShASՎbdp3."3lnz9l]㍆z@":ᔻg|X߸aA??~_-Hy_v3  f"X ]/̿-8J2~iu%AB<1o턉XIxh4'&d n* N#ܘ j$FjCL Ĩ8_nl58kL\s rd0?6̮j{pW11 Wun?)Izl"*o.lyHTFlhnO]Ϋ.^:Q*Gݯl"}6n~ϩ˴zuFLʟ[R fWF@$Bo&W+pMeEJ }{ARo9yZ6-jFL+F~f[n_3{<ʂWPʁ0y E2K ۊA燻_Dn_-<9 yKR[JpS{C_)'|DG H5j*Xx)eXӌdԱ.A*+~ `iᐙ_QO\uYZ8TAݱd<#ލwh4XͣʹAZM ތuѲ\SRӢ7  qh.e43p^֛<ҍ1W 6󴷦MDJ0XxH l&~T 3-6kzVw\wܴ`K-VN>%L\s3ek,+z/L 3H;9UL?~ݥuvZ/c4uJC{;.A48cǞ~_;kr-PdBT^.*W]RT_0Af/n*AwG$}&}>DQFw؎4Z"@(0u`G>޶4m)>As~Ardg #-#sp35J9],(&qĘqҫX,b*Y,Hi62#F'{T ;scN8 Gܡ5 X{>A@4w<;rǠDLf7w$iR ~Ye.IPh 5 O^OL3pee :g.9_v"MLqlikUSv7fF N@\DYޱW Ɖ)hz)QznT;fҵadfjH^CuCl07WcjCOhfw: `-3Al9N:D '?Y, n'w u~6/5waLW.k%|ܳdDO2I$t>0VLn#$( (]Ƣ̕.p`x(f=7h; qeQA?K2p۶z Vuq RZ`Fta5,WoJte%ǭf A㧤F꼅$\W89q|&Ӈ:| p̳{ZxnIY m1̏.xr(1֪f˧~yG \鮜uǵP1a׌ ɀ\ 66zTztI͢|a7tXg;8QEºlT̔-L YOTop}Ҕq3wAiP 2E;F&NVgǃ R*u7 rLܪr^A>) ރB>L_ڱf?u EVn?PX9-Av鐬=~>@fe(֣mdY<'cdN CWOaiH=\l oX!,ޫ("@6](`ϳMpK:x* ţ'?D/sw-{ OkU=IYq~甴Cḋ۰MH9X o n?Uc!sGc38S̻&KBߕ4M 19D ^5gaPTSÜ.ڋQ;*k=pżtgO`Ag/XU~/cf\\ڕlnJ/ȵKr~5&].Uf+= GZ;\􄅫#'.Pm2s8; ޹Sx<˒T ]ҟ#6|IeܦwamInL8b>I|2EPmIw9 >8 WJm?S(m5`h{ 4kTTW(w>s%cmz B16/m~T7˅f?>r \.wN`|!:})SR3zRzv/eB[m p|drh9y(xΒ:DРȣ;vZe_}h hQNp7ٸہ `4@@p r_[E*&14D_AOY/0;&&uڑ}Qx^vq_%=@+qQ bOHacld,`)2\ZT)t…R *}- gvj4S =hz/ѣIF TMvʐ+Z&OA˿EW[3UAY6@҆tƇ"Bo0)!p2i,˨Yk?fwş%IlÜtwH<䐽l9Eڰ%H7d!Q e,?@;=g5Ok}/Q;YCʦ̢88(QfؾW gX]g>p@K8ڒ`۪:ʆ(0zWpg67xpK@,e&v0){ᗩT1VC-ҤǀV⪝"WI'(~W#HY-Yns lk$ѯnlH eЛVv'nvooDdcOkSHT@P ܑC.U5BN`GvɌ[=&B\syMϽ7v"a]Öqߣoig%1RR-o6sɘ(IW2< 4L'7NB6v&cWa;eɚ;NΜK]WL* VcA<诗0ڡEMBS_덪J>9td$]CpIJMg[v EbMyps26^P]-k96N&v$15"I*;9հFI)DFN`dѳhab᷊ads2H1!39J WSGk!'L[qP/YTIq ( гqc7I)KSsDmRA͉QXB8d򯚑ONW}4Bo zpo+ /4H:b1Fȝ^u7h*d~j띸9) 8˔ujzI#ӃWI12ζo|M\lW ڴUyhqsȈt($#WT.Pg ?Kr=R+]퉘"E)A6uc+s U=DV;JaKx#Jw9ZLF&R6j|Չj/}KU `Bxpő T}x-O]%uB(9k9.#xɎ30],.jnxQ MZC5;" CqRx!7Uo*a%TԱJT(GBtx9Be"(6LzP!)PD]vu1/C37D\A٭2&%b\Ux8[ /_ $Q o3i_nD9.G^ҁz5C|XR%h2]Q)}CqY߻Ԙ=r5 k@gQs'%':)=oc$f+ѱ٢d.`^u濆Ɛg hC_7\qIDd)O, Ap=h"S~+^¦n[hXR UoBe(fneWua~bG&[v+ƕ*"gZ>_BeBB.#+RPF'p_x< 9:6L%*,/f:ʹe9h6أ=qϖniQ*#0lUY[囑:1ӣʸ0/7& @X8|+`5~4c}nqהkeNd>i-16؝jw1\(P.,f sfɜO<[,0H!QMV4՜6Ic]N}d 409iScrgfh\̇dpndRׄ UNl:0ј1?@P0s&(Ɍ|d{G聼3Xџ-m ef0Q_)et#lƟ2w CL i}({j~"SjW3hB4tV1T?TC@>"8FB9֤FmHc|Uc-p4$旷/p}<DdSS,lN8LE/J\Y)UۢD֕`.ڢw &˗֫~{$POEe0E2"3%VJwXz`ĦڊWr~ מzf''(q3:ւ/6%K[w 4^UQ^<dQ \sKiR̐I_MJY{ s0Y[x!nunz"_h͙Pg{Pu-K W{g# p/'̎u7=8j+D(љt@i- /GkOP9+u8pST Jssk,ŭ>4iUk.d@l/ #QEħR颧Hõ:B/n%^iPu-<|=@mS~Äɐl f :^Q25egܰ@{]A88!oIؿ&,!  ,ƿ1U ;d,ShuGjd|nl[Rlcn@q|3@, !kbAo=# Qb cV T Jh[n]6r:W rBaG |',_0`q3:hl@rCvTxt[ʨyw=`iƻ}R4L7[Ȅ >^THFh} %g0 &ǵOw:ؓQk"Acs^&#vȃd%:cJ{d7v盄ٺBFRdɲPҖ|RRnr~`ީ@5sS/WUfagJwm' ^ jGwN` ̚挔p$IۋCK-o ZSAT0_CR|X_!:J{)4(]N1u ui$Xu#+e`VcS=Z(6%\ $@izqjS/9zQ8DvvC)yi۸] q[Q' w^1" 1X7OCǟM| b l+=b{/Q."nYȿII=W fغ^ #3[EjМ4U HQF֙ҌrCBi?L+̐ HK&Pt(v}H,L+AdTIeV4Ii~)@* d 5cșgV97Za@L~%G7 B _\סMø]c$˜߰.my ";1Dwu0B ިiخM,&m?=a4yNOF݈]6F4oVe \X3m휔˻_#l;|_@ZƤ 6/(*&Qg1LL I q)WorP Lom;bb^DU%yߩ8\0Ag)Y|*YYތŬlk/\OueKO`.ߵ퇹9Nf`F-.c]VC e漼{(7h*_ Y@:zS ]&`=aA!T4|;H2ÙAI0aɔV|v+`)_3DxШD!1{ ˱uyYhPJ$7`n>"dӁ3mU@4S\ T3eHj40 ,T\3Ȯǝ zNFv).\:?TS'ap\' XM7ZrDZT(Uˇd3PZ }H̴@{2hйp1* 42-6ꩡ=tygu#$7bD0R( D}c)PJ>Mg,|^#.ly0.||3ƻjk_2 3U Yaj@fcN1Sc>˵Uv[2U`4 /<˚E`[uy5ɁqY }a}(H%D#`94/{Zj0PrJcSJ{,:avv(}4m0zCTD@+4PtHC'Թ ?[HNLKM,㟲ߕm~U4\F. omqdn?h\zZPm? "dEgM A W:KX0U1{ Ě{ZBEAYLv^ <ߔzxw0Ш"P.TiN7G3C-mla1ұk1,||q\P*"Ălj9/>Y݈\0aA?#%%>Hc sݎA1d8gjMɶs͋C*C'\c>r ʵ_V%jM}<g~$"#@rwϫ @λ V Ɲ"1GOHJXJeES(O' A:j.s::K^Jjv3j䨥~,45^_so3ؾ2bne\8 $Ыp x#_jlXlށanۉ9HJDʭ_= 9+Ժ6F&jŒ$^˃HLO%xN#W?J]RBsN2xss!={iW-t({Z:w" -Ɔj>7IZݦ v&ki<*ZR o~ކpP38F%Ror^$i De]Ce5Ve%_'خ^@Bi1>bjUܜ`}$@h)Yɰ:͏ #I+GH᪍d=>iAiet_T >i gl"B͘ L`Vex9,pu~{_x4_ѺI55[ۚ%8P6-ZυKǹڄѮ8G2?~v=)auՙ <{8%wɒqxx%Ӻ ХeoU#x+a)bȥm Ms8y+|W96- X!>,5xh@=X/tQwoe|=:}nU~T<`)AňLD Dl^xWR+Lcpn`ZƯ_9-[_g\E yoF_xmg3 hAYFEAwd A\R bdNwLWrf&ºơk h]#ݫ8lYƥ΢K>M]>:NjESwpÌΈ|w=ж)ܢ`x{ .KĴyG&H:6.laJ WxwЋN[:đaᖴ-m`cEv'phat& nj bYa$,Vp&9#ϤSU㳣y$Ѻ (+.p}R ˱aCM(DɄu |z& -]g?p (K2 =Bc.%| (+`+L& 'jpKOTap3MXr'I9KxVJ z~*.XX9820qRLuDN):vw*#x<ёG 3Ja]U;&=Sq-Rl5fP5r江ǪJVu^ϵJ􍻂E::UZy.^b|^OW %k}bRe. a,cK߭!~M{PlKTRgf,%2͊CKq=V0V5Խ7C=*hK:Τ3 EB"PI-KMdqن zfhtcՒ嚀m:E8ٿ>y벿?3R*nN$m^B!7Ӻɓ_nD i=]~DdWb,8 &A uuU6zP1k.=ψwPw}RJ+ ۼ M̵ll]<RmvgrXL9LO-K\y( JtXou6SrN硊TZt+tDzTŭ26XX|4C/)|Z",7!K$zq59%I&S,MLo?h@. &.B3jjxU6ceAйX64~P:+}i @ S5Z[SvIxH2tmmǂbGa K"hjLmLc5 cIȎ_|GƧA!aGzZZ`ϝT.4c \U0$g 4 *Mjs 6ĵ@JeIw+2zߣPSdmVEW ^vEKQ ܏ëX%VdVNhwH:tu 8ҋg,5ZfH[~ 'W)EHSbW -ZٯZ>pwK,bPQ,qZJv}KMb<잓K4J@QB $;6#F:yU% ~ٵ֎WuDZ!VV+`3CwIL&U}g>zf2?|0Pޱ'cuDt`f@Mm,,h9룑!r1Cʜ_G :UA䘼 &UbyޗNF?/Ӟ4Z5- t8@~Asg?||zr:JF_Xc/1R)vE|Ywբ͜U`oJ7C{6 ,jwcD: Y[ -b79h!rh")V^~jERdnmC*q LfL;FzSDb"jϋ/uQCDЬr MMY73 E*gY22@L{.NeoNrsי tHVM#쩘_u7EF`2!c] 2>_9QtnI{uwNrdl9͟2qm @1Dp k̎d!5hgoFkuFG@.nmr,*gi;=d'&[ވ|&JIݹC?_@-a^uF.,FS`J6 X*MdH؟/GHxud =(oWz=#x |+C=:͂_YPJi{~H/n"2g2'qPBۈ#G,_1&<&Ƣa]u}ko!*JRүʹD: *i 8+w%3Ǖ@*LS';Et*Xj5R%ᕆa%Xn@7;Qb oNV_ʖ!ޥ 6G0\82ohz|́cη(Dը^:Nq)o.*; NRQE Μ(,&xbsot9zBcJqMnLpMBrLI)SzQ\z9[ RV8xagFdÂj0ס]8 QRG|)5RO^Ct(sue⍼r.!ݹAK{-Ի ,Rǯÿ́Ձl}e*T6=/j`E̝]fX&lzTʢ.j~r1cCOj8I7;_#pQC~S۠ȜU[?qzuk֐{-lq]$ᗏz_dgF$;I?=nI=X4N'$ѯ4+-$To\|ݧWď/:ULU t{ <>6#9 ۆϼs!? xt|>)}>=Y>f]N1Uv]rîS]QBLTm6/k H4]ѕ0wN 5WX'*גKp\E)0D&oʲJ Sv.tIB7"f%i 6q"V`A$]iC|PCNiO|!;*3mg-JCTyRL e$A7ҫ'U(Eލd1s H~ {3&K'"lVivE.TUol{az:݆ԱwE,JܰGm7¯XvYVP`el7 MVJjw˫]5TRS@bllKMfŷL3 j#8\?Jtmlk@|:]#dCP}+:‰w-c^8])o`>HDZTw`Kq ] ݋;1p_h2q%;ǥ9lf?`֍ħ߻ }3c#|k2zg7>LۃIע8d6ve{ ][)G1fۅ$(bϺāܵ|Nw%1,$h5\pj\8W99$Xz2@jzp@d2*IGK/! >۪mߚn<lDL'!Ǫb? n!آ$|".} e6&@_b/]kœ&QBkoaHs2Syx1N\m.8\+BBV8,?m3|~x?{PVAtW֐xvUH=LXg=3BV+N>MD8%Tt>k 2$Rkam&)="mfȐQl~ulD".o婓YݭӠs)鮶?PxqE@ycry־ވW q %hm |#l5$$Bctud|#={Z,`oYV/R-$+﮴)6}Z,>+pQϏuQ|٦|+W0NQΌrbۛ^.Y,0iNb>/ ' }N?"nub-`aZIZsu#`\"F6mc}N>~ z0egJnwz (}A/˙kNóRLJ\Iv,8fw]Vۧe{ pކUBTIU+Oi1wMɷ RUI:icFGd$N+ަVYeC5tS^}ݒrt+lIbӯSkTeQX ˃חWJ0!z4 /g_w+1g RgbY;`3la~h^<sv$]/FaDŽHDb2*HK(u*;xnАONDѝ$Y5V4A+uْս"1@ ނUU!O 1gåvΞ%/]3k_$Yr~0x{kKkjG >^;C+Š}lӓ?Lü Y-v>ŭ僧Bd3Endðg..ZOE"CLj T \.* *o"+g:ϜOi]ǟGeܚض\:KoAJRC?jI %sJP&ڐY*9T"T5u~s{xə ~Oڕߵ]LJa Of-W/8Lv\֏ ;TZZS]#{H|8 *D߫Mhtpcr Xهb(}Y臦%D5v*uCΓH{ s{/x(ܩJ+-N!=3-;wx Te ı;<ŗt4b}<&ܤcU+LErpNs'9BFFE)i"2?㒷A7k<\_rEA [7ȿgW|`$/:͋bU-+ayѠ"3yHaTWqM#L43q#lTac7%MFNHLBymYZdZ:cؘR8c;DFb[Ǩ#T w>K* W/ֱaFR0>hWqѨ-XEGd2%4H>9Qbbj w?n3 ΜI7c3XB u؊*r??1dW}&Y' %Wݖ~nJg`kACxX{jXws8y0,ʖKѳ"tf[>k1y1s5^Fc誱 tMڀ}I&9&oSh$޲v꒿pdf3di b@uWLO4d'ZXZbpyRq[!eѱd"0d.{ bt'޳l{L|B{4f0COn>HXT+` Nt LVǞ،kJF@Sq%s \PiF|s$H@W5 x eb=Vr%E$B^_G@cF^E1x%Ӣe~-&ӂ(ᝉ:g-1k!γ<ç2SpRNKi-4[#S?C߱xOc{ivm||w @-3g c(`U(=OVqe#iaE]}ڼ KAG9`;ƅyQDxtwhȲx)OL]t mNn=QE* `fxuE[g)\q$&2$6w=6g$4Oy82cR`|0⎠rk#nO*{xJtؔ,n(7gڠZ!ц5[ \l>;jЮ)%V3+GFE II7hEs^j N}`F /9S(8H~%_X6&b5#'b=yq{֭9($ iYrWwPks=3ph ie+㉢Ȓfn'/DW5|2.=QyX*Z޴h'{Ū gQܿ:2 Tč)p3Hpe6l (=vE=MDhWo5p`>\pdFxIW/·QT$APww0\V42χ٠MeLT_/'T_ .Iܘؖ7I~[0Dzն+_ܶDIA +J@ƑD ~[5`%o]L]LI;9~ȀavE!5W)VB.72] 0nשNt%K2pCe6&yʩjn{*S ,:ǯ*0;V90GD4ْ!Њ֧?C{­@dv,COƪb/~]QR". a(,|藢 zIY|T&x!{'ڀa);7Fa;~.Nl;Z,Zy-3&0P< Q ts FRM|lLC4Q<"Ҩۺ*LfUaW}rBfg,o\N ixd/14;^:}<7Dnm|%(M5Ȑ<"{9ԃcAK4%Cڨl5hg|cZAlOE,QKZq9j|AiR3`Y8@(1| ey0QtrOzYoJ)X.Q\X]r\Z:ޕMq*}&R4 AܔwS!GwLJ&Ul.Np663g1rZXE} uqh>0xYF}@CG޼rjW&iMz:gNp_T̮@DL1?`eTڠp-9'o$TIm#z1PBmB]OD{ d&͎7*:|I"n8_8O)#B2{iG[<^T"A}pTaxg;Ǟ\j S*7WE_FD [6\#j'r+ ʊڷbPv"tr] {O+(kG wыZ2aYS!cuP%¿7v\W}TN+!V:x46LL8'q`2C/aŎl F*If3lEd31stX|Y§RHCrt0V(IJXb\\䣲uɔ^tl:{ACBDS81{o$t'h_{1dzikd#yAz":Z% FYV\Pr I6W' I1"_ҘHAh"4Sn +&Fl+*NJ0&^!£cnNQyG1AD |Q"Rl!Y.oX(_: n6_DGZ](Oe cܓR)6}{ؽq^ j4e0.E8t̐7;KQɜ|w>R1 +6&؈A,5{ɢ3R F>U_- ^]^SQ?W,\"(X@m=C%D |,!SKoq~9"?װؖݤeKYxCE/G/CI0 *T>cұ%d+vR\ ~,45cCAC&|._v!/ (>NU~VGqf+dȸ ?V$YX9W45rr}k86T<;Fs$~i# &%οi%N AZ $wU?dfBgQaCNOK!>{IH\xP 1)&jd>U Joob4dMk*o%[)njg[-m7`= <'xQ֩gtB5&j!+#e˗"|-tn'SX[!Qcneף7 ߍқ~*ǵ2fn`IF\n]C:9_][V|ȜK+yrI.1*wPr'A˿ws*PXx*=4j6Po{.9ʥeۃe <3e+Y;EKc\A$OꦚEV;ex x e aq5TX{޽j՞Nֻ@A cdd'ұh!h M>?</ V;iQBb^lrYʨBNQ e5(4ɢ6 =O@0W0jU'}\'V8d%Rb~= 8G*ё)oQRR 3Znlvpj Z~R{U$^7MC_.?f JT]n o}L-a )&f̨SJ5I'otJtf(}l?l^D\̗*F*jgKfѥh<&e7ݪˢ0UlmW{_D1d!(Q0j-ܘbq6xC*Ve[v,*@Q8԰⨘F7VıDc=T~w3,i$^=Ѩ"_ tt+5\2L ŧt|(HktDLv^Usgۙˠkw[&/@8~gXWJ ,81U&˝|L8XXꭻ្+|,^mOU{:3+c 3f'?LOfqCx!K%Wcs?4vL`D$/ ZFk4ha6>=y!>fQCsW aS{7r`J8bRuۉ* `n4t+f}.۫W=)-k>|'DŽI=*g Fdet{Xunr 7ޠ8f')Z3/ޓӎznAvK@x!'Xnãy\TV-@fVءJ?Mi H/nQKvaxOn|;F_ J%#/J. t$F5-xG7nJ #~ FH&ّ-]~P r|5[.? cu5|.79'oALJAl/:n6BX; xS iboi/EQ{2Wf! Bi q*anF l*he^ Zpo_Ir}n5FT.G +iK#-&1Nh)+d3]ƶ9vg(X%EKxgONc;M%]3__s㵘 lN3/M:[v;Oe{C/b)q4?Haw9M-%4%ލ 4)]Z4EXucdg: n/ L;g4@;V| , J~Wk4NȃϬՃtS{ضO7iT<sGa4`ɲ0˃,o;C5r CAV: ClK.z5f Ey :ȡ9P@icSه`ȼCdcQeξ.9 d.~dV&^Q|=O<$fԙ0TXj_N750 2wZJI/ΑDY(nT|CKb(&Vqzp|ٻndaؒ0TvXE<%YzBMLR\vs?ܸ=UXO`(@1-ˇ&˕Rb6ݓx 3MJI$ DD\I\ST(IIA?4ʿQ`Ⱦ+)wM돐g?lS,Ϣ''bsm2ɸ(x ,AX{DXEO釮1e0~a fDhOԇjʨW8o:T;e=9Y]ȳIr {f/<=C c;s\脖%iFH^=i-XI9~`"l?Զy:^Ʀ-m]|u_M5CS:/)"[SE'P>c@m31FΎmm{ >`ԢR6ݶ!tx3m:bcFy:5WpMsnC$h%1ѝi/i[t1][R L{"uŵm1R'-D `QV9zz+i-> Ј1Qtz$Y526e:wl! := EUy!!ԭ"(Q0Rk 9_ "A;JiGawtvSOn™gVrצ3RIEHQx0+Fkw)$!Ͷ҈:2ILϟCjbjA XG(~s ieC[th2|rjb~m Pe)`DFH+H6s>D՚\ћD"k42!Sծ{d 9_脠5ﺛTg&HٳJ5~3" x,"dL U~Iӓo9('91ᓏd9jW!?ڷua$4VL>>dx[܊+6b:CUr|r9,KCsF7.$|.7m9p> PVIGIG>+4-[z cnRbP~c{^0 MXZ+4[U/Nc0GPٝn /7طX%tÜ1CM$ ":BQǎL'1) +yձJNوG [h{(W;ZIҶ0yɠȟy8?9ezArn5/Y6Jjڅm7@{nHMR ǢkLaCʭذ@^~.- h{0ޚy>8WqR7k&%A*n$qS5kqhD!|Q JZɷƴ{BHDZVtv H&u AL{]w)y!T*e#+g!{k q~{P\:D׹13r,H|e5Pu(J^Hui 37be]jE]Y{6nEUE1#S%3~uB9XNo ~NBE5!r%\~S~{ʧmfxbXU״d,Sve. r/,J? ] :^s {-ns;B7ѥF(èw 0h>o(6J!;8% l5ˆo?rAݔBD&YJi5"IL"I +Bc9MK[yr>D1-7*P "IjLW^nڔUS;5ѷ8nD1Oco5%QEH3:9URꩾ)KQRҾ{" ,,MEz4*S*b'C+9 ڏwgGxJ*>-+ѝ϶ׄ*ewVGa>cD!` T9lPw޹2fikHH̲(D"\&Jr׊H>KI2qYˁU ~g{jh?71*@):mB *M/Y6Bk?Bl xi$5' uT`#a Pxd@ GE|!X Bʶ਷UtGi^gmo$/\' y,N!Quϫk&ை[QT6fOϩЩj[\TX j9-fɐ}n}1G׬+`g<:TYWi$DYp~:Ѝ6r0 ])6paP}<.yžIHKƵ;duOIdb12 [ %ܔTƑ=b(SYf jBsB+`Bsa] թ#TL777 LU,y,@zB2f|M)9`Xϭj^eU-bZ81=t;Asp>ܝҊD,'S갣 gRqCj@X x_*j9r߂뀞}.sB =t|Δy K}\4uQ[e񎌩ˆrbLNg4Vc6֕P KaA} $*(vYb(5Zk_ZXN4qeЦ po G$EDvgT,13^$31?2p?@64^wa0Lz7v >iRkY 1e)knJ,'M8'臌8C͠G9YvSWFd>!2dúPt*9,m}"2WA R21MAEcb4[;7">8|rhl0"Ѽ{,34|/+O;lwxU]F D+ 25 k:yAYo>i]FҒ깅~M!n n$}7^1E{SRPtO/pKS 矝?6>eݛb?m 0YW #ȿUs<,2H @יbOb[-"Έޠ:|.s9պgC1 +;J_s*RAWyGU5H3\aJJ⁞#'ο8jRd P1`QoA'BJo4D ,j/k[_<@y0Ho6٪mƥH ռ\!p ԛۈhEХgFB; / DyTuPn9Z631$dSOϹ7!+i,4 tICyP8r)l&¿3Spj|ji0%㇕O|5s 0j*ޕj{AКu?p!m?㦢Ek|!2qY\{E/`yrҚQŔ8]j5Xqty@cPvX04u6QQ?`: oҥ7tЂ?l oe4vБB80zs+=7)*4uq0Z"$Q˯_/JAq^N<JɈ"FN\o"9ȹD% vlEm7BOk0LNԉrr $r-եfȄbs'y՗ +Uv}HIBȼw'?|Jr=jڪ3}j+!5T|fBLۻ j/O+'};olI0>G-az\ҽA?]'"e2 JR{"+'bLUjhN]e30!ښy`ןsLQ!IN< >6Q|WOkk.ͺ$ۢA, _Z3ݾ<Az5Y6iޓ,X$FJy|hųxFHmۮx|lL[ U,*O|3+01kB <4 U6֜-d Qso5FE; {kͺ~W,sۻI-]U/?z?pAM*cr66t'r$[h/82,P=hƞ`P>_7 I^qe_w2x,`Y_6x^ƝbF+OXИL'̍gX<)ef{.t /6SF.5hR46̆,ACLqv`̻ ,5|%sFfc1~db˃\&Ա kJ ˡ˅YbFkqsWUSpvi< /*)\mY# ?٢WEqa]Si‘%e_Zq=kЩ? ZoW= < mD~\=2l~&u` 7gSӳe h<5 q^YUfRP-^LQ V7U 6o^Yj!N1M߷G1W8(Gtg5806aOx[FH} vc֚8-%(.0(~ZHP\A`GӼ-8\,J%nic4DJNRułP=X]I?Cr`N(TU5n"]W  ͨƺpUJ1j 2=c/˒"HoF:Q%)g7Qr{|4=T8 vHV,%E8f=ӞOUD<{9pYJ9vj5밹m֤k}ɻocn+e< At Ao~30ʐߟbu~A+K kgg@Xe'%=-ۿc%Ơ*_hoK|7% `*6BAwuNI#榨#G1nmHs4yܑoאƻBJMiqD_W5;Voяn jXX 0ꡜk l3s^UTi;*BJ #`R[%C8J -p0L72=HrM u;g0S}TԤ-#1MpPţ8ƣAkJ7!:&.x3i//i2]9P\i (+bkLDܼDكYoeٽA6CJ9~'3L0_/x%+{.OnY8[w$C) 'c00=F7B<-ƾ!ۃ#9P5a 'dfiB]TwbAoI+|;![ș]xym-a[NPٝ`wUDw|tigX{ˣp D~Y#-͕>Pl6NAQ=dp,A^ ^ZNZE5렯i"WM>⬶1}<Rիho7LJER\a.>WiWN9vUx+śٝj92*qq>.ʟY kxa@UW(,Y?Clew2B0{慹?o4VKv4]B2 v;H`PA*$-Fj$xtTw$mi79#DE )=isXXP n#?t`ƪ/ Sd,T8-\Nuױ=7_jd4ZB]O󩵤⦼(YNQ'K*MRY+*o my:M%'D*Kcџc(> ԧUsRk.lXWZffo*Y斈g^(ZyIir^ @ЉrGc+n2&p^8~L8?x;Qef@Cz; =\7=NHA!yZS! v!kcI g`F5-VCO z<(Ҝ_١_IX?ҏBO{_ֽXꈮ Ņ3 jϝċ$"o&`v(.+||4nښL Ξwo)mk8yls56Op uCװ!YP9-`^!e^.lI)Au q=lsB m7J,!Buv&יE{~nfln6QZr(F25h6[{p[5}y$`[j&a1ax3ZMH?ArעOf6ϵ^ZXwIj~m*0fM7`@л1;5d^|1 DC222u3WJѲG<&zije9;~`(jpI(֩3t}zVFꦯaR@[U f"Tj3(fM.l5Ⱦq-MVy sjyeTo o.$7Zh  +ǸGӞGQ лO# uHYmRt@ņc'n]*H$x4^WOIYz8zORAza)EvrHW m h{Vhe 2}z,elcKG(EA .">,Q4#8-Dd}yEG(ժ{rۢwN'^].oNUJ K9N?Sd51u`7Ѿj%cW ~R"ɞ7%5.o>Ā/ܯ5N;TÔuSn*㰪_3KV!٤b(P6}Q'}9x^Wx@6VQD t9rM5]W|*ۍiĊ&fYΛ&tjQA_vi@uj]1jf" tqƕi"V7w= rY*2Ei>w?5D"TU.-EoHa #ivQ&'8=,s-.t?ԥJLlTӱ xzZԢT|Ekl 뱀ѓ/rb hV-K1u_mjf,GB2^7Z`gۢy7i2.Q&J[jV?6anR: ="=a~LRw#6 *$szҾYJo"ː{IBEc& 1 ÁgMPI\x嶙-.+ܧ'Ocuxe RU*4\ֈf\Hy85h5s"dzQukGkεh5>Qlldz=#RrES&akc%^I>ڐHəZ\ݾ]%y4;%y+$i«a`ߏ Ag"}󋿊v>"PJRFѵž3nvWurӶiq١А B~ u$/|Ij{oʯg2l蝧sDTm}Dp6O[Sn5NhLRzqqUҨ3|LsZ@'SeXsVs-c߹qunZz-tMWSܞ?*bU}_h8#=h0ϻ/`usCC#&*MpHO sV-6'4yISȑMA vy =B63V'V_(,JR3Ž*{[M zײLыXUS&SLIl|=? XýÌ󄇟 (/y$ϷetT OҨc\T,0йO=RT`X|oyjyN :e5&@$;]M#ćY W)ƌ6FHq8R*#d_z$HeP#S-W .4cj% -e܆>Y,}tfve.G}znW̭-V8r9w@S{>_.狁^$"ڜ)*[>ߊ˄v&(\UzcxOS)m&Hj·zA>Uͥꠚ#5+ 0d #ėV}>']p=U&1:c!MБK >$s#b>]5ȑ.!69z{Vţlpy"g[2fA.蹙.º:-xâ +BaV~(Z{6UG܊k[3X L Zkx\.0yLce*v**Hs@iZDX}FM ?%ByVd-CPأjĹBҮFD9`x&j_?LçJ?{!֮kn PE%4Ӓ4H.hL޺bG 691 8(}vUD{݁gDO/k'q _D3+5ȿ?du Ӡ 9b^aY/ 31ٺ,j@=ha3_&?_g󟯿PC 0~|9}9°Yri8;n{%Xe81nx᱔S]jF]g^9J "SvygnypnǏ:RP@úegeK̒6qF3cX~s7{4[4Ug\<{>ctg<Xoɡtc$G߈}Q| Zԥ&;["F/AZpvݷ g-+"E˼7ROx!{\stVU J8м 9k;f|xCM{=d?ߜeݫ_Qi׆(gBo l"ų;ִrR/C8i9Mz7w8=EF6ߐl!wxhL4TPE){skwIzFa^>,tx-2Bò NYZ3Xa͈0ٶA1HZEͼyDiXC ,)W]|I*CTm3#6TB > `|HvVhtR±4q-Ax}ҝ4x*#a%;VꪓݷLsuf1Z TXINGmj46 7T!o$,_v+ܺBEȚok$y&xt-߆i$ ~]."sBzҏj7}oq :褵2(4lo&lI3n\RHcCx]s ?_.ԢwF#]qՏl;\A0nVviV1 UK>#=j|l:QTooAo'3=%c(^mqN}P=]bw,KInVgg _ B6wXYuݯAпBZUe@hN H$~׿ghy3V>D<:r@09U2b) n@P6DcM&9fs4n8*@y W}ZqA|XI0"v30T+ eoI]s@OXfxv*z+Z`.+޹`"p͝iʛ)B7ΫS쎦X2}$7m &0BEs7SbxiZYp9iZc CtՙR&% =&I4WQ:H?WGDY1ALnTT} Lڤ'g;^ez-xhMphd6\q-܌aq!~)7RW1 s1D)YWf0GʪB pO`.~wD25NV˘&ℋOeBۻDJMj=*KPT ދahRiY^9N=M))6G"-ZPT:wn.Krp4\mQ)o? 54j s3cY3 AKkCqW,"),Q<@w3zؐUOI!}w#@ [@mdD+C[J{ӥ,nF׳XZYY~T>j+&54y͂#S3gAc$>kS &OܷUDi6%W؁1"w /z*wq#y]^H\"V4_^t }q9Lo BhUZPWKb K\l)R~¼ ]a}~a&N]9dj¤e "Ž1[sfW66klPi9l?,o~PJ++/kҷ{!aOӒ0 Q S" n 9kmIlz*q WMf[]m]:Sjxs@b, :%0&^RG2S1S {`|)Q^ ,\-> L&[ h˿'1Kw-}$Vj=6.5íAeaX'"D݀W3o;ϽWZ1N ֠6;e"'&3ͯ&ٟT¹DSzQ?} N-wEfcdOriLpCw=Da'lieOQ( [ ?g¬\DUwy컃CVk+P30$XbɷKڰ QO(d%mvW;G:kuFg m)` Yn"$MN5_Zs5t@bUKewTA#S뜭ǀ8\xШG}"+7m#< [pgW0e=s6drk\OG@:]"P4D+g ۽;\G2jL},e4mHL Z Č㹨\d+S5Ɇ3xQ 7HڝOzso,\oyiDh}ܓ7#o4?j!6"coHS ,8C0Ƹ!jRyo (JG/2(ATg)٭ e1Bܑ8CY̕5bKyy$\Fy/ϻY- p "TcȯoTIWZFS(;sok6iSaB5LPc.wWc(ZJKUI8Ny)BEދ=\DniIFF u-\-u"'e`љKJpƀ;B.Ή;_ A(2XYU]7h#!7//[ɤkhYny(?Lj|bRS"±ܓKZC Q|Tu8ɪ`6(}!auN49r@i .Q 񉩑HQ i,taȇ)$SbZ'R[ X&>ԬQdcn&bK,mwT}GI7;Ng_6,BPg*X3 s-BPe0thw^"26- JgeZN#ѿUhxDGv[e Iy cSE5b%`yM+.XP f-RŶ8`EfiiMlY̕ӄsУN%=CJ'ФC],8je~Ĕa CD:s4c GOUy`fVN/"DFw'c5h0H7ԯBr&0A%`uq7QLY鋖EXV3EYC9×~Qk^kpm-2]^]&?Q{u)6)r..Ġ*꛽ѣЛgfўM9ȱy}]1N9P*2,P(g/vwŵIߦ: sYo3[wۨ%/Xe_?r{BucM06{cwFu'd* =룮6c[Os }p(o—B,Fvɰ9u?;wfq 2ی}%cj`Vuk#]  F( ƌN63+퇄(s{~~s [G\Xۤ*PDpeB4r5I| F2=3nC#%8`>Bݸ=9ՓDXf]]媨& nS)9jMcۃ:T'esԭ*/79!|r]~qt]RL61GC)(jކj4ŬpHQAqԘo*1k޳uJMUI;F* q6W*![zU? RPC}UE؏6%Tl7хţk %eNf:k>ENXS-fq+T@!=䤻JRH>LTL5zPIF7yS5i,K_Ym ]IQqq:XsR\8e:0})rK⯠zEvt, Haς},7"#J " DAe&ou帛$8\C.kZ1 * LX4O pED77Yiʰ yBR$59*l̎) =rw4-we5w:S4#zwJO8U?0 a~I=w3U4?cMDّ2(>1iekRhtQ#R\@ȅ0gJr". TNC*&؛DTsJղN(5z>1i u)9פz=@Hݼ{I 4anD_`Z@0nkc}Y+oneP̢zE $XFioͺ@sS5ա)n 7YQTVLdx V{TXhCIh^ZְԇzL"A!N1dl "y:voe$Ckd[9ƘoEJcsƹe!P, G'T~( Pa/dY*4A`v1)6h:y=';xqyJ/Q4.X.^CֿOH }|Ic_#Sa@nX(sogZuTe3s[ic6Du'!n6f"Ŏ]Mjomi"E82wI #/Nl]Pwbŀ`&16[Whodn $0:mIs;˃A˒H i)2x~ 2'-tq ֿ4- 7͉*z"t܇\bc `OpL{hKK=BX< XyF2* ah&~\2rjRN$Y}2E\K~C}N8Eu1y#IXxw&Gf˖Wf)j1RU):hojǔk<%pĻߋ0WXz-`moS%F%zWH4!c!6~ w@Z Վ{Lj5u+Z  ͪ\Y8I׻AYgۧ!_T7ݾnu(HԖeQO6Uh.("R4$XT@ >}:㉷5Βٯt^6 QEx#-y[E2ҥ$k:.aWmL|/>2Hh&맧OQ6!z=Փ|VRƊ073T҉/M>R}0I@"!GR$#68ǻH:XJY8 ^~LXXZ?6/Q͑iI-m 0^?x>s;(WuݡyC'KBW,{.AX{ vQt (U2A 8"#|tU>\1l6SLXI@KJc'VQUs`HH˺`OEVG [rJ۸5&4 M߮PzӁS}j Qi+?&^Y&7Y*p\o;G Kb PyObf$a 5\ @8! {yS$mOG` g:MRfO\!u%72ID[E]yM6XU> ˯*4?}F\@J k5@6*Pp I#f /M\6s'bHV0^vԔ-uc$v&G g;./V2*SIdZ=,m(aH+"w^{ 9&hJ bcж2Oh,TwOMB['U <Ǝc^6KVg\^r{N:Z(iq]E)ziBvGAoHZaU!Q1 B.s7Sm9$2vL{)=WmۘUH(^| |P |hJ|%4V~j{]J[uk!|DhMc!)[-ӾqKhr̓ cLw$%tiQfImr 0X{0Hs=sJYL7",q|mnWݩ~=f l ˃~#Gdκ0Ԧ6=p֎@G_rƓY+/{qx3䏌ʫD%茇L$ktwEOJzޙ9B0 5?Aok+iHpIJ$!qnra#EH2+JI5`(_eSvjfMa@]T|z (AMgP@?ɿ2UA>\DŽt>ni*ZX7xaW1=Ss{S\i֏FUW7O LR@]7eǟ2}26@Uv0? :ӥtʊN!BX zf]\;~SFd@Jp3;mQayi՟=tSC% Ow5>dzX|^Pv\Ǵq$(pԇtvDœs5M90C2/QiA'h`B ϟXbaPjqǴE)FIaT9Ht t|ߡ(ZKaHݓ6D% J(VjLŰE\!=8.Q_|ĐkvF$ %0LLJ{`gj?hڟh)7#YO[ &遗LϱuD.6>Ćh*}P}ab>0[̹of.-vs j4$IHFa'*U ρ}M50}j/T"$8'C5οɲ塯<~u*4h7 0ՁD;tspV-o}e=1TkJCs9b.7/N1[;<٨V$^蝑d4}طpPZ /M, n" ]eb>5B).u?`U{om٪ HUxemx_?FlAJ.5N}X3 .>ar[^}}Sm!^7g?:(Pwb2d% = lcJaF*"D˸N;5y{֭8G\Π=-FrglK CY eJK]Y)t{ vZ ERc_CfK@WIRXՈ(U|<)LjSmE:z*LZrXŢa!Ilf@q90%P=u>>+w|$6&Iϟ.Z)]c򔣞OxRX=#xt4DvrB;roO`Ř14~=hH.edg ۽ڐ5^ѢwJx1z :~24\ҫqLb&&z6~]Lx[+Zz1k:liߛ +=1}Eb: #5{R zTl׮3X`tǐh{*cW!»}|oTnJ6"ڟ_8AIT=ױ鑅RĐw݉ F,:&6B,EQNqVBV#"lwWFH]GFK-]<.A, 8Klu #W&#b*,R_`y6~(m_(QJ _~;$;8Ecx%ҶXȲIB=5:fW*{jmWUY=Gz(3˨HD$+mJWE`w&FKe[LN[pe בzHxN!d`x0R ۼJ< Q?TRfLF7^(RllN{2daIKzN+ʙR4gth}7,::=q|l⫣m$iWyCq\ ̵z-5Ϙp6#ܬ:uhpGpbǥܮ*'rbJspMfW-G?J]ђj4{=bsa$)A1sԏт@zWŠr"N+6r#@Y=%6dqjO <]ȩ]5^Y}'p7᰺&$.^&CD?+/h_J:fO3w+vEiH)&˞AjJ- ^v}j/IV\Wj|24Ŭ?!Pn:"'wɅ.mMĺDnȶUA8{7ND9(6fb&RSO[s{Vl\a!0`Uvzfvuޯ6O sd NCCj *0sZCCDIVD_ᵏ;yct2lV$޹;vmb ysJl|OQݣev */I2}|WZ~;=|bhL<==O3UKzB]ɉ:%Z Oo^3SlQr42p52e7e d< [^ 4Ͻ3%JIܢm:mAGU(;(U9`{m>tѽQFpqnX&ts=dYKʔa~LEhd*̽x c,}?8 @XJhO=amE1"} cv2@Nq$f3 9n?OQg <][A{ DrLr&ttA[+\_ǾW0A_;hdnota#Z{VC}W!Mfef6gPc&ۓHGo^eS|èת,}W}{ҡm`7QtSrZ /5*D^6$!~ƒ +TEt?Q#W@J2ӢS˞2 4Oc<i{f<$|ag׮hat:NڎK4KJ /xʒ[댚ЮVҀu$',f $1/Z2 Zta;ޑq goAS^ӲhwWp=vZu҃L˝RlC`gS]aQ5߽qՃ@t2/!Xt^DqXhbz]5V#L7#)M; V".5Tu3D `!T!M(_A)0#eW^M!$$ zGQ"{.[Hsh<5Y6U<ӗUl42\8յEi ,Bp\6=>%l凞Dli04{X_&N`Tߣ{;F=~|]+k& *U" NWA|hD>~w d0c2!ed<с;g ^$-Kyh\5=8G݀ƈ6}!RWtd$lkrw7&[w9"Kp(eij|26o!E{UF$G_UІTIjR{FYAi%<`0ݕl\kj~ %_dy\TxzMV)&[4_dE7 H{MpͽI4\ڥ$kBRvz?[? i25g`a&0^; @:3˔J=NmY Xガl=av%@vK$&M F"hZROrJۂ0,ddxCMt#(eJ8<vv5mۘ/+j؎4ȬaI:;AhW-$Y"K0 @"_6\&҄ENRy+j~I_BK1fEƢ*96VGmj9#h3_خLWM o}yR8hS׸7e$eamHEyM(sAK2 !ޛ fQD$ei:,̯?b,#D7ƿ-ڬ2}٧{?=JbV"Yp>pyy<ηl>X)M9b^{K\'k(,qwkphg%!S,F/ݦ`:O [sKb;]f\N* Y m0}pۄPxQ)x{.iegSJ2}k[*OdBbrw&__ܙ~NXEvJĈ4P}`m=zz8ȁՀk+^Ŷ&Q"WZd"jʼnj/g sdDJs/A8Qc'm-|h#:򡊱&nL0)}7^ ޸ /%Ț8|Qqk\O/261f| \G@ #RbUb._-ݻAgq&hŎ4YUQWSWmP%Ϲ"z3jMZHa{5و~IZ7 'bʴ P7 ĠU-pB,Mfriy;UFe0Q_tKKNͩu㜗|_a֝x:8Gzaښ_Ry,;.<gQ0y8.7ei_l!!F`ٿٰWQeCOhpv?kGGRdo6 Zۛ=@ Iq ͜\%ٗ)}5+VcM]h$@?sIzlXx-s14CtS٣SaX^%p5tO":E,ͤF84-٨$-,F*GwACiN&_g|+UL 22u:h*s҄Q<*dݧ:k3aTOϝs{(q@h!_H4!5F@ U,G~le~-<_Um)!Q4"'K=+fv\Fi4N$9@zuRŌ?=6lA# _Jfm9]9lZڵ:DD` W[/C ]RӈSy"bݜQHOL$.Ga~|ZԞv&:] ^d)ۚCjX#arUs2 +.KWKOvƀmӗ  /=|DoG =TBb5mbkmzPҵGg%ck,Y_c͉Di $ *Ve>> oMLT:-? Wh[C$]Ɂ{* 5֐ F$6Clѵ^YktQ/H1Wz{Tֆ&1b5/K,IZ=)Oti[JelK%Yo]ջ:c!_VQBi0dED|glfx.Zъͽ"w\{{Ta5$dOwkBH ?ITA.oJOJ Fb50>^UVT dk ,Q5j(hJt…v8yq(UGQm_/U/7"g˷$LF_ W;fB)tTub>}—˔fʁ}h`\{$'{Jcy::0pt@w5i;wӟDT5 $.8M0J+]8OIhU@E?_*젰".΋M11U0qIHJo@d有e=&YةNvW+ڲCV%*|N@!C|At>#iu:Hk;ܳk^X3FGA/ 4)efnS@=}N϶0<(2*Vuh7b+TANpe3M|alJCz-tJr?4GK! aN{(yRdSOz$!'i/+=wLTIjY[hY][ A"50 ੥,TRFqeO;OdY&&`V ˌJPBjx*{Nkף%%W0f &O(A`[Uk9u YC=ٕMNk vSՕ(hW8h dD1Zjaә^>mmpHM?AUR[-Xo{\P*sZn̊WR^V+;/BŢΒ]uBq%Iyb"9Ϫdf*վY[ ;HD+ʲ;QDLkߜxv?/s24[*W- 0;l Y 1 |k]g<R(>7u |P^T}apv3<7w w[SݢR{Ҧ8M7 bƅЌc-+DJ8~\4FXng\ckƗ%̙fr:$"zf%ZeWG{KոBF팿?_r+RWcTD&7dF8IN i;î 9A-ّw=9R<`|'UC!%M&5tRz?uῄ\J;Cpt)p,/-%mRS/L%d?]ˎ&NsWlPM`{;-IR֙h[u}HDjwxɺhöҏg24qTg])HrHcGRYXr\W2#VsHD854w1xlavpA^]a,dJFmί#)Xףelgۣ\G:Vſ1fݿ_9u ѯwЁ 58Ed-/ . @z' /&EVš@z@r"W'">pzl)k'n uO.CQ 1hb8"Nʒ%+ Ϝ.~eSmUd^g.ƸOY,Ґ|K/V衚7K.STQ w VIw>鮄Õ]mC59VHЈ&ĴK)#o)74`ݬ`cq&p״b,|)_YIodw_Zj+PV0Yh0DMٗEyp>="=ICX?sxGi:rAȾXh.fw͐lޓ"HLS4j9SCw;eVB0jӫ~f1==Ѹ5|Gםnh S[nD=;=|Ps3S3rL L55" ƽ)k)ٚwIL^^>ꉈ\[/ѡ ␑|6rEtbX":TTPӊ؎ƯD[|c}8UpU}"=wxctm2ֵh:`ːv;?mhT\@5\b sNdc`啂;AQ8R.+%*Rx6%Pv}MR83p[faD &ޙ2m2ZRQgK*&`Z }rjJ|kwBs)QG=Ǭfٽ V>:rCIKc;, %/ J_ʻ~-ybpElu BJyyp Ww qꑁhd*&e.9s>ҼJ:gmAq#|"y81L<;^Xr|FeWc#(rTuI҅l8C/xY0WzI3/:wpqBpJMggt>LMV)&ۤ3p8^{$>+lH`?B.BJbj5yTpK]oP> d*Gvbxk6]-/.ƶѝւ= Kv1__h+sL22d_FؕS.oOŹաy5u =ri^3:ԄHg/b,5Pj-YZCAg媙Jx+AXǫQt.#g~6޸wiO  ;\rk&e3/o4n_(zQ{W%ea#L&BwvZmvHl o0t֗?}fPv b1Ơs']0;a;7ˏ#plAQfFtZkh)$|\xdO$K/:b'L]7s-h[B'g.Н[|S5sǍЅg_ %UZ/en(ELp<*9\oY0MPt;PW<Ӵ};9/XdH=lΑA8@wV>=|YMۄh;}Q 2A_բ Œ\[ 8[%(VJ~L gvw AGɍ]_rIQq$`M߯lڻ!M.塤pDKYT_/+z2 ~S~!xNOȼ7rŮMh{i؅h%™ ;Pݏ~Bb~dE_6LtW)3GFLrzhyw,#92 JB CI=\CОUl#/n`vx>,F#ZNGdug+?Ph_0t ' Fq'::1XШ ҃dQ"*Lw^Ӟ_#+m(Y:Z#[ !b L7k`[UVLP߼x;>- U8 `%[1u3Y:mjdL$D~aʸ[IԴ,(n{{J %G1bo}jo[֮̿0m9hbnRS1ƳBg~JԖe1)E-yE"Q|zN*o&':Hn^;Zp-|ƙ\]{qxW[j)`1Pjp۵!lTC{hPy^ECw' E)My i,ʼn4qK0j`Lf )ke_אZM1閾 D0cjN.`0P.m^Y'9D7jj`Ѭ쪔-{ ˤV)*˧j2)䵰ygM A~|m{0RdPkƏP͎?03=Q./U&%,@<[}'O){ ȹƈXgQX0w1"̕vukB C'QVX][98 ]To.|4,z2RȤb*Zmxupa`#A>1?L?椐<PY;0YFٕ7a6CS(o3~nVbc*j?xƅ@H 5f#A!)kŦ`[PO4u!cy|8PX%M=yN|6wmYnKn[!Q}J75JPA"M{  KptŘk8,uCV@ިYfP'yBIW*FQ5XF Y%cf$WdzTZE^-5[}UYM1QG gNS<2  r3x o ivS2tg'D?yGbD32jބ#uf.ٗa6a`JYVq;;&@5ݷ[AїQz.**q"0Lιsr,eIo|%_uZ Pz*WD7{`]u@:mdYa~/PMBbpb mjڗL)8dn)GZ 2W=mXPě cg k~5B̋M艄J"3o_io!{E`MȚHf h~s]]@@f6 XQOn!xk%Mvt>%g!0+%ܜ4tlvqW J}Z*Ίژ|0]lu~; ;BɁ`8$74g4l&x(!!b@qzȕc ۊ4}/c=܌T͖&pbX-ruwTT"Sbrf@u6hh(1k)Bz%HDuVbiS[~SBG|e9 0%e@ rOSJ$}פ4Sѽq}ngq,Uv^ ϐ`]Sm5PBh=Vo>x3bܬ泺 $eJg2ˠyrq \À&$-w ȁ.𨦘g ycS )<{$CgoF+vk͕~] 3yg+gP;㍑mϙ#enʸ D.I|/=LNo~W_/ plfOZHe(p^!Js# xrѢ_L=N>wudg^gϸA\eټ1Sc'b<Pwh^>*ڃyr1E[yc/ja@1 V3RYl5Rc/.dz 9^2| Qum*9`p/W7j%G! KhLZ其ҍGk jmJ5R@}D'~ԴO:wdŒͩx (͸=ct)?UP:lPg&nة:φj#8|Tي9߉f7\@gOōtH&^~!t C B 8xusl7/&fmd%Zo%] Qm'C+=~i8yۙk0A1:+"6QI)B0ZΌ|CJ"W&q#gRX9%})| 4SޞWgHKw9*%-5mZBcu: -,- [KT7r2ʿ6VO =J4ޅ\iAF+*YS)Aw8~EvrndTqYsxBF$UAt4 VˆESsHX{IsP՗WV Nd4E ]4xDy#B0EnǩRGi.QCw]ȷE/ {ҋ`H}S|,z8P̙@gV~>+ot1'<ف9{Xyc+Q/Eʰ&,p ,t!,CzZ~w$NhhyL~~h`@WQ~9Ґ\>loyP5<Sϳta؉ A{vExvM;(}ci 3Y'nҞc=-F`.8;nĞd9$JBr^VE.Q'"Ogk:_G-,(Х!"wYװ/շGlSEq#PAmi6HO0+߬:gNv#JaWCM"tx2]y*n6͒õqH m>H z9?r jTR6[tDzNʹXH3 ~aѭ$-cm(8'sPߑcw;0K %>4'rhF VY്$xabv_U#aMs"O\Vgur ^4 ɘ !['[0iVzwn#Rמr`COJOrV,Z`D\t$z%ˏ^RلD.Dvt7#kq”LT1DF, ;nb$+_Ǟ.pkz*RznqBE{U4D8KR"Uu}t(!S |y?ǵm91[RBMJ׍V׈>n$L:+}ʢ@Uv6n}ݛǜUQ`4 '(gf'A;rlV?+'B0(/''?re<I~Xbt[~T3yt}IŴR¹pmaO]U]/r jz=U\ а W>ȝLPlMהdɖ ct,ٻf>@ B2~/u@]2l{aqeT_l^j?Fv:)禍"O>8jK&lpw}bw#BY/GҼVGC& 6 #1\ D,t>*6g¡#)C7WEu01Yrj+XD4L食ˠg/!BnE18!}s27 u "L%QLhў ;A,7Ӓ/Y\ o ArvplS~qM gpJ&`H t|C}?jKeeT-@&H@|T>Zn-F-x%S^ǧeK*v-| \eG&fY>Lй%*x6hٳtt>tpZ[`!gnz+Ev*O ӏ,3h窩#;qOp[ B8xR,zT[QK`cr+ħXY,|/#oV㼱cSK6a!5 W׸0'FPpe b.{,*\u% (6t7Gn9q7uӗ 56nк\~%57 Q~[bVENb ~dC؄wZ8KǙG>`!n&:˩Bf}Y0-l'0y}EkK2V1*4cなGAO2-t ; z*]:{64|?w"z0ߋs@СoTGt,tijjɦ`* _V9>I;QY uvK6k_D+`@fOĂ-Ng%CFR%6ejT 9עv-@בQ-|QA͎JBaϥ$=;B8L0D)&t"HF5V d=G7'J׾~rGǹЅJ.Oo,$jNsTI嗚gG>q?K¹,Ҹ )c1 Gp/QJIhO H žsE麟%DZ3j _L^[ GN-T*A2=F|:]ZOftY+0Lzu`WD>'GzU>7#IDb=RH8/MRJEQSxo}#5nٴ";?5[| O)^CR7ayqhs4ߪQi/}e_ɑ"k:2AB> kSe etbM k@M%mZbB5$1wȠmDf+!FۄW8GyG@'{j>h}n! LL{mbM}•(@ CO^#\WJ71jKé$oUo"Qd'z-J3G:/-oc^ywv0ReE{w24aIЈÓR:5z1 AokpdF iܻ9!Tb7M͉6$PۼyBUjGWR(n7yi?5TL'v.SK-\=ZDKހ49%I7y)_38=boZ=ch_!ݗ\Ru> U 9b4Cv*'IhژDqT'#޸!`2V7C>"*97$QȦO00OyN KqU@O{\pq+ݤ'E|˯%juu/Vc,Vw:V8I626B8r6c Uègeejdmo;[VٹZß-{= >,[]T YC'ei^f>~]l(} bMKټCޥUy:N5(r=_`OZ [aUܛ# }TN}يc.ڈBx9)F'pD%W p%>hi苞BؼdI*ҵӨ֗[ ]o,JZ Z$(9;CԺQqQQFjڴM|u]]JDe/ycy9|M0Cr "ϑAES&㘳b_9`Ez˙DEw U|j`Lql@fcz9yU @]x鹎5kyÆ/e`i;G6MI#ɢ^ HnG7/QW**JgDX\}ȶ]w qX9 JxpvHF/P,Ɔĥ aȧeo[ճW"Խk ;1nLr^59vp{wSA/MѵJddG߄ }X0\zX[76 Uߊ,`Յ€y&j\ųf.df/7݄M+@Ě)R/zM/pVQԺmhKF!&`v/X |dC;g]@쇋֬FM̝>(bp];zhVhԵ[-f ޼(0b3[mַ/{tVz4%?@lXK"xgDn},Gy. HB6 쏅Nz MboAC-1[PU)4}Tmɿ&D0L x q>}̷#3CP,4BX2*mO zxJNٝXE+~flHEraN4S kY2wPapq.ԾiTz\zD1(^-.26]iL^f0Q䅳b㾷GGR0qt!MD\@b`~el|^5Mׁ&X\2RdjR]F.EW}[Hπ<-%_,b".ko.wiO 9Ei0>`0PNG"8BrLmq>[79&#;VLJ6@yjHQsF}2 N]Jy;dfEV_'LyoҞ)ý~<5ސsTX>Ga ͻ!ud5p+Pv\t3t&E[Vb xk^d "(ڧs#64؁'FLSRZ[u{'"6ƬJ0j<,KyN9_UF1VT"@:ͽCu{_|XF!/A:ۃ{pJNh2OՍܚ[~m)9c8JD.ԨjꁼO3ՖFuP~{(N!yEHXwC=P{b^)dh%Ygd{]?-䵎MߠLt$7+O(3N ] ڢZOΛul]I&xu^"DFB#a8x<-ȐH^-TM^a3$+*z zY>) -֋8YӼ&9;~lw/1=M{ݫ5hmXHI@a%>M-UH PHm  q[yXL_Gm EqL9 /bS.%QxAyCs;PcOI@^H O'')Ex@;9ʜ WܾuИm9d dtX:l]|͂zBr.bI(OU gew]Cig{ l`+X{Rkcw7!w60 R ƋpQՉznZxQ2?Z愂<n `hcHWuXKk X]*hÉ0}}U2wZ@޻`<3Q"'3m\USP Ko+٦yU]v 8G1)FUt==pKDocPc^E4ףJz fn%"cZ%~kwl*4q@|ؽ*igi ~?aŅ5{~t0lzI4& J$ o[N&)_MRXˆ6IeZ71F)&Pj8e 5dWMcIpM#!Z[Ɯ@ Q^qؚ ~n|~ b3BmW4{szݾsWAyn4Qzm}ޚ !`PZ^O:Ց]No)ZT`E)eY"(d)>XO&ץI470Dd~i 4%a|~aܖHGXYy?}I(+pg֯椈}5qhbΓ {擮la xedȢL b7DK}8@S23s=<dfՍUoHbiQ6'@2ׇldd/5LYWV@\bSڐ=dzAe3᭶*\T "Z!_}µ ۜ3:{aq ͵UTހX,P{@gtD.FdYqb"mR(= nΓ-Ny"aoCAWY3ya Jߕ:2$ ͆pm@JVݰ}"Dd:><{(a`nfb8sY`H9TdS} dr\muu*$PY PwLVzNlX_Wv}6)`YvInfk˒MCR:T*GhAS,{elj ԝpm^͍R^Gx1xb-ڗ iҥ Ožn]: KiQOg kDhpQ$'9E('ּgs'ӈ8 q>#]8!)8|_46mE`)m[Ӊg(RsިLz9Wa=={ϹNhݙ|Ǜ s' Y.:֛DZ1,(H\ &vR贕ӦLs#zqx4.@WM' Fߝ?'9d}nBH0&qWc0,]J&f/l() dcA3MLf Eϩ鱂2nwheFZvq(yPJ̒(efO::3Me|i׌pl75hr+@&E \8 =OSwf&bd47r1o~zsK5s{p`E}Xʊ/sj9(ԫt_ 6a%K(-&S~m5ŇJQ '\ȩ_Ժ IbiK2&`rjzbfP(=(A͋II)OÕ'xƸt-i9p)EkI[!!<,@Q`$dmWMuVgDoa[d&L84mm>dE7ײW>njiD31MCYNeD?gU/<}"9p6⿈3utDdȭ1܇.|V-<!ĞpRdE-vnj䷢Gl鳹Ht(71 Q.2͔eǔ FnX٫K&두#j?L(Qx%5`Z;P5D WOz1*}ХsDkV8u].@12l,{g c/?ֱN!ҫӕ׈ aK; Q*ܥpp-nҐ"ɺGeS.fKޥa68>&Qkvjt\Rzx"+*}6tb1US6 k[g#aveCcԗyAO*@ pQ眝5ad}<gEzۚ"eݧkM+qBHլRMJE32.}V_Mbw |yDkH Zݼr!D A9\]+_s_SIz{&lRP}@{ӱM7x z+;֝\?Crj8kX˛;6ߴ{!+j*"5El{x [4wlJ2ɕA -',]_zbz"1l3pe[kN/ȻK0L'4UhA=\`}HExw/yqn\CPZW% "DũBNӱ Y|$ȮH_Q/䣁oa0G.I؝`l5?;TI&E:bs ­f-C5<OFųS)IچlR~alD'|%cGVxyec] 0wk48g^ bۄ'YhAR`?pT% #XG'$l/{_f-ۜhwb, _|Ђ<< ĿXc uiU`~F>"H L`ERMYe:Zh~qU󫱃VzXC'Fv@#z#1NƦ dPpծM:q_ yϣfWlBKB.nK,.ziP|m]~R 1mr J㶝O7yg)+ڤ%NYO7J63P W϶jPu&R.o d iSqAyGɘ!2 Xv,痺*'.tҡVPPe)24 >Ы^F'Z_Kp BXvvGæ6>n; )hT/>ֻN =ܛ1I|LlH"mat=~B9ijܮrlj6YGNؘ"@_dR=NImu}%{iC*6~utE*3CHs?xf=E+p'alO"+ݖRP2wzUAy5$":mȷAšFzRzWcfVQg9JB鬊u=< mşv0tY)|+_B)2yuxR K_Cq)+Q]+  QƀHŸc4iDKaxh}VɅc{FVACљy܍j(~)o-Ov< ᓛK^S sCᤀqA ?+OCw!;*\/^Ia(N6;X/˅4@Ju3P';`]ҳ}J.kYmeӑJODxAy d75N{M l{$:Ze[_zT`~RbXn6+!;L:;fPvH'Zu2+ܡB م*kρ|`/oҢ+xA 8'_LH~~'@wXZ?N7mc̓ͩIQ:Hһb6cEɗ_hS 7S K`YC t#1_ 1psʟdHcq>{m<~R|o$p>쪐 ha͌M4`vYuJzwrl8qt@KGP5 uwioہw\[تK'01,nssiF&WD*l2Е@WCQњTm;/K,>a)mHW{(z3agԛ*]`!i*Սb[;_ `;ZJs%m~b,ڶ.# "Ҭ"䉊Z}ym?>1+os0z#i|HMuBkoxX+"l`QF`,Vۣ!7]{K=|֓\U(z@}a4`A<n~,ȑ_1 AGt WӸMeXA뾗;r۹{_Ys5)r[^SO"$ޣ4$K>DŽ4UK3)Iau]ReCLg rg3`:t`*ozQh!~'f',Wzh1>r((,^F} e9~dC2CՈ`'f}:Ol_Xޣ2˩d!.&|qѴ;痀%?pڕG%a{'^J䂺4O٫!nUlbB$3`S-.jm{*%GrS%0}X^}4 Ճ)ֹ9[PHȃLj r[#A#,n|gm''7.jV )5i7 ̀8W:hOUcɍ0@ a Š=i*PHúhI DGyGGoycZv XU<ِʝ#\ lTJ2*3/][3:J'9>4X$Q ?{5:QkD26>@lqjQÛkn1 3A0Hk z%z+/Y91޶ $^&O޾2Y<E^Lזc l5b}t7tvS .biԈM]uɉķy5Ipd9y7_O P|DY(T2 d 1?T2 }H4mgiߺf  6DpiI qCL}ubF˃E`{UճZfy T@[hE-p3yF?sqq.Pa ~jOe ^.asiv z?s3r5U:S+S8+K h*P`} {R]0wQAŃ*LB30XDmUXvНY (]>ˊ0;णZg6?X%8*G G@lQHHY9Dzr#EyQ_gSsI44DϨjoG~3vLG__PH#۱~me Ñxz77VW/ zEv.ǸcX1`_ZIN-O(Y?%X^vp|US|%d3._O&@ W}遝6n%iHKqhsﻬe`ѩΏH,HTѢ' ff[醲pTݛ%Y0'T)Y '`sύ젍^vlVvUY uJʂaÏƵ LKB{N5Si=^( Ah'R" Q1W%s]#Fo/0㌬ T^VlZ= Ԛ䕵 CSw=#gyH",=D'=d.X!7Q;=.u9qk]5޹3 u!?ǓXVȐL775u~~?Ȭ{:9O)[,"NZ5qF}d.jMT^ɦx sy%A:x]? t%Nݨnѥ.P>㇐EнhHa/M&7gk_A#PQ _aʆf6+>"Vĺ< 90fVUe gǯ1ۗ^||JG,v:$-.x`J(3&o l|aZzG@6ꇺVM&6IJ3ԣ1 <{8usz׷[ҍ?oልP"m)h T>6z{l_+e׹$,LBv@Γ*qNAe7.1RqCȌp0O6~t,-]p$M_ftnpZƌС!,ӐjAyXD]:1A;y5oe*"Y6^ 84*ߍ>6B$ g<.ٙF=XŊQX}Cn F+Ɔ;Nu~I0Y[2wxѵH ]zHvzFjNW`}8 #P-ˊ&JfJ 3V%:FGH#MGk;u>6͎z=5s(RUÂxW"N!aSY3ƑTje( fr"|9;C}߅ uSA]T\fhnAUˏ[&. 5,O6.B@<`zW͗do{N3ܽNٵjiLSY ,.^?d~g>9p.,̑0y%m29?9#\awJ,C&̬6yCYP`6YxKP6O[~fG^.v{v2Qka4tvqw"A6a ۩ AxQāCsqt/r<+F9m eTqLz)l3dHw^L=E6t},ў=dV%0Gqz.(#g`#_@ tɕw;2!^U&y$0jq&O]T~{E-h29$O] qf y0̻_7.([^}:4kZ ӊWdd |5Q \U`ve PM UôLȕ(py0vo{Cmz0">z;,m$ܕKA& )TIq&jz_#f2]^LGi>5J0 5./yy`ȄssBXjXaKm:#>fX&~IyڵiDĉOm+浳CK-2鼰Tm| <.;٢-|ada6(=pEdQ6GVfQ~V(OJX>b^ME+6B.oÂ6)^a΢`_b`_|4s' ΄D!JhX%d'tFKpA >N@ᎊ 4 X"+>CYSEDG#9j[#9O/տщc.R6ɘOpmTQnx@9I@l#g]4dJ,7$3S_ nd' D=^.dF]Fd0T:' .4VEM6YFL;E2pP,5 T4O*چqKǧq i^:Nuqg}KQB2 =%3 GU7NOɖ 1 |OY٩lIY!ii"JV.Ҫe=9bϠw$Okb؞9Oҧ#:F2|==rh곻BYOf[="iR=V`t'#A d4n&Ll} R!=>̿i4a8p.P' czP͓ N(.wpD>UEWZ;HF17}21@ƢiS se=?+o0(&@z5 7ɧf [g39Jo+cg7n;3 #yUFR{{1ȃL;aİUg@(GD-0@&iW3bQ Vˏ6PZ̀N>jrq10jaTL+? \'Q:;3:]Klض)MKD~uHV'T3r94բaܚ3%ցk3}ė Ko.O3++Sul:| $G =D*ާўA[i|wڧHc3 ,,] e&0F+D0$8R/,OxH4g~敞*mYtf$ a\yŦʾWiNE3ziuї"ǛԽAGFw,C窮Lg&~|)i^H@*{WuUCr~G^ ;ʹO*0JK dfruլ,]1 c0<時Os.8U:,9mqs36P.)A8Ѥ0YTLtɝcABk Buku3 AnN<MT, Gt[Ϟr*Gpx0D2Q4h E+C#sP7Cq=T| ϮM,%UV;5l3fͪ⌀bB-iMj*b9nHݸ+Hm.fCx`zWVJOvB M^_mb0 ;M{z0pt9);dVVZJqnO u>F"P:Eۥ՛'iOXT+kŽsOFl/@k֒3iJ>W3%L߶;fՋxHZM=h$៯ǘxZ]60,$~B_N$]V',$K%SlC#Q8kFlzɉ J+<˛xŖ|)?3!]cxt!0}.P%(Sp7Ll] Pʡ#YC k .1I35VFdM\_pbomʍ:mTRf%<,yH^fp_h"> 6HL]`e<B~9 e YkySc7#uڱ?bQ{=D)=QX$;,9)A_ Zts;\DG}ALbMH~>C36yM}D%ѝ'<%0:#NE-<sUa;'.,.-i|6 9*>.o1"W//ݠq0WEUleH(l9Շ+]3ɻw0'$݂[Q_0BV)'đmmH'aJ"H=yśm|ֹ&8UL͇a!X+eȁ[Uqŗp&H/9qcS 2%Ak5 .ud*]~wC5Aay`u=N7<OI{_fnEweِW)POzklOn[K0\ҕ c &}軻"hܔ%Zɂr>P^ L,7M"I[Z\ic $*1C+5[ <*CV#7c"me[İ{,Q$YWO%ӇpSE5n [sҎbx`ۉʣx$Fc zC it/-X}`wFǑN`4Nto*2 _|Z=YJ!rBf=t>uX77CM 43Ʋ.~UJUVOK%|tHI g2CH _@RN5jVNu./O_HB|X<-Re&r;zJWпm+v z^}^ż$RU^m偙%ԺgMg,mV(clϵ DF*F"MwȚܾ'q)Q\UU4#oaֵE;6\t&ALAɓu"06ncaь>ݏv-{|^^cq"0g[[^|/$vr~XEk Bu:_K P#4 uMN;uv\t'lȖur3_@tV̉՗7>kMʣízY\+QBR6.QDL4,uiѐ7$wSQ}t͌Ѯj.\-juϺZq%~4â#y%Vo&ȴ9O> Z԰=ۍ:ukZ$zz˟"sV# hds\U*d*fFwzQhj6t{q]\zuTM>4g-*dK9'Njy^#DW|0W2 @{|$$6zNd"9uyU ~1=Lu-bVoKkyBƧUnX\a>B l7? ^ׂ⡂FiO#x.4uu;ȟa|3 C;yݭdQmx!F2QW$~N;nsR%){Y\?޻a*$(,wX&[%]DV8%Nt6Aw]=F̦ v|v 44B7&*k} jQ5N\<"jIa7$#V' ͷ^-2mĒ{17\x,y dOb m *E@6ލ?EKcU6r_;8 ni?dpOZk.K޹?uAjm!@똻p7eqNbd#&2\Pj{pb={ߥqnA1gsh:c~pZ6[n2L`OgX|OwBbqCܩ8b "OOQ%ZmM+>X kW7h~щrvCn9SQ_/6Z.=ްdK[$Kz;,(3V%W5׉+]0p<)Ji K :? 5yܧzL HZ|>\5|ve46'b)8#/.n{"m?IPe^k_/CN W& ۙ;DW -u'搁!a''UV5BY WHd?rc`հLDS7Ѩǖ_rCPGϲ;#怊_lz뿊Qfo-kh 'E1 {F uA+nV7ۘԂD>7Ww/3fGc^ZF|L}+som^Xe$֓Ϧq{|_MtbW_@h`&:ćkנ$-KLMdO{zU c RUi2Haؾ<\_#nF*x%!TLH-Qa1CY)S =DB IL =)q L[7 ¬G~5asQey3' =}Ma)06$>vfz (5,]q|"ܸ2/|\22y < ep}އj5'3m¢`/2?iƴC ٸzdq)\\7Z0`+Ex|2}[*Mc"vpK,ђlla0b2ߜ7 -Uk+vXa/&djA7 &d{01OA_߁E a"H>@eiPPh@e!HCw ı3 =RVdNuCQc >g!*<@*-/Z}! rH V=HmOy0Oo'Gjg)} "M}[#Hލ=ʆ0:K {~Io~qCz>P& 4 P-"т#;A.jd D}jy*\ }agu*M.qK;Ya2H?`=q`Sԑ2D-)c4EL$y,xmXl Y0 S7))_hOqRqm{US?&\yO'<ZAeuV}7 la3{W3 $mwus+fcd>JA262dFF ~(;1h͇Ќ'V' xVU֦m2}մ=_=JY^ڥtwo g㻷}#]_]؍;X* h#::Pu+#R"gm=w꣥}VX=J o{RJRݱ5dR }_ٺ̛jmki߷ EwGb39u`'T<VKb ;>5\!$H.tIVYǁ#{Wz׷q1zI(?0E+. r(|1UuQ)T 1W54Ag~h55~{j¨d0POIdqvpU:Ta I$ʮ EOoh[݉Kh;`:2< iyŴ&a6g"vZ**!~_1;U\\ldvap6zl[Q̛ |oâ(*=[, <4>3,m%{tZ+>gn?,5[8a HH~+*ƚVac}ʴTcY ):kzLVkp 94)Ufc&D+MCLIǵ{j#Tn7WG%4A AgΔpzM*y wAUmKr̶!g|a,n(z1j΁?O3?m)~8_8A`wo59Xģ3]X`0abR2ߗ NmXGLSNB օJRc+fq9: &HZ^Y^Isep&@yr4[LwiȹY\LPЯMABY]=K5G5 [Vu=2k1,QIS519v&M9o8 OvH]3#c%h|FJkyCeA#o_#.3QidWjBYɔUF_k/lc#r FSm,[q5ݴEw8-Mx'Ѝk4 ޷;[AW;X Zcp]LXrhYWJw0Zx;,%+1* AluvgImǂX LE,6]&=fu'Ձg תE.=Y[]G#Fo%=M ¼;Gmߣ*YHEtN~+ X8:85$`FLN?o6n'Կ l.zJ'(b 7@>b5hDۂM08ju,-T5Prg9] ]hn5@wgm%Q|Kg9X,`*!z&̡`zl"T{m0wWrhl i*pˡ9 Cë  qxŘ8IwmQ _)ŀ#PQ;[pFl5WD*j@UVbV޳R\H0 |:8[Ǜ;}.iCp/A{lž_LN6"wrPЅ:#!1̑ ىqA']h!sγZw sF?lzߜL&?e4'y#߅=2_eD]XBD~J/gԼ:)ɬ1?`ڍdĢ ɣ̌a:/*iGr ?+7*ƝE Nϊ1^:挪a^Ϩ$|?]9 N8YR㱖s.B]j.:\Uͷ}ޯ3[ ٺ8xnV[+DF?\Ky\aĬiL7B(2:+#)?vdE~- Гw;GWOp 0;8fhfs`[c936&pV+am@tW7sn"^j9:⫼7qn(. EǀϢN=o/CgZRc]NiA6N~^'&)w][VhWtO.bxI۟3<^9݃jM v|!0鏘TE\lEaY}_6 EzWS}٢VoCZ`WQ K+Px*|nz-? `f?5d= rrM}L}A )|iQ+SH š ^8M,Tps_ E L=א:ݟ vIjX?:$UR-iLJsj[ W:ͪ(wn[ڛUΧ/Z= Cߌr{8H\b|(=ӎ[m<6+ิSD٘5 -ҪQ'bL$c|(PPL'cm)k*?i|]wc'\Y GShm^6/fNe9H5_ M!2P'$1LصUz dR':Z䝊Ջ*ckF gϹ8ciNGvW{}i¤yQtg>ݳHB(\R !CکRX\o<H?6!*xѴd _w)i`ΘRqILafUBcNk1]>߭{S^ [V?m P{t'J2Y)PG\ VFnU[4ޙ8wRh)3 1>e%1\!|t%5qOƕ<;;+5?WqD`' AN׺xO&e5:Ӭ MF="b.I&β%r4yb6*Pq &a*ݬh'_ ge{vրRALGKr0=8Mŧ# ?pNh ;&Nh#zV(|ߑkxULS^wqsl91E ҵ5Jv{trۧ Je !#{_*s$ sL}WV%+ p=k77Ɠn:K,aTZc?K8S*e,Kd?0ΥH6sJ?aC-~) &*Šw"{4*x 5.(JQf%?=z7sgi*3"v.}IHT_ f+@B<\qgfP8y_z6ȁ4grEtj: "+r.w&2d+; mitwY_JھeG[3  SB +'=g[MTv4@ifxdj~áhk~ /@fS^Xܛ~*"O#ėmr֙bb *a^8^iD&p]#T̓{-#M)S pyFE0vZMG@\B5 .Y+/ *N FUGD99C=&6`UK*}{6)B77$Tzh:j#{f|Z?:q݊e1;ryEJ-Bs_SluϝQ҈ͧ,xv01B.K:cvrˤBP_?H4 .Rh#lϘŋO} aEƍ%lpv8~h~~I{S=]܋ZѡubjfG *{NmL@O1ѹ<<9&Hit)dh* ufp[7(⑊&apbd\PHdd9^%Ȗ~CScڥxD5r3A$Z#k$w=aGZ63tiɥ-A [iЫTAP}qâ`baj@VO|Qpgy]wc :ʫ&@!\pi_=E' FUbBBGyT? }Rq :ivHD&Thd"VLO2M 4!„JRhl LNcok@wxY_ë<۳I& o1<@hB^j';}4"#pՌěOQ r w[,XҌ64/G-* w_.[=RYP1 ),dVmX#yi9QOvGs]`fer ԣO%Dת0-m }\#ˠ`-P+K!Tn!؉/8}8F3Xu 88m#J>U0j=kCppaIU;KrLtֽrЫpo@s}) Q1 u9*rCKU>/_(5|֡)Cط Gr6X(;XrAM(H)F1|OQ9f hS lV2uVJWqZV[H]({G (K,NH왕_i|vu,Mmiͷ1962m3,zϊ#.=8м?O10_Y B/%["4ن_i %PhBƓC*bϫOI UH3C:K_]hk8hPzS<|d&Y{~=͍2?ڣ)@sFRbw ~LKSC:[Ks Vt"Cw)kTdi+VLKZ?6!RtsvKJOpCVz/&\ujEE #۸)MkrZТ^C4(z@ "*`kosv ,QA(94z˰'$V0s>9Mp騲Dm*ӵT8 riEKv}$O~%9)0Mr]%_Zv^}K&ɃT3b-*TG@ڦ*6Tce.l|I^aRr6 :@gux7Ix +ɰIC75\_dEoW [T9 "iL\-6!QV,*2beYɹ˺wxɊ }_wmhj+ E} en/ުǔt"2-zNf"|R5 rulbFscq$\%*mhikqtFm}]rS:$*9.K 9"Hӹ#qm&Su=65Ųϡ)ś+X䰫 UDWub^_.hYiXqVp@W 4<٫7'Dluh#!W-HȃO?>ZS?HQ p qiȞ /Ӏ ):W@iݪ)Rh: ,\_އ;k4Z5ȝ~1qcH|z_~ځfS|B.1|?_{Fݦ?>Ćr:zrNQktT4*v =x/oQ /d+j&$=i.85 Py M^j8MC< _ MӤ҆\WDcKg ޥ҄}Wh u_[ߞ쓞[}gG{#IxBMLF[Ȅ/p$uسxW9萺ɽ"Mӣ* 86C1g`a^,!?? _Wo2:p@q gh}dz^='`,@0&lT˘<"!TkTg w >qBUQ)rs[.{pi%@L 6[MDϋl/hx# (QQ&-nv/D5xe7ckƍrOs k"ޛJ:miU+ AE]t>'ޱEPks' (]rҼ:%s+FK5Tۖoڽ5L1[z[[09kUB5j+`hX+Fʽz7PN3J(mt@;]XN+xQӒR'C0ꔶM陕} 1p iEb eNHc PU 1QR䋐o% &5C -]ޞJC^l`0kΎ5'DTˋRe\Т`uP2k- uŔŰV]%S5 Ēxb1;!! IIļVC5~C7Is2yZcM ׍ɅS0ݘPiryiM#^hfŚHHGVC6]E}n. ֯TӁ9<Qnj(?QZ$;S" yB0$9R1M~_-xu#lb\:9[.}^qc(0 wOm6ؑkk9J+*m&ǰ4Y"E>G1;!mrg  Y;@N<:3Anm4(jEC08N? Ze&l&Nltߕd.A~OOF $fcoNƭ\Ί 6Pn'7Q# l6;-#.S䧗Կ5x 0cj+F zZx*Pm$@Keh00 ccl^TzX&ma07t&פXd8'C12SU:fi1詞Vi&?9 RyWt4f; 3 804/52?)u9eRژ0+$1+fMqMXd<|Z~C#,PSau{`wu6I7rR~ۚ^S?Cy%IDG1rAm > .&Y_>eɢ`fk>,ڕ z_b%4ol "%ҭ9эR,H26ܬ`,H64 x@oF<^)bIX-KX>+A7̱䄦US|<МܫǙE}ٕS7a~΋a\ _<aE@D[ ``⡌ld id8Z1l2o[@R)Ӂw( v"Tꊣ޲}[D6"r6S=Z y=N8ߓ&I" Rgkہқ#j]Vt$hn2{C alM؟5UոO>jvI~T Qf]7XhM8z5w v1_1yY6~Qgc:νp?_SN[t[.j]Hu% ϞbQ'dx%Հ_jk(.{UrCdz*U.Fĥ$9RwVA:_2#Xhs{[_)3vZ;ty4 tVڏ<[N)l6ys2,.˺"#M\M0#2!ś S3K׭bw"'$b9s`\NR%seBF@2`~42١Bp4jWo?)5GxK1oU:;o@y1ͩ wP O ZRL}\HE\S&cNE  zÃJ6Y!w&dO\3I3 RC;q 0LX"Eij>q?3<#$^y `2jŴΌ\!N3&ۄq)dIKaQ/{.wśeSpuZ/(ކadNt[ROt<#]ZҜkEd>,A2TM5l?|h*r֕fjP=G3-h8緎I@}QX4xh_#A,GR 1s\z, T_}e51P$ꄅC]#C Sbkґ%=4׫t! D`Y9u{H(t6f7Mb8k,<P#]<@+@JK"ݨV403șRW*4Z{pG+) Z0á0aHtG~=OcwWC|sSdxE9.Zi3.QsLYY +͹M*@TX_ L 9گ@LX}4Q+ Neq¯s>sM7k<ѸFB f͐&tKpVd8:Sb| %ߢrPq:A:9)"D-y̓4H`N@X՟écBg_s{4UĬ| Bۍœk(Pƒ|fYy?-W|I џe6@1Ef}@%';C"LO$GZ úƿzO׽:`v/ޣ2̮[ M[Uϔl@n ɵU+RM{9gS}/-NP+MYGbVnJxnZand{)Yט? E&hkɌVHF]fĵ:B4.ڷ?ni9^Fb OV1U {F5mo?ڍ^6p |*Z |ש 01ɡa~8j>Z ^8*0"kn]POF.LkFi[![l\{!%)|LYS#дqɰs 7fB 8ʾϩRz\aFu-~DOjBz|gXg:+M0} t6zb5jȓb~]|lf_2Zjj7xp,_~&O vxѡWcnRYq"e+"0&Gnh"VCnKm~XG 2h$ #C|jEE[M(vP%ycW3i=ttndpES)nJ0u,|!Ւu"_zGAwClqqwqDBz>B=8mFL%_q9 i\̈́܁H0 YZphyloseq/data/esophagus.RData0000644000175400017540000000346013175714136017303 0ustar00biocbuildbiocbuild7zXZi"6!X])TW"nRʟXg%>e@Gƕ"?A AZUEb^qhr{OEv$xyL2waFcH7+QS|c?&-Ve]ֳ .]dĐՋ5Z\5Fzq[whSVbig +@ƘA+V+s;a{$I4viQ?92x7.5PװˋKzdž^ b6`N-,0%[3 Nq0jG\w4#ȆYzkzCG&˪Kx.<2?\eP= oc㇩ Og;DR`;g;1l`DD% Xl1v'A*P)?'nj*mmq.uFD6kGrEQ+Nq}g(Twd[ -26` "7A {dsFPAs \O5UQ&־!sB!˫{i:z{/dΘ0ҍ#~(H [V Ŝ˙ky aĮE]&|is7TRA ew+*O]T_iUN'Ae@8A#TZb&i \+fO{qg*55]+Ghv٦c!{\bDU^.K-ܯĹF{Όދer2Rݫ.A<'VFI1198G hRy|Z3_'B:rhJ'=*bzOɣo;С[8O =?o+Ţ$"u#kXR΁]ҩׯ蛥#Z<Pƽ8hx=Aij5HM&칀!s\k6.lfI qb >*IprL1 3xhLO=є){̙$V YD'#Ry1 ӌ9Xd^Of4_ޑG?X<^Xv^ÉaCvDԍE}CRk$ :^I_}ZZf"&= Hm_ 6~kՊJĔtľJ~V^p|o%ŵ972)} m@=#.Glo -րq7H>.vI̒{Zx@>u݁G?|2goU_T7dG$P pGleI:PYv3dk]Gsiߑ].wg`JjT#OFyxJ"0|eu=v4&s^zFm'ddH%h+RhʢgO敃 D,ױT?83Ye効OnSt)v2?;'Uk8͒=SWYۖ+a<eugDhc>Zs,Zov>0 YZphyloseq/data/soilrep.RData0000644000175400017540000032160013175714136016761 0ustar00biocbuildbiocbuild7zXZi"6!X])TW"nRʟXg%>e@H| Tѳ߭ 7AIjg<{A4)2ύ<UXc)՗DU' "Q7=ܻ]ezDuNCݡr|IO"̤|X6[y@js2 s]\$a(:b&݉H_[djXEƎ{F&}f#-P na ;3S.I#m[ FM<-t$op0^}iC8#Iؚg!ZC7PC,:ve6)X W$5xHk'2kUzء_ 4\hRx[;:3!"‚.ze`*$Jo,+*htm48ȣJ~purs]fP@uǐT^]-7"}-Cj+WtQ.OQf#g<'%-hfV@~YpS -gt1{oĒ'fЙsʇJ%铉x*G--U(D1WZes| ) $[Y^x. H+T$ff $1hֿ>g}t#kS^LkAJ*9;ru 2g-̇[rŨzr=r$?f &&h.H%%kHꖗKRGhuv΍Aw,-Z,f)'(nCw5.I–#MŎ"baVW]BV?f.69aG³⺀PA?Lhli">BdpJ_Gw;N{c=C!-viyN,j}G۪)lNתJ޾BLkiסdDž,:nǻ(IMȳAEuC=o.GetҲ @M-BCq6N݊fYkvǀ0,- ž@46N YnSNu9<=RT閆\37fVp#Z!⬦Fh,}j\vi!6|bu%}";lAP`27*a~X9F޸Hl.^qqZB"ޗ |CSCВY~I?7m fk]* kgGE1MݻBKV䍈+*[y5J9B^6mN**4HPo8պX mj/1myW$.aY-{LbƪNf^Bs7]J2B8jmts悴Y~is-pP-*o@גyjO6@i^&$Sy g' ;Ol͝]ˊ(ss>=I )GI9A BA8SĊRiSz{4OF/1!FUb |f!#x8 c:VDqƆ@W*UV\|`NH2v%/eBf 4S<69%em(,on3H,<.QaEme T>zd:HjVb+Sԗ3-Vap{Xe_ x东 P_1TU 3_߭p=wx o҄f|<9l,7D6+EWc6@ 9݃dZT2M_dzɎG)>eR?} [_&BHzPACб5oxTQS)f[S2j}2rE5 Z>~`(d8ݸR*ǴZ% ]quUUM\ FRZk5) p[9Wi:'n2GZ,ֹ4w&:OYlVȆjwҕ%㫑]plST\dMMx?{Qh6 g8)MEK!:x)!R C]zD}'mٟ`s $~ݷO!U ,aBO3j84X %,B JVi]\ljT.4\Umi^ncô9ZdfvYt.-W8V&c 5QZ'y P@GdKlm 78L+7I_^;]aګ?η)%->˚sK#VV# ۬G"Yf]-/:?{D6Hˎ]3=Xkg)PQsѼœ\(E Vj'&cPheL&N";vqNj@H6WE\ rosl,beaN="|Ts9BxR+fj4될8(P dNRY1(p2I'{Y ?$ᎋW,)&*}Cwoy{ehrM·QBO<T)_e|r!9c9ԑct%E mx O(|+=R\tkIҐZBDl04`Z Q`,*i؜/iR~"m!y?m}A{Jޖ#@]~)6&app\/><ԋsZ/K'WP>s>գ(<Y#"PSG᜛J.v͓w*4 -EXRFI.I$9We.`=GXךWm}Vp4S'ۊ\9|8V}];XTzwbőVtK2Gtʂ nk( nrWGmA_zeG\Am8Y%TGK8gdAr֛^)-b{iC%3^D; R0Ȑ1~JY~7`L)C4.'_ٺ;ZV# ؤ(6kɯjB+R9JG[b.cTJ`(gU4{A١] F:Um}m@O~`~{eU2{!%Wi 65#D+s@EC ;5:*N]D ,OG`;&X%|qfJz@k&`9_`ıpxB}BD VWJ/!cѾQl;|"Kȓed2ŇB``Ԏ7uLԥ3 ,aC9󐠢Dw޹SV]8-˪rrol=H^JohLQG!YѨ3eEOf%"k'OAtqvB?"9K5__Q膲\7tϐ () 9zd?d9ͩ=J1q_`Swx$vKSܞ8k6}`PsAIUq:aDZ K)U=mG~9.lr J llh1ߧbH fy" ocC\"^0_'ú\Bݙ]ԆXhs6 *֊4r<hm9Zu1grwy|c X 7tYڴ{ @=ɩK nbRUvc@_bRQY F.BݶV((sh8ioƒٽ} t'Wꍈ2k7 Λ  fm'O .wv b2 o*)ڟ,E6kڬY >Gn77Ĉuc7rc1̤\J ޭр0ύƒ.\,)ms*ե$}@^.̔1M[*^r!6jvv?G騑㝩vBƭl HV-N^d+ĠEUzԁ%A8oDԏv2h'+WRU|x@+Ť[bz: Ȋ,y˔)zx Њ +SUߘZ,8f UʹV3f Ip뙐:21] AK}>I GDSGޙN0?4wp^'p UTeʫc>ez>k|^Qv@>+0GҐ+Q.uz`i+1T_5v:L˃A+p((bb t*KPүdBLmLy . wziUz"be1iR)O]npfIۯhjwU)A zc-7xSƻyw+BL4Ճ&71z[kZsQ5n"L3Z |AhU'on/0)oU1=m h ˵1ߢ‚7^Ǡ 8be@Dl8WsԺrX9x8`4Km\C[KM;^U!4:Q&xa'sϞEMs̏<mfךebrxcyYHB[Q%R ip㘮(ȟS(1'vK͕-,~ aNe|Dχ nn~dc^!7&z }KF^Z;ݽ Zp r۟R?j V w3PH?(Tp/41-Y)fsN Ngƽib~+YPpnu&AKgw)ё*cT&}fb蒙 ^Z\ld@u՞ b`F~)lc:5P"H_h U82`% ڌҍ3nRAְt 7d D <Mt 67Nl<]pܑ00-#Bu2#!4! `jSnGn=|< Go&2z~Xz [0|)WDJE$Uj+ G zY/ n<P-z;S`h$&R{qwW@yK-O̘X`XPe靖]AP?J!+Ri]{B) ]"XVĦc32Qqd!7\Ƚ][; piq }610nnQK=JP V1h@amT6QYAW~ph, h*K0gVÇAZ|'lWt V XT& H'8<}/(+1ߍ٪Y4y7Y(upδxB1kWK6 ɣk#-aU @R:y\֑ ¶iEe'O_ѭ<, #Ĝ3o!ԯAmp-kc ) !:`/mwDWs~-j]7'紩:@@ W.P$lV:A_!@H?JB ڕ2Z#98Aj(nGBא9/kH5 I!=vYIT ͏01>M[j(0(=t]K+bz[ѕ!=#L]7 f*e 7EUx{"7$IWJ xpOX$P?Q^BD (ix"&Z,$‘7k(, i[\jbe j`]W?7ڟ$CŠ)mC(VEcѩc`Corq1szk'{gLlMpI KJBX?^#>e*~iТiD9iZkcNj_X5<$B$z&H6Zroi lG R y#JhLl'R["P g6qgނ33q0%c#)9ė)rMN48#J[4(Vd7E2()?_%,>kfX]Y#o,ŷpY1MCoϼJejtw5yOΛ zʯ"ZTň@ߣb'P+ kr\8ê{*ƣM^vE2ϭč#ɺ 7sY@³ vnWes}\7]҆{/o^/R􈴳ӻ7$ &(дIn К,ᮉv,l9r=ݖ )=7~4\6LlA{ڊ~CR~ ,i{B lˇ%ʓuz;eE:abC>(C= a_0瓾T5Պ܏fWѢ$o6CSagl'ຆ ҿwJ;ݒݨX=VKjHRLddS9K{NP8ģ &7udD}n+L{-:/ Pj\1?[M(+i)\ K$ϐf)hYf(l'ӆtވJI;\WW'"LJwVίLIqr`]9Hc`)whRTkɓ&0iV“.4gX:56ZՁrg+pW`9fniz 0pܬ^Fj ىJpJzwy&qN:渷hHBJ%ZZjf{wh61 MABut7RpM_Mh= Q\dV7q ,n\*Tݍ0 t@Y."#^=7{W:ȴVrldjhZ{iD2.&|bĹ\,Jwoƶ%RѨŕtA"ɘt4o:20+d!btA|mH1 K)-JKjyjdox* s#6#gcV]Ej\/}`ҌSD{gޔ;~^$h#4:XCQODUHϻ {xcqK+uM8ՑB1yR2 dCU}.śtӀdTsj4_i֨S^V(]&I;Yy4qca9ҪC5Fk)Yh{ Xc@Z$fK:ފ@6;UUxrY3ک Ь̄u*[=;Aa>ہkD\k "7c*2f"s#MMކ14lE&L$!-/RX8`sPv*۾  _]S7:xl,ԬjQhs"l[:LJy$m^uTD%{Bn;V0MP`- ڹ ~38NLOwz,S/a I#ru 5vnSMh*m?gݝZɺsH>f] 9 5!"WfЇs+,ҲxZ xksОor\Z׼"ecuQ"ȗYd@2+ ='&r:1>FD7qI35hĽ;ȯQ Mĉi@owaC?2c)=.F7m~ypl.EC ̛Cnj0"lEn/}jIvW`D]n6O =PF usCHXU9+o=}1X1VOk~1몟bMfZk>] dr7xf?+loŐ!nDBil6t+˅pڽW~+tfj tvޞ.Lּ'rH5'2(J0&h]Mfv?Nb4"_ sǯNNqӈ<7 HݼmJ-kFxRH5<=K("Dpc{ࡐgsEn$ U]֣| 鵇!11*L'USRFl8(On.ƎFOh8BUrNBvҡ?Ã_+ BYmPK C+A!X2.ᢣģV 洠yI>/b.؁[<]{"(iq~wö׿5|_ґnֶrG([qc ZDrӕ/@hOݓq{7)S;u2:[\߭.Ρs/ppʽ&x%e ]~jđRۨeq|DW\ߢcz]9R×\Y v8ic&GYU?;|jInw75y6{xiYĭ*^T18C;Xۜ:2#Uh-5+.n^6Qa0hE SFmk0uأ.hJ ss:P_RaG8kֿ!4*>=I@aNޘ!6&6F_pLNEq$bHX~-qc@PLL#{~23\p:Ч* 3 Sm)6:h!K t)-Ī,_Vώ9y(JuUV?v0L2=Y`+ MEvT\@ ֜{<5La3ks5L+8adʺS@nc9cS$w?k?6M4W?|, +wFvm)(Qb/!1aJ9Լ jzl.VRddc6F0HtKFaרșml_匩[Yϗ^VcW|5c^ZvdmmQ+4h Y4 ; iNmT{kzf[ָBc"Z*(DZVq5p*BU&yM'a]mUo}v X]!_NfP1 B]ުSMvC"D$TMS\9YH;G^lyL8#Z54Hڨʎ}2Yy RQfgOSj5IF'Fp-x6Y +oĝ}FA@2('bLOǹoT9&<"*ECɿj'.d ش̶T8ԋ',rfPsdjFP &))I#7?|9(Yƫ EnQ'8|Ǧ;3- ?3gxMFڀ-Ot=+yZC__RU>ȩ`9ѽ:cd?Z2 kAlEagfܱC&t@̒qL%I鏴9U5VlYRrH롔1\ >#s6`օ&]deuâr*@yz!xwK5yKi`l:k~ ɧݧ5Ass4:8/}U_Sv< u %x#:nצRΘw+ڈ"R ?5Y'Y59QNHhC]&n.o-vrn_֯zŴ'ЮE hw.+nljLtkxg-~P oA&yfΫc_gszz>mQ'ҙ(afH\6g@nB]@/DL0 Ɩ;," GH{Yyjv"MBd!u)үB Ot#tim2\_:5xMKZQJ+O6F06 a8fLߝdhsSUƳUv|@X n:%4ZƧȊ+~{{E:i6[^}k$ՃDNdfXg 8 Ҿ-S+hKC)# SS>E׼u^j4ڝ"%n3twBVlubZjE.`awIA[p-o>j$?]%9L$M)⇌dʫ;guDyN-cC8fg+2։2F ('9ǽNtr"~&f|Py<7mpO@, 7 q P@Sކ[?`dadSn0Q+Ѹ_/:J;/Td n7a+]1J9]W!/n/-|ZA{6w3MfaDTok,Z,fЕ\bkW\'?X>(brԿeԵ2?Qݶ@^SyNQIjUU}Sr]K,63GOTӎ:WDža1A(BnrHTE$&Tsr8ԮÏMl'}C&[Rd n*.dgMTґc~P=$%)}\gFm^|ƚV i 6=UjݖJ+4s>zYCNF:3(h1 M8+QBSu秘 VL(H{Ms yRyEGe%?X|#o,l5>tvEkɀ\,_6WvY:)(yq۹pCSƾ?W?u P͆4U䀉Hxسy~O"izj.0_E~$zlٙd!yB$9+v-8?.0'k;@4"\l|hJRLn_ؼ3W( ޛ_q=nܮDAjl*@g\4}CyPV'~NhOts/b-X&}re.6=bk(Zn^Ȗ @r6˧+IPZ=/p&ssph AQyXy_Z@oiRi+lPߺ+BkZޠT@v˪sa螒5;2Msxwk`hӠ#A@XK1Τ{N:2yŰeCS cS Q,r=K0^C@nMPէ5#6B˽r_f48S#Z`'8f'kF QHKq|j~hפzcoQ*a^ DnrY{_~I}V a+{fRd#?4,{:}U#kq.Hs4%GnKˁnx 6\+De4fR^+ym&OB0FٓbT7L())Eؙ0t0"IUl ~΂8 rP#7ӵ) M7͘,ݘ /Ʃ~%jRs}Q{b.³]gd64Ң' p@]!ҞєFxOE`^JrTR/%he4qؓ$2Ĝ.&X=:ZkFݯeUi M=BZ D ѕGCIA =|$jO̎7vFSEՃ&` 4vmXk1ݭo|KvJ x3^ {ˤH#!,K~Z/bRm+ 򍍟%_ K׹e\K-jg!|^#r]#i'C­-RR\>Z_FQDKm}&A_ F6lAlQ.?{m^lLkT9LH䎓zo@ϼB.8&FѼ$Kڿ~ wQ`R!n7贁"1'v9%ͯ$7Eڭ+ui@;|?@nЄ*`ҽ-eR%|~/ڻi4y#CN7"f,[i/9.XTb/H_3B(9,~EM[m*]Zp4yVuy+ Κu¨ ܴy7QC0]P֡E}d++pFnE$f| ՞8A)ہqVzdR_偡yrV}oB幋5 (]f,CwK, #_Ms' Ooe6!NHT/lrv 0E=R1}crUsHP5=QeF"MU}3 #"%u^q8Qa#+v5\|@0*ȵ K*UulH >iU~Nݯ?ꄁ vL-=ΩfE]?Nr֭imkvhJ;||ٝƗJZl!pնAwyK4 żWb,_CHqm"TnɉzF*CbcXy᪹픿y[]dY&z}&}Hw=!阨05HI: 礨fh$;SُdaxP XShjX,sP_R[_ÚP@ۛ%9E'm M쓰n5}7KfN=f0L.IY\?." 􍀈3%Șhg#wU9uv{V0#i8dr$zk&V sz ZEy;풴u2)o 7%zm+ ue%b2›'Bګ?JmU})˽Lg(*a_<URP Qap$\ֲ3zK=/DeR:gφe#ݴDKH˪:қ>qb}=]&|!?CPO hX  Ell@ r'$TkOv{\A/Uoxc_ G߯,nn*|zx9uG̽dqe :$4}Qw4rɤ^TkGqMR+BaaЊDs20K[t(9^ۿffnAMt6Eٙn~4=s{Y^ٕ byU|vvhA"^kAaWV)=HT~|ȅ'֥JMXxłgkGDMpj+'CC H{𮹷r{|7FfwQ R2{?Lō:}"`jF\E։ 5ŭ챴Yf E]@E/?w65IR_d֌=mEƘffWºFNj'kNX#\д3F~B9ѵ'WWdq_S7Z]6{y~t QиWajM)w Q2t^o) 4i|"* B謖]|`sa7^#~GUxSMuq{ȚDmY٪b2(P-.kX!\pxP Y@>Le> pq9& ֆBLz:ݍ Ͻ<>9pTP_J:`Yc`WE52pժw``-篗CQ"؏K.pYjPFј}s3I] +yg^-4ѥ47vAD?V)FUM.caޯ'a9JxID)ZU2˭-oy@wof߻#yR=>7㹊vIUW&#Gi0IhH$6i43C͏!#]5cie]qDȈ-=nl.;jT\(^#gY⯚\Y2Ieyqr˼d/gdY{I!J@Uc3/G1q Ć_ᐔ= "Κou:@;z11+`c)ydjf|@ őӲm=tC& *)xiQ!,)D#ahC#ՙX]=*}[ʹl$t8חx#)R~Ijn HFӔCߺuUl7Igix` d*1cf_=R[>{HMaC@.[Lv*„8pnKR\~pqRQpN﫩ۜƳEL5]d0F4`,pZV-3v^ڔ D2/k̍J:/Ȑ5똿9I7Aw3"a9k%RYk ܆a7o`5w}GkڊvH.3Um[=FhRVpHl$QP]*DGZ(p` Q\]$eA/}=,6&XLmS2C0j)@OLuݏ>142ҙ񲵄1cvvZF` JVh.w#kq0׼Sߧps xV.EwEG\Ȏ=ߚz/<Dž a|qĺ.:5ǭJ@9 tՏ :Gr F[܏w" sO뙿4:0Zt8@]$u71!, Yn3KԮ Yq0fgOJ|]FP91$}0bR%' -ãܴ GEᠪ:(ܵg-uإv,Oik2K Q8HWm &`b_WƂO&hT9:ȱ5;^_G…Qo^U}N*l_oi:԰4͵×;$# Kj:3A\ Վ+& 0R C$/u!NDdhA4̠P#l ؐ3/$aEIj[f,+knE܉9f !f)=3GtngC ?5Z#6+r,\m;1w&u5ū9P{_۩8("iY`}?Q4Qru܉Hp4(GAM.>˛Mޏ!_oh{S L^ZjeG荰}5ycHnj(D%ŷ'IRLYT,(̳qky.mq#*!BT͒5 ,avߟu1qn}eC:6o^5B L7WgPQŷ5Hq+y?,a5bZm-G IBchTsQ"I /H y3p\V",DPĭ‡J8TxLLwlK98{^ 0WOVw7#-< EIѾTTwyktv")$v |ykyj͍ }G.\.?8sR ^ 4*ĨL@~Z&F $3JGy5Z'QU'! ST %N"Hݒu1 b`&}N~lh Ly^V{z1&?L$SP_zXgMoN΁2%-K.1ѴgِUGFA2xnyZFV?={ROq0ܡ!g/@ 吳dSL? 48-V@'&4^E)ƞtVD.rRnJs; /lI px5uE8j%z͒jzrĢhHԼ{O~bӎs?>KSQdtsfrJ DY*.9jB3dߞ9T33bQt5Swarw9(:8F[V\axCf4XL4?k亼VUN|]O]רPRݍ0 mCB{uPf \Cb؏lh&i-DiH*h0^^/;_k"\c{d.bR7fS% DT֐zOk Ƙޥ" ;&iŶpm$bU~0SDpVAq㭣5H>q./[eU/g`LXv)*Jl,q9ac]rpIߢ]湫*\۹CqMiӕ2Iq#V4'ڇ UNQ]+(YE:(ޑ:uIZ=Y}a8u,bCUƔZd0cF5llݚ[Uoq D 0f"R=2 u</VY}\;D]+,W=4ȿYXΟC"6NdȄbb!{嬮֒H4Jv.oyi0JG櫅Jf7SAI7(ja8Sĉ X]@gM3ɱ@ ܱIdKsl*9: 86Qڽ ᎱLo{ 'c;g} M2CXC8$Wj=\WS:"-J Ve4 ;z! "2ќؙ0MChX~XU]LK^9Tk9E3 J])񂱔|IUzΧ:ӈUV\Ǘu2vGхG:H;ʁgBDEYnse-uStM9Y zP%`[wөdaWY"ٶ'BoblcfQxxVgK\ʃot~T|r^8w)n哀_=\Q[Z.[V=qdsczn::j/~ dFɭ,[wkx)F!XjN%R8a4)j% N>âtÑ;-Z+'gM9/6J!ۿ 5G\؆rR7'ɚe tLqGgQA~qǘۚQʮ"9%+^_?Ay3@|jeضh$7U$a`u K㈒ w<$FS\0ߓ*{#X.Cv_!IzVskS0|?^&Um7}Wb[%8R!dD;[W* | O&Y0[N {~;Gp,KZW'%L:)~mA/;FoҒ*L]9 Kӵ0 d?XlzF6RԬ}HZ33R&kةi_ &+ev^qX N'k(-dJpV4@^yP60( d^*M)>˯zٟp 㜬۶ZVfϚB){̬SJ./g &EW(`2",֕U#(]Cec=&2 W}LfgW!\3UV' bwpXR,%㤙j!\JlM[}H*vt Ymq$ʪ데(.u+T{dW.%C'W R_i%B:%t=%feVl@)P3}HIMd,g/9WRȽd$ =ڡ9QCd *Tpj(y^u_I^kafӺ0MDڶpe?|%b `cTl0:s/r ͽ~a`a.#p`է~IN׺yGi ?C~8Gɨ3SiY-<5 r b}3\ '~MPmw ]Y(}:skCSO;Ú5e]ͬn"x 6w1?,%u^9􃪓nwAӢ D(xB^|PB`oydcz`.ui^85f]*ڢeS\u -jή/v W,AQ?uY<~zCqMs U(44:jӾ0]nbVK  Wa9*rW$" '6{^>lTڸFnNb_, zaK̯o].#Qt׃XsST6ݎ[w?d.PY {-lli A-D96f`{ü6ZҬj/aq+lg3+ӾrA_C[6dCMtY^`1eX]))P&e;1d yx T46#Į"c8Yk׽Q%)ķI6.B-"ʭ0LzYQyYLJ{+S)& 5(fJMqMh@h:`Mi* 6ʱ0CYer'A/)GbH\҂n5 x.%!F$XNE@T S@_-.8A՜ 7z {g>P }+hxHwS〄<?$vXΝӿYIXpX$ (tT<f8ϋ2G<# 0#@a1a$ճ:?% )% kit)F;Z (&ksX@4GEb "]&Y&m#-N& fm٢M׼Sa9šqAFڋRYl>0 ^ &> .'+@725<y8jX3=CNlk;.}X^Z;~+\:w~nM,છxU>k9Pfi}MXE1Yw 'ALq)vEtd ٛsx1`P%@/oq:K(]~8=3Swi@ V<&g>PP,%V  ԕp(I1s@Y{җĎ3'c@*)R"6W,g`;-N0P]T.&1y1ojFDyjo3*`yx/ =.E+:< Xi"Ƞ6}qճ7)Ah̄42Z)ʭqِ -ٻCz)}T_w ΠMbqn>]tz%&x3(D,b_nbFɮ*10E!I+Vm:bisb%#2RO#et.@l4$K°c:8>+1sl>qcښ ceOX9b-X\3 4^9p%h2\VAaePLF٪}#g=Vߠk5!E_Owm&AnrKi980buNS96_Xz-BS1̃>#2x~@d4+P1BeXϐ@n.b g,֚l@ָRovleV܏Y|8y]RPRH &ǵ UiXlF^W8 ~ry_-q`Ba?`E|qr&.\=de48/ε8e щ\Xˠ|ݦQ&SUUtnUlzc։ XsN2 ѻ 9+*1  %Ͽ,ΉMZQu C^2 3]G 3MaT?.>YHpS=,ka <(ķllhGm2>Jk7UE=x3$&d<'\6lO?cfttfkKe.9Fv慢\)@zlF_E> K዗H@WҊŦ]6`ez$R%/Bw(l+3ΌAgAi7F"\Ɓ0277Э~ ŽUw5lNCEV!^@F8fBJz~F]8nN=tIW7s2d>Vk'jqjr;^ O½a^H[Ve-R)%vq0g'@-}ΐ6lmsqLo 0DLKWŬ8fb0-9DQQ FP}eRl:nb+"k:: *y=(T??D} t&*GXeQ`7#G[r/zj~ߓm0.Sz sz´pNe5032lt8QKq I{T\HqnUӰ53 5-+>EEVLm΂@Vr5Mˈ(:`'|ɦ K/*rgvHO(n`=/bPDzs;28&ڸYq5!~ܗ:CtW 6Xack5 )0Dr5NG51urcY5'MuƲH}Mu^rV/BkE2-~1&.Zlc ̶tћd /8:Th|k ͢\Kc{YLd w,UOVBCPbV)xPׂ >8Ň DVH\h5!u %8vSKKxl8n]FX9яMnΛ~YN)4_ QeH4g0fT'T ^jYY_#~.ڒ?aj˻"kO^`c/[XG@C 6z$4}c*rP>uϝPWлww. k1wS\լa#-a[7@MP`Q%>e' VSu$ၐ jUmK"@,0ƕӄt]qe w[RytRgL;9̓Nv!`Nwl-5V"nssfH3ytGG ̯ Dhƞ;%ʳQIJSe/r1RwiTk3 m~PyqܮE]KT CV$!…zМ{F㹬cݍZ^s%19e@SO W`V*Kv< '_ms1[<9_}f)$ޝG6'k/{`Rуgnn!zwiUy|P/x?k%jS:iv S.v k HN5}QE)_3:(*:݃痚S*sΏճ)Jl4Z97(hBބͣοst*(sCUpkd kV tXp- -` жgN,\ |uKzKjy?EaA-o).YB3iOc@ñNfZ@r<*su;DZ|=KSآ\YS7;U)@B:}wiI͏Rq-f k6{FZ G8OQ >Z,%ؙI2VDiy)f*s,Z!_{ˈ_(O_̽ۛJ Ϻ9ah;(ʰhUx }B:H (RxT˨4$G@bڜy|\$E42I2PΜmti3LU+)X=wp07)ڍ -u!}|A `ׁrnȟ࢛YdB[':k˾SPO_Pϐ ;`"pVx-+P3%LPZ:8Qy>屩:\jr+ŭ5E bn'A֟,0!ͨfGˡ6XsAB-ʞigȗUo~͒|)u=1LƺPC& f=cfWP#a;Kդ^slѦq.C[.2N{[ =Mص .,iz|T uqT*K>f#ϖw^-$/M(r\T.Ҝs99 SK g/4 wG6,!0vf.F1 w{?'8pJhs^ *^QruZ BVU0hrӡڇ-(@oJi؝2$ nTgO|Q# 1K. kݛBS23G^ j᠉4_84N:"kr>uW8r a6T-AZOekS|(RD  'FbNޡdgOػJg[ H,8[JSN$i),pc@wV kiPQywgw)ͱY rf>ݷCwف\g:x%Ψ&+cuL1_xG>srO,H#y1KRwa)T{f5ɱD:eNMōӨXjzi)ksy*GHB< ;C@7Xl' pT3tYρ+\I"~bO>_E۹2o2ɛn7-($ɬm{|!`'- BcS}ERrChN߃a· H"/ggo+@jkB#2GQŎѫvI0UZT5t^eN W+ּYY8%Ԛ=lLp?核 d%'dVf֤eLf9¬ISv,xd>{2wUhz-|ZCsqͤb|d!r4p"_KC&.U 0'`&#ZY(gF טPrvk'FM:O1[>LA+5ͭ٫y3;fT Pد\V2uZx7ުU텝^3ťdg=9 zgv~_s?kۍ㍭|xf)iY  @ &cB-d\P}g\o?}ɜ?BEg"|W Da/y(CHuYߋ-Uo O}0D/JFY r'rtT6ĶmXycLcˡ +\K~8R_!Àݓw9BX-F:@ :7u:KxXʑZ986w(,F ?Ҏ0OXLTpp/ja BN\yƄbu<׎6V+񚚓9 +Xy*Ӗ 2`i^ﶝT3qA%+0 w k.*,sqAa+B([t]iOC{ {?҈nI^#799PVg`g,:qTQE~hxed[iUv#Y!NH /~݋kGWNm"-|]x|5Ż)MvX nT:]b%٠IZY@c$!duא89릑~W/Os~ǃTnZfO'9%Μ,6[hG:S  oukRB4Z 0rl^6){?C!Sh(4&E*jEHXoW&%iU8XFj%fwT|'k:bM6! P;Kswl/gy ?{y@^v r~]]{tTzKEFj7|z뭩yg<`<[`}f:acsG|Vrsd#̼<׻ѩˁALB֜ v,Q ཱུč)42gZlk"(G&zsT-bKDnxiꝤ"6CSSHwz䤅XJH RR "$=vuX _Q񈎷/7v}CXY-%_և:|8WrG2"$lPA1(GWO1@}Y%9+TOa(.òA.~Uz(.%Im>`D<͠F.{.2Y\e )$OUfXZUdm1e\H2{2#ۥzjmxӵަL9m2\qC.^wWz-^@.p~ґ'F yERtgV(8)bNahY1ӤVSh<RBSA3pCbJd/ KB$ 1\'6><95_ƣ-ZR5]&BdUQI¸ȰU!$V'?y楙!!{wABmܖo|&!p ωp]cpmy I` 0{=߿Jzy_1ZJ 4GVA:K0})B8)lH@]w$#Xݥ T껇eH Et\g s֑fCCO3BX|wR\) wk^ )4;9~4 ^۰FbjH1@Ĵ7@'n`NiY+ ̃+:15 e>z,z2ϚŀgLH^4vZdXωi[8L h ձbUV%Eaޥק<% ^D>㡒ӦE0lhW{\msoҪ*"PQ8OF\0fa"-e=5uB]Rm1a(5QȻ4XTDEƼV(<`=j^fk[pq.y% :oRl" GSY.vƻu(ՖAgA$;H]j09l=sq'4 âKg4INHQ\G{6C q۰yENmJ }mkQ\NvV59$}Gwrp- r|xxe)*ryU #x`\ٮԻߠϏ UXwVuh]@pBԷHdripPmx޳bƥRH0;9B}ȔF@@ӧ>jqᕂ5ɋ )}n:IDr=*S#Kr/c:T .l^H՝@ *twꓭ*_b<:QaA{f.ӮfHMBLFCǸ7is%회 GsѦ.8{iJUg`)d][j[a֟[ O }UKh("I#ϻBߪj@ (~PQxb rC thY-%r0f;t8|i-²Alx>$q9M?NX|$~?e!Vٷ?"?'-U t+eĔtk_}Ryw{CCъG?Ŵ8ϱYFO_!ӟZ>dB }b~0_G3_Uj TNYG/Һ'G]zΝ%QZ3FX&)L8-R x›`խϣ#dy4[.0*@I* KPcՐrmٿi)jS!W3\VwR3 2% mA+>׷.L SF kXޒ'!7iysx3Yӡ5OίeK㞙ҹYy, ?4c А 9ॿZU;K X-9VROJ8xH e}jLl:/4/ f@K=]PZH3X25ʜkdBv*| tZal,0av1/fYv:LJ],9``Gq6AR{IjhO&-qw$O$U:V+~ݐ+a3ZtS;>Y-.JnV شP|9B bӒX+6`LuD.wxiaK) ; fDtSDݒ,[t}eZ`fc~1mT@ב`m{B.#=.՚C|nFu!T_bY8x)Pj b[[-W*$(!m.vb |2Y) qwubbʣͥ^[1eC/iuS8'A%J"StoU0p _S|5?g?%S ]W0δ gc2LS̶6+:BO偣!׵`nW7م@& Q^9\^8qjDjW.~%땀n}5vC,7Q.mfA5@.1 ?hTYa M4j 5I0|?>uYǽKJj%1 At0,`Ǯj :Zxџ;߬NJ c5M.ud"Qa iE RSE}m98BWs ܘ|AނesTCթ ;`<v9csmOi OU"E7\yaF$62%~]"]it~PsZöu)"{BvIsM)$'4#T<kH}YkM/Kyg;|Gg+{HO}(&9>bzW޴/<mk/VLxDqn,֍16CuLzU#BT,XZ\:S* ҫn%uZ95 ESE1ZcZF3 cډ*Z :*& jS/XF@q)da]m ]xgY%)Ng_*pk8i?F!,8g*rud.,EϘS$M60U!$5A?H:Tc~G3IAs%4h'qyKv0;xEuL{n* a̔а T/som_%I )FJqxv[,B.yCɿ1E[SE243:_D)N{& iʎi\'XYulgA5Ncw"qN\@oBAy$| UKu/TJEE9 b71FF.{jDɗ7#ԒN"A8f,T5{<;~ f\*էS+tb7//4r3s09uIe>ܦCĊ;JGbPƫ`nлW{DkEշ:k_7xaY"Fl~뉴E T?ʾ zd :z?FHүƌ~v6՗_ k@v ^$uUkUA0xh_e.r -RqWذ{;''?S]ՍI!>qaz%E2mبטHΎN=; :s饱G9g9 U 2ΘQcS.8%"ey1u ̌KC%nN˾JyөEUi~&![`UK~E$ᩭLQ;=i:R'ښ3KIJ`2-*;)&:DVƠ&Qbp_X=VdO+_'ܯԥD3M$& Z'3{Dw KWuݦw(u@pE.V{PTAwW+{2R]'r諷 nKMoD/\4Ү]8ܽSi.:7J9M5_%ۯ:uS;̱miJv9h۷p`DuPORsk'Q7ʃ1sF%bY_=L,#+z'q3i9`q'FȮnfOsgl)s"=E-9M*rRufBG=WVnG7 MdԞoKP§;c䭾rw= CV,ʩ]'|YLg{(6CB\%rb ꅣ\Eߓ3IOC_6DT>͢y1B."#P׏dޛA⧟srЅ@:_NV$%C])kJ>/sʏ]ģF%ݜˆ-,oa~+ 粼.\}ʢG訆w>eU''z~J'Q}*#mCG{wmr3Z)L~8Pas@GĶx9U"$ǤVОp;Vn7Қ/\Ey*Dx_qCS)S9 61I2RՎyBcg %j ﮽D1A,ͅZ80@DKZ,pjuͤG-mvuU>X{w{1 gR}M13^흏H#~R. )_wF٘h!D&FNx]u/@Fc}~nC#|u@9=ȱ.W،!(,#qR"rj:^&ۭe4-yF'u|3.E Ү)hͲbҮ3ݕ&o5M(T,eZjn {(YY Cs(ƺF9>hmxۮGvTt֠*dU Rm٦ڥ>]?Ӆ0g6vO"Wq4N7yRPxB٬2S!V&|F:v:7ݘ3F[EQZ]tߩ@b~su&n$emG_eOٲ8bʚ?6e6D} p l"싰BuyΧv.wU)@GK@Ӝ74*#N>F"YAL?XJa<]l=}*Q̜3 !_4ܔ])ʔ5W,<+o*\z!wA*P"}\)m'J{~#zJV$;Cw0ŽT h<ִ铊@w8upQ-(odS1f*-e1\I 9UD㤃pH,{6'1ӤzIIZсI ~w1~fuTؒH̋۶"}j{N5Y[664иAU+\u` $?4UiC!]A=<˯#XNwp)Dq]RR%܈cgG:UsJ{ib/{?rJ͞gJm?y 8e6l9gǶm.:\i{_`m`3yYjZ Dp0/v>"Z{;=bvӄ YOMA͹@镈>(1ix%飕o}pd2 -]t!2\#q|d dwEqM7mKz6]ZhicXߗ8_-Vj-ĩbt3wсȷb[qƔ"vLv(lWxm,nfҫvS39Btqa7T6j V/:ᅡ=Y)Gt UԹm(!)Pnntc$Wv"Vap9R4İ?[ ? jE a(6yP݃J`sh2!Y\d!J<  $gpiO&M8`CΠp.F%Iܡòid1\{UD ]\e͛mیNYy\-0^T] PbpFyp{$)\;N 66[,HūHì'Ţ*FA`ey/y}v@-V_\!OҼz |S:ӘIk]~A_5[K\ӭ!M>Jhzq Qa:a|d>Z8y2LlJL 3:_;3|6a(BlcaBtt I/G{ PbkPﲩYy57]Z:Aw3}i8q:OQ%u2-S?e9Gs,b\xZ* ,8e\OsT]ԣaD:wTQs3BxFjwdF9If|T?Hdv/q$/t2h OT❔]~ t8톲:ntOY|sk凞K;*Gv`}<D*j.+HV Ε[:Ī)4Ad!nmXYʡN_/y|䙑!-RdJ #I8l*`"~ 7b7j2Y&tB)Up7#Աߟ62- X"n Ll61wD0Sr_&0DN7)҆3x`˂xH]&um3@-\Ud{dS8ot1sG,AlF$g)8f ֓5>F&JEM;1b+OmBz~7pX8$ Fd%u,s@3t=Z[ N-Ap_N띹di7m|Εx$׿J|wԶ=q_MUm.n!~.|`*gZi ~NIZ+)P$0}"} N\VqGhh7[]4ޓ~B>1H/_]8w. /M I1AUwQ9Nh3g=f7{/}s*lMQڊoa ѭ,5[Һ zTrfCcAC iM敹8BJZN /z'kVpDq/s \IW6j QbHMsHD$cDy[8vl6^GSpf\}1i[(*\rb Bd>Q&^&G_\Ϙ{ezܱYX-t0 @t-b|[,hVu-)'ϟ`\4o8 Qsd޹ GP$ѠF ?\n* eDTb-%ˇ`Ԅwdc"TLwoo lfčj;jxʹCõ %sǰ;pA00zJ_&OUWych}5L9=2欵PZ2N?vd)Օe{]5c)0#z”ubKF,vi|+j?<ވiJ0[ldLRmN?$|;/*h5f ^2y1HI#YyPtx`y(伬LeqY?(f[U6X2qçK^a$ Y LʧϠl-ə݈b$˪hޚb;mFquiIzoN|kMS*'Z4K.x>ռ1hu ,xkT0N>3}6vRJa-`mfaA!d^2ǵ|W02yxi{ =v z)Q<5Zc6 . s#Bb@lA*5Z^ .顷OY!-ot=I*rպ›65ǻIpTI'k<-B_P Fj%p.) Um /Gh_&_lp^᳦)R u5sCF:0B,[eY89zL t)B\Arˍ U~:dyR)@9p\%و[*TIl{3G٧2h?10 i_Z=t^fꞁdМ_J@Hhgɢ[G*x|1-eQ~Vnv@Qm\eK=W_%tQ@]xRaB7kQqG1ôY6V&)ʵd5#lk×][s 2R}5[-&|O_KBX$Piq紵T؄;WaE[b*r`z܊ Iha7ZopUt$Sq3~S< HIEkZ (۶^դSbu,ubHL+J&Y ǰ*&L?LKp5s5O ې~Ϣ^i[F51\_ W\XYG{ QǑʴŰ)Y_E9﨑e"itZJ9d08A oW"W;Ce}"ʎ;dGվjx\^ޏIS "O. fON Ě$\_ݐ2_jlH]5} 4S6ٯFwR05y+ӮN?rI7F^`<:4UOPE6}Ou,@ ߠ6#.rZ3B)V ISJWh0/,3~쪴t;p]VMnE kmVMD e 0inj2d^%4XO Æa̋}晆g-KmQvbY Ռ<G K.2Ga.x)" ƀh/Sdd+YѥIl\>VH)Z2싲;ۻ.;y˜ 86t[lD]3m\-,U,I\[9n/hR}[Ci#sރ0)_cB q2P`G~3:tRWY]ğE56[9u ױ1(Y oom"ڻVD+&qYb2_\;Wt1}D`cG.$ +MLo?CH)5`yA+AO )q" -2NԓÑv]ֳnB_gHM!2b! ## (LЪ񽴠>0C"N^ϳ#D#b0d ,'{tK.?p)fZ?ER$l3~wQblj$^ﻇnO%N8GQzKFz@j~H,[+cFE~ _颯]p-ftl>}/%'Me\qu^ J VbŠKi08)˚ٮW, =/^eVz͆Kӝ rqHM9!]}8oRALM7dZ_F˹Ykv/iOƆ^Hk ?08!R)RS;zG+#^wzq{%}"r ׭`/}%Yd;5?@kqͮz/Z9 &R?PԈrcz*s:¾{l%<5m1\^gÀ{N.e ͲPۑ:1&M.pT:DW<`A*H@C_ q~%3 ٕK(PѣMEn wO(Ǔ)gP)6F\[&2g"y4NԐҳ=WYЇþ;+O3F~@ˣSf?BͲ y Ӆa;9}铫}8GRZLt tt=htqѾWs8+H8lh}bIPEX7=95)*m)u$B6[6\*Ya*ݹ5>~hձs,@I6bhlAC4-cٓbm2K[e?(Rx ۞>oEykndsXxE'z"d.ԇwDws\alOIg} )FUq<%o&nA292%[+ "vb-YG: %ekCZ:1E)@[;1 eS?t?SBt4fpZ;ڀRM$^k,XEx<„muu6|ļmYK-]Hk~(tN4w)yM$4|2Ff.rp|ۡd]˜L$;MQ¤8CTXNi@ Aϗti#~Ep OpWg!=KqW9A31er61U{Ns61I'|ʻ4[ &QR"˴|Ӽ0]O04ch)%~dި:s<@ ZuiA?1F2&b;?jM>6=F\r숮 OmF,{$$Sœu ,{tvc2uVeAMDgJrlop_@A K!E ^ǚR>"@kF+j)ua0$$A@^tl18-.La_$I.GK4Ԅ[JOH`[\-Fu4Qiv5&e/y3-(d)9mZ>iպhލL ;':'ZC|?I>v\|{@aDzQT0hsW_c d9= G47^MUUӑbJ+YV:uX9`y96̍[}`aH&t{طȓ~އ#遡Ý^,ԩϳT' =&Hqh\{w謻l. b[b}dL3jy%Ў˜.󛚒*Py7^;>2Ui ػUY"ҢGS#vBi6T6#4郢^I)ȯd3:k0*ӨB#NŢ^'v؝^D$lK\ :|/ wҳ\ݲFMXzN@zU{pmY֙+#4I2N;'l 7>T:,cB&6>YhcףR8B- TÉ3O,g!?Um<[+5"Ajc)|uڣ "FSwkπn%"][ t%Q̣>,<~snNV`wS.{\F? H|/dȭNOٷv=/'d"<޷egYl 9=TFUf#sܕ[o ;venlakM'}N!DHewJO4N%8 ̭CB7Bc$e`T|?Tc T9)^a|mbY1@<u<&v|2Bqb ]I$;#.k#tZ ҳK-랰m ~NJj&aѺSWJ\o)~IHRqZN&>;zm* 4ifBTxMq3ݡ'FPD~#6ќNN?EvvKJƾV.uFP'e(y J7v s1y|f=J&:<5WuC1aW"{^fAձ9=HQgN6=1K==1X jߢnbdϽ];", \aIZ65z_dg n)73h;J_iQnwVm\Υf"og2…{u 3s{ ύ>Zt0)AЀxu` mÅK8Ў=?d2J5/ $;2 jm$ɐ.74il#]ctiҨ\Uܘ60}g~& eC݌F@5zR6)CNnb8|Z-0۔#.6iءV5 x$PO@t2ΰS {@sS' K_6`=4icr8>Z5Y9J+JQߧripfҩ/u 30LF!̇Ц I! w(5KgpsD,FGQ;X fGZyfKj2 bbB֊LǶJ##YgM~b-zL!HGGtPcPDRHc eCp_/EY L #=߭Ў'l3ػJB ΀@Vq±,fDÏĸ%l%?P~~G*} E,+R+9|koLuf#=p,;3CplAS jy"JWc'ះgBo,qPeIsG 87@qiiBfYc|G 7 {S`]#Pߜɨsa|s_j7R bp:qFy/fX62EjMiNgYQ~Kr.}(2\H6EVMcR5 al;J::]ΧntuvhzhShU0h?X>ˆ5[ն9ӏG,V} 6p$ߧ>rC諸4JnƩ+eBC. xio'!Zvވ}gS6x<+?UR32 !_} 4vVsŠPJ4(5 -șzmGS)0jh ? Bdȹy޾d*+$bT﾿0)~]xy)Rh7%sQ3Lάx_ w''G3?M-oψ_ ңҊpI)IUL$ޣW)5|L֡ĞYsL˖hmBߤݐoՙv0}%p7:Ea!׫bD&NІK֟h.F(0;B'b8zs?3P |X~9Wpxc嬍9еH;xˌJaOVGd٫vIlQv_)s Aepv:>F|h~ pʩE0<4M:F!]Dք:N14_a?ct=OX@߹M,Hn1r PN"B~'EM z{ xE,"E݇8*E ڍr>@-bJ lFJn݄0 Bg[I0oQ1 s&9`=mA8rZo[X L:]tlbHYe`F|# ,1aĞ}Z(FGS&5PҩF0W}H Yg$|6lY {ӻ/?%`M(ͮ_oĻyiVv>B7.|L@g=tF%L*j;R޳ɳFuǺԆmlUaۥsx ecm Uo!9 5ՙwN)#XC"F4 9TЈnipZݰE.R9ײ;[2g=} AVnޥ#ԁZGQ%|62 Q4$S)Xmh%фl؇ՙC.XH`0 8mUH6d"z@5Ak˅4yB]̒W*s]/ưzVѾhkstL_O]mm޾r[ lCn>Wc}%}kSXijkJ~Bag#KTז)$6O,Dj8+x=^}8b%0%4r%qk~qYGv)g|wsT.?q.odlkN*?%R4l_5 G)Mgh}E??k:X ւUylL3BƨRkV:p$A[;x9@%Xo{P<d_@ ;,h:;ovJrJC_.gEPٶLc=ESI-B{^~$  B (&Ϳy|a栐6a}דp2*Gwݭ=q[x>"gE*Y0rHAj{)\r`(dqpn|a (ߒ B)LS[5 @V‹Z![DcvYķԩ\ȋnUb~d.F]"7%{_+ ^󢤦@3Qj~xijdg:SbA7e mnw(^RQ vSNKS~X< LJ̅agM=(3ٶgXGƤӸѲcmԺsCzh[$c8j`ԩ E^6ǝ_&bܳ>ĭCc~Xݙ*Ђ G-33f7@uz*VD8KUy`VGLҬڢǪ4~ Dboκh陫z"qbv# խj,^`2cmeQ9S.N^6^eQqDp"? Ӹ7W7qilܛ?mR%SM8ۦz)/@W9 Z[t 3|WGD,sm20EVFEΑ4t\-Ft';W9CDͅc5ęTp*) #cDtd+6/>g#itFݟP"0鵼!䖖~G:A&К(C$:1lkz3@yVrN 3J )=PFX ? ,6NTH}n#oM]aQ ]I< 6~r^8. _ h Z+f`1:>ps 0K;vM$zfE׿Wo?ț }pmn秳vw=u21VZ鰕aAk&AA9;@չBh7n<+L85%tg |HwUWhM5`r3{S4' ^,K ahԫ&&cS9ПS2!j<-cgvPTE*F!WŘDvqkw3SH^H`ޠ ]0xS;׆zh#@NCu詧YREDu6ݷ;v{b?0J'J.?u4Ln|`XE_ \3tBc0"zYEo0AiZ7\v ;QI|9v->Dw3uq"ۛA3e}T8ZDeԏ䊷*XU0&ʮ wL:`VjO 0DBO" _ӊ4 e Qp:ʙ7)rDF3 }U%[ȹQ kMɗDsw,tXy5l~;TaPo._"S5}SL\c|^H"Ktt 8ٯ7Uc1lb7~opB2?Ԍ-d+Pӱl/EPVf0Ǘ;X]S.15]d \іͷb\S4Flnzf+~Zj4sF^VRIY[$>QSRpJ.Hmq"zMb`\Xj-_%<^y -av YgQHo vB֒7ު0Mb̌40Dw?:<fbW2-3w#[Ęz'>'i.ABKwE* Y[AtU2 7QWt '{PP2[naȾtED(eL;K?eX=Gڥ7\p!2EY DvXsR{D{GJnsjFd8CT ~q)ECc-kf[\I!bฤ*B"P`mTIH|JW,Du0;z:2Q:/)_Z'EnLw< g|~uSɃMAnbtUk&l{WhF;^x*jn 9+4cڤ| lɸT"*O7T1wfe~9\`KP8C<#<7ANO>Y %ZwGYI8ӽLai| ]pH'tBC_AP߅O].^8;+u׬..r RSQ'QzPB3!Tj!i='Q_f:!RYzEM g`>Z6 = le=*!o9kb X\Lu#q>?`˦?h3á [C4h+Ƈ%QI6+>u$߳BKQka_oyg:p?Bx:$yW|[~XCPco[7Ao NFW.d'c[Ģv$QMn&}.>eL:m p;6h[!to<8w6Z+{t^ʋLR A+e!]yR*Ӄr{:[]k{oϘҸ lVRE< X9O3n$/s I @`5QTn#}Dw@Q_)PbM=a4m*m.(FUNwj &vVA~ : 8Lk-<3<3b&|&)dК)_P:YgLjlls+QVщB:4 23YA`TrKϫ3*-W R0j7$!@KŌ= z93QR<@ͳ>ŒIhvnI U B ܫgZv8:Rg/)܏t[[*ŋtqdC[sNsAdnʞlj>ZE"BbkS ΧwPM^2;ܙZ3=睎GPݟ2Ih:+YĈ?bԼJYHhHVì}ИjR$i PإbsȜhOVtP!q'l.`$v1*]=^ VkL܍4lL0`x"T[Q4 6.'a]H:7"p$Eٹ !Um؈e/Ĕ5r߾$őґ6,R>M=ه{G+{/&lSQ=,_gqC]L^h}Mk†BCЀ)L.eT=N- C(ZeON2 [2+>V-|҂c f@<,֚}Nd"XuªHoRD ky:GQ~oŶ, d&nTχA1Y1r%H2˺1vj_cgbXaԙ,T1<0+Wx7͟Nϓ2(yxTEx"qUL49Bth2biY\X¥N4E &xb<"?nʌxbyyΓM"DGS[dAX S̊ۻo ֻ/oOn PCr9q>A(G;%ru׈*+21~/FbR3ni?6y#u_}fjkE Iꋭ) f6 ?#),ka-X3R$oxH5L"'4`ѧ۳n%C9sT"q T8esہ֦`(DՐt mV8:k}OhIS4HLN8^#6lP5!]8̬SsCAOzdogF >ݩX=\_mDJ+H }}$?1? lx-eEԈk9-'Ba :,7g7{Zs o_k+oܙa36[UsHWaÑP9>oL/"̟{R8ؚ6Vji*!5߾22\UT}$5djF05rxE7:O1C?Ўjђe "0$C${N}% 4\19A}iŗnU~xlirZ#] sUE' ʨVo.Q[TՂGcTk[ }'D+:>&l(y"^ߴ:w0c힜Gܓ؈P2Pnl (EtvN`>C$l+E;H{WECYt^OR4>?۹? vFq#U|;"ivRsJj.H|s%#%l 8ZiVDν`P 8fV1aRʼE){ aU5,p/N=y/FX%P)!E+e{7q OyPQf 3( gyʒǐ $Z.m.g;5Ѳ)a`0L *Z_aq}>\>wqvL hܶ,guHMtlhd4_I鿗{Β%[;9$Y.,ϧ#S"Q;"D2sETUչ5$8Yithq)]ui1~dbXNjToi"7_J9vQ3%AQ_ bvE9MJhm+b[1tj}_ T.`6.A%ܘ>d 3A}0mTEh(#^PFtvpEƖ.` fe 9 a/~$-H4= J#]#BrDUQ8X=tUK ?e }*\nήp/Ijg ZNNql˧$ni昢 27c%߆b᭏uv;q C<=l+ȇ_/# -p2Vd9:3/ 3cֵilunݚD|Q^7QV.V[{9ROz^ʺDϣZwhGpQck aF+' f{XUK̉>GqӢHg߬ajgÓ5bۀ禁wδB n8xUGFUiqjoiƈǡ5ZIq1 \ EhBّ McfmnM I~Uˈ@&>{l1z=f>]@qH4M|Rz_6q_F 3{b&-.4.qnj7:Pg,U901WPJ$U5"DI'Jv{#ҙyl0$ ?eB[]]OqgKU>4>$F4)0V$Vʐh1*/2Q,n=4Ц 6QMl4-sg#͓b&;q Z7kW@,!<,g`1 Ƭ^."!uELd_,ON̎gC tɪ'M`ej'K¿1 e+?D>` h2 ֻ2<:S$oH:(um->!` OIjXTvи:7EOo>Qgy(w8'qxxtmҔu)R٨R 忮>-F%! on(|vFbSI'l!!rɽ.mM!;⮂!.x %ƻ%zJad:$p|NKbK=Aӽb17"We)(Dcлy.gX!нca}HCV%$'J䶬#`-(Ipˀ'@E= L<9p2~r1 y~ C;og;[sߓ_KerNѪO˩#؊8+0k4!ir50^m}\s UlOP-v3,ߒ L&9M^W DPFa\oz;$OIpz75HCj$[m@:XO|f$<}ʪby>mAԈq$+׍'PO5#%7I8ӷ.9,)ӝ<>IZӯJ91+(THw_샊ݹO&1g [Ժ!\Dt_N Ǜ+ve&]R~jn > 6eu]gڙwD^:0\mYPsU04K|t^WΕ㈄Y톳*h:GVr~ˮ'&=T0-73,d5O+>3vH)ˣ~N/]UBcyWLF$:@n Э)T$:aS ex]*XJ R1; _ӼMXM Beyf_B\چ޾s&зXgg(0ʹBev^"z\~7M8tK&>F1mE <p?m Y3O\vgsz ܰaMG/^vS\ aO49rMj@R*M@V/P2& -oUSҮ.w:}aOi.Dcâ[,-/l  3OPHŁ۞}R<̹ʡtM7P>wy36x*Q.4"J?mh|V̌OFl;&Tc,Yv:dGU`D'k SkaUE[ӫ3w/O$ Rb?w%+D$x. NYaV }iO[&M8 ퟥ Ve>N o8<$E6 u*|4&^wHPHAJoʸȳش_/eƇQ1Jn|=if4z/(ń&8͔}Y~-yĿԾ RI2%藈jx_{8#KJzhR[9-q?Zuy9Άf2-bĥ$!bnp{ah{gy ^KNEXX9 ~gqgUď a_ToG|ןY$HXxwqz,2]xr ][܌!cIiQg KsHےWYF\䆘6iWGGTBRV`!WI?qW9 O;8p9}q}ﵜ%dpWERiH'1&WC,[,GGEY7H/sТ>ۅ[:0"Ao&Ty Tr)yh9eIzE6E {6]JyK ݾO*[>ԎIb:;WD7klj )]/ k{qi+,n<z+Ō-uLVٌu@IFlV4E E5ܱ̀45 -)"-M<8,` x߂ڣu#<.1tY`CCQf%M?*Qޓ$zD&ӓҔ+gjٔ2 gI:bG- SEҝ1Z'|e1c- S@w .J*Lyg~ sq/(fjªߠ#R**2TT H[$%2 ,bv])i6³Su~|a>p hf|J!T4CS`S(ZR#)~2m^yi`d$qLg ~_ٺ+Di{d(=BC굄Ä$~x/:C#*>Sy8Gӗ?mX#;6 ]- Z_">Kz%=z@˔p944;u+tAg,S3#-JF$Yd_JX:; 7s`I{gxsڽQ1fKzDiZNձzz%߷qx%`wmwPtqH0Q7n%)_u`4 Cz[3δ4g|-bѣK|4=ݡw[8JQ^ֳ< Ap=*ˣJ @~x|QJbʳfY,eFyDs| 2UFL TZ}  }r!v`;j!ZaItU(tD,$ֱFk2mk;Q}f+;G4] HzrS ۳\]{ {[8UTtw64a~"I"ݩ:wSb"~_hdS~ oҒGkaঙ("&p it1gυU4=JTbmj:^K Wɯy@wab7t (Ld6ٸF7I})-hI!:\H1bLISt )G*vEU.>bJS2kE_}âp© \ѦMy*YŨAECjC,Ԫ߆ [#bְ5ߤ&$HZz :+gEI|A%U4b5|w\bbbvF"rYtRroV%Db!4fL'R7H+y?̑땇޽Z+*i.tQƴP݁dt9xB#bF*4s{P#[0с+{?oܿ(o.G_fƛM8Ҏz1bO)Owf@9mIq# @ [*!y;c_8uIŝ ~``Ԕ;Bb~<ҼSW%`eb ecbz#,+˃z]osc ?R̻0]{ZT'[8Λ6֤X`Ա I{}B Ni<=dDp[3#^@oPw m]ZsW"*YVX{|,`i͟nOur[Шc3 ;\U<ґ״dlQHr;PaV2W+H8|1ra$h;\!9Gcѝ9)g{86N1aSy$iz85WpajM-g0wA F" h+pq\tc ^fDcr*(2CsDW}Dc%K ct f?F;Rxrk.4 Ak${E^ٿ |`4cR}rֻ |v:Zrnl$n͖@GTlxvLfw CBGe#[:hҁBÞ FM`ʣ]g3nXT:y q@2HZż|ikL3p\(gxڿ* k_Mk!Ԧ{X(Fhe4o9!tlu@2}@Xv'aO?ԛLe.8~WuiQ!6nF|5땓gjcq4[ 9\F^)]tڌI_lONaYWkۛE?Q|$(񳾶=gŏ` jljjha1čfmM oCR3^RN> eL,jT!?uiYd])WiT4Q!Ŷbuj[KlPc*tvF ŁX }|z\B4}s`aw޵5eyI3+sRX _-Qܫ֪x}"n{ ೘[s8۾οG0<{ބ3n,R~$]F)VRI(]d][ts$L,W2 ܇/Ӑ?0nZ)" K_ m݀A̖?Q*^6ao Y|6QpzVKNgkt9FYz7{du3Vs9,qNa]jXe')O'~Jh#6q j~.s )nkV:zżd  sl[1MOM\>`sS%C"A_fP 8yMl<}Z2դS_vs;C`';NE yTS35EQfp R)c9xfֱn&I 7kGg9Fk=ˣt"6K 2uD$tc+CXX嶨Sp[S V/ʪ(+36h+d!΂nx{߱HH& \dt vT”2K{ BnHe PbO: E'w}n-\i0LfH]9"s33VӞ(?U"|R[[d72K97\m&1w^\C` h%7e`x@ߩ覇7uoh#1pTvdg_c'0WΪLH<h^gD鏽Rx*edi^ ~ ?'}ͮhDu-,YF#xǘ nڢ-=U+Ņ!Ό7&GH 8 j$ Ԙ%TED;[Q1eBD+ρYbT5%oԵ51Oy /ʁzK9;g*HdMQHe᪼L\P9 <\.Z3QAf:RIW *z VA4a+ l!aXغl~P`*2-&tL"1H'E.zڮCN:zLa6N?tH\,΅m _9Q ":[Rs=+!jOQ8lm؅}1 `1"1ʅUxrB>z. ENZ\ ȿW` rJ<;F:sh}3SՐQfkDR  iʷ{i4a5vR&R ܜbm֠ےZ-N73my{oM݋(y%B,閼)v'qlWCfsDzb`3۟iD?Q0ɞCjڄx! 1KL9Ƨ ҿ'4o{j8,z##,İaT;tu1V2Oid[7)"^{m ܂֬1ao|bÐ#y|Ib оŏ Kk](@Aij{o@yAeI^DyMqԾ!FmĆLÆg7x*̈́kPcHfë: |^al_92\>m<AY={3i<|W=V{QdǼg0ob1^V7/= JZg2j׾?c7C,N⭕l|-PMe.~?Fa#gTfĘdXh.Z#e72,0~KՎC'7 qU<:GX$ }f}2 䆋՛n7uN3^F$ b2ĚB!(\ YNzl$2Sbۛaά ݂h5(LF' ?/blqT똢ֽ̆VLFGJ#B=3ۘ Rl ӛJLל.X|ZjY+Lqdݧ_J0#qbuzA[Nfatb("XCrwKz\Me, io1rύ0e*2%Dhs)֍D\1E 4$^dܹ_[;>rz96e.s'xxHqOH#騉AT/_&Ey8+ B4JGPk&vW5 "Q sI^ )D_L!)jO.W[zS PbmB݌܆DV"-?O꥛FM"u5LVe}re'@AxCs^2`tŕ!1SUa΅Զ^Dۚ7ȸV^Z n_!T9VmB>1!D7i34AKY6ҥIHI5P rF'~oAjQis/#ZC k</]Z8bd]Ѕ6wgX_|,C;y'/cB  yn¢5L^Yxo'%x~2WRBHOH;.i.!:ti@4CR%WY(<,9{!CsNЅ;+]>\sъ7oX\uxO> ycٔ饩 6g{~8b{Ƅݧ~8%oSнfasF囙BȒ}æoO!<^pҩGkhСŹPn}X N=.\* ؽ8H_ {Tc'P/׿CK9oSŭ{ZSa*ȏΊێ*h%s>ɻ %L!TJL׆TmV Llu832beZ (>i 2^5QWrxzܐGk, Ҫs?a\ϊ(VLO$*E= JQs 3y@:.^,KX\hvvNԣ><`A-lBPIT\daX~),E"tSӃ:~صS~AݬDލeNMaUM'n1lplNj)ݏ !'HΉeTM)`Myh{>k6(6]X*QAI6E֣"69`i7V7Mގn'K,k k8-NnokY9at}b@aYv[xc)p,-hL3$,|RZT={ (FmNA3osiݥYW \/L?s˭Q@UZ2 eQmo'}ukwҹ?0r6`:U!۹l!'x{z 2}#=J8cW1g"lE0[\_?z|貭; S#6bA]D[bp):)t/m#Ǭ1d=`n*(w?xGj7ß!z( ϣy!kܘAa7vF+䱅[VxK m>p#^vO>GO4"aSn (?l,ӼJӻ"9%-@(D7@LqK)14xqh~|,BZ-< H8]1m8DCQS*AVgV.9ݎi$(R#)Yf|uP]߳ ضP 6JFH׏ę0|&4Zأi"f# `bqWøG;zW85PEo`6JOJ/ :Oh$qҷAL6M'FYB2fqj܎ܐ_+eS8<#Zxuω:T"(wJFay߅a`2#;v+aB2 :팖= S_96/L)_҅78;}{Μ%`Lxq\UxRZ2!5襭7Pi-٨<'H{/oҁi~~u`yx͝Z V^Q>x%dFTP b^iR/60.. ͇q;7[Ts:=`pď*=nvX跆7bh]ɶ4ca; #0ސۿܔ$PR+ |}ݳJ/f% iX(v'1HWwn~fCV?BM;=PF"~d5S+؁Sy8ksjcO$$ME #"to ih $:B"4 wL#Eym4Ue2P%0m9$o1+Buyhl%Z=3/.]֔3ha^JV$CwLƂ[WtIӅֱnP\ 5,OۨW&}(\.|jr~!˩J}N{!HXB[H8f͎gtTOƒ3eP wxYz6[>Di }t\KB G`ah0*Z30DZtyKQaebxAWg=;-uDz)cL\ifXB9x:ywe!(`nkcuT'@-MEŧ&儩G>*p_I|p ωnTeg7~egd9ĦG%pH؅[nşj4DzL]fiU _4mF)wV~syӼtP@t/\N+K X4v0D  Ȉ>_4-`ws+O׮ğHĄeML<>]93>'RGjcB9J*TM}u̩5[s:T>YחHFn|f'{cSw-n;S Fwgl.cƜ>zg$᪗:E-7f=yl>F hO3UujQ bnP\g% l ϗ5>}%6 acH,YuYt ɏfHg@g=N -35ɂ1~I^Lb8\c$dp&6E!4bQ//fơ>I?z $h_r1 39[(7q;8E/@(nSY̜/^4;sjšz͈<}XBEV2N`EIA3 [j˂,UƗ'"=Oflsw`GJ +h#gZSLOfl/wh-7?#iʠ)'+1^Qےǂ PJeO4:fN}D9]Rq,@6%V㎾z޴Ms)6dKR+AR< |Qz !Q, dna~q Ow g(!”! ; ~Db]fVd}u[@m=<kK0lmvױ̲1Dʝu<+_ۊLg_#(*{!̞A9ќE`þ٩ڴ<ѻncRUP88 !L*=3*<끧q!{|{r%{c酥x΋\ի=6]ZQk{@AӏN/~BISǗyj."KZ@d؞fZoaĘC"OO,hQქ5U͇+sxd7ElfttV 𲛤ks-ŏEKk#d{K4=0o St@Ϸ(Xxx \[)QH[ͭV^řxIAf,#aw^7%_"2΄*2^u% mcU(\0ɔ.LG7HQ:S0w75/Dnj\0h AOHW^:UXQ_7C; M{qd K9<~[2cq&QF]> ) (V*Ovޠ'F]6={`mZc@^ ( o,Le\ۻ7Flټ9_=6ɨ4R8r-wM v<LFI0>GkҢV1A}"M=tmUۻ蚪_ %e\6 `'4O2x:)9Lqx\D쿼u\N+~ƾ\m"J~X_A %|.3./=, I\R:dxkO4 OTĻ֖sG;OeƋ& 2uNd2g3aQz0,{c|?0ܣX0x3o;E3Nka028QbT6NRt⃟p }P8(s)v^71aG)70ݤ""}:'~s)@4Fs! 7w #W4t;S ]N( hkjϲ7dۖ0x6;5 yP>"% X7?)v| A9s%:ҏ2 =6X1v+Qz@ $C}w/eN 4b34e{-γ}Dx ]n]_ZʶRO}Sob^d6 ]@ma/I;< ]sɚ'%[n.WIsL̖:^{PQ??KJµ<_i&e@~P]+jiVz@Oڴu;O}MOo>>>?>EaMLR (6=v `q Rf4&2:uW^tD' Vhp|MΒYA|JJЫx SMs8T"x(r1Ur~]5s::J#V8[_%-m8cv76MyS.;D\Ch^C2MV.'/=/k '7pPb m0/)p6& tcaSrhH:U1nlնǦlzA3BbI% 6x*Il*V*_j}00)~z?k.BJ\; #{W+Yz/} 7V&A+ ŸI'fƫ{j ilv:!KEC/<~t9Geۍ40Տ x{7!U4sV KP[o0M;؝Nv`YRzuu . Uƛ(&C'}Y D {1A`ӻ5kŘ+)~i,{Q[&+"/-P%m8sbTE̖y> 54b?l':, `N/ܲ2J4!~7<6Vk 4BY0%ĮOA.Mfծ4֟|zSuU&mwd IK6?;|D89c\Iia|{ HՆ|ju u#r_rk+eB_ʼ]ABwf!(jN+N_WV-Nr2$*T%:WnsemY&756}k4 Hf46'57B )7ā0kEƐڻmƗ!1*2 8Hm#y徨Q1m֯(K*'꓄-k.`s)ɉ"RoȣNa 1KpL`}㈭Põs NqB}]=YUf8 miDAgݑ'pzᘡJpTv bd'?N>]L]di~L>$ >r]22.`^M> 6_0twXtpG&"yv4M^޳AZ_,]o]]qRq 6B4rv.td`1S4%[}`X䵆Hi7T]rvAB׫Pܐl؛pMB2^ M-)XPܒ4q.t҂ӒgݳoUQb䏅Ż9- [A$QAsZZ,| \|L;MLl&t>ms"$n ;RMZMxW (=]m$!Jaπ˭UR],)Y*i$e+Nj qg__q4=ȟwڰPGXAӝ%mg̘/MBbTv ;LqH /kD!L2fF旊jfGeZ< ҐTqaYX Yf<2esb}}%[vS~>HRpeTqoT0lwcճȞr`qfI33 kXxt[|L%|Uc)2< ?)J|R ̀H9-,U 4 dOso &9dD+^@,L'p5QZʌ=5㰜/\x[^#mcMs=Kt[K&I/Bz4=”j.pů T/xO;g]vl:C돈'Y]Nh$<-4.OCab r޻591@شL 5ZI$g"& :Kyn.6V msz;<= T[Zdud2Lh.x(*](N"v[VpbfvʢK1v4u c>nރSMo:%> t dBܽ2> +0$?M(Јr.c 8Jqnшk{@S@C>8bR$GP 3V6/Xb6k;/) kfz{~x @%u4ّ 6oe`0]= :!ͥ S"')m.ߥd:Z_<$S:xMpN$F* t}n-kN|M'""C-= ,;D 5(mG3 CIx TDhQ LӒ r*ZZ1(Tc!'yi"^k|]n Y0MmhѺ'.Ɗ$͍#b]k21,QFCHt^, mQ~^ \vx>yW+tW>y%*SS\r gGSaYBZB+Ydih2pW0@z$v_"q9=u퉎i[$*<*X3 he4%de+Wq>\7t?ex{3_'N H5!=c#|cZZi%eː Ώ/dxz>y)!{qҿ_VpdQ}"6EʟC,B2Fpǔ˷!ڹ"p1rx`)yx͑F `(qb)fN[7j,˪bP+>wb4zlv.lԜ nZϛLfNtʥУt AH)O;u++oOv P#w(O w̺S3ㇿсʮr< 8`9\)& 94LlfAK[ J,].k%,svg(a@'MֿiWln3ICgWH}^3.*d"+Eh#' hc -=24z?Tn"hp %_EV1pEAKDV=Uةco4m؅$MAr_򏏇/H՚98Lga/y9phdz&ovdTG%~dOnxũZh|Ι|G.' A,1hvPIe-Ֆ-U["j&ˍPK쇴q9D/6B: 8Pu*b9P/ȥݳdqJȚ Ӈ>]a[/ #5ѫ՟˗(ŌpytϳtBo; I;ߡHA$Q?=R'نҝH*ee6,3Rl$@z{9ZJj_&>qQP,dsGPZ/[O +L(TQ+A#>z|*RF_dSoy]W#إ 4*uE(@hZ~'iǓ=DR p&4TS|)xb |wI'9p!um\ iA0L."Zg%5F8c+.ɬei7ƙdDm0~iu(D+_ӂLbDA豷ΒE4SdsFQDReĹ,;ְ*=l6l 딺%ER`sl23TO$) hY7a{|ǝ⩠M\V5ľUU;Jx9HTH^?$VdxdutNTTC#H' uuJ?rN~^`VZ3YHL[ڡt#F^F~(v@ 0L$M~Zmn!Ho.cQzQ} gwcbp:΀ aGS^J_J/u" 6- `Ng?R3r #~xsô\ƀ1^fN fk!TUɺu2g)s1*MI O/S\ʶOT;v. X 6eGRQ` 6T"In\QWlԤZ-ܐ] XpVAV@luX75Z?CwǼ%ҜnRFӫl;ʽZa\e K% B`nweP*0ntw!m=YEH?XOf(ni'eVcY~ɧPS`s!{7t6@̔2,>\rl|^ 4&_]$P*{DG=,z%)הҾlW܏y^cv/O1%K2]} r01p'q08ǤBD.#H22D }ї39@R]Ζ"| PDUo ͐@?%azW3ivoUhPEX? 7%Fo"KN9u /x. .T{oѱ 7X.$ a lrku]>v9hSGnm]LOߢ]{2.(dɒv<&xaqlE92k*+\zP7_B*564\ڦW:}m8 X̃ #9=+y0R2 ehj߳ $CevWsp z$@I>ʮQgWS98#q TE:1 eAoFx~cY'U,c$9 {VCpy"|씫1pk!xh,FPu=(ͪ tUP(ouXOD0"Э' 6Vex%|ϕAIbYڮ=-AѐzorI?x$.lm, Kjd`"v/E9k^5&kKMi(V"5uY!L0sv[g5d ڡ<hm'$ ^!uXr**z->ZL̇ф# s^ fn!$׃ `0>z&xw5}3 pawN.K1Q[lE#mϰɴt \P1uF,gi> +"u群=Wtőh"=$vM+ 5{j%)\,˓LQY-?t*\o:n4&H#mHS͂-ω$2PpUb[-艗2AOv*4ff*,p2zl3Rm3z5I}Ĭwey&p5=*BZ;Zʧ{r҂7 TʭÈbU4BR 0Z#oZr8y9+ow?-#ZXq_8( gG|T-[p`0gY; 3@RYa:/Rx.3#n`䥯\ Vt~^HVā4$lPȺ W#@Q Tq"n\ GV購ɟ}ƛ\Ѫ0 ⋈9;Sy)\tX:n]. 1`P{{U6{b!$>8iܰ8 R/ч2Ȃћ)jIF#,IqQ k;:!V pO/ͦK0nIyZeӃeqj `ǰš1]k?x3rOSA [L9!ɂwYB0 iB%e"^vMޞ9m} [eC5Ne;3}!.h@fXp](>B!]^2I@]ځaln/ODV@r,̈)Q:91| Qq?ÓVm(8m, ~r\T71O>G/)d Lqm5]Nt{mlg{lNHzAQU$}28vg5!}:rH__˴e@&tg9UH1hWa ^\VډgV> $)5F#,1S_W b"coeqyx!tu$o ڂdQ==v6Lڤ'񅸋1gT@yK]9G'szps|| ͚q{zoOAK{8On:3&plՍb8Nz2?$` yé͏ioZپ;.rMdf4:A( juLTaF]6ĒJ-$yP ݽ je_^I-]j֣KbŨi=Չn7/nSyM6*}&Z; DYFmh *]i:i Eհum9UKqҽՑ/-gBAizi n~ 虱\=^[9rLwQe".KQ!fvX&Yw%AE$'(A:3M (u]Ȏ.;6=PUi3=qy^/=fPE,%+5)y Hwv ߷mt =VxB4 ^_!< y9*刀 S85*5!!t&!rxA,|RYiM.7~['i}La^%h[Y V8-l`q2Np;xh: |U{nvWp"~Pv*A>p2kU^Te)$"|q!³7*A! `΍c//ypmDdZRUT f,OM(>*+]B UTW0%TYNْuN$+o!˺KKB΂tzay<r<.?dk*{7wT5!ƾLNC>QmQʿ*;%#d@\ni݊';DBHuM~~$A|``8Jrd1PbJY'˕s !rdkXG׆ `X9rlpR&3g}<(k!&FAs7 _NOkBO'4})9 wpO͂髢h]nQ&^U;b։ZWֿ}uӬAMn#+S?hhu^kzeTC\ 4wyM=:6kh{F D>uxnTDMʔ4WeM'u9QIUd9gLF;' V5erkThSȌIzr˜.r&گT25D5ѰN|ҫ8I4X 9S!  }9\xA[`v> wGzK|䍈v5&ՅNj W8T7 /9oe*eT?.>/ ˀYIlJ[D^}-_b}Fp;H;_ff=ZGN0lTkr4F&Q'w@Es^/ް1^7! 0n/n1E #־ 92Dp2WNhCR,晇~BbAA0_?1B#F 8j;v_FN#R>tc0e[f/}nX5Zڨ(POLhb !S+vM"%8xmЯ= iI0#dZI~&)hLZI:g xe'v OKFw|$``dmn¨2 'kިfi45x~%C/1D8 פvsFr(\Go7C4Xtۣm!+͝\%zqD)hu:Lײ<yBUQjg0A@EC.M o{<(9뙭#o+΋Ɠ3Wy6t| .0oȗ16E=ml nCqlBsrqA.b./".2Ϥd₵*KOsB+uO4hD )'^9W4qDJLul'm[nVRx[X9&ÿ8ZQ Zo?5sc.!K_ |IZL!h$Hv˞察wA/nv^>[=KX СLqU0(w`˙tA"'3Q8\#9963ͪԆ_=IBǣԥwk3T@>gl.;\ҷlDx?U"~@AIӏ7smFʀ^eaQD-a(a1$5_yuX,";DRa߷\p7i#:# u{(mU yWs>CsWhcHrF"W`j󸇆+ڋ$GG˺e3ƭƊ>ڶlʏ!'&8JkƵ xGyzw@LxDn~JH*3i7ONeڪ15>hn:i~-{GS8>׌bXDgQ\0NmWWX6AnmNS SQ` ^k (ôdPPr'a(1!d-V3(fw@0GlE7AVIt[a K7/UC{ }sg ^9; @.F^@M։PǮp_U T_<-;1QCb{cnڮXM:z;|o 펵<=M{dGE[}#xu֯$9-bdi*0"!4=_s#-L9#/b@xP*ߋ\y[ƤVgB4\! (+MBd9x2Aw ‡$>qWѪI$ .]w_ ;/R 6Nt5rڀi:h{S!kj/7|$3(BcI`0̍D?$܈jUEeK2$Ӹa8miW끤3O= (c스)oK=ͳMo}d<|h_|V˨`_eо@j<_Fr'1u*B)7D'A U.Y-Ǝ"7~mPHg* woIɵO&Tt[|\nO yr-F⌠C[r@Y*n. wlwU* ;+J &I g|+bvp<>x۫(r!] vł $D-r+w;W78Э10>Eh9}UFbGDڬrxV]mj͎*JdnwYzb+&(YD '3#xIl_-VԊdЪK ;XQНd^f8^n rY֜@䆈c `YLd)ZE)Bڅ)JY8GOcN&f\`ݜQe\sV߭8dJK]tI+zP24 3/̿ۖAHwܗ2Eɋ8{ (?L۫F,Wgxx<>Cig~0竾GO3p UĬ);L%?L=zzFR(jf+ԟ[]gRrg<J>zVlCZAQ0?y48z|Qꇩ9܍ܔq3O˳ J ]vOꡔ!I:Lxd<*/1ҭŤ;|*ra} ^)3] l?ʻt;iհ_+@*;8dҢ"X C~~ɸ4kYDMW+q9:u6=M=N(8J3pf{q4%ydhC߭_֠Zq1ғ$3ːa7&EiJI.3ص]Y7v m/:%ÜY363c 'y`M$3ͩՌ `slQƲ+% \СVߥ6z2f|G7˯oX׿Z$ofat~oY(89tSPEJN:Zu91;ƶ%^0#pJ'3?9P qzrոN"#?frBM]ns-vKޕSZK=![}T_ٌ K޷)kyW#9k-n*Otv9ZbE7o*KNBmD_!_u6t;#6Seǎْiip1mf#s:˄:-n ]'8z53XupLW,bKYn]X+xѳ`ξa&)E@&udޝnP XNjm|?\uoK5x-AlVyzWS7[iY.1@?og9_E{_P\4vlB:OS+(;VI79z6n7סӝq(yҭ rz^&5Y9\,f]NABkt@sk2az {[>x8#uCO48npw률J 6o0 ̶?"p/@)Ί p! GYN6GypiK=-#Ͽ#BRA%T7׎<l y?mdP)?ߍ|S00{, 6z $\~H>u/70'>O~/?WJnDK1$ F e]*x S|ʠG+׫Ť2RS=U>\ ;Tps%#AWlv ,FpV k Aby  $JȥČ?9ʩlbT>|/z [1 q*%iqb~#O$ Ebe;+.8?ЮZվ" ǖMpSMw =s_% RlP(mM7=uB<`1u` YHlHG, Y[vȱ 7t/)ggxM YqQ ΦXxrl128otP.OQ LhD\'?j6)[aU6H|8S'ݟ]ܼwa+v7Ů> }a6 >/ E$ʟįL˰ NNW}GGn 7ЎLPòd! 2#%tNVZ~\uPe \/Y ]eH=h(\NcXbF| UB~J{|>i%mݥX\73O^L_e˂?|2dcJ`T -tHds0% |g| hB-O7p8hݍ eV=)0|!'8_)k n=(t d5 m4}k}a%YM$K"Oe_rϴ}Gx|KSb3H1Ⲳ_UM hƽeu,Af3K0Y$r>!ܩϼOavSʈ|:l_K\b5ӥ>% GL dĨW"cuea@i4$ ͽON  >"ZbN^bW I8pZA,]VdţX^r%2@&-0^̏e*N05Ѵ }?\Cgo0u3בXFɈQqc 2`:}4M$!"v{<4ǀ ۆ&~3NoޱT9>R&IK|M|_1F."q6Rgfk}mYF ag3_A`G#۝u85:Ծ#tDnؗK$cڎ\jDeUQ#^s&:Lg7)mx!RoXy 5$"#_ϘKA͏3;~+y[5X&_-Uf>B %67¶6VH(28wfvU<1\};:WyS$ 5|Hn&~tK{mI`W+Bc?lʜ**cJ 鞝%2\M<Z҅]K2u|ygȻ-U?)n鍀rE6]D.{qR [c $Fʥ)D͒ﳚBaj:OW\oie z@R׋5Q_$va_"PpK +aYoZS~\5%4yX is(iKFI0LW0 ~%H#Q:9BM]`RBqLv)N 8;VA?3z8:Z60xlm6Xͳ`K`A9 nؕQi̙{Cr]ڕjD`lӕs㤎  @bހL 3ltʊEYW7c3!4^JOD:/<d3n$ 8ܘ!mUr|" +)e`7 h.=jRiRÞ@1лP,I 5u&aD SG$lzzVtCD\ bH/HUUtҳx,Èᒴ{')7: 3R_ K媹6O'kk}yNb%༉]|WIϋ{13i%p#ViR %j(Otgq}-)Vė QVkhɀ TxܫɝYf3~LLu}j]騫޷c(AN ܀C/<ݽa.bzSd H[Q( >oA'e=`03'Ԃ NJ]fR׫@x WHb+2?}+M.7lQwkA QLoz\yR0 %9fKdv bM͠.]U4JϯNeJ26hONSWv"Ư)WP W<<~0pe i7BDaĂ%JB,$|@2(KN0٧(6Ɋ_U-zϙּ62.-pP+Mn+]XH"')Q{ŠԲF>S[*=@l̠4Est'okQzo\64n״ `&ަk8TL-6]5Rm[2껆v PڽiR [TEF5=UpޮU)yW6qt1 1,6 \[;zrdyUʘ:SLhCv7 ŐfU^h$.KJkyvžD0AӸ$:8cғ>PF R]YʑrLMd1Kuɡ*ĒV&t-@pxu@m\Fcwh`|` ez6#7֔TKKZw7_ R{6 RaÎhl hOߣD~jS a-d]õGbZYUB'NK԰K)(6 H%N>X j~iɽG,U` ;!>gl5 fo #xnhEK3eJf;bIۿK rqТ](!A q5gxM>@4נuD7[㜪Lj UoI0dA"n_o K!wS@֘;mv_*٧(~vWo x헆]hE0udzGc^׷l}n$Od]IO3EaھzPTe·!1VUJȬ-TE|;.rxzg|r|pÙmQ1-u0 5@ |qIГÚg:ȶOt`$A.&6SςgzȈ#M\eqMH*z"鐉#ֳgxhD1>iMcT@=G2K=KJDC]^Fd&P((۹&J?a;9!5Pa ϼ<ݏR":ζIڞې'ܡa=>?3 *JXu7B=ZU-|JqLt'@-!BϦ-F)j)N_sVx(#3p`G홴jˠ*)>[BlbеQ봟#ɢeM}˛7IS*&2/'Jh@ eG"ki Eo7c}.gS / -J@6|B 1 p~bĠia>tnxv!.t$# ES}|dV!K[Po0-".o)=4<ҧl꺘+%H֛(71Kutk76i^Iq*i_"twa*+97_K@y4c,.n@xrKu * $e %@\ ]L&zF$tqg:h_!ݤ QV2-n bX HCVcP ٤{LPau8<\..*M jckMY2۰!w/F\2  $ \"`wVQ8m١M'SA 䞒OS:iH1knLt;!(8ˮrImf5Ta.@"Y+Z杻:WV_B홅Gϐ<_788!KmȬۇQJncjG` V.R58}uLx3H!G`(KX(a?Kp>|$sXT\*%×kSpSVG^㣓bmaw|kO6xCo@ 'fNz9QD/+L0Bajl.d mkʉ5!礉ZNJ7 Hy[W@]@rx֜ߌO~-zwzOvxCZzx/$É#sS$8(Y9g42Lh Y\}$G"ajKJl,!X fY-G :+%K0:]hd(z Lۺ%GF#453h"Dy}o;W)'OdMWKd#eX?В!U lv}\1#1MW{h$HJ#5㭸btݼS6'XD~ wWNc+3rx{4&wQ+7GG2\`#! XYid۶HFX, | ES `ėzNC23|]1s}.im!㛌baZC-`(VO 5ܻ 4R?%SY~2obDAOB{!߭Y'{-b 1 M)ڡK`[cRi?-8eۺmnRr%WU(j5{+'K/}aWpfWO3Fb'#ZsHtB6|JhJ0zE?!V3 PuQ!VTLլ2&?)LT؋0aQauxbɣc> ޢ^ i8!.@>簩<jcf ?37*52%N#w }0C;h?+]SLq[M2@!!'e4Qt[ۜP`Ƃ\OH7<|#=PE[ ^.+!i$ʃ6LD\bgg )^"ɰ1nqQuk)(a%A9GlI5N(&xf ){Gm)D攸G9J ?kf2W53`HX12t6J/6b0-C 5t̛лg T H%н*eS$gvS\S'(kiVZ"*O_N93oP\]C|Hvy{|5Ɛt@8KjK`aaV+1)))!/=5a1.v"Ph uEMNѥzWF2cKFq1>y1hNۺ~1JӖAFT( v +tTW8Tu[.B8]^r4d[zM3L_m'Nؚb9agixhR:dpzebkv7#sJUXuZTM[rwؒ1B;zGhn ~z#`Sf!:x2kw۠=SW?x}ú2. nwZbG`iuj_!U?>-^Nza41S[1&6fi,59&1s -> fٞ兹,ٞ݀JHNeM3D6vk N ,N}q z `+ 'a'׷Q%8+"|ɔuYh*l -aa =J xK rl$}OK$ -t'EpBiyߙ( @@Nd!IV0$.3DJw.9pS{$ ˕> -*#^˔t;l7/-Z%n+@3>n0SŠP2%]˼tr>54,l@ƘFhў#Lw*U.UNU"+\Т?~#h/m.qA0Q4A?2GcǾz&[)Wm[[unֲd[y7\bHzMFC[1ëΆ}įJW&ݦO:3SԱƦf~VNOKACkG`$˳ct6i[vpy0@ti"1eXAœ2iRI-n zm۾q嬆53)f=t,^[`=l_')UX :5w S 8vp_̒A4fpƮa#Aߑ Q;?.;5,X^?BYXp3б+ ;qo$HNEEn-DDЛc$*񃠉$3jPed:&1'|7]Q@YZphyloseq/inst/0000755000175400017540000000000013175714136014431 5ustar00biocbuildbiocbuildphyloseq/inst/CITATION0000644000175400017540000000113613175714136015567 0ustar00biocbuildbiocbuildcitHeader("To cite phyloseq in publications, or otherwise credit, please use:") citEntry(entry = "article", author = "Paul J. McMurdie and Susan Holmes", journal = "PLoS ONE", Pages = "e61217", title = "phyloseq: An R package for reproducible interactive analysis and graphics of microbiome census data", Volume = "8", Number = "4", year = "2013", Url = "http://dx.plos.org/10.1371/journal.pone.0061217", textVersion = "phyloseq: An R package for reproducible interactive analysis and graphics of microbiome census data. Paul J. McMurdie and Susan Holmes (2013) PLoS ONE 8(4):e61217." ) phyloseq/inst/NEWS0000644000175400017540000013423513175714136015140 0ustar00biocbuildbiocbuildCHANGES IN VERSION 1.13.6 ------------------------- BUG FIXES - droplevels suggestion for sample-data https://github.com/joey711/phyloseq/pull/476 - DESeq2 migrated to suggests https://github.com/joey711/phyloseq/pull/533 - `extend_metagenomeSeq` functionality https://github.com/joey711/phyloseq/pull/533 - bugs related to previous version distance uptick, mostly in tests and vignette CHANGES IN VERSION 1.13.5 ------------------------- USER-VISIBLE CHANGES - Help avoid cryptic errors due to name collision of `distance` with external loaded packages by making `distance` a formal S4 method in phyloseq. - Improve documentation of `distance` function and the downstream procedures on which it depends - Migrate the list of supported methods to a documented, exported list object, called `distanceMethodList`. - Improved distance unit tests with detailed checks that dispatch works and gives exactly expected distance matrices for all methods defined in distanceMethodList. - Improved JSD doc, performance, code, deprecated unnecessary `parallel` argument in JSD CHANGES IN VERSION 1.13.4 ------------------------- BUG FIXES - `psmelt` bug if user has also loaded the original "reshape" package, due to name collision on the function called `melt`. `psmelt` now explicitly calls `reshape2::melt` to avoid confusion. https://github.com/joey711/phyloseq/pull/489 - Fix following note... There are ::: calls to the package's namespace in its code. A package almost never needs to use ::: for its own objects: ‘JSD.pair’ CHANGES IN VERSION 1.11.3 ------------------------- BUG FIXES - plot_heatmap bug when PCoA/MDS used as ordination method for axis ordering. This solves issue 420 https://github.com/joey711/phyloseq/issues/420 CHANGES IN VERSION 1.11.2 ------------------------- USER-VISIBLE CHANGES - `plot_heatmap` replaces `geom_tile` with `geom_raster`. This should afford a substantial speed improvement during rendering of heatmaps, according to ggplot2 documentation. This also solves Issue 401 https://github.com/joey711/phyloseq/issues/401 CHANGES IN VERSION 1.11.1 ------------------------- BUG FIXES - plot_heatmap y-axis CHANGES IN VERSION 1.9.15 ------------------------- BUG FIXES - `phyloseq_to_deseq2` was adding an unnecessary pseudocount of `1` to the count matrix. No longer. - Originally described at https://github.com/joey711/phyloseq/issues/387 CHANGES IN VERSION 1.9.14 ------------------------- BUG FIXES - `distance` erroneously transformed Rao distance results for method DPCoA. Now Fixed. - Originally described at https://github.com/joey711/phyloseq/issues/390 CHANGES IN VERSION 1.9.13 ------------------------- USER-VISIBLE CHANGES - `distance` function now supports "wunifrac" option, for `UniFrac(..., weighted=TRUE)` - `distance` function regexpr-matching for range of variants for weighted-UniFrac, unweighted-UniFrac method option - `distance` function regexpr-matching for `type` argument range of alternatives - Proposed in https://github.com/joey711/phyloseq/pull/384 CHANGES IN VERSION 1.9.12 ------------------------- BUG FIXES - `psmelt` function now properly handles single-OTU data - Related to https://github.com/joey711/phyloseq/issues/338 - Builds on https://github.com/joey711/phyloseq/pull/373 CHANGES IN VERSION 1.9.11 ------------------------- USER-VISIBLE CHANGES - More robust `plot_ordination` behavior with clearer warning/error messages. - Coordinates automatically checked/assigned to OTU or samples - Attempt to calculate OTU or sample weighted-average coordinates via `vegan::wascores`, if-needed - Species weighted-average via `vegan::wascores` supported now in phyloseq::scores.pcoa - Related to https://github.com/joey711/phyloseq/pull/364 CHANGES IN VERSION 1.9.10 ------------------------- USER-VISIBLE CHANGES - Massive speed/memory improvement for UniFrac calculations (via `UniFrac` or `distance`) - Added unit-tests for the correctness of UniFrac results (no bugs detected. results from pycogent) - Moved all unit tests to tests/testthat as recommended by CRAN maintainers and testthat doc CHANGES IN VERSION 1.9.9 ------------------------- USER-VISIBLE CHANGES - `plot_net` faster, more-flexible network plot with improved defaults - https://github.com/joey711/phyloseq/pull/353 CHANGES IN VERSION 1.9.8 ------------------------- USER-VISIBLE CHANGES - `mt` includes other corrections, FDR by default. - Resolves [Issue 59](https://github.com/joey711/phyloseq/issues/59) CHANGES IN VERSION 1.9.7 ------------------------- BUG FIXES - Now requires ggplot2 version 1.0.0 - Fixes bug in which ggplot 1.0 breaks in a phyloseq vignette - Resolves [Issue 347](https://github.com/joey711/phyloseq/issues/347) CHANGES IN VERSION 1.9.6 ------------------------- USER-VISIBLE CHANGES - New `sortby` argument in `plot_richness` function. - Sort discrete x by one or more alpha-diversity measures - Solves [Issue 342](https://github.com/joey711/phyloseq/issues/342) - Resolves/merges [Pull 343](https://github.com/joey711/phyloseq/pull/343) CHANGES IN VERSION 1.9.5 ------------------------- USER-VISIBLE CHANGES - `microbio_me_qiime` function now handles string study number for first argument. This is in addition to numeric study number, already supported. CHANGES IN VERSION 1.9.4 ------------------------- BUG FIXES - `rarefy_even_depth()` function no longer enforces an orientation. - It used to always coerce to OTU-by-sample orientation. - Solves Issue 320 https://github.com/joey711/phyloseq/issues/320 CHANGES IN VERSION 1.9.3 ------------------------- USER-VISIBLE CHANGES - Massive Revision to plot_tree() - `plot_tree` now uses the `psmelt` function - All covariates are available for aesthetic mapping. - `plot_tree` substantial speed improvement - Uses native ape-package C code for tree computation - Efficient `data.table` consolidated graphic data passed to ggplot2 - Additional arguments: `treetheme` and `justify` - `tree_layout` - new, user-accessible function - for building alternative trees from phyloseq data. - Foundation for solving Issue 313 and Issue 331 - https://github.com/joey711/phyloseq/issues/313 - https://github.com/joey711/phyloseq/issues/331 CHANGES IN VERSION 1.9.2 ------------------------- BUG FIXES - Large files cause import_usearch_uc() to have error. Error in paste0(readLines(ucfile), collapse = "\n") : result would exceed 2^31-1 bytes - Solves Issue 327: https://github.com/joey711/phyloseq/issues/327 CHANGES IN VERSION 1.9.1 ------------------------- BUG FIXES - Bug in `psmelt` causing unnecessary error for phyloseq datasets with empty components. - Solves Issue 319: https://github.com/joey711/phyloseq/issues/319 CHANGES IN VERSION 1.7.24 ------------------------- USER-VISIBLE CHANGES - Added support for [Partial] Constrained Analysis of Principal Coordinates (CAP). - A supported/documented option in `ordinate`, supported by `plot_ordination`. - This solves [Issue 312](https://github.com/joey711/phyloseq/issues/312). - The `ordinate` function now takes an explicit `formula` argument. - This facilitates reliable contrained ordination calls for: - CAP (this commit) - RDA (partial redundancy analysis) - CCA (constrained correspondence analysis) CHANGES IN VERSION 1.7.23 ------------------------- USER-VISIBLE CHANGES - Refactor `plot_ordination` to be more stable, error less and give informative warnings. - Expect no critical API changes. Some errors now informative warnings with useful auto-changes to parameters. - The `type='biplot'` option no longer hard-specifies a discrete color scale. Available default pallette should work. - For `type='biplot'`, the non-variable (Taxa or Sample) label will always appear first in a discrete legend. CHANGES IN VERSION 1.7.22 ------------------------- USER-VISIBLE CHANGES - Revised psmelt to automatically modify data column-name conflicts, with warning - Udpated `psmelt` doc to formally notify users of these potential conflicts. - This solves Issue 307: https://github.com/joey711/phyloseq/issues/307 CHANGES IN VERSION 1.7.21 ------------------------- USER-VISIBLE CHANGES - Updated `import_qiime` doc to emphasize it is intended for legacy QIIME files. - Much faster and mem-efficient import of legacy QIIME and usearch files. - Uses data.table syntax to better manage import of large files. - Entire HMPv35 now imports in about 1 minute, low risk of mem-swap. - Added dependency to data.table CHANGES IN VERSION 1.7.20 ------------------------- USER-VISIBLE CHANGES - No user-visible changes. All future compatibility changes. BUG FIXES - Unit test changes to work with upcoming R release and new testthat version. CHANGES IN VERSION 1.7.19 ------------------------- USER-VISIBLE CHANGES - Documentation revisions. Faster examples, updated links. CHANGES IN VERSION 1.7.18 ------------------------- USER-VISIBLE CHANGES - Fix minor bug that prohibited parallel execution of weighted UniFrac CHANGES IN VERSION 1.7.17 ------------------------- USER-VISIBLE CHANGES - Added `import_usearch_uc` Added first-time support for usearch “.uc” style output table. Addresses Issue 286, importing from UPARSE. https://github.com/joey711/phyloseq/issues/286 Further feedback on performance, use-cases, should be posted there. CHANGES IN VERSION 1.7.16 ------------------------- USER-VISIBLE CHANGES - Fixed minor bug affecting legend-order in `plot_network` Issue 288, https://github.com/joey711/phyloseq/issues/288 CHANGES IN VERSION 1.7.15 ------------------------- USER-VISIBLE CHANGES - `tip_glom` now uses standard R clustering tools, and takes their arguments documentation and tests updated to reflect the change much simpler, faster - `merge_taxa` now uses abundance to determine the achetype by default. Previously arbitrary. CHANGES IN VERSION 1.7.14 ------------------------- USER-VISIBLE CHANGES - Minor change in mixture model vignette, revised graphic CHANGES IN VERSION 1.7.13 ------------------------- USER-VISIBLE CHANGES - Deprecated originalUniFrac() internal function old (original) unifrac algorithm no longer supported. Addresses Issue 66: https://github.com/joey711/phyloseq/issues/66 CHANGES IN VERSION 1.7.12 ------------------------- USER-VISIBLE CHANGES - Formal deprecation of functions using .Deprecated Issue 269, https://github.com/joey711/phyloseq/issues/269 - Fixed bug in interface with vegan::fisher.alpha(..., se=TRUE). vegan doc states that this returns a data.frame, but a data.frame is not returned in vegan version 1.7.10. phyloseq no checks output dimensions before processing in `estimate_richness` - Replaced deprecated functions in tests and documentation. CHANGES IN VERSION 1.7.11 ------------------------- USER-VISIBLE CHANGES - Adds warning in make_network() and error in plot_network if empty graph encountered Issue 275, check/warning for empty igraph objects https://github.com/joey711/phyloseq/issues/275 - rarefy_even_depth() messages changed from cat() to messages(), and optional verbose argument added https://github.com/joey711/phyloseq/issues/263 CHANGES IN VERSION 1.7.10 ------------------------- USER-VISIBLE CHANGES - Fixes build-error originating from change in ade4 NAMESPACE in version 1.6.2 - Change minimum ade4 version to 1.6.2 - Uncommented examples now included in documentation for DPCoA function CHANGES IN VERSION 1.7.9 ------------------------- USER-VISIBLE CHANGES - Fixed typo-derived bug in new vignette. - These changes allow user to build from source without error. CHANGES IN VERSION 1.7.8 ------------------------- USER-VISIBLE CHANGES - Package dependencies reduced/clarified: https://github.com/joey711/phyloseq/issues/259 Should reduce chances for collisions with other packages, and related issues. Removed any dependencies on the picante package. - Replaced picante::node.age() with a faster implementation, node_ages() Appears to be 3 times faster. Speeds up UniFrac() and tip_glom() calculations. CHANGES IN VERSION 1.7.7 ------------------------- USER-VISIBLE CHANGES - Tree fixes: https://github.com/joey711/phyloseq/issues/235 https://github.com/joey711/phyloseq/issues/255 - If a tree has NA branch-length values, they are automatically set to 0. This occurs within both phyloseq(), and read_tree(). - UniFrac calculations require a rooted tree. While a rooted tree is not required to be part of a phyloseq object, it is a helpful default behavior to select a random root when UniFrac is called and the tree is unrooted, flashing a notice to the user. - Precise import from ape-package, rather than full-import. Smaller chance for collisions. Precisely-defined dependencies listed in NAMESPACE - As a result of the previous, phyloseq defines a placeholder "phylo" class, extended from "list". This seems to match the class from a full import of ape, and is necessary since ape does not export the "phylo" class. CHANGES IN VERSION 1.7.6 ------------------------- USER-VISIBLE CHANGES - Merged branches 1.7.4 and 1.7.5 CHANGES IN VERSION 1.7.5 ------------------------- NEW FEATURES - User-specified axis ordering to plot_heatmap() - User-specified axis edges to plot_heatmap() - This addresses: [Issue 237](https://github.com/joey711/phyloseq/issues/237) [Issue 230](https://github.com/joey711/phyloseq/issues/230) USER-VISIBLE CHANGES - New arguments to plot_heatmap(): `taxa.order`, `sample.order`, `first.sample`, `first.taxa` CHANGES IN VERSION 1.7.4 ------------------------- NEW FEATURES - import_mothur now handles more formats - Added documentation to discourage .group/.list formats CHANGES IN VERSION 1.7.3 ------------------------- NEW FEATURES - Added phyloseq_to_deseq2() wrapper function and examples for computing multiple OTU tests using Negative Binomial model and GLM (DESeq2). USER-VISIBLE CHANGES - Also added new .Rmd vignette for using DESeq, with colorectal carcinoma data CHANGES IN VERSION 1.7.2 ------------------------- USER-VISIBLE CHANGES - Reformat NEWS (this) file. CHANGES IN VERSION 1.7.1 ------------------------- USER-VISIBLE CHANGES - Rmd/HTML-based vignettes. No more Rnw/Sweave/PDF - Updated installer CHANGES IN VERSION 1.5.23 ------------------------- USER-VISIBLE CHANGES - Update dependency from igraph0 to igraph - Requested by CRAN - igraph0 is being deprecated, removed from CRAN - igraph is actively updated/maintained. igraph0 isn't / soon won't be. - The load bug that I could find from re-running the tutorial in the new dependency had to do with accessing the vertex names. The appropriate function is: `get.vertex.attribute` which was not used previous, but is now imported and used in this version of phyloseq. - This also closes [Issue 247](https://github.com/joey711/phyloseq/issues/247) CHANGES IN VERSION 1.5.22 ------------------------- USER-VISIBLE CHANGES - Fix minor bug in `import_mothur` - Bug occurs only when sample names are pure integers. One line fix. - This addresses [Issue 242](https://github.com/joey711/phyloseq/issues/242) CHANGES IN VERSION 1.5.21 ------------------------- USER-VISIBLE CHANGES - `plot_richness` / `estimate_richness` updates - Additional alpha-diversity measures added to both functions. - New argument, `measures`, added to both functions, allows user to specify which measures to calculate/display. - Also added unit tests for both functions, absent in prior versions CHANGES IN VERSION 1.5.20 ------------------------- USER-VISIBLE CHANGES - Bugfixes, `read_tree_greengenes`, and a `replace` optional parameter to rarefy_even_depth() - read_tree_greengenes() is a new function created specifically to address the problem created when the greengenes consortium chose to publish their official release trees with semicolon-delimited node labels, even though semicolons are also a special newick character. The semicolons only appear when a node has more than one taxonomic rank assigned to it, which is rare in the smaller (lower OTU similarity threshold) trees, but a big problem in all the most commonly used trees, e.g. 97% tree. The hard part was identifying the precise cause of the problem. Now that it is precisely known, the offending delimiters are temporarily replaced so that the standard parser `read.tree` can create the phylo object, then they are reinstated. Unit tests have been added to check that this works properly on a GreenGenes release tree that otherwise breaks `read.tree`. This also solves 224 https://github.com/joey711/phyloseq/issues/224 - Fixed a bug in which the highest taxonomic rank fails in `tax_glom` This was a bug resulting from the automatic coercion of single-column matrix subsetting to a vector. Simply changing the relevant line of code in `tax_glom` such that [, , drop=FALSE], solve this issue, Issue 223 https://github.com/joey711/phyloseq/issues/223 Unit tests have been added that should catch this in the future. - rarefy_even_depth() new option to sample without replacement. Two implications to consider are that (1) sampling with replacement is faster and more memory efficient as currently implemented; (2) sampling with replacement means that there is a chance that the number of reads for a given OTU in a given sample could be larger than the original count value. This is in contrast to sampling without replacement where the original count value is the maximum possible. Prior to this phyloseq version, this `replace` parameter did not exist and sampling with replacement was the only random subsampling implemented in the `rarefy_even_depth` function. This prior behavior was selected for computational efficiency, but differs from the behavior of analogous functions in related packages (e.g. rarefying in QIIME). CHANGES IN VERSION 1.5.19 ------------------------- USER-VISIBLE CHANGES - add gap statistic support for ordination results - gapstat_ord() - wrapper function for cluster::clusGap for ordination methods - plot_clusgap() - wrapper function for plotting gap statistic results from clusGap() - Full examples on the soilrep dataset for gap statistic. - Fix bug in eigenvalue proportions for axes other than the first two in ordination plots. CHANGES IN VERSION 1.5.17 ------------------------- USER-VISIBLE CHANGES - replace URL with new phyloseq article http://dx.plos.org/10.1371/journal.pone.0061217 CHANGES IN VERSION 1.5.16 ------------------------- USER-VISIBLE CHANGES - rarefy_even_depth improvements User-side convenience upgrades to rarefy_even_depth() behavior. - More user feedback about process. - New argument for setting RNG seed, with a default value (reproducible by default). - Reports the RNG seed being used for random subsampling, encouraging users to record this for reproducibility. - Trims empty samples/OTUs automatically, and reports this to standard out. CHANGES IN VERSION 1.5.13-15 - build improvements, changed dependencies ------------------------- USER-VISIBLE CHANGES - Shifted RJSONIO dependency to the new "biom" package in CRAN CHANGES IN VERSION 1.5.11-12 - ------------------------- USER-VISIBLE CHANGES - major feature: interface to microbio.me/qiime data repo - Now possible to directly download, unpack, import multi-component data into standard phyloseq form in R using a single command using the new microbio_me_qiime() command. Supports the following input styles: - full URL to the precise study on the server, - a local path to the same compressed raw data file on your system if you already downloaded - Just the study number on the microbio.me/qiime repo. For example: microbio_me_qiime(524) will download and import the "smokers" dataset. - See the following tutorial for more details: http://joey711.github.io/phyloseq/download-microbio.me.html CHANGES IN VERSION 1.5.9 - minor bugfix ------------------------- USER-VISIBLE CHANGES - Bugfix for psmelt()/plotting when entire columns in tax_table are empty CHANGES IN VERSION 1.5.8 - update reshape dependency to reshape2 ------------------------- USER-VISIBLE CHANGES - This satisfies [issue 134](https://github.com/joey711/phyloseq/issues/134) CHANGES IN VERSION 1.5.6-.7 - plot_ordination() ------------------------- USER-VISIBLE CHANGES - plot_ordination() now includes percent variability on axis labels, if possible CHANGES IN VERSION 1.5.5 ------------------------- USER-VISIBLE CHANGES - Update citation info for latest per-reviewed phyloseq article - http://dx.plos.org/10.1371/journal.pone.0061217 CHANGES IN VERSION 1.5.4 - Add taxonomic classification data to mt() output, if available ------------------------- USER-VISIBLE CHANGES - This completes a feature request in [Issue 179](https://github.com/joey711/phyloseq/issues/179) CHANGES IN VERSION 1.5.3 ------------------------- USER-VISIBLE CHANGES - bug fix in plot_heatmap labels derived from ggplot2 change - This solves a bug described in [Issue 192](https://github.com/joey711/phyloseq/issues/192) CHANGES IN VERSION 1.5.2 ------------------------- USER-VISIBLE CHANGES - bug fix pass extra args to `transform_sample_counts` CHANGES IN VERSION 1.5.0 ------------------------- USER-VISIBLE CHANGES - Level up to R version 3.0.0 CHANGES IN VERSION 1.3.23 ------------------------- USER-VISIBLE CHANGES - bug fix for transform_sample_counts - Only appears to affect OTU tables in the "taxa are columns" orientation. It is the result of a surprising behavior of the apply() function, which in this circumstance transposes the table. - This solves a bug described in [Issue 186](https://github.com/joey711/phyloseq/issues/186) CHANGES IN VERSION 1.3.22 ------------------------- USER-VISIBLE CHANGES - additional tests for prun_*() and phyloseq() functions - Before releasing v1.3.21 on GitHub:master some gaps in re-order checking were noticed. These are now caught by new unit tests and phyloseq/prune/etc have been further revised to ensure that properly-ordered OTUs are not disordered during a pruning step. CHANGES IN VERSION 1.3.21 ------------------------- USER-VISIBLE CHANGES - accessor efficiency - For instance, ntaxa() and taxa_names() are very slow on large dataset Some of the highly inefficient approaches are now replaced. The strategy is described further in [Issue 183](https://github.com/joey711/phyloseq/issues/183) CHANGES IN VERSION 1.3.20 ------------------------- USER-VISIBLE CHANGES - reference sequence class update. - formally define the new version of phyloseq-class with refseq slot included - new/augmented accessors: taxa_names, ntaxa, refseq - phyloseq() constructor now supports XStringSet components - reconcile_species internal function removed/replaced - reconcile_species removed from constructor and package. internal, so no need to deprecate. - check the component slot list provided by the "splat" infrastructure - prune_taxa - Rebuild current example data. - print/show methods. - subset_taxa - add refseq (XStringSet) object argument to import functions. import_qiime, import_biom - merge_phyloseq: works with refseq data - Add merge_taxa method for XStringSet objects - Include reference sequences in example datasets - prune_* / reconcile_* / intersect_* . add intersect_samples() function, model after new version of intersect_species() rename intersect_species to intersect_taxa() rm/replace reconcile_* functions with prune_*(intersect_*(), ps). These changes make simpler / DRYer code. Easier to extend. - DRY (and hopefully speed) improvements to merge_taxa(). Additional speed improvements may be possible for tip_glom, tax_glom in later revisions CHANGES IN VERSION 1.3.14 ------------------------- USER-VISIBLE CHANGES - Shortened/replaced examples in the longest-running doc examples. This substantially reduces the time it takes to run package checks. - Focused on worst offenders - Created a new online tutorial for `subset_ord_plot`. Linked to it from `plot_ordination` - `plot_taxa_bar` moved to deprecated function file where it belongs, and examples completely removed from doc. CHANGES IN VERSION 1.3.13 ------------------------- USER-VISIBLE CHANGES - Fixed unofficial warning from missing (unregistered) classes of ordination objects. Stems from the internal get_eigenvalue being defined as S4 generic instead of S3. Solves the following logged issue: https://github.com/joey711/phyloseq/issues/166 - Name of get_eigenvalue generic replaced with extract_eigenvalue, in addition to re-defining as S3 generic. - Fixed ggplot2 warning from over-specified "bins" in the plot_scree bar plot. Changed to stat="identity", solves problem - Fixed warning when eigenvalues get (slightly) negative. They are now set to 0.0 for the purposes of plotting in plot_scree. CHANGES IN VERSION 1.3.12 ------------------------- USER-VISIBLE CHANGES - Fixed a parsing issue for some QIIME-produced .biom files that had leading space characters. Issue further described at https://github.com/joey711/phyloseq/issues/171 Fixed such that any number of leading/lagging space characters are removed from taxonomic classification entries - Fixed build issue on some windows machines derived from problem with figure files having colons in the filename. CHANGES IN VERSION 1.3.11 ------------------------- USER-VISIBLE CHANGES - Added tree option for import_biom() importer so that users can avoid using merge_phyloseq() if their files are otherwise standard vanilla - Address Issue 169 and 167 https://github.com/joey711/phyloseq/issues/169 https://github.com/joey711/phyloseq/issues/167 CHANGES IN VERSION 1.3.10 ------------------------- USER-VISIBLE CHANGES - Added support for Shannon/Simpson alpha-diversity indices in plot_richness https://github.com/joey711/phyloseq/issues/164 - All sample_data now embedded in plot_richness output graphic, in case want to use other covariates in additional layers not originally specified. For instance, if you wanted to include geom_text(label=addLayer1). See plot_richness online tutorial. CHANGES IN VERSION 1.3.9 ------------------------- USER-VISIBLE CHANGES - Added ability to add node labels, bootstrap values to tree graphics generated by plot_tree. - The labeling itself is opened-up as a user-provided function to facilitate custom node-labeling needs (including symbols and other ggplot2 geoms) - Commonly-needed functions are provided as newly-documented exported functions in the package: nodeplotdefault - adds whatever is in the node label to the graphic nodeplotboot - Adds the labels as bootstrap values, coercing/rounding as needed nodeplotblank - Ensures that node labels are not added. - These new functions can be used to give valid arguments to the new `nodelabf` argument in plot_tree(). - Some other re-organization to plot_tree to show more code in the main plot_tree function. CHANGES IN VERSION 1.3.8 ------------------------- USER-VISIBLE CHANGES - Fix bug in plot_tree graphic if sample names start with a number - This fixes https://github.com/joey711/phyloseq/issues/149 - Also added fill argument to default aesthetic map definition, useful if fillable shapes defined in subsequent layers CHANGES IN VERSION 1.3.7 ------------------------- USER-VISIBLE CHANGES - Revisions to plot_tree to improve formatting, organization - "ladderize" contributed by Gregory Jordan - Color scale option removed from original pull request - already supported as core ggplot2 functionality through layering - Added links and roxygen2-header revisions for proper doc formatting - Fixed bug in which alternative size-variables still labeled as "abundance" in legend. CHANGES IN VERSION 1.3.6 ------------------------- USER-VISIBLE CHANGES - Updated basics vignette CHANGES IN VERSION 1.3.5 ------------------------- USER-VISIBLE CHANGES - Updated README.md to point to phyloseq home page (instead of redundant display of content). - Also added README.html CHANGES IN VERSION 1.3.4 ------------------------- USER-VISIBLE CHANGES - Updated tests, examples for merge_samples() - Updated some dependency min versions - First 2013 commit CHANGES IN VERSION 1.3.3 ------------------------- USER-VISIBLE CHANGES - updates to import_qiime() - modular building of taxonomy table in import_qiime() and import_biom() CHANGES IN VERSION 1.3.2 ------------------------- USER-VISIBLE CHANGES - import_biom() fixes. - More robust data handling for taxonomy table - Flexibility: Can take custom parsing function for taxonomy vectors - tests added for new parsing functions parse_taxonomy_default parse_taxonomy_greengenes CHANGES IN VERSION 1.3.1 ------------------------- USER-VISIBLE CHANGES - New function: plot_bar() that is simpler more reliable than plot_taxa_bar. - plot_taxa_bar now deprecated. - labeled deprecated in title doc - replaced examples in vignette with plot_bar examples CHANGES IN VERSION 1.3.0 ------------------------- USER-VISIBLE CHANGES - Level up github devel version number to reflect devel order/status relative to latest BioC release CHANGES IN VERSION 1.1.58 ------------------------- USER-VISIBLE CHANGES - Fixed a bug in import_qiime in which import fails if there are any empty taxonomy string fields in a file that otherwise has some taxonomic assignments. Now the taxonomy entries for that OTU (row in the taxonomy table) are left all NA_character_ by default. CHANGES IN VERSION 1.1.57 ------------------------- USER-VISIBLE CHANGES - Added automatic removal of single and double quotes from phylogenetic tree tip names provided to the phyloseq-constructor. This should help avoid problems importing data that includes a tree, for the cases where the taxa/OTU names don't match because of these extra quotation marks. Added directly into the phyloseq() constructor, so that it doesn't matter how/where the tree was imported/add. - Removal of quotes is only initiated when OTU/taxa names fail to match AT ALL (intersection is length zero) between component taxa names. - This feature needs to be added to unit tests as well. CHANGES IN VERSION 1.1.55 ------------------------- USER-VISIBLE CHANGES - Added "title" argument to plot_scree() and plot_ordination(…, type="scree"), for consistency. CHANGES IN VERSION 1.1.54 ------------------------- USER-VISIBLE CHANGES - Changed "species" label in different plot_ordination() graphics to "taxa" - Fixed an issue with a default parameter in a related internal function (changed "samples" to "sites" for vegan compatibility). CHANGES IN VERSION 1.1.53 ------------------------- USER-VISIBLE CHANGES - Fixed additional title issues in plot_network and plot_richness CHANGES IN VERSION 1.1.52 ------------------------- USER-VISIBLE CHANGES - Added plot_scree() function for making eigenvalue "scree" plots in ggplot2 - Added corresponding type="scree" option to plot_ordination, for convenience. CHANGES IN VERSION 1.1.51 ------------------------- USER-VISIBLE CHANGES - Returned to "Imports:" dependency for ggplot2 following a ggplot2 bug fix CHANGES IN VERSION 1.1.50 ------------------------- USER-VISIBLE CHANGES - Fixed several compatibility issues to support latest version of ggplot2 (0.9.2). - Also changes plot_richness_estimates() to plot_richness(). CHANGES IN VERSION 1.1.45 ------------------------- USER-VISIBLE CHANGES - Backward compatibility for import_qiime_sampleData, now superseded by import_qiime_sample_data - Added a functioning example based on the GlobalPatterns example sample-map file included in the package extdata. CHANGES IN VERSION 1.1.44 ------------------------- USER-VISIBLE CHANGES - Fixed minor bug in tax_glom function. Thanks to Katie Shelef for the bug report. Bug only affected tax_glom behavior when the right-most rank was specified as the position for merging. CHANGES IN VERSION 1.1.43 ------------------------- USER-VISIBLE CHANGES - fixed distance() issue from species/taxa replacement for type argument. CHANGES IN VERSION 1.1.42 ------------------------- USER-VISIBLE CHANGES - fixed make_network/plot_network issue from species/taxa replacement for type argument. CHANGES IN VERSION 1.1.41 ------------------------- USER-VISIBLE CHANGES - Fixed documentation for `prune_taxa` and `prune_samples` - Updated `prune_samples` method to allow for logical vectors. - Fixed `prune_taxa` so that it properly fails with a message if the taxa argument is a logical of wrong length. There was some potential (and no warning) for unpredictable vector-recycling with short vectors in the old implementation. CHANGES IN VERSION 1.1.40 ------------------------- USER-VISIBLE CHANGES - Huge Update and Renaming Event. - Made all functions use an *underscore* for English word delimiter, if they were using an abbreviation. - Replaced "species" in all function names with "taxa". - These changes are all backward compatible, for now, so your old code should work. Let me know if it doesn't and I will quickly make the adjustment. This will remain true through the next official release, but functional references to "species" will not be supported afterward, except in the occasions where you actually mean taxonomic species, like `tax_glom(x, "species")`. CHANGES IN VERSION 1.1.33 ------------------------- USER-VISIBLE CHANGES - Revise taxglom() such that it handles phyloseq and taxonomyTable classes, throws warning otherwise. It should not take a manually-produced character vector, as this is roughly equivalent to functionality supported in other method, especially prune_species()/merge_species(). - Also added unit-tests and executable examples for taxglom(). Got rid of taxglom.internal, incorporated directly into taxglom(). taxglom() is no longer an S4-method, and doesn't need to be now that the character-vector argument option is omitted, with S4-class handling delegated to merge_species(). Updated "taxTab<-" to be S4 assignment, clearer handling of taxonomy Table assignments, especially useful for taxglom. CHANGES IN VERSION 1.1.29 ------------------------- USER-VISIBLE CHANGES - Add unit tests and example files for import_biom (as well as import("biom",...) ). CHANGES IN VERSION 1.1.28 ------------------------- USER-VISIBLE CHANGES - Added rarefy_even_depth() function for random subsampling of microbiome samples to the same number of reads. Default uses the minimum total reads among the samples in the dataset. This is based on the core "sample" function, which can have its random number generator fixed by set.seed for reproducibility. CHANGES IN VERSION 1.1.27 ------------------------- USER-VISIBLE CHANGES - Fix bug in plot_ordination that caused an error rather than produce unannotated plots when sampleData absent in the input. CHANGES IN VERSION 1.1.23-26 ------------------------- USER-VISIBLE CHANGES - Added unit tests and bugfixes CHANGES IN VERSION 1.1.19-22 ------------------------- USER-VISIBLE CHANGES - Improving import_qiime() importer to handle large datasets, like the HMPv35 dataset, for example, while also providing useful status messages during non-trivial imports that might take 10 minutes or more to complete. CHANGES IN VERSION 1.1.18 ------------------------- USER-VISIBLE CHANGES - Added replicate labels as a "Sample" factor in the soilrep dataset. CHANGES IN VERSION 1.1.17 ------------------------- USER-VISIBLE CHANGES - Fix possible bug that results from the latest version (0.6+) of igraph not being backward compatible. A stable igraph0 package is available on CRAN as a stop-gap, and so all igraph dependencies were migrated to "igraph0" until the phyloseq-source can be updated to match the igraph latest. CHANGES IN VERSION 1.1.15 ------------------------- USER-VISIBLE CHANGES - plot_heatmap: Added default (but adjustable) threshold to omit taxa/sample labels CHANGES IN VERSION 1.1.14 ------------------------- USER-VISIBLE CHANGES - Update import_qiime() function to import latest non-BIOM qiime output files. Also added check for presence of taxonomy information (consensus lineage). CHANGES IN VERSION 1.1.10 ------------------------- USER-VISIBLE CHANGES - Add plot_heatmap() function, for easy flexible heat maps built with ggplot2 CHANGES IN VERSION 1.1.8-9 ------------------------- USER-VISIBLE CHANGES - Fix bug for some variants of new BIOM format - Add import_RDP_otu() import function for new RDP pipeline export format CHANGES IN VERSION 1.1.7 ------------------------- USER-VISIBLE CHANGES - Removed the old plot_tree_phyloseq() function, in favor of the new ggplot2-based plot_tree() - Uncommented / tested formal examples in documentation of plot-functions - Updated variable names and doc for the plot_taxa_bar() function CHANGES IN VERSION 1.1.6 ------------------------- USER-VISIBLE CHANGES - Update vignette with plot_tree() example, replacing the old base-graphics function, plot_tree_phyloseq(). - Fix bug in legend for trees with size mapped to abundance CHANGES IN VERSION 1.1.5 ------------------------- USER-VISIBLE CHANGES - Add initial version of tree_plot(), built with ggplot2 - Adds several internal functions borrowed from devel version of ggphylo CHANGES IN VERSION 1.1.4 ------------------------- USER-VISIBLE CHANGES - Add errorIfNULL option to auxiliary accessors (e.g. sample.variables(), rank.names()) CHANGES IN VERSION 1.1.1-3 ------------------------- USER-VISIBLE CHANGES - R version updated to match Bioconductor, R-2.15.0+ - ape-package version updated to 3.0+ - ape-package now import dependency - ggplot2-package version updated to 0.9.0+ - ggplot2-package now import dependency CHANGES IN VERSION 0.99.48 ------------------------- USER-VISIBLE CHANGES - Updated README.md CHANGES IN VERSION 0.99.47 ------------------------- USER-VISIBLE CHANGES - Add support for ordinate() to take dist-object instead of distance-method string. - Update the documentation for ordinate() to reflect change. - Updated README.md to describe new tools, distance() and ordinate() - Update JSD documentation. CHANGES IN VERSION 0.99.46 ------------------------- USER-VISIBLE CHANGES - Added support and documentation for Jensen-Shannon Divergence to distance(). - Some updates to distance() function and its documentation. CHANGES IN VERSION 0.99.45 ------------------------- USER-VISIBLE CHANGES - Completely remove vegdist documentation from phyloseq by omitting all roxygen2 headers except for #' keywords internal - This finally fixes it, without build warnings/errors, once and for all. CHANGES IN VERSION 0.99.44 ------------------------- USER-VISIBLE CHANGES - Make the phyloseq::vegdist() wrapper an internal function. Documentation updated as well. This is a solution to Issue 87 https://github.com/joey711/phyloseq/issues/87 - Remove rda.phyloseq and cca.phyloseq from exported methods. Documentation had already been removed when these were first attempted to be converted to internal methods in CHANGES IN VERSION 0.99.42 - Modify make_sample_network to use the new distance() function, and be able to pass on additional parameters to distance(). - Re-order arguments to make_sample_network to better represent the stability of defaults. - Removed redundant parameters from make_sample_network(). Transformations to abundance tables should be performed upstream using phyloseq tools, not embedded in this function. - Modify vignettes to reflect these changes. - Rebuild vignette. - Update import() documentation to reflect support for BIOM format, import_biom() function. CHANGES IN VERSION 0.99.43 ------------------------- USER-VISIBLE CHANGES - Revise component assignment operators, e.g. "sampleData(physeq)<-" to coerce/access from more diverse objects based on context. Documentation for these operators updated. This is a more general solution to Issue 68 https://github.com/joey711/phyloseq/issues/68 CHANGES IN VERSION 0.99.42 ------------------------- USER-VISIBLE CHANGES - purge rda.phyloseq and cca.phyloseq from documentation, vignettes. Internal functions. - analysis vignette revisions CHANGES IN VERSION 0.99.41 ------------------------- USER-VISIBLE CHANGES - Added ordinate() function, general ordination wrapper. CHANGES IN VERSION 0.99.40 ------------------------- USER-VISIBLE CHANGES - Fixed case issues with source filenames. Required multiple commits, break in versioning for source files that had improper letter case (e.g. ".r") CHANGES IN VERSION 0.99.37 - 0.99.39 ------------------------- USER-VISIBLE CHANGES - Vignette updates. CHANGES IN VERSION 0.99.36 ------------------------- USER-VISIBLE CHANGES - Added general distance calculation wrapper, distance() - Consolidated it with unifrac.R code in a new "distance-methods.R" source file. CHANGES IN VERSION 0.99.35 ------------------------- USER-VISIBLE CHANGES - Added tool to retain user-defined subset of points from an ordination, subset_ord_plot - Updates to vignette - Remove a poorly-documented, unpublished example dataset, ex1 -> and all references to it in documentation CHANGES IN VERSION 0.99.34 ------------------------- USER-VISIBLE CHANGES - Updates to vignette CHANGES IN VERSION 0.99.33 ------------------------- USER-VISIBLE CHANGES - Allow color specification for "biplot" type in plot_ordination() - bug fix for certain combinations of biplot options. CHANGES IN VERSION 0.99.32 ------------------------- USER-VISIBLE CHANGES - Remove plot_ordination_biplot() from phyloseq -> replaced by: plot_ordination() - pipes "|->" also removed from vignette. - Remove calcplot(). -> Will be replaced by pipeline_() methods - plot_ordination() shown in vignette for "species" plot type. - Fix - Allow flexible axis labels for plot_ordination() CHANGES IN VERSION 0.99.31 ------------------------- USER-VISIBLE CHANGES - Aesthetic fixes in plot_ordination() - Remove plot_ordination_samples() -> redundant, covered by plot_ordination(). CHANGES IN VERSION 0.99.30 ------------------------- USER-VISIBLE CHANGES - Added plot_ordination -> general ordination plotting function CHANGES IN VERSION 0.99.29 ------------------------- USER-VISIBLE CHANGES - Added first-draft of analysis vignette to package - Total package-space and build/check times tested CHANGES IN VERSION 0.99.28 ------------------------- USER-VISIBLE CHANGES - Fixed bug when specifying alternative axes in plot_ordination_samples() CHANGES IN VERSION 0.99.27 ------------------------- USER-VISIBLE CHANGES - Added DPCoA() function for Double Principle Coordinate Analysis, relies heavily on ade4. - Added ade4 dependency. Some masking, but no errors apparent. - Added dpcoa extension for scores() - minor bugfix in plot_ordination_biplot(). CHANGES IN VERSION 0.99.26 ------------------------- USER-VISIBLE CHANGES - Add plot_ordination_samples() for convenient ordination plotting - Renamed plot_ordination_phyloseq to more precise, plot_ordination_biplot() - Added extension to vegan::scores for ape:pcoa results, scores.pcoa() CHANGES IN VERSION 0.99.25 ------------------------- USER-VISIBLE CHANGES - Fix build warning from duplicate import in namespace - Update README.md CHANGES IN VERSION 0.99.24 ------------------------- USER-VISIBLE CHANGES - Advanced network/graph plotting/visualization wrappers: make_sample_network(), plot_sample_network() - Advanced alpha diversity wrappers: plot_richness_estimates(), estimate_richness() - Added taxafilter() function for even more convenient filtering of species/taxa - Added reshape dependency for explicit use of melt() function. CHANGES IN VERSION 0.99.23 ------------------------- USER-VISIBLE CHANGES - Added a rooted tree to "GlobalPatterns" dataset - Allow multi-class tests with mt() CHANGES IN VERSION 0.99.20 ------------------------- USER-VISIBLE CHANGES - Added "GlobalPatterns" dataset, and some other minor improvements - added "GlobalPatterns" dataset, with doc and some analysis examples. More examples will be added to the vignette. - add getVariable accessor function, for streamlining access to values/vectors/factors/etc of the variates contained in the sampleData component - revise documentation about parallelization of import_biom() - revise documentation for enterotype dataset CHANGES IN VERSION 0.99.19 ------------------------- USER-VISIBLE CHANGES - fixed a bug in general import() function in which it properly processed import command, but then failed to return result. CHANGES IN VERSION 0.99.18 ------------------------- USER-VISIBLE CHANGES - Added import_biom() function to import BIOM format OTU-clustered data / metadata - Added (direct) dependency for plyr, as well as RJSONIO CHANGES IN VERSION 0.4.2-7 ------------------------- USER-VISIBLE CHANGES - Improvements to import_mothur() via import_mothur_otulist(). - merge_samples() function added, in preparation for hypergeometric (fisher.test) test wrapper. - Fixed bug in merge_phyloseq() for certain combinations of objects. - Various other fixes and improvements. CHANGES IN VERSION 0.4.1 ------------------------- USER-VISIBLE CHANGES - First official submission to Bioconductor - Includes many build-fixes, bug-fixes - Final tweaks to conform to Bioconductor guidelines CHANGES IN VERSION 0.3 ------------------------- USER-VISIBLE CHANGES - Added Importers for mothur, RDP-pipeline, and PyroTagger - Lots of new plotting and analysis support - Parallelized UniFrac calculations using foreach package - Some improvements to the class inheritance structure to simplify method extension and future development. - Function-level documentation - Vignette-level documentation - Package dependencies achieved via import for all packages with a namespace. Depends (full load) otherwise. CHANGES IN VERSION 0.2.4 ------------------------- USER-VISIBLE CHANGES - Added ordination and plotting pipeline, calcplot() and plot.ordination.phyloseq() - All trees converted to phylo4 by default. Support for phyla achieved by coercion to phylo4. CHANGES IN VERSION 0.2 ------------------------- USER-VISIBLE CHANGES - Modifications for proper build, and bug tests. CHANGES IN VERSION 0.1 ------------------------- USER-VISIBLE CHANGES - basic data structure in place. - some support for phylo4 objects - import_qiime(): A Qiime input wrapper phyloseq/inst/doc/0000755000175400017540000000000013177723156015202 5ustar00biocbuildbiocbuildphyloseq/inst/doc/Unweighted_UniFrac.RData0000644000175400017540000000534113175714136021630 0ustar00biocbuildbiocbuild]Wy\M]n4 MȐOt+BJQiPѨP"e7dʫ(QH{xKPsgZ{@SVLLLBLb$Hpq|'NVbb#84s7ކ4wM&_4;&t8guP$~?Iڥ lN(4Sۯa -`MO>u yg mAW/[ 15 9?V>֍tܴWPcA2 iϠkJ Q*D/!2S7QhD.$s&1{ {h^ V_RyԪEG-[ =>4I"!-ٞsyld5 `sqXo v~y-N)8K2c1<LX{ V7nWypHDOVs_ &66"iJA$%5CQE6SkdK:`{f5=hLU'D8u=%`tOho_.] twMs;AI5f>T{"fϱѳx`JK;΃=h~'73ʬvׂ 9vӁ3\^(PȯgF}(?vN 4uL {dvt\/RQX r=M!1޵dN+%odfoV9|٠4kS*omb=p8[~eB06Oǃg+SdD`DMKL*j;55{K:Znk jH]ڟ:@J /$!5#S-h"q9^7&Q`DD@_%Jt.uF; @_/3V0GilLi/6O#E4s \D}YP rSU\hmr{t;:YtH5ĩ"a? }ZyN`s\}mԨZ` Ƥ =0^T|WP=PjAۧ{B8Gjis7Yr+S=%U:6*o-*F%J]-&=VnfE )&@*O ,O S_=@ 7*ƩCo PYEj_7Qhj oI2ރ ֿ b77ig3er"<.iA iHilҫ&+Au:BHXҩaCѷ@x#O|]b&wN(݋Nq30P(H .cA+xs@'olK-6q'[]@@صb% AYo?p].]T ܔӎfbռR"Ffʧl$еaJV@\ytlIgknd ٗ^? ZN>y8<-TH9 rn^jlrI5K'<i9VM j\V@UsvS?W\| [Rz ŽoZ )+:SAUO=[[?ܭgoBlP5N~#jX^ "/Qܹh1* Ն_A-I8 hDžv{ ߌ&6#ya̘Mz\.{zS޲ZQ'T+ޝbo07Cp[U?n#2-Aƌ->L.6d芖kѴ#A}:.s n³3OZ{C1K>h.Դ-2[ܒ,cݽ \>r06V>%M@Zw)Hi{d607k3s^ٚ]E=.2U26 .̤`.%Xwջ}ﷁHWsʲYϹ|O"tUO9|Ube|̔-li xyFaiuC8inڜEҵuC ;֐|u D.߫/+Ii~*m/6pPV;xgNB:}iq?8C \S!p0-x?O(hȳEySCSpHĠ^C[XAʃ0k rW\':ق2ƌ1ɅNBጟ\\"ߩ!n?Ԃ(P`b0yw  >Au|U1D %\VignetteIndexEntry{phyloseq Frequently Asked Questions (FAQ)} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- This vignette includes answers and supporting materials that address [frequently asked questions (FAQs)](https://en.wikipedia.org/wiki/FAQ), especially those posted on [the phyloseq issues tracker](https://github.com/joey711/phyloseq/issues). For most issues [the phyloseq issues tracker](https://github.com/joey711/phyloseq/issues) should suffice; but occasionally there are questions that are asked repeatedly enough that it becomes appropriate to canonize the answer here in this vignette. This is both (1) to help users find solutions more quickly, and (2) to mitigate redundancy on [the issues tracker](https://github.com/joey711/phyloseq/issues). All users are encouraged to perform a google search and review other questions/responses to both open and closed issues on [the phyloseq issues tracker](https://github.com/joey711/phyloseq/issues) before seeking an active response by posting a new issue. ```{r, warning=FALSE, message=FALSE} library("phyloseq"); packageVersion("phyloseq") library("ggplot2"); packageVersion("ggplot2") theme_set(theme_bw()) ``` # - I tried reading my biom file using phyloseq, but it didn’t work. What’s wrong? The most common cause for this errors is derived from a massive change to the way biom files are stored on disk. There are currently two "versions" of the biom-format, each of which stores data very differently. The original format -- and original support in phyloseq -- was for biom-format version 1 based on [JSON](https://en.wikipedia.org/wiki/JSON). The latest version -- version 2 -- is based on the [HDF5](https://www.hdfgroup.org/HDF5/doc/UG/index.html) file format, and this new biom format version recently become the default file output format for popular workflows like QIIME. ## Good News: HDF5-biom should be supported in next release The *biomformat* package is the Bioconductor incarnation of R package support for the biom file format, written by Paul McMurdie (phyloseq author) and Joseph Paulson (metagenomeSeq author). Although it has been available on GitHub and BioC-devel for many months now, the first release version of *biomformat* on Bioconductor will be in April 2016. In that same release, phyloseq will switch over from the JSON-only *biom* package hosted on CRAN to this new package, *biomformat*, which simultaneously supports biom files based on either HDF5 or JSON. This difference will be largely opaque to users, and phyloseq will "just work" after the next release in April. Use the `import_biom` function to read your recent QIIME or other biom-format data. Additional back details are described in [Issue 443](https://github.com/joey711/phyloseq/issues/443). ## HDF5 (Version 2.0) biom-format: *biomformat* As just described, HDF5 biom format is currently supported in the development version of phyloseq, via the new beta/development package called *biomformat* on BioC-devel and GitHub: https://github.com/joey711/biomformat If you need to use HDF5-based biom format files **immediately** and cannot wait for the upcoming release, then you should install the development version of the *biomformat* package by following the instructions at the link above. ## Not every data component is included in .biom files Even though the biom-format supports the self-annotated inclusion of major components like that taxonomy table and sample data table, many tools that generate biom-format files (like QIIME, MG-RAST, mothur, etc.) do not export this data, even if you provided the information in your data input files. The reason for this boggles me, and I've shared my views on this with QIIME developers, but there nevertheless seems to be no plan to include your sample data in the ouput biom file. Furthermore, even though I have proposed it to the biom-format team, there is currently no support (or timeline for support) for inclusion of a phylogenetic tree within a ".biom" file. A number of tutorials are available demonstrating how one can add components to a phyloseq object after it has been created/imported. The following tutorial is especially relevant http://joey711.github.io/phyloseq-demo/import-biom-sd-example.html Which makes use of the following functions: - `import_qiime_sample_data` - `merge_phyloseq` ## Other issues related the biom-format There are a number of different Issue Tracker posts discussing this format with respect to phyloseq: https://github.com/joey711/phyloseq/issues/302 https://github.com/joey711/phyloseq/issues/272 https://github.com/joey711/phyloseq/issues/392 [Issue 443](https://github.com/joey711/phyloseq/issues/443) has details for updated format. # - `microbio_me_qiime()` returned an error. What’s wrong? ## The QIIME-DB Server is Permanently Down. The QIIME-DB server is permanently down. Users are suggested to migrate their queries over to Qiita. Indeed, the previous link to [microbio.me/qiime](http://www.microbio.me/qiime/index.psp) now sends users to the new Qiita website. ## An interface to Qiita is Planned. Stay tuned. The Qiita API needs to be released by the Qiita developers first. The phyloseq developers have no control over this, as we are not affiliated directly with the QIIME developers. Once there is an official Qiita API with documentation, an interface for phyloseq will be added. We found the `microbio_me_qiime()` function to be very convenient while the QIIME-DB server lasted. Hopefully an equivalent is hosted soon. # - I want a phyloseq graphic that looks like... Great! **Every plot function in phyloseq returns a ggplot2 object**. When these objects are "printed" to standard output in an R session, for instance, ```{r} data(esophagus) plot_tree(esophagus) ``` then the graphic is rendered in [the current graphic device](https://stat.ethz.ch/R-manual/R-devel/library/grDevices/html/Devices.html). Alternatively, if you save the object output from a phyloseq `plot_` function as a variable in your session, then you can further modify it, interactively, at your leisure. For instance, ```{r} p1 = plot_tree(esophagus, color = "Sample") p1 p1 + ggtitle("This is my title.") + annotate("text", 0.25, 3, color = "orange", label = "my annotation") ``` There are lots of ways for you to generate custom graphics with phyloseq as a starting point. The following sections list some of my favorites. ## Modify the ggplot object yourself. For example, [the plot_ordination() examples tutorial](http://joey711.github.io/phyloseq/plot_ordination-examples.html) provides several examples of using additional ggplot2 commands to modify/customize the graphic encoded in the ggplot2 object returned by `plot_ordination`. [The ggplo2 documentation](http://docs.ggplot2.org/current/) is the current and canonical online reference for creating, modifying, and developing with ggplot2 objects. For simple changes to aesthetics and aesthetic mapping, [the aesthetic specifications vignette](http://docs.ggplot2.org/current/vignettes/ggplot2-specs.html) is a useful resource. ## psmelt and ggplot2 The `psmelt` function converts your phyloseq object into a table (`data.frame`) that is very friendly for defining a custom ggplot2 graphic. This function was originally created as an internal (not user-exposed) tool within phyloseq to enable a [DRY](https://en.wikipedia.org/wiki/Don%27t_repeat_yourself) approach to building ggplot2 graphics from microbiome data represented as phyloseq objects. When applicable, the phyloseq `plot_` family of functions use `psmelt`. This function is now a documented and user-accessible function in phyloseq -- for the main purpose of enabling users to create their own ggplot2 graphics as needed. There are lots of great documentation examples for ggplot2 at - [the ggplot2 official documentation site](http://docs.ggplot2.org/current/), - [ggplot2 on StackOverflow](http://stackoverflow.com/tags/ggplot2), and - [phyloseq documentation pages](https://joey711.github.io/phyloseq/). The following are two very simple examples of using `psmelt` to define your own ggplot2 object "from scratch". It should be evident that you could include further ggplot2 commands to modify each plot further, as you see fit. ```{r} data("esophagus") mdf = psmelt(esophagus) # Simple bar plot. See plot_bar() for more. ggplot(mdf, aes(x = Sample, y = Abundance)) + geom_bar(stat = "identity", position = "stack", color = "black") # Simple heat map. See plot_heatmap() for more. ggplot(mdf, aes(x = Sample, y = OTU, fill = Abundance)) + geom_raster() ``` ## Submit a Pull Request (Advanced) If your new custom plot function is awesome and you think others might use it, add it to the `"plot-methods.R"` source file and submit a pull request on GitHub. [GitHub Official Pull Request Documentation](https://help.github.com/articles/using-pull-requests/) Please include example and test code in the code included in your pull request. I'll try and add it to the package by the next release. I will also give you authorship credit in the function doc. See the "typo fix" section below for further details about GitHub pull requests... ## Define a ggplot2 extension (Advanced) Development of new R functions/commands for creating/modifying new geometric objects is now formally documented in [the ggplot2 extension vignette](http://docs.ggplot2.org/current/vignettes/extending-ggplot2.html). This may be related to the previous section, in that your ggplot2 extension for phyloseq could be contributed to the phyloseq project as a pull request. # - There’s a typo in phyloseq documentation, tutorials, or vignettes This is something that is actually faster and less work for you to solve yourself and contribute back to the phyloseq package. For trivial typo fixes, I will quickly include your fixes into the package code. Sometimes I accept them on my cell phone while I'm still in bed. No wasted time on either end! :-) The point is that this should be simple, and is simple if you follow one of the following suggestions. ## Fix the typo directly on GitHub GitHub now provides the option to make changes to code/text of a repository directly from your web browser through an in-page editor. This handles all the Git details for you. If you have a GitHub account and you're logged in, all you'd have to do is locate the file with the offending typo, then use the "edit" button to make the changes and send the to me as a pull request. ## Minimal GIT and GitHub Exercise ![](http://i.imgur.com/j9NYXiQ.png) (The following instructions are borrowed from [Yihui Xie's site about fixing typos](http://yihui.name/en/2013/06/fix-typo-in-documentation/)) Alternatively, for those who want to try GIT and Github pull requests, which make it possible for you to contribute to open source and fix obvious problems with no questions being asked -- just do it yourself, and send the changes to the original author(s) through Github. The official documentation for Github pull requests is a little bit verbose for beginners. Basically what you need to do for simple tasks are: 1. click the Fork button and clone the repository in your own account; 2. make the changes in your cloned version; 3. push to your repository; 4. click the Pull Request button to send a request to the original author; # - I read ["Waste Not, Want Not..."](http://journals.plos.org/ploscompbiol/article?id=10.1371/journal.pcbi.1003531) but... Before getting to more specific issues, let's start by keeping appropriately separate the concept of - (1) denoising amplicon sequences, and/or denoising features in the contingency table, and - (2) standardization These two concepts have been often-conflated -- mostly by purveyors of methods that use rarefying -- wrongly insisting that rarefying is somehow addressing both problems and the matter is settled. Unfortunately rarefying is a very inefficient, noise-introducing method that poorly addresses the data analysis challenges that motivate either concept. DESeq2 and related solutions can help you address the need for standardization (e.g. differing library sizes) at a particular step in your analysis while still making efficient inferences from your data. The denoising problem is best addressed at the sequence-processing level, and the best general-purpose option currently available is: - [The dada2 algorithm](http://benjjneb.github.io/dada2/), if your data works well with it. Current support is mainly Illumina sequence data, or - [UPARSE](http://drive5.com/uparse/) in the usearch package, if you don't have sequencing data that works well with [dada2](http://benjjneb.github.io/dada2/) ## I tried to [use DESeq2](http://joey711.github.io/phyloseq-extensions/DESeq2.html) to normalize my data, but now I don't know what to do... The answer to a question of this category depends a lot on your experiment, and what you want to learn from your data. The following are some resources that may help. - [Waste Not, Want Not Supplemental Materials](http://joey711.github.io/waste-not-supplemental/) - [Differential Abundance Vignette](https://www.bioconductor.org/packages/release/bioc/vignettes/phyloseq/inst/doc/phyloseq-mixture-models.html) - [The phyloseq front page](https://joey711.github.io/phyloseq/) ## My libraries/samples had different total number of reads, what do I do? That is an expected artifact of current sequencing technologies, and not a "problem" on its own. In most cases, differences in total counts are uncorrelated with any variable in your experimental design. **You should check that this is the case**. It remains possible that there are structural/procedural artifacts in your experiment that have influenced the total counts. If library sizes are correlated with one of your design variables, then this *might* represent an artifact that you need to address more carefully. This is a decision that you will have to make and defend. No software package or workflow can address this for you, but phyloseq/R can certainly help you check for correlation. See the `sample_sums()` and `sample_data()` accessor functions. Other than the portent of structural biases in your experiment, you should recall that comparisons between observation classes that have **uneven sample sizes is not a new nor unsolved problem in statistics**. The most useful analytical methods you can use in this context are therefore methods that expect and account for differences in total number of reads between samples. How you account for these *library size* differences should depend on the type of analysis in which you are engaged, and which methods you plan to use. For instance, for a beta-diversity measure like Bray-Curtis Dissimilarity, you might simply use the relative abundance of each taxa in each sample, as the absolute counts are not appropriate to use directly in the context where count differences are not meaningful. For further information, see - ["Waste Not, Want Not..."](http://journals.plos.org/ploscompbiol/article?id=10.1371/journal.pcbi.1003531) - [Discussion for Issue 229](https://github.com/joey711/phyloseq/issues/229) - [Discussion for Issue 299](https://github.com/joey711/phyloseq/issues/299) ## Should I normalize my data before alpha-diversity analysis **No.** Generally speaking, the answer is **no**. Most alpha diversity methods will be most effective when provided with the originally-observed count values. The misleading notion -- that normalization is necessary prior to alpha-diversity analysis -- seems to be derived from various "one size fits all" pipeline tools like QIIME, in which it is often encouraged to [*rarefy*](http://journals.plos.org/ploscompbiol/article?id=10.1371/journal.pcbi.1003531) counts as a normalizing transformation prior to any/all analysis. While this may simplify certain aspects of pipeline software development, it is analytical and statistical folly. **Rarefying microbiome data is statistically inadmissible**. For further information, I suggest reviewing literature such as - [Gotelli Colwell (2001)](http://onlinelibrary.wiley.com/doi/10.1046/j.1461-0248.2001.00230.x/abstract;jsessionid=A5EF264ABB5EADD5CCE9EF3AEE50CA41.f01t03), and of course, - ["Waste Not, Want Not..."](http://journals.plos.org/ploscompbiol/article?id=10.1371/journal.pcbi.1003531) ## Negative numbers in my transformed data table? This sort of question usually appears after someone used a log-like transformation / variance stabilizing transformation on their data, in preparation for an exploratory analysis via ordination. Negative values in this context probably correspond to **"less than one count"** after rescaling. For many ordination methods, like [PCA](https://en.wikipedia.org/wiki/Principal_component_analysis), negative numbers are not a problem. Instead, the problem is often posed because a user also wants to use **a particular distance measure** that is undefined or unstable in the presence of negative entries. In this context, however, the more negative a value is, the more likely that it was zero, or very small, in the original "raw" count matrix. For most distances and hypotheses, these values are probably not very important, or even negligible. Given this, it is probably quite reasonable to do one of the following: (1) Set to zero all values less than zero. If `X` is your matrix, you can accomplish this with `X[X < 0.0] <- 0.0` (2) Add a pseudocount prior to data transformation. This often curbs or prevents the presence of zeroes in the table of transformed values. Some people don't like this approach for their dataset, and they may or may not be correct. It is up to you to decide for your data. See [Discussion on Issue 445](https://github.com/joey711/phyloseq/issues/445). Please also note that taxa entries that are all negative after transformation, or equivalently are very small or almost always zero, should probably be filtered from your data prior to analysis. There are many different reasons for this. ## I get an error regarding geometric mean See my [SO post on alternative geometric mean functions in R](http://stackoverflow.com/a/25555105/935950) There are several examples for alternative calculations of geometric mean, and some of these might solve the problem of having an error. See also the discussion on [Issue 445](https://github.com/joey711/phyloseq/issues/445) regarding geometric means. Alternative library size estimators may be appropriate for your data, and it remains your responsibility to determine if any specific approach is valid. Mike Love (a developer for DESeq2), suggested the following consideration: "On the other hand, very sparse count datasets, with large counts for single samples per row and the rest at 0, don't fit well to the negative binomial distribution. Here, the VST or simply shifted log, `log(count+k)`, might be a safer choice than the `rlog`. A way that I test for sparsity is looking at a plot of the row sum of counts and the proportion of count which is in a single sample." ## Pseudocounts are not appropriate for my data, because... See [Discussion on Issue 445](https://github.com/joey711/phyloseq/issues/445). Also, think carefully about what you mean here. I suspect this statement could be more accurately stated as, *pseudocounts are not appropriate for my experiment, data, and the analysis step I was about to perform*. Your position in this case is thus based on a combination of how the data appears to behave, and your knowledge of how pseudocounts would affect the analysis you were going to use. Consider the following. - Is there an alternative analysis method? - Is the method you were about to use really that sensitive to adding a pseucocount? - Is a pseudocount really needed, or were you copying/pasting this step to an analysis script that you found somewhere? ## I’m scared that the Negative Binomial doesn’t fit my data well See [Discussion on Issue 445](https://github.com/joey711/phyloseq/issues/445). ## I don’t know how to test for differential abundance now. How do I do that? There is now lots of documentation on this topic. For starters, please see [the phyloseq vignette devoted to this topic](http://bioconductor.org/packages/release/bioc/vignettes/phyloseq/inst/doc/phyloseq-mixture-models.html). A Google search for "phyloseq differential abundance" will also likely turn up a number of useful, related resources. # - I need help analyzing my data. It has the following study design... I am currently a biostatistician at Second Genome, Inc., which offers complete [end-to-end microbiome experiment solutions](http://www.secondgenome.com/solutions) as a fee-for-service. In some cases Second Genome clients already have their microbiome data and want to make use of our team of trained microbiome analysts to get the most information from their expeirment. I recommend contacting one of the sales associates at the link above. My day-to-day efforts are in understanding the role of the microbiome in human health and disease. If you're looking for a collaboration on your microbiome data collection or data analysis, please contact [Second Genome Solutions](http://www.secondgenome.com/solutions). phyloseq/inst/doc/phyloseq-FAQ.html0000644000175400017540000434212713177723014020347 0ustar00biocbuildbiocbuild phyloseq Frequently Asked Questions (FAQ)

Contents

This vignette includes answers and supporting materials that address frequently asked questions (FAQs), especially those posted on the phyloseq issues tracker.

For most issues the phyloseq issues tracker should suffice; but occasionally there are questions that are asked repeatedly enough that it becomes appropriate to canonize the answer here in this vignette. This is both (1) to help users find solutions more quickly, and (2) to mitigate redundancy on the issues tracker.

All users are encouraged to perform a google search and review other questions/responses to both open and closed issues on the phyloseq issues tracker before seeking an active response by posting a new issue.

library("phyloseq"); packageVersion("phyloseq")
## [1] '1.22.3'
library("ggplot2"); packageVersion("ggplot2")
## [1] '2.2.1'
theme_set(theme_bw())

1 - I tried reading my biom file using phyloseq, but it didn’t work. What’s wrong?

The most common cause for this errors is derived from a massive change to the way biom files are stored on disk. There are currently two “versions” of the biom-format, each of which stores data very differently. The original format – and original support in phyloseq – was for biom-format version 1 based on JSON.

The latest version – version 2 – is based on the HDF5 file format, and this new biom format version recently become the default file output format for popular workflows like QIIME.

1.1 Good News: HDF5-biom should be supported in next release

The biomformat package is the Bioconductor incarnation of R package support for the biom file format, written by Paul McMurdie (phyloseq author) and Joseph Paulson (metagenomeSeq author). Although it has been available on GitHub and BioC-devel for many months now, the first release version of biomformat on Bioconductor will be in April 2016. In that same release, phyloseq will switch over from the JSON-only biom package hosted on CRAN to this new package, biomformat, which simultaneously supports biom files based on either HDF5 or JSON.

This difference will be largely opaque to users, and phyloseq will “just work” after the next release in April.

Use the import_biom function to read your recent QIIME or other biom-format data.

Additional back details are described in Issue 443.

1.2 HDF5 (Version 2.0) biom-format: biomformat

As just described, HDF5 biom format is currently supported in the development version of phyloseq, via the new beta/development package called biomformat on BioC-devel and GitHub:

https://github.com/joey711/biomformat

If you need to use HDF5-based biom format files immediately and cannot wait for the upcoming release, then you should install the development version of the biomformat package by following the instructions at the link above.

1.3 Not every data component is included in .biom files

Even though the biom-format supports the self-annotated inclusion of major components like that taxonomy table and sample data table, many tools that generate biom-format files (like QIIME, MG-RAST, mothur, etc.) do not export this data, even if you provided the information in your data input files. The reason for this boggles me, and I’ve shared my views on this with QIIME developers, but there nevertheless seems to be no plan to include your sample data in the ouput biom file.

Furthermore, even though I have proposed it to the biom-format team, there is currently no support (or timeline for support) for inclusion of a phylogenetic tree within a “.biom” file.

A number of tutorials are available demonstrating how one can add components to a phyloseq object after it has been created/imported. The following tutorial is especially relevant

http://joey711.github.io/phyloseq-demo/import-biom-sd-example.html

Which makes use of the following functions:

  • import_qiime_sample_data
  • merge_phyloseq

2 - microbio_me_qiime() returned an error. What’s wrong?

2.1 The QIIME-DB Server is Permanently Down.

The QIIME-DB server is permanently down.

Users are suggested to migrate their queries over to Qiita.

Indeed, the previous link to microbio.me/qiime now sends users to the new Qiita website.

2.2 An interface to Qiita is Planned.

Stay tuned. The Qiita API needs to be released by the Qiita developers first. The phyloseq developers have no control over this, as we are not affiliated directly with the QIIME developers. Once there is an official Qiita API with documentation, an interface for phyloseq will be added.

We found the microbio_me_qiime() function to be very convenient while the QIIME-DB server lasted. Hopefully an equivalent is hosted soon.

3 - I want a phyloseq graphic that looks like…

Great!

Every plot function in phyloseq returns a ggplot2 object. When these objects are “printed” to standard output in an R session, for instance,

data(esophagus)
plot_tree(esophagus)

then the graphic is rendered in the current graphic device.

Alternatively, if you save the object output from a phyloseq plot_ function as a variable in your session, then you can further modify it, interactively, at your leisure. For instance,

p1 = plot_tree(esophagus, color = "Sample")
p1

p1 + 
  ggtitle("This is my title.") +
  annotate("text", 0.25, 3, 
           color = "orange",
           label = "my annotation")

There are lots of ways for you to generate custom graphics with phyloseq as a starting point.

The following sections list some of my favorites.

3.1 Modify the ggplot object yourself.

For example, the plot_ordination() examples tutorial provides several examples of using additional ggplot2 commands to modify/customize the graphic encoded in the ggplot2 object returned by plot_ordination.

The ggplo2 documentation is the current and canonical online reference for creating, modifying, and developing with ggplot2 objects.

For simple changes to aesthetics and aesthetic mapping, the aesthetic specifications vignette is a useful resource.

3.2 psmelt and ggplot2

The psmelt function converts your phyloseq object into a table (data.frame) that is very friendly for defining a custom ggplot2 graphic. This function was originally created as an internal (not user-exposed) tool within phyloseq to enable a DRY approach to building ggplot2 graphics from microbiome data represented as phyloseq objects.

When applicable, the phyloseq plot_ family of functions use psmelt. This function is now a documented and user-accessible function in phyloseq – for the main purpose of enabling users to create their own ggplot2 graphics as needed.

There are lots of great documentation examples for ggplot2 at

The following are two very simple examples of using psmelt to define your own ggplot2 object “from scratch”. It should be evident that you could include further ggplot2 commands to modify each plot further, as you see fit.

data("esophagus")
mdf = psmelt(esophagus)
# Simple bar plot. See plot_bar() for more.
ggplot(mdf, aes(x = Sample, 
                y = Abundance)) + 
  geom_bar(stat = "identity", position = "stack", color = "black")

# Simple heat map. See plot_heatmap() for more.
ggplot(mdf, aes(x = Sample, 
                y = OTU, 
                fill = Abundance)) +
  geom_raster()

3.3 Submit a Pull Request (Advanced)

If your new custom plot function is awesome and you think others might use it, add it to the "plot-methods.R" source file and submit a pull request on GitHub.

GitHub Official Pull Request Documentation

Please include example and test code in the code included in your pull request.

I’ll try and add it to the package by the next release. I will also give you authorship credit in the function doc. See the “typo fix” section below for further details about GitHub pull requests…

3.4 Define a ggplot2 extension (Advanced)

Development of new R functions/commands for creating/modifying new geometric objects is now formally documented in the ggplot2 extension vignette.

This may be related to the previous section, in that your ggplot2 extension for phyloseq could be contributed to the phyloseq project as a pull request.

4 - There’s a typo in phyloseq documentation, tutorials, or vignettes

This is something that is actually faster and less work for you to solve yourself and contribute back to the phyloseq package. For trivial typo fixes, I will quickly include your fixes into the package code. Sometimes I accept them on my cell phone while I’m still in bed. No wasted time on either end! :-)

The point is that this should be simple, and is simple if you follow one of the following suggestions.

4.1 Fix the typo directly on GitHub

GitHub now provides the option to make changes to code/text of a repository directly from your web browser through an in-page editor. This handles all the Git details for you. If you have a GitHub account and you’re logged in, all you’d have to do is locate the file with the offending typo, then use the “edit” button to make the changes and send the to me as a pull request.

4.2 Minimal GIT and GitHub Exercise

(The following instructions are borrowed from Yihui Xie’s site about fixing typos)

Alternatively, for those who want to try GIT and Github pull requests, which make it possible for you to contribute to open source and fix obvious problems with no questions being asked – just do it yourself, and send the changes to the original author(s) through Github.

The official documentation for Github pull requests is a little bit verbose for beginners. Basically what you need to do for simple tasks are:

  1. click the Fork button and clone the repository in your own account;
  2. make the changes in your cloned version;
  3. push to your repository;
  4. click the Pull Request button to send a request to the original author;

5 - I read “Waste Not, Want Not…” but…

Before getting to more specific issues, let’s start by keeping appropriately separate the concept of

    1. denoising amplicon sequences, and/or denoising features in the contingency table, and
    1. standardization

These two concepts have been often-conflated – mostly by purveyors of methods that use rarefying – wrongly insisting that rarefying is somehow addressing both problems and the matter is settled. Unfortunately rarefying is a very inefficient, noise-introducing method that poorly addresses the data analysis challenges that motivate either concept.

DESeq2 and related solutions can help you address the need for standardization (e.g. differing library sizes) at a particular step in your analysis while still making efficient inferences from your data.

The denoising problem is best addressed at the sequence-processing level, and the best general-purpose option currently available is:

  • The dada2 algorithm, if your data works well with it. Current support is mainly Illumina sequence data, or
  • UPARSE in the usearch package, if you don’t have sequencing data that works well with dada2

5.1 I tried to use DESeq2 to normalize my data, but now I don’t know what to do…

The answer to a question of this category depends a lot on your experiment, and what you want to learn from your data. The following are some resources that may help.

5.2 My libraries/samples had different total number of reads, what do I do?

That is an expected artifact of current sequencing technologies, and not a “problem” on its own. In most cases, differences in total counts are uncorrelated with any variable in your experimental design. You should check that this is the case. It remains possible that there are structural/procedural artifacts in your experiment that have influenced the total counts. If library sizes are correlated with one of your design variables, then this might represent an artifact that you need to address more carefully. This is a decision that you will have to make and defend. No software package or workflow can address this for you, but phyloseq/R can certainly help you check for correlation. See the sample_sums() and sample_data() accessor functions.

Other than the portent of structural biases in your experiment, you should recall that comparisons between observation classes that have uneven sample sizes is not a new nor unsolved problem in statistics.

The most useful analytical methods you can use in this context are therefore methods that expect and account for differences in total number of reads between samples.

How you account for these library size differences should depend on the type of analysis in which you are engaged, and which methods you plan to use. For instance, for a beta-diversity measure like Bray-Curtis Dissimilarity, you might simply use the relative abundance of each taxa in each sample, as the absolute counts are not appropriate to use directly in the context where count differences are not meaningful.

For further information, see

5.3 Should I normalize my data before alpha-diversity analysis

No. Generally speaking, the answer is no. Most alpha diversity methods will be most effective when provided with the originally-observed count values.

The misleading notion – that normalization is necessary prior to alpha-diversity analysis – seems to be derived from various “one size fits all” pipeline tools like QIIME, in which it is often encouraged to rarefy counts as a normalizing transformation prior to any/all analysis. While this may simplify certain aspects of pipeline software development, it is analytical and statistical folly. Rarefying microbiome data is statistically inadmissible.

For further information, I suggest reviewing literature such as

5.4 Negative numbers in my transformed data table?

This sort of question usually appears after someone used a log-like transformation / variance stabilizing transformation on their data, in preparation for an exploratory analysis via ordination. Negative values in this context probably correspond to “less than one count” after rescaling. For many ordination methods, like PCA, negative numbers are not a problem.

Instead, the problem is often posed because a user also wants to use a particular distance measure that is undefined or unstable in the presence of negative entries. In this context, however, the more negative a value is, the more likely that it was zero, or very small, in the original “raw” count matrix. For most distances and hypotheses, these values are probably not very important, or even negligible. Given this, it is probably quite reasonable to do one of the following:

  1. Set to zero all values less than zero. If X is your matrix, you can accomplish this with X[X < 0.0] <- 0.0
  2. Add a pseudocount prior to data transformation. This often curbs or prevents the presence of zeroes in the table of transformed values. Some people don’t like this approach for their dataset, and they may or may not be correct. It is up to you to decide for your data. See Discussion on Issue 445.

Please also note that taxa entries that are all negative after transformation, or equivalently are very small or almost always zero, should probably be filtered from your data prior to analysis. There are many different reasons for this.

5.5 I get an error regarding geometric mean

See my SO post on alternative geometric mean functions in R There are several examples for alternative calculations of geometric mean, and some of these might solve the problem of having an error.

See also the discussion on Issue 445 regarding geometric means.

Alternative library size estimators may be appropriate for your data, and it remains your responsibility to determine if any specific approach is valid.

Mike Love (a developer for DESeq2), suggested the following consideration:

“On the other hand, very sparse count datasets, with large counts for single samples per row and the rest at 0, don’t fit well to the negative binomial distribution. Here, the VST or simply shifted log, log(count+k), might be a safer choice than the rlog. A way that I test for sparsity is looking at a plot of the row sum of counts and the proportion of count which is in a single sample.”

5.6 Pseudocounts are not appropriate for my data, because…

See Discussion on Issue 445.

Also, think carefully about what you mean here. I suspect this statement could be more accurately stated as, pseudocounts are not appropriate for my experiment, data, and the analysis step I was about to perform. Your position in this case is thus based on a combination of how the data appears to behave, and your knowledge of how pseudocounts would affect the analysis you were going to use. Consider the following.

  • Is there an alternative analysis method?
  • Is the method you were about to use really that sensitive to adding a pseucocount?
  • Is a pseudocount really needed, or were you copying/pasting this step to an analysis script that you found somewhere?

5.7 I’m scared that the Negative Binomial doesn’t fit my data well

See Discussion on Issue 445.

5.8 I don’t know how to test for differential abundance now. How do I do that?

There is now lots of documentation on this topic.

For starters, please see the phyloseq vignette devoted to this topic.

A Google search for “phyloseq differential abundance” will also likely turn up a number of useful, related resources.

6 - I need help analyzing my data. It has the following study design…

I am currently a biostatistician at Second Genome, Inc., which offers complete end-to-end microbiome experiment solutions as a fee-for-service. In some cases Second Genome clients already have their microbiome data and want to make use of our team of trained microbiome analysts to get the most information from their expeirment. I recommend contacting one of the sales associates at the link above.

My day-to-day efforts are in understanding the role of the microbiome in human health and disease. If you’re looking for a collaboration on your microbiome data collection or data analysis, please contact Second Genome Solutions.

phyloseq/inst/doc/phyloseq-analysis.R0000644000175400017540000002223313177723057021014 0ustar00biocbuildbiocbuild## ----dontrun-basics-vignette, eval=FALSE----------------------------------- # vignette("phyloseq-basics") ## ----load-packages, message=FALSE, warning=FALSE--------------------------- library("phyloseq") library("ggplot2") ## ----ggplot2-themes-------------------------------------------------------- theme_set(theme_bw()) ## -------------------------------------------------------------------------- data(GlobalPatterns) ## -------------------------------------------------------------------------- # prune OTUs that are not present in at least one sample GP <- prune_taxa(taxa_sums(GlobalPatterns) > 0, GlobalPatterns) # Define a human-associated versus non-human categorical variable: human <- get_variable(GP, "SampleType") %in% c("Feces", "Mock", "Skin", "Tongue") # Add new human variable to sample data: sample_data(GP)$human <- factor(human) ## ----richness_estimates0, fig.width=13, fig.height=7----------------------- alpha_meas = c("Observed", "Chao1", "ACE", "Shannon", "Simpson", "InvSimpson") (p <- plot_richness(GP, "human", "SampleType", measures=alpha_meas)) ## ----richness_estimates, fig.width=13,height=7----------------------------- p + geom_boxplot(data=p$data, aes(x=human, y=value, color=NULL), alpha=0.1) ## -------------------------------------------------------------------------- GP.chl <- subset_taxa(GP, Phylum=="Chlamydiae") ## ----GP-chl-tree, fig.width=15, fig.height=7, message=FALSE, warning=FALSE---- plot_tree(GP.chl, color="SampleType", shape="Family", label.tips="Genus", size="Abundance") ## -------------------------------------------------------------------------- data(enterotype) ## ----EntAbundPlot, fig.height=6, fig.width=8------------------------------- par(mar = c(10, 4, 4, 2) + 0.1) # make more room on bottom margin N <- 30 barplot(sort(taxa_sums(enterotype), TRUE)[1:N]/nsamples(enterotype), las=2) ## -------------------------------------------------------------------------- rank_names(enterotype) ## -------------------------------------------------------------------------- TopNOTUs <- names(sort(taxa_sums(enterotype), TRUE)[1:10]) ent10 <- prune_taxa(TopNOTUs, enterotype) print(ent10) ## -------------------------------------------------------------------------- sample_variables(ent10) ## ----entbarplot0, fig.height=6, fig.width=10------------------------------- plot_bar(ent10, "SeqTech", fill="Enterotype", facet_grid=~Genus) ## ----GPheatmap------------------------------------------------------------- data("GlobalPatterns") gpac <- subset_taxa(GlobalPatterns, Phylum=="Crenarchaeota") (p <- plot_heatmap(gpac, "NMDS", "bray", "SampleType", "Family")) ## ----GPheatmap-rename-axes------------------------------------------------- p$scales$scales[[1]]$name <- "My X-Axis" p$scales$scales[[2]]$name <- "My Y-Axis" print(p) ## ----plot_sample_network, fig.width=11, fig.height=7, message=FALSE, warning=FALSE---- data(enterotype) plot_net(enterotype, maxdist=0.4, color="SeqTech", shape="Enterotype") ## ----eval=FALSE------------------------------------------------------------ # my.physeq <- import("Biom", BIOMfilename="myBiomFile.biom") # my.ord <- ordinate(my.physeq) # plot_ordination(my.physeq, my.ord, color="myFavoriteVarible") ## ----help-import, eval=FALSE----------------------------------------------- # help(import) # help(ordinate) # help(distance) # help(plot_ordination) ## ----GP-data-load---------------------------------------------------------- data(GlobalPatterns) ## ---- eval=FALSE----------------------------------------------------------- # GPUF <- UniFrac(GlobalPatterns) ## ----load-precomputed-UF--------------------------------------------------- load(system.file("doc", "Unweighted_UniFrac.RData", package="phyloseq")) ## -------------------------------------------------------------------------- GloPa.pcoa = ordinate(GlobalPatterns, method="PCoA", distance=GPUF) ## ----PCoAScree, fig.width=6, fig.height=4---------------------------------- plot_scree(GloPa.pcoa, "Scree plot for Global Patterns, UniFrac/PCoA") ## ----GPfig5ax1213---------------------------------------------------------- (p12 <- plot_ordination(GlobalPatterns, GloPa.pcoa, "samples", color="SampleType") + geom_point(size=5) + geom_path() + scale_colour_hue(guide = FALSE) ) (p13 <- plot_ordination(GlobalPatterns, GloPa.pcoa, "samples", axes=c(1, 3), color="SampleType") + geom_line() + geom_point(size=5) ) ## ----GP_UF_NMDS0----------------------------------------------------------- # (Re)load UniFrac distance matrix and GlobalPatterns data data(GlobalPatterns) load(system.file("doc", "Unweighted_UniFrac.RData", package="phyloseq")) # perform NMDS, set to 2 axes GP.NMDS <- ordinate(GlobalPatterns, "NMDS", GPUF) (p <- plot_ordination(GlobalPatterns, GP.NMDS, "samples", color="SampleType") + geom_line() + geom_point(size=5) ) ## ----GPCAscree0, fig=FALSE------------------------------------------------- data(GlobalPatterns) # Take a subset of the GP dataset, top 200 species topsp <- names(sort(taxa_sums(GlobalPatterns), TRUE)[1:200]) GP <- prune_taxa(topsp, GlobalPatterns) # Subset further to top 5 phyla, among the top 200 OTUs. top5ph <- sort(tapply(taxa_sums(GP), tax_table(GP)[, "Phylum"], sum), decreasing=TRUE)[1:5] GP <- subset_taxa(GP, Phylum %in% names(top5ph)) # Re-add human variable to sample data: sample_data(GP)$human <- factor(human) ## ----GPCAscree, fig.width=8, fig.height=5---------------------------------- # Now perform a unconstrained correspondence analysis gpca <- ordinate(GP, "CCA") # Scree plot plot_scree(gpca, "Scree Plot for Global Patterns Correspondence Analysis") ## ----GPCA1234-------------------------------------------------------------- (p12 <- plot_ordination(GP, gpca, "samples", color="SampleType") + geom_line() + geom_point(size=5) ) (p34 <- plot_ordination(GP, gpca, "samples", axes=c(3, 4), color="SampleType") + geom_line() + geom_point(size=5) ) ## ----GPCAspecplot0--------------------------------------------------------- p1 <- plot_ordination(GP, gpca, "species", color="Phylum") (p1 <- ggplot(p1$data, p1$mapping) + geom_point(size=5, alpha=0.5) + facet_wrap(~Phylum) + scale_colour_hue(guide = FALSE) ) ## ----GPCAspecplotTopo0----------------------------------------------------- (p3 <- ggplot(p1$data, p1$mapping) + geom_density2d() + facet_wrap(~Phylum) + scale_colour_hue(guide = FALSE) ) ## ----GPCAjitter0----------------------------------------------------------- library("reshape2") # Melt the species-data.frame, DF, to facet each CA axis separately mdf <- melt(p1$data[, c("CA1", "CA2", "Phylum", "Family", "Genus")], id=c("Phylum", "Family", "Genus") ) # Select some special outliers for labelling LF <- subset(mdf, variable=="CA2" & value < -1.0) # build plot: boxplot summaries of each CA-axis, with labels p <- ggplot(mdf, aes(Phylum, value, color=Phylum)) + geom_boxplot() + facet_wrap(~variable, 2) + scale_colour_hue(guide = FALSE) + theme_bw() + theme( axis.text.x = element_text(angle = -90, vjust = 0.5) ) # Add the text label layer, and render ggplot graphic (p <- p + geom_text(data=subset(LF, !is.na(Family)), mapping = aes(Phylum, value+0.1, color=Phylum, label=Family), vjust=0, size=2)) ## ----GPtaxaplot0----------------------------------------------------------- plot_bar(GP, x="human", fill="SampleType", facet_grid= ~ Phylum) ## ----GPdpcoa01------------------------------------------------------------- GP.dpcoa <- ordinate(GP, "DPCoA") pdpcoa <- plot_ordination(GP, GP.dpcoa, type="biplot", color="SampleType", shape="Phylum") shape.fac <- pdpcoa$data[, deparse(pdpcoa$mapping$shape)] man.shapes <- c(19, 21:25) names(man.shapes) <- c("Samples", levels(shape.fac)[levels(shape.fac)!="Samples"]) p2dpcoa <- pdpcoa + scale_shape_manual(values=man.shapes) ## ----GPdpcoa02------------------------------------------------------------- # Show just Samples or just Taxa plot_ordination(GP, GP.dpcoa, type="taxa", shape="Phylum") plot_ordination(GP, GP.dpcoa, type="samples", color="SampleType") # Split plot_ordination(GP, GP.dpcoa, type="split", color="SampleType", shape="Phylum") + ggplot2::scale_colour_discrete() ## ----distancefun----------------------------------------------------------- data(esophagus) distance(esophagus, "bray") distance(esophagus, "wunifrac") # weighted UniFrac distance(esophagus, "jaccard") # vegdist jaccard distance(esophagus, "g") # betadiver method option "g" ## ----eval=FALSE, echo=TRUE------------------------------------------------- # data(esophagus) # distance(esophagus, "wUniFrac") # distance(esophagus, "uUniFrac") ## -------------------------------------------------------------------------- # (Re)load UniFrac distance matrix and GlobalPatterns data data(GlobalPatterns) load(system.file("doc", "Unweighted_UniFrac.RData", package="phyloseq")) # Manually define color-shading vector based on sample type. colorScale <- rainbow(length(levels(get_variable(GlobalPatterns, "SampleType")))) cols <- colorScale[get_variable(GlobalPatterns, "SampleType")] GP.tip.labels <- as(get_variable(GlobalPatterns, "SampleType"), "character") # This is the actual hierarchical clustering call, specifying average-link clustering GP.hclust <- hclust(GPUF, method="average") plot(GP.hclust, col=cols) phyloseq/inst/doc/phyloseq-analysis.Rmd0000644000175400017540000011635313175714136021340 0ustar00biocbuildbiocbuild--- title: "Vignette for phyloseq: Analysis of high-throughput microbiome census data" output: BiocStyle::html_document: fig_height: 7 fig_width: 10 toc: yes toc_depth: 2 number_sections: true --- `r library("knitr")` `r opts_chunk$set(cache=FALSE, fig.width=9, message=FALSE, warning=FALSE)` Paul J. McMurdie and Susan Holmes [phyloseq Home Page](http://joey711.github.io/phyloseq/) If you find phyloseq and/or its tutorials useful, please acknowledge and cite phyloseq in your publications: **phyloseq: An R package for reproducible interactive analysis and graphics of microbiome census data** (2013) PLoS ONE 8(4):e61217 http://dx.plos.org/10.1371/journal.pone.0061217 # Other resources The phyloseq project also has a number of supporting online resources, most of which can by found at [the phyloseq home page](http://joey711.github.com/phyloseq/), or from the phyloseq stable release [page on Bioconductor](http://bioconductor.org/packages/release/bioc/html/phyloseq.html). To post feature requests or ask for help, try [the phyloseq Issue Tracker](https://github.com/joey711/phyloseq/issues). # Summary The analysis of microbiological communities brings many challenges: the integration of many different types of data with methods from ecology, genetics, phylogenetics, network analysis, visualization and testing. The data itself may originate from widely different sources, such as the microbiomes of humans, soils, surface and ocean waters, wastewater treatment plants, industrial facilities, and so on; and as a result, these varied sample types may have very different forms and scales of related data that is extremely dependent upon the experiment and its question(s). The phyloseq package is a tool to import, store, analyze, and graphically display complex phylogenetic sequencing data that has already been clustered into Operational Taxonomic Units (OTUs), especially when there is associated sample data, phylogenetic tree, and/or taxonomic assignment of the OTUs. This package leverages many of the tools available in R for ecology and phylogenetic analysis (vegan, ade4, ape, picante), while also using advanced/flexible graphic systems (ggplot2) to easily produce publication-quality graphics of complex phylogenetic data. phyloseq uses a specialized system of S4 classes to store all related phylogenetic sequencing data as single experiment-level object, making it easier to share data and reproduce analyses. In general, phyloseq seeks to facilitate the use of R for efficient interactive and reproducible analysis of OTU-clustered high-throughput phylogenetic sequencing data. # About this vignette A separate vignette is included within the phyloseq-package that describes the basics of importing pre-clustered phylogenetic sequencing data, data filtering, as well as some transformations and some additional details about the package and installation. A quick way to load it is: ```{r dontrun-basics-vignette, eval=FALSE} vignette("phyloseq-basics") ``` By contrast, this vignette is intended to provide functional examples of the analysis tools and wrappers included in phyloseq. All necessary code for performing the analysis and producing graphics will be included with its description, and the focus will be on the use of example data that is included and documented within the phyloseq-package. Let's start by loading the `phyloseq-package: ```{r load-packages, message=FALSE, warning=FALSE} library("phyloseq") library("ggplot2") ``` And because we will show examples of custom modifications to ggplot2 plots, we also loaded ggplot2 as well. Here I'll set as default my favorite ggplot2 theme. These are completely optional, and modifiable. ```{r ggplot2-themes} theme_set(theme_bw()) ``` # Data ## Interface with the microbio.me/qiime server See the [microbio_me_qiime tutorial](http://joey711.github.io/phyloseq/download-microbio.me.html) for more details and examples downloading and importing into phyloseq/R directly from this public database. ## Included Data To facilitate testing and exploration of tools in phyloseq, this package includes example data from published studies. Many of the examples in this vignette use either the [Global Patterns](http://www.pnas.org/content/early/2010/06/02/1000080107) or `enterotype` datasets as source data. The [Global Patterns](http://www.pnas.org/content/early/2010/06/02/1000080107) data was described in a [2011 article in PNAS](http://www.pnas.org/content/early/2010/06/02/1000080107)([Caporaso 2011](http://www.pnas.org/content/early/2010/06/02/1000080107)), and compares the microbial communities of 25 environmental samples and three known "mock communities" --- a total of 9 sample types --- at a depth averaging 3.1 million reads per sample. The [human enterotype dataset](http://www.nature.com/nature/journal/v473/n7346/full/nature09944.html) was described in a [2011 article in Nature](http://www.nature.com/nature/journal/v473/n7346/full/nature09944.html) ([Arumugam 2011](http://www.nature.com/nature/journal/v473/n7346/full/nature09944.html)), which compares the faecal microbial communities from 22 subjects using complete shotgun DNA sequencing. The authors further compare these microbial communities with the faecal communities of subjects from other studies, for a total of 280 faecal samples / subjects, and 553 genera. Sourcing data from different studies invariable leads to gaps in the data for certain variables, and this is easily handled by `R's core `NA features. Because this data is included in the package, the examples can easily be run on your own computer using the code shown in this vignette. The data is loaded into memory using the `data` command. Let's start by loading the [Global Patterns](http://www.pnas.org/content/early/2010/06/02/1000080107) data. ```{r} data(GlobalPatterns) ``` Later on we will use an additional categorical designation --- human versus non-human associated samples --- that was not in the original dataset. Now is a good time to add it as an explicit variable of the `sample_data`, and because we don't want to type long words over and over, we'll choose a shorter name for this modified version of [Global Patterns](http://www.pnas.org/content/early/2010/06/02/1000080107), call it `GP`, and also remove a handful of taxa that are not present in any of the samples included in this dataset (probably an artifact): ```{r } # prune OTUs that are not present in at least one sample GP <- prune_taxa(taxa_sums(GlobalPatterns) > 0, GlobalPatterns) # Define a human-associated versus non-human categorical variable: human <- get_variable(GP, "SampleType") %in% c("Feces", "Mock", "Skin", "Tongue") # Add new human variable to sample data: sample_data(GP)$human <- factor(human) ``` # Simple exploratory graphics ## Easy Richness Estimates For further details, see the [plot_richness tutorial](http://joey711.github.io/phyloseq/plot_richness-examples.html) We can easily create a complex graphic that compares the richness estimates of samples from different environment types in the [Global Patterns](http://www.pnas.org/content/early/2010/06/02/1000080107) dataset, using the `plot_richness` function. Note that it is important to use raw (untrimmed) OTU-clustered data when performing richness estimates, as they can be highly dependent on the number of singletons in a sample. ```{r richness_estimates0, fig.width=13, fig.height=7} alpha_meas = c("Observed", "Chao1", "ACE", "Shannon", "Simpson", "InvSimpson") (p <- plot_richness(GP, "human", "SampleType", measures=alpha_meas)) ``` Add a ggplot2 box plot layer to the previous plot ```{r richness_estimates, fig.width=13,height=7} p + geom_boxplot(data=p$data, aes(x=human, y=value, color=NULL), alpha=0.1) ``` Alpha diversity estimators for samples in the *Global Patterns* dataset. Each panel shows a different type of estimator. Individual color-shaded points and brackets represent the richness estimate and the theoretical standard error range associated with that estimate, respectively. The colors group the sample-sources into "types". Within each panel, the samples are further organized into human-associated (`TRUE`) or not (`FALSE`), and a boxplot is overlayed on top of this for the two groups, illustrating that these human-associated samples are less rich than the environmental samples (although the type of environment appears to matter a great deal as well). ## Exploratory tree plots For further details, see the [plot_tree tutorial](http://joey711.github.io/phyloseq/plot_tree-examples.html) phyloseq also contains a method for easily plotting an annotated phylogenetic tree with information regarding the sample in which a particular taxa was observed, and optionally the number of individuals that were observed. For the sake of creating a readable tree, let's subset the data to just the [Chlamydiae](http://en.wikipedia.org/wiki/Chlamydiae) phylum, which consists of obligate intracellular pathogens and is present in only a subset of environments in this dataset. ```{r } GP.chl <- subset_taxa(GP, Phylum=="Chlamydiae") ``` And now we will create the tree graphic form this subset of [Global Patterns](http://www.pnas.org/content/early/2010/06/02/1000080107), shading by the "`SampleType" variable, which indicates the environment category from which the microbiome samples originated. The following command also takes the option of labeling the number of individuals observed in each sample (if at all) of each taxa. The symbols are slightly enlarged as the number of individuals increases. ```{r GP-chl-tree, fig.width=15, fig.height=7, message=FALSE, warning=FALSE} plot_tree(GP.chl, color="SampleType", shape="Family", label.tips="Genus", size="Abundance") ``` Phylogenetic tree representation of the Chlamydiae species in the microbiome samples of the "Global Patterns" dataset([Caporaso 2011](http://www.pnas.org/content/early/2010/06/02/1000080107)). ## Exploratory bar plots For further details, see the [plot_bar tutorial](http://joey711.github.io/phyloseq/plot_bar-examples.html) In the following example we use the included "enterotype" dataset ([Arumugam 2011](http://www.nature.com/nature/journal/v473/n7346/full/nature09944.html)). ```{r} data(enterotype) ``` We start with a simple rank-abundance barplot, using the cumulative fractional abundance of each OTU in the dataset. In the enterotype dataset, the available published data are simplified as sample-wise fractional occurrences, rather than counts of individuals\footnote{Unfortunate, as this means we lose information about the total number of reads and associated confidences, ability to do more sophisticated richness estimates, etc. For example, knowing that we observed 1 sequence read of a species out of 100 total reads means something very different from observing 10,000 reads out of 1,000,000 total., and OTUs are clustered/labeled at the genus level, but no other taxonomic assignment is available. In this barplot we further normalized by the total number of samples (`r nsamples(enterotype)`). ```{r EntAbundPlot, fig.height=6, fig.width=8} par(mar = c(10, 4, 4, 2) + 0.1) # make more room on bottom margin N <- 30 barplot(sort(taxa_sums(enterotype), TRUE)[1:N]/nsamples(enterotype), las=2) ``` An example exploratory barplot using base `R graphics and the `taxa_sums and `nsamples functions. Note that this first barplot is clipped at the `r N`th OTU. This was chosen because `ntaxa(enterotype) =``r ntaxa(enterotype)` OTUs would not be legible on the plot. As you can see, the relative abundances have decreased dramatically by the 10th-ranked OTU. So what are these OTUs? In the `enterotype` dataset, only a single taxonomic rank type is present: ```{r} rank_names(enterotype) ``` This means the OTUs in this dataset have been grouped at the level of genera, and no other taxonomic grouping/transformation is possible without additional information (like might be present in a phylogenetic tree, or with further taxonomic classification analysis). We need to know which taxonomic rank classifiers, if any, we have available to specify in the second barplot function in this example, `plot_bar(). We have already observed how quickly the abundance decreases with rank, so wo we will subset the enterotype dataset to the most abundant `N taxa in order to make the barplot legible on this page. ```{r} TopNOTUs <- names(sort(taxa_sums(enterotype), TRUE)[1:10]) ent10 <- prune_taxa(TopNOTUs, enterotype) print(ent10) ``` Note also that there are `r nsamples(ent10)` samples in this dataset, and so a remaining challenge is to consolidate these samples into meaningful groups. A good place to look is the available sample variables, which in most cases will carry more "meaning" than the sample names alone. ```{r} sample_variables(ent10) ``` The parameters to `plot_bar` in the following code-chunk were chosen after various trials. We suggest that you also try different parameter settings while you're exploring different features of the data. In addition to the variables names of `sample_data`, the `plot_bar()` function recognizes the names of taxonomic ranks (if present). See the help documentation and further details in the examples and on the wiki page. In this example we have also elected to organize data by "facets" (separate, adjacent sub-plots) according to the genus of each OTU. Within each genus facet, the data is further separated by sequencing technology, and the enterotype label for the sample from which each OTU originated is indicated by fill color. Abundance values from different samples and OTUs but having the same variables mapped to the horizontal (`x`) axis are sorted and stacked, with thin horizontal lines designating the boundaries. With this display it is very clear that the choice of sequencing technology had a large effect on which genera were detected, as well as the fraction of OTUs that were assigned to a Genus. ```{r entbarplot0, fig.height=6, fig.width=10} plot_bar(ent10, "SeqTech", fill="Enterotype", facet_grid=~Genus) ``` An example exploratory bar plot using the `plot_bar` function. In this case we have faceted the data (abundance values) according to the genera of each OTU. The subset of OTUs that have not been assigned to a specific genus are in the `NA` panel. Within each facet, the data is further separated by sequencing technology, and each OTU is shaded according to the enterotype of the sample it form which it came. Abundance values from different samples and OTUs but having the same variables mapped to the horizontal (`x`) axis are sorted and stacked, with thin horizontal lines designating the boundaries. Figure summarizes quantitatively the increased abundances of Bacteroides and Prevotella in the Enterotypes 1 and 2, respectively. Interestingly, a large relative abundance of Blautia was observed for Enterotype 3, but only from 454-pyrosequencing data sets, not the Illumina or Sanger datasets. This suggests the increased Blautia might actually be an artifact. Similarly, Prevotella appears to be one of the most abundant genera in the Illumina-sequenced samples among Enterotype 3, but this is not reproduced in the 454-pyrosequencing or Sanger sequencing data. # Exploratory analysis and graphics ## Exploratory Heat Map For further details, see the [plot_heatmap tutorial](http://joey711.github.io/phyloseq/plot_heatmap-examples.html) As the number of taxa in a dataset gets very large, the ability to effectively display all of the elements of the data becomes compromised, and a heatmap representation is no exception. It can also be time-consuming to render. To address both these issues, we show an example in which we have subsetted the Global Patterns dataset to a manageable portion, in this case, the Crenarchaeota phylum. ```{r GPheatmap} data("GlobalPatterns") gpac <- subset_taxa(GlobalPatterns, Phylum=="Crenarchaeota") (p <- plot_heatmap(gpac, "NMDS", "bray", "SampleType", "Family")) ``` What if you wanted to change the axis labels? ```{r GPheatmap-rename-axes} p$scales$scales[[1]]$name <- "My X-Axis" p$scales$scales[[2]]$name <- "My Y-Axis" print(p) ``` Note that it is possible to order the sample/species indices by any of the ordination methods supported in the `ordinate` function; and also that the color scheme can be modified with additional arguments. Heat map representation of the Crenarchaeota phylum abundance pattern across different sample types in the Global Patterns dataset. ## Microbiome Network Representation For further details, see the [plot_network tutorial](http://joey711.github.io/phyloseq/plot_network-examples.html) Continuing with the `enterotype` dataset, here are some examples for creating a custom network representation of the relationship between microbiome samples in an experiment. This relies heavily on the igraph and ggplot2 packages to create a network display of the "connectedness" of samples according to some user-provided ecological similarity. By default, points represent microbiom samples, and are determined using an algorithm that optimizes the clarity of the display of network "edges", but the spatial position of points does not imply any continuous similarity information like would be the case in an ordination. In this example, the default dissimilarity index was used (Jaccard, co-occurrence), with a maximum distance of `0.3` required to create an edge. Any function that can operate on phyloseq-objects and return a sample-wise distance can be provided as the `dist.fun` argument, or a character string of the name of the distance function already supported in phyloseq. Other distances may result in very different clustering, and this is a choice that should be understood and not taken too lightly, although there is little harm in trying many different distances. Interestingly, at this level of analysis and parameter-settings the two major sub-graphs appear to be best explained by the sequencing technology and not the subject enterotype, suggesting that the choice of sequencing technology has a major effect on the microbial community one can observe. This seems to differ somewhat with the inferences described in the "enterotype" article ([Arumugam 2011](http://www.nature.com/nature/journal/v473/n7346/full/nature09944.html)). However, there could be some confounding or hidden variables that might also explain this phenomenon, and the well-known differences in the sequence totals between the technologies may also be an important factor. Furthermore, since this is clearly an experimental artifact (and they were including data from multiple studies that were not orginally planned for this purpose), it may be that the enterotype observation can also be shown in a network analysis of this data after removing the effect of sequencing technology and related sequencing effort. Such an effort would be interesting to show here, but is not yet included. ```{r plot_sample_network, fig.width=11, fig.height=7, message=FALSE, warning=FALSE} data(enterotype) plot_net(enterotype, maxdist=0.4, color="SeqTech", shape="Enterotype") ``` Network representation of the relationship between microbiome samples in the "Enterotype" dataset ([Arumugam 2011](http://www.nature.com/nature/journal/v473/n7346/full/nature09944.html)). ## Ordination Methods For further details, see the [plot_ordination tutorial](http://joey711.github.io/phyloseq/plot_ordination-examples.html) Ordination methods can be a useful tool for exploring complex phylogenetic sequencing data, particularly when the hypothesized structure of the data is poorly defined (or there isn't a hypothesis). The phyloseq package provides some useful tools for performing ordinations and plotting their results, via the `ordinate() and `plot_ordination() functions, respectively. Although there are many options and methods supported, a first-step will probably look something like the following: ```{r eval=FALSE} my.physeq <- import("Biom", BIOMfilename="myBiomFile.biom") my.ord <- ordinate(my.physeq) plot_ordination(my.physeq, my.ord, color="myFavoriteVarible") ``` It is probably a good idea to read the documentation for these two functions, as they also provide links to related functions and additional examples you can try immediately on your own machine. ```{r help-import, eval=FALSE} help(import) help(ordinate) help(distance) help(plot_ordination) ``` ### Principal Coordinates Analysis (PCoA) We take as our first example, a reproduction of Figure 5 from the "Global Patterns" article([Caporaso 2011](http://www.pnas.org/content/early/2010/06/02/1000080107)). The authors show a 3-dimensional representation of the first three axes of a Principal Coordinates Analysis (PCoA; This is also sometimes referred to as "Multi-Dimensional Scaling", or "MDS") performed on the unweighted-UniFrac distance using all of the available sequences (their approach included both 5' and 3' sequences). According to the authors, "the first axis [appears to be associated with a] host associated/free living [classification]," and similarly the third axis with "saline/nonsaline environment[s]." The following reproduces the unweighted UniFrac distance calculation on the full dataset. Note that this calculation can take a long time because of the large number of OTUs. Parallelization is recommended for large datasets, typically if they are as large as [Global Patterns](http://www.pnas.org/content/early/2010/06/02/1000080107), or larger. For details on parallelization, see the details section and examples in the `UniFrac()` documentation, and also the page dedicated to the topic on [the phyloseq-demos site](http://joey711.github.io/phyloseq-demo/): http://joey711.github.io/phyloseq-demo/unifrac.html ```{r GP-data-load} data(GlobalPatterns) ``` ```{r, eval=FALSE} GPUF <- UniFrac(GlobalPatterns) ``` Load the pre-computed distance matrix, `GPUF` ```{r load-precomputed-UF} load(system.file("doc", "Unweighted_UniFrac.RData", package="phyloseq")) ``` Calculate the PCoA on this distance matrix, `GPUF`. ```{r} GloPa.pcoa = ordinate(GlobalPatterns, method="PCoA", distance=GPUF) ``` Before we look at the results, let's first investigate how much of the total distance structure we will capture in the first few axes. We can do this graphically with a "scree plot", an ordered barplot of the relative fraction of the total eigenvalues associated with each axis. ```{r PCoAScree, fig.width=6, fig.height=4} plot_scree(GloPa.pcoa, "Scree plot for Global Patterns, UniFrac/PCoA") ``` Scree plot of the PCoA used to create Figure 5 from the "Global Patterns" article([Caporaso 2011](http://www.pnas.org/content/early/2010/06/02/1000080107)). The first three axes represent `r round(100*sum(GloPa.pcoa$values$Relative_eig[1:3]))`% of the total variation in the distances. Interestingly, the fourth axis represents another `r round(100*(GloPa.pcoa$values$Relative_eig[4]))`%, and so may warrant exploration as well. A scree plot is an important tool for any ordination method, as the relative importance of axes can vary widely from one dataset to another. Next, we will reproduce Figure 5 from the "Global Patterns" article([Caporaso 2011](http://www.pnas.org/content/early/2010/06/02/1000080107)), but separating the three axes into 2 plots using `plot_ordination()`. ```{r GPfig5ax1213} (p12 <- plot_ordination(GlobalPatterns, GloPa.pcoa, "samples", color="SampleType") + geom_point(size=5) + geom_path() + scale_colour_hue(guide = FALSE) ) (p13 <- plot_ordination(GlobalPatterns, GloPa.pcoa, "samples", axes=c(1, 3), color="SampleType") + geom_line() + geom_point(size=5) ) ``` A reproduction in phyloseq / R of the main panel of Figure 5 from the "Global Patterns" article([Caporaso 2011](http://www.pnas.org/content/early/2010/06/02/1000080107)), on two plots. The horizontal axis represents the first axis in the PCoA ordination, while the top and bottom vertical axes represent the second and third axes, respectively. Different points represent different samples within the dataset, and are shaded according to the environment category to which they belong. The color scheme is the default used by ggplot. ### non-metric Multi-Dimensional Scaling (NMDS) We repeat the previous example, but instead using non-metric multidimensional scaling (NMDS) limited to just two dimensions. This approach limits the amount of residual distance "not shown" in the first two (or three) axes, but forefeits some mathematical properties and does not always converge within the specified number of axes. ```{r GP_UF_NMDS0} # (Re)load UniFrac distance matrix and GlobalPatterns data data(GlobalPatterns) load(system.file("doc", "Unweighted_UniFrac.RData", package="phyloseq")) # perform NMDS, set to 2 axes GP.NMDS <- ordinate(GlobalPatterns, "NMDS", GPUF) (p <- plot_ordination(GlobalPatterns, GP.NMDS, "samples", color="SampleType") + geom_line() + geom_point(size=5) ) ``` An example exploratory ordination using non-metric multidimensional scaling (NMDS) on the unweighted UniFrac distance between samples of the "Global Patterns" dataset. Sample points are shaded by environment type, and connected by a line if they belong to the same type. Compare with Figure 5 from the "Global Patterns" article([Caporaso 2011](http://www.pnas.org/content/early/2010/06/02/1000080107)). The figure nicely shows the relative dissimilarities between microbial communities from different habitats. However, it fails to indicate what was different between the communities. For an ordination method that provides information on the taxa that explain differences between samples (or groups of samples), we use Correspondence Analysis. ### Correspondence Analysis (CA) In the following section we will show continue our exploration of the "GlobalPatterns" dataset using various features of an ordination method called Correspondence Analysis. We give special emphasis to exploratory interpretations using the biplot, because it provides additional information that is not available from PCoA or NMDS. Let's start by performing a Correspondence Analysis and investigating the scree plot. Both interestingly and challengingly, the scree plot suggests that the [Global Patterns](http://www.pnas.org/content/early/2010/06/02/1000080107) abundance data is quite high-dimensional, with the first two CA axes accounting for not quite 17% of the total (chi-square) variability. Note the absence of a steep decline in eigenvalue fraction as axis number increases. Each additional axis represents only marginally less variability than the previous. It is often more convenient if the first two (or three) axes account for most of the variability. First, let's severely subset the number of species for the sake of run-time.\footnote{This is for illustration purposes only, do not repeat unless you are very sure you have a good reason for doing this. ```{r GPCAscree0, fig=FALSE} data(GlobalPatterns) # Take a subset of the GP dataset, top 200 species topsp <- names(sort(taxa_sums(GlobalPatterns), TRUE)[1:200]) GP <- prune_taxa(topsp, GlobalPatterns) # Subset further to top 5 phyla, among the top 200 OTUs. top5ph <- sort(tapply(taxa_sums(GP), tax_table(GP)[, "Phylum"], sum), decreasing=TRUE)[1:5] GP <- subset_taxa(GP, Phylum %in% names(top5ph)) # Re-add human variable to sample data: sample_data(GP)$human <- factor(human) ``` Now perform the correspondence analysis. ```{r GPCAscree, fig.width=8, fig.height=5} # Now perform a unconstrained correspondence analysis gpca <- ordinate(GP, "CCA") # Scree plot plot_scree(gpca, "Scree Plot for Global Patterns Correspondence Analysis") ``` The correspondence analysis (CA) scree plot of the "Global Patterns" dataset. Now let's investigate how the samples behave on the first few CA axes. ```{r GPCA1234} (p12 <- plot_ordination(GP, gpca, "samples", color="SampleType") + geom_line() + geom_point(size=5) ) (p34 <- plot_ordination(GP, gpca, "samples", axes=c(3, 4), color="SampleType") + geom_line() + geom_point(size=5) ) ``` First 4 axes of Correspondence Analysis (CA) of the "Global Patterns" dataset ([Caporaso 2011](http://www.pnas.org/content/early/2010/06/02/1000080107)). A clear feature of these plots is that the feces and mock communities cluster tightly together, far away from all other samples on the first axis (CA1). The skin and tongue samples separate similarly, but on the second axis. Taken together, it appears that the first two axes are best explained by the separation of human-associated "environments" from the other non-human environments in the dataset, with a secondary separation of tongue and skin samples from feces. We will now investigate further this top-level structure of the data, using an additional feature of correspondence analysis that allows us to compare the relative contributions of individual taxa on the same graphical space: the "biplot". However, because we just displayed the position of samples in the ordination and there are often many thousands of OTUs, we will focus on creating an interpretable plot of the OTUs. For creating graphics that combine the two plots, try the `"biplot"` or `"split"` option for `type` in `plot_ordination()`. ```{r GPCAspecplot0} p1 <- plot_ordination(GP, gpca, "species", color="Phylum") (p1 <- ggplot(p1$data, p1$mapping) + geom_point(size=5, alpha=0.5) + facet_wrap(~Phylum) + scale_colour_hue(guide = FALSE) ) ``` Species plot of the "Global Patterns" correspondence analysis first two axes, with each phylum on a different panel ("facet"). Only the most abundant 5 phyla among the most abundant 200 taxa (cumulative, all samples) are included. Arbitrary reduction, for computational efficiency of example. Let's try drawing the figure again, only this time summarizing the species points as a 2D density estimate, without any individual points. ```{r GPCAspecplotTopo0} (p3 <- ggplot(p1$data, p1$mapping) + geom_density2d() + facet_wrap(~Phylum) + scale_colour_hue(guide = FALSE) ) ``` Redrawn figure, which is severely overplotted, as a 2-dimensional species-density topographic map, faceted in the same way. These figures reveal some useful patterns and interesting outliers, but what if we want a complete summary of how each phylum is represented along each axis? The following code is a way to show this using boxplots, while still avoiding the occlusion problem (points layered on top of each other), and also conveying some useful information about the pattern of taxa that contribute to the separation of human-associated samples from the other sample types. It re-uses the data that was stored in the `ggplot2` plot object created in the previous figure, `p`, and creates a new boxlot graphical summary of the positions of each phylum. ```{r GPCAjitter0} library("reshape2") # Melt the species-data.frame, DF, to facet each CA axis separately mdf <- melt(p1$data[, c("CA1", "CA2", "Phylum", "Family", "Genus")], id=c("Phylum", "Family", "Genus") ) # Select some special outliers for labelling LF <- subset(mdf, variable=="CA2" & value < -1.0) # build plot: boxplot summaries of each CA-axis, with labels p <- ggplot(mdf, aes(Phylum, value, color=Phylum)) + geom_boxplot() + facet_wrap(~variable, 2) + scale_colour_hue(guide = FALSE) + theme_bw() + theme( axis.text.x = element_text(angle = -90, vjust = 0.5) ) # Add the text label layer, and render ggplot graphic (p <- p + geom_text(data=subset(LF, !is.na(Family)), mapping = aes(Phylum, value+0.1, color=Phylum, label=Family), vjust=0, size=2)) ``` Boxplot of taxa (species in this case) of the "Global Patterns" CA first two axes, shaded/separated by phylum. Through this approach it is much easier to see particular species that cluster unusually relative to the rest of their phylum, for example the Bacteroidetes species (Prevotellaceae family) that is positioned most in the negative CA2 direction toward the Tongue/Skin samples. One way to relate some of the high-level patterns we observed from correspondence analysis is to directly visualize the abundances in an organized, quantitative way, to see if this does in fact support / explain the human/environment microbiome differences. Here is an example using the `plot_bar` function described in an earlier section. ```{r GPtaxaplot0} plot_bar(GP, x="human", fill="SampleType", facet_grid= ~ Phylum) ``` Phylum-level comparison of relative abundance of taxa in samples that are from human microbiomes (or not). In this figure we've used the `threshold` parameter to omit all but phyla accounting for the top 90% of phyla in any one sample. Some patterns emerging from this display appear to be: (1) Cyanobacteria, Actinobacteria appear under-represented in human samples; (2) conversely, Firmicutes appear over-represented in human samples; (3) Acidobacteria, Verrucomicrobia appear over-represented in the fecal samples; (4) the only Crenarchaeota were observed in the Mock sample, which is not really a community but a simulated community used as a control. These are not hugely surprising based on previous biological observations from the field, but it is hopefully useful code that can be applied on other datasets that you might have. ### Double Principle Coordinate Analysis (DPCoA) Here is a quick example illustrating the use of Double Principal Coordinate Analysis (DPCoA~\cite{Pavoine2004523), using the using the `ordinate()` function in phyloseq, as well as the "biplot" option for `plot_ordination(). For a description that includes an applied example using the "enterotype" dataset and comparison with UniFrac/PCoA, see Fukuyama et al~\cite{fukuyama2012com. ```{r GPdpcoa01} GP.dpcoa <- ordinate(GP, "DPCoA") pdpcoa <- plot_ordination(GP, GP.dpcoa, type="biplot", color="SampleType", shape="Phylum") shape.fac <- pdpcoa$data[, deparse(pdpcoa$mapping$shape)] man.shapes <- c(19, 21:25) names(man.shapes) <- c("Samples", levels(shape.fac)[levels(shape.fac)!="Samples"]) p2dpcoa <- pdpcoa + scale_shape_manual(values=man.shapes) ``` A biplot representation of a Double Principal Coordinate Analysis (DPCoA), on a simplified version of the "Global Patterns" dataset with only the most abundant 200 OTUs included. ```{r GPdpcoa02} # Show just Samples or just Taxa plot_ordination(GP, GP.dpcoa, type="taxa", shape="Phylum") plot_ordination(GP, GP.dpcoa, type="samples", color="SampleType") # Split plot_ordination(GP, GP.dpcoa, type="split", color="SampleType", shape="Phylum") + ggplot2::scale_colour_discrete() ``` ## Distance Methods ### distance(): Central Distance Function Many comparisons of microbiome samples, including the graphical model and the PCoA analysis, require a calculation for the relative dissimilarity/distance between one microbial community and another. The phyloseq-package provides a general "wrapper" function for calculating ecological distance matrices between the samples in an experiment. `distance()` currently supports 43 method options, as well as user-provided arbitrary methods via an interface to vegan's `designdist()` function. Currrently only sample-wise distances are supported (the `type` argument), but eventually species-wise (OTU-wise) distances will be supported as well. In addition to supporting any of the method options to the three main distance functions of the vegan-package~\cite{veganpkg --- including the 14 distances of the `vegdist()` function and all 24 ecological distances reviewed in Koleff et al. 2003~\cite{Koleff2003JAE coded by `betadiver` --- `distance()` will eventually support many of the distance methods in the ade4-package~\cite{Dray:2007vs, and others. It also supports the Fast UniFrac distance function (Section~\ref{sec:unifrac) included in phyloseq as native R code, and a wrapper for retreiving the sample-distances from Double Principal Coordinate Analysis (DPCoA). The function takes a `phyloseq-class` object and an argument indicating the distance type; and it returns a `dist-class distance matrix. ```{r distancefun} data(esophagus) distance(esophagus, "bray") distance(esophagus, "wunifrac") # weighted UniFrac distance(esophagus, "jaccard") # vegdist jaccard distance(esophagus, "g") # betadiver method option "g" ``` ### UniFrac and weighted UniFrac UniFrac is a recently-defined~\cite{Lozupone:2005gn and popular distance metric to summarize the difference between pairs of ecological communities. All UniFrac variants use a phylogenetic tree of the relationship among taxa as central information to calculating the distance between two samples/communities. An unweighted UniFrac distance matrix only considers the presence/absence of taxa, while weighted UniFrac accounts for the relative abundance of taxa as well as their phylogenetic distance. Prior to phyloseq, a non-parallelized, non-Fast implementation of the unweighted UniFrac was available in \R{ packages (`picante::unifrac`~\cite{Kembel:2010ft). In the phyloseq package we provide optionally-parallelized implementations of Fast UniFrac~\cite{Hamady:2009fk (both weighted and unweighted, with plans for additional UniFrac variants), all of which return a sample-wise distance matrix from any `phyloseq-class object that contains a phylogenetic tree component. The following is an example calculating the UniFrac distance (both weighted and unweighted) matrix using the "esophagus" example dataset: ```{r eval=FALSE, echo=TRUE} data(esophagus) distance(esophagus, "wUniFrac") distance(esophagus, "uUniFrac") ``` See the phyloseq demo page about fast parallel UniFrac. ## Hierarchical Clustering Another potentially useful and popular way to visualize/decompose sample-distance matrices is through hierarchical clustering (e.g. `hclust`). In the following example, we reproduce Figure~4 from the ["Global Patterns" article](http://www.pnas.org/content/early/2010/06/02/1000080107), using the unweighted UniFrac distance and the UPGMA method (`hclust` parameter `method="average"`). Try `help("hclust")` for alternative clustering methods included in standard R. ```{r} # (Re)load UniFrac distance matrix and GlobalPatterns data data(GlobalPatterns) load(system.file("doc", "Unweighted_UniFrac.RData", package="phyloseq")) # Manually define color-shading vector based on sample type. colorScale <- rainbow(length(levels(get_variable(GlobalPatterns, "SampleType")))) cols <- colorScale[get_variable(GlobalPatterns, "SampleType")] GP.tip.labels <- as(get_variable(GlobalPatterns, "SampleType"), "character") # This is the actual hierarchical clustering call, specifying average-link clustering GP.hclust <- hclust(GPUF, method="average") plot(GP.hclust, col=cols) ``` An alternative means of summarizing a distance matrix via hierarchical clustering and plotting as an annotated dendrogram. Compare with Figure 4 from the [Global Patterns](http://www.pnas.org/content/early/2010/06/02/1000080107)). Some differences in Figure~\ref{fig:GPfig4 from the original article might be explained by [Global Patterns](http://www.pnas.org/content/early/2010/06/02/1000080107) in phyloseq being the summed observations from both primer directions (5' and 3'), while in the article they show the results separately. Furthermore, in the article the "mock" community is not included in the dataset, but an extra fecal sample is included. # Multiple Testing and Differential Abundance One of our recommended approaches to this problem was described in McMurdie and Holmes (2014) [Waste Not, Want Not: Why Rarefying Microbiome Data is Inadmissible](http://dx.plos.org/10.1371/journal.pcbi.1003531). PLoS Computational Biology. 10(4):e1003531 Some reproducible demonstrations of this approach are included in [the phyloseq extensions repository](http://joey711.github.io/phyloseq-extensions/extensions-index.html), the `phyloseq_to_deseq2` function, as well as a separate vignetted dedicated to this topic (phyloseq and DESeq2 on Colorectal Cancer Data). Please make use of these materials for differential abundance testing. phyloseq/inst/doc/phyloseq-analysis.html0000644000175400017540001564354413177723062021577 0ustar00biocbuildbiocbuild Vignette for phyloseq: Analysis of high-throughput microbiome census data

Contents

Paul J. McMurdie and Susan Holmes

mcmurdie@stanford.edu

phyloseq Home Page

If you find phyloseq and/or its tutorials useful, please acknowledge and cite phyloseq in your publications:

phyloseq: An R package for reproducible interactive analysis and graphics of microbiome census data (2013) PLoS ONE 8(4):e61217 http://dx.plos.org/10.1371/journal.pone.0061217

1 Other resources

The phyloseq project also has a number of supporting online resources, most of which can by found at the phyloseq home page, or from the phyloseq stable release page on Bioconductor.

To post feature requests or ask for help, try the phyloseq Issue Tracker.

2 Summary

The analysis of microbiological communities brings many challenges: the integration of many different types of data with methods from ecology, genetics, phylogenetics, network analysis, visualization and testing. The data itself may originate from widely different sources, such as the microbiomes of humans, soils, surface and ocean waters, wastewater treatment plants, industrial facilities, and so on; and as a result, these varied sample types may have very different forms and scales of related data that is extremely dependent upon the experiment and its question(s). The phyloseq package is a tool to import, store, analyze, and graphically display complex phylogenetic sequencing data that has already been clustered into Operational Taxonomic Units (OTUs), especially when there is associated sample data, phylogenetic tree, and/or taxonomic assignment of the OTUs. This package leverages many of the tools available in R for ecology and phylogenetic analysis (vegan, ade4, ape, picante), while also using advanced/flexible graphic systems (ggplot2) to easily produce publication-quality graphics of complex phylogenetic data. phyloseq uses a specialized system of S4 classes to store all related phylogenetic sequencing data as single experiment-level object, making it easier to share data and reproduce analyses. In general, phyloseq seeks to facilitate the use of R for efficient interactive and reproducible analysis of OTU-clustered high-throughput phylogenetic sequencing data.

3 About this vignette

A separate vignette is included within the phyloseq-package that describes the basics of importing pre-clustered phylogenetic sequencing data, data filtering, as well as some transformations and some additional details about the package and installation. A quick way to load it is:

vignette("phyloseq-basics")

By contrast, this vignette is intended to provide functional examples of the analysis tools and wrappers included in phyloseq. All necessary code for performing the analysis and producing graphics will be included with its description, and the focus will be on the use of example data that is included and documented within the phyloseq-package.

Let’s start by loading the `phyloseq-package:

library("phyloseq")
library("ggplot2")

And because we will show examples of custom modifications to ggplot2 plots, we also loaded ggplot2 as well. Here I’ll set as default my favorite ggplot2 theme. These are completely optional, and modifiable.

theme_set(theme_bw())

4 Data

4.1 Interface with the microbio.me/qiime server

See the microbio_me_qiime tutorial for more details and examples downloading and importing into phyloseq/R directly from this public database.

4.2 Included Data

To facilitate testing and exploration of tools in phyloseq, this package includes example data from published studies. Many of the examples in this vignette use either the Global Patterns or enterotype datasets as source data. The Global Patterns data was described in a 2011 article in PNAS(Caporaso 2011), and compares the microbial communities of 25 environmental samples and three known “mock communities” — a total of 9 sample types — at a depth averaging 3.1 million reads per sample. The human enterotype dataset was described in a 2011 article in Nature (Arumugam 2011), which compares the faecal microbial communities from 22 subjects using complete shotgun DNA sequencing. The authors further compare these microbial communities with the faecal communities of subjects from other studies, for a total of 280 faecal samples / subjects, and 553 genera. Sourcing data from different studies invariable leads to gaps in the data for certain variables, and this is easily handled by R's coreNA features.

Because this data is included in the package, the examples can easily be run on your own computer using the code shown in this vignette. The data is loaded into memory using the data command. Let’s start by loading the Global Patterns data.

data(GlobalPatterns)

Later on we will use an additional categorical designation — human versus non-human associated samples — that was not in the original dataset. Now is a good time to add it as an explicit variable of the sample_data, and because we don’t want to type long words over and over, we’ll choose a shorter name for this modified version of Global Patterns, call it GP, and also remove a handful of taxa that are not present in any of the samples included in this dataset (probably an artifact):

# prune OTUs that are not present in at least one sample
GP <- prune_taxa(taxa_sums(GlobalPatterns) > 0, GlobalPatterns)
# Define a human-associated versus non-human categorical variable:
human <- get_variable(GP, "SampleType") %in% c("Feces", "Mock", "Skin", "Tongue")
# Add new human variable to sample data:
sample_data(GP)$human <- factor(human)

5 Simple exploratory graphics

5.1 Easy Richness Estimates

For further details, see the plot_richness tutorial

We can easily create a complex graphic that compares the richness estimates of samples from different environment types in the Global Patterns dataset, using the plot_richness function. Note that it is important to use raw (untrimmed) OTU-clustered data when performing richness estimates, as they can be highly dependent on the number of singletons in a sample.

alpha_meas = c("Observed", "Chao1", "ACE", "Shannon", "Simpson", "InvSimpson")
(p <- plot_richness(GP, "human", "SampleType", measures=alpha_meas))

Add a ggplot2 box plot layer to the previous plot

p + geom_boxplot(data=p$data, aes(x=human, y=value, color=NULL), alpha=0.1)

Alpha diversity estimators for samples in the Global Patterns dataset. Each panel shows a different type of estimator. Individual color-shaded points and brackets represent the richness estimate and the theoretical standard error range associated with that estimate, respectively. The colors group the sample-sources into “types”. Within each panel, the samples are further organized into human-associated (TRUE) or not (FALSE), and a boxplot is overlayed on top of this for the two groups, illustrating that these human-associated samples are less rich than the environmental samples (although the type of environment appears to matter a great deal as well).

5.2 Exploratory tree plots

For further details, see the plot_tree tutorial

phyloseq also contains a method for easily plotting an annotated phylogenetic tree with information regarding the sample in which a particular taxa was observed, and optionally the number of individuals that were observed.

For the sake of creating a readable tree, let’s subset the data to just the Chlamydiae phylum, which consists of obligate intracellular pathogens and is present in only a subset of environments in this dataset.

GP.chl <- subset_taxa(GP, Phylum=="Chlamydiae")

And now we will create the tree graphic form this subset of Global Patterns, shading by the “`SampleType” variable, which indicates the environment category from which the microbiome samples originated. The following command also takes the option of labeling the number of individuals observed in each sample (if at all) of each taxa. The symbols are slightly enlarged as the number of individuals increases.

plot_tree(GP.chl, color="SampleType", shape="Family", label.tips="Genus", size="Abundance")

Phylogenetic tree representation of the Chlamydiae species in the microbiome samples of the “Global Patterns” dataset(Caporaso 2011).

5.3 Exploratory bar plots

For further details, see the plot_bar tutorial

In the following example we use the included “enterotype” dataset (Arumugam 2011).

data(enterotype)

We start with a simple rank-abundance barplot, using the cumulative fractional abundance of each OTU in the dataset. In the enterotype dataset, the available published data are simplified as sample-wise fractional occurrences, rather than counts of individuals\footnote{Unfortunate, as this means we lose information about the total number of reads and associated confidences, ability to do more sophisticated richness estimates, etc. For example, knowing that we observed 1 sequence read of a species out of 100 total reads means something very different from observing 10,000 reads out of 1,000,000 total., and OTUs are clustered/labeled at the genus level, but no other taxonomic assignment is available. In this barplot we further normalized by the total number of samples (280).

par(mar = c(10, 4, 4, 2) + 0.1) # make more room on bottom margin
N <- 30
barplot(sort(taxa_sums(enterotype), TRUE)[1:N]/nsamples(enterotype), las=2)

An example exploratory barplot using base R graphics and thetaxa_sums and `nsamples functions.

Note that this first barplot is clipped at the 30th OTU. This was chosen because ntaxa(enterotype) =553 OTUs would not be legible on the plot. As you can see, the relative abundances have decreased dramatically by the 10th-ranked OTU.

So what are these OTUs? In the enterotype dataset, only a single taxonomic rank type is present:

rank_names(enterotype)
## [1] "Genus"

This means the OTUs in this dataset have been grouped at the level of genera, and no other taxonomic grouping/transformation is possible without additional information (like might be present in a phylogenetic tree, or with further taxonomic classification analysis).

We need to know which taxonomic rank classifiers, if any, we have available to specify in the second barplot function in this example, plot_bar(). We have already observed how quickly the abundance decreases with rank, so wo we will subset the enterotype dataset to the most abundantN taxa in order to make the barplot legible on this page.

TopNOTUs <- names(sort(taxa_sums(enterotype), TRUE)[1:10]) 
ent10   <- prune_taxa(TopNOTUs, enterotype)
print(ent10)
## phyloseq-class experiment-level object
## otu_table()   OTU Table:         [ 10 taxa and 280 samples ]
## sample_data() Sample Data:       [ 280 samples by 9 sample variables ]
## tax_table()   Taxonomy Table:    [ 10 taxa by 1 taxonomic ranks ]

Note also that there are 280 samples in this dataset, and so a remaining challenge is to consolidate these samples into meaningful groups. A good place to look is the available sample variables, which in most cases will carry more “meaning” than the sample names alone.

sample_variables(ent10)
## [1] "Enterotype"     "Sample_ID"      "SeqTech"        "SampleID"      
## [5] "Project"        "Nationality"    "Gender"         "Age"           
## [9] "ClinicalStatus"

The parameters to plot_bar in the following code-chunk were chosen after various trials. We suggest that you also try different parameter settings while you’re exploring different features of the data. In addition to the variables names of sample_data, the plot_bar() function recognizes the names of taxonomic ranks (if present). See the help documentation and further details in the examples and on the wiki page. In this example we have also elected to organize data by “facets” (separate, adjacent sub-plots) according to the genus of each OTU. Within each genus facet, the data is further separated by sequencing technology, and the enterotype label for the sample from which each OTU originated is indicated by fill color. Abundance values from different samples and OTUs but having the same variables mapped to the horizontal (x) axis are sorted and stacked, with thin horizontal lines designating the boundaries. With this display it is very clear that the choice of sequencing technology had a large effect on which genera were detected, as well as the fraction of OTUs that were assigned to a Genus.

plot_bar(ent10, "SeqTech", fill="Enterotype", facet_grid=~Genus)

An example exploratory bar plot using the plot_bar function. In this case we have faceted the data (abundance values) according to the genera of each OTU. The subset of OTUs that have not been assigned to a specific genus are in the NA panel. Within each facet, the data is further separated by sequencing technology, and each OTU is shaded according to the enterotype of the sample it form which it came. Abundance values from different samples and OTUs but having the same variables mapped to the horizontal (x) axis are sorted and stacked, with thin horizontal lines designating the boundaries.

Figure summarizes quantitatively the increased abundances of Bacteroides and Prevotella in the Enterotypes 1 and 2, respectively. Interestingly, a large relative abundance of Blautia was observed for Enterotype 3, but only from 454-pyrosequencing data sets, not the Illumina or Sanger datasets. This suggests the increased Blautia might actually be an artifact. Similarly, Prevotella appears to be one of the most abundant genera in the Illumina-sequenced samples among Enterotype 3, but this is not reproduced in the 454-pyrosequencing or Sanger sequencing data.

6 Exploratory analysis and graphics

6.1 Exploratory Heat Map

For further details, see the plot_heatmap tutorial

As the number of taxa in a dataset gets very large, the ability to effectively display all of the elements of the data becomes compromised, and a heatmap representation is no exception. It can also be time-consuming to render. To address both these issues, we show an example in which we have subsetted the Global Patterns dataset to a manageable portion, in this case, the Crenarchaeota phylum.

data("GlobalPatterns")
gpac <- subset_taxa(GlobalPatterns, Phylum=="Crenarchaeota")
(p <- plot_heatmap(gpac, "NMDS", "bray", "SampleType", "Family"))

What if you wanted to change the axis labels?

p$scales$scales[[1]]$name <- "My X-Axis"
p$scales$scales[[2]]$name <- "My Y-Axis"
print(p)

Note that it is possible to order the sample/species indices by any of the ordination methods supported in the ordinate function; and also that the color scheme can be modified with additional arguments.

Heat map representation of the Crenarchaeota phylum abundance pattern across different sample types in the Global Patterns dataset.

6.2 Microbiome Network Representation

For further details, see the plot_network tutorial

Continuing with the enterotype dataset, here are some examples for creating a custom network representation of the relationship between microbiome samples in an experiment. This relies heavily on the igraph and ggplot2 packages to create a network display of the “connectedness” of samples according to some user-provided ecological similarity. By default, points represent microbiom samples, and are determined using an algorithm that optimizes the clarity of the display of network “edges”, but the spatial position of points does not imply any continuous similarity information like would be the case in an ordination.

In this example, the default dissimilarity index was used (Jaccard, co-occurrence), with a maximum distance of 0.3 required to create an edge. Any function that can operate on phyloseq-objects and return a sample-wise distance can be provided as the dist.fun argument, or a character string of the name of the distance function already supported in phyloseq. Other distances may result in very different clustering, and this is a choice that should be understood and not taken too lightly, although there is little harm in trying many different distances.

Interestingly, at this level of analysis and parameter-settings the two major sub-graphs appear to be best explained by the sequencing technology and not the subject enterotype, suggesting that the choice of sequencing technology has a major effect on the microbial community one can observe. This seems to differ somewhat with the inferences described in the “enterotype” article (Arumugam 2011). However, there could be some confounding or hidden variables that might also explain this phenomenon, and the well-known differences in the sequence totals between the technologies may also be an important factor. Furthermore, since this is clearly an experimental artifact (and they were including data from multiple studies that were not orginally planned for this purpose), it may be that the enterotype observation can also be shown in a network analysis of this data after removing the effect of sequencing technology and related sequencing effort. Such an effort would be interesting to show here, but is not yet included.

data(enterotype)
plot_net(enterotype, maxdist=0.4, color="SeqTech", shape="Enterotype")

Network representation of the relationship between microbiome samples in the “Enterotype” dataset (Arumugam 2011).

6.3 Ordination Methods

For further details, see the plot_ordination tutorial

Ordination methods can be a useful tool for exploring complex phylogenetic sequencing data, particularly when the hypothesized structure of the data is poorly defined (or there isn’t a hypothesis). The phyloseq package provides some useful tools for performing ordinations and plotting their results, via the ordinate() andplot_ordination() functions, respectively. Although there are many options and methods supported, a first-step will probably look something like the following:

my.physeq <- import("Biom", BIOMfilename="myBiomFile.biom")
my.ord    <- ordinate(my.physeq)
plot_ordination(my.physeq, my.ord, color="myFavoriteVarible")

It is probably a good idea to read the documentation for these two functions, as they also provide links to related functions and additional examples you can try immediately on your own machine.

help(import)
help(ordinate)
help(distance)
help(plot_ordination)

6.3.1 Principal Coordinates Analysis (PCoA)

We take as our first example, a reproduction of Figure 5 from the “Global Patterns” article(Caporaso 2011). The authors show a 3-dimensional representation of the first three axes of a Principal Coordinates Analysis (PCoA; This is also sometimes referred to as “Multi-Dimensional Scaling”, or “MDS”) performed on the unweighted-UniFrac distance using all of the available sequences (their approach included both 5’ and 3’ sequences). According to the authors, “the first axis [appears to be associated with a] host associated/free living [classification],” and similarly the third axis with “saline/nonsaline environment[s].”

The following reproduces the unweighted UniFrac distance calculation on the full dataset. Note that this calculation can take a long time because of the large number of OTUs. Parallelization is recommended for large datasets, typically if they are as large as Global Patterns, or larger. For details on parallelization, see the details section and examples in the UniFrac() documentation, and also the page dedicated to the topic on the phyloseq-demos site:

http://joey711.github.io/phyloseq-demo/unifrac.html

data(GlobalPatterns)
GPUF <- UniFrac(GlobalPatterns)

Load the pre-computed distance matrix, GPUF

load(system.file("doc", "Unweighted_UniFrac.RData", package="phyloseq"))

Calculate the PCoA on this distance matrix, GPUF.

GloPa.pcoa = ordinate(GlobalPatterns, method="PCoA", distance=GPUF)

Before we look at the results, let’s first investigate how much of the total distance structure we will capture in the first few axes. We can do this graphically with a “scree plot”, an ordered barplot of the relative fraction of the total eigenvalues associated with each axis.

plot_scree(GloPa.pcoa, "Scree plot for Global Patterns, UniFrac/PCoA")

Scree plot of the PCoA used to create Figure 5 from the “Global Patterns” article(Caporaso 2011). The first three axes represent 43% of the total variation in the distances. Interestingly, the fourth axis represents another 9%, and so may warrant exploration as well. A scree plot is an important tool for any ordination method, as the relative importance of axes can vary widely from one dataset to another.

Next, we will reproduce Figure 5 from the “Global Patterns” article(Caporaso 2011), but separating the three axes into 2 plots using plot_ordination().

(p12 <- plot_ordination(GlobalPatterns, GloPa.pcoa, "samples", color="SampleType") + 
  geom_point(size=5) + geom_path() + scale_colour_hue(guide = FALSE) )

(p13 <- plot_ordination(GlobalPatterns, GloPa.pcoa, "samples", axes=c(1, 3),
  color="SampleType") + geom_line() + geom_point(size=5) )

A reproduction in phyloseq / R of the main panel of Figure 5 from the “Global Patterns” article(Caporaso 2011), on two plots. The horizontal axis represents the first axis in the PCoA ordination, while the top and bottom vertical axes represent the second and third axes, respectively. Different points represent different samples within the dataset, and are shaded according to the environment category to which they belong. The color scheme is the default used by ggplot.

6.3.2 non-metric Multi-Dimensional Scaling (NMDS)

We repeat the previous example, but instead using non-metric multidimensional scaling (NMDS) limited to just two dimensions. This approach limits the amount of residual distance “not shown” in the first two (or three) axes, but forefeits some mathematical properties and does not always converge within the specified number of axes.

# (Re)load UniFrac distance matrix and GlobalPatterns data
data(GlobalPatterns)
load(system.file("doc", "Unweighted_UniFrac.RData", package="phyloseq"))
# perform NMDS, set to 2 axes
GP.NMDS <- ordinate(GlobalPatterns, "NMDS", GPUF)
## Run 0 stress 0.1432774 
## Run 1 stress 0.1432774 
## ... New best solution
## ... Procrustes: rmse 2.408039e-05  max resid 8.77801e-05 
## ... Similar to previous best
## Run 2 stress 0.167021 
## Run 3 stress 0.1432774 
## ... New best solution
## ... Procrustes: rmse 8.939729e-06  max resid 3.13481e-05 
## ... Similar to previous best
## Run 4 stress 0.1432625 
## ... New best solution
## ... Procrustes: rmse 0.003457622  max resid 0.01250109 
## Run 5 stress 0.2380867 
## Run 6 stress 0.2418642 
## Run 7 stress 0.1809282 
## Run 8 stress 0.2345947 
## Run 9 stress 0.1432776 
## ... Procrustes: rmse 0.003381842  max resid 0.01227859 
## Run 10 stress 0.1432625 
## ... New best solution
## ... Procrustes: rmse 2.834687e-05  max resid 9.201282e-05 
## ... Similar to previous best
## Run 11 stress 0.1432625 
## ... Procrustes: rmse 4.363646e-06  max resid 8.121218e-06 
## ... Similar to previous best
## Run 12 stress 0.1856305 
## Run 13 stress 0.1432774 
## ... Procrustes: rmse 0.003502555  max resid 0.01266025 
## Run 14 stress 0.167021 
## Run 15 stress 0.1432774 
## ... Procrustes: rmse 0.003465947  max resid 0.01253543 
## Run 16 stress 0.1432774 
## ... Procrustes: rmse 0.003491653  max resid 0.0126232 
## Run 17 stress 0.1856306 
## Run 18 stress 0.1432774 
## ... Procrustes: rmse 0.003450378  max resid 0.01248632 
## Run 19 stress 0.167021 
## Run 20 stress 0.1432774 
## ... Procrustes: rmse 0.003503586  max resid 0.01266354 
## *** Solution reached
(p <- plot_ordination(GlobalPatterns, GP.NMDS, "samples", color="SampleType") +
  geom_line() + geom_point(size=5) )

An example exploratory ordination using non-metric multidimensional scaling (NMDS) on the unweighted UniFrac distance between samples of the “Global Patterns” dataset. Sample points are shaded by environment type, and connected by a line if they belong to the same type. Compare with Figure 5 from the “Global Patterns” article(Caporaso 2011).

The figure nicely shows the relative dissimilarities between microbial communities from different habitats. However, it fails to indicate what was different between the communities. For an ordination method that provides information on the taxa that explain differences between samples (or groups of samples), we use Correspondence Analysis.

6.3.3 Correspondence Analysis (CA)

In the following section we will show continue our exploration of the “GlobalPatterns” dataset using various features of an ordination method called Correspondence Analysis. We give special emphasis to exploratory interpretations using the biplot, because it provides additional information that is not available from PCoA or NMDS.

Let’s start by performing a Correspondence Analysis and investigating the scree plot. Both interestingly and challengingly, the scree plot suggests that the Global Patterns abundance data is quite high-dimensional, with the first two CA axes accounting for not quite 17% of the total (chi-square) variability. Note the absence of a steep decline in eigenvalue fraction as axis number increases. Each additional axis represents only marginally less variability than the previous. It is often more convenient if the first two (or three) axes account for most of the variability.

First, let’s severely subset the number of species for the sake of run-time.\footnote{This is for illustration purposes only, do not repeat unless you are very sure you have a good reason for doing this.

data(GlobalPatterns)
# Take a subset of the GP dataset, top 200 species
topsp <- names(sort(taxa_sums(GlobalPatterns), TRUE)[1:200])
GP    <- prune_taxa(topsp, GlobalPatterns)
# Subset further to top 5 phyla, among the top 200 OTUs.
top5ph <- sort(tapply(taxa_sums(GP), tax_table(GP)[, "Phylum"], sum), decreasing=TRUE)[1:5]
GP     <- subset_taxa(GP, Phylum %in% names(top5ph))
# Re-add human variable to sample data:
sample_data(GP)$human <- factor(human)

Now perform the correspondence analysis.

# Now perform a unconstrained correspondence analysis
gpca  <- ordinate(GP, "CCA")
# Scree plot
plot_scree(gpca, "Scree Plot for Global Patterns Correspondence Analysis")

The correspondence analysis (CA) scree plot of the “Global Patterns” dataset.

Now let’s investigate how the samples behave on the first few CA axes.

(p12 <- plot_ordination(GP, gpca, "samples", color="SampleType") + 
  geom_line() + geom_point(size=5) )

(p34 <- plot_ordination(GP, gpca, "samples", axes=c(3, 4), color="SampleType") + 
  geom_line() + geom_point(size=5) )

First 4 axes of Correspondence Analysis (CA) of the “Global Patterns” dataset (Caporaso 2011).

A clear feature of these plots is that the feces and mock communities cluster tightly together, far away from all other samples on the first axis (CA1). The skin and tongue samples separate similarly, but on the second axis. Taken together, it appears that the first two axes are best explained by the separation of human-associated “environments” from the other non-human environments in the dataset, with a secondary separation of tongue and skin samples from feces.

We will now investigate further this top-level structure of the data, using an additional feature of correspondence analysis that allows us to compare the relative contributions of individual taxa on the same graphical space: the “biplot”. However, because we just displayed the position of samples in the ordination and there are often many thousands of OTUs, we will focus on creating an interpretable plot of the OTUs. For creating graphics that combine the two plots, try the "biplot" or "split" option for type in plot_ordination().

p1  <- plot_ordination(GP, gpca, "species", color="Phylum")
(p1 <- ggplot(p1$data, p1$mapping) + geom_point(size=5, alpha=0.5) + 
  facet_wrap(~Phylum) +  scale_colour_hue(guide = FALSE) )

Species plot of the “Global Patterns” correspondence analysis first two axes, with each phylum on a different panel (“facet”). Only the most abundant 5 phyla among the most abundant 200 taxa (cumulative, all samples) are included. Arbitrary reduction, for computational efficiency of example.

Let’s try drawing the figure again, only this time summarizing the species points as a 2D density estimate, without any individual points.

(p3 <- ggplot(p1$data, p1$mapping) + geom_density2d() +
  facet_wrap(~Phylum) +  scale_colour_hue(guide = FALSE) )

Redrawn figure, which is severely overplotted, as a 2-dimensional species-density topographic map, faceted in the same way.

These figures reveal some useful patterns and interesting outliers, but what if we want a complete summary of how each phylum is represented along each axis? The following code is a way to show this using boxplots, while still avoiding the occlusion problem (points layered on top of each other), and also conveying some useful information about the pattern of taxa that contribute to the separation of human-associated samples from the other sample types. It re-uses the data that was stored in the ggplot2 plot object created in the previous figure, p, and creates a new boxlot graphical summary of the positions of each phylum.

library("reshape2")
# Melt the species-data.frame, DF, to facet each CA axis separately
mdf <- melt(p1$data[, c("CA1", "CA2", "Phylum", "Family", "Genus")], 
            id=c("Phylum", "Family", "Genus") )
# Select some special outliers for labelling
LF <- subset(mdf, variable=="CA2" & value < -1.0)
# build plot: boxplot summaries of each CA-axis, with labels
p <- ggplot(mdf, aes(Phylum, value, color=Phylum)) + 
  geom_boxplot() + 
  facet_wrap(~variable, 2) + 
  scale_colour_hue(guide = FALSE) +
  theme_bw() + 
  theme( axis.text.x = element_text(angle = -90, vjust = 0.5) )
# Add the text label layer, and render ggplot graphic
(p <- p + geom_text(data=subset(LF, !is.na(Family)),
  mapping = aes(Phylum, value+0.1, color=Phylum, label=Family), 
  vjust=0,
  size=2))

Boxplot of taxa (species in this case) of the “Global Patterns” CA first two axes, shaded/separated by phylum. Through this approach it is much easier to see particular species that cluster unusually relative to the rest of their phylum, for example the Bacteroidetes species (Prevotellaceae family) that is positioned most in the negative CA2 direction toward the Tongue/Skin samples.

One way to relate some of the high-level patterns we observed from correspondence analysis is to directly visualize the abundances in an organized, quantitative way, to see if this does in fact support / explain the human/environment microbiome differences. Here is an example using the plot_bar function described in an earlier section.

plot_bar(GP, x="human", fill="SampleType", facet_grid= ~ Phylum)

Phylum-level comparison of relative abundance of taxa in samples that are from human microbiomes (or not).

In this figure we’ve used the threshold parameter to omit all but phyla accounting for the top 90% of phyla in any one sample. Some patterns emerging from this display appear to be: (1) Cyanobacteria, Actinobacteria appear under-represented in human samples; (2) conversely, Firmicutes appear over-represented in human samples; (3) Acidobacteria, Verrucomicrobia appear over-represented in the fecal samples; (4) the only Crenarchaeota were observed in the Mock sample, which is not really a community but a simulated community used as a control. These are not hugely surprising based on previous biological observations from the field, but it is hopefully useful code that can be applied on other datasets that you might have.

6.3.4 Double Principle Coordinate Analysis (DPCoA)

Here is a quick example illustrating the use of Double Principal Coordinate Analysis (DPCoA~\cite{Pavoine2004523), using the using the ordinate() function in phyloseq, as well as the “biplot” option for `plot_ordination(). For a description that includes an applied example using the “enterotype” dataset and comparison with UniFrac/PCoA, see Fukuyama et al~\cite{fukuyama2012com.

GP.dpcoa <- ordinate(GP, "DPCoA") 
pdpcoa <- plot_ordination(GP, GP.dpcoa, type="biplot",
                          color="SampleType", shape="Phylum")
shape.fac <- pdpcoa$data[, deparse(pdpcoa$mapping$shape)]
man.shapes <- c(19, 21:25)
names(man.shapes) <- c("Samples", levels(shape.fac)[levels(shape.fac)!="Samples"])
p2dpcoa <- pdpcoa + scale_shape_manual(values=man.shapes)

A biplot representation of a Double Principal Coordinate Analysis (DPCoA), on a simplified version of the “Global Patterns” dataset with only the most abundant 200 OTUs included.

# Show just Samples or just Taxa
plot_ordination(GP, GP.dpcoa, type="taxa", shape="Phylum")

plot_ordination(GP, GP.dpcoa, type="samples", color="SampleType")

# Split
plot_ordination(GP, GP.dpcoa, type="split",
                color="SampleType", shape="Phylum") +
  ggplot2::scale_colour_discrete()

6.4 Distance Methods

6.4.1 distance(): Central Distance Function

Many comparisons of microbiome samples, including the graphical model and the PCoA analysis, require a calculation for the relative dissimilarity/distance between one microbial community and another. The phyloseq-package provides a general “wrapper” function for calculating ecological distance matrices between the samples in an experiment.

distance() currently supports 43 method options, as well as user-provided arbitrary methods via an interface to vegan’s designdist() function. Currrently only sample-wise distances are supported (the type argument), but eventually species-wise (OTU-wise) distances will be supported as well. In addition to supporting any of the method options to the three main distance functions of the vegan-package~\cite{veganpkg — including the 14 distances of the vegdist() function and all 24 ecological distances reviewed in Koleff et al. 2003~\cite{Koleff2003JAE coded by betadiverdistance() will eventually support many of the distance methods in the ade4-package~\cite{Dray:2007vs, and others. It also supports the Fast UniFrac distance function (Section~\ref{sec:unifrac) included in phyloseq as native R code, and a wrapper for retreiving the sample-distances from Double Principal Coordinate Analysis (DPCoA).

The function takes a phyloseq-class object and an argument indicating the distance type; and it returns a `dist-class distance matrix.

data(esophagus)
distance(esophagus, "bray") 
##           B         C
## C 0.4061135          
## D 0.4976303 0.5907173
distance(esophagus, "wunifrac") # weighted UniFrac
##           B         C
## C 0.2035424          
## D 0.2603371 0.2477016
distance(esophagus, "jaccard") # vegdist jaccard
##           B         C
## C 0.5776398          
## D 0.6645570 0.7427056
distance(esophagus, "g") # betadiver method option "g"
##           B         C
## C 0.6136364          
## D 0.6250000 0.6078431

6.4.2 UniFrac and weighted UniFrac

UniFrac is a recently-defined~\cite{Lozupone:2005gn and popular distance metric to summarize the difference between pairs of ecological communities. All UniFrac variants use a phylogenetic tree of the relationship among taxa as central information to calculating the distance between two samples/communities. An unweighted UniFrac distance matrix only considers the presence/absence of taxa, while weighted UniFrac accounts for the relative abundance of taxa as well as their phylogenetic distance. Prior to phyloseq, a non-parallelized, non-Fast implementation of the unweighted UniFrac was available in \R{ packages (picante::unifrac~\cite{Kembel:2010ft). In the phyloseq package we provide optionally-parallelized implementations of Fast UniFrac~\cite{Hamady:2009fk (both weighted and unweighted, with plans for additional UniFrac variants), all of which return a sample-wise distance matrix from any `phyloseq-class object that contains a phylogenetic tree component.

The following is an example calculating the UniFrac distance (both weighted and unweighted) matrix using the “esophagus” example dataset:

data(esophagus)
distance(esophagus, "wUniFrac")
distance(esophagus, "uUniFrac")

See the phyloseq demo page about fast parallel UniFrac.

6.5 Hierarchical Clustering

Another potentially useful and popular way to visualize/decompose sample-distance matrices is through hierarchical clustering (e.g. hclust). In the following example, we reproduce Figure~4 from the “Global Patterns” article, using the unweighted UniFrac distance and the UPGMA method (hclust parameter method="average"). Try help("hclust") for alternative clustering methods included in standard R.

# (Re)load UniFrac distance matrix and GlobalPatterns data
data(GlobalPatterns)
load(system.file("doc", "Unweighted_UniFrac.RData", package="phyloseq"))
# Manually define color-shading vector based on sample type.
colorScale    <- rainbow(length(levels(get_variable(GlobalPatterns, "SampleType"))))
cols          <- colorScale[get_variable(GlobalPatterns, "SampleType")] 
GP.tip.labels <- as(get_variable(GlobalPatterns, "SampleType"), "character")
# This is the actual hierarchical clustering call, specifying average-link clustering
GP.hclust     <- hclust(GPUF, method="average")
plot(GP.hclust, col=cols)

An alternative means of summarizing a distance matrix via hierarchical clustering and plotting as an annotated dendrogram. Compare with Figure 4 from the Global Patterns). Some differences in Figure~\ref{fig:GPfig4 from the original article might be explained by Global Patterns in phyloseq being the summed observations from both primer directions (5’ and 3’), while in the article they show the results separately. Furthermore, in the article the “mock” community is not included in the dataset, but an extra fecal sample is included.

7 Multiple Testing and Differential Abundance

One of our recommended approaches to this problem was described in McMurdie and Holmes (2014) Waste Not, Want Not: Why Rarefying Microbiome Data is Inadmissible. PLoS Computational Biology. 10(4):e1003531

Some reproducible demonstrations of this approach are included in the phyloseq extensions repository, the phyloseq_to_deseq2 function, as well as a separate vignetted dedicated to this topic (phyloseq and DESeq2 on Colorectal Cancer Data).

Please make use of these materials for differential abundance testing.

phyloseq/inst/doc/phyloseq-basics.R0000644000175400017540000001055013177723066020434 0ustar00biocbuildbiocbuild## ---- eval=FALSE----------------------------------------------------------- # vignette("phyloseq_analysis") ## ----load-packages, message=FALSE, warning=FALSE--------------------------- library("phyloseq") ## ---- eval=FALSE----------------------------------------------------------- # myOTU1 <- import_RDP_cluster("path/to/my/filename.clust") ## ---- eval=FALSE----------------------------------------------------------- # data(GlobalPatterns) # data(esophagus) # data(enterotype) # data(soilrep) ## -------------------------------------------------------------------------- data(GlobalPatterns) GlobalPatterns ## ---- eval=FALSE----------------------------------------------------------- # otu1 <- otu_table(raw_abundance_matrix, taxa_are_rows=FALSE) # sam1 <- sample_data(raw_sample_data.frame) # tax1 <- tax_table(raw_taxonomy_matrix) # tre1 <- read_tree(my_tree_file) ## ---- eval=FALSE----------------------------------------------------------- # ex1b <- phyloseq(my_otu_table, my_sample_data, my_taxonomyTable, my_tree) ## ---- eval=FALSE----------------------------------------------------------- # ex1c <- phyloseq(my_otu_table, my_sample_data) ## ----echo=FALSE------------------------------------------------------------ topN <- 20 ## -------------------------------------------------------------------------- data(GlobalPatterns) most_abundant_taxa <- sort(taxa_sums(GlobalPatterns), TRUE)[1:topN] ex2 <- prune_taxa(names(most_abundant_taxa), GlobalPatterns) ## -------------------------------------------------------------------------- topFamilies <- tax_table(ex2)[, "Family"] as(topFamilies, "vector") ## ---- eval=FALSE----------------------------------------------------------- # testOTU <- otu_table(matrix(sample(1:50, 25, replace=TRUE), 5, 5), taxa_are_rows=FALSE) # f1<- filterfun_sample(topk(2)) # wh1 <- genefilter_sample(testOTU, f1, A=2) # wh2 <- c(T, T, T, F, F) # prune_taxa(wh1, testOTU) # prune_taxa(wh2, testOTU) ## -------------------------------------------------------------------------- data(GlobalPatterns) f1<- filterfun_sample(topp(0.1)) wh1 <- genefilter_sample(GlobalPatterns, f1, A=(1/2*nsamples(GlobalPatterns))) sum(wh1) ex2 <- prune_taxa(wh1, GlobalPatterns) ## -------------------------------------------------------------------------- print(ex2) ## ---- eval=FALSE----------------------------------------------------------- # data(GlobalPatterns) # f1<- filterfun_sample(topf(0.9)) # wh1 <- genefilter_sample(GlobalPatterns, f1, A=(1/3*nsamples(GlobalPatterns))) # sum(wh1) # prune_taxa(wh1, GlobalPatterns) ## -------------------------------------------------------------------------- data("enterotype") library("genefilter") flist<- filterfun(kOverA(5, 2e-05)) ent.logi <- filter_taxa(enterotype, flist) ent.trim <- filter_taxa(enterotype, flist, TRUE) identical(ent.trim, prune_taxa(ent.logi, enterotype)) identical(sum(ent.logi), ntaxa(ent.trim)) filter_taxa(enterotype, flist, TRUE) ## -------------------------------------------------------------------------- ex3 <- subset_samples(GlobalPatterns, SampleType%in%c("Freshwater", "Ocean", "Freshwater (creek)")) ex3 ## -------------------------------------------------------------------------- subset(sample_data(GlobalPatterns), SampleType%in%c("Freshwater", "Ocean", "Freshwater (creek)")) ## -------------------------------------------------------------------------- ex4 <- subset_taxa(GlobalPatterns, Phylum=="Firmicutes") ex4 ## -------------------------------------------------------------------------- randomSpecies100 <- sample(taxa_names(GlobalPatterns), 100, replace=FALSE) ex5 <- prune_taxa(randomSpecies100, GlobalPatterns) ## ---- eval=FALSE----------------------------------------------------------- # data(GlobalPatterns) # ex2 <- transform_sample_counts(GlobalPatterns, I) ## -------------------------------------------------------------------------- ex4<- transform_sample_counts(GlobalPatterns, threshrankfun(500)) ## ---- eval=FALSE----------------------------------------------------------- # ex6 <- tax_glom(GlobalPatterns, taxlevel="Genus") ## ---- eval=FALSE----------------------------------------------------------- # ex7 <- tip_glom(GlobalPatterns, speciationMinLength = 0.05) ## ---- eval=FALSE----------------------------------------------------------- # install.packages("doParallel") # install.packages("doMC") # install.packages("doSNOW") # install.packages("doMPI") phyloseq/inst/doc/phyloseq-basics.Rmd0000644000175400017540000011007513175714136020754 0ustar00biocbuildbiocbuild--- title: "Basic storage, access, and manipulation of phylogenetic sequencing data with *phyloseq*" output: BiocStyle::html_document: fig_height: 7 fig_width: 10 toc: yes toc_depth: 2 number_sections: true --- `r library("knitr")` `r opts_chunk$set(cache=FALSE, fig.width=9, message=FALSE, warning=FALSE)` Paul J. McMurdie and Susan Holmes [phyloseq Home Page](http://joey711.github.io/phyloseq/) If you find phyloseq and/or its tutorials useful, please acknowledge and cite phyloseq in your publications: **phyloseq: An R package for reproducible interactive analysis and graphics of microbiome census data** (2013) PLoS ONE 8(4):e61217 http://dx.plos.org/10.1371/journal.pone.0061217 ## Other resources The phyloseq project also has a number of supporting online resources, most of which can by found at [the phyloseq home page](http://joey711.github.com/phyloseq/), or from the phyloseq stable release [page on Bioconductor](http://bioconductor.org/packages/release/bioc/html/phyloseq.html). To post feature requests or ask for help, try [the phyloseq Issue Tracker](https://github.com/joey711/phyloseq/issues). # Introduction The analysis of microbiological communities brings many challenges: the integration of many different types of data with methods from ecology, genetics, phylogenetics, network analysis, visualization and testing. The data itself may originate from widely different sources, such as the microbiomes of humans, soils, surface and ocean waters, wastewater treatment plants, industrial facilities, and so on; and as a result, these varied sample types may have very different forms and scales of related data that is extremely dependent upon the experiment and its question(s). The phyloseq package is a tool to import, store, analyze, and graphically display complex phylogenetic sequencing data that has already been clustered into Operational Taxonomic Units (OTUs), especially when there is associated sample data, phylogenetic tree, and/or taxonomic assignment of the OTUs. This package leverages many of the tools available in R for ecology and phylogenetic analysis (vegan, ade4, ape, picante), while also using advanced/flexible graphic systems (ggplot2) to easily produce publication-quality graphics of complex phylogenetic data. phyloseq uses a specialized system of S4 classes to store all related phylogenetic sequencing data as single experiment-level object, making it easier to share data and reproduce analyses. In general, phyloseq seeks to facilitate the use of R for efficient interactive and reproducible analysis of OTU-clustered high-throughput phylogenetic sequencing data. # About this vignette ## Typesetting Legend - **bold** - Bold is used for emphasis. - *italics* - Italics are used for package names, and special words, phrases. - `code font` - The font for code, usually courrier-like, but depends on the theme. - `myFun()` - Code font word with `()` attached at the right-end, is a function name. - [Hyperlink](#sec:typeset-legend) - Hyperlinks are clickable text that will jump to sections and external pages. ## Other links and tutorials An overview of phyloseq's intended functionality, goals, and design is provided in the following free and open access article: McMurdie and Holmes (2013). [phyloseq: An R package for reproducible interactive analysis and graphics of microbiome census data](http://dx.plos.org/10.1371/journal.pone.0061217). PLoS ONE e61217. The most updated examples are posted in our online tutorials from [the phyloseq home page](http://joey711.github.com/phyloseq) A separate vignette describes analysis tools included in phyloseq along with various examples using included example data. A quick way to load it is: ```{r, eval=FALSE} vignette("phyloseq_analysis") ``` By contrast, this vignette is intended to provide functional examples of the basic data import and manipulation infrastructure included in phyloseq. This includes example code for importing OTU-clustered data from different clustering pipelines, as well as performing clear and reproducible filtering tasks that can be altered later and checked for robustness. The motivation for including tools like this in phyloseq is to save time, and also to build-in a structure that requires consistency across related data tables from the same experiment.This not only reduces code repetition, but also decreases the likelihood of mistakes during data filtering and analysis. For example, it is intentionally difficult in phyloseq to create an experiment-level object in which a component tree and OTU table have different OTU names. The import functions, trimming tools, as well as the main tool for creating an experiment-level object, `phyloseq`, all automatically trim the OTUs and samples indices to their intersection, such that these component data types are exactly coherent. # phyloseq classes The class structure in the *phyloseq* package follows the inheritance diagram shown in the figure below. Currently, *phyloseq* uses 4 core data classes. They are (1) the OTU abundance table (`otu_table`), a table of sample data (`sample_data`); (2) a table of taxonomic descriptors (`taxonomyTable`); and (3) a phylogenetic tree (`"phylo"`-class, [ape package](http://cran.r-project.org/web/packages/ape/). The `otu_table` class can be considered the central data type, as it directly represents the number and type of sequences observed in each sample. `otu_table` extends the numeric matrix class in the `R` base, and has a few additonal feature slots. The most important of these feature slots is the `taxa_are_rows` slot, which holds a single logical that indicates whether the table is oriented with taxa as rows (as in the *genefilter* package in [Bioconductor](#cite:bioconductor) or with taxa as columns (as in *vegan* and *picante* packages). In *phyloseq* methods, as well as its extensions of methods in other packages, the `taxa_are_rows` value is checked to ensure proper orientation of the `otu_table`. A *phyloseq* user is only required to specify the `otu_table` orientation during initialization, following which all handling is internal. The `sample_data` class directly inherits `R`'s `data.frame` class, and thus effectively stores both categorical and numerical data about each sample. The orientation of a `data.frame` in this context requires that samples/trials are rows, and variables are columns (consistent with *vegan* and other packages). The `taxonomyTable` class directly inherits the `matrix` class, and is oriented such that rows are taxa/OTUs and columns are taxonomic levels (e.g. *Phylum*). The phyloseq-class can be considered an "experiment-level class" and should contain two or more of the previously-described core data classes. We assume that *phyloseq* users will be interested in analyses that utilize their abundance counts derived from the phylogenetic sequencing data, and so the `phyloseq()` constructor will stop with an error if the arguments do not include an `otu_table`. There are a number of common methods that require either an `otu_table` and `sample_data` combination, or an `otu_table` and phylogenetic tree combination. These methods can operate on instances of the phyloseq-class, and will stop with an error if the required component data is missing. ![phyloseq class structure](phyloseq_classes_7.png) Classes and inheritance in the *phyloseq* package. The class name and its slots are shown with red- or blue-shaded text, respectively. Coercibility is indicated graphically by arrows with the coercion function shown. Lines without arrows indicate that the more complex class (``phyloseq") contains a slot with the associated data class as its components. # Load *phyloseq* and import data Now let's get started by loading phyloseq, and describing some methods for importing data. ## Load *phyloseq* To use *phyloseq* in a new R session, it will have to be loaded. This can be done in your package manager, or at the command line using the `library()` command: ```{r load-packages, message=FALSE, warning=FALSE} library("phyloseq") ``` ## Import data An important feature of *phyloseq* are methods for importing phylogenetic sequencing data from common taxonomic clustering pipelines. These methods take file pathnames as input, read and parse those files, and return a single object that contains all of the data. Some additional background details are provided below. The best reproducible examples on importing data with phyloseq can be found on the official data import tutorial page: http://joey711.github.com/phyloseq/import-data ## Import from biom-format New versions of QIIME (see below) produce a file in *version 2* of the [biom file format](http://biom-format.org/), which is a specialized definition of the HDF5 format. The phyloseq package provides the `import_biom()` function, which can import both *Version 1* (JSON) and *Version 2* (HDF5) of the BIOM file format. The *phyloseq* package fully supports both taxa and sample observations of the biom format standard, and works with the BIOM files output from QIIME, RDP, MG-RAST, etc. ## Import from QIIME (Modern) The default output from modern versions of QIIME is a BIOM-format file (among others). This is suppored in phyloseq. ### Sample data from QIIME Sometimes inaccurately referred to as *metadata*, additional observations on samples provided as *mapping file* to QIIME have not typically been output in the BIOM files, **even though BIOM format supports it**. This failure to support the full capability of the BIOM format means that you'll have to provide sample observations as a separate file. There are many ways to do this, but the QIIME sample map is supported. ### Input Two QIIME output files (`.biom`, `.tre`) are recognized by the `import_biom()` function. One QIIME input file (sample map, tab-delimited), is recognized by the `import_qiime_sample_data()` function. --- Input File(s) | phyloseq function | Output --- | --- | --- `.biom`, `.tre` | `import_biom()` | phyloseq object with OTU table, taxonomy table, and tree (if provided) `.tre` | `read_tree()` | `phylo` object, representing phylogenetic tree. `map.txt` | `import_qiime_sample_data()` | A `sample_data` object --- The objects created by each of the import functions above should be merged using `merge_phyloseq` to create one coordinated, self-consistent object. ### Output - **Before Merging** - Before merging with `merge_phyloseq`, the output from these import activities is the three separate objects listed in the previous table. - **After Merging** - After merging you have a single self-consistent phyloseq object that contains an OTU table, taxonomy table, sample-data, and a phylogenetic tree. ### QIIME Example Tutorial QIIME's "Moving Pictures" example tutorial output is a little too large to include within the phyloseq package (and thus is not directly included in this vignette). However, the phyloseq home page includes a full reproducible example of the import procedure described above: **Link HERE** For reference, or if you want to try yourself, the following is the relative paths within the QIIME tutorial directory for each of the files you will need. - BIOM file, originally at: `r "moving_pictures_tutorial-1.9.0/illumina/precomputed-output/otus/otu_table_mc2_w_tax_no_pynast_failures.biom"` - Tree file, originally at: `r "moving_pictures_tutorial-1.9.0/illumina/precomputed-output/otus/rep_set.tre"` - Map File, originally at: `r "moving_pictures_tutorial-1.9.0/illumina/map.tsv"` ## Import from QIIME Legacy [QIIME](#cite:QIIME) is a free, open-source OTU clustering and analysis pipeline written for Unix (mostly Linux). It is distributed in a number of different forms (including a pre-installed virtual machine). See [the QIIME home page](http://qiime.org/) for details. ### Input One QIIME input file (sample map), and two QIIME output files (`otu_table.txt`, `.tre`) are recognized by the `import_qiime()` function. Only one of the three input files is required to run, although an `"otu_table.txt"` file is required if `import_qiime()` is to return a complete experiment object. In practice, you will have to find the relevant QIIME files among a number of other files created by the QIIME pipeline. A screenshot of the directory structure created during a typical QIIME run is shown in [the QIIME Directory Figure](#fig:qiimedirectory). ![QIIME directory structure](import_qiime_directory_structure.jpg) A typical QIIME output directory. The two output files suitable for import by *phyloseq* are highlighted. A third file describing the samples, their barcodes and covariates, is created by the user and required as *input* to QIIME. It is a good idea to import this file, as it can be converted directly to a `sample_data` object and can be extremely useful for certain analyses. ### Output The class of the object returned by `import_qiime()` depends upon which filenames are provided. The most comprehensive class is chosen automatically, based on the input files listed as arguments. At least one argument needs to be provided. ## Import from mothur The open-source, platform-independent, locally-installed software package, [mothur](#cite:Schloss:2009do), can also process barcoded amplicon sequences and perform OTU-clustering. It is extensively documented on [the mothur wiki](http://www.mothur.org/wiki/) ### Input Currently, there are three different files produced by the *mothur* package (Ver `1.22+`) that can be imported by *phyloseq*. At minimum, a user must supply a "`.list`" file, and at least one of the following two files: `.groups` or `.tree`. The group file is produced by *mothur*'s `make.group()` function. Details can be found at [its wiki page](http://www.mothur.org/wiki/Make.group). The tree file is a phylogenetic tree calculated by *mothur*. ### Output The output from `import_mothur()` depends on which file types are provided. If all three file types are provided, an instance of the phyloseq-class is returned that contains both an OTU abundance table and its associated phylogenetic tree. ## Import from PyroTagger PyroTagger is an OTU-clustering pipeline for barcoded 16S rRNA amplicon sequences, served and maintained by the Department of Energy's (DOE's) Joint Genome Institute (JGI). It can be used through a straightforward web interface at [the PyroTagger home page](http://pyrotagger.jgi-psf.org/) PyroTagger takes as input the untrimmed sequence (`.fasta`) and sequence-quality (`.qual`) files, as well as a sample mapping file that contains the bar code sequence for each sample and its name. It uses a 97\% identity threshold for defining OTU clusters (approximately species-level of taxonomic distinction), and provides no options for specifying otherwise. It does allow users to modify the threshold setting for low-quality bases. ### Input PyroTagger returns a single excel spreadsheet file (`.xls`) containing both abundance and taxonomy data, as well as some associated confidence information related to each taxonomic assignment. This spreadsheet also reports on potential chimeric sequences. This single output file is sufficient for `import_RDP_tab()`, provided the file has been converted to a tab-delimited plain-text format. Any spreadsheet application should suffice. No other changes should be made to the `.xls` file. ### Output `import_RDP_tab()` returns an instance of the phyloseq-class that contains the OTU abundance table and taxonomy table. To my knowledge, PyroTagger does not calculate a tree of the representative sequences from each OTU cluster, nor a distance object, so analyses like `tip_glom()` and `UniFrac` are not applicable. ## Import from RDP pipeline The Ribosomal Database Project ([RDP](http://rdp.cme.msu.edu/)) provides a web-based barcoded 16S rRNA amplicon sequence processing pipeline called the [RDP Pyrosequencing Pipeline](http://pyro.cme.msu.edu/). A user must run all three of the "Data Processing" steps sequentially through the web interface in order to acquire the output from Complete Linkage Clustering, the approach to OTU clustering used by the RDP Pipeline. Note that this import function assumes that the sequence names in the resulting cluster file follow a particular naming convention with underscore delimiter (see below). ### Input The output from the Complete Linkage Clustering, `.clust`, is the only input to the RDP pipeline importer: ```{r, eval=FALSE} myOTU1 <- import_RDP_cluster("path/to/my/filename.clust") ``` ### Output This importer returns an `otu_table` object. ### Expected Naming Convention The RDP cluster pipeline (specifically, the output of the complete linkage clustering step) has no formal documentation for the ".clust" file structure or its apparent sequence naming convention. The cluster file itself contains the names of all sequences contained in the input alignment. If the upstream barcode and aligment processing steps are also done with the RDP pipeline, then the sequence names follow a predictable naming convention wherein each sequence is named by its sample and sequence ID, separated by a `"_"` as delimiter: `sampleName_sequenceIDnumber` This import function assumes that the sequence names in the cluster file follow this convention, and that the sample name does not contain any `"_"`. It is unlikely to work if this is not the case. It is likely to work if you used the upstream steps in the RDP pipeline to process your raw (barcoded, untrimmed) fasta/fastq data. ## Example Data (included) There are multiple example data sets included in *phyloseq*. Many are from published investigations and include documentation with a summary and references, as well as some example code representing some aspect of analysis available in *phyloseq*. In the package index, go to the names beginning with "data-" to see the documentation of currently available example datasets. To load example data into the working environment, use the `data()` command: ```{r, eval=FALSE} data(GlobalPatterns) data(esophagus) data(enterotype) data(soilrep) ``` Similarly, entering `?enterotype` will reveal the documentation for the so-called "enterotype" dataset. For details examples, see [the Example Data tutorial](http://joey711.github.io/phyloseq/Example-Data.html) ## phyloseq Object Summaries In small font, the following is the summary of the `GlobalPatterns` dataset that prints to the terminal. These summaries are consistent among all `phyloseq-class` objects. Although the components of `GlobalPatterns` have many thousands of elements, the command-line returns only a short summary of each component. This encourages you to check that an object is still what you expect, without needing to let thousands of elements scroll across the terminal. In the cases in which you do want to see more of a particular component, use an accessor function (see table below). ```{r} data(GlobalPatterns) GlobalPatterns ``` ## Convert raw data to phyloseq components Suppose you have already imported raw data from an experiment into `R`, and their indices are labeled correctly. How do you get *phyloseq* to recognize these tables as the appropriate class of data? And further combine them together? Table [Table of Component Constructor Functions](#table:build) lists key functions for converting these core data formats into specific component data objects recognized by *phyloseq*. These will also Table of component constructor functions for building component data objects --- Function | Input Class | Output Description --- | --- | --- `otu_table` | numeric matrix | `otu_table` object storing OTU abundance `otu_table` | data.frame | `otu_table` object storing OTU abundance `sample_data` | data.frame | `sample_data` object storing sample variables `tax_table` | character matrix | `taxonomyTable` object storing taxonomic identities `tax_table` | data.frame | `taxonomyTable` object storing taxonomic identities `read_tree` | file path char | phylo-class tree, read from file `read.table` | table file path | A matrix or data.frame (Std `R` core function) --- phyloseq constructors: functions for building/merging *phyloseq* objects. --- Function | Input Class | Output Description --- | --- | --- `phyloseq` | Two or more component objects | phyloseq-class, *experiment-level* object `merge_phyloseq`| Two or more component or phyloseq-class objects | Combined instance of phyloseq-class --- The following example illustrates using the constructor methods for component data tables. ```{r, eval=FALSE} otu1 <- otu_table(raw_abundance_matrix, taxa_are_rows=FALSE) sam1 <- sample_data(raw_sample_data.frame) tax1 <- tax_table(raw_taxonomy_matrix) tre1 <- read_tree(my_tree_file) ``` ## phyloseq() function: building complex phyloseq objects Once you've converted the data tables to their appropriate class, combining them into one object requires only one additional function call, `phyloseq()`: ```{r, eval=FALSE} ex1b <- phyloseq(my_otu_table, my_sample_data, my_taxonomyTable, my_tree) ``` You do not need to have all four data types in the example above in order to combine them into one validity-checked experiment-level phyloseq-class object. The `phyloseq()` method will detect which component data classes are present, and build accordingly. Downstream analysis methods will access the required components using *phyloseq*'s accessors, and throw an error if something is missing. For most downstream methods you will only need to supply the combined, phyloseq-class object (the output of `phyloseq()` ), usually as the first argument. ```{r, eval=FALSE} ex1c <- phyloseq(my_otu_table, my_sample_data) ``` Whenever an instance of the phyloseq-class is created by *phyloseq* --- for example, when we use the `import_qiime()` function to import data, or combine manually imported tables using `phyloseq()` --- the row and column indices representing taxa or samples are internally checked/trimmed for compatibility, such that all component data describe exactly (and only) the same OTUs and samples. ## Merge The phyloseq project includes support for two complete different categories of merging. - Merging the OTUs or samples in a phyloseq object, based upon a taxonomic or sample variable: `merge_samples()`, `merge_taxa()` - Merging two or more data objects that come from the same experiment, so that their data becomes part of the same phyloseq object: `merge_phyloseq()` For further details, see the reproducible online tutorial at: http://joey711.github.com/phyloseq/merge # Accessor functions Once you have a phyloseq object available, many accessor functions are available to query aspects of the data set. The function name and its purpose are summarized in [the Accessor Functions Table](#table:access). Accessor functions for *phyloseq* objects. --- Function | Returns --- | --- `[` | Standard extraction operator. Works on `otu_table`, `sample_data`, and `taxonomyTable` `access` | General slot accessor function for phyloseq-package `get_taxa` | Abundance values of all taxa in sample `i' `get_sample` | Abundance values of taxa `i' for all samples `get_taxa_unique` | A unique vector of the observed taxa at a particular taxonomic rank `get_variable` | An individual sample variable vector/factor `nsamples` | Get the number of samples described by an object `ntaxa` | Get the number of OTUs (taxa) described by an object `otu_table` | Build or access otu_table objects `rank_names` | Get the names of the available taxonomic ranks `sample_data` | Build or access `sample_data` objects `sample_names` | The names of all samples `taxa_names` | The names of all taxa `sample_sums` | The sum of the abundance values of each sample `sample_variables` | The names of sample variables `taxa_sums` | The sum of the abundance values of each taxa `taxa_are_rows` | `TRUE` if taxa are row indices in `otu_table` `tax_table` | A taxonomy table `phy_tree` | Access the tree contained in a phyloseq object --- # Trimming, subsetting, filtering phyloseq data ## Trimming: prune_taxa() Trimming high-throughput phylogenetic sequencing data can be useful, or even necessary, for certain types of analyses. However, it is important that the original data always be available for reference and reproducibility; and that the methods used for trimming be transparent to others, so they can perform the same trimming or filtering steps on the same or related data. To facilitate this, *phyloseq* contains many ways to trim/filter the data from a phylogenetic sequencing project. Because matching indices for taxa and samples is strictly enforced, subsetting one of the data components automatically subsets the corresponding indices from the others. Variables holding trimmed versions of your original data can be declared, and further trimmed, without losing track of the original data. In general, most trimming should be accomplished using the S4 methods `prune_taxa()` or `prune_samples()`. ## Simple filtering example ```{r echo=FALSE} topN <- 20 ``` For example, lets make a new object that only holds the most abundant `r topN` taxa in the experiment. To accomplish this, we will use the `prune_taxa()` function. ```{r} data(GlobalPatterns) most_abundant_taxa <- sort(taxa_sums(GlobalPatterns), TRUE)[1:topN] ex2 <- prune_taxa(names(most_abundant_taxa), GlobalPatterns) ``` Now we can ask the question, "what taxonomic Family are these OTUs?" (Subsetting still returns a `taxonomyTable` object, which is summarized. We will need to convert to a vector) ```{r} topFamilies <- tax_table(ex2)[, "Family"] as(topFamilies, "vector") ``` ## Arbitrarily complex abundance filtering The previous example was a relatively simple filtering in which we kept only the most abundant `r topN` in the whole experiment. But what if we wanted to keep the most abundant `r topN` taxa of each sample? And of those, keep only the taxa that are also found in at least one-third of our samples? What if we wanted to keep only those taxa that met some across-sample criteria? ### genefilter_sample(): Filter by Within-Sample Criteria For this more complicated filtering *phyloseq* contains a function, `genefilter_sample`, that takes as an argument a *phyloseq* object, as well as a list of one or more filtering functions that will be applied to each sample in the abundance matrix (`otu_table`), as well as an integer argument, `A`, that specifies for how many samples the filtering function must return `TRUE` for a particular taxa to avoid removal from the object. A supporting function `filterfun_sample` is also included in *phyloseq* to facilitate creating a properly formatted function (enclosure) if more than one function is going to be applied simultaneously. `genefilter_sample` returns a logical vector suitable for sending directly to `prune_taxa` for the actual trimming. Here is an example on a completely fabricated `otu_table` called `testOTU`. ```{r, eval=FALSE} testOTU <- otu_table(matrix(sample(1:50, 25, replace=TRUE), 5, 5), taxa_are_rows=FALSE) f1<- filterfun_sample(topk(2)) wh1 <- genefilter_sample(testOTU, f1, A=2) wh2 <- c(T, T, T, F, F) prune_taxa(wh1, testOTU) prune_taxa(wh2, testOTU) ``` Here is a second example using the included dataset, `GlobalPatterns`. The most abundant taxa are kept only if they are in the most abundant 10\% of taxa in at least half of the samples in dataset `GlobalPatterns`. Note that it is not necessary to subset `GlobalPatterns` in order to do this filtering. The S4 method `prune_taxa` subsets each of the relavent component objects, and returns the complex object back. ```{r} data(GlobalPatterns) f1<- filterfun_sample(topp(0.1)) wh1 <- genefilter_sample(GlobalPatterns, f1, A=(1/2*nsamples(GlobalPatterns))) sum(wh1) ex2 <- prune_taxa(wh1, GlobalPatterns) ``` ```{r} print(ex2) ``` If instead of the most abundant fraction of taxa, you are interested in the most abundant fraction of individuals (aka sequences, observations), then the `topf` function is appropriate. For steep rank-abundance curves, `topf` will seem to be much more conservative (trim more taxa) because it is based on the cumulative sum of relative abundance. It does not guarantee that a certain number or fraction of total taxa (richness) will be retained. ```{r, eval=FALSE} data(GlobalPatterns) f1<- filterfun_sample(topf(0.9)) wh1 <- genefilter_sample(GlobalPatterns, f1, A=(1/3*nsamples(GlobalPatterns))) sum(wh1) prune_taxa(wh1, GlobalPatterns) ``` ### filter_taxa(): Filter by Across-Sample Criteria The `filter_taxa` function is directly analogous to the `genefilter` function for microarray filtering, but is used for filtering OTUs from phyloseq objects. It applies an arbitrary set of functions -- as a function list, for instance, created by `genefilter::filterfun` -- as across-sample criteria, one OTU at a time. It can be thought of as an extension of the genefilter-package (from the Bioconductor repository) for phyloseq objects. It takes as input a phyloseq object, and returns a logical vector indicating whether or not each OTU passed the criteria. Alternatively, if the `prune` option is set to `r FALSE`, it returns the already-trimmed version of the phyloseq object. Inspect the following example. Note that the functions `genefilter` and `kOverA` are from the genefilter package. ```{r} data("enterotype") library("genefilter") flist<- filterfun(kOverA(5, 2e-05)) ent.logi <- filter_taxa(enterotype, flist) ent.trim <- filter_taxa(enterotype, flist, TRUE) identical(ent.trim, prune_taxa(ent.logi, enterotype)) identical(sum(ent.logi), ntaxa(ent.trim)) filter_taxa(enterotype, flist, TRUE) ``` ## subset_samples(): Subset by Sample Variables It is possible to subset the samples in a *phyloseq* object based on the sample variables using the `subset_samples()` function. For example to subset `GlobalPatterns` such that only certain environments are retained, the following line is needed (the related tables are subsetted automatically as well): ```{r} ex3 <- subset_samples(GlobalPatterns, SampleType%in%c("Freshwater", "Ocean", "Freshwater (creek)")) ex3 ``` For this example only a categorical variable is shown, but in principle a continuous variable could be specified and a logical expression provided just as for the `subset` function. In fact, because `sample_data` component objects are an extension of the data.frame class, they can also be subsetted with the `subset` function: ```{r} subset(sample_data(GlobalPatterns), SampleType%in%c("Freshwater", "Ocean", "Freshwater (creek)")) ``` ## subset_taxa(): subset by taxonomic categories It is possible to subset by specific taxonomic category using the `subset_taxa()` function. For example, if we wanted to subset `GlobalPatterns` so that it only contains data regarding the phylum *Firmicutes*: ```{r} ex4 <- subset_taxa(GlobalPatterns, Phylum=="Firmicutes") ex4 ``` ## random subsample abundance data Can also randomly subset, for example a random subset of 100 taxa from the full dataset. ```{r} randomSpecies100 <- sample(taxa_names(GlobalPatterns), 100, replace=FALSE) ex5 <- prune_taxa(randomSpecies100, GlobalPatterns) ``` # Transform abundance data Sample-wise transformation can be achieved with the `transform_sample_counts()` function. It requires two arguments, (1) the *phyloseq* object that you want to transform, and the function that you want to use to perform the transformation. Any arbitrary function can be provided as the second argument, as long as it returns a numeric vector with the same length as its input. In the following trivial example, we create a second object, `ex2`, that has been "transformed" by the identity function such that it is actually identical to `GlobalPatterns`. ```{r, eval=FALSE} data(GlobalPatterns) ex2 <- transform_sample_counts(GlobalPatterns, I) ``` For certain kinds of analyis we may want to transform the abundance data. For example, for RDA we want to transform abundance counts to within-sample ranks, and to further include a threshold beyond which all taxa receive the same rank value. The ranking for each sample is performed independently, so that the rank of a particular taxa within a particular sample is not influenced by that sample's total quantity of sequencing relative to the other samples in the project. The following example shows how to perform such a thresholded-rank transformation of the abundance table in the complex *phyloseq* object `GlobalPatterns` with an arbitrary threshold of 500. ```{r} ex4<- transform_sample_counts(GlobalPatterns, threshrankfun(500)) ``` # Phylogenetic smoothing ## tax_glom() Suppose we are skeptical about the importance of OTU-level distinctions in our dataset. For this scenario, *phyloseq* includes a taxonomic-agglommeration method,`tax_glom()`, which merges taxa of the same taxonomic category for a user-specified taxonomic level. In the following code, we merge all taxa of the same Genus, and store that new object as `ex6`. ```{r, eval=FALSE} ex6 <- tax_glom(GlobalPatterns, taxlevel="Genus") ``` ## tip_glom() Similarly, our original example object (`GlobalPatterns`) also contains a phlyogenetic tree corresponding to each OTU, which we could also use as a means to merge taxa in our dataset that are closely related. In this case, we specify a threshold patristic distance. Taxa more closely related than this threshold are merged. This is especially useful when a dataset has many taxa that lack a taxonomic assignment at the level you want to investigate, a problem when using `tax_glom()`. Note that for datasets with a large number of taxa, `tax_glom` will be noticeably faster than `tip_glom`. Also, keep in mind that `tip_glom` requires that its first argument be an object that contains a tree, while `tax_glom` instead requires a `taxonomyTable` (See [phyloseq classes](#sec:app-classes)). ```{r, eval=FALSE} ex7 <- tip_glom(GlobalPatterns, speciationMinLength = 0.05) ``` Command output not provided here to save time during compilation of the vignette. The user is encouraged to try this out on your dataset, or even this example, if interested. It may take a while to run on the full, untrimmed data. # Installation ## Installation Please check [the phyloseq installation tutorial](http://joey711.github.com/phyloseq/install) for help with installation. This is likely to be the first place news and updated information about installation will be posted, as well. Also check out the rest of [the phyloseq homepage on GitHub](http://joey711.github.io/phyloseq/), as this is the best place to post issues, bug reports, feature requests, contribute code, etc. ## Installing Parallel Backend For running parallel implementation of functions/methods in *phyloseq* (e.g. `UniFrac(GlobalPatterns, parallel=TRUE)`), you will need also to install a function for registering a parallel "backend". Only one working parallel backend is needed, but there are several options, and the best one will depend on the details of your particular system. The "doParallel" package is a good place to start. Any one of the following lines from an `R` session will install a backend package. ```{r, eval=FALSE} install.packages("doParallel") install.packages("doMC") install.packages("doSNOW") install.packages("doMPI") ``` # References Robert C Gentleman, Vincent J. Carey, Douglas M. Bates, et al. **Bioconductor: Open software development for computational biology and bioinformatics.** *Genome Biology* 5:R80, 2004. J Gregory Caporaso, Justin Kuczynski, Jesse Stombaugh, Kyle Bittinger, Frederic D Bushman **QIIME allows analysis of high-throughput community sequencing data.** *Nature Methods* 7(5):335-336, 2010. P D Schloss, S L Westcott, T Ryabin, J R Hall, M Hartmann, et al. **Introducing mothur: Open-Source, Platform-Independent, Community-Supported Software for Describing and Comparing Microbial Communities.** *Applied and Environmental Microbiology* 75(23):7537-7541, 2009. J R Cole, Q Wang, E Cardenas, J Fish, B Chai et al. **The Ribosomal Database Project: improved alignments and new tools for rRNA analysis.** *Nucleic Acids Research* 37(Database issue):D141-5, 2009. phyloseq/inst/doc/phyloseq-basics.html0000644000175400017540000443772213177723067021222 0ustar00biocbuildbiocbuild Basic storage, access, and manipulation of phylogenetic sequencing data with phyloseq

Contents

Paul J. McMurdie and Susan Holmes

mcmurdie@stanford.edu

phyloseq Home Page

If you find phyloseq and/or its tutorials useful, please acknowledge and cite phyloseq in your publications:

phyloseq: An R package for reproducible interactive analysis and graphics of microbiome census data (2013) PLoS ONE 8(4):e61217 http://dx.plos.org/10.1371/journal.pone.0061217

0.1 Other resources

The phyloseq project also has a number of supporting online resources, most of which can by found at the phyloseq home page, or from the phyloseq stable release page on Bioconductor.

To post feature requests or ask for help, try the phyloseq Issue Tracker.

1 Introduction

The analysis of microbiological communities brings many challenges: the integration of many different types of data with methods from ecology, genetics, phylogenetics, network analysis, visualization and testing. The data itself may originate from widely different sources, such as the microbiomes of humans, soils, surface and ocean waters, wastewater treatment plants, industrial facilities, and so on; and as a result, these varied sample types may have very different forms and scales of related data that is extremely dependent upon the experiment and its question(s). The phyloseq package is a tool to import, store, analyze, and graphically display complex phylogenetic sequencing data that has already been clustered into Operational Taxonomic Units (OTUs), especially when there is associated sample data, phylogenetic tree, and/or taxonomic assignment of the OTUs. This package leverages many of the tools available in R for ecology and phylogenetic analysis (vegan, ade4, ape, picante), while also using advanced/flexible graphic systems (ggplot2) to easily produce publication-quality graphics of complex phylogenetic data. phyloseq uses a specialized system of S4 classes to store all related phylogenetic sequencing data as single experiment-level object, making it easier to share data and reproduce analyses. In general, phyloseq seeks to facilitate the use of R for efficient interactive and reproducible analysis of OTU-clustered high-throughput phylogenetic sequencing data.

2 About this vignette

2.1 Typesetting Legend

  • bold - Bold is used for emphasis.
  • italics - Italics are used for package names, and special words, phrases.
  • code font - The font for code, usually courrier-like, but depends on the theme.
  • myFun() - Code font word with () attached at the right-end, is a function name.
  • Hyperlink - Hyperlinks are clickable text that will jump to sections and external pages.

3 phyloseq classes

The class structure in the phyloseq package follows the inheritance diagram shown in the figure below. Currently, phyloseq uses 4 core data classes. They are (1) the OTU abundance table (otu_table), a table of sample data (sample_data); (2) a table of taxonomic descriptors (taxonomyTable); and (3) a phylogenetic tree ("phylo"-class, ape package.

The otu_table class can be considered the central data type, as it directly represents the number and type of sequences observed in each sample. otu_table extends the numeric matrix class in the R base, and has a few additonal feature slots. The most important of these feature slots is the taxa_are_rows slot, which holds a single logical that indicates whether the table is oriented with taxa as rows (as in the genefilter package in Bioconductor or with taxa as columns (as in vegan and picante packages). In phyloseq methods, as well as its extensions of methods in other packages, the taxa_are_rows value is checked to ensure proper orientation of the otu_table. A phyloseq user is only required to specify the otu_table orientation during initialization, following which all handling is internal.

The sample_data class directly inherits R’s data.frame class, and thus effectively stores both categorical and numerical data about each sample. The orientation of a data.frame in this context requires that samples/trials are rows, and variables are columns (consistent with vegan and other packages). The taxonomyTable class directly inherits the matrix class, and is oriented such that rows are taxa/OTUs and columns are taxonomic levels (e.g. Phylum).

The phyloseq-class can be considered an “experiment-level class” and should contain two or more of the previously-described core data classes. We assume that phyloseq users will be interested in analyses that utilize their abundance counts derived from the phylogenetic sequencing data, and so the phyloseq() constructor will stop with an error if the arguments do not include an otu_table. There are a number of common methods that require either an otu_table and sample_data combination, or an otu_table and phylogenetic tree combination. These methods can operate on instances of the phyloseq-class, and will stop with an error if the required component data is missing.

phyloseq class structure Classes and inheritance in the phyloseq package. The class name and its slots are shown with red- or blue-shaded text, respectively. Coercibility is indicated graphically by arrows with the coercion function shown. Lines without arrows indicate that the more complex class (``phyloseq“) contains a slot with the associated data class as its components.

4 Load phyloseq and import data

Now let’s get started by loading phyloseq, and describing some methods for importing data.

4.1 Load phyloseq

To use phyloseq in a new R session, it will have to be loaded. This can be done in your package manager, or at the command line using the library() command:

library("phyloseq")

4.2 Import data

An important feature of phyloseq are methods for importing phylogenetic sequencing data from common taxonomic clustering pipelines. These methods take file pathnames as input, read and parse those files, and return a single object that contains all of the data.

Some additional background details are provided below. The best reproducible examples on importing data with phyloseq can be found on the official data import tutorial page:

http://joey711.github.com/phyloseq/import-data

4.3 Import from biom-format

New versions of QIIME (see below) produce a file in version 2 of the biom file format, which is a specialized definition of the HDF5 format.

The phyloseq package provides the import_biom() function, which can import both Version 1 (JSON) and Version 2 (HDF5) of the BIOM file format.

The phyloseq package fully supports both taxa and sample observations of the biom format standard, and works with the BIOM files output from QIIME, RDP, MG-RAST, etc.

4.4 Import from QIIME (Modern)

The default output from modern versions of QIIME is a BIOM-format file (among others). This is suppored in phyloseq.

4.4.1 Sample data from QIIME

Sometimes inaccurately referred to as metadata, additional observations on samples provided as mapping file to QIIME have not typically been output in the BIOM files, even though BIOM format supports it. This failure to support the full capability of the BIOM format means that you’ll have to provide sample observations as a separate file. There are many ways to do this, but the QIIME sample map is supported.

4.4.2 Input

Two QIIME output files (.biom, .tre) are recognized by the import_biom() function. One QIIME input file (sample map, tab-delimited), is recognized by the import_qiime_sample_data() function.

The objects created by each of the import functions above should be merged using merge_phyloseq to create one coordinated, self-consistent object.

4.4.3 Output

  • Before Merging - Before merging with merge_phyloseq, the output from these import activities is the three separate objects listed in the previous table.
  • After Merging - After merging you have a single self-consistent phyloseq object that contains an OTU table, taxonomy table, sample-data, and a phylogenetic tree.

4.4.4 QIIME Example Tutorial

QIIME’s “Moving Pictures” example tutorial output is a little too large to include within the phyloseq package (and thus is not directly included in this vignette). However, the phyloseq home page includes a full reproducible example of the import procedure described above:

Link HERE

For reference, or if you want to try yourself, the following is the relative paths within the QIIME tutorial directory for each of the files you will need.

  • BIOM file, originally at: moving_pictures_tutorial-1.9.0/illumina/precomputed-output/otus/otu_table_mc2_w_tax_no_pynast_failures.biom
  • Tree file, originally at: moving_pictures_tutorial-1.9.0/illumina/precomputed-output/otus/rep_set.tre
  • Map File, originally at: moving_pictures_tutorial-1.9.0/illumina/map.tsv

4.5 Import from QIIME Legacy

QIIME is a free, open-source OTU clustering and analysis pipeline written for Unix (mostly Linux). It is distributed in a number of different forms (including a pre-installed virtual machine). See the QIIME home page for details.

4.5.1 Input

One QIIME input file (sample map), and two QIIME output files (otu_table.txt, .tre) are recognized by the import_qiime() function. Only one of the three input files is required to run, although an "otu_table.txt" file is required if import_qiime() is to return a complete experiment object.

In practice, you will have to find the relevant QIIME files among a number of other files created by the QIIME pipeline. A screenshot of the directory structure created during a typical QIIME run is shown in the QIIME Directory Figure.

QIIME directory structure A typical QIIME output directory. The two output files suitable for import by phyloseq are highlighted. A third file describing the samples, their barcodes and covariates, is created by the user and required as input to QIIME. It is a good idea to import this file, as it can be converted directly to a sample_data object and can be extremely useful for certain analyses.

4.5.2 Output

The class of the object returned by import_qiime() depends upon which filenames are provided. The most comprehensive class is chosen automatically, based on the input files listed as arguments. At least one argument needs to be provided.

4.6 Import from mothur

The open-source, platform-independent, locally-installed software package, mothur, can also process barcoded amplicon sequences and perform OTU-clustering. It is extensively documented on the mothur wiki

4.6.1 Input

Currently, there are three different files produced by the mothur package (Ver 1.22+) that can be imported by phyloseq. At minimum, a user must supply a “.list” file, and at least one of the following two files: .groups or .tree. The group file is produced by mothur’s make.group() function. Details can be found at its wiki page. The tree file is a phylogenetic tree calculated by mothur.

4.6.2 Output

The output from import_mothur() depends on which file types are provided. If all three file types are provided, an instance of the phyloseq-class is returned that contains both an OTU abundance table and its associated phylogenetic tree.

4.7 Import from PyroTagger

PyroTagger is an OTU-clustering pipeline for barcoded 16S rRNA amplicon sequences, served and maintained by the Department of Energy’s (DOE’s) Joint Genome Institute (JGI). It can be used through a straightforward web interface at the PyroTagger home page

PyroTagger takes as input the untrimmed sequence (.fasta) and sequence-quality (.qual) files, as well as a sample mapping file that contains the bar code sequence for each sample and its name. It uses a 97% identity threshold for defining OTU clusters (approximately species-level of taxonomic distinction), and provides no options for specifying otherwise. It does allow users to modify the threshold setting for low-quality bases.

4.7.1 Input

PyroTagger returns a single excel spreadsheet file (.xls) containing both abundance and taxonomy data, as well as some associated confidence information related to each taxonomic assignment. This spreadsheet also reports on potential chimeric sequences. This single output file is sufficient for import_RDP_tab(), provided the file has been converted to a tab-delimited plain-text format. Any spreadsheet application should suffice. No other changes should be made to the .xls file.

4.7.2 Output

import_RDP_tab() returns an instance of the phyloseq-class that contains the OTU abundance table and taxonomy table. To my knowledge, PyroTagger does not calculate a tree of the representative sequences from each OTU cluster, nor a distance object, so analyses like tip_glom() and UniFrac are not applicable.

4.8 Import from RDP pipeline

The Ribosomal Database Project (RDP) provides a web-based barcoded 16S rRNA amplicon sequence processing pipeline called the RDP Pyrosequencing Pipeline. A user must run all three of the “Data Processing” steps sequentially through the web interface in order to acquire the output from Complete Linkage Clustering, the approach to OTU clustering used by the RDP Pipeline. Note that this import function assumes that the sequence names in the resulting cluster file follow a particular naming convention with underscore delimiter (see below).

4.8.1 Input

The output from the Complete Linkage Clustering, .clust, is the only input to the RDP pipeline importer:

myOTU1 <- import_RDP_cluster("path/to/my/filename.clust")

4.8.2 Output

This importer returns an otu_table object.

4.8.3 Expected Naming Convention

The RDP cluster pipeline (specifically, the output of the complete linkage clustering step) has no formal documentation for the “.clust” file structure or its apparent sequence naming convention.

The cluster file itself contains the names of all sequences contained in the input alignment. If the upstream barcode and aligment processing steps are also done with the RDP pipeline, then the sequence names follow a predictable naming convention wherein each sequence is named by its sample and sequence ID, separated by a "_" as delimiter:

sampleName_sequenceIDnumber

This import function assumes that the sequence names in the cluster file follow this convention, and that the sample name does not contain any "_". It is unlikely to work if this is not the case. It is likely to work if you used the upstream steps in the RDP pipeline to process your raw (barcoded, untrimmed) fasta/fastq data.

4.9 Example Data (included)

There are multiple example data sets included in phyloseq. Many are from published investigations and include documentation with a summary and references, as well as some example code representing some aspect of analysis available in phyloseq. In the package index, go to the names beginning with “data-” to see the documentation of currently available example datasets.

To load example data into the working environment, use the data() command:

data(GlobalPatterns)
data(esophagus)
data(enterotype)
data(soilrep) 

Similarly, entering ?enterotype will reveal the documentation for the so-called “enterotype” dataset. For details examples, see the Example Data tutorial

4.10 phyloseq Object Summaries

In small font, the following is the summary of the GlobalPatterns dataset that prints to the terminal. These summaries are consistent among all phyloseq-class objects. Although the components of GlobalPatterns have many thousands of elements, the command-line returns only a short summary of each component. This encourages you to check that an object is still what you expect, without needing to let thousands of elements scroll across the terminal. In the cases in which you do want to see more of a particular component, use an accessor function (see table below).

data(GlobalPatterns)
GlobalPatterns
## phyloseq-class experiment-level object
## otu_table()   OTU Table:         [ 19216 taxa and 26 samples ]
## sample_data() Sample Data:       [ 26 samples by 7 sample variables ]
## tax_table()   Taxonomy Table:    [ 19216 taxa by 7 taxonomic ranks ]
## phy_tree()    Phylogenetic Tree: [ 19216 tips and 19215 internal nodes ]

4.11 Convert raw data to phyloseq components

Suppose you have already imported raw data from an experiment into R, and their indices are labeled correctly. How do you get phyloseq to recognize these tables as the appropriate class of data? And further combine them together? Table Table of Component Constructor Functions lists key functions for converting these core data formats into specific component data objects recognized by phyloseq. These will also

Table of component constructor functions for building component data objects

phyloseq constructors: functions for building/merging phyloseq objects.

The following example illustrates using the constructor methods for component data tables.

otu1 <- otu_table(raw_abundance_matrix, taxa_are_rows=FALSE)
sam1 <- sample_data(raw_sample_data.frame) 
tax1 <- tax_table(raw_taxonomy_matrix)
tre1 <- read_tree(my_tree_file)

4.12 phyloseq() function: building complex phyloseq objects

Once you’ve converted the data tables to their appropriate class, combining them into one object requires only one additional function call, phyloseq():

ex1b <- phyloseq(my_otu_table, my_sample_data, my_taxonomyTable, my_tree)

You do not need to have all four data types in the example above in order to combine them into one validity-checked experiment-level phyloseq-class object. The phyloseq() method will detect which component data classes are present, and build accordingly. Downstream analysis methods will access the required components using phyloseq’s accessors, and throw an error if something is missing. For most downstream methods you will only need to supply the combined, phyloseq-class object (the output of phyloseq() ), usually as the first argument.

ex1c <- phyloseq(my_otu_table, my_sample_data)

Whenever an instance of the phyloseq-class is created by phyloseq — for example, when we use the import_qiime() function to import data, or combine manually imported tables using phyloseq() — the row and column indices representing taxa or samples are internally checked/trimmed for compatibility, such that all component data describe exactly (and only) the same OTUs and samples.

4.13 Merge

The phyloseq project includes support for two complete different categories of merging.

  • Merging the OTUs or samples in a phyloseq object, based upon a taxonomic or sample variable: merge_samples(), merge_taxa()
  • Merging two or more data objects that come from the same experiment, so that their data becomes part of the same phyloseq object: merge_phyloseq()

For further details, see the reproducible online tutorial at:

http://joey711.github.com/phyloseq/merge

5 Accessor functions

Once you have a phyloseq object available, many accessor functions are available to query aspects of the data set. The function name and its purpose are summarized in the Accessor Functions Table.

Accessor functions for phyloseq objects.

6 Trimming, subsetting, filtering phyloseq data

6.1 Trimming: prune_taxa()

Trimming high-throughput phylogenetic sequencing data can be useful, or even necessary, for certain types of analyses. However, it is important that the original data always be available for reference and reproducibility; and that the methods used for trimming be transparent to others, so they can perform the same trimming or filtering steps on the same or related data. To facilitate this, phyloseq contains many ways to trim/filter the data from a phylogenetic sequencing project. Because matching indices for taxa and samples is strictly enforced, subsetting one of the data components automatically subsets the corresponding indices from the others. Variables holding trimmed versions of your original data can be declared, and further trimmed, without losing track of the original data.

In general, most trimming should be accomplished using the S4 methods prune_taxa() or prune_samples().

6.2 Simple filtering example

For example, lets make a new object that only holds the most abundant 20 taxa in the experiment. To accomplish this, we will use the prune_taxa() function.

data(GlobalPatterns)
most_abundant_taxa <- sort(taxa_sums(GlobalPatterns), TRUE)[1:topN]
ex2 <- prune_taxa(names(most_abundant_taxa), GlobalPatterns)

Now we can ask the question, “what taxonomic Family are these OTUs?” (Subsetting still returns a taxonomyTable object, which is summarized. We will need to convert to a vector)

topFamilies <- tax_table(ex2)[, "Family"]
as(topFamilies, "vector")
##  [1] NA                   "ACK-M1"             "ACK-M1"            
##  [4] "Bifidobacteriaceae" NA                   NA                  
##  [7] "Nostocaceae"        NA                   "Neisseriaceae"     
## [10] "Neisseriaceae"      "Pasteurellaceae"    "Enterobacteriaceae"
## [13] "Bacteroidaceae"     "Bacteroidaceae"     "Bacteroidaceae"    
## [16] "Clostridiaceae"     "Ruminococcaceae"    "Ruminococcaceae"   
## [19] "Ruminococcaceae"    "Streptococcaceae"

6.3 Arbitrarily complex abundance filtering

The previous example was a relatively simple filtering in which we kept only the most abundant 20 in the whole experiment. But what if we wanted to keep the most abundant 20 taxa of each sample? And of those, keep only the taxa that are also found in at least one-third of our samples? What if we wanted to keep only those taxa that met some across-sample criteria?

6.3.1 genefilter_sample(): Filter by Within-Sample Criteria

For this more complicated filtering phyloseq contains a function, genefilter_sample, that takes as an argument a phyloseq object, as well as a list of one or more filtering functions that will be applied to each sample in the abundance matrix (otu_table), as well as an integer argument, A, that specifies for how many samples the filtering function must return TRUE for a particular taxa to avoid removal from the object. A supporting function filterfun_sample is also included in phyloseq to facilitate creating a properly formatted function (enclosure) if more than one function is going to be applied simultaneously. genefilter_sample returns a logical vector suitable for sending directly to prune_taxa for the actual trimming.

Here is an example on a completely fabricated otu_table called testOTU.

testOTU <- otu_table(matrix(sample(1:50, 25, replace=TRUE), 5, 5), taxa_are_rows=FALSE)
f1<- filterfun_sample(topk(2))
wh1 <- genefilter_sample(testOTU, f1, A=2)
wh2 <- c(T, T, T, F, F)
prune_taxa(wh1, testOTU)
prune_taxa(wh2, testOTU)

Here is a second example using the included dataset, GlobalPatterns. The most abundant taxa are kept only if they are in the most abundant 10% of taxa in at least half of the samples in dataset GlobalPatterns. Note that it is not necessary to subset GlobalPatterns in order to do this filtering. The S4 method prune_taxa subsets each of the relavent component objects, and returns the complex object back.

data(GlobalPatterns)
f1<- filterfun_sample(topp(0.1))
wh1 <- genefilter_sample(GlobalPatterns, f1, A=(1/2*nsamples(GlobalPatterns)))
sum(wh1)
## [1] 795
ex2 <- prune_taxa(wh1, GlobalPatterns)
print(ex2)
## phyloseq-class experiment-level object
## otu_table()   OTU Table:         [ 795 taxa and 26 samples ]
## sample_data() Sample Data:       [ 26 samples by 7 sample variables ]
## tax_table()   Taxonomy Table:    [ 795 taxa by 7 taxonomic ranks ]
## phy_tree()    Phylogenetic Tree: [ 795 tips and 794 internal nodes ]

If instead of the most abundant fraction of taxa, you are interested in the most abundant fraction of individuals (aka sequences, observations), then the topf function is appropriate. For steep rank-abundance curves, topf will seem to be much more conservative (trim more taxa) because it is based on the cumulative sum of relative abundance. It does not guarantee that a certain number or fraction of total taxa (richness) will be retained.

data(GlobalPatterns)
f1<- filterfun_sample(topf(0.9))
wh1 <- genefilter_sample(GlobalPatterns, f1, A=(1/3*nsamples(GlobalPatterns)))
sum(wh1)
prune_taxa(wh1, GlobalPatterns)

6.3.2 filter_taxa(): Filter by Across-Sample Criteria

The filter_taxa function is directly analogous to the genefilter function for microarray filtering, but is used for filtering OTUs from phyloseq objects. It applies an arbitrary set of functions – as a function list, for instance, created by genefilter::filterfun – as across-sample criteria, one OTU at a time. It can be thought of as an extension of the genefilter-package (from the Bioconductor repository) for phyloseq objects. It takes as input a phyloseq object, and returns a logical vector indicating whether or not each OTU passed the criteria. Alternatively, if the prune option is set to FALSE, it returns the already-trimmed version of the phyloseq object.

Inspect the following example. Note that the functions genefilter and kOverA are from the genefilter package.

data("enterotype")
library("genefilter")
flist<- filterfun(kOverA(5, 2e-05))
ent.logi <- filter_taxa(enterotype, flist)
ent.trim <- filter_taxa(enterotype, flist, TRUE)
identical(ent.trim, prune_taxa(ent.logi, enterotype)) 
## [1] TRUE
identical(sum(ent.logi), ntaxa(ent.trim))
## [1] TRUE
filter_taxa(enterotype, flist, TRUE)
## phyloseq-class experiment-level object
## otu_table()   OTU Table:         [ 416 taxa and 280 samples ]
## sample_data() Sample Data:       [ 280 samples by 9 sample variables ]
## tax_table()   Taxonomy Table:    [ 416 taxa by 1 taxonomic ranks ]

6.4 subset_samples(): Subset by Sample Variables

It is possible to subset the samples in a phyloseq object based on the sample variables using the subset_samples() function. For example to subset GlobalPatterns such that only certain environments are retained, the following line is needed (the related tables are subsetted automatically as well):

ex3 <- subset_samples(GlobalPatterns, SampleType%in%c("Freshwater", "Ocean", "Freshwater (creek)"))
ex3
## phyloseq-class experiment-level object
## otu_table()   OTU Table:         [ 19216 taxa and 8 samples ]
## sample_data() Sample Data:       [ 8 samples by 7 sample variables ]
## tax_table()   Taxonomy Table:    [ 19216 taxa by 7 taxonomic ranks ]
## phy_tree()    Phylogenetic Tree: [ 19216 tips and 19215 internal nodes ]

For this example only a categorical variable is shown, but in principle a continuous variable could be specified and a logical expression provided just as for the subset function. In fact, because sample_data component objects are an extension of the data.frame class, they can also be subsetted with the subset function:

subset(sample_data(GlobalPatterns), SampleType%in%c("Freshwater", "Ocean", "Freshwater (creek)"))
##          X.SampleID  Primer Final_Barcode Barcode_truncated_plus_T
## LMEpi24M   LMEpi24M ILBC_13        ACACTG                   CAGTGT
## SLEpi20M   SLEpi20M ILBC_15        ACAGAG                   CTCTGT
## AQC1cm       AQC1cm ILBC_16        ACAGCA                   TGCTGT
## AQC4cm       AQC4cm ILBC_17        ACAGCT                   AGCTGT
## AQC7cm       AQC7cm ILBC_18        ACAGTG                   CACTGT
## NP2             NP2 ILBC_19        ACAGTT                   AACTGT
## NP3             NP3 ILBC_20        ACATCA                   TGATGT
## NP5             NP5 ILBC_21        ACATGA                   TCATGT
##          Barcode_full_length         SampleType
## LMEpi24M         CATGAACAGTG         Freshwater
## SLEpi20M         AGCCGACTCTG         Freshwater
## AQC1cm           GACCACTGCTG Freshwater (creek)
## AQC4cm           CAAGCTAGCTG Freshwater (creek)
## AQC7cm           ATGAAGCACTG Freshwater (creek)
## NP2              TCGCGCAACTG              Ocean
## NP3              GCTAAGTGATG              Ocean
## NP5              GAACGATCATG              Ocean
##                                           Description
## LMEpi24M Lake Mendota Minnesota, 24 meter epilimnion 
## SLEpi20M Sparkling Lake Wisconsin, 20 meter eplimnion
## AQC1cm                   Allequash Creek, 0-1cm depth
## AQC4cm                  Allequash Creek, 3-4 cm depth
## AQC7cm                  Allequash Creek, 6-7 cm depth
## NP2            Newport Pier, CA surface water, Time 1
## NP3            Newport Pier, CA surface water, Time 2
## NP5            Newport Pier, CA surface water, Time 3

6.5 subset_taxa(): subset by taxonomic categories

It is possible to subset by specific taxonomic category using the subset_taxa() function. For example, if we wanted to subset GlobalPatterns so that it only contains data regarding the phylum Firmicutes:

ex4 <- subset_taxa(GlobalPatterns, Phylum=="Firmicutes")
ex4
## phyloseq-class experiment-level object
## otu_table()   OTU Table:         [ 4356 taxa and 26 samples ]
## sample_data() Sample Data:       [ 26 samples by 7 sample variables ]
## tax_table()   Taxonomy Table:    [ 4356 taxa by 7 taxonomic ranks ]
## phy_tree()    Phylogenetic Tree: [ 4356 tips and 4355 internal nodes ]

6.6 random subsample abundance data

Can also randomly subset, for example a random subset of 100 taxa from the full dataset.

randomSpecies100 <- sample(taxa_names(GlobalPatterns), 100, replace=FALSE)
ex5 <- prune_taxa(randomSpecies100, GlobalPatterns)

7 Transform abundance data

Sample-wise transformation can be achieved with the transform_sample_counts() function. It requires two arguments, (1) the phyloseq object that you want to transform, and the function that you want to use to perform the transformation. Any arbitrary function can be provided as the second argument, as long as it returns a numeric vector with the same length as its input. In the following trivial example, we create a second object, ex2, that has been “transformed” by the identity function such that it is actually identical to GlobalPatterns.

data(GlobalPatterns)
ex2 <- transform_sample_counts(GlobalPatterns, I)

For certain kinds of analyis we may want to transform the abundance data. For example, for RDA we want to transform abundance counts to within-sample ranks, and to further include a threshold beyond which all taxa receive the same rank value. The ranking for each sample is performed independently, so that the rank of a particular taxa within a particular sample is not influenced by that sample’s total quantity of sequencing relative to the other samples in the project.

The following example shows how to perform such a thresholded-rank transformation of the abundance table in the complex phyloseq object GlobalPatterns with an arbitrary threshold of 500.

ex4<- transform_sample_counts(GlobalPatterns, threshrankfun(500))

8 Phylogenetic smoothing

8.1 tax_glom()

Suppose we are skeptical about the importance of OTU-level distinctions in our dataset. For this scenario, phyloseq includes a taxonomic-agglommeration method,tax_glom(), which merges taxa of the same taxonomic category for a user-specified taxonomic level. In the following code, we merge all taxa of the same Genus, and store that new object as ex6.

ex6 <- tax_glom(GlobalPatterns, taxlevel="Genus")

8.2 tip_glom()

Similarly, our original example object (GlobalPatterns) also contains a phlyogenetic tree corresponding to each OTU, which we could also use as a means to merge taxa in our dataset that are closely related. In this case, we specify a threshold patristic distance. Taxa more closely related than this threshold are merged. This is especially useful when a dataset has many taxa that lack a taxonomic assignment at the level you want to investigate, a problem when using tax_glom(). Note that for datasets with a large number of taxa, tax_glom will be noticeably faster than tip_glom. Also, keep in mind that tip_glom requires that its first argument be an object that contains a tree, while tax_glom instead requires a taxonomyTable (See phyloseq classes).

ex7 <- tip_glom(GlobalPatterns, speciationMinLength = 0.05)

Command output not provided here to save time during compilation of the vignette. The user is encouraged to try this out on your dataset, or even this example, if interested. It may take a while to run on the full, untrimmed data.

9 Installation

9.1 Installation

Please check the phyloseq installation tutorial for help with installation. This is likely to be the first place news and updated information about installation will be posted, as well. Also check out the rest of the phyloseq homepage on GitHub, as this is the best place to post issues, bug reports, feature requests, contribute code, etc.

9.2 Installing Parallel Backend

For running parallel implementation of functions/methods in phyloseq (e.g. UniFrac(GlobalPatterns, parallel=TRUE)), you will need also to install a function for registering a parallel “backend”. Only one working parallel backend is needed, but there are several options, and the best one will depend on the details of your particular system. The “doParallel” package is a good place to start. Any one of the following lines from an R session will install a backend package.

install.packages("doParallel")
install.packages("doMC")
install.packages("doSNOW")
install.packages("doMPI")

10 References

Robert C Gentleman, Vincent J. Carey, Douglas M. Bates, et al. Bioconductor: Open software development for computational biology and bioinformatics. Genome Biology 5:R80, 2004.

J Gregory Caporaso, Justin Kuczynski, Jesse Stombaugh, Kyle Bittinger, Frederic D Bushman QIIME allows analysis of high-throughput community sequencing data. Nature Methods 7(5):335-336, 2010.

P D Schloss, S L Westcott, T Ryabin, J R Hall, M Hartmann, et al. Introducing mothur: Open-Source, Platform-Independent, Community-Supported Software for Describing and Comparing Microbial Communities. Applied and Environmental Microbiology 75(23):7537-7541, 2009.

J R Cole, Q Wang, E Cardenas, J Fish, B Chai et al. The Ribosomal Database Project: improved alignments and new tools for rRNA analysis. Nucleic Acids Research 37(Database issue):D141-5, 2009.

phyloseq/inst/doc/phyloseq-mixture-models.R0000644000175400017540000000616313177723155022152 0ustar00biocbuildbiocbuild## ----load-phyloseq, message=FALSE, warning=FALSE--------------------------- library("phyloseq"); packageVersion("phyloseq") ## ----filepath-------------------------------------------------------------- filepath = system.file("extdata", "study_1457_split_library_seqs_and_mapping.zip", package="phyloseq") kostic = microbio_me_qiime(filepath) ## ----example-path-local, eval=FALSE---------------------------------------- # filepath = "~/Downloads/study_1457_split_library_seqs_and_mapping.zip" # kostic = microbio_me_qiime(filepath) ## ----example-path-remote, eval=FALSE--------------------------------------- # kostic = microbio_me_qiime(1457) ## ----show-variables-------------------------------------------------------- kostic head(sample_data(kostic)$DIAGNOSIS, 10) ## ----deseq2, message=FALSE, warning=FALSE---------------------------------- library("DESeq2"); packageVersion("DESeq2") ## ----rm-bad-samples-------------------------------------------------------- kostic <- subset_samples(kostic, DIAGNOSIS != "None") kostic <- prune_samples(sample_sums(kostic) > 500, kostic) kostic ## ----run-deseq2------------------------------------------------------------ diagdds = phyloseq_to_deseq2(kostic, ~ DIAGNOSIS) # calculate geometric means prior to estimate size factors gm_mean = function(x, na.rm=TRUE){ exp(sum(log(x[x > 0]), na.rm=na.rm) / length(x)) } geoMeans = apply(counts(diagdds), 1, gm_mean) diagdds = estimateSizeFactors(diagdds, geoMeans = geoMeans) diagdds = DESeq(diagdds, fitType="local") ## ----grab-results-process-table-------------------------------------------- res = results(diagdds) res = res[order(res$padj, na.last=NA), ] alpha = 0.01 sigtab = res[(res$padj < alpha), ] sigtab = cbind(as(sigtab, "data.frame"), as(tax_table(kostic)[rownames(sigtab), ], "matrix")) head(sigtab) ## ----table-prelim---------------------------------------------------------- posigtab = sigtab[sigtab[, "log2FoldChange"] > 0, ] posigtab = posigtab[, c("baseMean", "log2FoldChange", "lfcSE", "padj", "Phylum", "Class", "Family", "Genus")] ## ----make-markdown-table, echo=FALSE, results='asis'----------------------- # Make a markdown table posigtab = data.frame(OTU=rownames(posigtab), posigtab) cat(paste(colnames(posigtab), collapse=" | "), fill=TRUE) cat(paste(rep("---", times=ncol(posigtab)), collapse=" | "), fill=TRUE) dummy = apply(posigtab, 1, function(x){ cat(paste(x, collapse=" | "), fill=TRUE) }) ## ----bar-plot-------------------------------------------------------------- library("ggplot2") theme_set(theme_bw()) sigtabgen = subset(sigtab, !is.na(Genus)) # Phylum order x = tapply(sigtabgen$log2FoldChange, sigtabgen$Phylum, function(x) max(x)) x = sort(x, TRUE) sigtabgen$Phylum = factor(as.character(sigtabgen$Phylum), levels=names(x)) # Genus order x = tapply(sigtabgen$log2FoldChange, sigtabgen$Genus, function(x) max(x)) x = sort(x, TRUE) sigtabgen$Genus = factor(as.character(sigtabgen$Genus), levels=names(x)) ggplot(sigtabgen, aes(y=Genus, x=log2FoldChange, color=Phylum)) + geom_vline(xintercept = 0.0, color = "gray", size = 0.5) + geom_point(size=6) + theme(axis.text.x = element_text(angle = -90, hjust = 0, vjust=0.5)) phyloseq/inst/doc/phyloseq-mixture-models.Rmd0000644000175400017540000002252213175714136022465 0ustar00biocbuildbiocbuild--- title: "Example using Negative Binomial in Microbiome Differential Abundance Testing" output: BiocStyle::html_document: fig_height: 7 fig_width: 10 toc: yes toc_depth: 2 number_sections: true --- `r library("knitr")` `r opts_chunk$set(cache=FALSE, fig.width=9, message=FALSE, warning=FALSE)` Paul J. McMurdie and Susan Holmes [phyloseq Home Page](http://joey711.github.io/phyloseq/) If you find phyloseq and/or its tutorials useful, please acknowledge and cite phyloseq in your publications: **phyloseq: An R package for reproducible interactive analysis and graphics of microbiome census data** (2013) PLoS ONE 8(4):e61217 http://dx.plos.org/10.1371/journal.pone.0061217 # Other resources The phyloseq project also has a number of supporting online resources, most of which can by found at [the phyloseq home page](http://joey711.github.com/phyloseq/), or from the phyloseq stable release [page on Bioconductor](http://bioconductor.org/packages/release/bioc/html/phyloseq.html). To post feature requests or ask for help, try [the phyloseq Issue Tracker](https://github.com/joey711/phyloseq/issues). # The experimental data used in this example In this example I use the publicly available data from a study on colorectal cancer: [Genomic analysis identifies association of Fusobacterium with colorectal carcinoma](http://genome.cshlp.org/content/22/2/292.long). Kostic, A. D., Gevers, D., Pedamallu, C. S., Michaud, M., Duke, F., Earl, A. M., et al. (2012). *Genome research*, 22(2), 292-298. As a side-note, this work was published ahead of print in [Genome Research](http://genome.cshlp.org/) alongside a highly-related article from a separate group of researchers (long-live reproducible observations!): [Fusobacterium nucleatum infection is prevalent in human colorectal carcinoma](http://genome.cshlp.org/content/22/2/299.long). In case you are interested. For the purposes of example, however, we will stick to the data from the former study, with data available at the [microbio.me/qiime](http://www.microbio.me/qiime/) server. Data source, from methods section in article: > The 16S gene data set consists of 454 FLX Titanium sequences spanning the V3 to V5 variable regions obtained for 190 samples (95 pairs). Detailed protocols used for 16S amplification and se- quencing are available on the HMP Data Analysis and Coordination Center website (http://www.hmpdacc.org/tools_protocols/tools_ protocols.php). Study ID: `1457` Project Name: `Kostic_colorectal_cancer_fusobacterium` Study Abstract: > The tumor microenvironment of colorectal carcinoma is a complex community of genomically altered cancer cells, nonneoplastic cells, and a diverse collection of microorganisms. Each of these components may contribute to carcino genesis; however, the role of the microbiota is the least well understood. We have characterized the composition of the microbiota in colorectal carcinoma using whole genome sequences from nine tumor/normal pairs. Fusobacterium sequences were enriched in carcinomas, confirmed by quantitative PCR and 16S rDNA sequence analysis of 95 carcinoma/normal DNA pairs, while the Bacteroidetes and Firmicutes phyla were depleted in tumors. Fusobacteria were also visualized within colorectal tumors using FISH. These findings reveal alterations in the colorectal cancer microbiota; however, the precise role of Fusobacteria in colorectal carcinoma pathogenesis requires further investigation. # Import data with phyloseq, convert to DESeq2 Start by loading phyloseq. ```{r load-phyloseq, message=FALSE, warning=FALSE} library("phyloseq"); packageVersion("phyloseq") ``` Defined file path, and import the published OTU count data into R. ```{r filepath} filepath = system.file("extdata", "study_1457_split_library_seqs_and_mapping.zip", package="phyloseq") kostic = microbio_me_qiime(filepath) ``` Here I had to use a relative file path so that this example works on all systems that have phyloseq installed. In practice, your file path will look like this (if you've downloaded the data ahead of time): ```{r example-path-local, eval=FALSE} filepath = "~/Downloads/study_1457_split_library_seqs_and_mapping.zip" kostic = microbio_me_qiime(filepath) ``` Or like this (if you're accessing data directly from the microbio.me/qiime server directly): ```{r example-path-remote, eval=FALSE} kostic = microbio_me_qiime(1457) ``` # Convert to DESeq2's DESeqDataSet class In this example I'm using the major sample covariate, `DIAGNOSIS`, as the study design factor. The focus of this study was to compare the microbiomes of pairs of healthy and cancerous tissues, so this makes sense. Your study could have a more complex or nested design, and you should think carefully about the study design formula, because this is critical to the test results and their meaning. You might even need to define a new factor if none of the variables in your current table appropriately represent your study's design. See [the DESeq2 home page](http://www.bioconductor.org/packages/release/bioc/html/DESeq2.html) for more details. Here is the summary of the data variable `kostic` that we are about to use, as well as the first few entries of the `DIAGNOSIS` factor. ```{r show-variables} kostic head(sample_data(kostic)$DIAGNOSIS, 10) ``` # DESeq2 conversion and call First load DESeq2. ```{r deseq2, message=FALSE, warning=FALSE} library("DESeq2"); packageVersion("DESeq2") ``` The following two lines actually do all the complicated DESeq2 work. The function `phyloseq_to_deseq2` converts your phyloseq-format microbiome data into a `DESeqDataSet` with dispersions estimated, using the experimental design formula, also shown (the `~DIAGNOSIS` term). The `DESeq` function does the rest of the testing, in this case with default testing framework, but you can actually use alternatives. First remove the 5 samples that had no `DIAGNOSIS` attribute assigned. These introduce a spurious third design class that is actually a rare artifact in the dataset. Also remove samples with less than `500` reads (counts). Note that this kind of data cleanup is useful, necessary, and should be well-documented because it can also be dangerous to alter or omit data without clear documentation. In this case I actually explored the data first, and am omitting some of the details (and explanatory plots) here for clarity. ```{r rm-bad-samples} kostic <- subset_samples(kostic, DIAGNOSIS != "None") kostic <- prune_samples(sample_sums(kostic) > 500, kostic) kostic ``` ```{r run-deseq2} diagdds = phyloseq_to_deseq2(kostic, ~ DIAGNOSIS) # calculate geometric means prior to estimate size factors gm_mean = function(x, na.rm=TRUE){ exp(sum(log(x[x > 0]), na.rm=na.rm) / length(x)) } geoMeans = apply(counts(diagdds), 1, gm_mean) diagdds = estimateSizeFactors(diagdds, geoMeans = geoMeans) diagdds = DESeq(diagdds, fitType="local") ``` Note: The default multiple-inference correction is Benjamini-Hochberg, and occurs within the `DESeq` function. # Investigate test results table The following `results` function call creates a table of the results of the tests. Very fast. The hard work was already stored with the rest of the DESeq2-related data in our latest version of the `diagdds` object (see above). I then order by the adjusted p-value, removing the entries with an `NA` value. The rest of this example is just formatting the results table with taxonomic information for nice(ish) display in the HTML output. ```{r grab-results-process-table} res = results(diagdds) res = res[order(res$padj, na.last=NA), ] alpha = 0.01 sigtab = res[(res$padj < alpha), ] sigtab = cbind(as(sigtab, "data.frame"), as(tax_table(kostic)[rownames(sigtab), ], "matrix")) head(sigtab) ``` Let's look at just the OTUs that were significantly enriched in the carcinoma tissue. First, cleaning up the table a little for legibility. ```{r table-prelim} posigtab = sigtab[sigtab[, "log2FoldChange"] > 0, ] posigtab = posigtab[, c("baseMean", "log2FoldChange", "lfcSE", "padj", "Phylum", "Class", "Family", "Genus")] ``` ```{r make-markdown-table, echo=FALSE, results='asis'} # Make a markdown table posigtab = data.frame(OTU=rownames(posigtab), posigtab) cat(paste(colnames(posigtab), collapse=" | "), fill=TRUE) cat(paste(rep("---", times=ncol(posigtab)), collapse=" | "), fill=TRUE) dummy = apply(posigtab, 1, function(x){ cat(paste(x, collapse=" | "), fill=TRUE) }) ``` As expected from the original study abstract and title, a *Fusobacterium* OTU was among the most-significantly differentially abundant between the cancerous and healthy samples. # Plot Results Here is a bar plot showing the log2-fold-change, showing Genus and Phylum. Uses some ggplot2 commands. ```{r bar-plot} library("ggplot2") theme_set(theme_bw()) sigtabgen = subset(sigtab, !is.na(Genus)) # Phylum order x = tapply(sigtabgen$log2FoldChange, sigtabgen$Phylum, function(x) max(x)) x = sort(x, TRUE) sigtabgen$Phylum = factor(as.character(sigtabgen$Phylum), levels=names(x)) # Genus order x = tapply(sigtabgen$log2FoldChange, sigtabgen$Genus, function(x) max(x)) x = sort(x, TRUE) sigtabgen$Genus = factor(as.character(sigtabgen$Genus), levels=names(x)) ggplot(sigtabgen, aes(y=Genus, x=log2FoldChange, color=Phylum)) + geom_vline(xintercept = 0.0, color = "gray", size = 0.5) + geom_point(size=6) + theme(axis.text.x = element_text(angle = -90, hjust = 0, vjust=0.5)) ``` phyloseq/inst/doc/phyloseq-mixture-models.html0000644000175400017540000301573413177723156022725 0ustar00biocbuildbiocbuild Example using Negative Binomial in Microbiome Differential Abundance Testing

Contents

Paul J. McMurdie and Susan Holmes

mcmurdie@stanford.edu

phyloseq Home Page

If you find phyloseq and/or its tutorials useful, please acknowledge and cite phyloseq in your publications:

phyloseq: An R package for reproducible interactive analysis and graphics of microbiome census data (2013) PLoS ONE 8(4):e61217 http://dx.plos.org/10.1371/journal.pone.0061217

1 Other resources

The phyloseq project also has a number of supporting online resources, most of which can by found at the phyloseq home page, or from the phyloseq stable release page on Bioconductor.

To post feature requests or ask for help, try the phyloseq Issue Tracker.

2 The experimental data used in this example

In this example I use the publicly available data from a study on colorectal cancer:

Genomic analysis identifies association of Fusobacterium with colorectal carcinoma. Kostic, A. D., Gevers, D., Pedamallu, C. S., Michaud, M., Duke, F., Earl, A. M., et al. (2012). Genome research, 22(2), 292-298.

As a side-note, this work was published ahead of print in Genome Research alongside a highly-related article from a separate group of researchers (long-live reproducible observations!): Fusobacterium nucleatum infection is prevalent in human colorectal carcinoma. In case you are interested. For the purposes of example, however, we will stick to the data from the former study, with data available at the microbio.me/qiime server.

Data source, from methods section in article:

The 16S gene data set consists of 454 FLX Titanium sequences spanning the V3 to V5 variable regions obtained for 190 samples (95 pairs). Detailed protocols used for 16S amplification and se- quencing are available on the HMP Data Analysis and Coordination Center website (http://www.hmpdacc.org/tools_protocols/tools_ protocols.php).

Study ID: 1457

Project Name: Kostic_colorectal_cancer_fusobacterium

Study Abstract:

The tumor microenvironment of colorectal carcinoma is a complex community of genomically altered cancer cells, nonneoplastic cells, and a diverse collection of microorganisms. Each of these components may contribute to carcino genesis; however, the role of the microbiota is the least well understood. We have characterized the composition of the microbiota in colorectal carcinoma using whole genome sequences from nine tumor/normal pairs. Fusobacterium sequences were enriched in carcinomas, confirmed by quantitative PCR and 16S rDNA sequence analysis of 95 carcinoma/normal DNA pairs, while the Bacteroidetes and Firmicutes phyla were depleted in tumors. Fusobacteria were also visualized within colorectal tumors using FISH. These findings reveal alterations in the colorectal cancer microbiota; however, the precise role of Fusobacteria in colorectal carcinoma pathogenesis requires further investigation.

3 Import data with phyloseq, convert to DESeq2

Start by loading phyloseq.

library("phyloseq"); packageVersion("phyloseq")
## [1] '1.22.3'

Defined file path, and import the published OTU count data into R.

filepath = system.file("extdata", "study_1457_split_library_seqs_and_mapping.zip", package="phyloseq")
kostic = microbio_me_qiime(filepath)
## Found biom-format file, now parsing it... 
## Done parsing biom... 
## Importing Sample Metdadata from mapping file...
## Merging the imported objects... 
## Successfully merged, phyloseq-class created. 
##  Returning...

Here I had to use a relative file path so that this example works on all systems that have phyloseq installed. In practice, your file path will look like this (if you’ve downloaded the data ahead of time):

filepath = "~/Downloads/study_1457_split_library_seqs_and_mapping.zip"
kostic = microbio_me_qiime(filepath)

Or like this (if you’re accessing data directly from the microbio.me/qiime server directly):

kostic = microbio_me_qiime(1457)

4 Convert to DESeq2’s DESeqDataSet class

In this example I’m using the major sample covariate, DIAGNOSIS, as the study design factor. The focus of this study was to compare the microbiomes of pairs of healthy and cancerous tissues, so this makes sense. Your study could have a more complex or nested design, and you should think carefully about the study design formula, because this is critical to the test results and their meaning. You might even need to define a new factor if none of the variables in your current table appropriately represent your study’s design. See the DESeq2 home page for more details.

Here is the summary of the data variable kostic that we are about to use, as well as the first few entries of the DIAGNOSIS factor.

kostic
## phyloseq-class experiment-level object
## otu_table()   OTU Table:         [ 2505 taxa and 190 samples ]
## sample_data() Sample Data:       [ 190 samples by 71 sample variables ]
## tax_table()   Taxonomy Table:    [ 2505 taxa by 7 taxonomic ranks ]
head(sample_data(kostic)$DIAGNOSIS, 10)
##  [1] Healthy Tumor   Tumor   Healthy Healthy Healthy Tumor   Healthy Healthy
## [10] Healthy
## Levels: Healthy None Tumor

5 DESeq2 conversion and call

First load DESeq2.

library("DESeq2"); packageVersion("DESeq2")
## [1] '1.18.0'

The following two lines actually do all the complicated DESeq2 work. The function phyloseq_to_deseq2 converts your phyloseq-format microbiome data into a DESeqDataSet with dispersions estimated, using the experimental design formula, also shown (the ~DIAGNOSIS term). The DESeq function does the rest of the testing, in this case with default testing framework, but you can actually use alternatives.

First remove the 5 samples that had no DIAGNOSIS attribute assigned. These introduce a spurious third design class that is actually a rare artifact in the dataset. Also remove samples with less than 500 reads (counts). Note that this kind of data cleanup is useful, necessary, and should be well-documented because it can also be dangerous to alter or omit data without clear documentation. In this case I actually explored the data first, and am omitting some of the details (and explanatory plots) here for clarity.

kostic <- subset_samples(kostic, DIAGNOSIS != "None")
kostic <- prune_samples(sample_sums(kostic) > 500, kostic)
kostic
## phyloseq-class experiment-level object
## otu_table()   OTU Table:         [ 2505 taxa and 177 samples ]
## sample_data() Sample Data:       [ 177 samples by 71 sample variables ]
## tax_table()   Taxonomy Table:    [ 2505 taxa by 7 taxonomic ranks ]
diagdds = phyloseq_to_deseq2(kostic, ~ DIAGNOSIS)
# calculate geometric means prior to estimate size factors
gm_mean = function(x, na.rm=TRUE){
  exp(sum(log(x[x > 0]), na.rm=na.rm) / length(x))
}
geoMeans = apply(counts(diagdds), 1, gm_mean)
diagdds = estimateSizeFactors(diagdds, geoMeans = geoMeans)
diagdds = DESeq(diagdds, fitType="local")

Note: The default multiple-inference correction is Benjamini-Hochberg, and occurs within the DESeq function.

6 Investigate test results table

The following results function call creates a table of the results of the tests. Very fast. The hard work was already stored with the rest of the DESeq2-related data in our latest version of the diagdds object (see above). I then order by the adjusted p-value, removing the entries with an NA value. The rest of this example is just formatting the results table with taxonomic information for nice(ish) display in the HTML output.

res = results(diagdds)
res = res[order(res$padj, na.last=NA), ]
alpha = 0.01
sigtab = res[(res$padj < alpha), ]
sigtab = cbind(as(sigtab, "data.frame"), as(tax_table(kostic)[rownames(sigtab), ], "matrix"))
head(sigtab)
##          baseMean log2FoldChange     lfcSE      stat       pvalue
## 64396  181.564648       2.195547 0.4282121  5.127241 2.940184e-07
## 72853   28.633097      -1.604873 0.3310712 -4.847515 1.250173e-06
## 374052  75.002469       2.523486 0.5411855  4.662885 3.118072e-06
## 307981   3.258919       2.153038 0.4832019  4.455772 8.359169e-06
## 180285 168.356513      -1.204357 0.2782362 -4.328542 1.501000e-05
##                padj  Kingdom         Phylum                Class
## 64396  0.0007238734 Bacteria   Fusobacteria Fusobacteria (class)
## 72853  0.0015389636 Bacteria     Firmicutes           Clostridia
## 374052 0.0025588980 Bacteria   Fusobacteria Fusobacteria (class)
## 307981 0.0051450684 Bacteria Proteobacteria  Gammaproteobacteria
## 180285 0.0073909244 Bacteria     Firmicutes           Clostridia
##                    Order             Family            Genus Species
## 64396    Fusobacteriales   Fusobacteriaceae    Fusobacterium    <NA>
## 72853      Clostridiales    Ruminococcaceae Faecalibacterium    <NA>
## 374052   Fusobacteriales   Fusobacteriaceae    Fusobacterium    <NA>
## 307981 Enterobacteriales Enterobacteriaceae       Klebsiella    <NA>
## 180285     Clostridiales    Ruminococcaceae Faecalibacterium    <NA>

Let’s look at just the OTUs that were significantly enriched in the carcinoma tissue. First, cleaning up the table a little for legibility.

posigtab = sigtab[sigtab[, "log2FoldChange"] > 0, ]
posigtab = posigtab[, c("baseMean", "log2FoldChange", "lfcSE", "padj", "Phylum", "Class", "Family", "Genus")]
OTU baseMean log2FoldChange lfcSE padj Phylum Class Family Genus
64396 181.564648 2.195547 0.4282121 0.0007238734 Fusobacteria Fusobacteria (class) Fusobacteriaceae Fusobacterium
374052 75.002469 2.523486 0.5411855 0.0025588980 Fusobacteria Fusobacteria (class) Fusobacteriaceae Fusobacterium
307981 3.258919 2.153038 0.4832019 0.0051450684 Proteobacteria Gammaproteobacteria Enterobacteriaceae Klebsiella

As expected from the original study abstract and title, a Fusobacterium OTU was among the most-significantly differentially abundant between the cancerous and healthy samples.

7 Plot Results

Here is a bar plot showing the log2-fold-change, showing Genus and Phylum. Uses some ggplot2 commands.

library("ggplot2")
theme_set(theme_bw())
sigtabgen = subset(sigtab, !is.na(Genus))
# Phylum order
x = tapply(sigtabgen$log2FoldChange, sigtabgen$Phylum, function(x) max(x))
x = sort(x, TRUE)
sigtabgen$Phylum = factor(as.character(sigtabgen$Phylum), levels=names(x))
# Genus order
x = tapply(sigtabgen$log2FoldChange, sigtabgen$Genus, function(x) max(x))
x = sort(x, TRUE)
sigtabgen$Genus = factor(as.character(sigtabgen$Genus), levels=names(x))
ggplot(sigtabgen, aes(y=Genus, x=log2FoldChange, color=Phylum)) + 
  geom_vline(xintercept = 0.0, color = "gray", size = 0.5) +
  geom_point(size=6) + 
  theme(axis.text.x = element_text(angle = -90, hjust = 0, vjust=0.5))

phyloseq/inst/extdata/0000755000175400017540000000000013175714136016063 5ustar00biocbuildbiocbuildphyloseq/inst/extdata/GP_otu_table_rand_short.txt.gz0000644000175400017540000003200413175714136024031 0ustar00biocbuildbiocbuild][s8~f~VgOwvgINs^Ṟ#K.]ƅH"%*[&Z@_w_Ç7~_>}_vݲ|_\|_Qv+|/W${_i_Wٯ7o+LodA5_!nub?~Xv+#Mvʾ~-W쾒-ʮ׫mZC֋PMGyXMU۷Zwo߮nS럭ç߾}?UbX(_߾RIoBߧ SXX (!M /%oukEDDu6dD_,'(9sL5 H~Yf4e9^$~y\߯զZ.=r~EL/HrTz.yֲ"[f0`2A3lsOx~¯kFGT~zwIP_"ɳj墺vޒu7)X{t]b6?R&ԓKJɾ+GIjs~-PʅyF<R/XGOe~ZUrp%SEfUZ*_\RUH+K=2 KGEy?qjv.yJ}ٮ$+X#/;-w#qh:\/Dw!ֈקUəURbO4ٯ^MeTe2D2)T(!xUV{}WSxS_vײbٲ1Ӑ]nޕ^);yH"M;1G_%i7HZuۑ67roA֤hmʩ67?y>צdw&X b*^1!;X<8Y(Frt^#OîQ+jaI͆fe}e}=0}M6q|Q_CVX!ZS8P ŌZP1MŞ5j$gYWeqc^%ի>S+!C$D¡=]:k<(G쟬b>A UǓ9X:fr=5B3*xƴDS4+IW_dXGd/UzhGY`ZQ4OcpS96ӗAw*;im,(e<}/pMܪrcy G(;iJ;Y9;'\0 ݔfZm Hj6Bb"#ZL3 (x]"kUC26OĈ>!E\;[;w)wF[?ʀ4:F \?UUbG M>ҿF}{TJb3eTA/ ";k̀"ZU5c(\3"@'Ӫ GcFxh2'ٵ&=ҧ v3fŊ"g9GT}tLL}XnVٗ!8 O2#-->jTr(QWeZnnR6Z1q)FXx!R?؏ jm-mw/+L|ˊp횞R@wN A5 ڮ/)Ky[E-0$qrnLT$%9ܤG1v)/Zx[h?>|jQnvEy[W[ci,w!49|GUvB*``30{&ﴤ{ti 2)O޶i._n[ұy> ckÌu˜9GDW6T'I(($17U.ɥCB=-)pQEӄBF f92%isv`jksuYJKs\<&UqB*b$1[J]ߵ|7<@*Pq<{Hb2,@ S"i¨ܡe;-#GTL&9SnST_fާhAKc9c}̃/;B.&9JQfݣsKngmv<9 L'{I~)bjeݙ˲yy z6Dzȩ<6x@nX[%&vcX]J+5݈?t`0J*BDϰQ`e)̳6Z/}ՊL˥VF5q{ A:c tbʦ2Nxƹ@4$|H]_U OzkrkաJK.֒[k$CU 9Ј!C%3 ҝd#w~\SWo ZXG7PB_㔩PmJƳP6l&!9p)R<9yS~ן&0Zmw\qžceX,R oa`.2N$n՟m8Xp# 1lDBf0vrؐ$)Hp]1x~g (sI!`ՈҒBs S_ָTD=>^"&$}r,Wrx*0QoT껩(dz!JFA, kKȓjG?W- K%Tj̆:PhJdVE/;'rJO .j: 1İ!5]:sݢsBTdP~عÈ1  d&b3HJfe>TG8Z V,ձdd{ĸa@\%NgئuRzvk1XF5>|.bk|.E2J2;){qY-#|We`YW IEvi2I Q!| _V11R73 IQYd'C;XDӰHEur'Y@-L&B iknj,XsZa͝i9F^k] Ac. bs^(UveF E"yKqmN00l33u G \eƿ|B nSI|DI6S]9a☆?gF4K6>,@}j-' |q:<#S(W >= ŗ6]}yϺ=R晜zVA̳ 6 @iABD:,/l 2OYDFנxk3*iQ}~>uZٳ1,>ձzd[K"Y!-C2І'VfLvq$Q2f@/t>9Q=a m~ynU;34gDxܱ1-~_§䣇Qw≸!ΕpI{q$jj׫ k_V˾!CCYj,]@*fof'tli{߼D6HW(Z  9\]՟q 99y]mg 84HK8ŪvCxl0ϝ,l.3 MvCPǸuז :2m<tptl>YVeѾ\ ˱qSwX?7hZ_Kʔt`"¤BQ`oLh'30Rx ץhxJbטׇN),ZGs;p)ǘ@I|ff*%Ÿ^ D;Q0cLSzF$o<2qR8R2&3,/FLbi.}<[=)S~_TR!VڊP&CԎ> pwZ+hږfN a͎Ӧq K"[?\lw~VZS"Gyv/&lk;RYjy!̑6Y,W #C:)66"8x~ZUKRLD͐qo;\j 2kE&.'Po;7$!?#s> ]79=рKJmY&_" ?i Z;Kf_XiŶZUzG&6hS=/s\ke@ c\zi5jXD|USp.BiG`oUO+c\JJ~nv+Wk %91{=|3/=QL9N#sLz[/Ϭ!XL qe}%$iUกm˛aU ֶϿ@S80l(_CcsXvaaZi ip![ ;eJ-JҼD67o`rYt҄ YmqH4l~x@ CnUe~A0PҦn zkPrBn{o s.R% ,B&%)l udfgD p&t/[mT.)q d)eWu s-I& Mw+ n4.0K}H. AxPx< |dFrBQ1{ebںЂW >; ,6t̡p0mk h3pfmjR kqzˬQ=: !%Os4X!9brͳK#SE}nixpt'bی"A?jb9t\iAZz29%3ޡ$pP>kf󲭞ՋFxKu!^;|!E\ZASFږb94yy6\csGf%ar64n!*8"%ڴcC˗ d-﫧r@&* ni~!E&%c7pfiS[Sf|+$뜧"|_[qEBIƝ<GH0#`L u R=6l'䥨kqQ(-N& :SY<~<~IxؔĞ<X/A]&?IiD(=M+O2++_G kEs%R.8}>R,'H]w lSݍEZlt79h&XKCe zb?̟>(rYc廋Qc cLu5% Q{yrk,9l<*()XI傴6LsvNjnwjy4'!q=[m[qy>L% o->G {U#@fGj;#yT1yx\Nc׏SQnǠI?[o[%㚞{8inb;3oEWm3^rT,h87yBpѬx%Ho̜,6311ʤ2߻턓}C);V #s75TLC3{ZQއ'5aj*uZ#u gOEb8\ԓc"h<Noc|X@?F?FSr M`1SB8%Z >N(@TDznSk 8۪I(Aʑps7Tij da}N u ZAT 5%gXA\AfTzs;[E4_چ2&.DLl:YRs QTo+: s>2`m b61V(ڌWul9G̵9;#Dx/ˇբʍTt>qgaV<~D[]k'TcKlyI3-s(b h9{,KM>5:G`p{N=jB1ch`>f B[?jFyF/ 1s$ 2tj.j@[%8Tm1%*hIA/W 73qvΐ 嚼YO^g(h8lY]q+Q&bs`$gIlVHH څHл{zkMN=QOۿ[<%dmRy2myZLEoE"M3ܶɓwyRta Fj%ȯĤb&"#!@k)8J ; Y1'ᐭ݀@SU(ٰkV-owsiH/[:k x=}vq ¥Vmã?Gޮ6xI6%~-1xj~O b2MP3÷K]73%@y9 ):K[$V"#m[|v.HVih2#E|HN;>C%#s,&|Aa9 LF;Zs f(~.qRaf`<-]|T0V/B㮀4F*Rݜo{sNf (\ y:d\A|:"\,v0%\krؔݿ+k#)CI/Neáby_Ǻw_h~ W!BEc#SYs< TW 'B Mc E\f2 9-@=~Jp(i=:w F- LjC3閷"(Ci,<[p #f*kSiocϚJ:̩铋Xt42]~|湇a}i5ߗZyoM 3a: 1)oý\?Gݘ zH; !s;aP"ƺL֢b|Tbܿn9^YZ*y( omeLr6Xȓljs=D|ZH#ǵ@5BB! 3 ;35phyloseq/inst/extdata/GP_tree_rand_short.newick.gz0000644000175400017540000001601713175714136023461 0ustar00biocbuildbiocbuilde[kd?+  l_CtL αe"%+Ӿ-GOf}^۞Zc/woyv~22׭_n~{?G?Gs'ϗcϘ^Zw~6Z-F~0 bl>[-x?_ٳ5~ vjq_Wq?NIJ[Ȥ_.Nq,k=.~м߆Zn|„ C6@|"bo ~3 3]Qnw.缡I 6ƚ?=cG:p9pl&k|bY2_ 89ńdY4v_/]<' (<w+x?xQ9cn:bDzŻˁ1kOѨ5k9vj٫HFU8B\n23fbD5AtOgh7js,0۲4e B8,މ Aiʖugpov}uK Wac۬?="+!|ڀw֖~ [&@(ri/vj'r bE\^GA7V#&>_,(rCpz᝽q Sp d{V_^A9؄.A׉: R N!ӂ7 佊Yx}K#nqו\hԵܹۈy:-G-22^sl5݀W-\w+rKӱ4~Y#mPI`?SzgV:uX8 hJu!+A7ھGsHy3%81,!#u8@ '"f.H$l:mE+96ܯ0@=]}ptKS[_:؋{I'4I U5"Wh^=Aʣv!1=<|0?.]t2z)H6G?V9g4n٩0"y ,fG |9*$碁|HDWthcԉ![YGljҩ$74Y+C";Z8YNftz@XM,| XಟJN!#&#{r($@P +k8V;8D}JR]r=elO5[cƁ'=yɮ,K8\>] = :ދIĩ A_ʵ:a>' P˭%BLE 5dV7g$>-m[݁i aaf5ʠۘx*~aW&AnP̢ 1W%Pߪ H VD +|diQ BR1x-@&y!bYpb +rEGhCDڽI˷ުOZ<2\tIeFWV`#*PIZ冸.MQL9FA Rx 'Wn+sLk/z¦+ƃI[凘8~&tR2b6**H. DoGSj. βp:s Be m|LӚK.)k=<ǂ6&+QJ BpaJ KKrvqUN.⃂ I9j)x$~28FVXP< 2W֭s*ȟ>Z=VyBW.#pvŷCKI@~fw\T \":Y6Y?>ؒ[gxW>YP?"چt"Fwa(A=w2Gcu0PY ;zc8r U2MtrDzTz]LT +< -Y5*-8J殺%8 uХ$ShJS!%>MzOZgexۣaWvq` ;xPcuE)몆OUy{d񿳱C],:($"y Q9wо Py֕\HHxf( %V|ew-,2[ۅ.iPi$]Wxwp$ȒBn X~QGYie\z#5{H{"#+, @u٘IUß^wV+k?u!uk)%nUn ѽ#!BʮMrkiF_JXC]=Iuvu:!%~+=uWu'Ȯ_õM.UA+G`)3Pqu=|_r]G Zo@^TE|9fҋK H/n@EXW䪜O) X~\L|NI:dC'!ŴϺ OIWjGRrd\"G^j+uY0WFOe^dʵ>O]Þ<*ܜ[h 'eap'{6"z:Wj@lL]M#uRcYR249- HulОăXӰ(. 7J1_Jw;VlJ4\NyjxgS7S2'": )3f% UNWY pqPYT3I,kV^ʄoF=P<|z- V)mӧkA$=Y7JP,E#jQ`Rl nS&˶4g? Gn5QDmu)pH>.h! nz V9\w jptc됵!7Gb1Y4{ŭQ$9 !o]UH2h(Y1")[EYf2@BِYmRRᣞ=+@S ,7z +Qǡd}n*'vx&oR-x.\Nxz£KylA>7t&`HڰUz,#!,)U;񖭙A+JK.( 5ϣ6jQ|UC"g ô"|͔$ČgWRKq䖡kɍB&}sq*OZo=WFn8GY1]VŘ=!eyo^/Vu&S_ >n B1#Z"rU}4?yM] )MZv_ZcH*+6Uϩg{Lx[¹x05h_`%zaKjAYj' ϧjkVUaNyJ3kU#[gm[Qn~r\-Ej)p;"@@+$Fڤ{_wZմ¯d.ȚB ;_\U4O-PT=|kXp-mZ˞㹆\pH@f:2Wj/ CC+^ͭA~kNNG"Idx-G $m<88cQ{$H@'!Q(Uš 50ܚd5O'aa֗xU.@uƕ Osc;ڇ`uZz%Il~ ۖ:g7>꩜P]uثi7] TJ`of0+OTW[\FHq!1azkzӰp>()KZXa5 LjZ댁 ԍ IˇjTh>Ҙ=P+HSU<@ޔ e~P `չVv87S 94Fl8qI^`(6*@'fw BoVմmuG pHhWowp7:>lh^"*w=VrZ4zUz.?grm&'273ߨ4N7HXur$tc, 1 \#=%Iq P=\EN0Y͕|ӘZ%HDG2]s6캠aP͙M_><)~XDV*an8|))eq oVǛ&qT*'&)0~6ܓ]*]%/@ߵK7W.: *rpj`o_a=}7 t ȁ5oktU&ެ..SϽT؃MT(q0UDqǁFvƃ9:$cKҡ@n Ru5`'A*G#oנo1}_.A|_-[Jc^"Qyv3!i؁6)f&QZ{Wh$ls;]K+{ּdwプawwlP6A`l,Ļ>rN%Ɲk_kZaKk$:}XPgٵ`^S^ O+SBV PhUAE?ߍi5O<ξtNjGG_OTU_1 AACGTAGGTCACAAGCGTTGTCCGGAATTACTGGGTGTAAAGGGAGCGCAGGCGGGAAGACAAGTTGGAAGTGAAATCCA TGGGCTCAACCCATGAACTGCTTTCAAAACTGTTTTTCTTGAGTAGTGCAGAGGTAGGCGGAATTCCCCGTGTAGCGGTG AAATGCGTAGAGATGGGGAGGAACACCAGTGGCGAAGGCGGCCTGCTGGGCTTTAACTGACGCTGAGGCACGAAAGCGTG GGTAGCAAACAGGATTAGATACCCTGGTAGTCCACGCTGTAAACGATGATTACTAGGTGTGGGGGTCTGACCCCTTCCGT GCCGGAGTTAACAC >GG_OTU_2 TACGTAGGGAGCAAGCGTTATCCGGATTTATTGGGTGTAAAGGGTGCGTAGACGGGAGAACAAGTTAGTTGTGAAAGCCC TCGGCTTAACTGAGGAACTGCAACTAAAACTATTTTTCTTGAGTGCAGGAGAGGAAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTTCTGGACTGTAACTGACGTTGAGGCACGAAAGTGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACACCGTAAACGATGGATACTAGGTGTAGGAGATGATTTCATCATCT GTGCCGAAAGCAAACGCAATAAGTATCCCACCTGGGGAGTACGGCCGCAAGGTTGAAACTCAAAGGATTGACGGGGCCCG CACAAGCAGTGGAGTATGTGGTTTAATTCGAAGCAACGCGAAGAACCTTACCAGGGCTTGACATA >GG_OTU_3 TACGTAGGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGACGGCATCACAAGTCAGAAGTGAAAAATC CGGGGGCTCCAACCCCGGAACTGCTTTTGAAACTGTGGAGCTGGAGTGCAGGAGAGGTAAGCGGAATTCCTAGTGTAGCG GTAGAAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGCTTACTGGACTGTAACTGACGTTGAGGCTCGAAAGC GTGGGGAGC >GG_OTU_4 TACGTATGGTGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGCAGGCGGTGCGGCAAGTCTGATGTGAAAGCCC GGGGCTCAACCCCGGTACTGCATTGGAAACTGTCGTACTAGAGTGTCGGAGGGGTAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACGATAACTGACGCTGAGGCTCGAAAGCGTG GGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTTGGGAAGCATTGCTTCTCGGT GCCGTCGCAAACGCAGTAAGTATTCCACCTGGGGGATACGTTTCGACAAGAATAGAAACTACAAAAGGAATTAGGACGGG GACCCGCACAAGCGGTGAGCATGTGGTTAATCGAAGCAACGCGAAGAACCTTA >GG_OTU_5 AACGTAGGGTGCAAGCGTTGTCCGGAATTACTGGGTGTAAAGGGAGCGCAGGCGGGAGACAAGTTGGAAGTGAAACCATG GGCTCAACCCATGAATTGCTTTCAAAACTGTTTTTCTTGAGTTAGTGCAGAGGTAGATGGAATTCCCGGTGTAGCGGTGG AATGCGTAGATATCGGGA phyloseq/inst/extdata/biom-tree.phy0000644000175400017540000000021713175714136020470 0ustar00biocbuildbiocbuild(((GG_OTU_1:0.00892,GG_OTU_2:0.01408)1.000.2:0.12196,GG_OTU_3:0.16022)0.995.2:0.01869,(GG_OTU_4:0.08976,GG_OTU_5:0.0665)0.766:0.09714)0.764.3; phyloseq/inst/extdata/esophagus.fn.list.gz0000644000175400017540000001074213175714136022003 0ustar00biocbuildbiocbuildɒ0EAⲆ zћEY-i $,p>TKqJd/M$,Q$ڄ$|Rx\Դ*KTiVږp*4dD&dF,IvYuLqQONvI_-(,aMkk!7ơyT8T+3aZ/&qVU֔, \9 0c֨ Ts3VSsʯZW1IDHYK썲7({dnqj0)AL*\I$D(DmZJSFSF k-ڬj An5d9tYZ9 ʯP5,o/7az*)FvF+t[ McmͲe!ȄȂ$(f1ٍ͂B- [$̟Q$eʀDLȌ )n78_5馚PU5&dɀ,pZfБC2#IIE J}OW*TVJ Fv$ &px tf_J+l:. d B^FюbE b55nI_& e( !L*d1rh9T5 ("jfk.յ.HsR\s蕶/M{Xdz%uWG- xsHCهH,eCew1YC' ּ^g|}şsUs{wIN#iR--<[i LawE'UO }U\:޲jt'6+SzV:agmW̗m&3 x鈸 {WBZw6u>9Be'u4+0u9[]<׈]ƫ|c6U\¹b9З坙! -}0_bHߙzݔ&pk.؏J;kuF}{'51RWy꒙%w7xa@)<쳴8Iq'O5Uv|_C 4i?o>#3{)Nf܃ŗx90fڮ2|:Ӷ|6l~ޱ1n,^"pI 3S Ɣ>"ctB'Aⲋ ' ܣ˔ww9>7+|& ; -G>%<Ǧva0pDs6&peЩi-e w9>2ϵ}ABeypc τ sFj1trAV6͙2r~+,qLKU@ p*l; =YafE ~ wљ}'C77N ϑIFƛنؠ ׬D4|h TD"﮺|gqYC-_`G%z=ӫ?Nl;(?oI1ĩ3T2{H^;Ositlo*G]_Uh.H;ǰ n~^eO\QeF𻤝K"-;s5Hχ|]9>~ а_u~qdԒwKJ'6G5okGx|OmpgR[(}!5wULEfۣdz67C12I7L؈>zՅpatsSC_W~O~syssq+S_#޻}U[n7>bsa].$s3'L^> ++\~O/HlaMĵS;aU=/|ft)ig9^yS:܂K9 q:HPa0Y7w蟽LWdoba3QFrg?䉱0Vd _pw>}$3dgð9oAA}YN˿/׋!Kcm_l«4Ok§}܄&Dg0 ;|*ggށfSǺ!H՗wBX݌oaK5U? ;Rt.`ŗe}! t~y:y\@5`$` ; \p㓟d(ޅ+ǝ`fw_zoT*ptP<Է{Ù p <`2&<0 c?34j/$@_D?x3e-q?' 9./o h4а h948 <Oʆ'}!x2 rc.g?~nl,MlW}켕s}h=m|2z}[{~^ry5X/vEnzݟXtާֆ[t,ކ͋Ɠ\zo0-};Gƈi4/^/Fg妯]t>n8Z:nQK1_ywP5 YA`p/ CX}3@_XzTsSvU1}[BqO s Enܬ|ĺ(mKEFI_\χđL ߆k=-4 i!Hm1pl,#Ʋl,/ڰ_=n*Mhi4Z-&J/rI=ۦMHnԕ.tw(X^G9:{s,XެPm^u~z|Vox~K6kn,9;ql7S޲\n[ﶽe{nm'ep no7{gOD",bXgPם~ oa`:tvK]Br/^z9]+DXpk]ƫ??~%TUj _w`uO"kaZV#c0W=ӸWVL ǥ_y}}\|2Q:q/A R! ~VD#tOw Ɉ!" D>/!E|á}m&jY,04x@fV`#x҄4.7 K.K54gBWf)*G]PTUm=ΤiAZ$[\7Uu8ЅF-+ A$I $1Hb AD16bv;hhA{м&ޘbi&abJ'i ~?y&1Lb0=!1D ZXlQfk"E,X`/nژb)#/w6 q`G}}D Dj50#SFb!FXVÂa0&`M_P+TWƕʾ/ۅ555#Mw$!0e#h`D#tO1ݾ}3XX kk\0ﴅ:jlZ0=tp)#8P T@%P Tr ^Va,uO0v̧Rf)X AAPTf)X ػRR~cÛ6l>}[Mh,Ң,b^YYyMMͲͲMMͫhmX(g4jo5@M&PIܓ1Ayb>\0/s-\Zp-\ ׂk-nmqk[[@/@^jO]?>phyloseq/inst/extdata/esophagus.tree.gz0000644000175400017540000001157513175714136021372 0ustar00biocbuildbiocbuild[ɒ DsW3$ R*/STH,ĢW.15%(~ƕ-ˮgy-_#n8o'4Z0+ /;j;kR h[7r}u/cJƺP_1 (-Hcu'Vl0xY)w_Bw$M 2gPpGv`J b) #2(m8T(x;Y6چ")TgY'f9TJ5/"Y#d`Th*8pR`2vM> ,qMZ LD ]m4 kq# ABRB@lDh8uQN&EA4;Vu x$(a&3O¥T4.sS0nK@T,a3b 0e J!h%WDa*3tϵFbɽXG-G3VE=#^h άa]kM}8m$e Z<ɈUIЌd iOG&pt(K3ViaX]izDud"j3G ZAcj,)GfM9喚qHЩ<,Ruѹ6U5_yDTO{%_+֭6Iƴlz&®**"&Ą<覡T%V #[X " r$:8f:ff`M ZJ+T$XLnD m uNӤ'Y8}}]ODm.@h+4ϯ5/ `٩N- xL h;F2bezsDp8XT#BrӃʾZ~C@uρ}wݞ- {6<^`H|0&LZ .4\p8:nV;*\Y' Ӗ0X@j*r܊<$ʓvZ'uC^Hg*YBA#g Jr2U.3u;Tg>ԙ*у_5y_@\B\F9 )U&P2.wD'FA'n0c7.) b8G ͕ϖ+û2-ا=#'`!%f#c\WVu!Kl9C@2B^6pǘEX%82f\I"B`P,l;SɎBCV# B&hTZZdfU8 ͅ,<`m6hY뉬9$>q3/xys!qi|80\V֣ڠ"|ϋd_eu Vש|d~Pؑ1RXD]بE8֡sRfiBo BjVY\k- D#9X^zVr Np>ibؠER[.Ɯ,QX8I[b¬ tW䲂 m]rW'*y8C M>:gs^mCCRÄYGpO8q&KXz 6:~^2$?$?cyJqͬ|}!7젹GhNO?2D3쐢G3G̥HO6x"$'>}(J-i=;5)ͥQT.\31%]SD##6j!<50VÚ1! ȻV=mQ5Y}W2s}05Z#Q:ccm={!ʛd}Eu镻yzdiY,۶4GL?|QRa`aG[j pJDABs=Hf?T|!ioJТoKݜtI+hDvܚ2聰͝(TahD%%Lns|z7~zEi˅j>Wy4p 緺?Uato̟NJtmx**.|p˩9h]3'do&=X䵱ys**FbKRX=B^s|&↷PH}z5q nӞ|v(NbA J»% 7ln%,š sɩ=j{;%69޷-sܑ=6v)=·XFgS?^.SC.۱uf&:J7]13{+R J#)ˋSe{8DTםu]/ކ)-ͨYr `y;/{k :?`MÜOU0uЇYƒyy_.<Ӵ&;gv;Od~p= V{̳(0ӏDGJBߠF99+y6 φVoT(E]Y2 }ng4bz{?^ktL5UpgPt2~laSkpd#J`<[mܬ7xbuMO;*]3DztLS)# ыs+V)ށKO n&FWAnEN'u>bp55C,95.&eǫCԣ?Ct>C)sv[aw0œf8{rz&/聆yi^|=yα3, lSSc}(qiw1.4?ʹ?L >?Hf.^ 7m IɺS= l#nǂ8z3'U~gHct#x:o.2(l߂T~r3?>*CNs_Aa&"֦7v-ͭ-2zV^Չc]~LXOY?cMqڳ-D) ’Ϗ*ѯ~ !r+d$91c&zpg,w{?Vd4# p4ACJỔ ߈LO JN(%+ ׯ}Dphyloseq/inst/extdata/gg13-5-73.tree.gz0000644000175400017540000000667013175714136020526 0ustar00biocbuildbiocbuildPxQgg_13_5-73_otus.tree][\J<޻5<ن@XF͸aZݣ!}1>ݽw]VZU}uſ*7M9gުRu%m/ҟ?TJim2zi%u;llǕ!>]R.Y5WW'Zf{=h6P9iRNtV}O5ܦ@-o1 ùbwXɾ>ܽ;=/!,aZ=CKSOh}Њcs=^ޟϟ8_c7 a@:jz:(?_"Sr;YjMt-k"4==kf `9N[Cy N(^+BUdB SOpo )Adai+Ӎv .=\_t{ԩprmɻBJxh!pei7MI._ A'6@ư0:KrkT5%\1x{w;佛)xiF^7%yT?<ߝ?:<ó +w>6NBB^'%d{!0S >)"5M+EpP55#lԋK4 iˍ)O`5:p[8N­pܵ >*;Zp#j+,ox-?(aw D/֍A R}"1k絚Fmgl/U3$[(Aŷm5cI}'k qR:Ӧ84.]5 f݋ЦhUDTżػIiO< 34âY@]iBYɂ"TsiRt;sɹ}.Ҧv OnS(D: Tf,fF%hkGfpuM->w/{C-+Β2(Y,ahτ@`#81+S(; `Z9BOͯLJg~U}DWU=GCIX>+Dۜ> z7#ˆ:-VmTC.BN%}n Iy摐tx1 :s"FgXy.{SGF(`)@UׁJ2y E .)uB.PkՄ!Ըt8UuG5AN5TRc"@(zɔ@ivV]]dG-KtHndRkV Cź4mseF S&tYdMpK u?Vb2fT\l#\֊-<{vDfzlU6U.(3Z9cbY>t.~|B 0CSO”9BسHE'RClB)_T#^eop6 &3׳d<6XK%4gv糭UE|WG%/.%΍ǓN6@u< \:Ԡr?wwOEWTFTzE{]^'~YA),h(+ vdMCZXeVYwfrVuitC#EhT鯗 | !Oj\ PlQ0c(wMPf?F:$@qxvCa yՋ.*:@w7~4;dVq.q&UvnnРC\N wgؖtOb{m.SEGe!V5vT%괱PXKT 1<#J'45tőoߔź_b}NLnK}  X`!]Qf"& Mr4;:xnū WΖ=ʬT$. ɝ썇,IoItq,0 7?U-NpBo|ps/lvOh ڑ?R8PE1#0^,>~_ fA p~38'րp8xJZPN_!%Yi?*KmT@4"Pcd9m㍕OpX $h LѰ.Q_fL$^ g Uu8*YJAPQi89cgVGmMϥ ,=u8CotĮ@7Qo`rz?cU(YaYNFxL*hfk^Sԁ싺Q J[Xe]PH/lk^P a[V~y14'#[N啬T6Vq_{>qӈc/ݤѣ^Yr"ÎSi+t>HsH4$Ug9\AwpFt}UDRZ6q>6kLdu}%hlꩈZK phyloseq/inst/extdata/qiime500-refseq.fasta0000644000175400017540000056602413175714136021734 0ustar00biocbuildbiocbuild>153762 TACGGAGGATCCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGGTGGATTGTTAAGTCAGTTGTGAAAGTTT GCGGCTCAACCGTAAAATTGCAGTTGAAACTGGCAGTCTTGAGTACAGTAGAGGTGGGCGGAATTCGTGGTGTAGCGGTG AAATGCTTAGATATCACGAAGAACTCCGACTTAGTCGAAGGA >175045 TACGTAGGGGGCAAGCGTTGTCCGGATTTACTGGGTGTAAAGGGCGTGTAGGCGGGACGGCAAGTCAGATGTGAAATACC GAGGCTCAACTTCGGGGCTGCATTTGAAACTGTCGTTCTTGAGTGATGGAGAGGCAGGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCCTGCTGGACATTAACTGACGCTGAGGCGCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGGTGGGGGACTCGACCCCTCCG TGCCGGAGTTAACACAATAAGTATTCCACCGTGGGGAGTACGGCCGCAAGGTTGAAAC >71074 TACGGAGGATGCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGTGCGTAGGCGGTTGTGTAAGTTAGTGGTCAAATGTC ATGGCTCAACCTTGGCTTGCCATTAAAACTGCACGACTCGAGTACAGACGAGGTAGGCGGAATAAGTTAAGTAGCGGTGA AATGCATAGATATAACTTAGAACTCCGATAGCGAAGGCAGCTTACCAGACTGTAACTGACGCTGATGCACGAGAGCA >525569 TACGTATGGTGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGTGCGTAGGTGGTGAGACAAGTCTGAAGTGAAAATCC GGGGCTTAACCCCGGAACTGCTTTGGAAACTGCCTGACTAGAGTACAGGAGAGGTAAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGACTTACTGGACTGCTACTGACACTGAGGCACGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTCCGGGGCCCAAAGGGGCTTC GGTGCCGCAGCCAACGCAATAAGTACTTCCACCTGGGGATACGTTCGCAAGAAT >557121 TACGTAGGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAAGGGAGCGTAGACGGCGAGGCAAGTCTGATGTGAAAACC CGGGGCTCAACCCCGTGACTGCATTGGAAACTGTTTTGCTTGAGTACCGGAGAGGTAAGCGGAATTCCTAGTGTAGCGGT GAAATGCGTAGATATTAGGAGGAACATCAGTGGCGAAGGCGGCTTACTGGACTGAAACTGACACTGAGGCACGAAAGCGG TGGGGA >560734 TACGTATGGTGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGTGCGTAGGTGGCAAGGCAAGTCTGAAGTGAAAAATC CGGGGCTCAACCCCCGGAACTGCCTTTGGAAACTGTTTAGCTGGAGTACAGGAGAGGTAAGTGGAATTCCTAGTGTAGCG GTGAAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGACTTACTGGACTGCTACTGACACTGAGGCACGAAAGC GGTGGGGGAGCGAAAACAGGATTAGATACCCTGGTACGTCCACGCCGTAAAACGATGAATACTAGGTGTTGGGTTCCAAA GGAACTCGGTGCCGTCGCAAACGCATTAAGTATTCCACCTGGGGAGTACGTTCGCAAGATGAAACTCAAAGGATG >341901 TACGTAGGGGGCAAGCGTTATCCGGAATTACTGGGTGTAAAGGGTGCGTAGGTGGCATGGTAAGTCAGAAGTGAAAGCCC GGGGCTTAACCCCGGGACTGCTTTTGAAACTGTCATGCTGGAGTGCAGGAGAGGTAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACTGTCACTGACACTGATGCACGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTCGGGGCCGTAGAGGCTTCGG TGCCGCAGCAAACGCAGTAAGTATTCCACCGTGGGGA >286030 TACGTAGGTGGCAAGCGTTGTCCGGAATTACTGGGTGTAAAGGGAGCGTAGGCGGGCAGGCAAGTCAGGCGTGAAATATA TCGGCTCAACCGGTAACGGCGCTTGAAACTGCAGGTCTTGAGTGAAGTAGAGGTTGGCGGAATTCCTAGTGTAGCGGTGA AATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCCAACTGGGCTTTTACTGACGCTGAGGCTCGAAAGTGTGG GGAGCAAACAGGATTAGATACCCTGGTAGTCCACACAGTAAACGATGAATACTCGCTGTTTGCGATATACAGTAAGCGGC CAAGCGAAAGCGTTAAGTATTCCACCTGGGGAGTACGCCGGCAACGGTGAAACTCAAAGGAATTGACGGGGGCCCGCACA AGCGGAGGAACATGTGGTTTAATTCGATGATACGCGAGGAACCCTTACCGGGCTTGAATTGCAACTGAATGATGTGGAGA CATGTCAGCCGCAAGGC >275402 TACGGAGGATCCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGGCGGACGCTTAAGTCAGTTGTGAAAGTTT GCGGCTCAACCGTAAAATTGCAGTTGATACTGGGTGTCTTGAGTACAGTAGAGGCAGGCGGAATTCGTGGTGTAGCGGTG AAATGCTTAGATATCACGAAGAACTCCGATTGCGAAGGCAGCCTGCTGGACTGTAACTGACGCTGATGCTCGAAAGTGTG GGTATCAAACAGGATTAGATACCCTGGTAGTCCACACAGTAAACGATGAATACTCGCTGTTTGCGATATACAGTAAGCGG CCAAGCGAAAGCGTTAAGTATTCCACCTGGGGAGTACGCCGGCAACGGTGAAACTCAAAGGATTGACGGGGCCCGCGACA AGCGGAGGAACAGTGTGGTTTAATTCGATGATACGGCGAGGAACCCTTACCCGGGCTTTAGGAACTTGCAACTGAATTGA TGTGGA >321069 TACGTAGGTGGCAAGCGTTATCCGGAATTACTGGGCGTAAAGAGTGAGCAGGCGGTTAGATAAGTCTATGGTTAAATGCA ACAGCCCCAATGTTGTTCGCTATAGAAACTTATTTAACTAGAGTGCGGGAGAGGTAAGTGGAACTCCATATGTAGCGGTG GAATGCTTAGATATAGTAGGAA >161544 TACGTAGGTGGCAAGCGTTGTCCGGAATTTACTGGGTGTAAAGGGAGCGTAGGCGGGCAGGCAAGTCAAGGCGTGAAATA TATCGGACTCAACCGGTAACGCGCTTTGAAACTGCAGGTCTTGAGTGAAGTAGAGGTTGGCGGAATTCCTAGTGTAGCGG TGAAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCCAATTGGGCTTTTACTGACGCTGA >215003 TACCTCCGTATGCGTCGATGTGGTTATCCTTGAGCATTGCCGCGTCTGTAAGGTTGTAGCGGTGGTTGCGGCCTCCGCCG ACCGTTACCGCGTACTTCTGGAGAGGGCGCAGTCCCGGGAGAGTCTTGCGGGTATCCGCAATGCTGGCGTTGGTTCCCTT CACAAGCTCGACGCACTTGTTGGTGTAGCTCGAAATTCCGCTCATGTGCTGGAGCAGATTCAGAGATGTGCGCTCAGCTT TCAGCATGAGGCGGGTGTGTCCGGTGAATTCCGCGATGATATCGCCGTACTTCACCTTGTCGCCGTCCTTGAAGCGGCAC TCGATCTTCATTTCCGGGTCGAGTATCGTGAATACCCGCAGCGCTACTTCGAGTC >548077 TACGTAGGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGACGGCGAGACAAGTCTGAAGTGAAAGCCC GGGGCTCAACCCCGGGACTGCTTTGGAAACTGCCTTGCTAGAGTGCTGGAGAGGTAAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACAGTAACTGACGTTGAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCGGTAAACGATGGATGCTCGCTGTTTGCGTCTGACGTAAGCGGC CAAGCGAAAGCGTTAAGCATCCCACCTGGGGAGTACGCCGGCAACGGTGAAACTCAAAGGAATTGACGGGGCCCGCACAA GCGGAGGAACATGTGGTTTAATTCGATGATACGCGAGGAACCTTACCCGGGCTTGAACTGCAGGCGAACGATTCAGAGAT GATGAGGCCCTTCGGGCGCCTGTGGAGGTGCTGCA >257176 TACGTAGGTGGCAAGCGTTGTCCGGATTTACTGGGTGTAAAGGGCGTGCAGCCGGGAATGCAAGTCAGATGTGAAATCCA TGGGCTTAACCCATGAACTGCATTTGAAACTGTATTTCTTGAGTACTGGAGAGGCAATCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGATTGCTGGACAGCAACTGACGGTGAGGCGCGAAAGTGTG GGGGAGCAAACAGGATTAGATACCCTGGTAGTCCACACTGTAAACGATGAATACTAGGTGTGCGGGACTGACCCCCTGCG TGCCGCAGTTAACACAATAAGTA >100157 AACGTAGGGTGGCAAGCGTTGTCCGGAATTACTGGGTGTAAAGGGAGCGCAGGCGGGAAGACAAGTTGGAAGTGAAAACC ATGGGACTCGAACCCATACGAATTGCTTTCAAAACTGTTTTCTGAGTAGTGCAGAGGTAGATGGAATTCCCGGTGTAGCG GTGGAATGCGTAGATATCGGGAGGAACACC >576085 TACGGAGGATCCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGGTGGATTGTTAAGTCAGTTGTGAAAGTTT GCGGCTCAACCGTAAAATTGCAGTTGAAACTGGCAGTCTTGAGTTACAGTAGAGGTGGGCGGAATTCGGTGGTGTTAGCG GTGAAATGGCTTAAGATATCACGAAGAACTCCGATTGCGAAGGCAGCTCACTAGACT >100757 TACGTATGGTGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGCAGGCGGTACGGCAAGTCTGATGTGAAATCCC GGGGCTCAACCCCGGTACTGCATTGGAAACTGTCGGACTAGAGTGTCGGAGGGGTAAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACGATTACTGACGCTGAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTCGGGGAGCATTGCTCTTCGG TGCCGCAGCAAACGCAATAAGTATTCCACCTGGGAGTACGTTCGCAAGAATGAAACTCAAAGGAATTGACGGGGATCCGG CACAAGCGGTGGAGCATGTGGTTTAATTCGAAGCAACGCGAAGAACCCTTACCAAGTCTTAGACATCCCACTGACCAAGT ATAGTAATGTTACTTTC >91919 TACGTAGGTGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGTGTGTAGGCGGGACTGCAAGTCAGATGTGAAAATCA TGGGCTCAACTCATGACCTGCATTTGAAACTGTGGTTCTTGAGAGTCGGAGGGGTAATCGGAATTCCCGGTGTAGCGGTG AAATGCGTAGATATCGGGAGGAACACCAGTGGCGAAGGCGGATTACTGGACGACCACTGACGCTGAGACACGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCTGTAAACGATGAATGCTAGGTGTGGGTGCGATAGCATCCGTGC CGCAGTTAACACAATAAGCATTCCACCTGGGGATACGGCCGCAAGGTTGAAACTCAAAGGAATTGACGGGACCCGCACAA GCGGTGGAGCATGTGGTTTAATTCGAAGCAACGCGAAGAACCTTACCAAGTCTTGACATCCCCCTGACAGAGTATGTAAT GTACTTTTCCTTCGGG >89337 TACGTAGGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGACGGCTGTGTAAGTCTGATGTGAAAGATC GGGGCTCAACCCCGGGCCTGCATTGGAAACTGTGCAGCTAGAGTGTCGGAGAGGTAAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACGATGACTGACGTTGAGGCTCGAAAGCGTG GGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGACTGCTAGGTGTCGGGAGGCAAAGCCTTTCGGT GCCGCAGCAAACGCAATAAGCAGTCCACCTGGGGAGTACGTTCGCAAGAATGAACTCAAAGGATTGACGGGGACCCGCAC AAGCGGTGGAGCATGTGGTTAATTCGAAGCAACGCGAAGACCTTACTGCCTCGACATCCGGATGACGCAGGT >542118 TACGTATGGAGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGTGTAGGTGGCCAGGCAAGTCAGAAGTGAAAGCCC GGGGCTCAACCCCGGGACTGCTTTTGAAACTGCAGGGCTAGAGTGCAGGAGGGGCAAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTGCTGGACTGTAACTGACACTGAGGCTCGAAAGCGTG GGAGCAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGTGTCGGGGCACATAAGTGCTCCGGTG CCGCAGCAAACGCAATAAGTATTCCACCTGGGGAGTACGTTCGCAAGATGAACTCAAAGGATTGACGGGGACCGCACAAG CGGTGGAGCATGTGTTAATTCGAAGCAACGCG >265094 TACGGAGGATGCGAGCGTTATCCGGTATTTATTGGGTTTAAAGGGTGCGTAGGCGGACTGTCAAGTCAGACGGTAAAAGT ACGGGGCTCAACCTCCGCCCGCCGTTGAAACTGACGGTCTTGAGTGGGCGAGAAGTATGCGGAATGCGTGGTGTAGCGGT AGAAATGCATAGATA >128051 TACGTAGGGAGCAAGCGTTATCCGGATTTTATTGGGGTGTAAAGGGTGCGTAGACGGGAAATTAAGTTAGTTGTGAAATC CCTCGGCTTAACTGAAGGAACTGCAACTAAAACTGATTTTCTTGAGTGCTGGAGAGGAAAGTGGAATTCCTAGTGTAGCG GTGAAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGACTTCTGGACAGTAACTGACGTTGAGGCACGAAAGTG T >23870 GGACCACCGTACCAACTTCCAGACCAGTGATGTGAATGGTGTGATGGATGGAAAGATAGACGGCTTTATCAAAGCTTACC TGATGGAGTTTGCAGGAAGTGGCGAATAAATTTTCTCCCTTTCATTTGCATTCTTCCCGAATTTCTTCTTACTTTGTTCA TCGTTGAACTTTAAACTATAAAACACACCATGGGAAAAAGTAAAAGAAAGCAATGCACAGCCAGAAGGAAGAGCAACAAG CCAAGAAAGTGATGATGACGATGGGAGTAATAGCCATTGTATTGGTCATCGCCATGTTTGTGGCTTACTCTTACTGGGGC TGATAAAATCACTGGAAACGACATGCCGCAGGAGATAGAACGGAAATTCCTCGTGACGGGAGAATACAAGCCACAAGCGT A >160135 TACGTAGGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGACGGCGATGCAAGTCTGAAGTGAAATACC CGGGCTCAACCTGGGAACTGCTTTGGAAACTGTATGGCTAGAGTGCTGGAGAGGTAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAAGAACACCAGTGGCGAAGGCGGCTTACTGGACAGTAACTGACGTTCAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTCGGGGGCAAAGTCTTTCGGT GCCGCCGCAAACGCAATAAGTATTCCACCTGGGGAGTACGTTCGCAAGAATGAAACTCAAAGGAATTGACGGGGACCCGC ACAAGCGGTGGAGGCATGTGGTTAATTCGAAGCAACGCGAAGAACCTTACCAAATCTTGACATCCCTCTGAAACACTCTT AAATCGAGTGCCTCCTTCGGGACAGAGGAGACAGGTGGTGCAGTGG >574226 TACGTAGGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGACGGTTTTGCAAGTCTGAAGTGAAAGCCC GGGGCTTAACCCCGGGACTGCTTTGGAAACTGTAGGACTAGAGTGCAGGAGAGGTAAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACTGTAACTGACGTTGAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTCGGGGCTCATAAGAGCTTCG GTGCCGCAGCAAACGCAATAAGTATTCCACCTGGGGAGTACGTTCGCAAGAATGAAACTCAAAGGATTGACGGGGACCGC ACAAGCGGTGGAGCATGTGGTTTAATTCGAAGCAAACGCGAAGAACCTTACCAGGTACTTGACATCCTCCTGAACGGAAG GTAATGCTTCCGGTCCTTCGGGACAGGAGAGAC >329744 TACGGAGGATGCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGCAGACGGGAGATTAAGTCAGTTGTGAAAGTTT GCGGCTCAACCGTAAAATTGCAGTTGATACTGGTTTCCTTGAGTGCAGTTGAGGCAGGCGGAATTCGTGGTGTAGCGGTG AAATGCTTAGATATCACGAAGAACTCCGATTGCGAAGGCAGCTCACTGGAGCGCAACTGACGCTGAAGCTCGAAAGTGCG GGTATCGAACAGGATTAGATACCCTGGTAGTCCGCACGGTAAACGATGGATGCCCGCTGTTGGTCTGAATAGGGTCAGCG GCCAAGCGAAAGCATTAAGCAT >160337 TACGTAGGTGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGTGTGTAGGCGGGACGACAAGTCAGATGTGAAACTCA TGGGCTCAACCCATGACCTGCATTTGAAACTGCCGTTCTTGAGAGTCAGAGAGGTAAATGGAATTCCCGGTGTAGCGGTG AAATGCGTAGATATCGGGAGGAACACCAGTGGCGAAGGCGATTTACTGGACGACCACTGACGCTGAGACACGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATGCTAGGTGTAGGGGCATTAAGCTTCTGTG CCGCAGTTAACACAATAAGCATTCCACCTGGGGAGTACGGCCGCAAGGTTGAAACTCAAAGGAATTGACGGGAGCCCGCA CAAGCAGTGGAGTATGTGGTTTATTCGACGCAACGCGAAGACCTTACAGTCTGCATCCTGAGAACCCGGCG >104310 TGTTTCCCGATGATGGCGTCCGGACGCTGAGAGGGGAGGAGCTGCGGTTCTCCTACCGTCACAGCCTGCTGACAGACCGG CCGGAGGCAGTGGTACTCCGGGTCGTGTTTCAACTGACGGCGGGAAGGCCGGAGGAGATACGGCAGAAAATGGAAGAATT GATGACAAGGAGAAAGGCTTCACAGCCATTGGAATATCCAAGTGCGGGCAGTACATTCAAGCGACCGGAGGGCTATTTCG CCGC >253651 AACGTAGGTCACAAGCGTTGTCCGGAATTACTGGGTGTAAAGGGAGCGCAGGCGGGCGATCAAGTTGGAAGTGAAATCCA TGGGCTCAACCCATGAACTGCTTTCAAAACTGATTGTCTTGAGTAGTGCAGAGGTAGGCGGAATTCCCGGTGTAGCGGTG GAATGCGTAGATATCGGGAGGAACACCAGTGGCGAAGGCGGCCTACTGGGCACCAACTGACGCTGGAGCTACGAAGTGTG GTAGACAACGAGGTATTAGACTACCCGTGGTACGT >76142 TACGGAGGATGCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGCAGACGGGAGATTAAGTCAGTTGTGAAAGTTT GCGGCTCAAACCGTAAAAATTGCAGTTGATACTGGTTTCCTTGAGTGCAGTTGAGGCAGGCGGAATTCGTGGTGTAGCGG TGGAATGCTTAG >144921 CAGCGCATTCAAGGACGGAAGGATGCGTCATCAATGCGCTTTCGACCTCAAACGGCCCTATACGATAACCGGAGCATTTG ATAACGTCGTCACTTCTTCCGACAAACCAATAATATCCGTCAGAATCGCGCCACGCCGTATCACCTGTGTCATAACAACC GCATCGAAACGCAGACGCATTAGCATCGACGTCACCGA >349277 TACGTATGGAGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGTGTAGGTGGCCATGCAAGTCAGAAGTGAAAATCC GGGGCTCAACCCCGGAACTGCTTTTGAAACTGTGAGGCTGGAGTGCAGGAGGGGTGAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTCACTGGACTGTAACTGACACTGAGGCTCGAAAGCGTG GGAGCAACAGGATTAGATACCCTAGTAGTCCACGCCGTAAACGATGAGTACTAAGTGTTGGGAGTCAAATCTCAGTGCTG CAGTTAACGCAATAAGTACTCCGCCTGAGTAGTACGTTCGCAAGAATGAAACTCAAAGGAATTGACGGGGCCCGCACAAG CGGTGGAGCATGTGGTTAATTCGAAGCAACGCGAAGAACCTTACCAGGTCTTGACATCGATCTAAAGGCTCCAGAGATGG AGAGATAGCT >152720 TACGTAGGTGGCAAGCGTTATCCGGAATTACTGGGTGTAAAGGGTGTGTAGGCGGGGAGGCAAGTCAGATGTGAAAATTA TGGGCTTAACCCATAACCTGCATTTGAAACTGTTTTTCTTGAGAGGCGGAGAGGTAAACGGAATTCCCAGTGTAGCGGTG AAATGCGTAGATATTGGGAGGAACACCAGTGGCGAAGGCGGTTTACTGGACGTCAACTGACGCTGAGACACGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATGCTAGGTGTAGGGCAGGATACTGTTCTGT GCCGCAGTTAACACAATAAGCATTCCACCTGGGAGTACGGCCGCAAGGTTGAAACTCAAAGGAATTGACGGGA >218035 TACGTAGGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGACGGCAAGGCAAGTCTGGGATGGTGAAAG GCTGGGGCTCAACCCCGGGACTGCATTGGAAACTGTCCTGCTAGAGTGCCGGAGAGGTAAGCGGAATTCCTAGTGTAGCG GTGAAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACGGTAACTGACGTTGAGGCTCGAAAGC GTGGGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCGGTAAACGATGGATACTAGGTGTTGGGTGTCACAGACATT CGGTGCCGCAGCAAACGCAATAAGTATTCCACCAGGGGAGTACGTTCGCAAGAATGAAACTCAAAGGAATTGACGGGGAC CCGCACAAGCGGTGGAGCATGTGGTTTAATTCGAAGCAACGCGAAGAACCTTACCAAGTCTTGACATCCCCCTGACAGAG TATGTAATGTACTTTTCTTCGGGACAGGGGAGACAGGTGGTGC >29284 TACGGAGGATCCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGGCGGACGCTTAAGTCAGTTGTGAAAGTTT GCGGCTCAACCGTAAAATTGCAGTTGATACTGGGTGTCTTGAGTACAGTAGAGGCAGGCGGAATTCGTGGTGTAGCGGTG AAATGCTTAGATATCACGAGAACTCCGATTGCGAAGGCAGCTTGCTGGACTGTAACTGACGCT >588981 TACGTAGGTTGCAAGCGTTGTCCGGATTTACTGGGTGTAAAGGGCGTGTAGGCGGAGATGCAAGTTGGGAAGTTGAAATC CATGGGTCTCAACCCATGAACTGCTCTCAAAACTTGTATCCCTTGAGTATCGGAGAGGCAAGCGGAATTCCTAGTGTAGC GGTGAAATGCGTAGATAGTTA >12364 TACGTATGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGGCGGCATGGCAAGTCAGAAGTGAAAGCCT GGGGCTCAACCCCGGAATTGCTTTTGAAACTGTCAGGCTAGAGTGTCGGAGGGTAAGCGGAATTCCTAGTGTAGCGGTGA AATGCGTAGATATTAGGAGGAACACCGGTGGCGAAGGCGGCTTACTGGACGATTACTGACGCTGAGGCTCGAAAGCGTGG GGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTCGGGAACAATAGTTCTTCGGT GCCGCAGCTAACGCATTAAGTATTCCACCTGGGGAGTACGTTCGCAAGAATGAAACTCAAAGGATTGACGGGGACCCGCA CAAGCGTGGAGCATGTAGGTTTATTCGACGCAACGCGAAGAACCTTACTGCTCTGACATCCCACTGACCGGTCGTAATGC GTACCTTTTCTTACGGAACTAGTGGACGACAGGTCGGTGC >139920 TACGTAGGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGACGGCATCACAAGTCAGAAGTGAAAATCC GGGGCTCAACCCCGGAACTGCTTTTGAAACTGTGGAGCTGGAGTGCAGGAGAGGTAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAAGAACACCAGTGGCGAAGGCGGCTTACTGGACAGTAACTGACGTTGAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTTGGTGAGCAAAGCTCATCGG TGCCGCCGCAAACGCAATAAGTATTCCACCTGGGGAGTACGTTCGCAAGAATGAAACTCAAAGGATTGACGGGGACCCGC ACAAGCGGTGGAGCATGTGGTTTAATTCGAAGCAACGCGAAGAACCTTAACCAAATCTTGACATCCCTCTAGAAAAGTCC TTTAATCGGGCTCCTCCTTCGGGACAGAGGT >26061 TACGTAGGGAGCGAGCGTTGTCCGGAATTACTGGGCGTAAAGGGCGCGTAGGCGGGGACTTAAGTTAGGTGTGAAAACTT CGGGCTTAACCTGAAGACTGCACTTAAAACTGGGTTTCTTGAGGGCAGGAGAGGAAAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGACTTTCTGGACTGTACCTGACGCTGAGGCGCGAAAGCATG GGGAGCGAACAGGATTAGATACCCTGGTAGTCCATGCCGTAAACGATGAATACTAGGTGTAGGAGGTATCGACCCCTTCT GTGCCGCAGCTAACGCAATAAGTATTCCGCCTGGGGAGTACGGCCGCAAGGTTGAAACTCAAAGGAATTGACGGGGACCC GCACAAGCGGTGGAGCATGTGGTTTAATTCGACGCTACGCGAAGAACCTTACCAGGGCTTGACATCCCGCGCTATCCCAG GAAACTGGGAGTTCCGAGCTTCGGTTTGGACGCGGTGACAGGTGGTGCAT >471141 TACGGAGGATCCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGATGGATGTTTAAGTCAGTTGTGAAAGTTT GCGGCTCAACCGTAAAATTGCAGTTGATACTGGATGTCTTGAGTGCAGTTGAGGCAGGCGGAATTCGTGGTGTAGCGGTG AAATGCTTAGATATCACGAAGAACTCCGATTGCGAAGGCAGCCTGCTAAGCTGCAACTGACATTGAGGCTCGAAAGTGTG GGTATCAAACAGGATTAGATACCCTGGTAGTCCACACGGTAAACGATGAATACTCGCTGTTTGCGATATACGGCAAGCGG CCAAGTGAAAGCGTTAAGACTTCCACCGTGGGGATACGCCGGCAACGGTGAACTCAAAGGAATTGGACGGGGCCGCACAG CGGAGACATGTGGTTAATCGATGATACG >261709 AGGGCGCAGACCTTTCTGACAGGATCATAGAAGAAAGAGGCGTGCAGTCTGCATAATTCATGGTAAGCGGCACATCAGAA GAAGGAGTAATGAGACCGTCCGTATCGGGAATAGCCGTATCAAGGGAAAAGCGCCACGGCCCCGGTCCTCTTCTGAAACC TCCTCGATATGAGTACCATGTACCTGCCGGCAGTTGATAAGCAGCCCTTCATCCAAACCCAGGACCCGGCAGTACCGCTT CCGGTTCTCCAGCACATCCTCTACCCGGTCCCCACATGAAGCCCCATGTTCAAACTGGTAAAAGGAGGTC >320879 TACGGAGGATCCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGGCGGACTATTAAGTCAGCTGTGAAAGTTT GCGGCTCAACCGTAAAATTGCAGTTGATACTGGTCGTCTTGAGTGCAGTAGAGGTAGGCGGAATTCGTGGTGTAGCGGTG AAATGCTTAGATATCACGAAGAACTCCGATTGCGAAGGCAGCTTACTGGACTGTAACTGACGCTGATGCTCGAAAGTGTG GGTATCAAACAGGATTAGATACCCTGGTAGTCCACACAGTAAACGATGAATACTCGCTGTTTGCGATATACAGCAAGCGG CCAAGCGAAAGCATTAAGTATTCCACCTGGGAGTACGCCGGCAACGGTGAAACTCAAAGGAATTGACGGGGCCGCACAAG CGGAGGAACATGTGGTTTAATTCGATGATACGCGAGGAACCTTACCCGGGCTTAAAGTTGACAAATGAATATAGT >503327 TACGTAGGGAGCAAGCGTTATCCGGATTTATTGGGTGTAAAGGGTGCGTAGACGGGACAACAAGTTAGTTGTGAAATCCC TCGGCTTAACTGAGGAACTGCAACTAAAACTATTATTCTTGAGTGTTGGAGAGGAAAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGAACACCGGTGGCGAAGGCGACTTTTCTGGACAATGACTGACGTTGAGGCAACG >261774 TACGGAGGATCCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGTGCGTAGGCGGCCTTTTAAGTCAGCGGTGAAAGTCT GTGGCTCAACCATAGAATTGCCGTTGAAACTGGGGGGCTTTGAGTATGTTTGAGGCAGGCGGAATGCGTGGTGTAGCGGT GAAATGCATAGATATCACGCAGAACCCGACTTGCGAAGGCAGCCTGCCAAGCCATTACTGACGCTGATGCACGAAAGACG TGGGGAGTCAAACCAGGATTAGATACCCTGGTAGTCCACGCAGTAAACGATGATCACTACGCTGTTTGCGATACATTGT >13333 TACGTAGGTGGCAAGCGTTGTCCGGATTTACTGGGTGTAAAGGGCGTGTAGCCGGAGAGACAAGTCAGATGTGAAATCCG CGGGCTCAACTCGCGAACTGCATTTGAAACTGTTTCCCTTGAGTATCGGAGAGGTAACCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAAGAACACCAGTGGCGAAGGCGGGTTACTGGACGACAACTGACGGTGAGGCGCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCTGTAAACGATCAATACTAGGTGTGCGGGGACTGGACCCCTGCC GTGCCGCAGTTAACACAATAAGTATTGCACCTGGGGAGTACGATCGCAAGGTTGAAACTCAAAGGAATTGACGGGGGCCC GCACAAGCGGTGGATTAATGTGGTTTAATTCGAAGCAACGCGAAGAACCTTACCAGGCTTGACATCCTACTAACGAAGTA GA >13069 TACGTAGGGAGCAAGCGTTGTCCGGAATTACTGGGTGTAAAGGGAGTGTAGGCGGGTCTCCAAGTCCGTTGTCAAATCTA TCGGCTCAACCGATAGCCCGCGGCGGAAACTGGAGGTCTTGAGTGAAGTAGAGGCAGGCGAATTCCTAGTGTAGCGGTAG AAATGCGTAGATATTAGGA >203691 TACGGAGGATCCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGATGGATGTTTACGTCAGTTGTGAAAGTTT GCGGCTCAACCGTAAAATTGCAGTTGATACTGGATATCTTGAGTGCAGTTGAGGCAGGCGGAATTCGTGGTGTAGCGGTG AAATGCTTAGATATCACGAAGAACTCCGATTGCGAAGGCAGCTCACTAGACTGTTACTGACACTGATGCTCGAAAGTGTG GGTATCAAACAGGATTAGATACCCTGGTAGTCCACACAGTAAACGATGAATACTCGCTGTTTGCGATATACAGTAAGCGG CCAAGCGAAAGCATTAAGTATTCCCACCTGGGGATACGCCGGCAACGGTGAAACTCAAAGGAATTGACGGGGGCCCGCAC AAGCGGAGGAACATGTGGTTTAATTCGATGATACGCGAGGAACCTTA >292521 TACGTAGGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGATGGCATGGCAAGTCTGAAGTGAAAGCCC GGGGCTTAACCCCGGGACTGCTTTGGAAACTGTTAAGCTAGAGTGCAGGAGAGGTAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCGGTGGCGAAGGCGGCTTACTGGACTGTAACTGACATTGAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTAGGGGTTGTCATGACCTCTG TGCCGCCGCTAACGCATTAAGTATTCCGCCTGGGGATACGGTCGCAAGATTAAAACTCAAAGGAATTGACGGGGGCCCGC ACAAGCAGCGGAGCATGTGGTTTAATTCGAAGCAACGCGAAGAACCTTACCTAGACTTGACATCTCCTGCATTACTCTTA ATCGAGGAA >201720 TACGGTAGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGTACGGCATCACAAGTTAGAAAGTGGAAAA TCCCGGGGCTCAACCCCGGAACTGCTTTTGAAACTGTGGAGCTGGAGTGCAGGAGAGGTAAGCGGAATTCCTAGTGTAGC GGTGAAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACTGTAACTGACGTTGAGGCTCGAAAG CGTGGGGAGCAAACAGGATTAGATACCCTGGTAAGTCCACGCCGTAAACGATGAATAC >72610 TACGTAGGTGGCAAGCGTTGTCCGGATTTACTGGGTGTAAAGGGCGTGTAGGCGGAGATGCAAGTCAGAAGTGAAATCCA TGGGCTTAACCCATGAAACTACGTTTTGTAAACTGTATCCCTTGAGTATCGGAGAGGCAGGCGGAATTCCTAGTGTAGCG GTGAAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCCTGCTGGACGACAAC >90465 TACGTAGGGGGCGAGCGTTATCCGGAATTATTGGGCGTAAAGAGTGCGTAGGTGGCACCTTAAGCGCAGGGTTTAAGGCA ATGGCTCAACCATTGTTCGCCTTGCGAACTGGGGTGCTTGAGTGCAGGAGGGGAAAGTGGAATTCCTAGTGTAGCGGTGA AATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGTACTTTCTGGACTGTTACTGACACTGAGGCACGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAAC >10517 TACGTATGGTGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGCAGGCGGTGCGGCAAGTCTGATGTGAAAGCCC GGGGCTCAACCCCGGTACTGCATTGGAAACTGTCGTACTAGAGTGTCGGAGGGGTAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGGTATTAGGTAGGGAACACCACGTGGCGAAGGACGGCGTTACTGGACGGATAACT >23777 AACGTAGGTCACAAGCGTTGTCCGGAATTACTGGGTGTAAAGGGAGCGCAGGCGGGAAGACAAGTTGGAAGTGAAATCCA TGGGCTCAACCCATGAACTGCTTTCAAAACTGTTTTTCTTGAGTAGTGCAGAGGTAGGCGGAATTCCCGGTGTAGCGGTG GAATGCGTAGATATCGGGAGGAACACCAGTGGCGAAGGCGGCCTACTGGGCACCAACTGACGCTGAGGCTCGAAAGTGTG GGTAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGGATACTAGGTGTAGGAGGTATCGACCCCTCCT GTGCCGGAGTTAACGCAATAAGTATCCCGCCTGGGAAGTACGATCGCAAGATTAAAACTCAAAGGAATTGACGGGGCCCG CACAAGCGGTGGAGTATGTGGTTTAATTCGACGCAACGCGAAGAACCTTACCAGGTCTT >576850 TACGGAAGATGCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGGCGGGCTTTTTAAGTCAGCGGTCAAAATG TCGTGGCTCAACCATGTCAAGCCGTTGAAACTGTAAGCCTTGAGTCTGCACAGGGCACATGGAAATTCGTGGTGTAGCGG TGAAATGCTTAGATATCACGAAGAACTCCGATCGCGAAGGCATTGTGCCGGGGCATAACTGACGCTGAGGCTCGAAAAGG TGCGGGTAATCGAAACAGGATTACGATACCCTGGTAGTCCGACACGGT >531589 TACGTAGGTGGCGAGCGTTATCCGGAATCATTGGGCGTAAAGAGGGAGCAGGCGGCCGCAAGGGTCTGTGGTGAAAGACC GAAGCTAAACTTCGGTAAGCCATGGAAACCGGGCGGCTGGAGTGCGGAAGAGGATCGTGGAATTCCATGTGTAGCGGTGA AATGCGTAGATATATGGAGGAACACCAGTGGCGAAGGCGACGGTCTGGGCCGCAACTGACGCTCATTCCCGAAAGCGTGG GGAGCAAATAGGATTAGATACCTTAGTAGTCCACGCCGTAAACGATGGTCACTAAGTGGTCGGGGGTACAAACCCCGGTG CTGCAGTCAACGCAATAGTGACCCGCCTGAGTAGTACGTTCGCAAGAAGTGAAACTACGAAAGGAATTAGGACCGGGGGG CCCCGACAACGAA >272602 TACGTATGGTGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGCAGGCGGTACGGCAAGTCTGATGTGAAATCCC GGGGCTCAACCCCGGTACTGCATTGGAAACTGTCGGACTAGAGTGTCGGAGGGGTAAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACGATTACTGGCGCTGAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTCGGGGAGCATTGCCTTCGTG CCGCAGCAACGACAATAAGTAATTCCACCTCGGGGAGGTACGTTCGGTCAAGAATGAAACTACAAAGGAATTAGACGGGG ACCCGG >568172 TACGTAGGTGGCAAGCGTTGTCCGGATTTACTGGGTGTAAAGGGCGTGCAGCCGGGCATGCAAGTCAGATGTGAAATCTC AGGGCTTAACCCTGAAACTGCATTTGAAACTGTATGTCTTGAGTGCCGGAGAGGTAATCGGAATTCCTTGTGTAGCGGTG AAATGCGTAGATATAAGGAAGAACACCAGTGGCGAAGGCGGATTACTGGACGGTAACTGACGGTGAGGCGCGAAAGCGTG GGGAGCGAACAGGATTAGATACCCTGGTAGTCCACGCTGTAAACGATGGATACTAGGTGTGCGGGGACTGACCCCCTGCG TGCCGCAGTTAACACAATAAGTATCCCACCTGGGGAGTACGATCGCAAGGTTGAAACTCAAAGGAATTGACGGGGGCCCG CACAAGCGGTGGATTATGTGGTTTAATTCGAAGCAACGCGAAGAACCTTACCAGGTCTTGACATCCTGCTAACGAAGTAG AGATACATTAGGTGCCC >259270 TACGTAGGGAGCGAGCGTTGTCCGGAATTACTGGGTGTAAAGGGAGCGTAGGCGGGATCGCAAGTCAGATGTGAAAACTA TGGGCTTAACCCATAAACTGCATTTGAAACTGTGGTTCTTGAGTGAAGTAGAGGTAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACATCAGTGGCGAAGGCGATTTACTGGACGACAACTGACGCTGAGACACGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATGCTAGGTGTAGGGTCGGAAACGGGTCTGT GCCGCAGCTAACGCGATAAGCAATTCCACCTGGGGATACGGCCGCAAGGTTGAAACTCAAAGGAATT >42014 TACGGAGGATCCGAGCGTTATCCGGATTTATTTGGGTTTAAAGGGAGCGTAGGCGGATTGTTAAGTCAGTTGTGAAAGTT TGCGGCTCAACCGTAAAATTGCAGTTGATAACTGGTCAGTCTTGAGTGCAGTAGAGGTGGGCGGAATTCGTGGTGTAGCG GTGAAATGCTTAGATATCACGAAGAACTCCGATTGCGAAGGCAGCTCACTGGAGTGTAACTGACGCTGGATG >264558 TACGTAGGTGGCGAGCGTTATCCGGAATCATTGGGCGTAAAGAGGGAGCAGGCGGCCGCAAGGGTCTGTGGTGAAAGACC GAAGCTAAACTTCGGTAAGCCATGGAAACCGGGCGGCTGGAGTGCGGAAGAGGATCGTGGAATTCCATGTGTAGCGGTGA AATGCGTAGATATATGGAGGAACACCAGTGGCGAAGGCGACGGTCTGGGCCGCAACTGACGCTCATTCCCGAAAGCGTGG GGAGCAAATAGGATTAGATACCCTAGTAGTCCACGCCGTAAACGATGGTCACTAAGTGTCGGGGGTCAAACCCCCGGTGC TGCAGTACAACGACGAATAAGTCGACCCGCCTGAGTAGTA >330861 TACGTAGGGGGCAAGCGTTGTCCGGAATAATTGGGCGTAAAGGGCGCGTAGGCGGCTCGGTAAGTCTGGAGTGAAAGTCC TGCTTTTAAGGTGGGAATTGCTTTGGATACTGTCGGGCTTGAGTGCAGGAGAGGTAGACGGAATTCCCGGTGTAGCGGTG AAATGCGTAGATATCGGGAGGAACACCAGTGGCGAAGGCGGATTACTGGACGACCACTGACGCTGAGACACGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCTGTAAACGATGAATGCTAGGTGTGGGTGCGATAGCATCCGTGC CGCAGTTAACACAATAAGCATTCCACTGGGGATACGGCCGCAAGGTTGAAACTCAAAGGATTGACGGAGCCCGCACGAAG CAGTGGAGTATGTGGTTTAATCGACGCAACGCGAAGAACCTTACC >550329 TACGGAGGATCCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGTGCGTAGGCGGCCTTTTAAGTCAGCGGTGAAAGTCT GTGGCTCAACCATAGAATTGCCGTTGAAACTGGGGGGCTTGAGTATGTTTGAGGCAGGCGGAATGCGTGGTGTAGCGGTG AAATGCATAGATATCACGCAGAACCCCGATTGCGAAGGCAGCCTGCCAAGCCATTACTGACGCTGATGCACGAAAGCGTG GGGATCAAACAGGATTAGATACCCTGGTAGTCCACGCAGTAAACGATGATCACTAGCTGTTTGCGATACATTGTAAGCGG CACAGCGAAAGCGTTAAGTGATCCACCTGGGGAGTACGCCGGCAACGGTGAAACTCAAAGGAATTGACGGGGCCCGCACA AGCGGAGGAACATGTGGTTTAATTCGATGATACGCGAGG >328963 TACGTAGGGAGCAAGCGTTATCCGGATTTATTGGGTGTAAAGGGTGCGTAGACGGGAATACAAGTTAGTTGTGAAATCCC TCGGCTTAACTGAGGAACTGCAACTAAAACTATATTTCCTGAGTGCTGGAGAGGAAAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGACTTTCTGGACAGTAACTGACGTTGAGGCACGAAAGTGTG GGGGAGCAAACAGGATTAGATACCCTGGTAAGTCCACACCGTAAACGATGGATACTAGGTGTAGGGGATGAATAATCTTC TGTGCCGTCGCAAACGCAGTAAGTATCCC >159246 TACGTAGGTGGCAAGCGTTGTCCGGATTTACTGGGTGTAAAGGGCGTGTAGCCGGGAGGGCAAGTCAGATGTGAAATCCA CGGGCTCAACTCGTGAACTGCATTTGAAACTACTCTTCTTGAGTATCGGAGAGGCAATCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATCAGGAAGAACACCGGTGGCGAAGGCGGCTTGCTGGACTATAACTGACGCTGAGACTCGAAAGCGTG GGGAGCGAACAGGATTAGATACCCTGGTAGTCCACACTGTAAACGATGAATACTAGGTGTTGGGTCTCGATAGAGATTCG GTGCCGAAGCAAACGCATTAAGTATTCCACCTGGGGAGTACGTTCGCAAGAATGAAACTC >103589 TACGGAGGATCCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGATGGATGTTTAAGTCAGTTGTGAAAGTTT GCGGCTCAACCGTAAAATTGCAGTTGATACTGGATATCTTGAGCGCAGTTGAGGCAGGCGGAATTCGTGGTGTAGCGGTG AAATGCTTAGATATCACGAAGAACTCCGATTGCGAAGGCAGCCTGCTAAGCTGCAACTGACATTGAGCTCGAAAGTGTGG GTATCAAACAGGATTAGATACCCTGGTAGTCCACACGGTAAACATGAATACTCGCTTGTTTGCGATATACAGCAAGCGGC CAAGCGAAAGCGTTAAGTATTCCACCGTGGGGACGTACGGCCGGACAACGGTGAAA >136145 TACGTAGGTGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGCGCGTAGGCGGGGATGCAAGTCAGATGTGAAATCTA TGGGCCTTAACCCATAAACTGCATTTGAAACTGTATCTCTTGAGTGCTGGAGAGGTAGACGGAATTCCTTGTGTAGCGGT GAAATGGCGTAGATATAAGGAAGAACCACCAGGTGGCGAAGGCGGTCTACTGGACAGTAACTGACGCTGAGGCGCGAGAG CGGTGGGGAG >247816 TACGGAAGGTCCGGGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGCAGGCCGTCCTTTAAGCGTGCTGTGAAATGCC GCGGCTCAACCGTGGCACTGCAGCGCGAACTGGAGGACTTGAGTACGCACGAGGTAGGCGGAATTCGTGGTGTAGCGGTG AAATGCTTAGATATCACGAAGAACTCCGATTGCGAAGGCAGCTTACCGGAGCGCAACTGACGCTGAGGCTCGAAAGCGCG GGTATCGAACAGGATTAGATACCCTGGTAGTCGCGCGGTAAACGATGGATGCCCGCCGTTGGGATTTGGATTTCAGCGGC CAAGCGAAAGCGTTAAGCATCCCACCTGGGGAGTACGCCGGCAACGGTGAAAC >279083 AACGTAGGTCACAAGCGTTGTCCGGAATTACTGGGTGTAAAGGGAGCGCAGGCGGGAAGACAAGTTGGAAGTGAAATCTA TGGGCTCAACCCATAAACTGCTTTCAAAACTTGTTTTTCTTGAGTAGTGCAGAGGTAGGCGGAACTTCCCGGTGTAGCGG TGAATGCGTAGATA >558480 TACGTAGGTGGCAAGCGTTGTCCGGATTTACTGGGTGTAAAGGGCGTGTAGCCGGGAGGGCAAGTCAGATGTGAAATCCA CGGGCTCAACTCGTGAACTGCATTTGAAACTACTCTTCTTGAGTATCGGAGAGGCAATCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGATTGCTGGACGACAACTGACGGTGAGGCGCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCTGTAAACGATGGATACTAGGTGTTGCGGGTATCGACCCCTGCA GTGCCGAAGCAAACGCGATAAGTATCCCGCCTGGGGAGTACGCACGCAAGTGTGAAACTCAAAGG >373357 TACGGAGGGTGCGAGCGTTGTCCGGAATCATTGGGCGTAAAGAGTTCGTAGGTGGCCTGTTAAGTCTGGTGTTAAAATGC AGATGCTCAACATCTGTTCGGCACTGGATACTGGCAAGCTTGAATGCGGTAGAGGTAAAGGGAATTCCTGGTGTAGCGTG AATAGCGTAGATATCAGGAGGAACATCGGTGGCGTAAGCGCTTACTTGGGCCGGTAATTGACACTGAGGAACGAAAGACC AGGGTAAGGCAAATAGGGATTAGAGTACCCCACGTAGT >306610 TATGTAGGTGGCAAGCGTTGTCCGGATTTACTGGGTGTAAAGGGCGTGCAGCCGGGAATGCAAGTCAGATGTGAAATCCA TGGGCTTAACCCATGAACTGCATTTGAAACTGTATTTCTTGAGTACTGGAGAGGCAATCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGATTGCTGGACAGCAACTGACGGTGAGGCGCGAAAGTGTG GGGAGCAGACAGGATTAGACTACCCGTGGTACGTCCACACTAGTAAACGATGAATACGTAGGTGTGGCGGGACTCGACCC CTGCGT >334326 TACGGAGGATCCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGGTGGATTGTTAAGTCAGTTGTGAAGGTTT GCGGCTCAACCGTAAAATTGCAGTTGAAACTGGCAGTCTTGAGTACAGTAGAGGTGGGCGGAATTCGTGGTGTAGCGGTG AAATGCTTAGATATCACGAAGAACTCCGATTGCGAAGGCAGCTCACTAGACTGTTACTGACACTGATGCTCGAAAGTGTG GGTATCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTCGGGGAGCATTGCTCTTCGG TGCCGCAGCAAACGCAATAAGTATTCCACCTGGGGAGTACGTTCGCAAGAATGAAACTCAAAGGAATTGACGGGGACCCG CACAAGCGGTGGAGCATGTGGTTTAATTCGACGCAACGCGAAGAACCTTACCAAGTCTTGACATCCTTCTGACCTAGTAT GTAATGTACTATCTCTTCGGAGC >18643 TACGGAGGATCCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGGTGGATTGTTAAGTCAGTTGTGAAAGTTT GCGGCTCAACCGTAAATTGCAGTTGAACTGGGAGTTCTTGAGTACAGTAGAGGTGGGCGGAATTCGTGGTGTAGCGGTGA AATGCTTAGATATCACGAAGAACTCCGATTGCGAAGGCAGCTCACTAGACTTGTTACTGACAC >355680 TACGTAGGGAGCAAGCGTTATCCGAATTTACTGGGTGTAAAGGGCGAGTAGGCGGATTGGCAAGTTGGGAGTGAAATGTC GGGGCTTAACCCCGGAACTGCTTCCAAAACTGTTGATCTTGAGTGATGGAGAGGCAGGCGGAATTCCCAGTGTAGCGGTG AAATGCGTAGAGATTGGGAGGAACACCAGTGGCGAAGGCGACTAACTGGACTGTAACTGACGCTGAGGCGCGAAAGTGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACACTGTAAACGATGAATGCTAGGTGTAGGGGGTATCGACCCCTTCT GTGCCGCAGTCAACACAATAAGCATTCCGCCTGGGGAGTACGGCCGCAAGGTTGAAACTCAAAGGATTGACGGGGCCCGC ACAAGCAGCGGAGCGTGTGGTTTAATTCGACGCAACGCGAAGAACCTTACCAGGTCTTGACATCCACTTAAACTTACAGA GATGTAAGGTGTGCTTGCACAAAGTGAG >547752 TACGAAGGGGGCGAGCGTTGTTCGGAATTACTGGGCGTAAAGGGAGTGTAGGCGGTTATGTAAGATAGTGGTGAAATCCC AGAGCTTAACTTTGGAATTGCCATTATGACTATGTGGCTAGAATTACAGAGAGGATAGTGGAATACCCAGTGTAGAGGTG AAATTCGTAGATATTGGGTAGAACACCAGTGGCGAAGGCGACTATCTGGCTGTATATTGACGCTGAGGCTCGAAAGCATG GGGATCAAACAGGATTAGATACCCTGGTAGTCCATGCTGTAAACGATGAGTGCTTGTTGTCGGTGTAAAATCGGTGACGA AGTTAACGCGTTAAGCACTCCGCCTGGGGAGTACGGTCGCAAGATTAAAACTCAAAGGAATTGACGGGGACCCGCACAAG CGGTGGAGCATGTGGTTTAATTCGATGCAACGCGAAGAACCTTACCAACTCTTGACATCCTTATCGGGGAGATCAGAGAT GATTTCTTTCAG >166835 TACGTAGGGGGCTAGCGTTGTCCGGAATTACTGGGTGTAAAGGGAGCGCAGGCGGGAAGACAAGTTGGAAGTGAAATCCA TGGGCTCAACCCATGAACTGCTTTCAAAACTGTTTTTCTTGAGTAGTGCAGAGGTAGGCGGAATTCCCGGTGTAGCGGTG GAATGCGTAGATATCGGGAGGAACACCAGTGGCGAAGGCGGCCTACTGGACACCAACTGACGCTGAGGCTCGAAAGTGTG GGTAGCAAACAGGATTAGATACCCTGGTAGTCCACACTGTAAACGATGATTACTAGGTGTTGGAGGATTGACCCTTCAGT GCCGCAGTTAACACAATAAGTAATCCACCTAGGGAGTACGACCGCAAGGTTGAAACTCAAAGGAATTGACGGGGCCCGCA CAAGCAGTGGAGTATGTGGTTTAATTCGACGCAACGCGAAGAACCTTACCAAGTCTTGACATCCCTTGACAATGCTGGAA ACAGTATTTCTCTTCGGAGCAAAGGAGACGAGGTGGTGCA >295422 TACGTAGGTGGCGAGCGTTATCCGGAATTACTGGGTGTAAAGGGTGTGTAGGCGGGACGACAAGTCAGATGTGAAAATTG CAGGCTCAACCTGGAAAGTGCATTTGAAACTGCCGTTCTTGAGAGTCGGAGAGGTAAATGGAATTCCCGGTGTAGCGGTG AAATGCGTAGATAGTCGGGAGGAACCACCAGTGGCGAAGGCGTATTTACTGGACGACAACTGACGCTGAGACACGAAAGC GTGGGGAGCAAACAGGATTAGACTACCCGTGGTACGTCCACGCTAGTAAACG >234044 TACGGAGGATCCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGATGGATGTTTAAGTCAGTTGTGAAAGTTT GCGGCTCAACCGTAAATTGCAGTTGATACTGGATATCTTGAGTGCAGTTGAGGCAGGCGGAATTCGTGGTGTAGCGGTGA AATGCTTAGATATCACGAAGAACTCCGATTGCGAAGGCAGCCTAGCCTAAGCCGTCACTA >207982 TACGTAGGGTGGCGAGCGTTTATCCGGGTAAATCATTGGGCGTAAAGAGGGAGCAGGCGGCCGCAAGGGGTCTGTGGTGA AAGACCGAAGCTAAACTTCGGTAAGCCATGGAAACCGGGCGGCTTGGAGTGCGGAAGAGGATCGTGGAATTCCATGTGTA GCGGTGAAATGCGTAGATATATGGAGGAACACCAGTGGCGAAGGCGACGATCTGGGCCGCAACTGACGCTCATT >470724 TACGTAGGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGACGGTGTGGCAAGTCTGATGTGAAAGGCA TGGGCTCAACCTGTGGACTGCATTGGAAACTGTCATACTTGAGTGCCGGAGGGGTAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACGGTAACTGACGTTGAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTCGGGTGGCAAAGCCATTCGG TGCCGTCGCAGACGCAGTAAGTATTCCACCTGGGGAGTACGTTCGCAAGAATGAAACTCAAAGGAATTGACGGGGACCCG CACAAGCGGTGGAGCATGTGGTTTAATTCGAAGCAACGCGAAGAACCTTACCAAGTCTTGACATCCCTCTGACCGGAACT TTAACCGTTCCTTTCCTCGGG >394191 TACGTAGGGAGCGAGCGTTATCCGGATTTATTGGGCGTAAAGCGTGCGTAGGCGGTTTATTAAGTTTAAGATAAAAGCCC GGGGCTCAACTCCGGTTCGTCTTAAAAACTGGTAGACTTGAGTGTGGTAGAGGTAAATGGAATTTCTAGTGTAGCGGTGA AATGCGTAGATATTAGAAGGAGCACCAGTGGCGAAGGCGATTTACTGGGCCATAACTGACGCTGAGGCACGAAAGCGTGG GGAGCAAATAGGATTAGATACCCTAGTAGTCCACGCCGTAAACGATGAGTACTAAGTGTTGGAGATTCCAGTGCTGAAGC TAACGTATTAAGTACTCCGCCTGAGTAGTACGGTCGCAAGGCTGAAACTCAAAGGAATTGACGGGCACCCGCACAAGCGG TGGAGCATGCTGTTTAATTCGAAGATACGCGAAGAACCTTACCTAGACTTGACATCCCCCGGCAAAGACATGGAAACATG TTTGGAGGTTTACCCGGGAGACGAGGTGGTGCATGGTTGT >151439 TACGGAAGGTCCGGGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGGCCGGAGATTAAGCGTGTTGTGAAATGTA GTGGCTCAACCTCTGCACTGCAGCGCGAACTGGTCTTCTTGAGTACGCACAACGTGGGCGGAATTCGTGGTGTAGCGGTG AAATGCTTAGATATCACGAAGAACTCCGATTGCGAAGGCAGCTCGACGGGAGCGCAACTGACGCTGAAGCTCGAAAGTGA CGGGTATCGAACAGGACTTTAGATACCCCTGGCCAAGTCCG >101544 TACGTATGGTGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGCAGGCGGTGCGGCAAGTCTGATGTGAAAGCCC GGGGCTCAACCGCGGGACTGCATTGGAAACTGTCGTACTAGAGTGTCGGAGAGGTTAGTGGAATTCCCAGTGTAGCGGTG AAATGCGTAGAGATTGGGAGGAACACCAGTGGCGAAGGCGACTAACTGGACTGTAACTGACGCTGAGGCGCGAAAGTGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACACTGTAAACG >356589 TACGGAAGGTTCGGGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGGCCGGAGATTAAGCGTGTTGTGAAATGTA GATGCTCAACATCTGAACTGCAGCGCGAACTGGTTTCCTTGAGTACGCACAAAGTGGGCGGAATTCGTGGTGTAGCGGTG AAATGCTTAGATATCACGAAGAACTCCGATTGCGAAGGCAGCTCACTGGAGCGCAACTGACGCTGAAGCTCGAAAGTGCG GGTATCGAACAGGATTAGATACCCTGGTAGTCCACGCGGTAAACGATGGATGCTCGCTGTTTGCGTCTGACGTAAGCGGC CAAGCGAAAGCGTTAAGCATCCCACCTGGGGAGTACGCCGGCAACGGTGAAACTCAAAGGAATTGACGGGGGCCGCGACA AGCGGAGGAACATGTGGTTAATTCGATGATACGCGAGGAACCTTACCGGCTTGAACTGCAGGCGAACGAATCAGAGATGA TGAGGCCC >107184 TACGTAGGTGGCGAGCGTTATCCGGAATCATTGGGCGTAAAGAGGGAGCAGGCGGCCGCAAGGGTCTGTGGTGAAAGACC GAAGCTAAACTTCGGTAAGCCATGGAAACCGGGCGGCTAGAGTGCGGAAGAGGATCGTGGAATTCCATGTGTAGCGGTGA AATGCGTAGATATATGGAGGAACACCAGTGGCGAAGGCGACGGTCTGGGCCGGCAACTGACGCTCATTCCCGAAACGACG TGGGGAGGCAAATAAGGATTAGATACCTACGTAGTCACGCCGTAAACG >163176 ATACGGAGGATCCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGGCGGGTTGGTTAAGTCAGTTGTGAAAGT TTAGCGGCTCAACCGTAAAATTGCAGTTGATACTTGGACGACCTTTGAGTGCAACAGAGGTAGGCGGAATTCGTGGTGTA GCGGTGAAATGCTTAGATATCACGAAGAACTCCGATTGCGAAGGCAGCTTACTGGATTGTAACTGACGCTGATAGCTCGG AAAGTGT >6697 TACGTAGGTGGCGAGCGTTATCCGGAATCATTGGGCGTAAAGAGGGAGCAGGCGGCCGCAAGGGTCTGTGGTAGAAAGAC CGGAAGCCTAAACTTCGGTAAGCCATGGAAACCGGGCGGCTGGAGTGCGGAAGAGGATCGTGGAATTCCATGTGTAGCGG TGAAATGCGTAGATATATGGAGGAACACCAGTGGCGAAGGCGACGGTCTGGGCCGCAACTGACGCTCATTCCCGAAAGCG TGGGGAGCAAATAGGATTAGATACCCTAGTAGTCCACGCCGTAAACGATGGTCACTAAGTGTCGGGGTCAAACCCCGGTG CTGCAGTCAACGCAATAAGTGACCCGCCCTGGAGTAGTACGTTCGACTAAGAAAT >556231 TACGGAGGATGCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGCAGACGGGAGATTAAGTCAGTTGTGAAAGTTT GCGGCTCAACCGTAAAATTGCAGTTGATACTGGTTTCCTTGAGTGCAGTTGAGGCAGGCGGAATTCGTGGTGTAGCGGTG AAATGCTTAGATATCACGAAGAACTCCGATTGCGAAGGCAGCTCACTAGACTGTCACTGACACTGATGCTCGAAAGTGTG GGTATCAAACAGGATTAGATACCCTGGTAGTCCACACAGTAAACGATGAATACTCGCTGTTTGCGATATACAGTAAGCGG CCAAGCGAAAGCATTAAGTATTCCACCTGGGGAGTACGCCGGCAACGGTGAAACTCAAAGGAATTGACGGGGCCCGCACA AGCGGAGGAACATGTGGTTTAATTCGATGATACGCGAGGAACCTTACCCGGGCTTAAATTGCAACAGAATATATTGGAAA CAGTATAGCCGTAAGG >546756 TACGGAAGGTCCGGGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGGCCGGAGATTAAGCGTGTTGTGAAATGTA GACGCTCAACGTCTGCACTGCAGCGCGAACTGGTTTCCTGAGTACGCAACAAAGTGGCGAATTCGTGGTGTAGCGGTGAA ATGCTTAGATATCAACG >555446 TACGGAGGGTGCAAGCGTTAATCGGAATAACTGGGCGTAAAGGGCATGCAGGCGGTTCATCAAGTAGGATGTGAAATCCC CGGGCTCAACCTGGGAACAGCATACTAAACTGGTGGACTAGAGTATTGCAGGGGGAGACGGAATTCCAGGTGTAGCGGTG GAATGCGTAGATATCTGGAAGAACACCAAAGGCGAAGGCAGTCTCCTGGGCAAATACTGACGCTCATATGCGAAAGCGTG GGTAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGTCAATTAGGAGCTTGGGCGATAGTCTGGGTTC CGCAGCTAACGCAATAAATTGACCGCCTGGGGAGTACGGCCGCAAGGTTAAAACTCAAATGAATTGACGGGGGCCCGCAC AAGCGGTGGAGCATGTGGTTTAATTCGAAGCAACGCGAAAACCTTACAGGCTTGACATCTGACGAATCTGGATGAAAGTT CGGAGTGCTCTTCGGAG >274500 ATACGGAGGATCCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGATGGATGTTTAAGTCAGTTGTGAAAGTT TGCGGCTCAACCGTAAATTGCAGTTGAATACTTGGATATCTTGAGTGCAGTTGAGGCAGGCGGAATTCGTGGTGTAGCGG TGAAATGCGTTAGGATA >236550 TACGTATGGTGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGCAGGCGGTGCGGCAAGTCTGATGTGAAAGCCC GGGGCTCAACCCCGGTACTGCATTGGAAACTGTCGTACTAGAGTGTCGGAGGGGTAAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATCACGAAGAACTCCGATTGCGAAGGCAGCTTACCGGAGCGCAACTGACGCTGAGGCTCGAAAGCGCG GTATCGAACAGAATTAGATACCCTGGTAGTCCGCGCGGTAAACGATGGATGCCCGCCGTTGGGATTTGGATTTCAGCGGC CAAGCGAAAGCGTTAAGCATCCCACCTGGGGAGTACGCCGGCAACGGTGAAACTCAAAGGAATTGACGGGGGCCCGCACA AGCGGAGGACATGTGGTTTAATCGATGATACGCGAGGAACCTTACCCGGGCTTGAATTGCAGGAGAACGATCCAGAGA >88301 TACGTAGGATGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGCAGGCGGGACTGCAAGTTGGATGTGAAATACC GTGGCTTAACCACGGAACTGCATCCAAAACTGTAGTTCTTGAGTGAAGTAGAGGCAAGCGGAATTCCGAGTGTAGCGGTG AAATGCGTAGATATTCGGAGGAACACCAGTGGCGAAGGCGGCTTGCTGGG >102382 TACGTAGGTGGCAAGCGTTGTCCGGAATTACTGGGTGTAAAGGGTGCGCAGGCGGGATTGCAAGTTGGATGTGAAATACC GGGGCTTAACCCCGGAGCTGCATCCAAAACTGTAGTTCTTGAGTGGAGTAGAGGTAAGCGGAATTCCGAGTGTAGCGGTG AAATGCGTAGATATTAGAAGGAACACCAGTGGCGAAGGCGACTTGCTGGGCCACCACTGACGGTCAGGGACGAAAGCGTG GGGAGCAAATAGGATTAGATACCCTAGTAGTCCACGCCGTAAACGATGAGTACTAAGTGTCGGTTTTCCGGTGCTGAAGT TAACACATTAAGTACTCCGCCTGAGTAGTACGGTCGCAAGGCTGAAACTCAAAGGAATTGACGGGCACCCGCACAAGCGG TGGAGCATGCTGTTTAATTCGAAAATACGACGAAGAACCTTACCTAGACTTGACATCCCTGGCAAAGCTAATAGAAATAT >322045 TACGTAGGTGGCGAGCGTTATCCGGATTTATTGGGCGTAAAGCGTCCGCAGCCGGTTTATTAAGTCTAGAATTAAAGCCT GGAGCTCAACTCCAGTTCGTTTTAGAAACTGATAGACTCGAGTGTGGTAGAGGCAAACGGAATTTCTAGTGTAGCGGTAG AATGCGTAGATATTAGAAGGAACACCAGTGGCGAAGGCGGTTTGCTAGGCCACCACTGACGGTCATGGACGAAAGCGTGG GGAGCAAATAGGATTAGATACCCTAGTAGTCCACGCTGTAAACGATGAGTACTAAGTGTCGGGTTACCGGTGCTGAAGTT AACACATTAAGTACTCCGCCTGAGTAGTACGGTCGCAAGGCTGAACTCAAAGGAATTGACGGGGACCCGCACAAGCGGTG GAGCATGTGGTTTTAATTCGAAGCAACGCGAAGAACCTTACCAAGTCTTGACATCCCGATGACAGGGTATGTAATGTACT TTTCCCTTCGGGCATCGGTGACAGGTGGTGCATGGTTGTCGTCAG >133568 TACGTAGGGGGCGAGCGTTATCCGGATTTATTGGGCGTAAAGCGTGTGTAGGCGGTTTGTTAAGTTTAAGATTAAAGCCC GGGCTCAACTCCGGTAAGTCTTAAAAACTGGCAGACTTGAGTACGGTAGAGGCAAACGGAATTTCTAGTGTAGCGGTGAA ATGCGTAGATATTAGAAGGAACACCAGTGGCGAAAGCGGTTTGCTGGGCCGTTACTGACGCTGAGGCACGAAAGCGTGGG GAGCAAATAGGATTAGATACCCTAGTAGTCCACGCCGTAAACGATGAGTACTAAGTGTTGGGTTACCCAGTGCTGAAGCT AACGTATTAAGTACTCCGCCTGAGTAGTACGGTCGCAAGGCTGAAACTCAAAGGAATTGACGGCACCCGCACAAGCGGTG GAGCATGCTGTTAATTCGAAGATACGCGAAGAACCTTACCTAGACTTGACATCCCCGGCAAAGCTATAAGAAATAAGTAG TAGGAAGGTTACCCGGGTGACGAGGTGG >97627 AACGTAGGTCACAAGCGTTGTCCGGAATTACTGGGTGTAAAGGGAGCGCAGGCGGGAAGACAAGTTGGAAGTGAAATCCA TGGGCTCAACCCATGAACTGCCTTCAAAACTGTTTTTCTTGAGTAGTGCAGAGGTAGGCGGAATTCCCGGTGTAGCGGTG GAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCCAACTGGGCTTTTACTGACGCTGAGGCTCGAAAGTGTG GGGAGCAAACAGG >578828 TACGTAGGGAGCGAGCGTTGTCCGGATTTACTGGGTGTAAAGGGTGCGTAGGCGGGCTGTCAAGTCAGATGTGAAATACC GGGGCTCAACTCCGGGGCTGCATTTGAAACTGATGGTCTTGAGTGAAGTAGAGGCAGGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCCTGCTGGGCTTTAACTGACGCTGAGGCACGAAAGCATG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACACTGTAAACGATGAATGCTAGGTGTAGGGGGTATCGACCCCTTCT GTGCCGCAGTCAACACAATAAGCATTCCGCCTGGGGAGTACGGCCGCAAGGTTGAACTCAAGGAATTGACGGGGCCGCAC AAGCAGCGGAGCATGTGGTTTAATTCGACGCAACGCGAAGAACCTTACCAGGTCTTGACATCCACTAAACTTACAGAGAT GTAAGGTGTG >239064 TACGTATGGTGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGACGGAGTGGCAAGTCTGATGTGAAAACCC GGGGCTCAACCCCGGGACTGCATTGGAAACTGTCAATCTAGAGTACCGGAGAGGTAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACGGTAACTGACGTTGAGGCTCGAAAGCGGT GGGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGACTACTAGGTGTCGGGCAGCAAAGCTGTTCG GTGCCGCAGCAAAACGCAAATAAGTAGTCCACCTGGGGGAGTACGTTCGCAAGAATGAAACTCAAAAGGAATTGAACGGG ACCCGCACAAGCGGTGAGCATGTAGGTTTAATT >161340 TACGTAGGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGACGGACTGGCAAGTCTGATGTGAAAGGCG GGGGCTCAACCCCTGGACTGCATTGGAAACTGTTAGTCTTGAGTGCCGGAGAGGTAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACGGTAACTGACGTTGAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCTGTAAACGATGATTACTAGGTGTGGGGGGACTGACCCCTTCCG TGCCGCAGTTAACACAATAAGTAATCCACCTGGGGAGTACGGCCGCAAGGTTGAAACTCAAAGGAATTGACGGGGCCCGC ACAAGCAGTGGAGTATGTGGTTTTAATTCGAAGCAACGCGAAGAACCTTACCAGGTCTTGACATCGAGTGCATAACTAAG AGATTAGTGAAATCCCTTCGGGGACACTTAGACAGGTGTGCA >235390 TACGTAGGGGGCAAGCGTTATCCGGAATTATTGGGCGTAAAGAGTGCGTAGGTGGTTACCTAAGCGCAGGGTATAAGGCA ATGGCTCAACCATTGTTGGCCCTGCGAACTGGGCTACTTGAGTGCAGGAGAGGAAAGCGGAATTCCTAGTGTAGCGGTGA AATGCGTAGATATTAGGAGGAGCACCAGTGGCGAAGGCGGCTTTCTGGACTGTAACTGACACTGAGGCACGAAAGCGTGG GAGCAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAGCACTAGGTGTCGGGGCCGCAAGGCTTCGGTGCC GCAGTCAACGCATTAAGTGCTCCGCCGTGGGAGTACGCACGCAAGTGTGAAACTCAAGGAATTGACGGGGACCGCACAAG CAGCGGAGCATGTGGTTTAATTCGAAGCAACGCGAAGAACCTTACCAGGACTTGACATCCCTCTGACAGGACCTTAACCG GTTCCTTCGTACGGACAGAGGAGAC >141836 TACGGAGGATGCAAGCGTTATCCGGATTTATTGGGTTTAAAGGGTGCGTAGGCGGCACGCCAAGTCAGCGGTGAAATTTC CGGGCTCAACCCGGAGTGTGCCGTTGAAACTGGCGAGCTAGAGTACACAAGAGGCAGGCGGAATGCGTGGTGTAGCGGTG AAATGCATAGATATCACGCAGAACCCCGATTGCGAAGGCAGCCTGCTAGGGTGAAACAGACGCTGAGGCACGAAAGCGTG GGTATCGAACAGGATTAGATACCACGTGGTACGTACCGACGACGTAAACGGTAAACGTAGTAAGTAAACTTAAACCTTAA CGTTTGGTTTCGGACGTAACTAAACTAAGTTAAGGTAACGGGTACCGGTAACGACGGAAACGGAAACGGTTAAC >339015 AACGTAGGTCACAAGCGTTGTCCGGAATTACTGGGTGTAAAGGGAGCGCAGGCGGGAAGACAAGTTGGAAGTGAAATCTA TGGGCTCAACCCATAAACTGCTTTCAAAACTGTTTTTCTTGAGTAGTGCAGAGGTAGGCGGAATTCCCGGTGTAGCGGTG GAATGCGTAGATATCGGGAGGAACACCAGTGGCGAAGGCGGCCTACTGGGCACCAACTGACGCTGAGGCTCGAAAGTGTG GGTAGCAAACAGGATTAGATACCCTGGTAGTCCACGCTGTAAACGATGGATACTAGGTGTGCGGGACTCGA >143699 TACGGAGGATGCAAGCGTTATCCGGATTTATTGGGTTTAAAGGGTGCGTAGGCGGCACGCCAAGTCAGCGGTGAAATTTT CGGGCTCAACCCGGACTGTGCCGTTGAAACTGGCGAGCTAGAGTGCACAAGAGGCAGGCGGAATGCGTGGTGTAGCGGTG AAATGCATAGATATCACGCAGAACCCCGATTGCGAAGGCAGCCTGCTAGGGTGCGACAGACGCTGAGGCACGAAAGCGTG GGTATCGAACAGGATTAGATACCCTGGTAGTCCACGCAGTAAACGATGAATACTAACTGTTTGCGATACAATGTAAGCGG TACAGCGAAAGCGTTAAGTATTCCACCTGGGGATACGCCGGACAACGGTGAAACTCAAAGGAATTAGACGGGGGCCCGCA CAAGCGGAGGAACATGTGGTTAATTCGATGATACGCGAGGAACCTTACCGGGCTCAAACGCAGGGGGAATATATATGAAA GTATATAGCTAGCAATAGTC >114783 TACGTATGGTGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGCAGGCGGTGCGGCAGGTCTGATGTGAAAGCCC GGGGCTCAACCCCGGTACTGCATTGGAAACTGTCGTACTAGAGTGTCGGAGGGGTAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGATTGCTGGACGACAACTGACGGTGAGGCGCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCTGTAAACGATGAATACTAGGTGTGCGGGGACTGACCCCCTGCG TGCCGCAGCTAACGCAATAAGTATTCCACCTGGGGAGTACGATCGCAAGGTTGAAACTCAAAGGAATTAGACGGGGGCCC GCGACAAGCGGTGGATTATGTGGTTTAATTCGAAGCAACGCGAAGAACCTTACCAGGGCTTGACATCCTACTAACGAAGT AGAGATACATC >164557 TACGTATGGTGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGTGCGTAGGTGGCAAGGCAAGTCTGAAGTGAAAAATC CGGGGCTCAACCCCGGAACTGCTTTGGAAACTGTTTAGCTGGAGTACAGGAGAGGTAAGTGGAATTCCTAGTGTAGCGGT GAAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGACTTACTGGACTGCTACTGACACTGAGGCACGAAAGCGT GGGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGACTGCTAGGTGTCGGGTGGCAAAGGCCATTC GGTGCCGCAGCTAACGCAATAAGC >140805 TACGTAGGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGACGGTTTTGCAAGTCTGAAGTGAAAGCCC GGGGCTTAACCCCGGGACTGCTTTGGAAACTGTAGAACTAGAGTGCAGGAGAGGTAAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACTGTAACTGACGTTGAGGCTCGAAAGCGTG GGGAGCAAACAGGGTATTAGACTACCCGTGGTACGT >196433 TACGTAGGGAGCGAGCGTTGTCCGGAATTACTGGGTGTAAAGGGAGCGTAGGCGGGATCTTAAGTCAGGTGTGAAAACTA TGGGCTCAACCCATAGACTGCACTTGAAACTGAGGTTCTTGAGTGAAGTAGAGGCAGGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACATCAGTGGCGAAGGCGGCCTGCTGGGCTTTTACTGACGCTGAGGCTCGAAAGCGTG GGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCTGTAAACGATGGATACTAGGTGTGGGGGGTCTGACCCCCTCCGT GCCGCAGTTAACACAATAAGTATCCCACCTGGGGAGTACGATCGCAAGGTTGAAACTCAAAGGGAATTAGACGGGGGGCC CGCACGAAGCGGTGGAGTAATGT >9510 TACGTAGGGGGCGAGCGTTGTCCGGAATTACTGGGCGTAAAGGGTGCGTAGGCGGTTGCTTAAGTTGGATGTGAAATACC CGGGCTTAACTTGGGGGGTGCATTCAAAACTGGGCGACTAGAGTTCAGGAGAGGGAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTTCTGGACTGACACTGACGCTGAGGCACGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCTGTAAACGATGAATACTAGGTGTAGGGGGTATGAACTCCCTCT GTGCCGTAGCAAACGCAATAAGTATTCCGCCTGGGGAGTACGGCCGCAAGGTTGAAACTCAAAGGAATTGACGGGGGCCC GCACAAGCAGCGGAGCATGTGGTTTAATTCGAAGCAACGCGAAGAACCTTACCAAGGCTTGACATCCTGCTAAAGTCATG GAAACATGATGTCCCTTCGGGGGAGCAGAGACAGGTGGTGC >55799 TACGTAGGTGGCAAGCGTTGTCCGGATTTACTGGGTGTAAAGGGCGTGCAGCCGGGTCTGCAAGTCAGATGTGAAATCCA TGGGCTCAACCCATGAACTGCATTTGAAACTGTGGATCTTGAGTGTCGGAGGGGCAATCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGATTGCTGGACGATAACTGACGGTGAGGCGCGAAAGTGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACACTGTAAACGATGAATACTAGGTGTGCGGGGACTGACCCCCTGCG TGCCGCAGTTAACACAATAAGTATTCCACCTGGGGAGCACGATCGCAAGGTTGAAACTCAAA >72374 AATTGGACATTCCCGCCGAGAGCATCCGCGCGGATGTCGAACGGAAGCTGCGCAAAAGAAAGCGAATACAAAAAGAGCAG TCGCAGAAGATCGTCCGCCAAAGCGCCGGGTACGGCGACCGGGTCAACCCCGATTTCGCCAAGAATGTCGCCGCTGCAAA GGCAGAAGAGGCAGTCCTCGGCATGCTGCTCCTTTACCCCGAGCACCGCGAGGCGGTGCGGACGGGGAAGGT >224569 TACGGAAGGTCCGGGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGGCCGGAGATTAAGCGTGTTGTGAAATGTA GATGCTCAACATCTGCACTGCAGCGCGAACTTGGTTTCCTTGAGTACGCAACGAAAGGTGGGACGGTAATTCGTGGTGTA GCGGTAGAAATGCTTAGATA >10113 TACGTAGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGCAGGCGGTCTGGCAAGTCTGATGTGAAATCCCG GGGACTCAACTCCGGAATTGCATTGGAAACTGTCAGACTAGAGTGCCGGAGAGGTAAGTGGAATTCCCGTGTAGCGGTGG AATAGCGTAGATATCGGAGGAACACCACGTGGCGAAGGACGGGCCTACTGGGCACCAACTGACGCTGAGGCTCGAAAGTG TGGTAG >8389 TACGTATGGTGCAAGCGTTATCCGGATTTACTGGGTGTAAAGAGAGCGCAGGCGGTGCGGCAAGTCTGATGTGAAAGCCC GGGGCTCAACCCGGTACTGCATTGGAAACTGTCGTACTAGAGTGTCGGAGGGGTAAGTGGAATTCCTAGTGTAGCGGTGA AATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACGATAACTGACGCTGAGGCTCGAAAGCGTGG GGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTCGGGGAGCATTGCTCTTCGGT GCCGCAGCAAACGCAATAAGTATTCCACCTGGGGAGTACGTTCGCAAGAATGAAACTCAAAGGATTGACGGGGACCCGCA CAAGCGGTGGAGCATGTGGTTTAATTCGAAGCAACGGCGAAAGAACCTTACCAAGTCTTAGACACTCCCGAATGACAGAG TATGTAATGTACTTTCTC >362373 TACGGAGGATCCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGGTGGATTGTTAAGTCAGTTGTGAAAGTTT GCGGCTCAAACCGTAAAAATTGCAGTTGAAACTGGGAGTCTTGAGTACAGTAGAGGTGGGCGGAATTCGTGGTGTAGCGG TGAAAATGCTTAGATATCACGAAGAACTCCGATTGCGAAGGCAGCTCACTAGACTGTCACTGACACTGATGCTCGAAAAG TGTGGTATCAAAACAGGATTAGATACCCTGGTAGTCCACAC >139641 TACGTAGGGAGCAAGCGTTATCCGGATTTATTGGGTGTAAAGGGTGCGTAGACGGGAAGGTAAGTTAGTTGTGAAATCCC TCGGCTCAACTGAGGAACTGCGACTAAAACTGCTTTTCTTGAGTGCTGGAGAGGAAAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGACTTTCTGGACAGTAACTGACGTTGAGGCACGAAAGTGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACACAGTAAACGATGAATACTCGCTGTTTGCGATATACAGTAAGCGG CCAAGCGAAAGCGTTAAGTATTCCACCTGGGGAGTACGCCGGCAACGGTGAAACTCAAAGGAATTGGACGGGGGCCCGCA CAAGCGGAGGAACATGTGGTTTAATTCGATGA >125536 TACGTAGGTGGCAAGCGTTGTCCGGATTTACTGGGTGTAAAGGGCGCGTAGGCGGGATGGCAAGTCAGATGTGAAATCCA TGGGCTCAACCCACGAACTGCATTTGAAACTGTCGTTCTTGAGTATCGGAGAGGCAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTGCTGGACGACAACTGACGCTGAGGCGCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTCGGGGCCGTAGAGGCTTCGG TGCCGCAGCCAACGCAATAAGTATTCCACCTGGGGAGTACGTTCGCAAGAATGAAACTCAAAGGAATTGACGGGGACCCG CACAAGCGGTGGAGCATGTGGTTTAATTCGAAGCAACGCGAAGAACCTTACCTGGTCTTGACATCCTTCTGACCGGTCCT TAACCGGACCTTTTCCTTC >103157 TACGGAGGATCCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGATGGATGTTTAAGTCAGTTGTGAAAGTTT GCGGCTCAACCGTAAAATTGCAGTTGATTACTAGGATTATCTTGAGTGCAGTTGAGGCAGGCGGAATTCGTGGTGTAGCG GTGAAATGCTTAGGATATCA >245893 TACGTATGGTGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGCAGGCGGTGCGGCAAGTCTGATGTGAAAGCCC GGGGCTCAACCCCGGTACTGCATTGGAAACTGTCGTACTAGAGTGTCGGAGGGGTAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACGATAACTGACGCTGAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTTGGGAAGCATTGCTTCTCGG TGCCGTCGCAAACGCAGTAAGTATTCCACCTGGGGAGTACGTTCGCAAGAATGAAACTCAAAGAATTGACGGGGGCCCGC ACAAGCAGTGGAGTATGTGGTTTAATTCGACGCAACGCGAAGAACCTTACCAAGTCTTGACATCCCTTGACGATGCTGGA ACAGTATTTCTCTTTCGGAGCAAGGAGACAGG >144746 TACGGAGGATCCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGGCGGATTGTTAAGTCAGTTGTGAAAGTTT GCGGCTCAACCGTAAAATTGCAGTTGATACTGGCAGTCTTGAGTGCAGTAGAGGTGGGCGGAATTCGTGGTGTAGCGGTG AAATGCTTAGATATCACGAAGAACTCCGATTGCGAAGGCAGCACACTAATCCGTAACTGACGTTTCATGCTCGAAAGTGT GGGTATCAAACAGGATTAGATACCCTGGTAGTCCACACGGTAAACGATGGATACTCGCTGTTGGCGATATACTGTCAGCG GCTTAGCGAAAGCGTTAAGTATCCCACCTGGGGAGTACGCCGGCAACGGTGAAACTCAAAGGAATTGACGGGGGCCCGCA CAAGCGGAGGAACAGTAGTGGTTAATTCGATGA >278398 TACGTAGGTGGCAAGCGTTGTCCGGATTTACTGGGTGTAAAGGGCGTGTAGGCGGGATGGCAGGTCAGATGTGAAATACC CGGGCTTAACCCGGGGGGTGCATTTGAAACCGCCGTTCTTGAGTGCCGGAGAGGGAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTTCTGGACGGTAACTGACGCTGAGGCGCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGGATACTAGGTGTAGGAGGTATCGACCCCTTCT GTGCCGCAGTAAACACAATAAGTATCCCACCTGGGGAGTACCCCCGGCGCAAGGTTGAAACTCAAAGGATTGACGGGGCC CGCACAAGCAGTGGAGTATGTGGTTTAATTCGAAGCAACGCGAAGAACCTTACCAGGGCTTGACATCCCGCTGA >97508 TTCTTGATACAGTCTTTGTCCCGTAATTTTTCCCGTAGTCCGTTTCCTTTTTCTATATATCCTTCATCGAAGATATTTCG TCCGAAATTCTTTATCTCACCGGAAACATTCCACCTCTTGTCATCGGCTATTCTTTCTTCTATGTATTCCAACAGCCAAT AGAGTACGGGAGATTGTCGGTCCAGCTTTTCTATCATGGAGTCCACGGCATCACTCAGAACTTCCATATTGTTCAGTTCG ATATTCAGATTGGCACCCAATTCCAGCTCCCGTGCCAAATTGCGCATCACCGACTGGAAGAATGAGTCAATGGTTTCCAC CCGGAAACGGCTGTAATCGTGTATCATGTAGTGCAGTGCCGTACCGGCGGCTGTCCCTATGTCTTCTTGGGGCATTTCCA GTTCTTCTGTGATTTTCT >248442 TACGGAGGATCCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGATGGGTGTTTAAGTCAGTTGTGAAAGTTT GCGGCTCAACCGTAAAATTGCAGTTGATACTGGATATCTTGAGTGCAGTTGAGGCAGGCGGAATTCGTGGTGTAGCGGTG AAATGCTTAGATATCAACGAAAGAACTCCGATTGCGAAGGCAGCCTGACTAAGC >269778 ATACGGAGGATCCGAGCGTTATCCGGATTTATTGGGTTTAAAAGGGAGCGTAGGCGGATTGTTAAGTCAGTTGCGAAAAG TTTGCGGCTCAACCGTAAAATTGCAGTTGATAACTGGTCAGTCTTGAGTGCAGTAGAGGTGGGCGGAATTCGTGGTGTAG CGGTGAAATGCTTAGATATCACGAAGAACTCCGATTGCGAAGGCAGCCTCAC >312030 AACGTAGGGTGCAAGCGTTGTCCGGAATTACTGGGTGTAAAGGGAGCGCAGGCGGGAAGACAAGTTGGAAGTGAAAAACC ATGGGCTCAACCCATGAATTGCTTTCAAAACTGTTTTTCTTGAGTAGTGCAGAGGTAGATGGAATTCCCGGTGTAGCGGT GGAATGCGTAGATATCGGGAGGAACACCAGTGGCGAAGGCGGTCTACTGGGCACCAACTGACGCTGAGGCT >573761 AACGTAGGTCACAAGTGTTGTCCGGAATTACTGGGTGTAAAGGGAGCGCAGGCGGGAAGACAAGTTGGAAGTGAAATCCA TGGGCTCAACCCATGAACTGCTTTCAAAACTGTTTTTCTTGAGTAGTGCAGAGGTAGGCGGAATTCCCGGTGTAGCGGTG GAATGCGTAGATATCGGGAGGAACACCAGTGGCGAAGGCGGCCTACTGGGCACCAACTGACGCTGAGGCTCGAAAGTGTG GGTAGCAAACAGGATTAGATACCCTGGTAGTCCACACTGTAAACGATGATTACTAGTGTTGGAGGATTGACCCTTCAGTG CCGCAGTTAACACAATAAGTATTCCACCTGGGGAGTACGCCGGCAACGGTGAAAACTCAAAAGGAATTGACGGGGGCCCG CACAAGCGGAGGAACATGTGGTTTAATTCGATGATACG >583669 TACGTAGGGGGCAAGCGTTGTCCGGAATAATTGGGCGTAAAGGGCGCGTAGGCGGCTCGGTAAGTCTGGAGTGAAAGTCC TGCTTTTAAGGTGGGAATTGCTTTGGATACTGTCGGGCTTGAGTGCAGGAGAGGTTAGTGGAATTCCCAGTGTAGCGGTG AAATGCGTAGAGATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACTGTAACTGACGTTGAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTTGGGTTTCATAAGAAGCTCG GTGCCGGCGCAAACGCATTAAGTATTCCACCTGGGGAGTACGTTCGCAAGAATGAAACTCAAAGGATTGACGGGGACCCG CACAAGCGGTGGAGCATGTGGTTTAATTCGAAGCAACGCGAAGAACCTTACCAAGTCTTGACATCCCGTTGACCTGTTAT GTAATGTAACA >139752 TACGTAGGGGGCAAGCGTTGTCCGGAATAATTGGGCGTAAAGGGCGCGTAGGCGGCTCGGTAAGTCTGGAGTGAAAGTCC TGCTTTTAAGGTGGGAATTGCTTTGGATACTGTCGGGCTTGAGTGCAGGAGAGGTTAGTGGAATTCCCAGTGTAGCGGTG AAATGCGTAGAGATTGGGAGGAACACCAGTGGCGAAGGCGACTAACTGGACTGTAACTGACGCTGAGGCGCGAAAGTGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATGCTAGGTGTAGGGGCATTAAGCTTCTGTG CCGCAGTTAACACAATAAGCATTCCACCTGGGGAGTACGGCCGCAAGGTTGAAACTCAAAGGAATTGACGGGAGCCCGCA CAAGCAGTGGAGTATGTGGTTTAATTCGACGCAACGCGAAGAACCTTACCAGGTCTTGACATACCTGAGAACCCGGACGT AAAGTGGCTGGGGTGCCCGTTCGGGGAATTTCGAGAGACGAGGTGGTGCAG >315848 TACGTAGGTGGCAAGCGTTGTCCGGATTTACTGGGTGTAAAGGGCGTGTAGCCGGGAGGGCAAGTCAGATGTGAAATCCA CGGGCTCAACTCGTGAACTGCATTTGAAACTACTCTTCTTGAGTATCGGAGAGGCAATCGGAATTCCTAGCGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGATTGCTGGACGACAACTGACGGTGAGGCGCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCTGTAAACGATGGATACTAGATGCAGGAGGTATTCACTCCTTCT GTGTCGCAGCTAACGCAATAAGTATCCCGCCTGGGGAGTACGGCCGCAAGGTTGAAACTCAAAGGAATTGACGGGGCCGC ACAAGCAGCGGAGCATGTGGTTTATTCGACGCAACGCGAAAAACCTTACCAAGACTTGACATCGTAT >516971 TACGGAGGATCCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGATGGATGTTTAAGTCAGTTGTGAAAGTTT GCGGCTCAACCGTAAAATTGCAGTTGATACTGGATATCTTGAGTGCAGTTGAGGCAGGCGGAATTCGTGGTGTAGCGGTG AAATGCTTAGATATCACGAAGAACTCCGGTTGCGAAGGCAGGCCTAGCTAAGCTGC >267568 TACGGAAGGTCCGGGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGGCCGGAGATTAAGCGTGTTGTGAAATGTA GATGCTCAACATCTGAACTGCAGCGCGAACTGGTTTCCTTGAGTACGCACAAAGTGGGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACGATAACTGACGCTGAGGCTCGAAAGCGTG GGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTCGGGAGCATTGCTCTTCGGTG CCGCAGCAAACGCAATAAGTATTCCACCTGGGGAGTACGTTCGCAAGAATGAAACTCAAAGGAATTGACGGGGACCGCAC AAGCGGTGGAGCATGTGGTTAATTCGAAGCAACGCGAAGAACCTTACAAGTCTTGACATCCCGATGACAAGCTATGTAA >536009 TACGTAGGTGGCGAGCGTTGTCCGGAATTACTGGGTGTAAAGGGTGCGTAGGCGGCTTCTAAAGTCAGATGTGAAATACC GCAGCTCAACTGCGGGGCTGCATTTGAAACTTGGGAGCTTGAGTGAAGTAGAGGTAAGCGGAATTCCTAGTGTAGCGGTG GAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGATTGCTGGACGATAACTGACGGTGAGGCGCGAAAGTGTG GGAGCAAACAGGATTAGATACCCTGGTAGTCCACACTGTAAACGATGAATACTAGGTGTGCGGGGACTGACCCCCTGCGT GCCGCAGTAAACACAATAAGTATTCCACCTGGGGAGTACGATCGCAAGGTTGAAACTCAAAGGAATTGACGGGGGCCCGC ACAAGCGGTGGATTATGTGGTTTAATTCGAAGCAACGCGAAGAACCTTACCAGGGTTTGACATCCTGCTAACGAAGTAGA GATACATTAGGTGCCCTTCGGGGAAAGCAGAGAC >275935 TACGTAGGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGTGTAGGTGGCTGTGCAAGTCAGGAGTGAAAGCCC GGGGCTCAACCCCGGGACTGCTCTTGAAACTGTGCGGCTTGAGTGCAGGAGGGGCAGGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCGGTGGCGAAGGCGGCCTGCTGGACTGTAACTGACACTGAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTCGGGGCTCATAAGAGCTTCG GTGCCGCAGCAACGCAATAAGTATTCCACCTGGGGAGTTACGTTCGCAAGAAT >558838 TACGTAGGGAGCAAGCGTTGTCCGGAATTACTGGGCGTAAAGGGTGCGTAGGCGGCCGTTTAAGTCAGATGTGAAATACC CGTGCTTAACATGGGGGCTGCATTTGAAACTGGATGGCTTGAGTGCAGGAGAGGCAAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGACTTGCTGGACTGTAATTGACGCTGAGGC >181819 TACGTAGGGAGCAAGCGTTATCCGGATTTATTGGGTGTAAAGGGTGCGTAGACGGTAATGCAAGTTAGTTGTGAAATCCC TCGGCTTAACTGAGGAACTGCAACTAAAACTACATTTCTTGAGTATTGGAGGGGAAAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCGGTGGCGAAGGCGACTTTCTGGGCAATTACTGACGTTGAGGCACGAAAGTGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACACCGTAAACGATGGATACTAGGTGTAGGATGTGATAAACATTCTG TGCCGTCGCAAACGCAAATAAGTACTCCCACCGTGGGGGAGTACCGGGCCGCAAGGTTGAAACTCAAAAGGAATTGGACC GGGGGCCCGCACAAGCAGTGGAGTATGTGGTTTAATTCGACGCAACGCGAAGAACCTTACCAGGGCTTGACATATAGAGG AAATAAGCTAGAGA >141423 TACGTAGGGAGCGAGCGTTATCCGGATTTATTGGGTGTAAAGGGTGCGTAGACGGGAAGTCAAGTTAGTTGTGAAATCCC TCGGCTTAACTGAGGAACTGCAACTAAAACTGATTTTCTTGAGTACTGGAGAGGAAAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCGGTGGCGAAGGCGACTTTCTGGACAGAAACTGACGTTGAGGCACGAAAAGTGT GGGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTAGGGGTTGTCATGACCTCT GTGCCGCCGCTAACGCATTAAGTATTCCGCCTGGGGAGTACGGTCGCAAGAATTAAAACTCAAAGGAATTCGACGGGGGC CCGCACAAGCAGCGGAGCATTGTGGTTTAATTCGAAGCAACGCGAAGAACCTTACCTAGAC >8096 TACGTAGGTGGCAAGCGTTGTCCGGATTTACTGGGTGTAAAGGGCGTGTAGCCGGGAGGGCAAGTCAGAGTGTGAAAATC CCACGGGCGTCAACTCCGTGAACTGCATTTGAAACTAACTCTTCTTCGAGTATCGGAGAGGCAATCGGAATTCCTAGTGT AGCGGTGAAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGATTGCTGGACGACAACTGACGGTGAGGCG >142784 GTATAAGAGTTTCGTACTTTATCTCGGTATCTGAGATGTTCTCCTCGGGACGGAGTTCCTCGCTGCCCTTTGTGAACTGC CACGATCTCAGTTCAATATCAGCGCCGGAAAATACCAGATAGATATTGTGATTTCTGCCGTCAAACTGACTGAATTCAGC AGAACGAACCTTAGCATAATCAGCGTTGTCAAATTCAATGAAAGATACTGCCTCGCCGGAAATGCTGTCAAGGCGAACCT CGATTCTGCCCTTGCCTTTAACATCAGCAGTGAAAGCGGAAGCGCCATAACCGAAAT >343119 TACATAGGGTGCAAGCGTTATCCGGAATTATTGGGTGTAAAGGGTGCGTAGACGGGAAAACAAGTTAGTTGTGAAATCCC TCGGCTCAACTGAGGAACTGCAACTAAAACTATTTTTCTTGAGTGTCGGAGAGGAAAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGACTTTCTGGACGATAACTGACGTTGAGGCACGAAAGTGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACACCGTAAACGATGGATACTAGGTGTAGGGTGTATTAAGCATTCTG TGCCGCCGCTAACGCATTAAGTATCCCACCTGGGGAGTACGACCGCAAGGTTGAAACTCAAAGGAATTGACGGGGCCCGC ACAAGCAGTGGAGTATGTGGTTTAATTCGAAGCAACGCGAAGAACCTTACCAGGGCTTGACATATACCGGAAT >511371 TACGTAGGTGGCAAGCGTTGTCCGGATTTACTGGGTGTAAAGGGCGTGTAGCCGGGAGGGCAAGTCAGATGTGAAATCCA CGGGCTCAACTCGTGAACTGCATTTGAAACTACTCTTCTTGAGTATCGGAGAGGCAATCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACATCAGTGGCGAAGGCGGCTTACTGGGCTTTAACTGACGCTGAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGATTACTAGGTGTGGGGGGACTGACCCCTTCGT GCCGCAGCAAACGCAATAAGTAATCCACCGTGGGGAGTACGACCGAC >279470 TACGTATGGTGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGCAGGACGGAAGGCTAAGTCGTGATGTGAAAGC CCGGGGCTCAACCCCGGTACTGCATTGGAAACTGGTCATCTAGAGTGTCGGAGGGGTAAGTGGAATTCCTAGTGTAGCGG TGAAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGGCGATAACTGACGCTGAGGCTCGAAAGCG TGGGAGCAAACAGGATTAGATACCCTGGTA >546723 TACGTAGGTGGCAAGCGTTGTCCGGAATTACTGGGTGTAAAGGGAGCGTAGGCGGGATGCCAAGTCAGCTGTGAAAACTA TGGGCTTAACTTGTAGACTGCAGTTGAAACTGGTATTCTTGAGTGAAGTAGAGGTTGGCGGAATTCCGAGTGTAGCGGTG AAATGCGTAGATATTCGGAGGAACACCGGTGGCGAAGGCGGCCAACTGGGCTTTAACTGACGCTGAGGCTCGAAAGTGTG GGTAGCAAACAGGATTAGATACCCTGGTAGTCCACACCGTAAACGATGATTACTAGGTGTTGGAGGATTGACCCCTTCAG TGCCGCAGTTAACACAATAAGTAATCCACCTGGGGATACGACCGCAAGGTTGAAACTCAAAGGAATTGACGGGGGCCCGC ACAAGCAGTGGAGTATGTGGTTTAATTCGACGCAACGCGAAGAACCTTACCAAGTCTTGACATCCTGCGACGGACATAAG AAATTATGTCTTTCCTTCGGGACGCAGAGACAGGTGGTG >454435 TACGTAGGGAGCGAGCGTTGTCCGGAATTACTGGGTGTAAAGGGAGCGTAGGCGGGATCGCAAGTCAGATGTGAAAACTA TGGGCTTAACCCATAAACTGCATTTGAAACTGTGGTTCTTGAGTGCAGTTGAGGCAGGCGGAATTCGTGGTGTAGCGGTG AAATGCTTAGATATCACGAAGAACCCCGATTGCGAAGGCAGCTTGCTCAACTGTAACTGACGTTCATGCTCGAAAGTGTG GGTATCAAACAGGATTAGATACCCTGGTAGTCCACACGGTAAACGATGGATACTCGCTGTTGGCGATATACTGTCAGCGG CCAAGCGAAAGCATTAAGTATCCCACCTGGGGAGTACGCCGGCAACCGGTGAAACTCAAAGGATTGACGGGGCCCGCACA AGCGGAGGAACATGTGG >257199 TACGTAGGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGACGGCCGTGCAAGTCTGATGTGAAAGGCT GGGGCTCAACCCCGGGACTGCATTGGAAACTGTATGGCTGGAGTGCCGGAGAGGGTAAGCGGAATTCCTAGTGTAGCGGT GAAATGCGTAGATATTAGGAGGAACACCAGTAGCGAAGGCGGCTTTCTGGACTGTAACTGACACTGAGGCACGAAAGCGT GGGGAGCAAACAGGATTAAGATACCCTGGAGTCCACGCCGTAAACGATGAGTACTAGGTGTCGGGGGTTACCCCCCTCGG GTGCCGCAGCTAACGCATTAAGTACTCCG >238279 TACGTATGGAGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGTGTAGGTGGCCATGCAAGTCAGAAGTGAAAATCC GGGGCTCAACCCCGGAACTGCTTTTGAAACTGTAAGGCTAGAGTGCAGGAGGGGTGAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTCACTGGACTGTAACTGACACTGAGGCACGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTTGGGTTCCAAAGGGGACTCG GTGCCGTCGCAAACGCATTAAGTATTCCACTGGGGGTACTTCGCAAGAATGAAACTC >362382 TACGTATGGAGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGACGGCACGGCAAGCCAGATGTGAAAGCCC GGGGCTCAACCCCGGGACTGCATTTGGAACTGCTGAGCTAGAGTGTCGGAGAGGCAAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTGCTGGACGATGACTGACGTTGAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGACTGCTAGGTGTCGGGTAGCAAAGCTATTCGG TGCCGCAGCTAACGCAATAAGCAGTCCACCGTGGGGAGTACGTTCGCAAGAATGAAACTCAAAGGAATTGACGGGACCCG CACAAGCGGTGGAGCATGTGGTTTAATTCGAAGCAACGCGAAGAACCTTACCTGATTCTTGACATCCCGATCGACCGTCT T >305967 TACGTAGGGAGCGAGCGTTGTCCGGAATTACTGGGTGTAAAGGGAGCGTAGGCGGGATCGCAAGTCAGATGTGAAAACTA TGGGCTTAACCCATAAACTGCATTTGAAACTGTGGTTCTTGAGTGAAGTAGAGGTAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAAACATCAGGTGGACGGAA >349780 TACGTAGGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGGCGGTCTGGCAAGCCAGAAGTGAAAGCCC GGGGCTTAACCCCGGGACTGCTTTTGGAATTGTTAGACTAGAGTGTCGGAGAGGTAAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACGATAACTGACGCTGAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGGATGCCGCCGTTGGGATTTGGATTTCAGCGGC CAAGCGAAAGCGTTAAGCATCCCACCTGGGGAGTACGCCGGCAACGGTGAAACTCAAAGGAATTGACGGGGCCCGCACAA GCGGAGGAACATGTGGTTTAATTCGATGATACGCGAGGAACCTTACCCGGGCTTGAATTGCAGGAGAACGATCCAGAGAT GGTGAGGCCCTTCGGGGCTCCGTGTGAAGGTGC >512616 TACGTAGGTGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGTGTGTAGGCGGGACGACAAGTCAGATGTGAAACTCA TGGGCTCAACCCATGACCTGCATTTGAAACTGCCGTTCTTGAGAGTCGGAGAGGTAAATGGAATTCCCGGTGTAGCGGTG AAATGCGTAGATATCGGGAGGAACACCAGTGGCGAAGGCGATTTACTGGACGACCACTGACGCTGAGACACGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATGCTAGGTGTAGGGGCAGTTAAGCTTCTGT GCCGCAGTTAACACAATAAGCATTCCACCTGGGAGTACGGCCGCAAGGTTGAAACTCAAAGGAATTGACGGGAGCCCGGC ACAGCAGTGGAGTATGTGGTTTAATTCGACGTCAACGCGAAGGAACCCTTACCGAGGTACTTGACA >593006 TACGTAGGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGACGGCATCACAAGTCAGAAGTGAAAATCC GGGGCTCAACCCCGGAACTGCTTTTGAAACTGTGGAGCTGGAGTGCAGGAGAGGTAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACGATGACTGACGCTGAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTCGGGGAGCACAGCTCTTCGG TGCCGCAGCAAACGCAGTAAGTATTCCACCTGGGGAGTACGTTCGCAAGAATGAAACTCAAAGGAATTGACGGGGACCCG CACAAGCGGTGGAGCATGTGGTTTAATTCGAAGCAACGCGAAGAACCTTACCAAGTCTTGACATCCTTCTGACAGAGTAT GTAATGTACTTTCCCTTCGGGGCAGAAGTGACAGG >292288 AACGTAGGGTGCAAGCGTTGTCCGGAATTACTGGGTGTAAAGGGAGCGCAGGCGGACCGGCAAGTTGGATGTGAAATCCA CGGGCTCAACTCGTGAACTGCATTTGAAACTACTCTTCTTGAGTATCGGAGAGGCAATCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGATTGCTGGACGACAACTGACGGTGAGGCGCGAAAGCGTG GGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCTGTAAACGATGAATACTAGGTGTGCGGGGACTGACCCCCTGCGT GCCGCAGCTAACGCAATAAGTATTCCACCTGGGGAGTACGATCGCAAGGTTGAAACTCAAAGGATTGACGGGGGCCCGCA CAAGCGGTGGATTATGTGGTTTAATTCGAAGCAACGCGAAGAACCTTACCAGGGCTTGACATCCTACTAACGAGATAGAG ATATGTT >166871 TACGTAGGGGGCAAGCGTTGTCCGGAATAATTGGGCGTAAAGGGCGCGTAGGCGGCCCGGTAAGTCTGGAGTGAAAGTCC TGCTTTTAAGGTGGGAATTGCTTTGGATACTGTCGGGCTTGAGTGCAGGAGAGGTAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACTGACAATGACGCTGAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTCGGGGGCCATAAGGCTTTCG GTGCCGCAGCAAACGCAATAAGTATTCCACCTGGGGAGTACGTTCGCAAGAATGAAACTCAAAGGAATTGACGGGACCCG CACAAGCGGTGGAGCATGTGGTTTAATTCGAAGCAACGCGAAGAACCTTACCAGGCCTTGACATCCCGGTGACCGTCCCG TAATGGGGACCTCTCTTCGGAGCACCGGTGACAGGTGGTGCATGGTTG >565944 TACGTAGGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGACGGCGCAGCAAGTCTGATGTGAAAGGCA GGGGCTTAACCCCTGGACTGCATTGGAAACTGCTGTACCTGAGTGCCGGAGGGGTAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACGGTAACTGACGTTGAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAAATACTAGGGTGTCAGGGAGCGACTAGCTTC TTTGGTGCCGCCGC >510626 TACGTAGGGGGCGAGCGTTATCCGGATTTATTGGGCGTAAAGCGTGCGTAGGCGGTTTATTAAGTCTGGAATTAAAGCCC GAGGCTTAACCTCGGTTCGTTCTAGATACTGGTTGACTAGAGTACAGTAGAGGCAAATGGAATTCCTAGTGTAGCGGTGG AATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGATTTGCTGGGCTGTAACTGACGCTGAGGTACGAAAGCGTGG GTAGCAAATAGGATTAGATACCCTAGTAGTCCACGCTGTAAACGATGAGCACTAAGTGTCGGGTTACCGGTGCTGAAGTT AACACATTAAGTGCTCCGCCCTGAGTAGTACGGTCGCAAGACTGAAACTCAAAGGAATTGACGGGCACCCGCACAAGCGG TGGAGCATGTTGTTAATTTCGAAAATACGCGAAGAACCTTACCTAGCTTGACATCCCCTGGCAAAAGCTAATAGAAAATA TAAGTGGGAGGTTATACCA >351629 AACGTCGGTCACAAGCGTTGTCCGGAATTACTGGGTGTAAAGGGAGCGCAGGCGGGTGATCAAGTTGGAAGTGAAATCCA TGGGCTCAACCCATGAACTGCTTTCAAAACTGATCGTCTTGAGTAGTGCAGAGGTAGGCGGAATTCCCGGTGTAGCGGTG GAATGCGTAGATATCGGGAGGAACACCAGTGGCGAAGGCGGCCTACGTGGGCACCAACTGACGCTGAGGCTCGAAAGTGT GGGTAGACAAACAGGATTAGACTACCCTGGTACGTCCACAACCGTAAACGAT >202238 TACGGAGGATCCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGGTGGATTGTTAAGTCAGTTGTGAAAGTTT GCGGCTCAACCGTAAAATTGCAGTTGAAACTGGCAGTCTTGAGTACAGTAGAGGTGGGCGGAATTCGTGGTGTAGCGGTG AAATGCTTAGATATCACGAAGAACCTCGATTGCGAAGGCAGCTCACTAGACTTGTTACTGACACTGATGCTACGAAAGTG GTGGGTATACAAACGAGG >102209 TACGTATGGTGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGGTGGCAAGGCAAGCCAGAAGTGAAAACCC GGGGCTCAACCGCGGGATTGCTTTTGGAACTGTCATGCTAGAGTGCAGGAGGGGTGAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCGGAGGCGAAGGCGGCTCACTGGACTGTAACTGACACTGAGGCTCGAAAGCGTG GGAGCAAACAGGATTAGATACCCTGGTAGTCCACATGGTAAACGATGGATACTCGCTGTTGGCGATATACTGTCAGCGGC CAAAGCGAAAGCATTAAGTATCCCACCTGGGGAGTACGCCGGCAACGGTGAAACTCAAAGGATTGACGGGGCCGCACAAG CGGAGGAACATGTGGTTTAATCGATGATACGCGAGGAACCTTACCGGGCTTAAATTGCAGACGAATTACGAGGAAACTTG TAAAGCCGCAAGGCGTCGTGTGTAAGGTG >93610 TACGTAGGGAGCGAGCGTTGTCCGGAATTACTGGGTGTAAAGGGAGCGTAGGCGGGATCGCAAGTCAGATGTGAAAACTA GTGGGCCTTAACCATAGACTGCATTTGAAACTGTGGTTCTTGAGTGAAGTAGAGGTAAGCGGAATTCCGTAGTGTAGCGG TGAAATGCGTAGA >205713 TACGTAGGTGGCGAGCGTTATCCGGATTTACTGGGTGTAAAGGGTGTGTAGGCGGGACTGCAAGTCAGATGTGAAAACTA TGGGCTCAACTCATAGCTTGCATTTGAAACTGTGGTTCTTGAGGGTCGGAGAGGTAACTGGAATTCCCGGTGTAGCGGTG AAATGCGTAGATATCGGGAGGAACACCAGTGGCGAAGGCGAGTTACTGGACGATACCTGACGCTGAGACACGAAAGTGTG GGGAG >519193 TACGTAGGGGGCAAGCGTTGTCCGGAATAATTGGGCGTAAAGGGCGCGTAGGCGGCTCGGTAAGTCTGGAGTGAAAGTCC TGCTTTTAAGGTGGGAATTGCTTTGGATACTGTCGGGCTTGAGTGCAGGAGAGGTTAGTGGAATTCCCAGTGTAGCGGTG AAATGCGTAGAGATTGGGAGGAACACCAGTGGCGAAGGCGACTAACTGGACTGTAACTGACGCTGAGGCGCGAAAGTGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACACTGTAAACGATGAATGCTAGGTGTAGGGGGTATCGACCCTTCTG TGCCGCAGTTAACACAATAAGCATTCCGCCTGGGGAGTACGGCCGCAAGGTTGAAACTCAAAGGAATTGACGGGGGCCCG CACAAGCAGTGGAGTATGTGGTTTAATTCGACGCAACGCGAAGAACCTTACCAAGTCTTGACATCCTGCGACGGTGCTAG AAATAGTATTTCCTTCGGGACGCAGAGACAGGTGGTGC >240591 TACGTATGGAGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGTGTAGGTGGCCAGGCAAGTCAGAAGTGAAAGCCC GGGGCTCAACCCCGGGACTGCTTTTGAAACTGCAGGGCTAGAGTGCAGGAGGGGCAAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTGCTGGACTGTAACTGACACTGAGGCTCGAAAGCGTG GGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTCGGGGCACATAAGTGCTCCGG TGCCGCAGCAAACGCAATAAGTATTCCACCTGGGGAGTACGTTCGCAAGAATGAAACTCAAAGGAATTGACGGGGACCCG CACAAGCGGTGGAGCATGTGGTTTAATTCGAAGCAACGCGAAGAACCTTACCAAGTCTTGACATCCTCTTGACCGGTCAG TAATGTGACCTTTTTCTTCGGAACAAGAGTGACA >223711 TACGTATGGTGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGTGCGTAGGTGGCAAGGCAAGTCTGAAGTGAAAAATC CGGGGCTCAACCCCGGAACTGCTTTGGAAACTGTTTAGCTGGAGTACAGGAGAGGTAAGTGGAATTCCTAGTGTAGCGGT GAAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGACTTACTGGACTGCTACTGGCACTGAGGCACGAAAAGCC GTAGGGGAGCGAAACAGGAATTTAGATACCCTGGTAGTCCACGCCGTAAACGATAGAATACTAGGTG >107461 TACGTAGGTGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGTGTGTAGGCGGGTCTGCAAGTCAGATGTGAAACTAT GGGCCCAACTCATAGCTTGCATTTGAAACTGTGGATCTTGAGTGTCGGAGAGGTAAATGGAATTCCCGGTGTAGAGGTGA AATTCGTAGATATCGGGAGGAACACCAGTGGCGAAGGCGGTTTACTGGACGATTACTGACGCTGAGACACGAAAGTGTGG GGAGCAAACAGGATTAGATACCCTGGTAGTCCACACTGTAAACGATGAATGCTAGGTGTAGGGGGCGATTGAGCTTCTGT GCCGCAGTTAACACAATAAGCATTCCACTGGGGAGTACGGCCGCAAGGTTGAAACTCAAAGGAATTGACGGGAGCCCGCA CAAGCAGTGGAGTATGTGGTTTAATTCGACGCAACGCGAAGAACCTTACCGGAACTT >98457 TAACGTATGGTGCAAGCGTTATCCGGATTTACTGGGTAGTAAAGGGTGCGTAGGTGGCAAGGCAAGTCTGAAGTGAAAAT CCGGGGCTCAACCCCGGAACTGCTTTGGAAACTGTTTAAGCTTAGAGTACAGGAGAGGTAAGTGGAATTCCTAGTGTAGC GGTGAAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGACTTACTGGACTGGTACTGACACTGAGGCACGAAAG CGTGGGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTTGGGGCCCAAAGGGCT TCGGTCGCCGCCGCAAACCGCA >108870 TACGTATGGTGCAAGCGTTATCCGGTATTTACTTGGGGTGTAAAGGGGAGCGCAGGCGGTTGCGGCAAGTCTGATGTGAA AGCCCGGGGACTCAACCCCGGTACTGCATTGGAAACTGTCGTACTAGAGTGTCGGAGGGGTAAGCGGAATTCCTAGTGTA GCGGTGAAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACGTGGACGATAACTGACGCTGA >114978 GACTGATTCAGGAAGCCGCCTGCGGCAGAAAATTCTGCAGCGCGTCATGAACTACGCACAGAACAACTGTTCCGACGCTC TGCATGGCAAACTGAAAATTTATCCTGACGCTTTCACGGGTATTGCACTCGATATCCTGGCAAAGCAGGATTACCGCAAT ATTCTCACCGACCCGATTCATGCCGGCATGGTCAGCATTCTCAATACGGACAAACAGAGCATTCTCGACAGTCTGCTTCG TTCCAATATTCCACTGAATACACCCATGTGGATTACCGTCCGAGCCGGTAAGCAGGCTAACAGTGTCATGTCCGGTATGA CACTGGAGACATGGGAATGCGGCCTCAAGTTCAAGCCCAAT >150577 TACGTAGGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGACGGTGAAGCAAGTCTGAAGTGAAAGGTT GGGGCTCAACCCCGAAACTGCTTTGGAAACTGTTTAACTGGAGTACAGGAGAGGTAAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGTAGGGAACGAACCACGTGGGCGGAAGGACGGGCGTTA >545503 TACGGAGGATCCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGATGGATGTTTAAGTCAGTTGTGAAAGTTT GCGGCTCAACCGTAAAATTGCAGTTGATACTGGATATCTTGAGTGCAGTTGAGGCAGGCGGAATTCGTGGTGTAGCGGTG AAATGCTTAGATATCACGAAGAACTCCGATTCGCGAAGGCAGACCTAGCTAAGCTGC >100870 TACGTAGGGAGCAAGCGTTGTCCGGATTTACTGGGGTGTAAAGGGTGCGTAGGGCGGCTTTTGCAAGTCAGATGTGAAAT CTATAGGGCTCAACCCATAAACTGCATTTGAAACTGTAGAGCTTGAGTGAAGTAGAGGCAGGCGGAATTCCCCGTGTAGC GGTGAAATGCGTAGAGATGGGGA >243335 TACGTAGGGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGACGGTTTTGCAAGTCTGAAGTGAAAGCC CGGGGCTTAACCCCGGGACTGCTTTGGAAACTGTAGGACTAGAGTGCAGGAGAGGTAAGTGGAATTCCTAGTGTAGCGGT GAAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACTGTAACTGACGTTGAGGCTCGAAAGCGT GGGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGATTACTAGGTGTTGGTGGGTATGACCTATCG GTGCCGCAGCAAACGCAATAAGTAATCCACCTGGGGAGTACGTTCGCAAGAATAGAAAACTCAAAAGGAATTGGACCGGG GACCGCACAAGCGGTGGAGCATGTTGGTTTAATTCGAAGCAACGCGAAGAACCTTACCTGGTCTTGACA >93537 TACGGAGGGTGCGAGCGTTGTCCGGAATCATTGGGCGTAAAGAGTTCGTAGGTGGCCTGTTAAGTCTGGTGTTAAATGCA GATGCTCAACATCTGTTCGGCACTGGATACTGGCAAGCTTGAATGCGGTAGAGGTAAAGGGAATTCCTGGTGTAGCGGTG AAATGCGTAGATATCAGGAGGAACATCGGTGGCGTAAGCGCTTTACTGGGCCGTAATTGACACTGAGGAACGAAAGCCAG GGTAGCAAATGGGATTAGATACCCCAGTAGTCCTGGCCGTAAACGATGGATACTAGGTGTTGCGGGTATCGACCCCTGCA GTGCCGAAGCAAACGCGACTAAGTATCCGCCCTGGGAGGTACGCACGACAGTAGTGAAACTACAAAGG >265749 TACGTAGGTGGCGAGCGTTTATCCGGTAATCGAATTGGGCGTAAAGAGGGAGCAGGCGGCCGCAAGGGTCTGTGGTGAAA GACCGAAAGCTAAACTTCGGTAAGCCATGGAAACCGGGCGGCTAGAGTGCGGAAGAGGATCGTGGAATTCCATGTGTAGC GGTGAAATGCGTAGATATATGGAGGAACACCAGTGGCGAAGGCGACGGTCTGGGCCGCAACTGACGCTCATTCCCGAAGC GTGGGGAGCAAATAGG >534609 TACGTAGGGGGCGAGCGTTGTCCGGAATGATTGGGCGTAAAGGGCGCGTAGGCGGCCTGCTAAGTCTGGAGTGAAAGTCC TGCTTTCAAGGTGGGAATTGCTTTGGATACTGGTGGGCTGGAGTGCAGGAGAGGAAAGCGGAATTACCGGTGTAGCGGTG GAATGCGTAGAGATCGGTAGGAACACCAGTGGCGAAGGCGGCTTTCTGGACTGAAACTGACGCTGAGGCGCGAAAGCGTG GGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCCTAAACGATGTCTACTGGTTGTTGGGGTTTTTTAACCTTTGTA ACGAAGCTAACGCGTGAAGTAGACCGCCTGGGGAGTACGGTCGCAAGATTAAAACTCAAAGGAATTGACGGGGACCCGCA CAAGCGGTGGATGATGTGGATTAATTCGATGCAACGCGAAAAACCTTACCTAGCCTTGACATGCCAGGAATCCTGAAGAG ATTCGGGAGTGCCCGCAAGGGAATCTGGACACAGGTGC >263307 GTACGGAGGATCCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGGCGGACGGCTTAAGTCAGTTGTGAAAGT TTGCGGCTCAACCGTAAAATTGCAGTTGATACTGGGTGTCTTGAGTACAGTAGAGGCAGGCGGAATTCGTGGTGTAGCGG TGAGATGCTTAGATATCACGAAGAACTCCGATTGCGAAGGCAGCCTGCTGGACTGTAACTGACGCTGATGCTCGAAAGTG TGGGTATCAAACAGGATTAGATACCCTGGTAGTCCACACAGTAAACGATGAATACTCGCTGTTTGCGATATACAGTAAGC GGCCAAGCGAAAAGCGTTAAGTATTCCACCTGGGGAGTACGCCGGCAACGGTGAAACTCAAAGGAATTGACGGGGGCCCG CACAAGCGGAGGAACATGTGGTTTAATTCGATGATACGCGAGGAACCTTACCCGGGCTTGAATTGCAACTGAATGATGTG AGACATGTCAGCCGCAAGGC >344513 TACGGAAGGTCCGGGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGGCCGGAGATTAAGCGTGTTGTGAAATGTA GATGCTCAACATCTGCACTGCAGCGCGAACTGGTTTCCTTGAGTACGCATAAAGTGGGCGGAATTCGTGGTGTAGCGGTG AAATGCTTAGATATCACGAAGAACTCCGATTGCGAAGGCAGCTCACTGGGGCGCAACTGACGCTGAAGCTCGAAAGCGCG GGTATACGACGAA >5552 TACGTAGGGGGCGAGCGTTGTCCGGAATCACTGGGCGTAAAGGGCGCGTAGGCGGTATAATAAGTCAGTGGTGAAAACTT GGGGCTCAACCCCGAGCCTGCCACTGATACTGTTAGACTTGAGTATGGAAGAGGAGAATGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGATTCTCTGGGCCAAGACTGACGCTGAGGCGCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGGATACTAGGTGTTAGGAGTTTCGATGCTTCTA GTGCCGGAGTAAACACAATAAGTACTCCCGCCTGGGGGAGTACGGTCGCAAGACTGAAACTCAAGGAATTGGACGGGGGC CCGCACAAGCGGTGGAGCATGTGGTTTAATTCGACGCAACGCGAACGAACCTTAACCAAGACTTGACACTTCCCTTTGAC TAGGATA >561842 TACGTAGGGAGCGAGCGTTGTCCGGAATTACTGGGTGTAAAGGGAGCGTAGGCGGGATCGCAAGTCAGATGTGAAAACTA TGGGCTTAACCCATAAACTGCATTTGAAACTGTGGTTCTTGAGTGAAGTAGAGGTAAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACGACCACTGACGCTGAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTTGGCAGGTAAGACCTGTCGG TGCCGCAGCTAACGCAATAAGTATTCCACCTGGGGAGTACGTTCGCAAGAATGAAACTCAAAGGAATTGACGGGGACCCG CACAAGCGGTGGAGCATGTGGTTTAATCGAAGCAACGCGAAGAACCTTACCAAGTCTTGACATCCCGATGACAGAGTATG TAATGTACTTTCTCTTTCGGAGTCATCGGTGACA >91532 TACGTAGGTGGCGAGCGTTATCCGGAATCATTGGGCGTAAAGAGGGAGCAGGCGGCCGCAAGGGTCTGTGGTGAAAGACC GAAGCTAAACTTCGGTAAGCCATGGAAACCGGGCGGCTAGAGTGCGGAAGAGGATCGTGGAATTCCATGTGTAGCGGTGA AATGCGTAGATATATGGAGGAACACCAGTGGCGAAGGCGACGGTCCCCGTGGGCCGCAACTGACGCTCACTTCCCGAAAG CGGTGGGGAGCAAATAGGATTAGATACCCTAGTAGTCCACGACCGTAAACGATGGTCACTAAGTGGTCGGGGGTACCAAA CCCCGGTGCTGCAGTCAACGCAATAAGTCGACCCGCCTG >340730 TACGTATGGTGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGTGCGTAGGTGGCAAGGCAAGTCTGAAGTGAAAATCC GGGGCTCAACCCCGGAACTGCTTTGGAAACTGTTTAGCTGGAGTACAGGAGAGGTAAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGACTTACTGGACTGCTACTGACACTGGGGCACGAAAGCGTG GGGAGCAAGCAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGCTGGGTTCCAAAGGAACTCGG TGCCGTCGCAAACGCATTAAGTATTCCACCTGGGGAGTACGTTCGCAAGAATGAAACTCAAAGGAATTGACGGGGACCCG CACAAGCGGTGGAGCATGTGGTTTAATTCGACGCAACGCGAAGAACCTTACCAGGTCTTGACATCCAACTTAAACTTACA GAGATGTAAGGTGTGCTTGC >369734 TACGTAGGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGACGGACTGGCAAGTCTGATGTGAAGGCGG GGGCTCAACCCCGGTACTGCATTGGAAACTGGTCATCTAGAGTGTCGGAGGGTAAGTGGAATTCCTAGTGTAGCGGTGAA ATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACGATAACTGACGCTGAGGCTCGAAAGCGTGGG GAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAA >210865 TACGTAGGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGGTGGTACTGCAAGTCAGAAGTGAAAGCCC CGTGCTTAACGTGGGGACTGCTTTTGAAACTGTGGGACTAGAGTGCAGGAGAGGTAAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCGGTGGCGAAGGCGGCTTACTGGACTGTAACTGACACTGAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCTGTAAACGATGAATACTAGGTGTTGGGGAGCGAAGCTCCTCGG TGCCGTCGCAAACGCAATAAGTATTCCACCTGGGGAGTACGTTCGCAAGAATGAAACTCAAAGGAATTGACGGGGACCCG CACAAGCGGTGGAGCATGTGGTTTAATTCGAAGCAACGCGAAGAACCTTACCAAGTCTTGACATCTGGAT >588604 TACGTATGGAGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGTGTAGGTGGCCATGCAAGTCAGAAGTGAAAATCC GGGGCTCAACCCCGGAACTGCTTTTGAAACTGTAAGGCTAGAGTGCAGGAGGGGCGAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGCGAGGCGCTCACTGGACTGTAACTGACACTGAGCT >152931 TACGTAGGGAGCGAGCGTTGTCCGGAATTACTGGGCGTAAAGGGTGCGTAGGCGGCCTGGTAAGTCAGATGTGAAATACC CGTGCTCAACATGGGGGGTGCATCTGATACTGTTAGGCTTGAGTGCAGGAGAGGAAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCCAAGGCACACAGGGGATAGG >548884 TACGTTGGTGGCGAGCGTTATCCGGAATCATTGGGCGTAAAGAGGGAGCAGGCGGCCGCAAGGGTCTGTGGTGAAAGACC GAAGCTAAACTTCGGTAAGCCATGGAAACCGGGCGGCTGGAGTGCGGAAGAGGATCGTGGAATTCCATGTGTAGCGGTGA AATGCGTAGATATATGGAGGAACACCAGTGGCGAAGGCGACGGTCTGGGCCGCAACTGACGCTCATTCCCGAAAGCGTGG GGAGCAAATAGGATTAGGACCTAC >588899 TAAGGAAAAGAAGCGCGGAAATCGCGACTTTATTTCGACAGCGACGTCATCCGCAACTTTATGCGCGGCAAAAGCCCGAA ACACTTGCAAAATAGGATATTTTTGATACAATAAACAAAACCAAAAAGAAGGCTTACAATGGAAAAATACAAAATGACCA CTCCGCTTGTCGAAATGGACGGCGATGAAATGACGCGTATTCTGTGGGCGGACATCAAAGAACTGCTGCTCACTCCTTAC ATCGACCTTAATACCGAATATTACGATCTCGGTCTTCGTCACCGTGACGACACCGACGACAAAGTCACCTTAGACGCCGC GTACGCCACGAAAAATACGGCGTTGCGGTCAAGTGCGCTACGATCACC >328739 TACGGAAGGTCCGGGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGGCCGTTTGTTAAGCGTGTTGTGAAATGTC GGGGCTCAACCTGGGCATTGCAGCGCGAACTGGCAGACTTGAGTGCGCGGGAAGTAGGCGGAATTCGTCGTGTAGCGGTG AAATGCTTAGATATGACGAAGAACTCCGATTGCGAAGGCAGCTCACTGGAGCGCAACTGGCGCTGAAGCTCGAAAGTGCG GGTATCGAACAGGATTAGATACCCTGGTAGTCCGCACGGTAAACGATGGATGCCCGCTGTTGGTCTGAATAGGTCAGCGG CCAAGCGAAAGCATTAAGCATCCCACTGGGGATACGCCGGCAACGGTGAAACGTCAAAGGAATTGACGGGGCCCGCGACA AGCGGAGGAACATGTGGTTAATTCGATGATACGCGAGGAACCTTACCCGGG >112752 TACGTAGGTGGCAAGCGTTGTCCGGATTTACTGGGTATAAAGGGAGCGCAGGCGGGAGAGCAAGTCAGCGGTGAAATACA TGGGCTTAACCCATGAACTGCCGTTGAAACTGTTTTTCTTGAGTGAAGTAGAGGCAGGCGGAATTCCGAGTGTAGCGGTG AAATGCGTAGATATTCGGAGGAACACCAGTGGCGAAGGCGGCCTGCTGGGCGTTTTACTTGACGCTGAGGCTCGAAGACG TGGGGAGGCAAACAAGGATTAGATACCCTGGTAGTCCACGCTGTAAACGATGATTGCTAGGTGT >144065 AACGTAGGGTGCAAGCGTTGTCCGGAATTACTGGGTGTAAAGGGAGCGCAGGCGGGAAGACAAGTTGGAAGTGAAAACCA TGGGCTCAACCCATGAATTGCTTTCAAAACTGTTTTTCTTGAGTAGTGCAGAGGTAGATGGAATTCCCGGTGTAGCGGTG AATGCGTAGATATCGGGAGGAACACCAGTGGCGAAGGCGGTCTACTGGGCACCAACTGACGCTGAGGCTC >509511 TACGTAGGGGGCAAGCGTTATCCGGAATTACTGGGTGTAAAGGGTGCGTAGGTGGTATGGCAAGTCAGAAGTGAAAACCC AGGGCTTAACTCTGGGACTGCTTTTGAAACTGTCAGACTGGAGTGCAGGAGAGGTAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACATCAGTGGCGAAGGCGGCTTACTGGACTGAAACTGACACTGAGGCACGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTCGGGGCCGTAGAGGCTTCGG TGCCGCAGCCAACGCAGTAAGTATTCCACCTGGGGAGTACGTTCGCAAGAATGAAACTCAAAGGAATTGACGGGGACCCG CACAAGCGGTGGAGCATGTGGTTTAATTCGAAGCAACGCGAAGAACCTTACCTGGTCTTGACATCCTT >266208 TACGTAGGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGATGGCATGGCAAGTCTGAAGTGAAAGCCC GGGGCTTAACCCCGGGACTGCTTTGGAAACTGTTAAGCTAGAGTGCAGGAGAGGTAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCGGTGGCGAAGGCGGCTTACTGGACTGTAACTGACATTGAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTTGGGGAGCATAAGCTCTTCG GTGCCGGCGCAAACGCATTAAGTATTCCCACCTGGGGAGTACGTTCGCAAGAATGAAACTCAAAAGGATTGACGGGGACC CGCACAAGCGGTGGAGCATGTGGTTTAATCGACGCAACGCGAAGACCTTACCAAGTCTTGACATCCCGTGACCGGTCAGT AACGTGTACCTTTTTCTC >240686 TACGTATGGAGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGTGTAGGTGGTATCACAAGTCAGAAGTGAAAGCCC GGGGCTCAACCCCGGGACTGCTTTTGAAACTGTGGAACTGGAGTGCAGGAGAGGTAAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACTGTAACTGACACTGAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTCGGGGCTCATAAGAGCTTCG GTGCCGCAGCAAACGCAATAAGTATTCCACCTGGGGAGTACGTTCGCAAGAATGAAACTCAAAAGGAATTGGACCGGGGA CCCGCGACAAGCGGTGGAGCATGTGGTCTAATCGAAGCAACGCGAAGAACCTTACCAAGTCTTAGACATCCTTCTGACCG GACAGTAATGT >339472 TACGTAGGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGACGGAGCAGCAAGTCTGATGTGAAAGGCG GGGGCTCAACCCCCGGACTGCATTGGAAACTGTTGATCTTGAGTACCGGAGAGGTAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACGGTAACTGACGTTGAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAAGATACCTTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTCGGGTGGCAGGGCCATTCG GTGCCGCAGCAAACGCAGTAAGTATTCCACCTGGGGAGTACGTTCGCAAGAATGAAACTCAAAGGAATTGACGGGGACCC GGCACAAGCGGTGGAGCGATGTGGTTTAATTCGAAGCAACGCGAAGAACCTTACCAAGTCTTGACATACCCTCTGACCGG TGAGTAACGTCACCCTTCCTTCGGG >78316 TACGTAGGGAGCGAGCGTTGTCCGGAATTACTGGGTGTAAAGGGAGCGTAGGCGGGATCTTAAGTCAGGTGTGAAAACTA TGGGCTCAACCCATAGACTGCACTTGAAACTGAGGTTCTTGAGTGAAGTAGAGGCAGGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACATCAGTGGCGAAGGCGGCCTGCTGGGCTTTTACTGACGCTGAGGCTCGAAAGCGTG GGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCTGTAAACGATGAATACTAGGTGTAGGGGTTGTCATGACCTCTGT GCCGCCGCTAACGCATTAAGTATTCCGCCTGGGGAGTACGGTCGCAAGATTAAAACTCAAAGGAATTGACGGGGGCCCGC ACAAGCAGCGGAGCATGTGGTTTAATTCGAAGCAACGCGAAGAACCTTACTAGACTTGACATCTCCTGCATTACTCTTAA TCGAGGAAGTCCC >570817 TACGTATGGTGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGCAGGCGGTGCGGCAAGTCTGATGTGAAAGCCC GGGGCTCAACCCCGGTACTGCATTGGAAACTGTCGTACTAGAGTGTCGGAGGGGTAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGATTACTGGACGACAACTGACGCTGAAACACGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATGCTAGGTGTAGGCAAGAAATTGTCTGTGC CGGAGTAAACACAATAAGCATTCCACCTGGGGATACGGCCGCAAGGTTGAAACTCAAAGGAATTGACGGGAGCCCGCACA AGCAGTGGAGTATGTGGTTTAATCGACGCAACGCGAAGAACCTTA >487725 TACGTAGGGAGCGAGCGTTGTCCGGAATTACTGGGTGTAAAGGGAGCGTAGGCGGGATCGCAAGTCAGATGTGAAAACTA TGGGCTTAACCCATAAACTGCATTTGAAACTGTGGTTCTTGAGTGAAGTAGAGGTAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACATCAGTGGCGAAGGCGGCTTACTGGGCTTTAACTGACGCTGAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTTGGGGAGCATAAGCTCTTCG GTGCCGGCGCAAACGCATTAAGTATTCCACCTGGGGAGTACGTTCGCAAGAATGAAACTCAAAGGAATTGACGGGGACCC GCACAAGCGGTGGAGCATGTGGTTTAATTCGACGCAACGCGAAGAACCTTACCAAGTCTTGACATCCCGGGTGACCCGGG ATGGTAACGCATCCCTTTTTCTTCGGAACACCGGTGACAGGTGGTGCATT >254841 TACGTAGGGTGGCAAGCGTTGTCCGGAATTATTGGGACGGTAAAGCGCGCGCAGGCGGCTTCTTAAGTCCATACCTTAAA AAGGTGCGGGGCTTAACCCCGGTGATGGGTATGGAAACTGGGAGGCTGGAGTATCGGAGAGGAAAGTGGAATTCCTAGTG TAGCGGTGAAATAGCGTAGAGATTAGG >511687 TACGGAGGATCCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGGCGGACTATTAAGTCAGCTGTGAAAGTTT GCGGCTCAACCGTAAAATTGCAGTTGATACTGGTCGTCTTGAGTGCAGTAGGAGGTAGGCGGAATTCGTGGTGTAGCGGT GAAATGCTTAGATATTACGAAGAACTCCGATTGCGAAGGCAGCTTACTGGACTGTAACTGACGCTGATGCTCGAAAGTGT GGGTATACAAACAGGATTAGA >210791 TACGTAGGTGGCAAGCGTTGTCCGGATTTACTGGGTGTAAAGGGCGTGCAGCCGGGCAGGCAAGTCAGATGTGAAATCTG GAGGCTTAACCTCCAAACTGCATTTGAAACTGTCTGTCTTGAGTATCGGAGAGGTAATCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAAGAACACCAGTGGCGAAGGCGGATTACTGGACGACAACTGACGGTGAGGCG >114292 TACGGAAGGTCCGGGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGCAGGCCGTCCTTTAAGCGTGCTGTGAAATGCC GCGGCTCAACCGTGGCACTGCAGCGCGAACTGGAGGACTTGAGTACGCACGAGGTAGGCGGAATTCGTGGTGTAGCGGTG AAATGCTTAGATATCACGAAGAACTCCGATTGCGAAGGCAGCTTACCGGAGCGCAACTGACGCTGAGGCTCGAAAGCGCG GGTATCGAACAGGATTAGATACCCTGGTAGTCCGGCGCGGTAAACGATGGATGCCCGCCGTTGGGATTTGGATTTCAGCG GCCAAGCGAAAGCGTTAAGCACTCCCACCTGGGGAGTACGCCGGCAACGGTGAAACTC >114029 TACGGAAGGTCCGGGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGGCCGGAGATTAAGCGTGTTGTGAAATGTA GTGGCTCAACCTCTGCACTGCAGCGCGAACTGGTCTTCTTGAGTACGCACAACGTGGGCGGAATTCGTGGTGTAGCGGTG AAATGCTTAGATATCACGAAGAACTCCGATTGCGAAGGCAGCTCACGGGAGCGCAACTGACGCTGAAGCTCGAAAGTGCG GGTATCGAACAGGATTAGATACCCTGGTATTCCACGCCGTAAACGATGATGGCTAACCGCCGGCGACACACTGTCGGTGG CCAAGCGAAAGCGATAAGCCATCCACCTGGGGAGTACGTCGGCACGATGAAACTCAAAGGAATTGGAC >540283 TACGGAGGATCCAAGCGTTATCCGGATTTATTGGGTTTAAAGGGTGCGTAGGCGGTTTGATAAGTTAGAGGTGAAATACC GGGGCTCAACTCCGGAACTGCCTCTAATACTGTTGAACTAGAGAGTAGTTGCGGTAGGCGGAATGTATGGTGTAGCGGTG AAATGCTTAGAGATCATACAGAACACCGATTGCGAAGGCAGCTTACCAAACTATATCTGACGTTGAGGCACGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCAGTAAACGATGATAACTCGTTGTCGGCGATACACAGTCGGTGA CTAAGCGAAAGCGATAAGTATCCACCGTGGGGAGTACGTCGCAAAGAATGAAACTCAAAGGAATTGGACGGGGGCCCGCA CAAGCGGAGGAACATGT >584265 TACGTATGGTGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGACGGCTGTGTAAGTCTGAAGTGAAAGCCC GGGGCTCAACCCCGGGACTGCTTTGGAAACTATGCAGCTAGAGTGTCGGAGAGGTAAGTGGAATTCCCAGTGTAGCGGTG AAATGCGTAGATATTGGGAGGAACACCAGTGGCGAAGGCGGCCTGCTGGGCTTTAACTGACGCTGAGGCACGAAAGCGTG GGTAGCAAACAGGATTAGATACCCTGGTAGTCCACGCTGTAAACGATGATTACTAGGTGTGGGGGGTCTGACCCTTCCGT GCCGGAGTTAACACAATAAGTAATCCACCTGGGGAGTACGGCCGCAAGGTTGAAACTCAAAGGAATTGACGGGGGCCCGC GACAAGCAGTGGAGTATGTGGTTTAATTCGAAGCAACGCGAAGAACCTTACCAGGTCTTGACATCCTACTAACGAGATA >162529 TACGGAGGATGCAAGCGTTATCCGGATTTATTGGGTTTAAAGGGTGCGTAGGCGGCACGCCAAGTCAGCGGTGAAATTTC CGGGCTCAACCCGGACTGTGCCGTTGAAACTGGCGAGCTAGAGTACACAAGAGGCAGGCGGAATGCGTGGTGTAGCGGTG AAATGCATAGATATCACGCAGAACCCCGATTGCGAAGGCAGCCTGCTAGGGTGAAACTGACGCTGAGGCGCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCTGTAAACGATGAATACTAGGTGTGGGAGGACTGACCCCTTCGT GCCGCAGTTAACACAATAAGTATTCCACCTGGGGAGTACGACCGCAAGGTTGAAACTCAAAGGAATTGACGGGGCCCGCG ACAAGCAGTGGATTATGTGGTTTAATTCGACGCAACGCGAAGAACCTTACCAGG >103639 TACGTAGGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGACGGTGTGGCAAGTCTGATGTGAAAGGCA TGGGCTCAACCTGTGGACTGCATTGGAAACTGTCATACTTGAGTGCCGGAGGGGTAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACGGTAACTGACGTTGAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTCGGGGAGCATGGCTCTTCGG TGCCGTCGCAAACGCAGTAAGTATTCCACCTGGGGATACGTTCGCAAGAATGAAACTCAAAGG >314793 TACGTAGGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGACGGACTGGCTAAGTCTGATGTGAAAGGC GGGGGCTCAACCCCTGGACTGCATTGGAAACTGTTAGTACTTGAGTGCCGGAGAGGTAAGCGGAATTCCTAGTGTAGCGG TGAAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACGGTAACAGACGTTGAGGCTCGAAAGCG TGGGGAGCAAACAGGATTAG >134929 ATACGGAGGATGCGAGCGTTATTCCGGATTTATTGGGTTTAAAGGGAGCGCAGACGGGAGATTAAGTCAGTTGTGAAAGT TTGCGGCTCAACCGTAAATTGCAGTTGATACTTGGTTTCCTTGAGTGCAGTTGAGGCAGGCGGAATTCGTGGTGTAGCGG TGAAATGCTTAGATATCACGAAGACCCCGATTGCGAAGGCAGCTTGCTAAACTGTAACTGACGTTTCATG >571389 TACGGAGGATCCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGATGGATGTTTAAGTCAGTTGTGAAAGTTT GCGGCTCAGCCGTAAAATTGCAGTTGATACTGGATATCTTGAGTGCAGTTGAGGCAGGCGGAATTCGTGGTGTAGGCGGT AGAAATGCTTAGA >10857 TACACCCAAACAAATCACCAACCATACCAAACATCCGGTACGCTTCCTGAGTGCCGCCTCCAATGGAACATTATGCTATG GATATGATGGCGAAATCTACACGGTAAAAGAAGATGCCATTCCGCAAAAAGTTCAGATTTCCATTGTCACCGACAAGAAC GACAAAGATCTCATCCGCCAGATCAAGCGTAGCGGAGCAACAGAGATATCCCTTTCGCCCGATGCAAAGGAAATTGCTTC TGTACTACGCGGAGATGTATATGTCACATCAACAGAATACAGCACTACCAAACAAATCACCAATACTCCGCAACAGGAAC GCGATATTCACTTTTCTCCGGACGGAAGAAGTATTGTTTACGCTTCCGAAAGAAACGGATTATGGCAGATTTTATCAAAC CAGTCTAGCTAAAAAGGAAGAAAAACAGTTCGCTTACGCAACCGATATCAAAGAGGAAAGACTGACCAATTCGGATATCA C >77467 TACGTAGGGAGCGAGCGTTGTCCGGAATTACTGGGTGTAAAGGGAGCGTAGGCGGGATCGCAAGTCAGATGTAGAAAACT ATGGGCTTAAACCCAATAAAACTGCATTTGAAAACTGTGGTTCTTGAGTGAAGTAGAGGTAAGCGGAATTCCTAGTGTAA GCGGTGAAATGCGTAGATATTAGGAGGAACATCAGTGGCGAAGGCGGCTTACTGGGCTTTAAACTGACGCTG >511558 TACGTAGGGAGCGAGCGTTGTCCGGAATTACTGGGTGTAAAGGGAGCGTAGGCGGGACGGCAAGTCAGATGTGAAATACA TGGGCTCAACCCATGGGCTGCATTTGAAACTGCTGTTCTTGAGTGAAGTAGAGGTAAGCGGAATTCCTGGTGTAGCGGTG AAATGCGTAGAGATGGGGAGAACACCAGTGGCGAAGGCGGCCTGCTGGGCTTTAACTGACGCTGAGGCACGAAAGCGTGG GTAGCAAACAGGATTAGATACCCTGGTAGTCCAACGCTGTAAACGATGATTACTAGGTGTGGGGGTCTGACCCCTTCCGT GCCGGAGTTAAC >589130 TACGGAGGATGCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGTGCGTAGGCGGCGATGCAAGTCAGCGGTAAAAGGCC GGGCGTCAACCCGGCGAGCCGTTGAAACTGCAGTGCTAGAGAAGGCGAGAGGTACGCGGAATGCACAGTGTAGCGGTGAA ATGCTTAGATATTGCGCAGAACTCCGATTGCGAAGGCAGCGTACTGGCGCCTGACTGACGCTGAGGCACGAAAGCGTGGG GATCGAACAGGATTAGATACCCTGGTAGTCCACGCAGTAAACGATGAATGCCGGCTGTTCGGGTTGATTGAGACCTGAGC GGCGAAGCGAAAGCGATAAGCATTCCACCTGGGGAGTACGCCGGCAACGGTGAAACTCAAAGGAATTGACGGGGGCCCGC ACAAGCGGAGGAACATGTGGTTTAATTCGATGATACGCGAGGAACCTTACCCGGGCTTAACTA >218005 TACGTAGGTGGCAAGCGTTGTCCGGATTTACTGGGTGTAAAGGGCGTGTAGCCGGGAGGGCAAGTCAGATGTGAAATCCA CGGGCTCAACTCGTGAACTGCATTTGAAACTACTCTTCTTGAGTATCGGAGAGGCAATCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGTCAACTGGACGATAACTGACGCTGAGGCGCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTGGGGGGACTGACCCCTTCCG TGCCGCAGTTAACACAATAAGTATTCCACCTGGGGAGTACGACCGCAAGGTTGAAACTCAAAGGAATTGACGGGGGCCCG CACAAGCAGTGGATATGTGGTTTAATTCGAAGCAACGCGAAGAACCTTACCAGGGCTTGACAT >241853 AACGTAGGGTGCAAGCGTTGTCCGGAATTACTGGGTGTAAAGGGAGCGCAGGCGGGAAGACAAGTTGGAAGTGAAAACCA TGGGCTCAACCCATGAATTGCTTTCAAAACTGTTTTCTTGAGTAGTGCAGAGGTAGATGGAATTCCCGGTGTAGCGGTGG AATGCGTAGATATCGGGAGGAACACCAGTGGCGAAGGCGGTCTACTGGGCACCAACTGACGCTG >568881 TACGTAGGTGGCAAGCGTTGTCCGGATTTACTGGGTGTAAAGGGCGCGTAGGCGGGATGGCAAGTCAGATGTGAAATCCA TGGGCTCAACCCATGAACTGCATTTGAAACTGTCGTTCTTGAGTATCGGAGAGGCAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTGCTGGACGACAACTGACGCTGAGGCGCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTGGGGGGACTGACCCCCTCCG TGCCGCAGTTAACACAATAAGTATTCCACCTGGGGAGTACGGCCGCAAGGTTGAAACTCAAAGGAATTGACGGGGCCCGC ACAAGCGGAGGAACATGTGGTTTAATTCGATGATACGCGAGGAACCTTACCCGGGCTTAAATTGCAGATGAATTACGGTG AAAGCCGTAAAGCCGCAAGGCATCTGT >136925 TACGTAGGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGGCGGCGGAGCAAGTCAGAAGTGAAAGCCC GGGGCTCAACCCCGGGACGGCTTTTGAAACTGCCCTGCTTGATTTCAGGAGAGGTAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACTGACAATGACGCTGAGGCTCGAAAAGCGT GGGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTCGGGAGCCAAAAGGCTTTC GGTGCCGCAGCAAACGCAATAAGTATTCCACCTGGGGAGTACGTTCGCAAGAATGAAACTCAAAGGAATTGACGGGGACC CGCACAAGCGGTGGAGCATGTGGTTTAATTCGAAGCAACGCGAAGAACCTTACCAGGTCTTGACATCTGGCTAACGAAGT AGAGATACA >165369 GCAGGAAATTATACCATAGCCACATATTAGAAGCCAGTTCCGTGTTATCCCATGCAAAACCTCCGATGTCATAACGCCAG GTATGGCGGACAGGATCGTATGCATGCATCACATCCCCATAATTCCAGAAACCATACCATTTGTTTTGTTCTATCGCTTT TTGATAGAAGCTGATATAAGCATCCAGCCTGTCTTCCACCCGGGCACGGAAAGGAGTACTACGATCGGGAAGGCTCCAAA CACCAAACGCCTGCTTGGCATGCAAATAGTCAGGTACAGGCATC >236118 TACGTATGGTGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGACGGATAAGCAAGTCTGGAGTGAAAGCCC GGGGCTCAACCCCGGGACTGCTTTGGAAACTGTTAATCTAGAGTGCTGGAGAGGTAAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACAGTGACTGACGTTGAGGCTCGAAAGCGTG GGGA >237963 TACGTATGGAGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGTGTAGGTGGCCATGCAAGTCAAGAAAGTAAAAAG TCCGGGGCTCCAACCCCGGAACTGCTTTTGAAACTGTAAGGCTAGAGTGCGAGGAGGGGTGAGTGGAATTCCTAGTGTAG CGGTAGAAATGCGTAGATAGTAGG >204177 GTATTCCACCTGGGGAGTACGCTCGCAAGAATGAAACTCAAAGGAATTGACGGGGACCCGCACAAGCGGTGGAGCATGTG GTTTAATTCGAAGCAACGCGAAGAACCTTACCAAATCTTGACATCGATCCGACGGACCGTAATGGGTCCTTTCCTTCGGG GACGGAGAAGACAGGTGGTGCATGGTTGTCGTCAGGCTCGTGTCGTGAGATG >332464 TACGTAGGGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGTGTAGGTGGCTGTGCAAGTCAGGAGTGAAAGCC CGGGGCTCAACCCCGGGACTGCTCTTGAAACTGTGCGGCTTGAGTGCAGGAGGGGCAGGCGGAATTCCTAGTGTAGCGGT GAAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACGATAACTGACGCTGAGGCTCGAAAGCGT GGGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTCGGGGAGCATTGCTCTTCG GTGCCGCAGCAAACGCAATAAGTATTCCACCTGGGGAGTACGTTCGCAAGAATGAAACTCAAAGGATTGGACGGGGACCC GCACAAGCGGTGGAGCATGTGGTTTAATCGAAGCAACGCGAAG >303295 TACGTAGGGAGCGAGCGTTGTCCGGAATTACTGGGTGTAAAGGGAGCGTAGGCGGGATCGCAAGTCAGATGTGAAAACTA TGGGCTTAACCCATAAACTGCATTTGAAACTGTGGTTCTTGAGTGAAGTAGAGGTAAGCGGAACTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACATCAGTGGCGAAGGCGGCTTACTGGGCTTTAACTGACGCTGAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGATTACTAGGTGGTGGGGGGACTGACCCCTTCC CGTACCGCAGCAAACGCAAATAAGTAATCCACCGTGGGGAGTACGACCGGCAAGGTTAGAAACTACGAAAGGAA >76933 GGAAGAACTTCTGGCTAAGGAACAAGTGACTGCATACATTGGTTTCGACCCTACTGCGGACTCTTTGCACATCGGGCACC TTTGCAGTGTGATGATTTTGCGTCACTTCCAGCGTTGCGGACACAAGCCGTTGGCACTGATTGGCGGTGCTACGGGTATG ATTGGTGACCCTTCCGGAAAGTCTGCCGAACGCAATCTGCTTACGGAAGAGACGTTGCAGCGCAACTTGGCCGGTATGAA GGCCCAGCTCTCCAAGTTCCTGGATTTTGATTCGGATGCCCCCAACCGTGCCGAGTTGGTGAACAACTACGATTGGATGA AGAACTTCACTTTCCTCGATTTTGCCCGTGAAGTGGGTAAGCACATCACCGTGAACTATATGATGGCGAAAGATTCTGTA AAGAAGCGTCTGAACGGTGAGGCACGTGACGGTCTTTCCTTCACGGAATTCACCTACCAGCTGTTGCAGGGGTAC >565375 TACGTAGGTGGCAAGCGTTATCCGGAATTATTGGGCGTAAAGGGTGCGTAGGCGGTGTATTAAGTCTGAAGTAAAATCGT GGGGCTCAACCCATCAAGCTTTGGAAACTGGTAGACTAGAGTGCAGTAGAGGCAGATGGAATTCCATGTGTAGACGGTAA AATGCGTAGATATAGT >244674 TACGGAGGATCCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGGCGGGTGCTTAAGTCAGTTGTGAAAGTTT GCGGCTCAACCGTAAAATTGCAGTTGATACTGGGCGCCTTGAGTGCAGCATAGGTAGGCGGAATTCGTGGTGTAGCGGTG AAATGCTTAGATATCACGAAGAACTCCGATTGCGAAGGTCAGTCTTACGTGGAC >541076 TACGGAGGATCCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGGCGGGGTATTAAGTCAGTTGTGAAAGTTT GCGGCTCAACCGTAAAATTGCAGTTGATACTGGTATCCTTGAGTGCAGCAGAGGTGGGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCGGTGGCGAAGGCGACTTTCTGGACAATAACTGACGTTGAGGCACGAAAGTGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACACCGTAAACGATGGATACTAGGTGTAGGAAATGATTTCATTTTCT GTGCCGTCGCAAACGCAATAAGTATCCCACCTGGGGATACGGCCGCAAGGTTGAAACTCAAAGGATTGGACGGGGCCCGC ACAAGCAGGTGGAGTATGGTGGTTTAATTCGAAGCAAC >10660 TACGTAGGTGGCGAGCGTTATCCGGATTTACTGGGTGTAAAGGGCGCGTAGGGCGGGGATAGCAAGTCAGATGTGAAATC CGTGGGCTCAACCCACGAACTGCATTTGAAACTGTTATTCTTGAGTGATGGAGAGGCAAGCGGAATTCCTAGTGTAGCGG TGAAATGCGTAGATA >261919 TACGTAGGGAGCAAGCGTTATCCGGATTTATTGGGTGTAAAGGGTGCGTAGACGGGACAACAAGTTAGTTGTGAAATCCC TCGGCTTAACTGAGGAACTGCAACTAAAACTATTGTTCTTGAGTGTTGGAGAGGAAAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATAAGGAAGAACACCAGTGGCGAAGGCGGTCTACTGGACAGTAACTGACGCTGAGGCGCGAGAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCTGTAAACGATGAATACTAGGTGTGGGAGGACTGACCCCTTCCG TGCCGCAGTTAACACAATAAGTATTCCACCTGGGGAGTACGGCCGCAAGGTTGAAACTCAAAGGAATTGACGGGGGCCCG CACAAGCAGTGGATTATGTGGTTTAATTCGAAGCAACGCGAAGAACCTTACCAGGGCTTGACATCCAACTAACGAAGCAG AGATGCA >143463 TACGGAAGGTCCGGGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGGCCGGAGATTAAGCGTGTTGTGAAATGTA GACGCTCAACGTCTGCACTGCAGCGCGAACTGGTCTTCTTGAGTACGCACAACGTGGGCGGAATTCGTGGTGTAGCGGTG AAATGCTTAGATATCCCCCCAAGAAGAACTCGATTGCGAAGGCAGCTCACGTGGA >522127 TACGTAGGGGCGAGCGGTTATCCGGATTTATTGGGCGTAAAGCGTGTGTAGGCGGTTTATTAAGTCCGAGATGAAAGGCT GAGGCTTAACCTCAGTTTGTTTCGGAAACTGGTAGACTAGAGTGCAGTAGAGGCAATTGGAATTCATAGTGTAGCGGTAA AATGCGTAGATATTATGAGGAACATCAGTGGCGAAGGCGAATTGCTGGGCTGTTACTGACGCTGAGACACGAAAGCGTGG GAGCAAATAGGATTAGATACCCTAGTAGTCCAACGCCGTAAACGATGAGCACGTAAGTGTCCGGGCAACCGGTGCTGAAG TTAACACATTAAGTGCTCCGCCGTGAGTAGTACGGTCGCAAGACTAGAAACTCAAAGGGAACTTG >258229 TACGTAGGTGGCAAGCGTTGTCCGGATTTACTGGGTGTAAAGGGCGTGTAGCCGGGAGGGCAAGTCAGATGTGAAATCCA CGGGCTCAACTCGTGAACTGCATTTGAAACTACTCTTCTTGAGTATCGGAGAGGCAATCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGATTGCTGGACGACAACTGACGGTGAGGCACGAAAGTGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACACCGTAAACGATGGATACTAGGTGTAGGGAGCATTAAGTTTCTGT GCCGTCGCAAACGCAAATAAGTATCCCACCTGGGGAGTACGGCCGCAAGGTTGAAAACTCAAAGGAAGTTGACGGGGGCC CGCGACAAGCAGTGGAGTATGTGGTTTAATTCGACGCAACGCGAAGAACCTTA >172221 TACGTAGGGAGCGAGCGTTGTCCGGAATTACTGGGTGTAAAGGGAGCGTAGGCGGGACTGCAAGTCAGATGTGAAAACTA TGGGCTCAACCTGTAGATTGCATTTGAAACTGTGGTTCTTGAGTGAAGTAGAGGTAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACATCGGTGGCGAAGGCGGCTTACTGGGTCTTTTACTGACGCTGAGGCTCGAAAGCGT GGGGAGCAAACAGGATTAGATACCCTGGTACGTCCACGCTAGTAAACGATGATTACGTAGGTGGTGGGGG >561793 TACGGAGGGTGCAAGCGTTGTCCGGAATCATTGGGCGTAAAGAGTTCGTAGGCGGCATGTAAAGTCAGGTGTTAAAGGCT GAGGCTCAACCTCAGTATGGCACTTGATACTTGCAAGCTAGAATGCGGTAGAGGTAAAGGGAATTCCTGGTGTAGCGGTG AAATGCTTAGATATCAGGAGGAACATCGGTGGCGTAAGCGCTTTACTGGGCCGTAATTGACGCTGAGGAACGAAAGCCAG GGTAGCAAATGGGATTAGATACCCCAGTAGTCCTGGCCGTAAACGATGAATACTAGGTGTCGGGGGCTCATAAGAGCTTC GGTGCCGCAGCAAACGCAATAAGTACTCCACCTGGGGAGTACGTTCGCAAGAATGAAACTCAAAGGAATTGACGGGACCC GCACAAGCGGTGGAGCATGTGGTTTAATTCGAAGCAACGCGAAGACCTTACCAGTCTTGACATCCTTCTGACCGGACAGT AATGT >548838 TACGGAAGATGCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGGCGGGCTTTTAAGTCAGCGGTCAAATGTC GTGGCTCAACCATGTCAAGCCGTTGAAACTGTAAGCCTTGAGTCTGCACAGGGCACATGGAATTCGTGGTGTAGCGGTGA AATGCTTAGATATCACGAAGAACTCCGATCGCGAAGGCATTGTGCCGGGGCATAACTGACGCCTAGAGGCGTCGAAAGTG CGGGGTATCAAACAGGATTAGATACCCTGGTAGTCCGCACGGTAAACGATGAAGTGACTCGCTATGGGCGATATATTGT >330803 TACGTAGGTGGCAAGCGTTGTCCGGATTTACTGGGTGTAAAGGGCGTGTAGCCGGGAGGGCAAGTCAGATGTGAAATCCA CGGGCTTAAACTCGTGAACTGCAATTTGAAACTGTTCTTCTTGAGTATCGGAGAGGCAATCGGAATTCCTAGTGGTAGAC GGTGAAATGCGTAGATATTAGGAGGAA >88682 TACGTAGGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGACGGACTGGCAAGTCTGATGTGAAAGGCG GGGGCTCAACCCCTGGACTGCATTGGAAACTGTTAGTCTTGAGTGCCGGAGAGGTAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGACTTTCTGGACAGTAACTGACGTTGAGGCACGAAAGTGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACACCGTAAACGATGGATACTAGGTGTAGGGTGTGATAAACATTCTG TGCCGTCGCAAACGCAATAAGTATCCCACCTGGGGAGTACGGCCGCAAAGGTTGAAACTCAAAGGAATTGACGGGGGCCC GCACAAGCAGTGGAGTATGTGGTTTAATTCGACGCAACGCGAAGAACCTTACCAGGGCTTGACATATACAGGAATATATA AGAG >148678 AACGTAGGTCACAAGCGTTGTCCGGAATTACTGGGTGTAAAGGGAGCGCAGGCGGGAAGACAAGTTGGAAGTGAAATCTA TGGGCTCAACCCATAAACTGCTTTCAAAACTGTTTTTCTTGAGTAGTGCAGAGGTAGGCGGAATTCCCGGTGTAGCGGTG AAATGCGTAGATATTCGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGGCTCTAACTGACGCTGAGGCACGAAAGCATG GGTAGCAAACAGGATTAGATACCCTGGTAGTCCATGCTGTAAACGATGAATGCTAGGTGTGGGGGGACTGGACCCCTTCC GTGCCGGAGTTAACACAATAAGCATTCCACCTGGGGAGTACGACCGCAAGGTTGAAACTCAAAAGGAATTGACGGGGCCC GCGACAAGCAGTGGAGTAGTGTGGTTTAATTCGAAGC >469382 TACGGAGGATCCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGTGCGTAGGCGGCCTTTTAAGTTCAGCGGTGAAAGTC TGTGGCTCAACCATAGAATTGCCGTTGAAACTGGGGGGCGTTGAGTATGTTTGAGGCAGGCGGAATGCGTGGTGTAGCGG TGAAATGCATAGATATCACGCAGAACCCCGATTGCGAAGGCAGCCTGCCAAGCCATTACTGACGCTGATGCACGAAAGCG TGGGGATCAAACAGGATTAGATACCCTGGTAGTCCACGCAGTAAACGATGATCACTAGCTGTTTGTGATACACTGTAAGC GGCACAGCGAAAAGCGTTAAAGTGACTCCCACCGTGGGGGAGTACC >287759 TACGGAGGGTGCAAGCGTTAATCGGAATTACTGGGCGTAAAGCGCACGCAGGCGGTTTGTTAAGTCAGATGTGAAATCCC CGGGCTCAACCTGGGAACTGCATCTGATACTGGCAAGCTTGAGTCTCGTAGAGGGGGGTAGAATTCCAGGTGTAGCGGTG AAATGCGTAGAGATCTGGAGGAATACCGGTGGCGAAGGCGGCCCCCTGGACGAAGACTGACGCTCAGGTGCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGTCGACTTGGAGGTTGTGCCCTTGAGGCGTGGC TTCCGGAGCTAACGCGTTAAGTCGACCGCCGTGGGGGGTACGCCGCAAAGGTTAAACTCAAATGAATTGACGGGGCCCGC ACAAGCGGTGAGCATGTGGTTTAATCGATGCAACGCGAACGAACCTTTACCGTGGTCTTGAC >512157 TACGTAGGTGGCAAGCGTTGTCCGGATTTATTGGGTGTAAAGGGCGTGCAGCCGGGTCTGCAAGTCAGATGTGAAATCCA TGGGCTCAACCCATGAACTGCATTTGAAACTGTAGATCTTGAGTGTCGGAGGGGCAATCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGAACACCAGTGGCGGAAGGCGGATTGCTGGACGATACGTGACGGCGAGGCGACG >279132 TTACTGGGTGCTTAATTTGAAAGACGGCAAACTGCAACAATTGGGCAAAAGCTTGCCGGAAGCTACCTTGATGTTCGCCA AGTTCTCGCCGGATGCCAGCCGGGTAGCATATGTCTCCAGAAACAACATTTATGTAGAGAGTCTGGTTGACGGGAAAATC AACCAACTAACTCAAGACGGAAATAATGAAATTGTAAACGGAACATTCGACTGGGTATACGAAGAAGAATTCAACTGCCG CGACGGTTTCCGCTGGAGTCCCGACGGGCAATACATAGCCTATTTGCAAAGCGATACCCAAGGTACGGGATGGTTTGATA TCATCAATAATGTAGATTCCATTTATCCTAAAATCCAACGTTTTCCCTACCCTAAAGCCGGAACAGCAAACTCCGCTGTA AAAGTAGGCTATGTATCAGCCGACGGTGGAAACACCACTTGGCTGGCTCTTCCAGTGA >521453 TACGGGGGATGCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGCGCGTAGGCGGGACGCCAAGTCAGCGGTAAAAGACT GCAGCTAAACTGTAGCACGCCGTTGAAACTGGCGACCTGGAGACGAGACGAGGGAGGCGGAACAAGTGAAGTAGCGGTGA AATGCTTAGATATCACTTGGAACCCCGATAGCGAAGGCAGCTTCCCAGGCTCGATCTGACGCTGATGCGCGAGAGCGTGG GTAGCGAACAGGATTAGATACCC >542003 AACGTAGGGTGCAAGCGTTGTCCGGAATTACTGGGTGTAAAGGGAGCGCAGGCGGGAAGACAAGTTGGAAGTGAAAACCA TGGGCTCAACCCATGAATTGCTTTCAAAACTGTTTTTCTTGAGTAGTGCAGAGGTAGATGGAATTCCCGGTGTAGCGGTG GAATGCGTAGATATCGGGAGGAACACCAGTGGCGAAGGCGGTCTACTGGGCACCCAATGACGCTGA >580835 TACGGAGGATGCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGTGCGTAGGTGGTTTCTTAAGTCAGCGGTGAAAGTTT GTGGCTTAACCATAAAATTGCCATTGATACTGGGAGACTTGAGTATGTTTGAGGTAGGCGGAATGCGTGGTGTAGCGGTG AAATGCATAGATATCACGCAGAACTCCGATTGCGAAGGCAGCTTGCCAAGCCATAAACTGACACTGAAGCACGAAAGCGT GGGTATCAAACAGGATTAGATACCCTGGTAGTCCACGCAGTAAACGATGATTACTAGGAGTTTGCGATATAGTGTAAGCT CTACAGCGAAAGCGTTAAGAATCCACCTGGGGATACGCCGGCAACGGTGAAACTCAAAGGAATTGACGGGGGCCCGCACA AGCGGAGGAACATGTGGTTAATTCGATGATACGCGAGGAACCTTACCCGGGTTTGAACGCACAGCGACGATCAGGAAACT GATTTTCTAGCAATAGCGATGT >35881 TACGTAGGGAGCGAGCGTTATCCGGATTTATTGGGTGTAAAGGGTGCGTAGACGGACTTACAAGTTAGTTGTGAAATCCC TCGGCTTAACTGAGAAACTGCAACTAAAACTGTAAGCCTTGAGTGCAGGAGAGGTAAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACATCAGTGGCGAAGGCGGCTTACTGGACTGAAACTGACACTGAGGCACGAAAGCGTG GGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTCGGGCCGTAGAGGCCTCGGTG CCGCAGCCAACGCAATAAGTATTCCACCTGGGGAGTACGTTCGCAAGAATGAAACTCAAAGGAATTGACGGGGACCCGCA CAAGCGGTGAGCATGTGGTTTAATTCGAAGCAACGCGAAGAACCTTACCTGGTCTTGACATCCTTCTGACCGACTTCTTA ATCGTAGTTTTTCCTTGGGACAGGAGTGACAGGTGGT >262464 TACGGAGGATGCGAGCGTTATCCGGATTTATTGGGTTTAGAGGGAGCGCAGACGGGAGATTAAGTCAGTTGTGAAAGTTT GCGGCTCAACCGTAAAATTGCAGTTGATACTGGTTTCCTTGAGTGCAGTTGAGGCAGGCGGAATTCGTGGTGTAGCGGTG AAATGCTTAGATATCGCGAAGAACCCCGATTGCGAAGGCAGCTTGCTAAACTGTAACTGACGTTCATGCTCGAAAGTGTG GGTATCAAACAGGATTAGATACCCTGGTAGTCCACACGGTAAACGATGGATACTCGCTGTTGGCGATATACTGTCAGCGG CCAAGCGAAAGCATTAAGTATCCCACCTGGGGATACGCCGGCAACGGTGAAACTCAAAGGAATTGACGGGGCCCGCGACA AGCGGAGGAACATGTGGTTTAATTCGATGATACGCGAGGAACCTTACCCGGGCTTAAATTGCAGACGAATTACGAGGAAA CTTGTAAGCCGCAAGGCGTCTGTGAAGGTG >342042 TACGTAGGTGGCAAGCGTTGTCCGGAATTATTGGGCGTAAAGCGCGCGCAGGCGGCTTCCCAAGTCCCTCTTAAAAGGTG ACGGGGCCTTAACCCCGTGATGGGAAGGAAACTGGGAAGCTGGAGTATCGGAGAGGAAAGTGGAATTCCTAGTGTAGCGG TGAAATGCGTAGAGATTAGGAAGAACACCGGTGGCGAAGGCGACTTTCT >70461 TACGGAAGGTCCGGGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGGCCGGAGATTAAGCGTGTTGTGAAATGTA GTGGCTCAACCTCTGCACTGCAGCGCGAACTGGTCTTCTTGAGTACGCACAACGTGGGCGGAATTCGTGGTGTAGCGGTG AAATGCTTAGATATCACGAAGAACTCCGATTGCGAAGGCAGCTCACGGGAGCGCAACTGACGCTGAAGCTCGAAAGTGCG GGTATCGAACAGGATTAGATACCCTGGTAGTCCGCACGGTAAACGATGGATGCCCGCTGTTGGCCTGAATAGGTCAGCGG CCAAGCGAAAGCATTAAGCATCCCACCTGGGGAGCGCCGGCCGACGTACGGTAGAACTAACGAAAGTAGTACGGGCCCGG GGCCCGACAACGACGGACGGGAACGGAAC >583211 TACGGAAGGTCCAGGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGCAGGCGGACCTTTAAGTCAGCTGTGAAATACG GCGGCTCAACCGTCGAACTGCAGTTGATACTGGAGGTCTTGAGTGCACACAGGGATACTGGAATTCATGGTGTAGCGGTG AAATGCTCAGATATCATGAAGAACTCCGATCGGCGAAGGCAGGTATCCGGGGCGCAACTGACGCTGAGGCTCGGAAAGTG ACGGGT >544325 TACGGAGGATTCGAGCGTTATCCGGATTTACTGGGTGTAAAGGGCGTGTAGGCGGGATTACAAGTCAGATGTGAAATACC GGGGCTTAACTCCGGGGCTGCATTTGAAACTGTAGTTCTTGAGTGCCGGAGAGGAAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTTCTGGACGGTAACTGACGCTGAGGCGCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGGATACTAGGTGTAGGAGGTATCGACCCCTTCT GTGCCGGAGTTAACACAATAAGTATCCCACCTGGGGAGTACGGCCGCAAGGTTGAAACTCAAAGGAATTGACGGGGGCCG CACAAGCAGTGGAGTATGTGGTTTAATTCGACGCAACGCGAAGAACCTTACCAGGGCTTGACATATAAGTGAATAATTAA GAGATTAGTTAGCTCTTCGGAGCACTTATACAGGTGGTGCA >511119 ATACGTAGGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGGAGCGTAGACGGTGTGGCAAGTCTGATGTGAAAGG CATGGGCTCAACCTGTGGACTGCATTGGAAACTGTCATACTTGAGTGCCGGAGGGGTAAGCGGAATTCCTAGTGTAGCGG TGAAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACGGTAACTGACGTTGAGGCTCGAAAGCG TGGGGAGACAAACAGGATTAGATACCCTGTAGTCCACGCCGTAAACGATAGAATACTAGGTGTCGGGGAGCATGGCTCTT CGGTGCCGTCGCAAACGCAGTAAGTATT >288119 TACGGTAGGGAGCGAGCGTTGTCCGGAATTACTGGGTGTAAAGGGAGCGTTAGGCGGGATCGGCAAGTCAGATGTGAAAA CTATGGGCTTAACCCATAAACTGCATTTGAAACTGTGGTTCTTGAGTGAAGTAGAGGTAAGCGGAATTCCTAAGTGTAGC GGTGAAATGCGTAGATATTAGGAGGAACATCAGTGGCGAAGGCGGCTTACTGGGCTTTAACTGAACGCTGGAGGCTACGA AAGCGTGGGGAGCAAACAGGATTAGATAACCCTGGTAGTCCACGCCGTAAACGGATGGATTACTAGGTGTGGGGGGACTG A >552779 TACGGAGGATCCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGGCGGATTGTTAAGTCAGTTGTGAAAGTTT GCGGCTCAACCGTAAAATTGCAGTTGATACTGGCAGTCTTGAGTGCAGTAGAGGTGGGCGGAATTCGTGGTGTAGCGGTG AAATGCTTAGATATCACGAAGAACTCCGATTGCGAAGGCAGCTCACTGGAGTGTAACTGACGCTGATGCTCGAAAGTGTG GGTATCAAACAGGATTAGATACCCTGGTAGTCCACGCTGTAAACGATGAATACTAGGTGTGCGGGGACTGACCCCCCTGC GTGCCGCAGTTAACACAATAAGTATTTCCCACCTGGGGATACGATCGCAAGGTTGAAACTCAAAGGAATTGGACGGGGGC CCGCACAAGCGGTGGATTA >542129 TACGTAGGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGACGGCGAGGCAAGTCTGATGTGAAAGCCT GGGGCTTAACCCCGGAACTGCATTGGAAACTGCTTTGCTGGAGTGCCGGAGAGGTAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACGGTAACTGACGTTGAGGCTACGAAAGCGG TGGGGAGACAAAC >554250 TACGTATGGAGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGTGTAGGTGGCATCACAAGTCAGAAGTGAAAGCCC GGGGCTCAACCCCGGGATTGCTTTTGAAACTGTGGAGCTGGAGTGCAGGAGAGGCAAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTGCTGGACTGTAACTGACACTGAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCCTAAACGATGTTAACTAGTTGTTGGGATGTAACAATCTCAGT AACGCAGCCAACGCGAGAAGCTAACCGCCTGGGAAGCACGGTCGCAAGACTAAAACTCAAAGGAATTGACGGGGACCCGC ACAAGCGGTGGATGATGTGGATTAATTCGATGCAACGCGAAAAACCTTACCTACCCTTGACATGTCAGAAGCTCTTGTAA TGAGAGCGT >287763 TACGGAGGATCCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGGCGGGTGCTTAAGTCAGTTGTGAAAGTTT GCGGCTCAACCGTAAAATTGCAGTTGATACTGGGTACCTTGAGTGCAGCATAGGTAGGCGGAATTCGTGGTGTAGCGGTG AAATGCTTAGATATCACGAAGAACTCCGATTGCGAAGGCAGCTTACTGGACTGTAACTGACGCTGATGCTCGAAAGTGTG GGTATCAAACAGGATTAGATACCCTGGTAGTCCACACAGTAAACGATGAATACTCGCTGTTGGCGATACACAGTCAGCGG CCAAGCGAAAGCATTAAGTATTCCGACCTGGGGATACGCCGGCAACGGTGAAACTCAAAGGAAGTTGG >470823 TACGGAAGGTCCGGGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGCAGGCGGACCTTTAAGTCAGCTGTGAAATACG GCGGCTCAACCGTCGAACTGCAGTTGATACTGGAGGTCTTGAGTGCACACGAGGGATGCGTAGGAATTCAGTGGTGTAGG CGGTAGAAATGCTCAGATATCATAGAA >298533 TACGGAGGATCCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGGCGGACGCTTAAGTCAGTTGTGAAAGTTT GCGGCTCAACCGTAAAATTGCAGTTGATACTGGGTGTCTTGAGTACAGTAGAGGCAGGCGGAATTCGTGGTGTAGCGGTG AAATGCTTAGATATCACGAAGAACTCCGATTGCGAAGGCAGCCTGCTGGACTGTAACTGACGCTGATGCTCGAAAGTGTG GGGTATCAAACAGGATTAGGATACCCCTGGTAGTCCACACAGGTAAACCGATGAATACTCGCTGTTT >245050 TACGTAGGGTGGCGAGCGTTATCCGGATTTATTGGGCGTAAAGGGTGCGCAGACGGTTTATTAAGTCTAAAATCAAATCT TGGGGGACCTCAACCCCCATTCCGTTTTAGAAACTGGTAGACTCGAGTATGGTAGAGGCAAATGGAATTCCTAGTGTAGC GGTGGAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGATTTGCTGGGCCATTACTGACGTTCAGGCACGAAAA GCGTGGGGAGCAAATAGGATTAGATACCCTAGTAGTCCACGCCGTAAACGAATGAGTACTAAAGTGTCGGGTTACCGGTG CTG >343453 TACGTAGGTGGCGAGCGTTATCCGGATTTATTGGGCGTAAAGCGTCCGCAGCCGGTTTATTAAGTCTAGAATTAAAGCCT GGAGCTCAACTCCAGTTCGTTTTAGAAACTGATAGACTCGAGTGTGGTAGAGGCAAACGGAATTCCTAGTGTAGCGGTGA AATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGACTTACTGGACTGGTACTGACACTGAGGCACGAAAGCGTGG GGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTTGGGGCCCAAAGGGCTTCGGT GCCGCCGCAAACGCATTAAGTATTCCACCTGGGGAGTACGTTCGCAAGAATGAAACTCAAAGGAATTGACGGGGACCCGC ACAAGCGGTGGAGCATGTGGTTTAATTCGAAGCAACGCGAAGAACCTTACCAAATCTTGACATCCCGATGACCGTTCCGT AATGGGAACTTCTCTTTCGGAGCATCGGTGACAGGTGGTGCA >539347 TACGTAGGGGGCGAGCGTTATCCGGATTTATTGGGCGTAAAGCGTGTGTAGGCGGTTTATTAAGTCCGAGATGAAAGGCT GAGGCTTAACCTCAGTTTGTTTCGGAAACTGGTAGACTAGAGTGCAGTAGAGGCAGTTGGAATTCATAGTGTAGCGGTAA AATGCGTAGATATTATGAGGAACATCAGTGGCGAAGGCGAATTGCTGGGCTGTTACTGACGCTGAGACACGAAAGCGGTG GGGAGCAAATAGGATTAGATACCCTAGTAGTCCACGCCGTAAACGATGAGCACTAAGGTGTACCGGGGCAACCCGGTGCT GAAGTTAACACATTAAGTGCTCCGCCTGAGTAGTACGGTCGCAAGACTGAAACTCAAAGGATTGACGGCACCCGCACAAG CGGTGGAGCATGCCG >291739 TACGGTAGGGGCGAGCGTTATCCGGATTTATTGGGCGTAAAGCGTGTGTAGGCGGTTTGTTAAGTTTAAGATTAAAGCCC GGGGCTCAACTCCGGTAAGTCTTAAAAACTGGCAGACTTGAGTACGGTAGAGGCAAACGGAATTTCTAGTGTAGCGGTGA AATGCGTAGGATATTAGAAAGGAACACCAAGTGGC >361304 TACGTATGGTGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGCAGGCGGTACGGCAAGTCTGATGTGAAAGCCC GGGGCTCAACCCCGGTACTGCATTGGAAACTGTCGGACTAGAGTGTCGGAGGGGTAAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGAGATGGGGAGGAACACCAGTGGCGAAGGCGGCCTGCTGGGCTTTAACTGACGCTGAGGCACGAAAGCGTG GTAGCAAACAGGATTAGATACCCTGGTAGTCCACGCTGTAAACGATGATTACTAGGTGTGGGGGTCTGACCCTTCGTGCC GGAGTTAACACAATAAGTAATCCACCTGGGGAGTACGGCCGCAA >313166 TACGTAGGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGACGGCGACGCAAGTCTGAAGTGAAATACC CGGGCTCAACCTGGGAACTGCTTTGGAAACTGTGTTGCTAGAGTGCTGGAGAGGTAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAAGAACACCAGTGGCGAAGGCGGCTTACTGGACAGTAACTGACGTTGAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTTGGTGAGCAAAGCTCATCGG TGCCGCCGCAAACGCAATAAGTATTCCACCTGGGGAGTACGTTCGCAAGAATGAAACTCAAAGGAATTGACGGGGACCCG CACAAGCGGTGGAGCATGTGGTTTAATTCGAAGCAACGCGAAGAACCTTACCAAATCTTGACAT >114455 TACGTAGGGGGCGAGCGTTGTCCGGAATGATTGGGCGTAAAGGGCGCGTAGGCGGCCTGCTAAGTCTGAAGTGAAAGTCC TGCTTTCAAGGTGGGAAGTGCTTTGGATACTGGTGGGCTGGAGTGCAGGAGAGGAAAGCGGAATTACCGGTGTAGCGGTG AAATGCGTAGAGATCGGTAGGAACACCAGTGGCGAAGGCGGCTTTCTGGACTGAAACTGACGCTGAGGCGCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCGCGCGGTAAACGATGGATGCCCGCCGTTGGGATTTGGATTTCAGCGG CCAAGCGAAAGCGTTAAGCATCCCACCTGGGGAGTACGCCGGCAACGGTGAAACTCAAAGGAATTGACGGGGCCCGCACA AGCGGAGGAACATGTGGTTTAATTCGATGATACGCGAGGAACCTTACCCGGGCTTGAATTGCAGGAGAACGATCCAGAGA TGGTGACGGCCCTTCGGGCTCCGTGTGGAAGGTGCTGC >1941 TACGTAGGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGCAGGCGGCATGATAAGTCTGATGTGAAAACCC AAGGCTCAACCATGGTACTGCATTGGAAACTGTCGTACTAGAGTGTCGGAGGGGTAAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACGATAACTGACGCTGAGGCTCGAAAGCGTG GGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTCGGGGGAGCATTGCTCTTCGG TGCCGCAGCAAACGCAATAAGTATTCCACCTGGGGATACGTTCGCAAGAATGAAACTCAAAGGAATTGGACGGGGACCCG CACGAAGCGGTGGAGCATGTGGTTTAATTCGAAGCAACGCGAAGAACCTTACCAAGTCTTGACATCCCGATGACAAACTA TGTAATGTAGCCTCTCTTCGGAGTA >131765 TACGTAGGTGACAAGCGTTGTCCGGATTTACTGGGTGTAAAGGGCGCGTAGGCGGACTGTCAAGTCAGTCGTGAAATACC GGGGCTTAACCCCGGGGCTGCGATTGAAACTGACAGCCTTGAGTATCGGAGAGGAAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACTGTAACTGACGTTGAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGATTACTAGGTGTTGGTGGGTATGACCTATCGG TGCCGCAGCAAACGCAATAAGTAATCCACCTGGGGAGTACGTTCGCAAGAATGAAACTCAAAGGAATTGACGGGGACCCG CACAAGCGGTGGAGCATGTGGTTTAATTCGAAGCAACGCGAAGACCTTACCTGGTCTTGACATCCCTATGAATAACGGGC AATGCCGTTAGTACTTCGGTACA >522087 TACGTATGGTGCAAGCGCTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGACGGCTTAGCAAGTCTGAAGTGAAAGCCC GGGGCTCAACCCCGGGACTGCTTTGGAAACTGTTAAGCTGGAGTGCTGGAGAGGTAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACAGTAACTGACGTTGAGGCT >320847 TACGTAGGGGGGCTAGCGTTATCCGGAATTACTGGGCGTAAAGGGTGCGTAGGTGGTTTTTTAAGTCAGAAGTGAAAGGC TACGGCTCAACCGTAGTAAGCTTTTGAAACTAGAGAACTTGAGTGCAGGAGAGGAGAGTAGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAATACCAGTAGCGAAGGCGGCTCTCTGGACTGTAACTGACACTGAGGCACGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAGTACTAGGTGTCCGGGGGTTACCCCCTCGGT GCCGCAGCTAACGCATTAAGTACTCCGCCTGGGAAGTACGCTCGCAAGAGT >137403 TACGTAGGGGGCGAGCGTTGTCCGGAATTACTGGGCGTAAAGGGTGCGTAGGCGGCCCTGCAGGTCAGATGTGAAATACC CGTGCTTAACATTGGGGCTGCATTTGAAACCGTAGGGCTTGAGTGTGGAAGAGGTAAGTGGAATTCCCGGTGTAGCGGTG AAATGCGTAGAGATCGGGAGGAACACCAGTGGCGAAGGCGACTTACTGGGCCACAACTGACGCTGAGGCACGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGGATACTAGGTGTAGAGGGTAACACCCCCTCTG TGCCGAAGCAAACGCATTAAGTATCCCGCCTGGGGAGTACGATCGCAAGATTGAACTCAAAGGAATTGACGGGGCCCGCA CAAGCAGCGGAGCATGTGGTTTAATTCGAAGCAACGCGAAGAACCTTACCAAGGCTTGACATCCCTTGAATGCCATAGAA TATGGAGTTCCTTCGGGACAAGGAGACGAGGTGGTG >335530 TACGTAGGGAGCGAGCGTTGTCCGGAATTACTGGGTGTAAAGGGAGCGTAGGCGGGATCGCAAGTCAGATGTGAAAACTA TGGGCTTAACCCATAAACTGCATTTGAAACTGTGGTTCTTGAGTGAAGTAGAGGTAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACATCAGTGGCGAAGGCGGCTTACTGGGCTTTAACGTGACGCTGAGGCTCGAAGGCGT GGGGAGCAAACAGGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGATTACTAGGTGTGGGGGGACTGACCCCTTC CGTGCCGCAGCAAACGCAATAAGTAATCCAACCTGGGGAGTACGACCGCAAGGTTGAAACGTCAAAGGATTGACGGGGGC CCGCACAAAGCAGTGGGAGTA >233805 TACGTAGGTGGCAAGCGCTGTCCGGATTTACTGGGTGTAAAGGGCGTGTAGCCGGGAGGGCAAGTCAGATGTGAAATCCA CGGGCTCAACTCGTGAACTGCATTTGACACTACTCTTCCTGAGTATCGGAGAGGCAATCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGATTGCTGGACGACAACTGCGGTAAAAAAGGGCGCGAAAG CGTGGGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCTGTAAACGATGAATACTAGGTGTGCGGGGACTGACCCCC TGCGTGCCGCAGCTAACGCAATAAGTATTCCACCTGGGGAGTACGATCGCAAGGTTGAAACTCAAAGGATTGACGGGGCC CGCACAAGCGGTGGATTATGTGGTTTAATTCGAAGCAACGCGAAGAACCTTACCAGGCTTGACATCCTACTAACGAGATA GAGATATGTTAGGT >272261 TACGTAGGGAGCAAGCGTTATCCGGATTTATTGGGTGTAAAGGGTGCGTAGACGGTAATGCAAGTTAGTTGTGAAATCCC TCGGCTTAACTGAGGAACTGCAACTAAAACTACATTTCTTGAGTATTGGAGGGGAAAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACGATGACTGACGCTGAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATAGAATACTAGGTGTCGGGGAGCACAGCTCTTCG GTGCTGCAGCAACGCAGTAAGTATTCCACCTGGGGAGT >257151 TACGTAGGTGGCAAGCGTTGTCCGGATTTACTGGGTGTAAAGGGCGTGTAGGCGGAGAAGCAAGTCAGAAGTGAAATCCA TGGGCTTAACCCATGAACTGCTTTTGAAACTGTTTCCCTTGAGTATCGGAGAGGCAGGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCCTGCTGGACGACAACTGACGCTGAGGCG >548184 TACGTAGGGTGCAAGCGTTAATCGGAATTACTGGGCGTAAAGACGTGCGCAGGCGGTTCTGTAAGACAGATGTGAAATCC CCGGGCTTAACCTGGGGAGTTGCATTTGTGACTGCAGGACTAGAGTTCATCAGAGGGGGGTGGGAATTCCAAGTGTAGCA GTGAAATGCGTAGATATTTTGGAAGAAACACCAATGGCGAAGGCAGCCCCCTGGGATGCGACTGACGCTCATGCACGAAA GCGTGGGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCCTAAACGATGTCTACTGGTT >78203 AACGTAGGTCACAAGCGTTGTCCGGAATTACTGGGTGTAAAGGGAGCGCAGGCGGGAAGACAAGTTGGAAGTGAAATCCA TGGGCTCAACCCATGAACTGCTTTCAAAACTGTTTTTCTTGAGTAGTGCAGAGGTAGGCGGAATTCCCGGTGTAGCGGTG GAATGCGTAGATATCGGGAGGAACACCAGTGGCGAAGGCGGCCTACTGGGCACCAACTGACGCTGAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCAGTGGTACGTCCACGACCGTAAAGATAGAATACGTAGGT >162326 TGCGGAGGATCCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGGCGGGTTGTTAAGTCAGTTGTGAAAGTTT GCGGCTCAACCGTAAAATTGCAGTTGATACTGGCGACCTTGAGTGCAGTTGAGGCAGGCGGAATTCGTGGTGTAGCGGTG AAATGCTTAGATATCACGAAGAACTCCGATTGCGAAGGCAGCCTGCTAAGCTGCAACTGACATTGAGGCTCGAAAGTGTG GGTATCAAACAGGATTAGATACCCTGGTAGTCCACACGGTAAACGATGAATACTCGCTGTTTGCGATATACGGCAAGC >183122 GATAAGCAGCAGGATTTTCCTTATATCCGGCCAGGTATTCGCGCCACTTACTCACGGATCCGTTTCCGGCATAGTAAGTT TCAGAGAAACCGGCAGCCTGGTAAGCTCTCAGGTATTCGTCAAGGGAAGCTTGTTTGGGACTGTTGATAGAAGTCTGGAA GCCAAAATTGGCGTTGTAGTTCAAGTTGAATTTTTCGCCTTTCTTGGCTTTTTTGGTGGTAATCAGGATAACACCGGCAG CAGCACGTGCACCATAGATGGCGGACGATGCCGCATCCTTCAGTACGGTGACGCTTTCAATATCTTCCGGATTCAACAAG TCTATATCACCTTCAACGTTGTCGATCAGCACCAGCGGATTCATACCGTTGATGGATACTGTACCACGTATGTTGAAGCT TTTTGCTTCACCCGGTGATGCACCACCACTTACCATCAGACCGGGCATAGACCCTGCAGGCATTCTTGACTATTGGTTAC AGGTACGC >556145 TACGTAGGGAGCGAGCGTTATCCGGATTTATTGGGTGTAAAGGGTGCGTAGACGGGAAGTCAAGTTAGTTGTGAAATCCC TCGGCTTAACTGAGGAACTGCAACTAAAACTGATTTTCTTGAGTACTGGAGAGGAAAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCGGTGGCGAAGGCGACTTTCTGGACAGAAACTGACGTTGAGGCACGAAAGTGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCTGTAAACGATGATTACTAGGTGTGGGGGGACTGACCCCTTCCG TGCCGCAGTTAACACAATAAGTAATCCACCTGGGAGTACGGCCGCAAGGTTGAAACTCAAAGGAATTGACGGGGGCCCGC ACAAGCAGTGGAGTATGTGGTTTAATTCGAAGCAACGCGAAGAACCTTACCAGGTCTTGACATCGAGTGCATAACTAAGA GATTAGTGAAATCCCTTCGGGGACACTTAGACAGGTGGTGCATGGTTGTCGTCAG >82548 TACGTAGGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGACGGAATGGCAAGTCTGATGTGAAAGGCC GGGGCTCAACCCCGGGACTGCATTGGAAACTGTCAATCTAGAGTACCGGAGGGGTAAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCGGTGGCGAAGGCGGCTTACTGGACGGTAACTGACGTTGAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTTGGGGAGCAAAGCTCTTCGG TGCCGCAGCAAACGCAATTAAGTATTCCACCTGGGGATACGTTCGCAAGAATGAAACTCAAAGGAATTGACGGGACCGCA CAAGCGGTGGAGCATGTGGTTAATTCGAAGCAACGCGAAGAACCTTACCAAGTCTTGACATCGATCTGACCGGACCGTAA TGGG >113510 TACGTAGGATGCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGCAGACGGGAGATTAAGTCAGTTGTGAAAGTTT GCGGCTCAACCGTAAAATTGCAGTTGATACTGGTTTCCTTGAGTGCAGTTGAGGCAGGCGGAATTCGTGGTGTAGCGGTG AAATGCTTAGATATCACGAAGAACCCCGATTGCGAAGGCAGCTTGCTAAACTGTAACTGACGTTCATGCTCGAAAGTGTG GGTATCAAACAGGATTAGATACCCTGGTAGTCCACACGGTAAACGATGGATACTCGCTGTTGGCGATATACTGTCAGCGG CCAAGCGAAAGCATTAAGTATCCCACCGTGGGGAGTACCGCCGGCAACGGTGAAACTCAAAGGAATTGACGGGGGCCCGC ACAAGCGGAGGAACATGTGGTTTAATTCGATGATACGCGAGGAACCTTACCCGGGCTTAAATTGCAGAC >276351 TACGGAGGATGCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGTGCGTAGGTGGATAGGTAAGTCAGCGGTGAAAGTTT GTGGCTCAACCATAAAATTGCCGTTGAAACTGTTTATCTTGAGTATGTTTGAGGTATGCGGAATGCGTGGTGTAGCGGTG AAATGCATAGATATCACGCAGAACTCCGATTGCGAAGGCAGCATACTAAACCATCACTGACACTGAAGCACGAAAGCGTG GGTATCAAACAGGATTAGATACCTGGTAGTCCACGCAGTAAACGATGATTACTAGGAGTTTGCGATATACAGTAAGCTCT ACAGCGAAAGCGTTAAGTAATCCACCTGGGAGTACGCCGGCACGGTGAACTCAAAGGAATTGACGGGGCCGGCACAAGCG GAGGAACATGTGGTTTAATTCGATGATACGCGAGGAACCGTTACCCGGGTTT >537429 AGATCTACGGTGAAGAGATAGCCGCCGCGGTTTCGTCGCCGAACAGCACGCTTGCCTGTGAATATATAACCGCATTGTCA AAATATGCACCTAACGCTGAAATTATCCCTGTAAAGCGAGTCGGCGCGGGGCACGATCTTCCACCTCAGGACGGATTTGC GAGCGGTTCATATCTTCGCGGGGCTATCCAAAACGGCGGTAATGCACTAGAATATCTGCCGAACGGCGTAAACATCACAC CGCCAAAGCAGCCGCAAGCGGCTGAAAATGCCATATATTACCATCTACTGACCGCCACACGCGAACAGTTTTTGCGCCTG >342865 TACGTAGGGAGCAAGCGTTATCCGGATTTATTGGGTGTAAAGGGTACGTAGGCGGCCTCATAAGTCTGTGGTTTAAGCCC GAAGCTTAACTTCGGTTCGCCACAGAAACTGTTTGGCTTGAGTATGGTAGAGGCAAGTGGAATTTCTAGTGTAGCGGTTA AATGCGTAGATATTAGAAGGAACACCAGTGGCGAAGGCGACTTGCTGGGCCATTACTGACGCTGAGGTACGAAAGCGTGG GGAGCAAATAGGATTAGATACCCTAGTAGTCCACGCCGTAAACGATGGATACTAAGTGTCGGGCAACCGGTGCTGAAGTA AACACATTAAGTATCCCACCTGAGTAGTACGGTCGCGAGGCTGAAACTCAAAGGAATTGACGGGCACCCGCACAAGCGGT GGAGCATGCTGTTTAATTCGATGCTACGCGAAGAACCTTACCTGGGCTTGACATCCCTTTGACCGGACCTAGAAATAGGA CC >550164 TACGTAGGTGGCAAGCGTTGTCCGGATTTACTGGGTGTAAAGGGCGCGTAGGCGGGATGGCAAGTCAGATGTGAAATCCA TGGGCTCAACCCATGAACTTGCATTTGAAACTGTCGTTCTTGAGTATCGGAGAGGCAAGCGGAATTCCTAGTGTAGCGGT GAAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTGCTGGACGACAACTGACGCTGAGGCGCGAAAGCGT GGGGAGCAAACAGGATTAGATAACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTGGGGGGACTGACCCCCTC CGTGCCGCAGTTAACACCAA >269355 TACGTAGGTGGCGAGCGTTATCCGGAATCATTGGGCGTAAAGGAGGGAGCAGGCGGCCGCAAGGGTACTGTGGTGAAAGG ACCGAAGCCTAAACTTCGGTTAAGCCATGGAAATCGGGCGGCTGGAGTGCGGAAGAGGATCGTGGAATTCCATGTGTAGC GGTGAAATGCGTAGATATATGGAGGAACACCAGTGGCGAAGGCGACGGTCTGGGCCGCAACTGACGCTCA >588867 TACGTATGGTGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGCAGGCGGAAGGCTAAGTCTGGTGTGAAAGCCC GGGGCTCAACCCCGGTACTGCATTGGAAACTGGTCATCTAGAGTGTCGGAGGGGTAAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACGATAACTGACGCTGAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTCGGGAAGCACAGCTTTTCGG TGCCGCCGCAAACGCATTAAGTATTCCACCTGGGGAGTACGTTCGCAAGAATGAAACTCAAAGGAATTGACGGGGACCCG CACAAGCGGTGGAGCATGTGGTTTAATTCGAAGCAACGCGAAGAACCTTACCAAGTCTTGACATCCTTCTGATCGGACAG TAATGTGTCCTTTCTTCGGGACAGGAAGTGACAGGTGGTG >153026 TACGGAAGGTCCAGGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGGCCGTTTGGTAAGCGTGTTGTGAAATGGT CGGGGCTCAACCTGGGCATTGCAGCGCGAACTGCCAGACTTGAGTGCGACAAGAAAGTAGGCGGAATTCGTCGTGTAGCG GTAGAAATGCTTAGATAT >2538 TACGTAGGTGGCAAGCGTTGTCCGGATTTACTGGGTGTAAAGGGCGAGTAGGCGGGATATCAAGTCAGGTGTGAAATCCA TGGGCTCAACCCATGAACTGCACTTGAAACTGATATTCTTGAGTGATGGAGAGGCAGGCGGAATTCCCGGTGTAGCGGTG GAATGCGTAGATATCGGGAGGAACACCAGTGGCGAAGGCGGCCTGCTGGACATTAACTGACGCTGAGGAGCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGGATACTAGGTGTGGGAGGTACTGACCCCTT >262076 TACGTAGGTGGCGAGCGTTATCCGGATTTACTGGGTGTAAAGGGTGTGTAGGCGGGAAGGCAAGTCAGATGTGAAAACTA TGGGCTCAACCCATAGCCTGCATTTGAAACTGTTTTTCTTGAGAGTCGGAGAGGTAAGTGGAATTCCCGGTGTAGCGGTG AAATGCGTAGATATCGGGAGGAACATCTGTGGCGAAGGCGACTTACTGGACGATTACTGACGCTGAGACACGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAACACTAGGTGTGGGTCGGCGAGACTCCGTCG CGCCGCCGACGTACACTAAGTAGTTCGTACCT >55727 TACGGAAGGTCCGGGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGGCCGTCTGTTAAGCGTGTTGTGAAATGTC GTGGCTCAACCGGGGCACTGCAGCGCGAACTGGCAGACTTGAGTGCACGGTAGGAAGGCGGAATTCGTCGTGTAGCGGTG AAATGCTTAGATATGACGAAGAACTCCGATTGCGAAGGCAGCTTTCCGTAGTGTAACTGACGCTGAAGCTCGAAAGCGTG GGTATCAAACAGGATTAGATACCCTGGTAGTCCACACCGTAAACGATGATTACTAGGCGTTGGAGGATTGACCCCTTCAG TGCCGCAGTTAACACAATAAGTAATCCACCTGGGGAGTACGACCGCAAGGTTGAAACTCAAAGGATTGGACGGGGGCCCG CACAAGCAGTGGAGTATGTGGTTTAATTCGACGCAACGCGAAGAACCTTACCAAGTCTTGACATCCCTTGACGATGCT >306684 TTCCAGCTCCAATAGCGTATATTAACGTTGTTGCAGTTAAAAAGCTCGTAGTTGAAATGAAGGGTAGTTGTGTAATGAAT ACATTCGCGTTATTTTGTTATTCTACTACCCTCCTTCTAAATTCGATATATGAGTTATTTAATTTCTTGTATATTGGTTT TAGTACTTTTACTGTGAAGTAAAATTAGAGTGTTACAAAGCGA >556276 TACGTAGGTGGCAAGCGTTATCCGGAATTATTGGGCGTAAAGAGAGAGCAGGCGGTTATTCAAGTCTGAAGTGAAAAGCA GTGGCTTAACCATTGTAGGCTTTGGAAACTAGATAGCTAGAGTGCAAGAGAGGTTAGCGGAACTCCATGTGTAGCGGTGA AATGCGTAGATATATGGAAGAACACCAGTGGCGAAGGCGGCTAACTAGCTT >578831 TACGTAGGTGGCGAGCGTTATCCGGAATCATTGGGCGTAAAGAGGGAGCAGGCGGCAACTAGGGTCTGCGGTAAAAAGAC CGAAAGCTAAAACTTCGGTAAGCCGTGGAAACCGAGGAGCTAGAGTGCAGTAGAGGATCGTGGAATTCCATGTGTAGCGG TGAAATGCGTAGATATATGGAGGAACACCAGTGGCGAAGGCGACGATCTGGGCTGCAACTGACGCTCA >268617 TACGTATGGTGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGCAGGCGGTGCGGCAAGTCTGATGTGAAAGCCC GGGGCTCAACCCCGGTACTGCATTGGAAACTGTCGTACTAGAGTGTCGGAGGGGTAAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACGGTGGCGAAGGCGGCTTACTGGACTGTAACTGACGTTGAGGCTCGAAAGCGTGG GGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGATTACTAGGTGTTGGGGATTCATAAATCCCCGG TGCCGTCGGCAAACGCAATAAGTAATCCACCTGGGGAGTACGTTCGCAAGAATGAAACTCAAAGGAATTGGACGGGGACC CGCACAAG >236430 TACGTAGGGAGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGCGCGCAGGCGGGCCGGTAAGTTGGAAGTGAAATCTA TGGGCTTAACCCATAAACTGCTTTCAAAACTGCTGGTCTTGAGTGATGGAGAGGCAGGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACGATAACTGACGCTGAGGCTCGAAAGCGTG GGGAGACAAACAGGATTAGACT >591182 GGAGTGCATCTGCACCGTTATTGCATCCGGCCTGCCTGTGATGAAGGCCGAGGATACCGAATGCCCCATCGCCTCCCTGC GTATCATCTACACCCCGGATACCGAGTACAACGAGTACACCGCAAACTGGATCATCTCCCCGGATACTGCGGTCCCTGCT TTGGGCTGACCCTTACACCATATTTTGTTGATAAACGGAGGAACGTATCATGTCTTACACTTTTTCCCGGCGTGATTTTC TGAAGTATTCTGCCATGACCGCTGTGGCTGTGGCCGGTGCCGGCCTGCTGACGGGCTGTGAGATCCAGGACCCCAACAAC CCTGTTATCAAAAAGCTGGGTTACGGCACGACCCTG >260458 TACGTATGGAGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGTGTAGGTGGTATCACAAGTTCAGAAAGTGAAAGC CCGGGGCTACAACCCCGGGACTGCTTTTGAAACTGTGGAACTGGAGTGCAGGAGAGGTAAGTGGAATTCCTAGTGTAGCG GTGAAATGCGTAG >86556 TACGTAGGTGGCGAGCGTTATCCGGAATCATTGGGCGTAAAGAGGGAGCAGGCGGCCGCAAGGGTCTGTGGTGAAAGACC GAAGCTAAACTTCGGTAAGCCATGGAAACCGGGCGGCTAGAGTGCGGAAGAGGATCGTGGAATTCCATGTGTAGCGGTGA AATGCGTAGATATATGGGGGAACACCAGTGGCGAAGGCGACGGTCTGGGCCGCAACCGACGCTCATTCCCGAAAGCGTGG GGAGCAAATAGGATTAGATACCCTAGTAGTCCACGCCGTAAACCGATGGTCACTAAGTGTCGGGGGTCAAACCCCCGGTG CTGCAGTCAACGCAATAAGTGACCCGCCTGAGTAGTACGTTCGCAAGAATGAAACTCAAAGGAATTGACGGGGGCCCGCA CAAGCGGTGGAGCATGTGGTTTAATTCGAGCAGCGAAGACCTACAGGTCTTGACATCGATCTAAAAAGGGATGGGAGACA TCCTCATAGCTATAGAGAAGACAGGTGGTGC >259956 TACGGAGGGTGCAAGCGTTAATCGGAATAACTGGGCGTAAAGGGCATGCAGGCGGTTCATCAAGTAGGATGTGAAATCCC CGGGCTCAACCTGGGAACAGCATACTAAACTGGTGGACTAGAGTATTGCAGGGGGAGACGGAATTCCAGGTGTAGCGGTG GAATGCGTAGATATCTGGAAGAACACCAAAGGCGAAGGCACACAGGGGATAGG >112749 TACGTAGGGGACAAGCGTTATCCGGATTTATTGGGCGTAAAGCGTGCGTAGGCGGCATATTAAGTTTAAGATAAAAGCCC GGGGCTTAACTCCGGTTCGTCTTAAAAACTGATAAGCTTGAGTGTGGTAGAGGTAAATGGAATTTCTAGTGTAGCGGTGA AATGCGTAGATATTAGAAGGAACACCAGTGGCGAAGGCGATTTACTGGGCCACAACTGACGCTGAGGCACGAAAGCGTGG GTAGCAAATAGGATTAGATACCCTAGTAGTCCACGCCGTAAACGATGAGTACTAAGTGTTGGGGAAACTCAGTGCTGAAG CTAACGTATTAAGTACTCCGCCTGAGTAGTACGGTCGCAAGGCTGAAACTCAAAGGAATTGACGGGCACCCGCACAAGCG GTGGAGCATGCTGTTTAATTCGAAGATACGCGAAGAACCTTACCTAGACTTGACATCCCTGGCAAAGATATAGAAATATA TCGGAGGTTATCCAGGTGACAGGTGGTGCATGGTTGTCGTCAG >304950 TACGTAGGTGGCAAGCGTTGTCCGGATTTACTGGGTGTAAAGGGCGTGTAGCCGGGTGTGTAAGTCAGATGTGAAATCTG GAGGCTCAACCTCCAAACTGCATTTGAAACTGCGCATCTTGAGTATCGGAGAGGTAATCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAAGAACACCAGTGGCGAAGGCGGATTACTGGACGACAACTGACGGTGAGGCGCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCTGTAAACGATCAATACTAGGTGTGCGGGGACTGACCCCTGCGT GCCGCAGTTAACACAATAAGTATTGCACCTGGGGAGTACGATCGCAAGGTTGAAACTCAAAGGAATTGACGGGGGCCCGC GACAAGCGGTGGATTATGTGGTTTAATTCGAAGCAACGCGAAGAACCTTACCAGGACTTGACATCCTACTAACGAAGCAG AGATGCATTAGGTG >3581 TACGTAGGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGACGGCATCACAAGTCAGAAGTGAAAATCC GGGGCTCAACCCCGGAACTGCTTTTGAAACTGTGGAGCTGGAGTGCAGGAGAGGTAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACTGTAACTGACGTTGAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTCGGGGCCGTAGAGGCTTCGG TGCCGCAGCCAACGCAATAAGTATTCCACCTGGGGAGTACGTTCGCAAGAATGAAACTCAAAGGAATTGACGGGACCCGC ACAAGCGGTGGAGCATGTAGGTTTAATTCGAAGCAACGCGAAGAACCTTACCTGGTCTTGACATCCTTCTGACCGACTCT TAATCGTAGTTTTTCCTTCGGGACAGGAGTGAC >329327 TACGTAGGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGACGGATGGACAAGTCTGATGTGAAAGGCT GGGGCTCAACCCCGGGACTGCATTGGAAACTGCCCGTCTTGAGTGCCGGAGAGGTAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACGGTAACTGACGTTGAGGCTCGAAAGCGTG GGGAGTAAACAGGATTAGATACCCTGGTAGTCCACGCGGTAAACGATGAATGCTAGGTGTCGGGGAGCAAAGCTCTTCGG TGCCGCCGCAAACGCATTAAGCATTCCACCTGGGGGAGTACGTTCGCAAGAATGAAACTCAAAGGAATTGGACGGGGACC CGCACAAGCGGTGGAGCATGTGGTTTAATCGAAGCAACGCGAAGACCTTACAAGTCTTGACA >247518 TACGGAGGATCCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGAGACGTAAGAATAGGATGTTTAAGTCAGTTGTGAAA GTTTGCGGCTCAACCGTAAAATTGCAGTTGATAACTGGATATCTTGAGTGCAGTTGAGGCAGGCGGAATTCGTGGTGTAG CGGTGAAATGCTTAGATATCACGAAGAACTCCGATTGCGAAGGCAGCCTGCTAAGCTGCAACTGACATTGAGC >591098 ATACGGAGGATCCGAGCGTTATCCGGATTTAGTTGGGTTTAAAAGGGAGCGTAGGTGGATTGTTAAGTCAGTTGTGAAAA GTTTGCGGCTCAACCCGTAAAATTGCAGTTGAAACTAGGCTAGTCTTGAGTACAGTAGAGGTGGGCGGAATTCGTGGTGT AGCGGTGAAATGCTTAGATATCACGAAGAACTCCGATTGCGAAGGCAGCTCACTAGACTGCAACTGACACT >535000 TACGTAGGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGTGCGTAGGTGGCAAGGCAAGTCAGATGTGAAAGCCC GGGGCTCAACCCCGGTACTGCATTTGAAACTGTCTAGCTAGAGTGCAGGAGAGGTAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACTGTAACTGACACTGAGGCACGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACACAGTAAACGATGAATACTCGCTGTTTGCGATATACAGTAAGCGG CCAAGGCGAAAGCATTAAGTATTCCACCTGGGGATGCGCCGGCAACGGTGAAACTCAAAGGAATTGGACGGGGGCCCGCA CAAGCGGAGGAACAGTGTGGTTTAATTCGATGATACGGCGAGGAA >73076 TACGTATGGTGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGCAGGCGGTGCGGCAAGTCTGATGTGAAAGCCC GGGGCTCAACCCCGGTACTGCATTGGAAACTGTCGTACTAGAGTGTCGGAGGGTAAGTGGAATTCCTAGTGTAGCGGTGA AATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACGATAACTGACGCCGAGGCTCGAAAGCGTGG GGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTCGGGGAGCGATTGCTTCTTCG GTGCCGCAGCAAACGCAATAAGTATTCCACCTGGGGAGTACGTTCGCAAGAATAGAAACTCAAAGGATGACGGGACCGCA CAAGCGGTGAGC >538794 TACGGAGGATGCAAGCGTTATCCGGATTTATTGGGTTTAAAGGGTGCGTAGGCGGCACGCCAAGTCAGCGGTGAAATTTC CGGGCTCAACCCGGACTGTGCCGTTGAAACTGGCGAGCTAGAGTACACAAGAGGCAGGCGGAATGCGTGGTGTAGCGGTG AAATGCATAGATATCACGCAGAACCCCGATTGCGAAGGCAGCCTGCTAGGGTGAAACAGACGCTGAGGCACGAAAGCGTG GGTATCGAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTGGGGGACTGACCCTTCCGTG CCGCAGTTAACACAATAAGTATTCCACCTGGGGAGTACGACCGCAAGGTT >546975 TACGTAGGTTGCAAGCGTTGTCCGGATTTACTGGGTGTAAAGGGCGTGTAGGCGGAGATGCAAGTTGGGAGTGAAATCCA TGGGCTCAACCCATGAACTGCTCTCAAAACTGTATCCCTTGAGTATCGGAGAGGCAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTGCTGGACGACAACTGACGCTGAGACACGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATGCTAGGTGTAGGGTCGGAAACGGGTCTGT GCCGCAGCTAACGCGATAAGCATTCCACCTGGGGA >341275 TACGGAGGATCCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGATGGATATTTAAGTCGGTTGTGAAAGTTT GCGGCTCAACCGTAAAATTGCAGTTGATACTAGGATTATCTTGAGTGCAGTTGAGGCGGGCGGAATTCGTGGTGTAGCGG TGAAATGCTTAGATATCACGAAGAACTCCGATTGCGAAGGCAGCCTGCTAAGCTGCAACTGACATTGAGGCTACGAAAGT GTGGGTATCAAAC >512598 TACGTAGGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGACGGCATCACAAGTCAGAAGTGAAAATCC GGGGCTCAACCCCGGAACTGCTTTTGAAACTGTGGAGCTGGAGTGCAGGAGAGGTAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACTGTAACTGACGTTGAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAGATACCACGTGGTACGTCC >573607 AACGTAGGTCACAAGCGTTGTCCGGAATTACTGGGTGTAAAGGGAGCGCAGGCGGGAAGACAAGTTGGAAGTGAAATACC AGTGGGCTCCAAACCCATGAACTTGCTTTCAAAACTGTTTTTCTTGAGTAGTGCAGAGGTAGGCGGAATTCCCGGTGTAG CGGTGGAATAGCGTAGATATCGGGAGGAACACCAAGTGGCGAAGGCGGCCTACTGGGCACCAACTGACGCTGAGGCTCGA AAGTGT >113626 ATACGGAGGATGCGAGCGTTATCCGGATTTATTAGGGTTTAAAGGGAGCGCAGACGGGTCGTTAAGTCAGCTGTGAAAGT TTGGGGCTCAACCTTAAAATTGCAGTTGATAACTGGTCGTCCTTGAGTGCGGTTGAGGTGTGCGGAATTCGTGGTGTAGC GGTGAAATGCTTAGATATCACGAAGAACTCCGATTGCGAAGGCAGCACACTAATCCGTAACTGACGTTC >223948 TACGTAGGTTGCAAGCGTTGTCCGGATTTACTGGGTGTAAAGGGCGTGTAGGCGGAGATGCAAGTTAGGAGTGAAATCTA TGGGCTCAACCCATAAACTGCTTCTAAAACTGTATCCCTTGAGTATCGGAGAGGCAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTGCTGGACGACAACTGACGCTGGAGGCGACGAAAGCG GTGGGGAGACAAACAGGATTAGACTACCCTGGTAGTCCACGCTAGTAAACGATAGAA >254706 TACGGAGGATCCGAGTGTTATCCGGATTTATTGGGTTTAAAGGGTGCGTAGGCTGTTTTTTAAGTTAGAGGTGAAAGCTC GACGCTCAACGTCGAAATTGCCTCTGATACTGAGAGACTAGAGTGTAGTTGCGGAAGGCGGAATGTGTGGTGTAGCGGTG AAATGCTTAGATATCACACAGAACACCGATTGCGAAGGCAGCTTTCCAAGCTATTACTGACGCTGAGGCACGAAAGCGTG GGGAGCGAACAGGATTAGATACCCTGGTAGTCCACGCAGTAAACGATGATAACTCGTTGCCGGCGATACACAGTCGGTGA CTTAGCGAAAGCGTTAAGTTATCCACCTGGGGGAGTACGTTCGCAAGAATGAAACTCAAAGGATTGACGGGGGCCCGCAC GAAGCGGAGGAACATGTGGTTTAATCGATGATACGCGAGG >258006 TACGTATGGTGCAAGCGTTACCCGGATTTACTGGGTGTAAAGGGTGCGTAGGTGGCAAGGCAAGTCTGAAGTGAAAATCC GGGGCTCAACCCCGGAACTGCTTTGGAAACTGTTTAGCTAGAGTACAGGAGAGGTAAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGACTTACTGGACTGCTACTGACACTGAGGCACGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACACGGTAAACGATGAATACTCGCTGTTTGCGATATACGGCAAGCGG CCAAGCGAAAGCGTTAAGTATTCCACCTGGGGAGTACGCCGGCAACGGTGAAACTCAAAGGATTGACGGGGCCCGCACAA GCGGAGGAACATGTGGTTTAATTCGATGATACGCGAGGAACCTTACCCGGGCTTAAATTGCACTCGAATGATCCGGAAAC GGTTCAGCTAGCAATAGCGAGTGTGAAGGTGCTGCA >111986 TACGTATGGTGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGCAGGCGGTACGGCAAGTCTGATGTGAAATCCC GGGGCTCAACCCCGGTACTGCATTGGAAACTGTCGGACTAGAGTGTCGGAGGGGTAAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACGATTACTGACGCTGAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTCGGGGAGCATTGCTCTTCGG TGCCGCAGCAAACGCAATAAGTATTCCACCTGGGGATACGGTTCGCAAGATGAAACTCAAAGGATTGGACGGGGACCCGC ACAAGCGGTGGAGCATGTGGTTTAATCGAAGCAACGCGAAGAACCTTACCAAGTCTTGACATCCCATGAACAAGTATGTA ATGTACTTTCTCTTCGGA >113959 TACGTAGGTGGCGAGCGTTATCCGGATTTACTGGGTGTAAAGGGCGCGTAGGCGGGAATGCAAGTCAGATGTGAAATCCA GGGGCTTAACCCTTGAACTGCATTTGAAACTGTATTTCTTGAGTGTCGGAGAGGTTGACGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGTCAACTGGACGATAACTGACGCTGAGGCTCGAAAGCGTG GGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTCGGGGAGCATTGCTCTTCGGT GCCGCAGCAAACGCAAATAAGTATTCCACCTGGGGGAGTACGTTCGCAAGAATGAAACTC >280233 TACGTAGGGGGCGAGCGTTGTCCGGATTTACTGGGCGTAAAGAGTGCGTAGGTGGCTTTGCAAGTCAGATGTGAAATACC GGGGCTTAACCCCGGGGCTGCATCTGAAACTGTAGAGCTAGAGTACAGGAGGGGAAGGCGGAATTCCTAGTGGAGCGGCG AAATGCGTAGAGATTAGGAGGAACACCGGTGGCGAAGGCGGCTTTCTGGACTGCAACTGACACTGAGGCACGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGGATACTAGGTGTGGGGTCGAATAGATTCCGTG CCGCAGCAAACGCAATAAGTATCCCGCCTGGGGAGTACGGCCGCAAGGTTGAAACTCAAAGGAATTGACGGGGGCCGCAC AAGCAGCGGAGCATGTGGTTTAATTCGAAGCAACGCGAAAAACCTTACCAGAACTTGACATCCCGCTGAATGTATTGGAA GCAATGCAGGCTTACGCAAGTAAGACAGCGGTGACA >553285 TACGTAGGTTGCGAGCGTTGTCCGGATTTACTGGGTGTAAAGGGCGTGTAGGCGGAGATGCAAGTTGGGAGTGAAATCCA TGGGCTCAACCCATGAACTGCTTCCAAAACTGTATCCCTTGAGTATCGGAGAGGCAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTGCTGGACGACAACTGACGCTGAGGCGCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCTGTAAACGATGAATACTAGGTGTGGGAGGACTGACCCCTTCCG TGCCGCAGTTAACACAATAAGTATTCCACCTGGGGATACGACCGCAAGGTTGAAACTCAAAGGAATTGACGGGGGCCCGC ACAAGCAGTGGAGTATGTGGTTTAATTCGAAGCAACGCGAAGAACCTTACCAGGTCTTGGACATCCGATGCATAGCACAG AGATGTGTGAAATCCTTCGGGACTAG >238997 CACGTATGGAGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGTGTAGGTGGCCAGGCAAGTCAGAAGTGAAAGCCC GGGGCTCAACCCCGGGACTGCTTTTGAAACTGCAGGGCTAGAGTGCAGGAGGGGCAAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTGCTGGACTGTAACTGACACTGAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTCGGGGCACATAAGTGCTTCG GTGCCGCAGCAAACGCAATAAGTATTCCACCTGGGGAGTACGTTCGCAAGAATGAAACTCAAAGGATTGACGGGGACCCG CACAAGCGGTGGAGCATGTGGTTTAATCGAAGCAACGCGAAGAACCTTACCAAGTCTTAGACATCCCACGTGACCCGGAC AGTAATGTGTCCCTTCCCGTTCGGGGCAGTGGAGACGAGGTGG >212596 TACGGGGGATGCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGCGCGTAGGCGGGACGTCAAGTCAGCGGTAAAAGACT GCAGCTAAACTGTAGCACGCCGTTGAAACTGGCGCCCTGGAGACGAGACGAGGGAGGCGGAACAAGTGAAGTAGCGGTGA AATGCATAGATATCACTTGGAACCCCGATAGCGAAGGCAGCTTCCCAGGCTCGTTCTGACGCTGATGCGCGAGAGCGTGG GTAGCGAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGCTCACTGGATCTTGGCGATACACGGCCAGGGTT CAAGCGAAAGTATTAAGTGAGCCACCTGGGGAGTACGTCGGCAACGATGAAACTCAAAGGAATTGACGGGGGCCCGCACA AGCGGAGGAACATGTGGTTTAATTCGATGATACGCGAGGAACCTTACCGGGTTTAAATGTAG >204462 TACGTAGGTGGCAAGCGTTGTCCGGATTTACTGGGTGTAAAGGGCGTGCAGCTGGGAATGCAAGTCAGATGTGAAATCCA TGGGCTTAACCCATGAACTGCATTTGAAACTGTATTTCTTGAGTACTGGAGAGGCAATCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGATTGCTGGACAGCAACTGACGGTGAGGCGCGAAAGTGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACACTGTAAACGATGAATACTAGGTGTGCGGGGACTGACCCCCTGCG TGCCGCAGTTAACACAATAAGTATTCCACCTGGGGAGTACGATCGCAAGGTTGAAACTCAAAGGAATTGACGGGGGCCGC ACAGCGGTGGATTATGTGGTTTAATTTCGAAGCAACGCGAAGAAACCTTACCAGGGTTTTGACATCCTGCTAACGAAGTA GAGATACATTA >589802 TACGTAGGTGGCGAGCGTTGTCCGGAATTACTGGGTGTAAAGGGTGCGTAGGCGGCTTCTAAAGTCAGATGTGAAATACC GCAGCTCAACTGCGGGGCTGCATTTGAAACTTGGGAGCTTGAGTGAAGTAGAGGTAAGCGGAATTCCTAGTGTAGCGGTG GAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACGATAACTGACGCTGAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTCGGGGGCACAACGTGCTTCG GTGCCGCAGCTAACGCAATAAGTATTCCACCTGGGGATACGTTCGCAAGAATGAAACTCAAAGGATTGACGGGGACCCGC ACAAGCGGTGGAGCATGTGGTTTAATTCGAAGCAACGCGAAGAACCTTACCAGTCCTTGACATCCTGCTGGCCGTTCCTA ACCGGACTTTTCTTCGGAACAGCAGAGACAGGTGG >272782 ATACGTAGGTGGCAAGCGTTGTCCGGAATTATTGGGCGGTAAAGCGCGCGCAGGCGGCTTCTTAAGTCCATACTTAAAAG TGCGGGGCTTAACCCCCGTGATGGGATGGAAACTAGGGAGGTCTGGAGTATCGGAGAGGAAAGTGGAATTCCTAGTGTAG CGGTGAAATGCGTAGAGATTAGGAA >229514 TACGTAGGGAGCAAGCGTTATCCGGATTTATTGGGTGTAAAGGGTGCGTAGACGGTAATGCAAGTTAGTTGTGAAATCCC TCGGCTTAACTGAGGAACTGCAACTAAAACTACATTTCTTGAGTATTGGAGGGGAAAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGATTGCTGGACAGCAACTGACGGTGAGGCGCGAAAGTGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACACTGTAAATGATGAATACTAGGTGTGCGGGGACTGACCCCCTGCG TGCCGCAGTTAACACAATAAGTATTCCACCTGGGGAGTACGATCGCAAGGTTGAAACTCAAAGGAATTGGACGGGGGCCC GCACAAGCGGTGGATTA >250451 TACGTAGGGGGCAAGCGTTGTCCGGAATAATTGGGCGTAAAGGGCGCGTAGGCGGCTCGGTAAGTCTGGAGTGAAAGTCC TGCTTTTAAGGTGGGAATTGCTTTGGATACTGTCGGGCTTGAGTGCAGGAGAGGTTAGTGGAATTCCCAGTGTAGCGGTG AAATGCGTAGAGATTGGGAGGAACACCAGTGGCGAAGGCGACTAACTGGACTGTAACTGACGCTGAGGCGCGAAAGTGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACACTGTAAACGATGAATGCTAGGTGTAGGGGGTATCGACCCTTCTG TGCCGCAGTTAACACAATAAGCATTCCGCCTGGGGAGTACGGCCGCAAGGTTGAAACTCAAAGGAATTGACGGGGGCCCG CACAAGCAGCGGAGCATGTGGTTTAATTCGACGCAACGCGAAGAACCTTACCAGGGTTTGACATCCTGCTAACGAAGTAG AGATACATTAGGTG >574961 TACGTAGGTGGCAAGCGTTATCCGGAATTATTGGGCGTAAAGGGTGCGTAGGCGGCGAGATAAGTCTGAGGTAAAAGCCC GTGGCTCAACCACGGTAAGCCTTGGAAACTGTCTGGCTGGAGTGCAGGAGAGGACAATGGAATTCCATGTGTAGCGGTAA AATGCGTAGATATATGGAGGAACACCAGTGGCGAAGGCGGTTGTCTGGCCTGTAACTGACGCTGAAGCACGAAAGCGTGG GGAGCAAATAGGATTAGATACCCTAGTAGTCCACGCCGTAAACGATGAGAACTAAGTGTTGGGGAAACTCAGTGCTGCAG TTAACGCAATAAGTTCTCCGCCTGGGGAGTATGCACGCAAGTGTGAAACTCAAAGGAATTGACGGGGGCCCGCACAAGCG GTGGAGTATGTGGTTTAATTCGACGCAACGCGAAGAACCTTACCAGGCCTTGACATGGTATCAAAGGCCCTAGAGATAGG GAGATAGTAAT >139346 TACGGAAGGTCCGGGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGGCCGGAGATTAAGCGTGTTGTGAAATGTA GTGGCTCAACCTCTGCACTGCAGCGCGAACTGGTCTTCTTGAGTACGCACAACGTGGGCGGAATTCGTGGTGTAGCGGTG AAATGCTTAGATATCACGAAGAACTCCGATTGCGAAGGCAGCTCACGGGAGCGCAACTGACGCTGAAGCTCGAAAGTGCG GGTATCGAACAGGATTAGATACCCTGGTAGTCCGCACGGTAAACGGTGGAGTGCCCGGCCTGTTGGTCCGTGAATAAGGT CAGCGGCCAAGCGAAGACATTAAGACAT >588882 TACGTAGGGGGCGAGCGTTATCCGGATTTATTGGGCGTAAAGCGTGTGTAGGCGGTTTATTAAGTTTAAGATTAAAGCCC GGGGCTCAACTCCGGTAAGTCTTAAAAACTGGTAGACTTGAGTACGGTAGAGGCAAACGGAATTTCTAGTGTAGCGGTGA AATGCGTAGATATTAGAAGGAACACCAGTGGCGAAAGCGGTTTGCTGGGCCGTTACTGACGCTGAGGCACGAAAGCGTGG GGAGCAAATAGGATTAGATACCCTAGTAGTCCACGCCGTAAACGATGAGTACTAAGTGTTGGGGTTACCCAGTGCTGAAG CTAACGTATTAAGTACTCCGCCTGAGTAGTACGGTCGCAAGGCTGAAACTCAAGGAATTAGTACGGGACGACCCGCCACA ACGACGGT >138816 TACGTAGGGGGCAAGCGTTGTCCGGAATGATTGGGCGTAAAGGGCGCGTAGGCGGCCTGGTAAGTTTGGAGTGAAAGTCC TGCTTTTAAGGTGGGAATTGCTTTGAAAACTGCTGGGCTTGAGTGCAGGAGAGGTAAGTGGAATTCCCGGTGTAGCGGTG AAATGCGTAGAGATCGGGAGGAACACCAGTGGCGAAGGCGACTTACTGGACTGTTACTGACGCTGAGGCGCGAAAGTGTG GGGAGCAAACAGGATTAGA >28512 TACGTAGGGGGCAAGCGTTGTCCGGAATAATTGGGCGTAAAGGGCGCGTAGGCGGCTCGGTAAGTCTGGAGTGAAAGTCC TGCTTTTAAGGTGGGAATTGCTTTGGATACTGTCGGGCTTGAGTGCAGGAGAGGTTAGTGGAATTCCCAGTGTAGCGGTG AAATGCGTAGAGATTGGGAGGAACACCAGTGGCGAAGGCGACTAACTGGACTGTAACTGACGCTGAGGCGCGAAAGTGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACACTGTAAACGATGAATGCTAGTGTAGGGGGTATCGACCCTTCTGT GCCGCAGTCAACACAATAAGCATTCCGCCTGGGGAGTACGGCCGCAAGGTTGAAACTCAAAGGAATTGACGGGGGCCCGC ACAAGCGGTGGAGTATGTGGTTTAATTCGAAGCAACGCGAAGAACCTTACCAGGGCTTGACATCCCGGTGACCCGGACTA GAGATAGTCCTTTCCC >279590 TACGGTAGGGGGCGAGCGTTATCCGGATTTATTGGGCGTAAAGCGTGTGTAGGCGGTTTATTAAGTCCGAGATGAAAGGC TGAGGCTTAACCTCAGTTTTGTTTACGGAAACTGGTAGACTAGAGTGCAGTAGAGGCAATTGGAATTCATAGTGTAGCGG TAAAATGCGTAGATATTATGAGGAACATCAGTGGCGAAGGCGAATTGCTGGGCTGTTACTGACGCTGAGACACGAAAGCG GTGGGGAGACAAAGTAGGATTAGACTACCCTAGTA >329074 TACGGAAGGTCCGGGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGCAGGCCGTCCTTTAAGGCGTGCTGTGAAATGC CGCGGCTCAACCGTGGCACTGCAGCGCGAACTGGAGGACTTGAGTACGCACGAGGTAGGCGGAATTCGTGGTGTAGCGGT GAAATGCTTAGATATCACGAAGAACTCCGATTGCGAAGGCAGCTTACCGGAGCGCAACTGACGCTGAGGCTCGAAAGCGC GGGTATCGAACAGGATTAGATACCCTGGTAGTCCGCGCGGTAAACGATGGATGCCCGCCGCTGGGATTTGGATTTCAGCG GCCAAGCGAAAGCGTTAAGCATCCCACCTGGGGAGTACGCCGGCAACGGTGAAACTC >581733 TACGTAGGGGGCAAGCGTTGTCCGGAATAATTGGGCGTAAAGGGCGCGTAGGCGGCTCGGTAAGTCTGGAGTGAAAGTCC TGCTTTTAAAGGTGGGAATTGCTTTGGATGCTGTCGGGCTTGAGTGCAGGAGAGGTTAGTGGAATTCCCAGTGTAGCGGT GAAATGCGTAGAGATTGGGAGGAACACCAGTGGCGAAGGCGACTAACTGGACTGTAACTGACGCTGAGGCGCGAAAGCGT GGGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTTGGTTCCAAAGGAACTCGG TGCCGTCGCAAACGCATTAAGTATTCCACTGGGATACGTTCGCAAGAATGAAACTCAAAGGATTAGACGGGACCCGCACA GCGGTGGAGCATGT >1718 TACGTAGGTGGCGAGCGTTATCCGGAATCATTGGGCGTTAAAGAGGGAGCAGGCGGCCGCAAGGGTCTGTGGTGAAAGAC CGAAGCTAAACTTCGGTTAAGCCTTGGAAACCGGGCGGCTAGGAGTGCGGAGAGGATCGTGGAATTCCATGTGTAGCGGT GAAATGCGTAGATATATGGAGGAACACCAGTGGCGAAGGCGACGGTCTGGGCCGCAACTGACGCTCATTCCCGG >582971 TACGGAGGATCCTAGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGATGGGTTGTTAAGTCAGTTGTGAAAGTTT GCGGCTCAACCGTAAAATTGCAATTGATACTGGCAGTCTTGAGTACAGTTGAGGTAGGCGGAATTCGTGGTGTAGCGGTG AAATGCTTAGATATCACGAAGAACTCCGATTGCGAAGGCAGCTTACTAAACTGCAACTGACATTGATGCTCGAAAGTGTG GGTATCAAACAGGATTAGATACCCTGGTAGTCCACACGGTAAACGATGAATACTCGCTGTTGGCGAGTACACAGCCAGCG GCCAAGCG >508980 TACGTAGGTGGCAAGCGTTGTCCGGATTTACTGGGTGTAAAGGGCGTGTAGCCGGGAAGGCAAGTCAGATGTGAAATCCA CGGGCTTAACTCGTGAACTGCATTTGAAACTACTTTTCTTGAGTATCGGAGAGGCAATCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGATGTCTGGACGGACAACTAGACGGTGGAGG >63221 TACGTAGGTGGCAAGCGTTGTCCGGATTTACTGGGTGTAAAGGGCGTGTAGCCGGGTCGGCAAGTCAGATGTGAAATCTG GAGGCTCAACCTCCAAACTGCATTTGAAACTGCCGGTCTTGAGTATCGGAGAGGTAATCGGAATTCCTTGTGTAGCGGTG AAATGCGTAGATATAAGGAAGAACACCAGTGGCGAAGGCGGTTTACTGGGCCATAACTGACGCTGAGGCACGAAAGCGTG GGGAGCAAATAGGATTAGATACCCTAGTAGTCCACGCCGTAAACGATGAGTACTAAGTGTTGGGGCAACCCAGTGCTGAA GTTAACACATTAAGTACTCCGCCTGAGTAGTACGGTCGCAAGGCTGAAACTCAAAGGAATTGACGGGCACCCGCGACAAG CAGTGGAGCATGCTGTTAATTCGAAGATACGCGAAGAACCTTACCAGGGCTTGACATCCC >577111 TACGGAAGGTCCGGGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGGCCACAGGTTAAGCGTGTTGTGAAATGTA GGGGCTCAACCTCTGCACTGCAGCGCGAACTGGCTTGCTTGAGTACGCACAACGTGGGCGGAATTCGTGGTGTAGCGGTG AAATGCTTAGATATCACGAAGAACTCCGATTGCGAAGGCAGCTCGACGGGAGCGCAACTGACGCTGAAG >136740 TACGTAGGTGGCAAGCGTTGTCCGGAATTACTGGGTGTAAAGGGAGCGTAGGCGGGATGCCAAGTCAGCTGTGAAAACTA TGGGCTTAACTTGTAGACTGCAGTTGAAACTGGTATTCTTGAGTGAAGTAGAGGTTGGCGGAATTCGTGGTGTAGCGGTG AAATGCTTAGATATCACGAAGAACTCCGATTGCGAAGGCAGCTCACTGGAGTGTAACTGACGCTGATGCTCGAAAGTGTG GGTATCAAACAGGATTAGATACCCTGGTAGTCCACACAGTAAACGATGAATACTCGCTGTTTGCGATATACAGTAAG >144091 AACGTAGGGTGCAAGCGTTGTCCGGAATTACTGGGTGTAAAGGGAGCGCAGGCGGGAAGACAAGTTGGAAGTGAAAACCA TGGGGCTCAACCCATGAATTGCTTTCAAAACTGTTTTTCTTGAGTAGTGCAGAGGTAGATGGAATTCCCGGTGTAGCGGT GGAATGCGTAGATATCGGGAGGAACACCAGTGGCGAAGGCGGTCTACTGGGCACCAACTGACGCTGA >239291 TACGTAGGGAGCAAGCGTTATCCGGATTTATTGGGTGTAAAGGGTGCGTAGACGGGAGTGCAAGTTGGTTGTGAAATCCC TCGGCTTAACTGAGGAACTGCAACCAAAACTACATTTCTTGAGTGCTGGAGAGGAAAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGACTTTCTGGACAGTAACTGACGTTGAGGCACGAAAGTGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACACCGTAAACGATGGATACTAGGTGTAGGGGATGAATAATCTTCTG TGCCGTCGCAAACGCAGTAAGTATCCCACCTGGGGAGTACGGCCGCAAGGTTGAAACTCAAAGGATTGACGGGGGCCCGC ACAAGCAGTGGAGTATGTGGTTTAATTCGACGCAACGCGAAGACCTTACAGGGCTTGACATATACATGAAAATCTAAGAG ATTAGAATCCCTCTTTCGGAGCATGTATACGAGGTGGTG >244496 TACGTATGGTGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGCAGGCGGTGCGGCAAGTCTGATGTGAAAGCCC GGGGCTCAACCCCGGTACTGCATTGGAAACTGTCGTACTAGAGTGTCGGAGGGGTAAGTGGAATTTCTAGTGTAGCGGTG AAATGCGTAGATATTAGAAGGAACACCAGTGGCGAAAGCGGTTTGCTGGGCCGTTACTGACGCTGAGGCACGAAAGCGTG GGGAGCAAATAGGATTAGATACCCTAGTAGTCCACGCCGTAAACGATGAGTACTAAGTGTTGGAATTTCCAGTGCTGAAG CTAACGTATTAAGTACTCCGCCTGAGTAGTACGGTCGCAAGGCTGAAACTCAAAGGAATTGACGGGCACCCGCACAAGCG GTGGAGCATGCTGTTTAATTCGAAGATACGCGAAGAACCTTACCTAGACTTGACATCCCTGGCAAAGCTATAGAAATATA GTGGAGGCTATCCAGGTGAC >206632 TACGTAGGTGGCGAGCGTTATCCGGAATCATTGGGCGTAAAGAGGGAGCAGGCGGCCGCAAGGGTCTGTGGTGAAAGACC GAAGCTAAACTTCGGTAAGCCATGGAAACCGGGCGGCTAGAGTGCGGAAGAGGATCGTGGAATTCCATGTGTAGCGGTGA AATGCGTAGATATATGGAGGAACACCAGTGGCGAAGGCGACGGTCTGGGCCGCAACTGACGCTCATTCCCGAAAGCGTGG GGAGCAAATAGGATTAGATACCCTAGTAGTCCACGCCGTAAACGATGGTCACTAAGTGTCGGGGGTCAAACCCCGGTGCT GCAGTCAACGCAATAAGTGACCCGCCTGAGTAGTACGTTCGCAAGAATGAAACTCAAAGGATTGACGGGGCCCGCACAAG CGTGGAGCATGTGGTTTAATCGAAGCAACGCGAAGAACCTTACGAGGGCTTGACATCCTAACTACGAGATAGAGATATGT AGTG >222914 TACGTATGGAGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGTGTAGGTGGCATCACAAGTCAGAAGTGAAAGCCC GGGGCTCAACCCCGGGACTGCTTTTGAAACTGTGGAGCTGGAGTGCAGGAGAGGCAAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTGCTGGACTGTAACTGACACTGAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTCGGGGCCCATAAGGGCTTCG GTGCCGCAGCAAACGCAATAAGTATTCCACCTGGGGAGTACGTTCGCAAGAATGAAACTCAAAGGATTGACGGGGACCCG CACAAGCGGTGGAGCATGTGGTTTAATTCGAAGCAGCGCGAAGAACCTTACCAAGTCTTGACATCCTCTTGCCCGGTCAG TAATGTGACCTTTTCTACGGAACAAGAGTGACA >242989 TACGGAAGGTCCGGGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGGCCGGAGATTAAGCGTGTTGTGAAATGTA AGTGGCTCAACCTCTGCACTGCAAGCGTCGTAACTGGTCTTCTTGAGTACGCACAACGTGGGCGGAATTCGTGGTGTAGC GGTGAAATGCTTAGATATCACGAGAACTCCGATTGCGAAGGCAGCTCACGGGAGCGCAACTGACGCTGAAGCTCGAAAGT GCGGGTATC >238929 AACGTAGGGTGCAAGCGTTGTCCGGAATTACTGGGTGTAAAGGGAGCGCAGGCGGGAAGACAAGTTGGAAGTGAAAACCA TGGGCTCAACCCATGAAATTGCTTTCAAAAACTGTTTTCTTGAGTAGTGCAGAGGTAGATGGAATTCCCGGTGTAGCGGT GGAATGCGTAGATATCGGGAGAACACCAAGTGGCGAAGGCGGTCTACTGGGCACCAGCTGACGCTGAGGCTCGAAAGCAT GGGTAAGCAAACAGGAATTAGATACCCTGGTAGTCCATGCCGTAAACGA >155970 TACTGCCGCATGGTGGTGAGCATGTTGTCGATGTTGAAGTCGGACTTCTCCACCTTGATGTCACGCTGTGCCAGTTCCTT GCGGTAGTCGTCACGCATATACTCGTAGAAGGTGTTGAACGACGGCACGATGCTACGGTCGGATTGGATGCGCTCAATAT A >137099 TACGTAGGTGGCAAGCGTTGTCCGGAATTACTGGGTGTAAAGGGTGCGCAGGCGGGATTGCAAGTTGGATGTGAAATACC GGGGCTTAACCCCGGAGCTGCATCCAAAACTGTAGTTCTTGAGTGGAGTAGTGGTAAGCGGAATTCCGAGTGTAGCGGTG AAATGCGTAGATATTCGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGGCTCTAACTGACGCTGAGGCACGAAAGCATG GGTAGCAAACAGGATTAGATACCCTGGTAGTCCATGCTGTAAACGATGAATGCTAGGTGTGGGGGGACTGGACCCTTCCG TGCCGGAGTAAACACAATAAGCATTCCACCTGGGGAGTACGGACCGCGAACGGTTGAAACTCAAAAGGAATTAGGACGGG GGCCCG >533173 TACGTAGGTGGCAAGCGTTGTCCGGATTTACTGGGTGTAAAGGGCGTGCAGCCGGGCCGGTAAGTCAGATGTGAAATCTA TGGGCTCAACCCATAAATTGCATTTGAAACTGCTGGTCTTGAGTACTGGAGAGGCAGACGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGTCTGCTGGACAGCAACTGACGGTGAGGCGCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCTGTAAACGATGGATACTAGGTGTGCGGGGACTGACCCCCTGCG TGCCGCAGTTAACACAATAAGTATCCCACCTGGGGAGTACGATCGCAAGGTTGAAACTCAAAGGAATTGACGGGGGCCCG CACAAGCGGTGGATTATGTGGTTTAATTCGAAGCAACGCGAAGAACCTTACCAGGGCTTGACATCCTACTAACGAAGTAG AGATACATTA >544430 TACGGAGGATCCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGTGCGTAGGCGGCCTTTTAAGTCAGCGGTGAAAGTCT GTGGCTCAACCATAGAATTGCCGTTGAAACTGGGGGGCTTGAGTATGTTTGAGGCAGGCGGAATGCGTGGTGTAGCGGTG AAATGCTTAGATATCACGCAGAACCCCGATTGCGAAGGCAGCCTGCCAAGCCATGACTGACGCTGATGCACGAAAGCGTG GGGATCAAACAGGATTAGATACCCTGGTACGTCCACGCAGTAAACGATGATCACTAGTCTTGTTTGCGATACAGTGTAAG CGGCACAGACGAAAGTCGTTAAGTGACTCCGACGTGGGGACGTACGGCCGGAC >309328 TACGTAGGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGGCGGCGGAGCAAGTCAGAAGTGAAAGCCC GGGGCTCAACCCCGGGACGGCTTTTGAAACTGCCCTGCTTGATTTCAGGAGAGGTAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGACTTACTGGCCTGCAACTGACACTGAGGCACGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGATTACTAGGTATGGGAGGTATCGACTCCTTCC GTGCCGCAGCAAACGCAATAAGTAATCCGCCTGGGGAGTACGGCCGCAAGGTTGAAACTCAAAGAAATTGACGGGGACCC GCACAAGCAGCGGAGCATGTGGTTTAATTCGACGCAACGCGAAAACCTTACCAGGTCTTGACATCCTTTGACCGCCTGAG AGATCAGGAATCTCTAGCAATAGAGCAGAGAGACA >588740 TACGGAGGATCCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGTGCGTAGGCGGCCTTTTAAGTCAGCGGTGAAAGTCT GTGGCTCAACCATAGAATTGCCGTTGAAACTGGGGGGCTTGAGTATGTTTGAGGCAGGCGGAATGCGTGGTGTAGCGGTG AAATGCTTAGATATCACGCAGAACCCCGATTGCGAAGGCAGCCTGCCAAGCCATGACTGACGCTGATGCACGAAAGCGTG GGGATCAAACAGGATTAGATACCCTGGTAGTCCACGCAGTAAACGATGAACTCACTAGCTGTTTGCGATACAGTGTAACG CGGCACAGCGAAAGCGTTAAAGTGATCCACCTGGGGGAGTTACGCCGGCCAACGGTGAAACTCAAAGGAATTGAC >200064 TACGTAGGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGGCGGCGATGCAAGTCAGAAGTGAAAGCCC AGGGCTTAACCGTGGGACTGCTTTTGAAACTGTGTTGCTGGATTGCCGGAGAGGTAAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACGGTGAATGACGCTGAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTCGGGGCCCAAAAGGGTTCCG GTGCCGCAGCAAACGCGAATAAGTATTCCACCTGGGGAGTACGTT >582509 TACGTAGGGAGCAAGCGTTATCCGGATTTATTGGGTGTAAAGGGTACGTAGGCGGCCTCATAAGTCTGTGGTTTAAGCCC GAAGCTTAACTTCGGTTCGCCACAGAAACTGTTTGGCTTGAGTATGGTAGAGGCAAGTGGAATTTCTAGTGTAGCGGTTA AATGCGTAGATATTAGTAAGGAACGACCACGTGGCGGAA >524765 TACGTAGGTGCAAGCGTTATCCGGAATTAGTTGGGCGTAAAGGGCTCGTAGGCGGTTCGTCGCGTCCGGTGTGAAAGTCC ATCGCTTAACGGTGGATCCGCGCCGGGTACGGGCGGGCTTGAGTGCGGTAGGGGAGACTGGAATTCCCGGTGTAACGGTG GAATGTGTAGATATCGGGAAGAACACCAATGGCGAAGGCAGGTCTCTGGGCCGTTACTGACGCTGAGGAGCGAAAGCGTG GGGAGCGAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGGTGGATGCTGGATGTGGGGCCCGTTCCACGGGTTC CGTGTCGGAGCTAACGCGTTAAGCATCCCGCCTGGGGAGTACGGCCGCAAGGCTAAAACTCAAAGAAATTGACGGGGCCC GCACAAGCGGCGGAGCATGCGGATTAATTCGATGCAACGCGAAGACCTACTGGGCTTGACATGTTCCCGAGGTCGTAGAG ATACGGCTTCCCTTTCGGGGCGGGTTCACGAGGTGGTGCATGGTCGTCGTCAG >259028 TACGTAGGTGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGCGCGTAGGCGGGGATGCAAGTCAGATGTGAAATCTA TGGGCTTAACCCATAAACTGCATTTGAAACTGTATCTCTTGAGTGCTGGAGGGGTAGACGGAATTCCTTGTGTAGCGGTG AAATGCGTAGATATAAGGAAGAACACCAGTGGCGAAGGCGGTCTACTGGACAGTAACTGACGCTGAGGCGCGAGAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCTGTAAACGATGAATACGTAGGTGTGGGAGGACTGACCCCTTCC GTGCCGCAGTTAACACAATAAGTATT >533036 TACGTAGGGAGCAAGCGTTGTCCGGAATTACTGGGTGTAAAGGGAGCGTAGGCGGGGAAACAAGTTGAATGTGAAATCCA TGGGCTCAACCCATGGCTGCGTTCAAAACTGTATCTCTTGAGTGAAGTAGAGGCAGGCGGAATTCCTAGTGTAGCGGTGG AATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCCTGCTGGGCTTTTACTGACGCTGAGGCTCGAAAGCGTGG GTAGCAACAGGATTAGATACCCTGGTAGTCCACGCGGTAAACGATGATTACTAGGTGTGGGGTGGACTGACCCCATCCGT GCCGGAGTTAACACAATAAGTAATCCACCTGGGGAGTACGGCCGCAAGGTTGAAACTCAAAGGAATTGACGGGGGCCCGC ACAAGCAGTGGAGTATGTGGTTTAATTCGACGCAACGCGAAGAACCTTACCAGGTCTTGACATCGAGTGACGAGCGTAGA GATACGCTTTCCCTTCGGGCACGAAGCAGGTGGTGCTAG >200049 TACGTAGGGGGCAAGCGTTGTCCGGAATAATTGGGCGTAAAGGGCGCGTAGGCGGCTCGGTAAGTCTGGAGTGAAAGTCC TGCTTTTAAGGTGGGAATTGCTTTGGATACTGTCGGGCTTGAGTGCAGGAGAGGTTAGTGGAATTCCCAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTGCTGGACGACAACTGACGCTGAGGCGCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCTGTAAACGATGAATACTAGGTGTGGGAGGACTGACCCCTTCCC GTGCCCGCAGTTAACACAATAAGTATTCCACCTGGGGAGTACGACCGCAAGGTTGAAACTCAAAGGAATTGAACGGGGGC CCGCGACGAAG >179213 TACGTAGGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGCAGGCGGCATGATAAGTCTGATGTGAAAACCC AAGGCTCAACCATGGGACTGCATTGGAAACTGTCGTGCTGGAGTGTCGGAGAGGTAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACGATGACTGACGCTGAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGGTGGTCGGGGAGCACAGCTCGTT CGGTGCCGCAGCAAACGCAGTAAGTA >2783 AGGTAGCGTACCACTCCTGATTGGACTGGAAGGGTACCTCCGGGTGCCCTCCTGATAGAACAGGTCGGCTTCTTCCACGT TCAGCTCCGGGTAGGGGTGGAGTGTAGCTGGCGGTGAAGGGCAACTGGCTGCCCTCGGTGTCTGTGTCTGTGGGCAAAAG ACACATCCGGTCGGCGTCTGCGGGTCCGTGTCAAATAGCCCTCGTCGGTGTCGCGGCCGGTCTCCAGCCAGTTGCCCTCC AGCGACCACGGGCTGGTGTCGGTCTCCCAGTCGTCCCCATCCGGGTAGATGGTAAAAT >352654 TACGTAGGTTGCAAGCGTTGTCCGGATTTACTGGGTGTAAAGGGCGTGTAGGCGGAGATGCAAGTTAGGAGTGAAATCTA TGGGCTTAACCCATAAACTGCTTCTAAAACTGTACTCCTGAGTATCGGAGAGGCAAGGACGGTAACTTCCTAGTGTAGCG GTAGAAATGCGTAGATTAGTTA >269075 TACGTAGGGAGCGAGCGTTGTCCGGAATTACTGGGTGTAAAGGGAGCGTAGGCGGGATCTTAAGTCAGGTGTGAAAACTA TGGGCTCAACCCATAGACTGCACTTGAAACTGAGGTTCTTGAGTGAAGTAGAGGCAGGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACATCAGTGGCGAAGGCGGCCTGCTGGGCTTTTACTGACGCTGAGGCTCGAAAGTGTG GTATCAAACAGGATTAGATACCCTGGTAGTCCACACGGTAAACGATGAATACTCGCTGTTTGCGATATACTGCAAGCGGC CAAGCGAAAGACGTTAAGTATTCCACCTGGGGAGTACGCCGGCAACGGTGAAACT >542353 TACGGAGGATCCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGGCGGACGCTTAAGTCAGTTGTGAAAGTTT AGTCGGCTCAACCGTAAAAACTTAGCAGTTGATACTGGGTGGTCTTGTAGTACAGTAGAGGCGAGGCGGAATTCGTGGTG TAGCGGTGAAATGCTTAGATATCACGAAGAACTCCGATTGCG >244840 CCTACGTAGGTGGCGAGCGTTGTCCGGAATTACTGGGTAGTAAAGGGAGTGTAGGCGGGAAGGCAAGTCAGAAGTAGAAA ATTATGGGCTTAACCCATAACCTGTCTTTTGTAAACTTGTTTTTCTTGAGTGAGGCAGAGCAAGCGGAATTCCTAGTGTA GCGGTGAGATGCGTAGATA >513639 TACGTAGGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGACGGCGATGCAAGTCTGAAGTGAAATACC CGGGCTCAACCTGGGAACTGCTTTGGAAACTGTGTTGCTAGAGTGCTGGAGAGGTAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAAGAACACCAGTGGCGAAGGCGACTTTCTGGACGACAACTGACGCTGAGGCGCGAAAGCGTG GGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTAGGAGGTATCGACCCCTTCTG TGCCGGAGCTAACACAATAAGTATTCCGCCTGGGAAGTACGATCGCAAGATTAAAACTCAAGGGAA >278955 CACGGGGGATGCGAGCGTTATCCGGATTCATTGGGTTTAAAGGGAGCGTAGGCGGCCCGACAAGTCAGCGGTAAAAGACT GCAGCTAAACTGTAGCGCGCCGTTGAAACTGCCGGGCTAGAGTGCAGACGAGGTTGGCGGAACAGGTGAAGTAGCGGTGA AATGTATAGATATCACCTGGAACCCCGACAGCGAAGGCAGCTGACCAGGCTGTAACTGACGCTGATGCTCGAGAGCGTGG GTAGCGAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGCTCACTGGCCCTGGGCGACATACAGTCCGGGGT CAGCGAAAGTAAAGTGAGCCACCTGGGGATACGTCGGCAACGATGAAACTCAAAGGATTGGACGGGGGCCCGCACAAGCG GAGGAACATGTGGTTAATTCGATGATACGCGAGGAACCTTACCGGGTTTAAATGCAGGTT >321885 TACGTAGGGAGCAAGCGTTGTCCGGAATTACTGGGTGTAAAGGGAGTGTAGGCGGGACTGCAAGTCAGATGTGAAATTTA GGGGCTCAACCCCTGAACTGCATTTGAAACTGTGGTTCTTGAGTGAAGTAGAGGTAAACGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACATCAGTGGCGAAGGCGGTTTACTGGGCTTTTACTGACGCTGAGGCCTACGAAGCGG TGGGGAGACAAACAGGTATTAGACTACCCTGGTACGTCCACGCTAGTAAACGATG >567145 TACGGAGGATCCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGATGGATGTTTAAGTCAGTTGTGAAAGTTT GCGGCTCAACCGTAAAATTGCAGTTGATACTGGATATCTTGAGTGCAGTTGAGGCAGGCGGAATTCGTGGTGTAGCGGTG AAATGCTTAGATATCACGAAGAACTCCGATTGCGAAGGCAGCCTGCTAAGCTGCAACTGACATTGAGGCTCGAAAGTGTG GGTATCAAACAGGATTAGATACCCTGGTAGTCCACACGGTAAACGATGAATACTCGCTGTTTGCGATAGTACAGCAAGCG GCCAAGCGAAAGCGTTAAGATTCCACCTGGGGATACGCGGCAACGGTGAACTCAAAGGAATTGACGGGGGCCCGCGACCA AG >572242 AACGTAGGGTGCAAGCGTTGTCCGGAATTACTGGGTGTAAAGGGAGCGCAGGCGGACCGGCAAGTTGGAAGTGAAAACTA TGGGCTCAACCCATAAATTGCTTTCAAAACTGCTGGCCTTGAGTAGTGCAGAGGTAGGTGGAATTCCCGGTGTAGCGGTG GAATGCGTAGATATCGGGAGGAACACCAGTGGCGAAGGCGACCTACTGGGCACCAACTGACGCTGAGGCTCGAAAGCATG GTAGCAACAGATTAGATACCTGGTAGTCCATGCCGTAAACGATAGATTACTAGGTGTTGGAGGATTGACCCTTCCAGTGC CGCAGTTAACACAATAAGTAATCCACCTGGGGAGTACGA >329570 TACGGAGGATCCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGATGGATATTTAAGTCAGTTGTGAAAGTTT GCGGCTCAACCGTAAAATTGCAGTTGATACTGGATATCTTGAGTGCAGTTGAGGCAGGCGGAATTCGTGGTGTAGCGGTG AAATGCTTAGATATCACGAAGAACTCCGATTGCGAAGGCAGCCTGCTAAGCCGCAACTGACATTGAGGCTCGAAAGTGTG GGTATCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTGGGGGGACTGACCCTTCCGT GCCGCAGTTAACACAATAAGTATTCCACCTGGGAGTACGACCGCAAGGTTG >239490 TACGTATGGAGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGGCGGTCCTGCAAGTCTGATGTGAAAGGCC GGGGCTCAACCCCGGGACTGCATTGGAAACTGTAGGACTAGAGTGTCGGAGGGGTAAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACGACTACTGACGCTGAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTTGGCAGGTAAGACCTGTCGG TGCCGCAGCAAACGCAATAAGTATTCCACCTGGGGATACGTTCGCAAGAATGAAACTCAAAGGAATTGACGGGGACCCGC ACAAGCGGTGGAGCATGTGGTTTAATTCGAAGCAACGCGAAGAACCTTACCAAGTCTTGACATCCCGGTGACAGAACATG TAATGT >213873 TACGTATGGTGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGCAGGCGGTGCGGCAAGTCTGAAGTGAAAGCCC GGGGCTTAACCCCGGGACTGCTTTGGAAACTGTAGGACTAGAGTGCAGGAGAGGTAAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACTGTAACTGACGTTGAGGCTCGAAAGCGTG GGGAGCAAACATGATTAGATACCCTGGTAGTCCACGACCGTAAACGATGATTACGTAGGTGTTGGTGGGTAT >554003 TACGTAGGTGGCAAGCGTTGTCCGGATTTACTGGGTGTAAAGGGCGTGCAGCCGGGAATGCAAGTCAGATGTGAAATCCA TGGGCTTAACCCATGAACTGCATTTGAAACTGTATTTCTTGAGTACTGGAGAGGCAATCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGATTGCTGGACAGCAACTGACGGTGAGGCGACGAAAGTGG TGGGGAGACAAAC >182894 TACGGAAGGTCCGGGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGCAGGCCGTCCTTTAAGCGTGCTGTGAAATGCC GCGGCTCAACCGTGGCACTGCAGCGCGAACTGGAGGACTTGAGTACGCACGAGGTAGGCGGAATTCGTGGTGTAGCGGTG AAATGCTTAGATATCACGAAGAACTCCGATTGCGAAGGCAGCTTACCGGAGCGTAACTGACGCTGAGGCTCGAAAGCGCG GTATCGAACAGGATTAGATACCCTGGTAGTCCGCGCGGTAAACGATGGATGCCCGCCGTTGGGATTTGGATTTCAGCGGC CAAGCGAAAGCGTTAAGCATCCCACTGGGGAGTACGCCGGCAACGGTGAAACTC >88335 ACCTGCCAGTTTCACCTTATCACGGTCTACATCGAAATAGAGCTGCGGGATATCTGCCTGCAAAGATGATGATAACCCGG ATAATTCCTTGCGTTGCGAAGCGTAATACATCAACGTATCCGTCGCTTGTACCAGATTATCAAAAGTAGCGTCTCCACGT GCTTCGAGTTGCATCTCGAAACCACCCGAACTTCCCAGCCCCGGGATAACCGGCGGTGTGGAAAGATATACCTTACACTC GGGATACTCCTGCAAATCCTTTTCACCTGAGCCATTACCTCATCGATAGTCTGTCCGTCACGTGCACCCCACGGTTTCAG AATAACTGTCAGTTCACTACGTGCCTGACTGCTACCCACACGGGGGCTACTACCTACTACACTCTGAACATACTCTACAG CCGGATTCAACATCAGATATTCTATAGCACGTTCCGATACGATTCGCGTACGCTCCAGCGTCGCACCTTCAGGCAAC >89763 TACGGGAAGGTTCAGGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGCAGGCGGACCTTTAAGTCAGCTGTGGAAATA CGGCGGCTCAACCGTCGAACTGCAGTTGATACTGGAGGTCTTGAGTGCACACAGGGATACTGGAATTCATGGTGTAGCGG TGAAATGCTCAGATATCATGAAGAACTCCGATCGCGAAGGCAGGTATCCGGGGT >248299 TACGTAGGGAGCGAGCGTTGTCCGGAATTACTGGGTGTAAAGGGAGCGTAGGCGGGATCTTAAGTCAGGTGTGAAACTAT GGGCTCAACCCATAGACTGCACTTAGAAACGTGAGGTTCTTGAGTGAAGTAGAGGCAGGCGGAATTCCTAGTGTAGCGGT GAAATGCGTAGATATTAGGAGGAACATCCAGTGGCGAAGGCGGCCTGCTGGGCTTTTACTGACGCTGAGGCTCGAAAGCG TGGGGAGC >136780 TACGTAGGGGGCAAGCGTTGTCCGGAATAATTGGGCGTAAAGGGCGCGTAGGCGGCTCGGTAAGTCTGGAGTGAAAGTCC TGCTTTTAAGGTGGGAATTGCTTTGGATACTGTCGGGCTTGAGTGCAGGAGAGGTTAGTGGAATTCCCAGTGTAGCGGTG AAATGCGTAGAGATTGGGAGGAACACCAGTGGCGAAGGCGACTAACTGGACTGTAACTGACGCTGAGGCGCGAAAGTGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACACTGTAAACGATGAATGCTAGGTGTAGGGGGTATCGACCCTTCTG TGCCGCAGTCAACACAATAAGCATTCCGCCTGGGGAGTACGGCCGCGAAGGTTGAAACGTACAAGGAAAGTTAGTACGGG GGACCCCGGGCCGACCGAAACGACGACGACGGACGGGACGA >368027 TACGGAGGATCCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGATGGATGTTTAAGTCAGTTGTGAAAGTTT GCGGCTCAACCGTAAAATTGCAGTTGATACTGGATATCTTGAGTGCAGTTGAGGCAGGCGGAATTCGTGGTGTAGCGGTG AAATGCTTAGATATCACGAAGAACTCCGATTGCGAAGGCAGCCTGCTAAGACTGCAACTGACATT >106480 TACGTATGGTGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGGTGGCAAGGCAAGCCAGGAAGTGAAAACC CGGGCTCAACCGCGGGATTGCTTTTGGAACTGTCATGCTAGAGTGCAGGAGGGGTGAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCGGAGGCGAAGGCGGCTCACTGGACTGTAACTGACACTGAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCGGTAAACGATGAATACTAGATGTCGGGTAGCAAAGCTATTCGG TGTCGTCGCAAACGCAATAAGTATTCCACGTGGGATCGTCGCAAGATG >296956 TACGTAGGGTGCGAGCGTTAATCGGAATTACTGGGCGTAAAGGGTGTGCAGGCGGTTTTGCAAGATGGATGTGAAAGCCC CGGGCTTAACCTGGGAAAGCCATACATGACTGCAAGACTAGAGTGCGTCAGGAGGGGGTGGAATTCCAAGTGTAGCAGTG AAATGCGTAGATA >319724 TACGTATGGTGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGACGGAGTGGCAAGTCTGATGTGAAAACCC GGGGCTCAACCCCGGGACTGCATTGGAAACTGTCAATCTAGAGTACCGGAGAGGTAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAGCACCAGTGGCGAAGGCGGCTTACTGGACGGTAACTGACGTTGAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGACTACTAGGTGTCGGGCAGCAAAGCTGTTCGG TGCCGCAGCAAACGCAATAAGTAGTCCACCTGGGGAGTACGTTCGCAAGAATGAAACTCAAAGGAATTGACGGGGGCCCG CACAAGCGGAGGAACATGTGGTTTAATTCGATGATACGCGAGGAACCTTACCGGGCTTAAATTGCAGATGAATTACGGTG AAAGCCGTAAGCCGCAAGGCATCTGTGAAGGTGCTGCA >254133 TACGTAGGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGGCGGTTTGGCAAGTCAGAAGTGAAAGCCC AAGGCTTAACCATGGGACTGCTTTTGAAACTGTCAGACTAGATTGCAGGAGAGGTAAGTGGAATTCCTGGTGTAGCGGTG AAATGCGTAGATATCAGGAGGAACACCGGTGGCGAAGGCGGCTTACTGGACTGTAAATGACGCTGAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCGGTAAACGATGAATACTAGATGTTGGGGAGCGAAGCTCTTCGG TGTCGCAGCAAACGCAATAGTATTCCACCTGGGGAGTACGTTCGCAAGAATGAAACTCAAAGG >70379 TACGTAGGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGACGGCATCACAAGTCAGAAGTGAAAATCC GGGGCTCAACCCCGGAACTGCTTTTGAAACTGTGGAGCTGGAGTGCAGGAGAGGTAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACTGTAACTGACGTTGAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTTGGGTTTCATAAGAAGCTCG GTGCCGGCGCAAACGCATTAAGTATTCCACCTGGGGATACGTTCGCAAGATGAAACTCAAAAGGAATTGACGGGGGACCC GCACGAAGCGGTGGAGCAGTGTGGTTTAATCGAAGCAACG >65695 TACGGAAGGTCCGGGCGTTATCCGGATTTATTGGTTTAAAGGGAGGCGTAAGGCCGTTTGGTAAGCGTGTTGTGAAATGT CGGGGCTCAAACCTGGGCATTGCCAGCGCGAACTGCCAGACTTGAGTGCGCAGGAAGTAGGCGGAATTCGTCGTGTAGCG GTGAAATGCTTAGATATGACGAAGAACTCCGATTGCGAAGGCAGCCT >534516 TACGTAGGTGGCGAGCGTTATCCGGAATCATTGGGCGTAAAGAGGGAGCAGGCGGCCGCAAGGGTCTGTGGTGAAAGACC GAAGCTAAACTTCGGTAAGCCATGGAAACCGGGCGGCTGGAGTGCGGAAGAGGATCGTGGAATTCCATGTGTAGCGGTGA AATGCGTAGATATATGGAGGAACACCAGTGGCGAAGGCGACGGTCTGGGCCGCAACTGACGCTCATTCCCGAAAGCGTGG GGAGCAAATAGGATTAGATACCCTAGTAGTCCACGCCGTAAACGATGGTCACTAAGTGTCGGGGGTCAAACCCCGGTGCT GCAGTCAACGCAATAAGTGACCCGCCTGAGAGTTTTTTACGTCGCAAGAATGAAACTCAAAAGGATTGGACGGGGGCCC >206278 TACGTATGGTGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGCAGGCGGTGCGGCAAGTCTGATAGTCGGAAAG CCCGGGGCCGTCAACCCCGGTACTTGACATTGGAAACTGTCGTACTAGAGTGTCGGAGGGTAAGCGGAATTCCTAGTGTA GCGGTGAAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACGATAACTGACGCTGAGGCTCGAA AGCGTGGGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTTGGGAAGC >218985 AACGTAGGGTGCGAAGCGTTGTCCGGAATTACTGGGTGTAAAGGGAGCGCAGGCGGGAAGACAAGTTGGAAGTGAAAAAC CATGGGCTCAACCCATGAATTGCTTTCAAAACTGTTTTTCTTGAGTAGTGCAGAGGTAGATGGAATTCCCGGTGTAGCGG TGGAATGCGTAGATATCGGGAGGAACACCAGTGGCGAAGGCGGTCTACTGGGCACCAACTGACGCTGA >240228 CATGCAGGTGGAAGTGGACGGCTCCCGTGTGGACTGCTTCGAGCTGGTGCAGACCCGGGACGCTTCCGAGGTGGAGGACC ACAAGATCGTTGTGGACGGTCCCGAGATTGACGAGATCCCCGTCGGCTCCAAGATTTCTCTGAGCTACACCGTGGAAGTC GCCGGCAAGGCCATGCAGCCCGACTTTGGGTCCGTCATGGAGCGTAAGATGCACTCCTGGATCAACTGCATCGAGGGCGT TA >261663 TACGTAGGTGGCAAGCGTTGTCCGGAATTACTGGGTGTAAAGGGAGCGTAGGCGGGCAGGCAAGTCAGGCGTGAAATATA TCGGCTCAACCGGTAACGGCGCTTGAAACTGCAGGTCTTGAGTGAAGTAGAGGTTGGCGGAATTCCTAGTGTAGCGGTGA AATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGACTTACTGGACTGTAACTGACGTTGAGGCACGAAAGTGTGG GGAGCAAACAGGATTAGATACCCTGGTAGTCCGCACCGTAAACGATGGATACTAGGTGTAGGATGTGTTAAACATTCTGT GCCGTCGCAAACGCAGTAAGTATCCCACCTGGGGAGTACGGCCGCAAGGTTGAAACTCAAAGGAATTGACGGGGGCCCGC ACAAGCAGTGGAGTATGTGGTTTAATTCGAAGCAACGCGAAGAACCTTACCAGGGCTTGACATATACAGGAATATATTAG AGATAGTATAGCTCTTCGGAGTCTGTATACAGGTG >513763 AACGTAGGGTGCAAGCGTTGTCCGGAATTACTGGGTGTAAAGGGAGCGCAGGCGGGAAGACAAGTTGGAAGTGAAAACCA TGGGCTCCAACCCATGAATTGCTTTCAAAACTGTTTTTCTTGAGTAGTGCAGAGGTAGATGGAATTCCCGGTGTAGGCGG TGGAATGCGTAGATATCGGGAGGACACCAGTGGCGAAGGCGGTCTACTGGGCACCAACGTGACGCT >533078 AACGTAGGTCACAAGCGTTGTCCGGAATTACTGGGTGTAAAGGGAGCGCAGGCGGGGAAGGCAAGTTGGAAGTGAAATCC ATGGGCTCAACCATGAACTGCTTTCAAAACTTGTTTTTTCTTGAGTAGTGCAGAGGTAGGCGGAATTCCCGGTGTAGCGG TGGAATGCGTAGATAGTCGGGAGGAACACCA >509572 TACGTAGGGGGCGAGCGTTGTCCGGAATTACTGGGCGTAAAGGGTGCGTAGGCGGTTGCTTAAGTTGGATGTGAAATACC CGGGCTTAACTTGGGGGGTGCATTCAAGACTGGGGAACTAGAGTACAGGAGAGGGAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCGGTGGCGAAGGCGGCTTTCTGGACTGACACTGACGCTGAGGCACGAAAAGCGT GGGGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCTGTAAACGATGAATACTAGGTGTAGGGGGTATGAACTCCCT CTGTGCCGCAGCAAACGCAATAAGTATTCGCCTGGGAGTACGGCCGCAAGGTTGAAACTCAAAGGAATTGACGGGGGACC CGGC >521924 TACGTAGGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGCAGGCGGTCTGGCAAGTCTGATGTGAAATCCC GGGGCTCAACTCGGAATTGCATTGGAAACTGTCAGACTAGAGTGCCGGAGAGGTAAGTGGAATTCCTAGTGTAGCGGTGA AATGCGTAGATATTAGGAGGAACACCGGTGGCGAAGGCGGCTTACTGGACGGTAACTGACGCTGAGGCTCGAAAGCGTGG GGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTCGGGGCACAAAAGTGCTTCGG TGCCGCAGCAAACGCATTAAGTATTCCACCTGGGAGTACGTTCGCAAGAATGAAACTCAAAGGAATTGACGGGGACCCGC GACAAGCGGTGGAGCATGTGGTTTAATTCGAAGCAACGCGAAGAACCTTACCAAGTCTTGACATCCCGTTGACCTTGTTA TGTAATGTAACATCTCTTCGGAGCAACGGAGAC >536982 AACGTAGGTGGCAAGCGTTGTCCGGAATTACTGGGTGTAAAGGGAGCGCAGGCGGAAGCGCAAGTTGGATGTGAAACCCA TGGGCTCAGCCCATGGCCTGCATCCAAAACTGTGTTTCTTGAGTAGTGCAGAGGTAGGCGGAATTCCCGGTGTAGCGGTG GAATGCGTAGATATCGGGAGGAACACCAGTGGCGAAGGCGGCCTACTGGGCACCAACTGACGCTGAGGCTCGAAAGCATG GGTAGCAAACAGGATTAGATACCCTGGTAGTCCATGCCGTAAACGATGATTACTAGGTGTTGGAGGATTGACCCCTTCAG TGCCGCAGTTAACACAATAAGTAATCCACCTGGGGATACGACCGCAAGGTTGAAACTCAAAGGAATTGACGGGGGCCCGC ACAAGCAGTGGAGTATGTGGTTTAATTCGAAGCAACGCGAAGAACCTTACCAGGTCTTGACATCGGATGCATAGTGCAGA GATGCATGAAGCCC >278709 TACGGAGGATTCAAGCGTTATCCGGATTTATTGGGTTTAAAGGGTGCGTAGGCGGTTTGATAAGTTAGAGGTGAAATCCC GGGGCTTAACTCCGGAACTGCCTCTAATACTGTTAGACTAGAGAGTAGTTGCGGTAGGCGGAATGTATGGTGTAGCGGTG AAATGCTTAGAGATCATACAGAACACCGATTGCGAAGGCAGCTTACCAAACTATATCTGACGTTGAGGCACGAAAGCGTG GGGAGCAAATAGGATTAGATACCCTAGTAGTCCACGCCGTAAACGATGGTCACTAAGTGTCGGGGTCAAACCCCGGTGCT GCAGTCAACGCAATAAGTGACCCGCCTGAGTAGTACGTTCGCAAGAATGAAACTCAAAGGAATGGACGGGGCCCGCACAA GCGGTGGAGCATGTGGTTTAATTCGAAGCAACGCGAAGAACCTTACCAGGTCTTTGACATCGATCGTAAAAAGGGATGGA GACATCCTCA >304270 TACGTAGGTGGCAAGCGTTGTCCGGATTTACTGGGTGTAAAGGGCGCGTAGGCGGGATGGCAAGTCAGATGTGAAATCCA TGGGCTCAACCCATGAACTGCATTTGAAACTGTCGTTCTTGAGTATCGGAGAGGCAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTGCTGGACGACAACTGACGCTGAGGCGCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTGGGGGGACTGGACCCCCTCC GTGCCGCAGTTAACACAATAA >262115 TACGTAGGTGGCGAGCGTTATCCGGAATTATTGGGCGTAAAGAGGGAGCAGGCGGCACTAAGGGTCTGTGGTGAAAGATC GAAGCTTAACTTCGGTAAGCCATGGAAACCGTAGAGCTAGAGTGTGTGAGAGGATCGTGGAATTCCATGTGTAGCGGTGA AATGCGTAGATATATGGAGGAACACCAGTGGCGAAGGCGACGATCTGGCGCATAACTGACGCTCAGTCCCGAAAGCGTGG GGAGCAAATAGGGATTAGATACCCTAGTAGTCCACGCCGTAAACGATGAGTACTAAGTGTTGGGAGTCAAATCTCAGTGC TGCAGTTAACGCAATAAGTACTCCGCCTGAGTAGTACGTTCGCAAGAATGAAACTCAAACGGAATTAGACGGGGGCCCGC GACAAGCGGTGGAGCATGTGGTTTAATTCGAAG >68350 TACGTATGGAGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGTGTAGGTGGCCATGCAAGTCAGAAGTGAAAATCC GGGGCTCAACCCCGGAACTGCTTTTGAAACTGTAAGGCTAGAGTGCAGGAGGGGTGAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTCACTGGACTGTAACTGACACTGAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAACTGTTTGCGATACAATGTAAGCGG TACAGCGAAAAGCGTTTAAGTACTTCCACCGTGGGGAGTACGCCGGCAACGGTGAAACTCAAAGGAATTGACGGGGGCCC GCACAAGCGGAGGAACATGTGGTTTAATTCGATGATACGCG >112263 TACGTAGGGGGCTGGCGTTATCCGGAATTACTGGGCGTAAAGGGTGCGTAGGTGGTTTCTTAAGTCAGAGGTGAAAGGCT ACGGCTCAACCGTAGTAAGCCTTTGAAACTGGGAAACTTGAGTGCAGGAGAGGAGAGTGGAATTCCTAGTGTAGCGGTGA AATGCGTAGATATTAGGAGGAACACCAGTTGCGAAGGCGGCTCTCTGGACTGTAACTGACACTGAGGCACGAAAGCGTGG GGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAGTACTAGCCGTCGGAGGTTACCCCCTTCGGTG GCGCAGCTAACGCATTAAGTACTCCGCCTGGGAAGTACGCTCGCAAGAGTGAAACTCAAAGGAATTGACGGGGACCCGCA CAAGTAGCGGAGCATGTGGTTTAATTCGAAGCAACGCGAAGAACCCTTACCTAAGCTTGACATCCTTTTGACCGATGCCT AATCG >215890 TACGGAGGATCCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGATGGATGTTTAAGTCAGTTGTGAAAGTTT GCGGCTCAACCGTAAAATTGCAGTTGATACTGGATATCTTGAGTGCAGTTGAGGCAGGCGGAATTCGTGGTGTAGCGGTG AAATGCTTAGATATCACGAAGAACTCCGATTGCGAAGGCAGCCTATAAGCTGCAACTGAC >157625 TACGTAGGGAGCAAGCGTTATCCGGATTTATTGGGTGTAAAGGGTGCGTAGACGGGAGAACAAGTTAGTTGTGAAAGCCC TCGGCTTAACTGAGGAACTGCAACTAAAACTATTTTTCTTGAGTTGCAGGAGAGGAAAGCGGAATTCCTAGTGTAGCGGT GAAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTTCTGGACTGTAACTGACGTTGAGGCACGAAAGTGT GGGGAGCAAACAGGATTAGATACCCTGGTAGTCCACACCGTAAACGATGGATACTAGGTGTAGGAGATGGATTTCATCAT CCTGTGCCGAAAGCAAACGC >560842 ATACGGAGGATCCGAGCGTTATCCGGATTTAGTTGGGTTTAAAGGGAGCGTAGGCGGATTGTTAAGTCAGTTGTGAAAGT TTGCGGCTCAACCCGTAAAATTGCAGTTGATAACTGGTCAGTCTTGAGTGCAGTAGAGGTGGGCGGAATTCGTGGTGTAG CGGTGAAATGCTTAGATATCACGAAGAACTCCGATTGCGAAGGCAGCTCAC >591496 TACGTAGGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGACGGCGCAGCAAGTCTGATGTGAAAGGCA GGGGCTTAACCCCTGGACTGCATTGGAAACTGCTGTGCTTGAGTGCCGGAGGGGTAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACGGTAACTGACGTTGAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTCGGGCACAAAAGTGCTTCGG TGCCGCAGCAAACGCATTAAGTATTCCACCTGGGGAGTACGTTCGCAAGAATGAAACTCAAAGGAATTGGACGGGGACCC GCAACAAGCGGTGGAGCATGTAGGTTTAATTCGAAGCAACGCGAAGAACCTTACCAGTCCTTGACA >167215 TACGTAGGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGGTGGTATGGCAAGTCAGAGGTGAAAACCC AGGGCTTAACCTTGGGATTGCCTTTGAAACTGTCAGACTAGAGTGCAGGAGGGGTAAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACTGTAACTGACACTGAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTTGGGGAGCGAAGCTCCTCGG TACCGCAGTTAACGCAATAAGTATTCCACCTGGGGAGTACGTTCGCAAGAATGAAACTCAAAGGAATTGACGGGACCCGC ACAAGCGGAGGAACATGTGGTTTAATTCGATGATACGCGAGGAACCTTACCCGGGCTTAAATTGCATTTGAATATATTGG AAACAGTAATAGCCGTAAGGCAAATGT >185339 AACGTAGGTCACAAGCGTTGTCCGGAATTACTGGGTGTAAAGGGAGCGCAGGCGGGAAGACAAGTTGGAAGTGAAATCCA TGGGCTCAACCCATGAACTGCTTTCAAAACTTGTTTTTCTTGAGTAGTGCAGAGGTAGGCGAATTCCCGGTGTAGCGGTG GAATGCGTAGATATCGGGAGAACACCAGTGGCGAAGGCGCCTACGTGGGCACCAACTGACGCTGAGGCT >570930 TACGTAGGTGGCGAGCGTTATCCGGATTTATTGGGACGTAAAGCGTCCGCAGCCGGTTTATTAAGTCTAGAATTAAAGCC TGGAGCTCAACTACCAGTTCGTTTTAGAAACTGATAGACTCGAGTGTGGTAGAGGCAAACGGAATTTCTAGTGTAGCGGT AGAATGCGTAGATATTAGAAGGAACACCAGTGGCGAAGGCGGTTTGCTAGGCCACCACTGACGGTCATGGACGAAAGCGT GGGGAGCAAATAGGATTAGATACCCTAGTAGTCCACGCTGTAAACGATGAGTACTAAGTGTCGGGTTAACCGGTGCTGAA GTTAACACATTAAGTACTCCGCCTGAGTAGTACGGTCGCAAGGCTGAAACTCAAAGGAATTGACGGGGACCCGCACAAGC GGTGGAGCAATGTGGTTTAATTCGAAGCAACGCGAAGAACCTTACCAAATCTTGACATCCCTCTGACCCGGGACTTAACC CGTCCCTTTCTTTCGGGACAGAGGAGACAGGTGGTGCA >289855 AACGTAGGGTGCAAGCGTTGTCCGGAATTACTGGGTGTAAAGGGAGCGCAGGCGGGAAGACAAGTTGGAAGTGAAAACCA TGGGCTCAACCCATGAATTGCTTTCAAAACTGTTTTTCTTGAGTAGTGCAGAGGTAGATGGGAATTCCCGGTGTAGCGGT GGAATGCGTAGATATCGGGAGGAACACCAGTGGCGAAAGGCGGTCTACTGGGCACCAACTGACGCTG >313089 TACGTAGGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGCAGGCGGCATGATAAGTCTGATGTGAAAACCC AAGGCTCAACCATGGGACTGCATTGGAAACTGTCGTGCTGGAGTGTCGGAGAGGTAAGCGGAATTCCTAGTGTAGCGGTG AGATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACGATGACTGACGCTGAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCTGTAAACGATGAATACTAGGTGTGCGGGACTGACCCCCTGCGT GCCGCAGCTAACGCAATAAGTATTCCACCTGGGGAGTACGATCGCGGTAGGTAACGTACAACGAAGTTAGTACGGGGACC GGGCCGACAACGACGGTCGGGTAGTT >50120 TACGTAGGTTGCAAGCGTTGTCCGGATTTACTGGGTGTAAAGGGCGTGTAGGCGGAGATGCAAGTTAGGAGTGAAATCTA TGGGCTCAACCCATAAACTGCTTCTAAAACTGTATCCCTTGAGTATCGGAGAGGCAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTGCTGGACGACAACTGACGCTGAGGCGCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCTGTAAACGATGAATACTAGGTGTGGGAGGACTGACCCCTTCCG TGCCGCAGTTAACACAATAAGTATTCCACCTGGGGAGTACGCCGGCAACGGTGAAACTCAAAGGAATTGACGGGGCCGCA CAAGCGGAGGAACATGTGGTTTAATTCGATGATACGCGAGGAACCTTACCCGGGCTCAAACGCAGGGGAATGTCGGTGAA AGCCGG >578409 TACGTAGGTGGCAAGCGTTGTCCGGATTTACTGGGTGTAAAGGGCGTGCAGCCGGGCATGCAAGTCAGATGTGAAATCTC AGGGCTTAACCCTGAAACTGCATTTGAAACTGTATGTCTTGAGTGCCGGAGAGGTAATCGGAATTCCTTGTGTAGCGGTG AAATGCGTAGATATAAGGAAGAACACCAGTGGCGAAGGCGGATTACTGGACGGTAACTGACGGTGACGGCGCGAAAGGCG TGGGGAGCGAACAGGGATTACGATACCCTGGTAGTCCAACGCTGTAAACGATGGATACGTAGGTCGTGCGGGGACTGACC CCCTGCGTGACCGCAGTTAA >69664 TACGGAGGATCCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGGTGGATTGTTAAGTCAGTTGTGAAAGTTT GCGGCTCAACCGTAAAATTGCAGTTGAAACTGGCAGTCTTGAGTACAGTAGAGGTGGGCGGAATTCGTGGTGTAGCGGTG AAATGCTTAGATATCACGAAGAACTCCGATTGCGAAGGCAGCTCACTAGACTGTCACTGACACTGATGCTCGAAAGTGTG GGTACTACAAACGAGGTATTAGACT >109792 TACGTAGGTGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGCGTGTAGGCGGGATGGTAAGTCAGATGTGAAAACCA TGGGCTCAACCCATGGCCTGCATTTGAAACTGCTGTTCTTGAGTGATGGAGAGGCAGGCGGAATTCCGTGTGTAGCGGTG AAATGCGTAGATATACGGAGGAACACCAGTGGCGAAGGCGGCCTGCTGGACATTAACTGACGCTGAGGCGCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCTGTAAACGATGGATACTAGGTGTGGGGGGTCTGACCCCCTCCG TGCCGCAGTTACACAATAAGTATCCCACCTGGGGAGTACGATCGCAAGGTTGAAACTCAAAGGAATTGGACGGGGCCGCA CAAGCGGTGGAGTA >526490 ATACGTAGGGAGCAAGCGTTATCCGGATTTATTGGGTAGTAAAGGGTGCGTAGACGGGAAATTAAGTTAGTTGTGAAATC CCTCGGCTCAACTGAGGAACTGCAACTAAAAACTGGTTTTCTTGAGTGCAGGAGAGGTAAGTGGAATTCCTAGTGTAGCG GTGAAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGACTTACTGGACTGTAACTGACGTTGAGGCACGAAAGT GTGGGGAGCAAACAGGATTAGATACCCTGGTAGTCCACACCGTAAACGATGGATACTAGGTGTAGGGTGTATTAAGCTAT TCTGTGCCGTCGCAAAACGCAAGTAAGTACTCCCACCGTGGGGA >510817 TACGTAGGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGACGGCTTTGCAAGTCTGATGTGAAAGGCG GGGGCTCAACCCCTGGACTGCATTGGAAACTGTGGGGCTTGAGTGCCGGAGAGGTAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACGGTAACTGACGTTGAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCGGTAAACGATGAATACTAGGTGTTGGGTGTCACAGACATTCGG TGCCGCAGCAAACGCAATAAGTATTCCACCTGGGGAGTACGTTCGCAAGAATGAAACTCAAAGGAATTGACGGGGACCCG CACAAGCGGTGGAGCATGTGGTTTAATTCGAAGCAACGCGAAGAACCTTACCAAGTCTTGACATCTCCCTGACAGAGTAT GTAATGTACTTTTCCTT >538805 AACGTAGGTCACAAGCGTTGTCCGGAATTACTGGGTGTAAAGGGAGCGCAGGCGGGAGAACAAGTTGGAAGTGAAATCCA TGGGCTCAACCCATGAACTGCTTTACAAAACTTGTTTTTCTTGAGTAGTGCAGAGGTAGGCGGAATTCCCGGTGTAGCGG TGGAATGCGTAGATATCGGGAGGAACACCAGTGGCGAAGGCGGCCTACTGGGCACCAACTGACGCTGAGGCTACGAAAGT GGTGGGTAGACAAACAGGATTAGACTACCC >334839 TACGGAAGGTCCGGGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGGCCGGAGATTAAGCGTGTTGTGAAATGTA GTGGCTCAACCTCTGCACTGCAGCGCGAACTGGTCTTCTTGAGTACGCACAACGTGGGCGGAATTCGTGGTGTAGCGGTG AAATGCTTAGATATCACGAAGAACTCCGATTGCGAAGGCAGCTCACGGGAGCGCAACTGACGCTGAAGCTCGAAAGTGCG GGTATCGAACAGGATTAGATACCCTGGTAGTCCGCACGGTAAGCGAGTGGATCGCCCGCGTGGTTCGGCCTAGAAGTACG GTACAGGCCGGACCAAGGAC >273850 TACGTAGGTGGCAAGCGTTGTCCGGATTTACTGGGTGTAAAGGGCGTGTAGCCGGGAAGGCAAGTCAGATGTGAAATCCA CGGGCTCAACTCGTGAACTGCATTTGAAACTGTTTTTCTTGAGTATCGGAGAGGCAATCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACATCAGTGGCGAAGGCGGCTTACTGGGCTTTAACTGACGCTGAGGCTCGAAAGCGTG GGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGATTACTAGGTGTGGGGGGACTGACCCCTTCCGT GCCGCAGCAAACGCAATAAGTAATCCACCTGGGGAGTACGACCGCAAGGTTGAAACTCAAAGGAATTGACGGGGGCCCGC ACAAGCAGTGGAGTATGTGGATTTAATTCGAAGCAACGCGAAGAACCTTACCAGGTCTTAGACATCGTATGCATACCTCA GAGATAGAGTAGAAATCT >16072 TCCGTCCATTGCATGAATCTGGAAATAATATCGGTCGCTTCACTGGGGGGATTGATATCATAAAGAAAGTCTCGGATGCC ATCTATAATCACCAGTCCGAGATCGGGGATTGTGCCGATAGCCTGTTCGACTATAGCCAGACGTATCGGAGGGGCATACT TGCGCAAAGCCAGCATAATCAAATTATCTGGATTCTTGTCCTCCGGGAGTCCGGCAAGGCGCAGGATTCTTTTCAATACC TTCTGGCAATGATGGCGTCCCTGTTCTGTATCAATGTACAGAACAGTTCGCTTATCCTCTGGAAATGATGAACGGTATTT CAGCACTGTTCCGTTTTTCTAATGCTGACGCTGCAATGGCTGTAACGTTAAAAGTTTTCTTACTTTTGGCTTTGCCTATA GAGGCACTGAAGTTCCCCAGTGTACCGATTGCGGCATCATCTACCATCAATACAACCGGT >183985 TACGGAGGGTGCAAGCGTTGTCCGGAATCATTGGGCGTAAAGAGTTCGTAGGCGGCATGTAAAGTCAGGTGTTAAAGGCT GAGGCTCAACCTCAGTATGGCACTTGATACTTGCAAGCTAGAATGCGGTAGAGGTAAAGGGAATTCCAGGTGTAGCGGTG GAATGCGTAGATATCTGGAAGAACACCAAAGGCGAAGGCAGTCTCCTGGGCAAATCTGACGCTCATATGCGAAAGCGTGG GTAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGTCAATTAGGAGCTTGGGCAATAGTCTGGGTTCC GCAGCTAACGCAATAAA >214380 TACGGAAGGGTCCGGGACGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGGCCGAAGATTAGGCGTGTTGTGAAATG TAGACGCTCAACGTCTGCACTGCAGCGCGAACTGGTTTCCTTGAGTACGCACAAAGTGGGCGGAATTCGTGGTGTAGCGG TGAAATGCTTAGATATCACGAAGAACTCCGATTGCGAAGGCAGCTCACTGGAGCGCAACTGACGCTGAAGGCTCGAAAGT GCGGGTATCGAACAGGA >262658 TACGTAGGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGACGGCATGGCAAGTCTGAAGTGAAATGCG GGGGCTCAACCCCTGAACTGCTTTGGAAACTGTCAGGCTGGAGTGCAGGAGAGGTAAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACTGTAACTGACGTTGAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGATTACTAGGTGTTGGGGATTTATAAATCCCGG TGCCGTCGCAAACGCAATAAGTAATCCACCTGGGGAGTACGTTCGCAAGAATGAAACTCAAAGGAATTGACGGGGACCCG CACAAGCGGTGGAGCATGTGGTTTAATTCGAAGCAACGCGAAGAACCTTACCTGGTCTTGACATCCCGATGCATAACGGG TAATGCCGTTCGTACTTCGGTACATTGGAGACAGGTGGTGC >197095 TACGTATGGTGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGGCGTAGGTGGCAAGGCAAGCCAGAAGTGAAACCCGG GGACTCAACCGCGGGATTGCTTTTGGAACTGTCATGCTAGAGTGCAGGAGGGGTGAGCGGAATTCCTAGTGTAGCGGTGA AATGCGTAGATATTAGGAGGAACACCGGAGGCGAAGGCGGCTCACTGGACTGTAACTGACACTGAGGCTCGAAAGCGTGG GGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCGGTAAACGATGAATACTAGATGTCGGTAGCAAAGCTACTCGGTG TCGTCGCAAAACGCAATAAGTATTCCACCTGGGGAGTACGTTCGCAAGAATGAAACTCAAAGGAATTGACGGGACCGCAC AAGCGGTGGAGCATGTGGTTTAATTCGAAGCAACGCGAAGAACCTTA >296377 TACGTAGGTGGCGAGCGTTGTCCGGAATTACTGGGCGTAAAGGGCGTGTAGGCGGATATTTAAGTCAGATGTGAAAACCC CGGGCTCAACTTGGGGACTGCATTTGATACTGGATATCTTGAGGACAGGAGAGGAAAGCGGAATTCCTAGTGTAGCGGTG AAGTGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTTCTGGACTGTAACTGACGCTGAGGCGCGAAAGCGTG GGAGCGAACGGGATTAGATACCCCGGTAGTCCACGCTGTAAACGATGGGTACTAGGTGTAGGAGGTATCGACCCTTCTGT GCCGGAGTTAACGCAATAAGTACCCGCCTGGGGAGTACGGCCGCAAGGTTGAAACTCAAAGGAATTGACGGGGACCCGCA CAAGCGGTGGAGCATGTGGTTTAATTCGAAGCAACGCGAAGAACCTTACCAGGGCTTGACATCTTCCGAAAAGCATAGAG ATATGTAATGTGTCCCTTCGGGGATAACGGAAAGACAGGTGGTGCA >25695 TACGTAGGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGACGGTTTTGCAAGTCTGAAGTGAAAGCCC GGGGCTTAACCCCGGGACTGCTTTGGAAACTGTAGGACTAGAGTGCAGGAGAGGTAAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACTGTAACTGACGTTGAGGCT >556462 GCACCACTTCACGTTGAGCGATAGGGATAACTTTCTCCTCCGCTTCCGGACGCTGCGGCTGTCGGGGCAGCTTTGTGCTA CGGACAGGATTGATTGGTGCCAGAGACATTTCTACGGCATAGTCGTACAGCTGGATCAGGATACTGCGCACCGAAGAAGT GGTGCGACGAGAGAGCTGCTTTTCCGCTTGCAGATAATAGAGGAACGTCTGGATGCGGGAGGCTGTCAACTCGGCCACAG GGATGTCTCCCAACGCGGGAACGATATGTAACCGTTCGCAGGAATAATACAGCTCCATGGTGCGGCTGCAAACCTCATAG GTTTTGAACGTGGTGAGCCAGCGGTGCAGAAAGTCCTTCAGCAGCAATTCAGATGCCAGCGAAGGGGCGGCCTTGGATGT TTCGGAAACCAGCGTCAGGGCGATCCAGTGCGCCGCTTCCTCA >350731 TACGTAGGTGGCAAGCGTTGTCCGGATTTACTGGGTGTAAAGGGCGTGCAGCCGGGTCTGCAAGTCAGATGTGAAATCCC GATGGGCCTCAACCCATGAACTGCATTTGAAACTGTAGATCGTTGAGTGTTCGGAGGGGCAATCGGAATTACCTAGTGTA GCGGTGAAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGATTGCTGGACGATAACTGACGGTGA >590547 TACGGAAGGTCCGGGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGGCCGTGAGGTAAGCGTGTTGTGAAATGTA GGCGCCCAACGTCTGCACTGCAGCGCGAACTGCCCCACTTGAGTGCGCGCAACGCCGGCGGAACTCGTCGTGTAGCGGTG AAATGCTTAGATATGACGAA >322112 TACGTAGGTGGGCGAGCGTTGTCCGGATTTACTGGGCGTAAAGGGAGCGTAGGCGGATTTTTAAGTGAGATGTGAAATAC TCGGGCTTAACCCGTGAGTCGCTGCTATTTCAAACTGGAAGTCTAGAGTGCAGGAGAGGAGAAGGGAATTCCTAGTGTAG CGGTGAAATGCGTAGAGATTAGGAAGAACACCAGTGGCGAAGGCGCTTCTCTGGACTGTAACTGACGCTGAGACTCGAAA GCGTGGGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTAGGGGTTGTCAA >36624 GATACTGACACAGGTCATTGCTGCCGATGGAGGCAAAATCCACCTGCTTTGCCAGCTGGTCCGCCATCATCACCGCCGCC GGGGTTTCTATCATAACGCCAAGCTTAATATGATCACTCACTGCCACACCGCTTTGCCACAGGCGCTCTTTTTCTTCCAG TACAATTATACGCGCTTTTGTAAAGTCTTCAAGGCCAGAGACCATGGGGAACATCAGCCATAGCGTTC >350732 TACGTATGGTGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGACGGAGTGGCAAGTCTGATGTGAAAACCC GGGGCTCAACCCCGGGACTGCATTGGAAACTGTCAATCTAGAGTACCGGAGAGGTAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACGGTAACTGACGTTGAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGACTACTAGGTGTCGGGCAGCAAAGCTGTTCGG TGCCGCAGCAAACGCAATAAGTAGTCCACCTGGGGAGTACGTTCGCAAGAATGAAACTCAAAGGAATTGACGGGGACCCG CACAAGCGGTGGAGCATGTGGTTTAATTCGAAGCAACGCGAAGAACCTTACCTGCTCTTGACATCTCCCTGACCGGCAAG TAATGTTGCCTTTTCCTTCGGGACA >193230 TACGTATGGTGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGCAGGCGGTGCGGCAAGTCTGATGTGAAACGGC CCGGGCTCCGAACCCCGGTACTGTCAATTGGAAACTGTCGTACTAGAGTGTCGGAGGGTAAGCGGAATTCCTAGTGTAGC GGTGAATGCGTAGATATTAGGAGGAACACC >336539 TACGTAGGGGGCGAGCGTTGTCCGGAATCACTGGGCGTAAAGGGCGCGTAGGCGGTTTGTTAAGTCAGATGTGAAAGGTG AGGGCTCAACCCTTAGAATGCATCTAATACTGGCAGACTTGAGTACAGAAGAGGAAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTTCTGGGCTGAAACTGACGCTGAGGCGCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGGGTACTAGGTGTCGGGAGTATCGATACTTTCG GTGCCGGAGTAAACACAATAACGTACCCCGCCGTGGGGAGTACGATCGCAAGATTGAAACTC >192899 TACGTAGGTTGCAAGCGTTGTCCGGATTTACTGGGTGTGAAGGGCGTGTAGGCGGAGATGCAAGTTGGGAGTGAAATCCA TGGGCTCAACCCATGAACTGCTCTCAAAACTGTATCCCTTGAGTATCGGAGAGGCAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTGCTGGACGACAACTGACGCTGAGGCGCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCTGTAAACGATGAATACTAGGTGTGGGAGGACTGACCCCTTCCG TGCCGCAGTTAACACAATAAGTATTCCACCTGGGGATACGACCGCAAGGTTGAAACTCAAAGGAATTGACGGGGGCCGCA CGAAGCAGTGGATTATGTGGTTTAATTCGACGTCAACGCGAAGACCTTACAGGACTTGACATCCAACTAACGAAGTAGAG ATACATCAGGTGCCCTT >182728 TACGTAGGGAGCGAGCGTTATCCGGATTTATTGGGTGTAAAGGGTGCGTAGACGGGAAGTCAAGTTAGTTGTGAAATCCC TCGGCTTAACTGAGGAACTGCAACTAAAACTGATTTTCTTGAGTACTGGAGAGGAAAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCGGTGGCGAAGGCGACTTTCTGGACAGAAACTGACGTTGAGGCACGAAAGTGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACACTGTAAACGATGAATGCTAGGTGTAGGGGGTATCGACCCCTTCT GTGCCGCAGTCAACACAATAAGCATTCCGCCTGGGGAGTACGGCCGCAAGGTTGAAACTCAAAGGAATTGACGGGGGCCC GCACAAGCAGCGGAGCATGTGGTTTAATTCGACGCAACGCGAAGACCTTACCAGGTCTTGACATCCACTTAAACTTACAG AGATGTAAGGTGTGCTTGCACAAAGTGAGACAGGTGGT >535209 TACGTAGGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGTGTAGGTGGCTGTGCAAGTCAGGAGTGAAAGCCC GGGGCTCAACCCCGGGACTGCTCTTGAAACTGTGCGGCTTGAGTGCAGGAGGGGCAGGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCGGTGGCGAAGGCGGCCTGCTGGACTGTAACTGACACTGAGGCTCGAAAGCGTG GGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTCGGGGCTCATAAGAGCTTCGG TGCCGCAGCAAACGCAATAAGTATTCCACCTGGGGAGTACGTTCGCAAGAATGAAACTCAAAGGAATTGACGGGGGCCCG CACAAGCAGCGGAGCATGTGGTTAATTCGACGCAACGCGAAGAACCTTACCAGGTCTTGACATCCACTTAAACTTACAGA GATGTAAGGTGTGCTTGC >36647 TACGTAGGGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGACGGTGTGGCAAGTCTGATGTGAAAGGC ATGGGCTCAACCCCGGTACTGCATTGGAAACTGTCGTACTAGAGTGTCGGAGGGTAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACGATAACTGACGCTGAGGCT >305437 AACGTAGGGTGCAAGCGTTGTCCGGAATTACTGGGTGTAAAGGGAGCGCAGGCGGACTGGCAAGTTGGAAGTGAAAACTA TGGGCTCAACCCATAAATTGCTTTCAAAACTGCTGGCCTTGAGTAGTGCAGAGGTAGGTGGAATTCCCGGTGTAGCGGTG GAATGCGTAGATATCGGGAGGAACACC >541602 CGCCGCATCGGGGAGATATTCTCTGAGGCCTCGGGCTATACGCTTGAGGAGACGCCGTTTGCCTCAGGCTTTGCCGGGTA CAAGGACTGGTTCATCGAGAGCTTTGACCGCCCCGGCTACACGATCGAAGCCGGGCTCGGCACAAATCCCCTGCCGGCGT ATCAGTTCCCGGATATCTATGAGCGCTGCCTCGGAATCCTCGTCTACGGCGCACTTGTCACCTGATAATAGAACTCCCCG GCGGGTCATCCTCCGGGGAGTTGGAATTTTATGGAGCTCAGGCAGGCTCCGCGCCCCATGAATATCGACGCGCGCGGCGC GCCGCCCGTCGCGGAGAGGACGCAAAGGCCGACACGACGAGGATGATCGGCA >329313 TACGGAGGATCCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGGCGGACGCTTAAGTCAGTTGTGAAAGTTT GCGGCTCAACCGTAAAATTGCAGTTGATACTGGGTGTCTTTGAGTACAGTAGAGGCAGGCGGAATTCGTGGTGTAGCGGT GAAATGCTTAGATATCACGAAGAACTCCGATTGCGAAGGCAGCTTGCTGGACTGTAACTGACGCTGGTGACTCGAAAGGT GTGGGTAATCG >193343 TACGTAGGGGGCGAGCGTTGTCCGGAATTACTGGGCGTAAAGGGCGCGTAGGCGGCATATTAAGTTAGATGTGAAATTCC CGGGCTTAACCTGGGCGTTGCATTTAAAACTGATAAGCTTGAGTGCCGGAGAGGAAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACATCAGTGGCGAAGGCGGCTTTCTGGACGGTAACTGACGCTGAGGCGCGAAAGCGTG GGTAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTAGGTGGTATCGACTCCATCT GTGCCGCAGCAAACGCAATAAGTATTCCGCCTGAGGAGTACGGCCGCAAGGTTGAAACTCAAAGGAATTGGACGGGGGCC CGCACAAGCAGCGGAGCATGTGGTTTAATTCGAAGCAACGCGAAGAACCTTACC >333279 TACGTAGGTGGCAAGCGTTGTCCGGATTTACTGGGTGTAAAGGGCGTGCAGCCGGGAATGCAAGTCAGATGTGAAATCCA TGGGCTTAACCCATGAACTGCATTTGAAACTGTATTTCTTGAGTACTGGAGAGGCAATCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGATTGCTGGACAGCAACTGACGGTGAGGCGCGAAAGTGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACACTGTAAACGATGACTACTAGGTGTGCGGGGACTGACCCCCTGCG TGCCGCAGTTACACAAT >291764 TACGTAGGTGGCGAGCGTTATCCGGAATCATTGGGCGTAAAGAGGGAGCAGGCGGCCGCAAAGGGTCTGTGGTGAAAGAC CGAAGCTAAACTTCGGTAAGCCATGGAAACCGGGCGGCTGGAGTGCGGAAGAGGATCGTGGAATTCCATGTGTAGCGGTG AAATGCGTAGATATATGGAGGAACACCCAGTGGCGAAGGCGACGGTCTGGGCCGCAACTGACGCTCATTCCCGAAAGCGT GGGGAGCAAAGTAGGATTAGATACCCTAGTAGTCCACGCCGTAAACGATGGTCACTAAGTGTCGGGGGTCCAAACCCCGG TGCTGCAGTCAACGCAATAGTGACCCGACCTGAGTAG >192952 TACGTATGGTGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGCAGGCGGTCTGGCAAGTCCGATGTGAAAATCC GGGGCTCAACTCCGGAACTGCATTGGAAACTGTCAGACTAGAGTGTCGGAGAGGTAAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGAGATTGGGAGGAACACCAGTGGCGAAGGCGACTTACTGGGCCGTAACTGACGCTGAGGCGCGAAAGCGTG GGAGCGAACAGGATTAGATACCCTGGTAGTCCACGCTGTAAACGATGAATGCTAGGTGTAGGGGGTATCGACCCCTCCTG TGCCGGAGTAAACGCAATAAGAATTCCGCCTGGGGAGTACGGCCGCAAGGTTGAAACTCAAAGGATTGACGGGGGCCCGC ACAAGCAGCGGAGCATGTTGTTTAATCGATGCAACGCGAAGAACCTTACCA >136044 TACGTAGGTGGCAAGCGTTATCCGGAATTACTGGGTGTAAAGGGTGTGTAGGCGGGTTTGCAAGTCAGATGTGAAAATTA TGGGCTCAACCCATAACCTGCGTCTGAAACTACAGATCTTGAGAGTGGGAGAGGTAAATGGAATTCCCGGTGTAGCGGTG AAATGCGTAGATATCGGGAGGAACACCAGTGGCGAAGGCGATTTACTGGACCACAACTGACGCTGAGACACGAAAGCGTG GGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCTGTAAACGATGAATACTAGGTGTGGGAGGACTGACCCCTTCCGT GCCGCAGTTAACACAATAAGTATTCCACCTGGGGATACGATCGCAAGATTGAAACTCAAAGGATTGACGGGGCCCGCACA AGCAGTGGATTATGTGGTTTAATTCGACGCAACGCGAAGAACCTTACCGGGATTTGACATCCTACTAACGAAGTAGAGAT ACATTA >276703 TACGGAGGATCCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGGCGGACGCTTAAGTCAGTTGTGAAAGTTT GCGGCTCAACCGTAAAATTGCAGTTGATACTGGGTGTCTTGAGTGCAGTTGAGGCAGGCGGAATTCGTGGTGTAGCGGTG AAATGCTTAGATATCACGAAGAACTCCGATTGCGAAGGCAGCCTGCTAAGCTGCAACTGACATTGAGGCTCGAAAGTGTG GGTATCAAACAGGATTAGATACCCTGGTAGTCCACACGGTAAACGATGAATACTCGCTGTTTGCGATATACGGCAAGCGG CCAAGCGAAAGCGTTAAGTATTCCACCTGGGGAGTACGCCCGGCAACGGTGAAACTCAAAGGAATTGACGGGGCCCGCAC AGCGGAGGACATGTGGTTAATTCGATGATACGCGAGGAACCTTACCGGGCTTAAATGCACTCGAATGATCCGGAACGGTT CAGCTAGCAATAGCGAGTGTGAAGTG >237324 TACGTAGGGGGCAAGCGTTATCCGGAATTACTGGGTGTAAAGGGTGCGTAGGTGGCCAGGCAAGTCAGAAGTGAAAGCCC GGGGCTTAACTCCGGGACTGCTTTTGAAACTGTCAGGCTAGAGTGCAGGAGAGGTAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACATCAGTGGCGAAGGCGGCTTACTGGACTGAAACTGACACTGAGGCACGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTCGGGCCGTAGAGGCTTCGGT GCCGCAGCCAACGCAATAAGTATTCCACCTGGGGAGTACGTTCGCAAGAATGAAACTCAAAGGAATTGACGGGGCCCGCA CAAGCGGAGGAACATGTGGTTTAATTCGATGATACGCGAGGAACCGTTACCGGGCTTAAATTGCAGACGAATTACGAGGT AAACTTGTAAGCCGCAAGGCGTCTGTGAAGGTGCTG >326644 TACGGAAGGTCCGGGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGGACCGTGAGGTAAGCGTGTTGTGAAATGT AGGCGCCCAACGTACTGGCACTCGCAGCGTCGAACTGCCCCACTTGAGTGCGCGCAACGCCGGCGGAACTCGTCGTGTAG CGGTGAAATGCTTAGATATGACGAAGAACCCCGATTGCGAAGGCAGCTGGCGGGAGCGTAACTGACGCTGAAGCTCGAAA GCGCGGGTATCGAACAGGATTAGATACCCTGGTAGTCCGCGCGGTAAACGATGGATGCCGCTGTGCGCGCCTGGCGTGCC GCGGCTAAAGC >228762 TACGTAGGGAGCAAGCGTTATCCGGATTTATTGGGTGTAAAGGGTGCGTAGACGGGACAACAAGTTAGTTGTGAAATCCC TCGGCTTAACTGAGGAACTGCAACTAAAACTATTGTTCTTGAGTGTTGGAGAGGAAAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCGGTGGCGAAGGCGACTTTCTGGACAATAACTGACGTTGAGGCACGAAAGTGTG GGGAGCAAACAGGGATTAGATACCCTGGTAGTCCACACCGTAAACGATGGATACTAGGTGTAGGAAATGATTTCATTTTC TGTGCCGTCGCAAACGCAATAAGTATCCCACCTGGGGAGTACGGCCGCAAGGTTGAAACTCAAAGGAATTGACGGGGGCC CGCGACCAAGCCAGTGGAGTAGTGTGGGTTTAATTCGAAGTCAACGCGAAGAACCTTACC >198528 TACGTATGGTGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGCAGGCGGTGCGGCAAGTCTGATGTGAAAGCCC GGGGCTCAACCCCGGTACTGCATTGGAAACTGTCGTACTAGAGTGTCGGAGGGGTAAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACGATAACTGACGCTAGAGGCTACGAAGCGG TGGGAGACAAACGAGGTATTAAGACTACCCGTGGTACGTCCA >167365 TACGGAGGATGCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGTGCGTAGGCGGACCATCAAGTCAGCGGTCAAAAGTC GGGGCTCAACCCCGTGAAGCCGTTGAAACTGGCGGTCTTGAGTGAGCGAGAAGTAGGCGGAATGCGTGGTGTAGCGGTGA AATGCATAGATATCACGCAGAACTCCGATTGCGAAGGCAGCCTGCCGGCGCTCAACTGACGCTGAGGCACGAAAGTGCGG GGATCGAACAGGATTAGATACCCTGGTAGTCCGCACAGTAAACGATGAATGCTAGCTGTCCGGTCCGAATGAGGACTGGG GTGGCACAGCGAAAGCGTTAAGCATTCCACCTGGGGAGTACGCCGGCAACGGTGAAACTCAAAGGAATTGACGGGGCCCG CACAGCGGAGAACATGTGGTTTAATTCGATGATAGCGAGGAACCTTACCCGGGCTCAAACGCCGCAGGAATC >239053 AACGTAGGGTGCAAGCGTTGTCCGGAATTACTGGGTGTAAGGGGAGCGCAGGCGGGAAGACAAGTTGGAAAGTGAAAACC ATGGGGCTACAACCCCGATGAAACTTGCTTTCAAAAACTGTTTTTACTTGAGTAGTGCAGAGGTAGGATGGGAATTCCCC GGTGTAGCGGTGGAATGCGTAGATATCGGGAGGAAC >526081 TACGTATGGTGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGGTGGCAAGGCAAGCCAGAAGTGAAAACCC GGGGCTCAACCGCGGGATTGCTTTTGGAACTGTCATGCTAGAGTGCAGGAGAGGTAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACATCAGTGGCGAAGGCGGCTTACTGGACTGAAACTGACACTGAGGCACGAAAGCGTG GGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGT >129783 TACGTAGGTGGCAAGCGTTGTCCGGAATTATTGGGCGTAAAGCGCGCGCAGGCGGCTTTCTAAGTCCATCTTAAAAGTGC GGGGCTTAACCCCGTGATGGGATGGAAACTGGGAAGCTGGAGTATCGGAGAGGAAAGTGGAATTCCTAGTGTAGCGGTGA AATGCGTAGAGATTAGGAAGAACACCGGTGGCGAAGGCGACTTTCTGGACGACAACTGACGCTGAGGCGCGAAAGCGTGG GGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTAGGAGGTATCGACCCCTTCTG TGTCGGAGCTAACACAATAAGTATTCCGCCTGGGAAGTACGATCGCAAGATTAAAACTCAAAGGAATTGACGGGGGCCCC GCACAAAGCGGTGGGAGTAGTGGTTAGGTTTAA >198740 TACGTAGGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGCAGGCGGTGCGGCAAGTCTGATGTGAAAGCCC GGGGCTCAACCCCGGGACTGCATTGGAAACTGTCGTACTTGAGTATCGGAGAGGTAAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACGATAACTGACGCTGAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTCGGGGGACATAGTCCTTCGG TGCCGCAGCAAACGACAATAAGTAATTCCACCTCGGGAGTAACGTTCGCAAGAAATGAAACTCAAAGGAATTGACGGGGA CCCGGCACAAGACGTGGAGCGATGTGTTTAATTCGAAGCAACGCGAAGAACCTTAACCAA >583500 TACGTAGGGGGCGAGCGTTGTCCGGAATTATTGGGCGTAAAGGGCGCGTAGACGGCTGAGTAAGTTACTGGTGAAAGCCC AGCTTTTAAGGCTGGAATTGCCGGTAATACTGTTCAGCTTGAGTGCAGGAGAGGGAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTTCTGGACTGTAACTGACGTTGAGGCGCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGGATGCTAGGTGTGGGAGGTATCGACCCTTCCG TGCCGCAGTTAACGCAATAAGCATCCCGCCTGGGGAGTACGGCCGCAAGGTTGAAACTCAAAGGAATTGACGGGGGCCCG CACAAGCAGCGGAGCATGTGGTTTAATTCGACGCAACGCGAAGAACCTTACCAGGACTTGACATCTGATTAAGCTTTGTG GAAACACAAGGTCCCTTCGGGGGAATCAAGACAGGTGGTGC >333775 TACGTAGGTCCCGAGCGTTGTCCGGATTTATTGGGCGTAAAGCGAGCGCAGGCGGTTAGAAAAGTCTGAAGTGAAAGGCA GTGGCTCAACCATTGTAGGCTTTGGAAACTGTTTAACTTGAGTGCAGAAGGGGAGAGTGGAATTCCATGTGTAGCGGTGA AATGCGTAGATATATGGAGGAACACCGGTGGCGAAAGCGGCTCTCTGGTCTGTAACTGACGCTGAGGCTCGAAAGCGTGG GGAGCGAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAGTGCTAGGTGTTAGGTCCTTTCCGGGACTTAG TGCCGCAGCTAACGCATTAAGCACTCCGCCTGGGGAGTACGACCGCAAGGTTGAAACTCAAAGGAATTGACGGGGCCGCG ACAAGCGGTGGAGCATGTGGTTTAATTCGAAGCAACGCGAAGAACCTTACCAGGTCTTGACATCCCAGT >193576 TACGTAGGGTGGCAAGCGTTGTCCGGATTTACTGGGTGGTAAAGGGCGCGTAGGCGGGATGGCAAGTCAGATAGTGAAAT CCATGGGCTCAACCCATGAACTGCATTTGAAACTGTCGTTCTTGAGTATCGGAGAGGCAAGCGGAATTCCTAAGTGTAGC GGTGAAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTGCTGGACGACAAACTG >292073 TACGGAAGGTCCGGGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGGCCGGAGATTAAGCGTGTTGTGAATGTAG ATGCTCAACATCTGCACTGCAGCGCGAACTGGTTTCCTTGAGTACGCACAAAGTGGGCGGAATTCGTGGTGTAGCGGTGA AATGCTTAGATATCACGAAGAACTCCGATTGCGAAGGCAGCTCACTGGAGCGCAACTGAGCCCCCTGAAGCTCGAAAGTG CGGGTATCGAACAGGATTAGATACCCTGGTAGTCCGCACGGTAAACGATGGATGCCGCTGTTGGTCTGAATAGGTCAGCG GCCAAGCGAAAGCATTAAGCATCCCACCTGGGGAGTACGCCGGCAACGGTGAAACTCAAAGGAATTGACGGGGACCCGCG ACAAGCGGTGGAACATGTGGTTTAATTCGAAGCAACGCGAAAAACTTACCAGGGCTTGACATCTGACGAATCTGGATGAA AGTTCGGAGTGCTCTTCGGAGAGCG >234421 TACGGAAGGTCCGGGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGGCCGGAGATTAAGCGTGTTGTGAAATGTG GACGCTCAACGTCTGCACTGCAGCGCGAACTGGTTTCCTTGAGTACGCACAAAGTGGGCGGAATTCGTGGTGTAGCGGTG AAATGCTTAGATATCACGAAGAACTCCGATTGCGAAGGCAGCTCACTGGAGCGCAACTGACGCTGAAGCTCGAAAGTGCG GGTATCGAACAGGATTAGATACCCTGGTAGTCCGCACGGTAAACGATGGATCGCCCGGCTTGGTTGGTCTGAATAGGTCA GCGGCCAAGCGAAAGCATTAAGCACT >307569 TACGGAGGATCCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGGCGGACGCTTAAGTCAGTTGTGAAAGTTT GCGGCTCAACCGTAAAATTGCAGTTGATACTGGGTGTCTTGAGTACAGTAGAGGCAGGCGGAATTCGTGGTGTAGCGGTG AAATGCTTAGATATCACGAAGAACTCCTATTGCGAAGGCAGCTCACTAAACTGCAACTGACATTGAGGCTCGAAAGTGTG GGTATCAAACAGGATTAGATACCCTGGTAGTCCACACGGTAAACGATGAATACTCGCTGTTTGCGATATACAGCAAGCGG CCAAGCGAAAGCATTAAGTATTCCACCTGGGGAGTACGCCGGCAACGGTGAAACTCAAAGGAATTGACGGGGCCCGCACA AGCGGAGGAACATGTGGTTTAATCGATGATACGCGAGG >292556 TACGTAGGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGACGGTCAAGCAAGTCAGAAGTGAAAGGCT GGGGCTCAACCCCGGGACTGCTTTTGAAACTGTTTGACTAGAGTGCTGGAGAGGTAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACTGTAACTGACACTGAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTCGGGGCCCATAAGGGCTTCG GTGCCGCAGCAAACGCAAATAAGTATTCCACCTGGGGAGTACGTTCGCAAGAATGAAACTCAAAGGAATTGGACGGGGAC CCGCACAAGCGGTGGAGCATGTGGTTTAATTCGAAGCAACGCGAAAGAACCTTACCAAGTCTTGACATCCTTCTGACCGG ACAGTAATGTGTCC >345211 AACGTAGGTCACAAGCGTTGTCCGGAATTACTGGGTGTAAAGGGAGCGCAGGCGGGAGAACAAGTTGGAAGTGAAATCCA TGGGCTCAACCCATGAACTGCTTTCAAAACTGTTTTTCTTGAGTAGTGCAGAGGTAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACGATAACTGACGCTGAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAAACGATGAATACTAGGTGTTGGGAAGCATTGCTTCTCG GTGCCGTCGCAAACGCAGTAAGTATTCCACCTGGGGA >189485 TACGGAGGATGCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGTGCGTAGGCGGCACGCCGAGTCAGCGGTGAAATTTC CGGGCTCAACCCGGAGTGTGCCGTTGAAACTGGCGAGCTAGAGTACACAAGAGGCGAGGCGGAATGCGTGGTGTAGCGGG TAGAAATGCATAGATATCA >514272 TACGTATGGAGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGTGTAGGTGGCATCACAAGTCAGAAGTGAAAGCCC GGGGCTCAACCCCGGGACTGCTTTTGAAACTGTGGAGCTGGAGTGCAGGAGAGGTAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACATCAGTGGCGAAGGCGGCTTACTGGACTGAAACTGACACTGAGGCACGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTCGGGGCCGTAGAGGCTTCGG TGCCGCAGCCAACGCAGTAAGTATTCCACCGTGGGGAGTACGTTCGCAAGAATGAAACTCAAAGGATTGGACGGGACCCG CACAAGCGGTGGAGCATGTGGTTTAATTCGAAGCAACGCGAAGAACCTTA >277196 TACGTAGGTGGCAAGCGTTGTCCGGAATTATTGGGCGTAAAGCGCGCGCAGGCGGCTTCCCAAGTCCCTCTTAAAAGTGC GGGGCTTAACCCCGTGATGGGAAGGAAACTGGGAAGCTGGAGTATCGGAGAGGAAAGTGGAATTCCTAGTGTAGCGGTGA AATGCGTAGAGATTAGGAAGAACACCGGTGGCGAAGGCGACTTTCTGGACGAAAACTGACGCTGAGGCGCGAAAGCGTGG GGAGCAAACAGGATTAGGATACCCTGGTAGTCCACGCCGTAAACGATGATTACTAGGTGTGGGGGACTGACCCTTCCGTG CCGCAGCAAACGCAATAAGTAATCCACCTGGGGAGTACGACCGCAAGGTTGAAACTCAAAGGAATTGACGGGGCCCGCAC AAGCAGTGGAGTATGTGGATTAAGTTCGAAGCAACGCGAAGAACCTTA >184403 TACGGAGGATGCGAGCGTTATCCGGATTTATTGGGTTTAAAGGGTGCGTAGGCGGAACTCCAAGTCAGCGGTAAAAATTC GGGGCTCAACCCCGTCGTGCCGTTGAAACTGGAGTCCTTGAGTGGGCGAGAAGTATGCGGAATGCGTGGTGTAGCGGTGA AATGCATAGATATCACGCAGAACCCCGATTGCGAAGGCAGCATACCGGCGCCCAACTGACGCTGAAGCACGAAAGCGTGG GTATCGAACAGGATTAGATACCCTGGTAGTCCACGCAGTAAACGATGGATACTAGCTGTCCGGGGGGATTGACCCCTGGG TGGCACAGCGAAAGCGTTAAGTATCCCACCTGGGGAGTACGCCGGCAACGGTGAAACTCAAAGGAATTGACGGGGGCCGC ACAAGCGGAGGAACATGTGGTTTAATTCGA >295754 TACGTAGGTGGCGAGCGTTATCCGGAATCATTGGGCGTAAAGAGGGAGCAGGCGGCCGCAAGGGTCTGTGGTGAAAGACC GAAGCTAAACTTCGGTAAGCCATGGAAACCGGGCGGCTAGAGTGCGGAAGAGGATCGTGGAATTCCATGTGTAGCGGTGA AATGCGTAGATATATGGAGGAACACCAGTGGCGAAGGCGACGGTCTGGGCCGCAACTGACGCTCATTCCCGAAAGCGTGG GGAGCAAATAGGATTAGATACCCTAGTAGTCCACGCCGTAAACGATGGTCACTAAGTGTCGGGGGTCAAACCCGGTCGCT CGCAGTCAACGACAACTAAGTAGACCCGCCCTCGAGTAGTACGTTCGTCAA >291710 TACGTAGGGAGCGAGCGTTGTCCGGATTTACTGGGTGTAAAGGGTGCGTAGGCGGCCGAGCAAGTCAGTTGTGAAAACTA TGGGCTTAACCCATAACGTGCAATTGAAACTGTCCGGCTTGAGTGAAGTAGAGGTAGGCGGAATTCCCGGTGTAGCGGTG AAATGCGTAGAGATCGGGAGGAACACCGGTGGCGAAGGCGACTTTCTGGACAGAAACTGACGTTGAGGCACGAAAGTGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACACCGTAAACGATGGATACTAGGTGTAGGGGATATTAAAATTCTCT GTGCCGCCGCTAACGCAATAAGTATCCCACCTGGGGAGTACGGCCGCAAGGTTGAAACTCAAAGGAATTGACGGGGGCCC GCACAAGCAGTGGAGTATGTGGTTTAATTCGACGCAACGCGAAGAACCTTACCGGGGCTTGACATATAAGTGAATAAATA AAGAGATTAGTTAGCTCTTCGG >298252 AACGTAGGTCACAAGCGTTGTCCGGAATTACTGGGGTGTAAAGGGAGCGCAGGGCGGGAAGACAAGTTGGAAGTGAAATC CATGGGCCCAACCATGAACTGTCTTTCTAAAACTTAGTTTTTCTTGAGTAGTGCAGAGGTAGGCGGAATTCCCGGTGTAG CGGTGGAATGCGTAGATA >346253 TACGTATGGTGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGCAGGCGGTGCGGCAAGTCTGATGTGAAAGCCC GGGGCTCAACCCCGGTACTGCATTGGAAACTGTCGTACTAGAGTGTCGGAGGGGTAAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACATCTGTGGCGAAGGCGACTTACTGGACGATTACTGACGCTGAGACACGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAACACTAGGTGTGGGGGGCGCAAGCCTCCGTG CCGCAGCTAACGCAATAAGTGTTCCACCTGGGAGTACGGCCGCAAGGTTGAAACTCAAAGGAATTGACGGGAGCCCGCAC AAGCAGTGGAGTATGTGGTTTAATTCGACGCAACGCGAAGAACCTTACCAGGACTTGACATCCCAAGAACGTCGGCGTAA TGGCTGATGTGCCCTTCGGGGGAGCGTTGGAGACA >212619 TACGTAGGGTGCAAGCGTTATCCGGAATTATTGGGCGTAAAGGGCTCGTAGGCGGTTCGTCGCGTCCGGTGTGAAAGTCC ATCGCTTAACGGTGGATCCGCGGCCGGGGTACGGGCGGGCTTGAGTGGCGGGTAGGGGAGACTGGAACTTCCCGGTGTAA CGGTGGAATGTGTAGATAG >527741 TACGTAGGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGACGGCACAGCAAGTCTGATGTGAAAGCCC GGGGCCCAACCCCGGAACTGCATTGGAAACTGCTGGGCTTGAGTGCAGGAGAGGTAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAGGGCGGCTTACTGGACTGTAACTGACGTTGAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCGTGGTACGTCCACGACCGTAAACGATGTATTACGTAGGTCGGGTACCGGGGAACCG >171551 TACGTAGGTGGCAAGCGTTGTCCGGATTTACTGGGTGTAAAGGGCGTGTAGGCGGGAGAGCAAGTCAGAAGTGAAATCTA TGGGCTTAACCCATAAACTGCTTTTGAAACTGTTCTTCTTGAGTATCGGAGAGGCAGGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCCTGCTGGACGACAACTGACGCTGAGGCGCGAAAGGCGT GGGGAGCAAACAGGATTAGATACCCCGGTAGTCCACGACTGTAAACGATGAATACTAGGGTGTCGGGAGGACTGACCCCT TCGTGCCGCAGTTAACACAATAAGTATTCCACCTGGGGAGTACGATACGCAAAGATTA >579000 TACGTATGGTGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGCAGGCGGTCTGGCAAGTCTGATGTGAAAATCC GGGGCTCAACTCCGGAACTGCATTGGAAACTGTCAGACTAGAGTGTCGGAGAGGTAAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACGATAACTGACGCTGAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTCGGGGGCACAAAAGTGCTTC GGTGCCGCAGCAAACGCATTAAGTATTCCACCTGGGGAGTACGTTCGCAAGAATGAAACTCAAAGGAATTGACGGGGACC CGCACAAGCGGTGGAGCATGTGGTTAATTCGAAGCAACGCGAAGAACCTTACCAAGTCTTGACATCCCTCTGACCCGACT CTTAACCGAGTTCTTTCC >563574 AACGTAGGGTGCAAGCGTTGTCCGGAATTACTGGGTGTAAAGGGAGCGCAGGCGGGAAGACAAGTTGGAAGTGAAAACCA TGGGCTCAACCCATGAATTGCTTTCAAAACTGTTTTCTTGAGTAGTGCAGAGGTAGATGGAATTCCCGGTGTAGCGGTGG AATGCGTAGATATCGGGAGGAACACCAGTGGCGAAGGCGGTCTACGTGGCACCAACTGACGCTGAGGCT >165257 TACGTAGGTGGCGAGTGTTATCCGGAATCATTGGGCGTAAAGAGGGAGCAGGCGGCCGCAAGGGTCTGTGGTGAAAGACC GAAGCTAAACTTCGGTAAGCCATGGAAACCGGGCGGCTAGAGTGCGGAAGAGGATCGTGGAATTCCATGTGTAGCGGTGA AATGCGTAGATATATGGAGGAACACCAGTGGCGAAGGCGACGGTCTGGGCCGCAACTGACGCTCATTCCCGGAAGCGTGG GGAGCAAATAGGATTAGATACCCTAGTAGTCCACGCCGTAAACGATGGTCACTAAGTGTCGGGGTCAAACCCCCGGTGCT GCAGTCAACGCAATAAGTGACCCGCCTGAGTAGTACGTTCGCAAGAATGAAACTCTAAGAAGTGTACGGGGCCCGGCCGA CAAGCGGTCGGAGCGATAGTGGTTT >291610 TACGTATGGTGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTGGACGGAGAGGCAAGTCTGATGTGAAAAACC CGGGGCTCAACCCCGGGACTGCATTGGAAACTTGTTTTTCTAGAGTGTCGGAGAGGTAAGTGGAATTCCTAGTGTAGCGG TGAAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACGATGACTGACGTTGAGGCT >338272 TACGTAGGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGGCGGTCTGACAAGTCAGAAAGTGAAAGCC CGGGCTCAACTCCGGGACTGCTTTTGAAACTGCCGGACTAGATTGCAGGAGAGGTAAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTAC >237003 TACGGAAGGTCCGGGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGGCCGCAGGTTAAGCGTGTTGTGAAATGTA GGGGCTCAACCTCTGTACTGCAGCGCGAACTGGCTTGCTTGAGTACGCACAACGGTGGGCGGAATTCGTGGTGTAGCGGT GAAATGCTTAGATATCAACGAAGAACTCCGATTGCGAAGGCAGCTCGACGGGAGCG >207832 TGCGTAGGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGACGGAATGGCAAGTCTGATGTGAAAGGCC GGGGCTCAACCCCGGGACTGCATTGGAAACTGCCAATCTAGAGTACCGGAGGGGTAAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACGGTAACTGACGTTGAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATAGAATACTAGGTGTTGGGTAGCAAAGCTATTCG GTGCCGCAGCAAACGCAATAAGTATTCCACCTGGGGAGTACGTTCGCAAGAATGAAACTCAAAGGAATTGACGGGGACCC GCACAAGCGGTGGAGCATTGTGGTTTAATTCGAAGCAACGCGAAGAACCTTACCAAATCTTGACATCGATCCCGACCGGA CCGTAATCGGGTTCCTTTTCCCGTTCGGGG >31334 TACGTATGGTGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGACGGAGTGGCAAGTCTGATGTGAAAACCC GGGGCTCAACCCCGGGACTGCATTGGAAACTGTCAATCTAGTAGTACCGGAGAGGTAAAGCGGAATTCCTAGTGTAGCGG TGAAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACGGTAACTGACGTTGAGGCTCGAAAGCG TGGGGAGCAAACAGGATTAGATAACCCTGGTAGTCCACGCCGTAAACGATGAATACTAGGTGTGGGAGGACTGACCCCTT CCGTGCCGCAGTTAACACAATAAGTATTCCACCTGGGGAGTACGACCGCAAGGTTGAAACTCAAAGGATTGACGGGGCCC GCACAAGCAGTGGATTATGGT >70528 AACGTAGGGTGCAAGCGTTGTCCGGAATTACTGGGTGTAAAGGGAGCGCAGGCGGGAAGACAAGTTGGAAGTGAAAACCA TGGGCTCAACCCATGAATTGCTTTCAAAACTGTTTTTCTTGAGTAGTGCAGAGGTGATGGAATTCCCGGTGTAGCGGTGG ATGCGTAGATATCGGGAGGAACACCAGTGGCGAAGGCGGTCTACTGGGCACC >566717 CAGATAGTTGCGGGCGTAGCCGTCGGAGACCTCGTGGATCTCGTCCTTCTTGCCAATGCCCTTGATATCCTGCTTGAGAA TCACTTTCATGATGTTATCCCTCACTTCTCACCGGAAAACCGGTGCAGTTGTTGTGTTTATAGTATAGCGCATTTGTCGC TTTTGGGCAAGAGGAAGCACGCATTGCAGCATTTTCCTCAGGTGAACTCCCCCAGTCTGCTTCGCAGACAGCCCCCTCCT GAGGTGGGGCCGTTTGGCAAAACCGAAAGGCTTGTCCTTTTCGTCCAGAGGGCTCCTTCCTTTG >157866 TACGGAGGATGCGAGCGTTATCCGGTATTTTATTAGGGTTTAAAGGGTGCGTAGGCGGACTGTCAAGTCAGCGGTAAAAT ACGGGGGCTCAACCTCCGCCCGCCGTTGAAACTGACGGTCTTGAGTGGGCGAGAAGTATGCGGAATGCGTGGTGTAGCGG TGAAATGCATAGATATCACGCAGAACTCCGATTGCGAAGGCAGCATACCGGCGCCC >154106 TACGTAGGGGGGCGAGCGTTGTCCGGAATCACTGGGCGTAAAGGGCGCGTAGGCGGTTTAATAAGTCAGTGGTGAAAACT GAGGGCTCAACCCTCAGCCTGCCACTGATACTGTTAGACTTGAGTATGGAAGAGGAGAATGGAATTCCTAGTGTAGCGGT GAAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGATTCTCTGGGCCAAGACTGACGCTGAGGCGCGAAAGCGT GGGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAACGATGGATACTAGGTGTTAGTAGTTTCGATGCTACTA GTGCCGGAGTAAACACAATAAGTATCCCGCCTGGGGAGTACGGTCGCAAGACTGAAACTCAAAGGAATTGACGGGGGCCC GCGACAAGCGGTGGAGCATGTGGTTTAATTCG >561594 TACGTAGGGGGCGAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGACGGCGTATCAAGTCTGATGTGAAAGGCA GGGGCTTAACCCCTGGACTGCATTGGAAACTGGTATGCTTGAGTGCCGGAGGGGTAAGCGGAATTCCTAGTGTAGCGATG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACGGTAACTGACGTTGAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACACTGTAAACGATGAATGCTAGGTGTAGGGGTATCGACCCCTTCTG TGCCGCAGTCAACACAATAAGCATTCCGCCTGGGGAGTACGGCCGCAAGGTTGAACTCAAAGGAATTGACGGGGCCCGCA CAAGCAGCGGAGCATGTGGTTTAATTCGACGCAACGCGAAGACCTTACCAGGTCTTGACATCCACTTAAACTTAC >137557 TACGGAAGGTCCGGGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGCAGGCCGTCCTTTAAGCGTGCTTTGTGAAATG CCGCGGCTCAACCGTGGCACTGCAGCGCGAACTGGAGGACTTGAGTACGCACGAGGTAGGCGGAATTCGTGGTGTAGCGG TGAAATGCTTAGATATCACGAAGAACTCCGATTGCGAAGGCAGCCTGCTGGACTGTAACTGACGCTGATGCTCGAAAGTG TGGGTATCAAACAGGATTAGATACCCTGGTAGTCCACACAGTAAACGATGAATACTCGCTGTTTGCGATATACAGTAAGC GGCCAAGCGAAAGCGTTAAGTATTCCACCTGGGGAGTACGCCGGCAACGGTGAAACTCAAAGGAATTGACGGGGCCCGCA CAAGCGGAGGACATGTGGTTAATTCGATGATACGCGAGGAACCTTACCCGGGCTTGAATTGCAACTGAATGATGTGGAGA CATGTCAGCCGCAAGGCAG >115230 GCTGTCGAAAGGCCGGGCGTTCCCGGTCAATGCCGGAGTAATCTTCATCACAATAAATATTGTAGATGTCCCAGCCCTTG TCCAGCGCGTACTTGATGAGCATGGATTTCTGGTTTTGGATGCTCTCGGACTCCGATTGCTTCTCCTCATCCTCCCGGCT CAGCCTGCAATAAATCGCCGCCGTCATGGCACTACCTCCTGCACAGTGTTCTGCCGCAACGGCAATACTGCCCAGGCACA CAGG >470527 TACGGAAGGTTCGGGCGTTATCCGGATTTATTGGGTTTAAAGGGAGCGTAGGCTGGAGATTAAGCGTGTTGTGAAATGTA GATGCTCAACATCTGCACTGCAGCGCGAACTGGTTTCCTTGAGTACGCACAAAGTGGGCGGAATTCGTGGTGTAGCGGTG AAATGCTTAGATATCACGAAGAACTCCGATTGCGAAGGCAGCTCACTGGAGCGCAACTGACACTGAAGCTACGAAGTGCG GGTATCGAACAGGATTAGACTACCCGTGGTACGTCCG >471308 TACGTAGGTGGCAAGCGTTGTCCGGATTTACTGGGTGTAAAGGGCGCGTAGGCGGGATGGCAAGTCAGATGTGAAATCCA TGGGCTCAACCCATGAACTGCATTTGAAACTGTCGTTCTTGAGTATCGGAGAGGCAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTGCTGGACGACAACTGACGCTGAGGCGCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGGATGAATACTAGGTGTGGGGGGACTGACCCCTCCG TGCCGCAGTTAACACAATAAGTATT >470599 TACGTAGGTGGCGAGCGTTATCCGGATTTATTGGGCGTAAAGGGTGCGTAGGCGGTATGTTAAGTAATAAAAATAAAAGC CCGAAGCTTTAACTTTCGGTTTCGTTTTAATAAACTGGCAAAACTAGAGTACAGTAGAGGCAAATGGAATTCCTAGTGTA GTAGGTAAAATGCGTAGATATTAGGAGGAACACCGGTGGCGAAGGCGATTTGCTGGGCTGTAACTGACGCTGAGGCAACG AAAGCGGTGGGGA >134207 TACGGAAGGTCCGGGCGTTATCCGGATTTATTGGGTTTAAAGGGCGTGTAGCCGGGAGGGCAAGTCAGATGTGAAATCCA CGGGCTCAACTCGTGAACTGCATTTGAAACTACTCTTCTTGAGTATCGGAGAGGCAATCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGATTGCTGGACGACAACTGACGGTGAGGCGCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCTGTAAACGATGAATACTAGGTGTGCGGGGACTGACCCCCTGCG TGCCGCAGCTAACGCAATAGTATTCCACCTGGGGAGTACGATCGCAAGGTTGAAACTCAAAGGAATTGACGGGGGCCCGC GACAAGCGGTGGATTATGTGGTTTAATTCGAAGCAACGCGAAGAACCTTACCGAGGGCTTGACATCCTACTAACGAAGTA GAGATACATCAGGTCGCCCGTTCGGGGAAAGTAGAGAC >258375 TACGTAGGTGGCAAGCGTTGTCCGGATTTACTGGGTGTAAAGGGCGTGTAGCCGGAGAGACAAGTCAGATGTGAAATCCG CGGGCTCAACTCGCGAACTGCATTTGAAACTGTTTCCCTTGAGTATCGGAGAGGTAACCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAAGAACACCAGTGGCGAAGGCGGGTTACTGGACGACAACTGACGGTGAGGCGCGAAAGCGTG GGGAGACAAACAGGATTAGATACCCTGGTAGTCCACGCTAGTAAACGATACAATACTAGGTGTGGCGGGGACTCGACCCC CTGCGTCGCC >585355 TACGTAGGTGGCAAGCGTTGTCCGGATTTACTGGGTGTAAAGGGCGTGTAGGCGGGATTACAAGTCAGATGTGAAATACC GGGGCTTAACTCCGGGGCTGCATTTGAAACTGTAGTTCTTGAGTGCCGGAGAGGAAAGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTTCTGGACGGTAACTGACGCTGAGGCGCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGGATACTAGGTGTAGGAGGTATCGACCCCTTCT GTGCCGGAGTAAACACAATAAGTATCCCACCTGGGGAGTACGACCGCAAGGTTGAAACTCAAAGGAATTGACGGGGGCCC GCACAAGCAGTGGAGTATGTGGTTTAATTCGAAGCAACGCGAAGAACCTTACCAGGACTTGACATCCCGCGCATAGTATA GAGATATATGAAATCCTTCGGGACGC >26036 TACGTAGGGAGCGAGCGTTGTCCGGAATTACTGGGTGTAAAGGGAGCGTAGGCGGGAAAGCAAGTTGGAAGTGAAATGCA TGGGCTCAACCCATGAGCTGCTTTCAAAACTGTTTTTCTTGAGTGAAGTAGAGGCAGGCGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCCTGCTGGGCTTTAACTGACGCTGAGGCTCGAAAGCGTG GGTAGCAAACAGGATTAGATACCCTGGTAGTCCACGCTGTAAACGATGATTACTAGGTGTGGGGGATTTCGGTCCTCCGT GCCGGAGCAAACGCAATAAGTAATCCACCTGGGGAGTACGGCCGCAAGGCTGAAACTCAAAGGAATTGACGGGGGCCCGC ACAAGCAGTGGATTATGTGGTTTAATTCGAAGACAACGCGAAGAACCTTACCAAGTCTTGACATCCTTCTGACCGGTACT TAACCGTACCTTCTCTCGGA >258502 TACGTAGGGAGCGAGCGTTGTCCGGAATTACTGGGCGTAAAGGGCGCGTAGGCGGGCCTGTAAGTTGTGTGTGAAATACC CGGGCTTAACCTGGGGGGTGCATACAAAACTGTGGGTCTTGAGTGCGGTAGAGGAAAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGACTTTCTGGGCCGTAACTGACGCTGAGGCGCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGAATGCTAGGTGTAGGGGGTATCGACCCCTTCT GTGCCGCAGCAAACGCAATAAGCATTCCGCCT >13662 TACGTAGGGGGCAAGCGTTATCCGGATTTACTGGGTGTAAAGGGAGCGTAGACGGAATGGCAAGTCTGATGTGAAAGGCC GGGGCTCAACCCCGGGACTGCATTGGAAACTGCCAATCTAGAGTACCGGAGGGGTAAGTGGAATTCCTAGTGTAGCGGTG AAATGCGTAGATATTAGGAGGAACACCAGTGGCGAAGGCGGCTTACTGGACGGTAACTGACGTTGAGGCTCGAAAGCGTG GGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCTGTAAACGATGAATACTAGGTGTTGGGTAGCAAAGCTATTCGG TGCCGCAGCAAACGCAATAAGTATTCCACCTGGGGAGTACGTTCGCAAGAATGAAACTCAAAAGGAATTGGACGGGGACC CGCACAAGCGGTGGAGCATGTGGTTTAATTCGAAGCAACGCGAAGACCTTACAAATCTTGACATCGATCCGACCGGACCG TAA phyloseq/inst/extdata/rformat_dist_0.03.txt.gz0000644000175400017540000006407413175714136022413 0ustar00biocbuildbiocbuildݻ븶k)\)j8WO\H*󞹸rAR!!?l?E͢fQY,j5EFFFFFFFFFFNNNNNNNNNNAAAAAAAAAA͉5'jNԜ9QsD͉5N?6>~X}iZyCcѴ1uyٮgCk[hZ?~8h!o]!/Q=[)f[k|۲xmцnބo}`h5<[=2=GF{gc_l!a;cnmz/ӬGvtIkҸ{eTXD`XHMUimOq l"m-IgA5c*5d6H֠GR veQUx:r xߛ5lbdl zSYl{~ǮכsPt{hZME*zOTgC~ߐq70Woͺv8n ~ّm^#=*}b{K>Wk&ףQ{;c~<^}-y,ڣ/j/_=z>ھ_1#Uky7WWޖ@MRΐT߶5gȫ{t]U}?z/8nlp~c?tޞ-{/ǣx֚~ɩs)69f7i]s=n{鬧ώ{gp]nG4{jylq+(W[_ů,#?%N_XT^Oso~ˏ)j_V+ޟÿ峞z's{/~MkUvoۓwj}O)1w*gXyumv_5YJG.w]~rA`*0=E,5ui9su_S_OQmB, +);|qPnćH n8|2{<+*gZ#{:mxE]֮8U[D[SQلm@6Y̓%nagWk/1Wd]jfU4nӴQٿÒ14fz{ ǠE*ݼr:vwXiw* ^oU;K^"ioy潪oEIl\^XwP^qt`M#~^n`n]hq}!6[{27g5(omivkQժ0nі_ #PݣSը::^zrgaV4]Ppn@,ط\B,9\㛻^yYnxxl[sXŵ*Dzs{4{f0w}۩gWDTuU:sYΙ5𨄢wQK};uckz*{><2}ۺY//qֳ!e}Jz:>ОpOCF礳ַ[lmxd-]yb)~kM X/;oq6ϩGW}$#VޛzWZIV(gwvu{:Uui:R(5\mI'-8ȫQU ǠcmGY=&}T?~|P}g̶/[zْy#{>9>ۏg˿_{Gj j~~}66~gg:9ރξ:Mm-s}떼:ϏEٵm>|L7sjϊu.{?H}GkeO{'~9~_};3WK߲Ko9{?B^M?wIҟW[ʏme;.:_w.w߸ /wLYp|yHK*-4=s:$wyJ{T/Y(,x\'I|M>E7. VYynܦ||Fem6/ *+LIP sSPyٵ22ŧך2Y/kW3*Vk+P=Vqj_W/G]qJҴ} T fPYOj8^OHSu;Zh;p|rlMu ف{.f_:ҾT=k(OY=$g[YX?ẔYcz^TuՇ^Nš+ 'Lfݶ εc_zmbPj8x9{AŒ|\M.='=k~wy}ܾ-yE9RPu z>kzg~s9}:?_Wm:{5({~Lձ8(ugt\Mui&^cUגͯAgǠ٦~ۿ=3+֓Yq~nUn;K~[Iw]r^7IOk߯f~}K>wٻ}׷hl[zǖoٳno|[zmW6}w}]r.w]?e_k< ~Plc"OonӘ[;vVhr6OQsC0WںOm/ Z{ _qwtsO f^U*9ZGĴe}O>Z_uc֧umfWJ3g/լț H2?rlU;1JUࠤ|e {WӲ}}qM@,Gz]=;NJ?[lV|67LzNE?Mۢk%%v +-Xɳɶ}~(}.2uBSqŶ)f +nV]lB~:{xXw=5{,e|]9NxQ;C}O u&8>Ѷjώz~ q: wR]VJkNZWOgXyݱ~"D׷k]x>s=)pQ=T/;,x?'Dj|n|nz?jrt6W.럖$_mS/>ʧXU>W8xgy|_Qji_>{>G\|oTkx/g^"[i>7˜K?|uՋlwv2g8ONu\*-"+|e1C?5hݾ곉Cw]~N'f٧oϛ|.w9?';woF˟9k}{< ?w^qY~Hn{'k~yU,> W]ǔl/׿US=[O> cz-qٖrrsTΫh3|>9a+ɬ}ԕk_%Zf=¬ǘBaUT,m8쓶^? .;[.|v6RmF?^Y8^Woչeˊ^vWaraiEy$ߩBNm^駯Y{S)w]YoxzI-S=x0 P(X=%y;u^}sն>Wx,[פ#}FnV)fCu6sX'ogWz4krl>{1UuӚ.8jņ8e2mڲ_=^Xl4; =zC-;͏[Z qWm-W~YþCv;S{T=::?ZVn?^޹'㢝v:ꞗsLg֟껥X ~ɳqʬv\^|Y3 2^ƺǥo\@9\xGpne^u4K^u%{N?+0ay]QZP|67K^i_ 6e?;ZP?9v87^W{Ƴx|Q{V/) w$plg+lнzN@ξ rzo9eдm;_I*/)c5}Dy92?a\C_-Vcٹ=ܡsud(P,з޿|GNN<ه}v9[d~r#]rns۲[y'.Gq4{_;JG~Uu\Wߑ㪼[]r.wťn[^X>݉?3|@ϊ,]Ѷ %i03AגҀ3O9f(hmՠ߶k8o)2ղ+1|i#w<(^l,6U7;Avٮ)KXb.h{vkQeʹ"37]}Ϧudeyqgf0 lj9K\:p4q-"-F\ڷ߷|(>Ϧ C!uNjOeP6`ker}eW*Erk-_1t%2sˎs'ź>wTPA=Nlε꿖-,=K0Gj<{\s~~ ^֊gmj;ru8lVQ}].WXf˫{m!l9zr(ڿ4AVۈ3w떱l5J ¶R}Ic-'n%1ѣV9Ūz|O$l#|OvdtX }EmRk9U˔ԬvR%׆^`sO]mOmXFUm\۹Y:ǽ=_y{!y音ڏ##~8KWnInoG|j˯uJLY?{=/'Z4ٖ_ώ+?\2smY;4WKu?~}sϺIH?`۽}Ξi7;^f}Ky7+Z|kڿG:]=j}_˫}ْ_?f?цf/޹]5~'ۮu{wR@KqG6b[qT.?MO򽵍>MC!TaE~2 yn*Eڪb8pY17=ȕvYHHeۂ*WqS")4e3j滏iZ֎ث2ج^2R̲&-۴4y1rڮk@wޭcۼYWIێnWʌyV }a|ð3iXҶT؛\hnj<2#cУ=3>ӌ}rF Fqs5Sp\-c\;?MX`cFM`1kMh~ tYaeپ:+Jp7%gXd,!?CeLw+w/`uʶ~ Q{#Sy`^sڗ|lB z& -.j1ǩ=b9!rehPܖ]l_K #ûIZi_=_ΟO3k@ 㴝ꩍOayش$t]f;EWlXΩU &Uߥ%/c|O-,v?a|v z淯0P?Gn_q^/ՖVqhy_wqjVDz]nj7}<tLcxM Z5eb{#g((b(_]e^f^_ -hm2e"KDU&լήߗ-y ~뼜?"gKZ {ʿo.w]rXw7s?~D}sy||/Wk~w-_·߾eKgp.w]r.w/.&r=ɳO v,m8 W it6SrOyioS-s@>~O+YŴ}⳶QVMrYƊS}nn%c_5oll?^xcMT^١?ER >~,j>W&3Kl~j+csn͘ƍj>z-[˰Pu􏨞Oqʺ5QyᙫPuocZh\ϻz/Cx;<Űx eBMm(7zUsqHߔ/C!ί׫i-\ؙg;׳j~?v.?KeD绖uY o.z[pZᪧUSYnTsM};܌ҍeQ{';Eyͳ۟P=zSu}[87^F=vgߴҖd۞N/k}Յgu^xxMV=揳j; ?okY]-,^YOsiOg|[%udԾRU\aKځW |e{g;~ܖVuμ_e?|2w<ߞ-;n}#a~vj}n;{]Ͻ~~`NT4{lx<ڷxVy~=׿&s+M;;k_o'V긾,C~v?57h^)8<>?%QsM:V[Q?5+>]r?g[߫G}9=Yb9{;[˯ꯤz\=\Ur.w]Y/|^<Ζk'-{nKB[C|~VG[s4Klx]YS6KIvͥ[>5}y뭥֧jtgl>vx¼Ζ6{w{Ms{O9u;%kU[Λ1gql٭og5zc[_|ƾ_6xro/_;:m)gw>SM~yJR_m+Gڿ_Tlq~F9-t.{B[|nq?w3׻WoMe'9#=[{3?]g_;wo%7>z]nw>U/(V?(6g7|x!|lm27eA6iެ3j-R"U(pizr%YbH_ymgږ|Twv\eJRfmG޼gӶޡ㺗b 埖&仰'Kޅ4CmvQ?m#7<xY(]֙D-۱-ӶU|Jb(UCa=?n]PZW;\vvj >4['v$ ancil )d%=C|+*|ylW\~O5lcl.^;V/[$&NnBfQ6tno'xN۽f՗ajiAdlfDK#׫}V{2ޮ~sSD=B>Y:amD)t奦})/>_>׶5ԇKSN `}rc?OCASh A^kr걱r?屪}JeTMcY3mWwSo?mJyM2c_?Tr}ZGcjXKح{@Goi?b TSv&hp/HӚ4wC~|>g" AۤkShx:h3P~n5omʿ}?wT=6y}ߒ5c'y|R+4y951ǼKc_`5kz\7ihghҩ[cju]3Sl'kDŽU5[1յͻ|x#۞yYAOWA55m_KȹڋO $>mCmO's|^}\g2z{mm.w]nǟ۲_+'8V_g)?؝xV~ޱ_tZc#o.w]r.wJq׿(uio3+7<jMevsr|^yoGn3\nW?]Ay^|m.Eeq^iZ!2۽uHG=27Ze(ݴH_"aVZS<ȜP5c A- ~V] Oe9s|;q[I̶ ?ci<$hk }fO.iau iyەz-iP , p=w]dCG/2% W7+;>$AFKϙfRŴQb,qj62o=tΛZ4t?صpoTqĖRwPh͕"XOy`N{+7QUw% [_i!!"f Nv+=&{?{ewsϔvr)}cȘã#ɾ@53Rs - >:ƈaGi[!3W>^%*؏0ƽ:ZG`U2NѬ|kƇfƪLZ7-1n+gILbڷQwrSN5ϗ6N~}]cӆVխUP,YQ>jH-?yLٻc }g؞>(^/׵M {3r.w]r_W)E{xE_V5S/_ZGB+m~e|]r.w]r.w&zz]ɞYVM&j-Kbu2K-{Uug\~ˤKӨI2ZYQ& kKRƖe!K a*ߖ[AOM=Q6h&&0*3m[[a(3T8Y"gzm%f$iG#2>'N* ϟ4Ё.>'k:lCKFo-s.sѥ_wSVFi/QMMv4ߝ6F2C>QU;VЯ Oշ7퀸|frOR]հyGdﱷ'lmZD$~|~Z> c(0Jρ;+P XS򄱵-x45L eN"k$uL[,,걚bn,FI4?@lok[2gr^)j?Fe٠Ee+jo&Ru#o dh1Uk(' :~mmeOsep.ɏLն[{O= e~/2ϲgjW$wޓW[4,QrXNeg=XiUM<7wۨGh)A{hK?}W^_ΏJ2 g`JlGF__Pnr5ډsagۨG5vm\Tqٚmu!]r.^"'w/|?}Wֺh|+k{g]r.w]r?6x,u,!iꞗ)ˋTyH{Glp&7sYtەM :Gff]9ZQq8Πż\,.&{#D,qR~d{7jaD=[/" с6MUٳ4p鿆 eo'>Eei(~85VY=|jxZ#{:ҹ:rVO5Yꢒk;U;C9:l 8^vTc\YBMO m,V9ys<4zGzbI `@3mZix,m ҷM m31=m։b_[Csg"5Zlޣ 3ӢaV籣Z(SUX6 >_hB>Yf8;g5̱/sz+rZs9xf:mbhO,YmA>~8(zquFQ&=(tz,g:^e2DlQQtO/eoNuWv`i`hvc=lz}ۡT:]6Ỳ~V~ePpAm.N|ɫ|kpL)O૓ykS&￯@[wZ$ˏ{?"n9zsݯ[̎#K[OS?XE-3廤`nքw6cņ㰰qt>4h{Fnj-eȓi>w=Ux֜kʗ ;j^ͷYm_wr1nUsW7[XV7[ yhʼzl5jwolo{ݖX mn\Syjsm,㾾lۑ;^uJo4SGb}ܗyw2G}.oGLS~_[BFhn9v$E3L͈٫e;'Rbn[ ^'C3M}{i}vN=+9^FUj;{8og;Wc^~.w]r.w]~곁Uo{-[^G.w]r.w]r.\ Bphyloseq/inst/extdata/rich_dense_otu_table.biom0000644000175400017540000000631613175714136023102 0ustar00biocbuildbiocbuild{ "id":null, "format": "Biological Observation Matrix 1.0.0-dev", "format_url": "http://biom-format.org", "type": "OTU table", "generated_by": "QIIME revision XYZ", "date": "2011-12-19T19:00:00", "rows":[ {"id":"GG_OTU_1", "metadata":{"taxonomy":["k__Bacteria", "p__Proteobacteria", "c__Gammaproteobacteria", "o__Enterobacteriales", "f__Enterobacteriaceae", "g__Escherichia", "s__"]}}, {"id":"GG_OTU_2", "metadata":{"taxonomy":["k__Bacteria", "p__Cyanobacteria", "c__Nostocophycideae", "o__Nostocales", "f__Nostocaceae", "g__Dolichospermum", "s__"]}}, {"id":"GG_OTU_3", "metadata":{"taxonomy":["k__Archaea", "p__Euryarchaeota", "c__Methanomicrobia", "o__Methanosarcinales", "f__Methanosarcinaceae", "g__Methanosarcina", "s__"]}}, {"id":"GG_OTU_4", "metadata":{"taxonomy":["k__Bacteria", "p__Firmicutes", "c__Clostridia", "o__Halanaerobiales", "f__Halanaerobiaceae", "g__Halanaerobium", "s__Halanaerobiumsaccharolyticum"]}}, {"id":"GG_OTU_5", "metadata":{"taxonomy":["k__Bacteria", "p__Proteobacteria", "c__Gammaproteobacteria", "o__Enterobacteriales", "f__Enterobacteriaceae", "g__Escherichia", "s__"]}} ], "columns":[ {"id":"Sample1", "metadata":{ "BarcodeSequence":"CGCTTATCGAGA", "LinkerPrimerSequence":"CATGCTGCCTCCCGTAGGAGT", "BODY_SITE":"gut", "Description":"human gut"}}, {"id":"Sample2", "metadata":{ "BarcodeSequence":"CATACCAGTAGC", "LinkerPrimerSequence":"CATGCTGCCTCCCGTAGGAGT", "BODY_SITE":"gut", "Description":"human gut"}}, {"id":"Sample3", "metadata":{ "BarcodeSequence":"CTCTCTACCTGT", "LinkerPrimerSequence":"CATGCTGCCTCCCGTAGGAGT", "BODY_SITE":"gut", "Description":"human gut"}}, {"id":"Sample4", "metadata":{ "BarcodeSequence":"CTCTCGGCCTGT", "LinkerPrimerSequence":"CATGCTGCCTCCCGTAGGAGT", "BODY_SITE":"skin", "Description":"human skin"}}, {"id":"Sample5", "metadata":{ "BarcodeSequence":"CTCTCTACCAAT", "LinkerPrimerSequence":"CATGCTGCCTCCCGTAGGAGT", "BODY_SITE":"skin", "Description":"human skin"}}, {"id":"Sample6", "metadata":{ "BarcodeSequence":"CTAACTACCAAT", "LinkerPrimerSequence":"CATGCTGCCTCCCGTAGGAGT", "BODY_SITE":"skin", "Description":"human skin"}} ], "matrix_type": "dense", "matrix_element_type": "int", "shape": [5,6], "data": [[0,0,1,0,0,0], [5,1,0,2,3,1], [0,0,1,4,2,0], [2,1,1,0,0,1], [0,1,1,0,0,0]] } phyloseq/inst/extdata/rich_sparse_otu_table.biom0000644000175400017540000000660413175714136023301 0ustar00biocbuildbiocbuild{ "id":null, "format": "Biological Observation Matrix 1.0.0-dev", "format_url": "http://biom-format.org", "type": "OTU table", "generated_by": "QIIME revision XYZ", "date": "2011-12-19T19:00:00", "rows":[ {"id":"GG_OTU_1", "metadata":{"taxonomy":["k__Bacteria", "p__Proteobacteria", "c__Gammaproteobacteria", "o__Enterobacteriales", "f__Enterobacteriaceae", "g__Escherichia", "s__"]}}, {"id":"GG_OTU_2", "metadata":{"taxonomy":["k__Bacteria", "p__Cyanobacteria", "c__Nostocophycideae", "o__Nostocales", "f__Nostocaceae", "g__Dolichospermum", "s__"]}}, {"id":"GG_OTU_3", "metadata":{"taxonomy":["k__Archaea", "p__Euryarchaeota", "c__Methanomicrobia", "o__Methanosarcinales", "f__Methanosarcinaceae", "g__Methanosarcina", "s__"]}}, {"id":"GG_OTU_4", "metadata":{"taxonomy":["k__Bacteria", "p__Firmicutes", "c__Clostridia", "o__Halanaerobiales", "f__Halanaerobiaceae", "g__Halanaerobium", "s__Halanaerobiumsaccharolyticum"]}}, {"id":"GG_OTU_5", "metadata":{"taxonomy":["k__Bacteria", "p__Proteobacteria", "c__Gammaproteobacteria", "o__Enterobacteriales", "f__Enterobacteriaceae", "g__Escherichia", "s__"]}} ], "columns":[ {"id":"Sample1", "metadata":{ "BarcodeSequence":"CGCTTATCGAGA", "LinkerPrimerSequence":"CATGCTGCCTCCCGTAGGAGT", "BODY_SITE":"gut", "Description":"human gut"}}, {"id":"Sample2", "metadata":{ "BarcodeSequence":"CATACCAGTAGC", "LinkerPrimerSequence":"CATGCTGCCTCCCGTAGGAGT", "BODY_SITE":"gut", "Description":"human gut"}}, {"id":"Sample3", "metadata":{ "BarcodeSequence":"CTCTCTACCTGT", "LinkerPrimerSequence":"CATGCTGCCTCCCGTAGGAGT", "BODY_SITE":"gut", "Description":"human gut"}}, {"id":"Sample4", "metadata":{ "BarcodeSequence":"CTCTCGGCCTGT", "LinkerPrimerSequence":"CATGCTGCCTCCCGTAGGAGT", "BODY_SITE":"skin", "Description":"human skin"}}, {"id":"Sample5", "metadata":{ "BarcodeSequence":"CTCTCTACCAAT", "LinkerPrimerSequence":"CATGCTGCCTCCCGTAGGAGT", "BODY_SITE":"skin", "Description":"human skin"}}, {"id":"Sample6", "metadata":{ "BarcodeSequence":"CTAACTACCAAT", "LinkerPrimerSequence":"CATGCTGCCTCCCGTAGGAGT", "BODY_SITE":"skin", "Description":"human skin"}} ], "matrix_type": "sparse", "matrix_element_type": "int", "shape": [5, 6], "data":[[0,2,1], [1,0,5], [1,1,1], [1,3,2], [1,4,3], [1,5,1], [2,2,1], [2,3,4], [2,5,2], [3,0,2], [3,1,1], [3,2,1], [3,5,1], [4,1,1], [4,2,1] ] } phyloseq/inst/extdata/study_1457_split_library_seqs_and_mapping.zip0000644000175400017540000047263013175714136027002 0ustar00biocbuildbiocbuildPK ЅUC*study_1457_split_library_seqs_and_mapping/UX eR׼eRPK҅UC3study_1457_split_library_seqs_and_mapping/.DS_StoreUX мeRܼeR;0Dg K4.)pn`E W!RP%yViO_ 3>6!B}ctvB2ts:vc2]J7_#LC>+1XW,pp?a5 !~uvK@🅧nl+ܺOPKjmPK ۅUC __MACOSX/UX eReRPK ۅUC3__MACOSX/study_1457_split_library_seqs_and_mapping/UX eReRPK҅UC>__MACOSX/study_1457_split_library_seqs_and_mapping/._.DS_StoreUX мeRܼeRc`cg`b`MLVVP'A LPK!(RPKKBTstudy_1457_split_library_seqs_and_mapping/study_1457_closed_reference_otu_table.biomUX QԽksF-Wވ~o*?zeWX{F$S$e翟%x; vD77Ts?^R$%sN'/#SO}}G)^?jyZm^>>Uտq]e~'am2]eiVY܏^۝>%۲;jGZ&j?bmCKYkx>7n??_K_֧?W[n۪(M}4~%. gݻT Ye|x7ŪX[yvo+e&R!OQ27mp5pkT+K"O*O*ŽWۦ3- }ftM{?.aL:Ue~}uNu`͒i,~߯^ښ|s:?&/uWʅKEo0w={ܴףeM}qR#Drg篙`+g* ~Iw\ag޿pN(QH.p#ڀo]yh{ooA}q1}D5!AÓfJTjc x.3Xm};fIVUtuL1v.,H,__3zwd~_2vE88%/wRƗ qvhK:"UhFC4@ک\OPP >YX{XJKߖ疲gj.df>aKr\]'%"c(ەkO/+o9/v_V\[z>pUBk35f֭dJJhЋ;$|{z-6}/?G*+ifwnԷXmɡ-Tk}o5llfn,Ϲ\D/}o7.fmRhZ륭_{u:ܽv 81F#eu_Ӛ%)ʯn4۴/W% Ec xpL86[;5lIKW]*>_sͪ&&r?]tެh!4.=yB#5  -iM&.6+)͡|Ib~*riٺ}j]Wߔ[)?ԸvυKoN-.Jh*RӐ>߹!+_˪ekͿ.~N6laK1ǘZL+T b>K}8^R(k6Ǚˍ!/Ge fCx" ީ}( ZnV$sG&/M)AR+% sf;^`"<0BqB.ǩfH7 @%ݠ{[xEuen31l:DF?\,wa]?Vvj`}ʓ^Zö|Pc4!XwoZ(?ZfoN[-Y^wڶR_%Q M`5 M?Unz#{9[U/eBB2]y6ίb_gc7XvSQ a5G}e$,f&~=/4PLake_ǃҙ:ݷ` HN4|$ ŰOFϿKxXtz3cW}%U{ ?gܒ$ \+(^ia*zo(.dJ 6-ۿ,.'۸IN/Kyl$n.#bP}OT.6;zߧO]&R=‡9&?OigoV.zؽ;2_,'jA;m!رr5OP7%zuAɤS.YKНz<N!{i Ú"Ur+女PgWlڅlǘ*,ʗM_ e^ 'pDS Z+ W4:’-n*3փk8⍴Vgǹ5a{X7%GD j?+j/32:e1 e!z:?gJ ELL5kjWźIϢE7a ?*w=ȩa.1ѮV:-WÁa'GVaア&\'>>e6F-sw@Kn}ѝ<}m [rwt(UXNƜsRA|&˧`ꎿn(  ."%\ƗYTX0 ?J957+Izˣ`$pjeY4ckdi_͟m ,J{H1!6rqEx4ѥ̧aK6٪tiQ+uU%hi~*i0<C1=5Hu7jmX[ hLM9;+_ΔQRg.sm*KUۗMV>8'Z{'i'KT̋r/UJ)O㟷mu=,X^UR!j&`8gX'xzOnH)Jwח<"zN~PT__G}.sTR3u=;㹻aH|S=iq,H N$f `b k{4Fj\ }YP1-im _Jt+,) C" L#t]؀MJI~"{Z\2 EBR)kؼ>-lV9y|ffjc谌Syk‹E(mHXI_Jq=YSPM[Ua5:Aڨ#~+7@$N7FRMhdi6:FuJ)T&SYJÊD qN|z=gSهUB&`kfYsZ[6-GZnƽ\byQMƒ|Ҧlc1*dX5!kzWFck#+3"nf\諸LT ں\3&~s+8Ae6,E#T!1rys)Nj!Z&֓6d&\Gx~pX)6=AJr,inȥPD0%-]CQu;R6[T41\A XXifC X<_-&d|!"A=?]X^Q#1#"jnQ >7kz'KtX:IbY6CwAN-ݖ{W2lFe# p -/wJ &zǫ_.]'M+( K%uk3^;sʼ3KSٵAo]E}p'?m_zٓz\W,ce:4Ude7]坺™pq_;.m+; 6I7'WGcMXjyBY@J4lY6!*uQ|bT3JE(e`;ej˰0\D#W0ve0uWŶ KL1q+1[O7d044w{Lq\Mn_b@?xE }q2ke '; Vc)y޹g ȖΒ?Yi Iꪾ |"zFUIFF((@LQnS-l&3~w+Y RV2k6L 20>l  aZ޹2K(ȸ5@8:vp=>J\ߜ<ۜwi˟{ 3z]aP2QK7^a PqNȰqUC0;Ifd8LȰBLfI˪@[ x_H7|BX Oc{6:G7Aѷ=НFem!߃WX%+4k7q%cVC_Jυ;.'C~ MQ8sM6t8ѥΡĻ>f [M|l]%/^ah~x]t`xtx1Ōј [V9V`M@K=#(p&(VrW<=nO9, g&Ytp 6^rfg.~LHCC=6wyi̠HxvDS XP%@/Ce]:[_7%]쏅6cmץ/)h]pFgԅ s)}o_ҥ PGۜsVDVs7ugi %OE)yFƺ@z,E$R}:פtA L/r >v.Im\`#u [ˇsXζ{[Ѱ bukkⳖ/]6+#)b1Ap/ V;7.9E h)9*`wSQfk;侨~zk=|%$Tڀ)Ӯ{[ِY"aa5ۦ딸+^Ol1a~VVsYkKOWp'q+Ңq\mM]YTu; Vڰ {9UBndJD Ah(abDx qYŤe.&\Bu(Zwہn7zh'xU\]_G#g[w⹢6!>h5jV8={𡣫R.gx1^ FXr/8?kn#eV_qRUŗjϖd_Q  bX Vൊ>N]p H:cy#O C%'*gUi%b$daª~#_J2vj:UcJ } &̽w3A{V+ $xĈ6t쐰$XX L kf rI3s $u$.v )TeӿDa(\^n6G͒_hms|\eqcV>nˊmHOgjtA= XP=Hr?tWɝԖ?|=IU-,& XXd>._3s%3 ̜<>y-L5 19UŻۮے6KIΎ]z 杗Œ^D)^Q,d |jG}Y4^SVNlUȭ\PG?v:'OB^`8}xE:$?+O,0MiLE7*mBGF'V+,1O.)Ƈk=[X]*{~9K{ 6ECp>fvPw/囹V{`"C%W;i 1t <?Br-$a`pۗMV>ޔ|vԳד~@6b,^iFQ;wfiXFApf mࢴbC!j 7pajUŸpω;&Xe`Ԥߪ%3.9]7%>*X*7ú.Et%~

|e '<= b޲˃i.Oߺ`췁s'6,Ln:~%fN†e^"Hw-RBn_+W,L5DɰS ƽiۗ?T* @ZՀDZ @ MARpD"Z8?+}u{oƁSeA@)JFOc|ɳ"f'é'q;c5FX&DaSʢVTz47|UJL &Ff=x>?)싑tj+p!C<΁UDŷixkUiI18.&<~R,-!VO]ykU,<0 g`og[}7g Gւ 3xA:А$Aqޛ[:/=m^wd6Zt;hw3#s~!dnZ˞j y!sbtA DU{⌊JS,-H cR D_/exRmsRwy/Y#FfXNP~6'2=6ϼbc:mo}vrk PuPAhpa>Gͩ cG8[>Ⴌy,-\BJ"hܪkfN^$}H/qef ,mZ_. I=p#&W`Xi$Z12n"0Wc1*ðZmCUz,qpVB*2b;+_KgƄ>UMq`)ab:B6af\ O"{9[]nؒ/6y$!ur|Z\` yL|`H|஗ ٙk_,Viy{q\GZ1]@`@5dDWDo+E}|院$wf_qµOMhW jA_kGIaCKhB&D>]Ie p87I/]ݻ{mDw+U!Rr{UJ$1JJLXlyJ((JG(kM}̞H&o55M ;9栩/4a;kt&}处Er;Z=ZMXUNA^ibX5 乗%)3E>i6چ,xDYŃdΡhD*(j|R|eci/`)..;8|5J5Krح56.`1/k2l5EDu"L O{[p(x07B@*/L;n[tMjJVMSA_h9:^F=]OlI )mTc(֛yqfH~hC1&ƆhO75`JCgb0FjOD8" tiِ+4¬5Xe )"tSc-Zzle-6ӀR>Vݰsk@r)PY) r 2Vf\)`0HP@ac;ŬX] ϝzNp5e&liQR2d-;&%΃SB=PL֡$HFa_htX4GMA[Fp9E`'Ė.olGq0x7!ɩ܃ۛMwdӘlݪ*Q}ڻ@) \Q7%CʹCBcMYNOLѠ]W8ҍ*EXW!|AjrXdF$20=)VȉX*U fqlaǢ|Jc֚Wc7-<c."4.c*(;$Dhߔ2i{rJK4" }[j,X)PGpKPV&V&5aq)5,r5R-IX4:B!0NmN% n.CHnaԅ}EُH/օ0xswFy8#W,܃ZޒxnQJ7K#)S&Z9w'2LMޟ߲&,QNO!X N74a S!YۨZ֥McT\>bЃ0}3a!$׭Ps4,VgLR|e$\6K  ^8P`_]_wڍӶ9OU3'҆$4Erjd:ޜ~r fder<M*K%bxq]]:X|WX'lٻu891//5?-kqj:0!֐_Dn4 ot{a.k3&'M)'Fw_I8j]2K>s1qp5\UP1Jd_I.khxa:U Mx TiN噻fPƵa\$28+b5]EL1GO dS8qXdWa$F2M%`}Gc]3r* ;9$Q UC~P TQG96sF.:}<H܏صaoSɿ la#&C߾.aK]Z=e~v=W*SukQ{ؗv>CK8dJTLRaal|$kءmrRHe e.NTAE^AF <(ŵ1Rc;DŽX] OQEbE l,oE??weUO8ζߢxX12mZOqBq顁 |t[Ǐ&p"L&/"3?9gP4Hrw@Fό̴˜VY{@i'}9H,||I;執mu!Ϧ`.Wq H>"*cvu"f$vƝ ״,Jƈ3ʃ/]~ YnSՂ,ori V&XA߆´[fQm}>'h B$o$-Lֻ>-@8\ +Q?\ K*ΞL1x"O#RvnJ=ewI4j(ŢEvh !:\um.Y ^Y :{*3C$g6=ws/X|+a|U`ŽF,خ M }W`ҤٲS7,KL]g SG0KĖ !,f YʧyMN}6l5Ln/LaL BW&ß8S*ƪ1NR<LH fh8YAVP9LE˔Up~ypɚ`泱./jk$ܯvc."6`T We [c[Vz(됵U)|wq brA(z!GC3Ԣӻ\繙IҿGB[ɜC}I7369hJ]?;ɧl=Pw!26oUU̽wl>aa=+0,%aʦ[U*J:<\P-+>2΍cE,s PfX%m?irDjP;Y#h4TPwCNTj'V 82+UXUQ5gY \XwMIz :r!ZsͯwS4\i s{@iDRjfEXwrxqK)Jpsn\kgj.9?oU!4~?ϪF laF{ ΦtA›n]8ܻH_k97+NlCkuS+UƫYA`319sL໴cdE~ϖc|~נIڝ>'˺x.6J\d7ò}}R8-Cv;{7}L^vR71k_aKV;cuA%5f1d"^Ti}ڳ|pwVNQ0aK]qWlw3=́EÖTXج#wN)jB|X0 |8E8|!TI,'szꧾitvwXv7±8AB\ܴk hR ~a k 󣱤-87kP޻"w&۴ 3S^6pG}v:NohR Q!@xTxѾ)_v6[UuYң3硅C ™^Ȼ]-jiC9SDPOc`s(]*hEP>~ gaI@b nƢ hTqh5Ɋr0!YpRJB%#@x^jou)٫VI8D_rnMUc0Z6hWx1sG1̜Y={8eb|⵬%\ ؎O9gTI ƍeWq2ƒŀNNHJޏSYl}?uX_pRPh1.K+ƐP K[VW3*^wYrdB0N恸@J5uk͒D8նQ" i0ˀg@5T Oբ Me.X^SrH,4,CX&GSewM;>RwG4r,>;EXXrwP[x&&ݘū[;~k8GT_sUN{Qpa*&J5coC5m_R¤@vHY 8)%Ѻ2ZZyZHCBp9uk}#n?8(374G\j41h3 t{;gn3J)Xѓ$ib}q qcmzq!xr a5|x(td-jY]#C1@Fms-n KwK!`1\iXG2~U)6VI )+O[q㔢ph$NdyU4P)8]5XIK&/QO{('8\%^ 8~p$̲s8?9_rxg\gh^>t.]&nL:t?e1-AFt?ҷ͹oB e.xs8&g:f*0 !hdc;e3A7j݁0/@Vly 0\ٳMIZ(d&G` ثbJ̮0arpi4Ԥ-5sh\FuQ!t8ۣi"Lnl=9Z>8bX7,>[&A3W N<a\ 1iTXӟJd)f3P޲&Ymz8!AN&F +R O[ӝz?+71nObcŁ49*!X4pX?fmMc @uu)mx}zI5p>'U4wfM\rE6t* @UVcjGw19ap$7fyI2 Gn25¿dLQ K. ԌFSBqٟ*|ҷk$[MZY1 Ss$t\m{e.36>W!#f;.aX*F)p ctZa}LM_]n.HGXDka$,nTelU(pVRnbH!9 >W4K3ɰMx%f.EӛuRaYE . Tt jiycDXjqHuKgKDd%*ʱ5&0c a1=DƗyFbP;zT+MJh7\t81:nPk|70nKCTb|p#%9lmCݭ< b&1S.Yhr tXJP2뢸MV r^I#R LXg)VvUȰI;MHE4u`Р@`E LHqBK.в&ۗ!tZ!X}c nMl )nP@2V~bRs5pۃ !,d92Bz1蒣UR$ ka93bND8_r tAR9h(V [bO-OM3=k5;/&+4B?LC3Wj+^ú +}՟|?N5 (D 21=m8)]9.d#Є&ՠ_|l!gHKt5TJk[۬/o\NC~,ːbxNK0ArVʄ9,iڼgZ!:\qbPIQ oW6[g7nKHCՄ-~H9{iA$PN8{iu/M V;0,I"f떽+ΠK9ޅK-kr^Y& h *HB_ML .FQTRWXMOI[.37 %&q#Lv (7D*;)&XPE,J & P3]bq.@Cy zK =JP׉^]6"4Vw<pxl`,,.*ʐ˚,JS7uEդto@gjYd£) WEi\ӉdC>thP 'B9RoAq1-{5s|499úyXMe=8 kb{}jYNQa)1%ehR?_N 1\)zHC# :ۿ, X=M.&Ha}(6ߋ=Eoçl=:|ʪ*;nO7h*"(MQ9,$vv~;K]fl*x J8&|RC|ٽ ܰ%Bug嬩YmZ>mq<$\kH!8 rD.+6HWj zNoǮ̌w?z!}x}/{G!z?M{?U[rAAU%> myW<i)QI'dDeUlzJ뵗3;y6$#OwIE˸>kPb]hJ cESJ7S%$AzSۭ̓]z/*')N_O3hhM0,N:ֻx[g{l?䳱CܹbN=DyK~ȟ6c5?BrLvsի3X/˛SMX!=g Ecy 1TS[DTsE<eYX $2(#1tWc:uqQGAۂ 2X`׀b+lR}J\DuwXƜ[ ((4Y<8qG)͕c@N\Ƶ]4F+s֬>{SfEm;!X?ǃ0 sRR,={uUZ(ʶf*7cJ P7yniwkYgnTv[fŦL1}ڞ(Z7/N/Q]s]H 8AsΜ 09іMis-:,cL#2-+7^ɂcYdmvtzmmQsg r|Lޡmz؉z63A5E#": )4!Fǖr~ %`}.$Q"DӅd IS.4Z_G8LrV f=-,a!zp,(as ,bZ)%x-^θc݀q_ݿy-4pX%T dTrV^|_UB{<9g&ByCjNmf}QYc` n2z.\H Y|YR3y#Yc\krP28L:jemVq>_uTN84B#d.53a .rwNmjujͰĂ@8{B:;E5Uj^/ "jNCY2ʅ7Oj<+CqPjAFg ;YO7\oź~dЊ0s4, (j>'e MwpE gc&# (-!\x=O|n"0'64j%JI"/HψrbMYqB yҶT,7 ivѿ,#'!OsVq)'( S ˑl'a^ڜvQ)luӣknXTL+}1i"c\SuCםλ[CǼҤ;ٿwD/6]-/A=0 #;KMӣw톑 WL؉a뷓+nqOPM -XАZ$7 q6o;jW%h\8.h4.*^Qǯ53Dc{+e%pYnBlbbZCsӟHb @)8fin!fW5KRqݻT+k#˫Scy h=WhStE1aB\7%m][{@Vaƀ%߹Kuĝq.&ڮfG] @F6lCyȟZJ3ȗ͗ƨЄӗMҭe6bL5z\Z=[1kt\DgR)tM'=Wn2;*G7+Z0[J-?|'lW [+%#X/Ȝ=jnJ]01 o}.]^>)ODCy|pT-Z3B9XN4Z5 Ў1A"Jt"ŪL(9 P0IfFG[R)Sɰ)ٗsK7m<;ꈐO hlJ d GGTY4x 8ə%XKŤ;r,Y[KNN+jr}+gB)oÌ۷KqI,e&1 * {⾢ZHoĩXu(T|j <"#oȕ]QB }C'A}I}{vÖ<v]px'y'$9![;J}k$;6;K_uųJDIGMJ ߳W(aXMg硂` OxmItj)*ݎϴCn(q16vYFR8_Ӈ`7ӀSl%;7]QZԥDjjW1hh aa;hB֔45'ptSbY:\VTp:dEԛ5b}ݴ/$GDa0Ұ 4lSJo:!,ǚ=./ [ʙH^-;G 4sw:^OaT>kl'ìXRXD]`[zu/p3{2%?d6֬;^)*$V3r!pe#cv̇q*^;e_ ђJf(.xϤb SA(x;aN~w(~m\͒<{w5ܥ=.\99աty08#دYYV1:-k>oYnvfqOdjK̵X0.h~AxF#ݳ!_eUl{JyBZ?O's$Taa6W eVL~ 4^88V]YR&Ò 84KཀྵS?#!%pNc5lmJ &PuRQY$C c1Rq..naoIk={}7]ԧKdj^?+/Vް%a_m.^H+(^ҽWEן􅏔$\bEJaLЖd͐m[/V|reD*PH X3->vS:®;.YsmA#@qM4uusMV_3o+~ip·Oɾ*@9eX⁊l s°Į@1  uk Q*a}޻"B} ;舸ں}η}4luEܨ!l_'ݝp4*±w)ő[.FEXܹ ZCm2WF_p7uhObOۏ]RJ?ev}-s:TTm>=WV,fz~wJ,ִ,cC-"Ǫ_f(VsΥAHI؀+!X  vTC`Bn2/,,IK{r8#DzgwKRhwk"+JzX$. WyER,oӰS e0jy(uS~u~Quˎ$E)qԺ״d </\̄2}5M)Ϲ\>rܓZE)>`w)dI,:{p=ۻy(!> !jj/$muBRPewVJڕsHPl%swA!ҿTJyj85+ʬMaR4p|XVwnt!qyn˺ݜ:WQJ8\p[]Qhi4f=seߟ87/ΟZӡy<iO\&?$Us:>H hq>t{+{X\f(^NԭM֘wTP2]=0 u"?)h_AM̉%B BOgJ _!nƠ7tNqx~5Krg#"\ 0c |\Px$迋.QW 2:7M(R7%knI,E@e*&JT̹ʩ yywav} }eoKXX`a ,HXEEsԲpQ\| FL*t&M@iRMh](cjdˢΔgDcҰ~I3;njj`2?FP ZI?fnƓ՗o@ʷ cy;7m #pt4نt/i E(Pri7{$9CoG/mWGe-A祚O.&ط&påCovGgZ{#dMgB3J%ӎI*׾V.KY|dyTXVp!J7.fb>a;xiVƦd o聨`Ez.CU:M0(ǔ2k =uxUoDrnmg󳱶DFޚ%٦eoׇlg{W4HV&Ae JSت\e) vSZC^G2=,<r/ܭrUfC% N6hApA@F0x}rW.9^s6L u}V8Qu[wSq}JzK"!WMИ׹A+x(,&O|ca6W3މ#W[ n5 gS*<U=kK̶.N:)۟>'bU:o[n*Vɰ B{Ѕ/jB7n0È%A( I ѐZn5k툊7+se.JGtsꟳ #AA#&amh" ja<1x<[}9tZh*-ٰ69OUgp^6#;uk ˌ:Gr6,lSiqsrZ(RQw`׎BАY ' %3fiuVO4kdWUZ'LbiMFkHolR(a1gG&o4ۧ{kmY٩"eFKx tR%w`PހsYX1 nJU/+ݱ1>k˕Z/f#ۼ[uWq ׆ R7[ w3Jl #wqAǵtL*z,ȭ Z Qg,VP艝`rmc㈯x%SE jݯ74ҰTT_Kހ[_e@r ]#nX</_e!l1"S']'Ykm s^_Hg}'MɪXv X~TI s$ \l*cC2%!aE*;0'}[sW}-nRR. by]qyFKxߟ C/{y"j4a2P426r@z5Iˇl/tu1[8JS[Qհ%;6Vj32@jR=A.BtwF<_e?@x&/1h]c.dl PIRaOrVZRUnRS0<|aM^.?7?{.B֫u?/1 şQ4go݃쳽'ڼ[jbof?o߼.H^3ϚkB.??/g_?eZCbi|,+>Wj/_Pqu_$..*?[?W]l.]쟲 \?>'?O/S>k\KZi {(wu*_T>yo.@xg_ȟ|u56V˻^ܗ:{?5k??}m_>?|~|Ú} uN`__G_IU~&κ]O0s-꬟_|o^GOez<?>NSKݩPV#}C5g&?lnnOqX~ooGLgD_[ׯ'[k~&|ݷ_񇷪M}ϖND__͏׿WoE'/b<*g'?_҇;?y~yRʿ }P,|71Zş|SM?]JN ?qU'.J7?5<>٪/s=K?`\JbNN%}mۯ)U~_03j/7?X%X>9t\oo_s~AG=X3k>{_ $>7Fk.߽z懟2zs(/p#?3gy' #yy>w}ix[~nۯo~U}U_x^G|eپ뽪uzGKk/ׯrOXGSezw)=/Ц6͆w]C]_bu}`_>{:s=6\6^o~D&qr)뷏*~ T?JW>{e0+ؒE͇kV__ޅoHG C vyUp?n?_K>N[zs>.+~W?R6](6*/~V!.R~j ~s#Z>|a[F߾gIIu?}w yV~QU?_>ouHG=]o굀?=׮% /Bf7?}7ZKW~ɷa-URؙӯ:ӑ9{yQBzyO@g_Qϒc_fuĨmY{M坖HڼSܻ Ui3rf45}/μ>G w)-+3/LudF~?R-?ju$iQ+Mzܴ/NqdW2s~ԗV'}H#X/34H}W/>ח^ɿ~7շOku_C?ey>_,t~W[n||sE߉~SQN~{Doyxڥsnmw5#m\\ڙ jb^J\w}{LB(״]SST]~SuIWi߻|Kᦼߔ_n]6 =ʩjݶtzZ[.nj;NZ=" 7 P#"oj|vw;{F)FSDv[#iQ{t:P9ۤlܥnOw|mwHm(~Q"/}[k}PSL"-xM}Gޑ_ݨ?{NυuJU9*~Jw|uE)/kDDPOO15y4 68ʞ|6),Is': jC[Ж97)Wv2g!s%˝9aǕP2EP WBJ8 'BJ`Q*CM \ P9 >15}(A ϰ!o~?\4l|nM4m֨):Èס\93mI߃hWl^fy @tC\5pE9+MסQ+ptCuehwB26gDtD]-P&#MruyDs^6g.%UvECR5[T鴢!.{l8HJһ_R[ lˮ~JN2ջZSM} 4UYTo}ZTG@{_&^ +SlØ)IեD>Y0wfRAiA&Qd^ 'C1 \ 볞1X1 ~jOIޗaqwPs)\y\V g aWr]_`77*C'oPf1?Nȭ~WEɶa8CXeO vH/zfQ@:WK57 ɣ92sm)0 [:> dgj..%Vbc e7C;֢رI,ŷaʒ厭L#ʐ:D]|J0E`}G. uPQK^퉺>a=:TAh:$bח 4vg .:0M y"6?w:X[)HP)2\' oB(w T )k?T@@Q=TK['ykW!| &w:gsnN+,@K`@lqctyE7N397x˭ON[b-X@~^d2L2JStt$r1xܖt^MHj8W:}a#&qJfIU4&)HO~HR卑4Di R"F5A&q3ҕkӪg^/X G,қWU^UGr*e2u`ݢur(nq8gISk3?Q Ck+g3P50\Y+ j/wGm%sY]J:yHq0)hbьZ#SO+̤>ynfZ6IB? *W߀Qo{Գsh͠VvD3e-7D 2 o;' BwZl!A:@sGB}yUikH'Ay2iZG+ۀƏN><4ƽ"8&ZT#Y:W\oҩnLmQv/q@kOwχv hJYu(kέQNt=Ԓ{֠t|?\# K>Fd vƍ?,TA-S,%,2Z3 (C|D `*"Xcb|Və) QBT_0ml3/Jw3I*#8]ZK]!bS [rF^+`\p,DŽSq: ^]6vlQe ^98v-懕1WWZ'onk41@#Xnz1 Z&q K@~Ƴ`e0[$}E(kSMwgt ?? ޓ^x/)9(2 lTpPV'IaTaKa;3%rȗ8M;G+`O$b(qe$2g9M4/!yO_ԭTɱ..,(\"ލ35ہvr~g-O7&皏AUʰ[ec" s5D@\u@@#bUL&DZRǖ :m'TC*ق OZoj}qp{`ډD]3^~`ճKB6. U#hQMbyЋK8&eg"hz_&yb{3qL  x ; qăh}ڥ8/=m+^ Oʁۣx/YWK xgE9pBR yx}Lj뼗f םRxd1.VbB-I,"2 $6,T6gxz 0F$[$[D'ጤ5+X$O4%:˜f C2l9C 8Rl^M;6o%pkΆ| 86LĞt3{?_W G-@T(IYPSțʒ6\ %.S ‘Qdp(o0nyZյPWMm/*ΠyhQ)[QLQ.? yB]3Ǹ;l8eqWt 4&M#sXFćt1e迅:Q-bG)Q,nMk$o\䕳3oɵe-tc=GO,f؉IR|[$%. M Z, Q)k4Tqv{!($5"#>vpc4 JGrZ?bRurqLeu(_Q0j֩&}' FN{vȑE%"~Hd@FMvFiH"i~Wu@!޼U:1+-sb .+X;؛WTTwPܾqu8gq֐*\s~-خQ.4\GZP\2:+FJIZ3,7Wm{׳vζ=h |I6D_c^mrxtaO4JBYL|eø܉1/d?^l_PB@bA[2#<$SƑ#Aw2%*Φ0BT]Ώ3&Ƕ2"GTB&PJPgōsCm#'!NaX`8\}4S3L☹N5jmE.3Ao?^#2'&n] :TݏIfn.! ZjO~& t1, 0* 7tPm\-#.ɵq"suٸz0qCA',qLl\QsqF<9h9RKc#\>H9IF$.9exHi(virpJ̜݉ѼTdXյkW/|mXE&>8CZ8ˁudƦAAlqVg9C^ڴ]B6E A2ɷQ s0G.#)Sxi=>t|-!3\Lx+ОmO1ňw!U[Pg3^WIM^$6$籝i@D_B -9)"n'|&ƃiƉq\s;s 62bFAm)X%VA$I^Cz>}w.5c y\CLi{&A T\`^WVAf*Z2Q>@vY76+SX%סRD&)6 [N|PlELXn"UTA?Gs0i-W;&EmE]pa|@İsqM͸IRϦ댵Ss5i+Jl{4,өi+H_ `o$4-O_ERs`̱yIQ"4bA-\J3Ÿ,g:cx:;&єMe"EGrh3Lc󎆗 \l`:-qK~ ur,B)r|gİk# ;6rv2?]Tf$/T:G3\~(&s^.kEI1#xFmk3$x^C"Kr |A.Hjg)Cƪ( R0cFL9C$ lk:0棢6 ?l~*Ըl#vbpn.ĭoi%VTt9CKIfZ-9bnfD]KzTjx` aaˆet6Y$0h/UװC]Ž^7L#ɞ`)iW2 jFKba3NW BٮZUzQRE{:\D%baC#<(`!|umZ1 xZ7"κRC/ZU/D=Ԅ:S.ld7U@]M/R:uaS$Q*(IĒw ~ w%>Hx„WlqFd!!yϒ׏?.dW{ s50)9EN,EmCCtBZC-Ztì2.^{D8/h\ƱnaUَ-.6܀$/+8q^$O'>`*%"$_]ܴ͞||%;AYwoQj;W>%4WaU0Ԩifi1]"ST{Fv7<5c#p ƩoGcO;ڻB9)HM] &6ǜ)~d%lJRFh'sRʹ Gr9h$`L!(sK˓ 37J&:%1k2I<M SfQ\gG!n +"kUP ށ[<;5 T3;٤«ůnZ. %g "ۣ|H#mbM~N*wX'UW>C+ !>'>)nK$R*:]CkiqrD~Fؓ 35 iP.o,.ԵEH`t 'B`ĝP7 YlE&~ TbUK1Pc蔠4-F0h2pS0e.3,ܢ%Tz=)v7cȕ> T,Ң0+všְMؤ'1vR 8XHpH`ت1@&X +z@s8%)lbxkDR(tش}XDn}H'I)|ӦLX )V~ͻ rOQ ?C,пJLUR.3g[,6I-T"1Vz%Mh 9Oؼw8 +=@c-Pa u TMTvyww{cr 8qP M>7`%q=ޛά*i5DppcgŊϨ0̝xfΫr5 )28IesQ8+WivSw&(nSME'وʎw 3Gե%z]UsWxW)nDqp0#b|,w2?CcUtHo:J7&sY80Kqj,uZCIb CHğ5_+v*D`$!;\D؇*A݌e䜒t0;nLX5M+KnҐ&Ixxapӝ!͌xݕ{ ZjdMJ E}*ekZilMhm7]08,i""!M崖 5:J W9/A{ pq4]n0SXAS)\E]ճV*hLL~]\[Qٿ+pmӘ 2_21.j+Τv xu>z!r$8 *Nʙ'ۇad`0 /@pGbhLV!&?1Go9+ZK'\e9\Xl=G0lY.'6Ga׸aW [bxLJkC }O(tkD#n^ L=͖T(m[^F?&97Ailo+Dmj:_b5b. D.Eilq8prwp2+'opYuK$Q_ȾC+k{f_sꖢ #f w0u.f&ŨL48zS_X73vD|Ħ +bOFQ1Fbae+Iԥ~I-L P+QP;gT">R"[pM*U n0p"4m< Gh"-|lQ2{C$bǽRrPĠ:w֣aFG) E<Xb$wnbzkGoJe&vIΒ6¹R{<$qӖ3&Ƙ)FV)mc [%~0{QBPClIyĵ f})[S%ֿ#OM8Dꣵb o?cjaj[ta *Jm5a*NqqcLzĻ +sl8l9K+B6l8HY4.d_lyh}:%W됩f9B̏a0"OD-m̫8[A5 奋&_$WZ✛=IL>1&oaSa/O{Cob5L;mA}tлcu4-٢J%xb ŗSlHK-LAEje;cǔTzP sp璵``"4sLvMzzgAzU SW|Nvu"ԙeP Mn%kyG-h8~JX2" Pr%gS])۹ _;)֦(A&èFZ'HxPoa<東 ; Eɿd;צ0 O9iiHi|(s3Bn5سr²q+8nX{ǂ=O~(Ł-C"n})hλsx\KpF';%vrXwhQvN9 WxuI޼=rc.Q1FPT}7YqIbG8$EH:lQY\xkDU P* IH!ݪTk Ppf8gRU2E7Mz[\ _\ ٓb撄]GA⡿CFC:aZA44;4͑dI j918@VETAؘAU:/>E45%eY.[.hUMFҽ hH*C 24aJ: OL颔tX H>TX5EZqEbks yT(\SE0cvbUV1E' jJ!IRU[:5'Uu?,u0)j>ZQsWGw} ۉUOtUɞֆp R]il!2MP$$SGrT9 vsPaqbaMJ7-_݃PX6alHk%`h%yȕ>t/eґɻNO&'(ʐX{[8FIhXz}OE(N]cҨ{:u41ۺ%6 ItMwwAQpye5 GvU,y Z,j5&^1[ kWLo?Z`70#UЯf XOYhH Y{ASܒ}TScn^'AgT^c(( VkةCֿPergn.&3^S8TZCV$jSWƺL!ݒY+&L%C-:PZc K0"QOKE"wkJܭEqP%jrn.Sdq(Ƹd _`{'Έj) 8Ygm8\$P&p^$ŭpm㴒n`Om %س;5:2﷥s!sp }ToI`;߉뾽^+>K\ h[s_#2܉D\sp F3tQAKIRg^)RJ[9wAN!gZUݜ됇xIܾ{J 93/1Iw'kpGSAFqB>W v*xEđĊ-6 #OL) ؏|߂3nZL٧>Pu9DBevj+ M{h#gPM9ݪMCRb,Dk|CƗ]ǰJTo ް"i\%2%Z8X}7uR*=Vʍt2>Ú-[h, hÍVngY/AQX`@-_Kb4_?H^vg&.F=$Mvk&+K8k<U 78\pϙA9jJu,4{A-xUiW!bɬ(/^⎏of0ILjSwKtaLEg;IGX ,Us}O}s"eq==PGMEݴY Z u) &5 Ie吰y%ytx(HXXsbA+= I~#+qq!O{5 b󩍷^h3uh_l%q8d7%"OLE F JRzE1K { 9db@,h-hO}3hrĵE%nTbAVb!ᆄ3*`U\q}#?4};t):"WC[rRrwpcρ޳ȕc u^𞰮 vN{ ␃1ֳ#hh@dOLl=0p30!U)}(#6<#Ξݨhװ[8눸G [ r+u3#0bh^/{zyp6ao b|/(TJSi$5t vݙbJ`-I%|a̪]u N?c&kєF;8Ū M<4cc*DEIc mPK|cH4-OcsH}Gh|l ڐX5)`jRQSʴTi_# jݠ !AݢY%c=Nuc`JȀ"Gp1u!ڨ[~~( =3ڳ5C,C°]qeA~P!9띰@W{\`WW-V'yHЍFKi ,Ǥh︛Zɽ{kg ((n(2V:8K!l)vTd4bhH@(kb0oԠ+V a@fT3.[GWQ+&/q NO҃!p靖!D;c#wc†9Q7 Ѫ.4͆]V1 9_"GK8 tr|F \=3 ^ORq`S~R@Q~4=%B68P3Xp;2.*f+qQg A?tx{obSG!TL2B38xw e`5JwkgZqCp fN&:Ek4+%R3=&&Cv2x3bH*8˭:c(d(|H)FU}D#q DݲZToJ;F$+]ܨyV.$I ;B5Ή${х8q4OU9spV)Pnf=D$4 J#iekI8%*%v~;(Kj&EtNn/2=x-8Ku #GFNfzT'҅qi0xOq[-'TAa9nqC&wGДI/e= #V|O>"ga(, a"⹅D|Q-jS(\| :$dD+q)mV\ {p]`-f5ݐ两BvQDX%gTm!#-%Vi BRxq;G(I%a[䌞IQ<eL(S״Gm"Lw0K2s{㡰M\)b;AR&o$+$uA2>x_;RUz)-&x%^"h?$LB(\4:<V)hoyf5U J @8HRإ@נ9TeLTۍe8NɕX Jp\I'AsI.g! ?pkG|L5z* kDgОhq;/H$:fZ.4e4 j& fIعQRbՂUto?|0 c)1ڗU“5MJmG5M6\smlJ/L>(GsF)6r28* ?^L͏+bB79@TG7lq1JBfF͇S\1 7.Y#iR&® ®k%>#zx#]bm4UFPA^n5,O@ f 4_a?ڦ?.I ?w_Lnꟙ|ȯ.h+/RU)&N+/4%ıxJs?`G*q*i>O9 NW$gPtE6RUVq:m[]4*gXNvdZ'W13Ap\ 8<7F=%7u"1vjB|5+^'ub^>s,aw s0NWgK=PtE1^>673Γ0aV.0-^d(BJ ?Z&,IъykUbU6o<~0 0 Y­{,BMz7+U&νV_kx *BCh1&7 crm6jP#,͒B-MxrX:- LIQž(zRڽXDB""pXFPEK;6Ю [E7)  J^(eSsL= TmGs: F ҟ?s?̵~}OeL&|(6y5&YF=S,N{jx y0Mq["Ka J$0= 0n09"`.ڳS֜X)^e^VWwTh}fU _݃b5,Ŏ%q AOBxɑI"d( N>6@ \ERR09j Z8P[q n$h(s![glqѢ$& b0D8 Bn+Q]'L 0}~ VnP`@0w!9m?Z^dgJWW_?6sJ OO+FK|`]piSq (as4ٍ9+) ^ 55'S(85c@&rnԢMW'[@F$n}7o$&88 bO2D\z2&z Wwm#xvvKm+>p$^1| a%"/"yNE},;['AE,ői  ag3̊U2 טB)١7GE< ;_e`6I0Vh-5_QK[>2 TR :K`Pr277w ?DH@;Ԛf),[QU"n/5&;Hء wL) ڵ?@+!rH!)D̈́ v(t3T.Kיۃ$窦KXY~s%D7@̼RbVӐIbHLx8N9J2Q80v/e)/0a°{\cyIi<8q?Ih0"bo:Sfd8;'G8dp /e !>| {(ɚpˌؔ$^7ыfхcN ',f:GSAHȃ i /R ZR. MKKHtt CD_"9KWHK\-pE޶5t8NQq VSoyA8^ ]zH'i@` 'p̀x «oB7YʢR^1y:%]-1Y,`6YuǮ.9@Th1L0/7ވ5PLz5 #P%_v{+ ؂&a5R pS]/b9`a)FzE83UȪg>" ʁPrϥOqvr7\NeϗO@0Ϥߨ1ih# G0^A.Ȁ!~ }{0Kpp+ĮƠ]-]ִc1# ;T2#ؖZp aZ%0N)m=Q6'7E$ EQ=ZY!S igر=)IEBY]h0R߈:7)bVtSј|?)p71?p&2.|hFԸgZYkO!3\9do[f0o40h.rbU: ԥ5iT9.us\ޗ"\9WVEj I~@LQKzkI>F~5L\M9LL F̰UxL%QTQ%z4 'ӔR%ĊᛜJak7EQRTԘ{Pјy4OQ1$ P> DhyA2)2$"qYR:)oGI~HRB8ِ %n Y$mp>_0*nx/3c캤#G1)jHU̔3PQ~v(jʛ*UQ*?P\*vIj[zns{34yn=iu 5l,-C>U7$4|kC_ ?ۉmyefbX'61EޱXyp R)/2圝ejq[?C0VUx`;:5ceIqX!(f%,Pm(v.n FQ88s54-쨑' K{/DV./) jÄjlcP 3TtCP:|A@KآAU4duqœ*^$i($gˈ_Y64M8_{.- ]]xx5 %Ě({pKQbH&}WƳ({>p #{4EMye[QcY(ֈpM|mbz,6MSܢk2OʞBjZyj^k=3)ln5?Pmr u4.q $c j$N|w-G]MXͲcAre'UjP^fPhVf;FعP"aLՆR=)k5䚱T*>Jj'O8^袷a,9z;֐͡K#9PA4$!~s]KkŴg91# Hmd'.,TעEcn1Zc0( h cLWāCNW7ڱy~T`V3T&yOW.)+~Ieʼ{4D0*qwiXɖkC}WT)'X4є?sP42)o]Xߴ9\՝NW( X`#"Tnxo;b䣨RqZYcU24G jшcm7/GK$W;9OP搽sT?`BL]2"EEHJzf9zfdPA$Z'H-vꠍp$ډ:K Pë]-F[?㉢\;qRRj6&o@أ 93:gQf+'G^w3S<Ǻlљ8fMZdž{3_4Ϳp$2ԙ%.>cËjBst Cϵˌoj jTE*:՝znoj+Nxpdqb|b=Tm7x9%&?Z;[#.0#3m"mK*945`#rMQ-.@lKr k!!Hv0x̺Ϲ(Me!Αm#%"58\SF_1e5pwTP(! jR%[ Xqr⨏2!e:y76qW:<$XGٰ;C({I"Un;TcvեAS.{QDLσHm7 ChriH?&mxjջrHrKGQ7%\U:|JMCwvީpl0k^/Aa,|b9mP̳ԏ╶YTEsz=<%Qc\dPDZ][jWrPoh=h0X4mlAO>lB.:R7+{ íŲ3OwxԄ:"rR&;SS|gLDZS [FiX ppzq>#QZbZZ/%F]2.Y :aކ7эXEz''BY|wF+#HŧvLr=R E8)7{ #њ a5fJVidq +Nb峂%p)ow#R%9nEh5F/U*1B!njîS K@ٔ& M#[w0WP;0gVBmp\ nV$rWp +3kSQG!D|W o[ti~qT(Z䷥U*=Gw$ghh:H7oWAW{S3li [>)LZZhяdwqh5aj(Jrl1%/-u0(ߎdz ONRpQdY=+ &Pg_wjGdmIʽ7(ܠd1B]Y-0AfzILL:] +Hꂚu sw[cv=W3~6nGkIQmR~s%CV$㰩i|@̻5@q 1m9iX+ y7>Urx` 얓"kSq$fěne s+dNWT/`t owq ?6g,Êأ5c[ԍc "j@z'C/r\sb*A{Xj *U5/2Z'7㕾}T ;0x䏕 =X;?S&nocnkZ5ёT(p5CW Vk%9اo SM 1 KNsZטV^SsCIjH@3)Kȗ.],BT>m8dO(;$Fx4UyDqy5.0=% ' s.)rС;GcqGGK%~ 6yG˵["t鮹 )5ygݥUt^67,:$p2⣘BV~hNr>xvqqS5. &Emnd[S5u=ナrjF,i'vՉ@Kx0Tk-xU5nwru/՘4)'g.:TK}O9]ۯ$ܪđ}vݥD;\xQ/;.54|%a<)iƲa_1 uFȀ $=r ˠ7We^jU@  \r qDZ8Z2dJ!{fGJ^e''ߙ@Ђᕏ0zhp~cAaTB ;e2 *i}ew)NC.wv%6KPJNϩ 6SJ_Vܱ?,Wf}̍ϗPQ3()Zy:UNT>߸rq|kAf HR UAj8 Y0AS)mr8*2j ZFG)Ah)h15j6Ū>c UQyx33=ܥ2΢}Qr<:=M%)%1Q/4R"f)nMʎeU%1)GcHEXR.[UؔR^?ҊEk0^Pq\.QYE;:xYZkNrA_2RaJ9 :wGAA?LƓKpv38 ZO|oB 8(qҔ^԰vi7VR)j̀gx2Mk@* J\UimaJ6|Zhc&.!(hia%I 51o|5W5VC~~]zlD86"!ױq%ãg~lnOtj8QFZE e4&f@0Ո+Ws[R|ޕV(IӪNDw#3~Pƞ.+đ{eZG!Qb]bSI Q#WlsJ+p:.!h )H/Uw 7+in_^|| ] l;âYMi~;KFSws0i4R2:,#"ECƩ wZStrkW Ao2 kDzA3'ҁ2!j@Xf4o--bB #>G!6VEZ2n<Ҙccï)^nHfWn/DizB^f(=T] KqER|݃hy4@LR^*Om;CJ#šT-0$e?B rPt;W ҤO- \#u܅90SˤG0abk'A,.,MlwxyvMYjGj5܈џR?JOyd`b,v=(Yi-"#b<%|[V;0aX;gnh+,Zsi58%eqIVB>D;'Nh)َtӼ. tk(0r T2]:/K֒`4fR7ńY ab5R{?V4A}:.\\bn2ռd yr}eD6뷘$ɩxpQbKF%^JX=SXbMaA%N8k l fݞ5Ahw|֤~di)6̧ {G[Ս՗s[(Gn8 e=*6* RtS=űX}0X 9ߐqLۺ'M.NԃZrq@z'U+G2%%(dni!KnGެcI,NXZS kg꾛3/\>/A0Jw{Ψڬ뇂6qI㚍L6Ƈ:W=RGRT8emW5 B!ִ(!br*jZ# *$H^' *VznX.Mޚ}|+/,g:XQ<{) {j ib"LSndfB:Sjs8bQ,h?;JO-j}z@E0-ĜaΓy m4¤& YM aT\kaŇ9!q)ich.[>m A6u&Qt %PAtQVYCT q61l5c6<'x羑U%3G7ʒڙS!1i#L\eQkƹy_1\w("usNc߃$:=^QCܤylKܱR ,B{q.ʢH#_ eyʸP-헋&i4p-kfXmM%7ވHӵ,ЕYCȴ.3wnec Y!?4ж.e%C!URoUy,Xs ~1cC4dP/Xnk w[nz2Ay +:aH_RA& 8xkK]c_cW%q(#r x$6N';|ǾƢKa-T`s9 *Ii?Z0N%2xvC0y;V'xa&bwU|Zzjk?^@;û.aZ{r7MqO=q(K#%߿#|]<$ł4qQfɺ kX]*|Ic)ʍG|͑(ga1綾rKfuT)Z.f^y/b;ha`L@Dr=D.;]nd7윁$u)qb1Qe=I4T06FұP4@aihe殬¡”R3atPJ$}i9QF;ol UGC@J;[>yLqŐ"ۻŰp r& zp7Sc+DI&̴.(w 7&X0ghbQ\'_ 4h%l ;{Gн)z*pk(٢bഏ1I5wP7*MăTB "xZ}g F)'c|b@1>C^V!ܹcRrkra,ih^O%2-+g,,gC =>u9X*&< #3ʤ 22+i95#f(Y#ރ(uw:f$Gu4#kQ 6PnA|fO @UV;!Yx_-}ɜehX\@Mc稳,|a||ݲaY( ~iR-T&Y\[~w,c>[Aub1]5j9+u͖@k;2z"=GME<=S54~*ϻ]dG*ly裤 iH4S]J<Ԥad{H(c>JEz"T2sHl@mTP:NPUY2 >B;# 7>hhbn2wrư~vx yvև[˹y3AH,)4ݝ]_g%(WjtRW~V 8θHRaά[Kڙj9d ڪz<3/4ԝH]5XT5+7w~g@2@ Vđt̃ ]@dDU,w1>r. CA-teq>(wY,8RyZ//koha1G=Z1(E=`azNsqӍMw`sH2@ oMx<:(BB~( b,*`%6e/X=C A3ןHxvܬk^CjMN'ݙ"_S<![[U@d) ܨOrُ$80` j O+$0RB )TܲTj w}rQ1xR ٌEOɱjlX2L6,/}ݤnntԴ_U1qT n{ xW~9iDzy  XyUy{xX]Ic yli'*}6),5s Ⓖкa*=4$@FBsIE{hX Rj>\{$pR^ ;zto}[1fDZp dx3^(c2⟼>ܭ>uOw^_AP&*/&ݞNۣN} _q4A2k)4 Tԭ[yF/jfFnnDzhbB^8Jqu.o\d9\SHrqi[IMpZiOooo)ls60_XU =A)V JcwcQ|ͽ qdrqz=il#p0j%WeI ;4yy㍕%mthʩM$Ӳnٔ~|0 x:BcekeQ5JmKD[R|K"-Vw ?A^p=ٳOL=g@2ݘqd|~9/r5IzF2t8ёsvQU崕 Q~".X5oi1Ǣ9pXdBNߝ';6T7/ViZw 7 !32;9APca{۹-܋^G7Z4|">2 9ԻwJUP2JVGxdb闠n|)P*5}uqd1ĕ[[Imw'.%8]Z֣ ,0[%Q($,~DxS&.ZͻC n rIByଶoۛ 68<,̣&<)eY(TСDL&U aYoңm/NK籴p5#K ʢVWň1iNCOAѫQcq=[2eN_{yQdPS.,aT8Lݗɝŵl n>S;I"z/ԌAy X|R.JK?j􄜷_8 [e,cqT2}h,)λy&sl8b1RTaX#ݙ䘚Oɷ8vM5-Ҏ1&(pJۭ3=\:qH^Ki;'x;=[%[ v^*v5ONb tq!<BR'ٯLXL%s FRY[_2I E$NRcE iOݺR̳`8#cYytV+v,0-evz p`㐫{,T~DvAwCC4PBֈ^udqByi[ A\X [-EŋGN`-Qrr *qzPʳpn AI/1-ŽtzEۣu^MA(Do@]xӢF@l"=Zǐ ģx'VBMR!la D S6kw>XLлWD>N'n'Ѱv;۽|r3o1!j"nXzvnx4 e~XkiV)eI Ϩ}o~Vu?Gi45Ս>RXk1YD(~ⴇT4,Y`iecmni;RMiXh zKo\,b<ˈ~"X^leuQ!Y6tJ2e}O!Zp" q|_UP$ vzln8J@I1ĊE7"O"qi-wGv;i۴l$);*z KK54._(dEMuj;`Fփ,#?(o}&mGg{wA'guɁ3G'y,uiǶ8lO]Zx aC4nUy֓Z]AS5Fjiiь݇T;cE\Z[/ g~d~azl)Y-@aYu5KO`u͚KL;󭍶J+0| ^ojh҈USZqĽ 6uY㱠TȎ䚺m#)'˕LVKE*Ǐ5(  #s㣣 WzT :J F8-QeN[AF>~y(i~_܆O M)h9H>VlrM6zkfŒ KM) Jz,oRׯz!愫Xb{w/ =JW{FǞrZ|"FޞĪ_b$`z1oCXbnΠcEX ^8ŠR 4QdJ~mB+:^iKL`/^S!hڇ(WN XUű8cY‹ݻcuBiɩwq;uUBh]8px5g{^lyO*be  iVҚ.d8-i P WZ'Æ&Bȹr:fW˯4U 2$bLDHyhZ(la/Z~' /2jҖu6J[K"/-n8,ebښ+ yO+iVsOKTT šѪòTS,R6ݬZIl+yC \4tx K3;kvx[G{^:8~" jPdGɪU\CH!'=D%*@Ȟݵ$PڋnH#Sӓd3D3/A R8^* jٖޕҐEz*FSOPm@GݦǷ BݖTgC,Rs,OTB^B& Upe ܆2`cs7[[խj=[}iZ\hm}`[Sݪot(_ԽłOSp۪vwjE+KܙO:Wf) `LRU7 t}4F?brzEU X07k{!aQ=접_@Bd_Wݩ6R8z"D+knD(w-)xZ t# 谽ⴕymX] <#Jij'ps,ˡ1t Ƌըw(aV,P=Q*tDO"^pGl1*͜Q曣A;'GB@H<r4c03ĮIªי7R j KiknrɌKLķS>Vv +X]` ERLr,(8 `lL+eRfՊ ,F:aB^ę¡%3ًoڃjNy Cgl XHn@4J1wD*Jc@S~:_6Nu

CAy9`1$}j*\o%,>0ZJDTm*+r_}?PXTn֞C%!;࢟c4!{bTIuaThw@Ҵş[wNUyKk31e c) MD!Qs@6!ƒ/&iKo#|>?9$6D'ȯ"s<1͕8R8 Z®RJ3>StCF3~Vԙ:j3%Zwg#W>D.$gRo"^1)3Ɩ3EZSp(ekeuf`98vKhoۂFM9n҈(͞q00.MV䉛G dD@+*^Y-v4Ѫy[)⨝)d$Nɓ=HDsr[æ)pxlU+W}P qdw-?ܿ?_{G{_Xq'sz f q^P?{ HSj7Tl6<՚_`tK܆QbYT=rRr:JGݤ=#Ef ( Jj-%!LF~PNb/n)5f}Ga@k zwoGMs'Ҽ"'ţT 5A>peD֌ i'f!ogR =&M kq\HyOZIvރW&`Pnu敺5D |P\= EqrKǮb!Pž,. Jw345^Z@bVM"qiE`%]@uEM>`k,/[%mXa3%!T!G `VϜ^J1W;rN)~*>ZMa<|i3Mx歷e5~zc~;QcxG>4T[]D\l]@MiSfDJ%&<%n^qndBEvKtZMpYNw=q^mA+c Dl[XD6pkiZ*Wf6̳M/+Gt#3b2\]@2'ң-*S@\ڹۿ"`25_\ʤ85J^&k84ۃ9JTlWB`xs}̳,d]a~Z ̋ lT9<4CrM,0Gш<^Ɠ)hKmp9y@}ccpvNW*rͣ@f!C{rd 0d\J,gqCY]wٓVAk9iGVó4)':$ I1P)زhP3anGݨw=CۈCie\3_9 5Y!pH̰L8*֏vAT m 3J<[ˊ;DeYVGyNzu܆Q'޿J:V`QU|'Þs~jrYXsMlVѕDUmCǾOtG־8yv\w?ݏNb=ր/?qaYJh{G▽!vriNC5>FkYWPt:Hٟ,V@`7lӑcX䒥c"}E:thKxWX.ꈡERu?)GiU5xÃY `z`iMvmO*ꄌġn qAw}{ds@W+UU;euxMaōxZ9VT4K&Mlڿ4RJ"dIhw&bw+B,-O^Z$ lZ^҅!}qG2foNk[:Va0u3('JED1铷{>#=*-"3qa Og}بT 7 kl)|n@3,ҳm8^&ºыiOj]nQxXo0/f7GP*R*JaT|bJn2r^"}ܪ#mP8-.EeJ ;vI.շ㱈^p \-m6.bQ`ɳjU3=l;0`I@85F @lΛ=xRRgc 4!,g(pS=Atl`2\ě͠b45rX%){-5b{: T<+8qPIxh S!{n<+ȇnVo f,]qm =Aӡga'htqx@oUpnR \M2[4-'+eh 1nyaseL;s9xU\BWGft]x̕Y  ]6wPǾAFn`d-@,ȨIJತtO(e"8x7NT$xj jQ ~_  (&A"'۷/Z}}2|y}QniRm sZ T!'b5T( Z߃,`.Z,w9g/no pѫ5n?s$FhUKƢb-m(0IY~G!ԠNC:^Ol]&ƠMJlY=Z~`ҢN j0ehg(g޿[] nF(Y~s @m^qcaAռZ՜R-LESpٷy*pۃs\ [p78hXmr4\K_x!Tbeq}Hol%bal|[;|g0zZ 3Ӝʣmb/Xk2yc^e 7{,yrxJҨFˢ[> R!,gds9}oY94ػ ^ 3ԀNrah|O}\<:m"eaƌBfAR@o*H|{bQ+XaOZPT(9Tk8U⳩ԍ0ώ(x bZK@OmIべvhJ>)PnxY̲^'@j5MTi#R_N'r*Wh&2LZ(= d1h,Ń-+vQM8w+3OH> 6+jxPy.{ 絰כ'@n3fIY{eY{m^S"V躒N'ͤ6C;v.U!ώ² -u˓;GyTUi97FpBX)?t#YY mgUn\5ۛiPP']- -ukM?곳9$Zf;Dǣql ` 1o\UJkX /K')wI0~bQ078 bfAM5 4 Ӓ<umM̴/˫Ʃ*hh(Ǩ䛚p<_5M_J :PÈӈeP诛$ y E u SsTZ9N Z0\5Oe<j Se&p} 5'%2(G*Tc@" q[G[PF|m克@m^S<}{j5'baݢo҉qU"I!^8hdzS )kpyFX+£_?6L?ELTƸMsxtyӓ&VK ( hmMNwy92EQ6it4Ta(%Bcda\,L6PTS3ҟQewѲXJdƣUZ.v[nLP55岗|؏~<߱z8دa/ʭPXܵ;N5%i_&揖6fcd\>F@C;{kd=51!LhMb.z#O.}>456U̍EmTIG}dyEHa9B` S.--oA4sx9N\Zkw<Mp 3} w  vzݚ oH_op~*]X]奵<^]r %i{QB &[\a("S tq :Z#ý!Oo}E։G%l!# Qp6,~ iJ1e_iDJ {c'0J{&UjDI '_3ݳvݸy&Q1^LE'ZlW$") kD+ #[3ZFG+eOI"7@jm ~VXhPuvDVME+CdWx.Dkor%4]1?FJS]bZ#?4+"EPzG!"9xeexi=MWj$eϸ$-A܎0AE}nþKk;AGRC7wf5b 7iin[w 4c^E%w^/nMv[Y1~bb6on_X:>A ߊ~[z>``AY$ݒ3QP&r #hOYB|7t]CA(yUmn"q6 E MM~es {/7,z(N*T٤K?tC _c&cY0D+}R`8}%|qsF^BɹVx$K{$vg #r *uF@- %^kp.4D[\jp2p eC3G8ʴJu>]A.`aAY.5đrMۂ R-̓"5K#PrQm^Kw{&a(l*/h܊뤙s}ɒþ :J\-@'K#@ TaYq9ZK\v8ۥى=ѽok%k[Ot/\VmPw1ՓM,/izV,͔ b7' WѲ!;G!kl#=+w\{,r\ę3-0 MhŁkπ] 9|C|Ӯ-CLw%hZgQv-[]5|;nrdY0Lz4N s" EfVR-B d&:w>^fɖ|శX#:|6w=*&xX\):. cޟWw4w{ganwq`ǻ<]3TrqPC|ȁjJM7εQ :pIy~>: |k^hJiy% WK"yw\yzt>6bYBOzK۱@S'< *M`eF«R'tKC")Ãۂ5,聉w&Y"ywa[ϓڷc,pi4i49mz XX`CB褆[/j|H1])Ǿműj"PKoqk\Zn|.zƶ'=qkETe3jV!5C>'l6JAGdmt-,I !hU ?vy2b'te_\Vs:o-xB$tܗ=E䝁gD-/zM K i|<;oAO(+lcd@\#IŢSmᜣ!_^޵J(u6قI)#ȓ4^ %B'P{ MB4ᝮoLL(Le=w{A[^W $XP$&IG5DMǟbje?ʀe`-w`e aBܹ EC€;GrGLuIUVhJCˤT~rwѿִeoE'/.m>lǂt>x{{$%<^n MZR [x8meN6%\XhQ$[;sFY@%T0׸iϴTYG Z+i#D(L۔,nYf:b˴tE83wX^ cib4菐}5>i1#DBVS0Ķ0erHd4 _* cM4k OEXrDŁzvzjCW'ۋ 'dLOlCDIw8xC[Kz[?<I^Ad⧍Nz!ZuZ@3Fov?fȅ^bP5t ˲erLXWsVt2(\ =~o xx RĐdSu#f|{]ޅ]A0PZ\Q`)k!7"􈖶x/Di"o *Y8D޸֔/s͚u/28M7Zq=;K 1GT feI&'n#˧Es$Jb1GkeËWol3&Đ eh|AOp:"UDM]ݚ`qigx}W Tɺ[m<Δ߶ͬBZ:չV͐cUtR\l=`fcu}oɡC cLY^6^fm0 U(XqG7KŠuzZ _6EҼ\+ڬDۨ'fwd[0}@"UQh8|W4fPbWD444aYiY͠n.%ʁ@C\gio1h,n/NY6vP0ey_|}^ ('2)҄-gNZiYᤵ Rn'WǮe#&O藨$lg~Idqd/,A]S0^љVC+G|&/XR0$Rcqĝ;io)l+J8qS pr[c͛Ai+r2v:ZOXS4r?ن::Ea?ۨio d0`97ʓ2wҙi%0IY70Г@IiY,/aޑh hQ\" meă}w"F1hiS&DZtym ]|+!#0e(4-4t:v{szq,ęŹV7%6 8Γ,3ݓ݆n~ օ$Tq' ݫn^݋WRHxl{!S^Ú/&Xu=CEW K_ I*71*X8@M$MjXdp,O4A%%^ˎ%@pCȺ߱B.l2YhϣnG@[,qin'ޠ|$nV`߽ϑ Xч3%+πHv߱iB"4ݧn L)AK7-G:!̷L. sH .N]}ܝ6~Ӛy<WZLAQ^ @Tx=JN"iW_^۱jHICJ3XD-1Pփ. 0sW]NANC(}](̈́Eq{ڛ\5b?7/!%:&Es\r;:Kn/1-= a8-??Dkh}pq,W'ߖS3 !<ŖK3NB UyO;%I6`{;MIoj~Wq&a2--WeCh7| xШz9;VK?bkb a֝Q{v!g q6[ [-l8^%qvgI>EP@3 (w0SsX V#5yV6p9(˺M|6;Q1/^#5iG mNlw,(%LZ}EFsOxInXl`w"e/ݞ?2ԄxpZm 3A14{UsuVt]{g-5)fQ=dI]^-~ąb>H wMwm;c_7Y_ڈĮdܸ\vLcld{TmUI*{-ˑpˑ(."7/ܥ%֘5cȃ_C} 4}1bt3[HB|p6flHi񲔀IxLoCXy+z"gnckS)oԗ-6NhJ\sM>),fṴfrS toPfogt@~(7&}I G<;I ɏ)R-<^ ܚRO/S="xiYrir9%{KW&k3qv5q2awVu 8χJЌPzϹ ҷnE>m'v0vh㝪APJSjg^A-F⚐9C1jA߶~xv%D}^PLlK_`JvZaHC( W#(4(Cqp f/RTj~8|ږRһrў4kMJ9o'_mfN{r.BƗ2`_Jq|7_1#.B ͒9NÿjdZ?qyIZ?f~m!tXq.]|s .1<!&qwQbGK ˓wLWtt26E3OϟZ>8!kHXv*q)g )2hZ)ǒ?ˇ*5{о'ܥxmșh?9nz^7KxJ_i}ҥ"%Ct,gyJfLWwbs#{)U>xkù.;;|fr:^S7\56Hw' =\zi& \rw0-^#`l]M5?EtIpZI𤮧|J-.U\,ƚ˻[먳ߡZR8 H~apU4Ayha%8Ѓm;[0XLrwPl\:kv2v]?F#`a+H]NktšE`Nè )#}O01wY( ĴKO}3E5&`=dfu?g51=\G]qxzB8I18IuzӉq%&u1r EdT ۭqSODZm琬"%?fQ©R9ĤqQRr?RΜWB3s9p r3?'ڦ9PPbWCNA>a$͝vz&±E{7 c%85Z{#WS}?sIe8Hc4i0/e݌5:|aIKB2J98նSz9Co?͓Cm5iC3XXMF"Ӽjq9!I;^0B:Sظ?.4 yEI it%i(7- g d5y6;\㬶-E=x q@MxaTB}7|ZG%,W y *wױ_ᄀjuNsJ P㌙5c *D,zjSE52$ LYz@E>ӐB)BVuR{f츗w ]3EʙWm\{{:/Ɲn$s)]b7 LJBjJvj-<|m@;΋sY{vӽ ;C2E&vopg\\ۺ]1L2,rPή^'7>M! 5hk~7?00y7W>g%qD2o^0Pmwe{o'Dn!2C(n]REYe vz+R)Wc&W;99Qao#`S Ԅڴ,0iBszSVvJHT3UQx;eF5Sij<cM|ޚ !w%QHZ5bMbVih !`V,zH+Z 5Skiv- iUɮ!PU`6mo(z+vOz$Xk]_ T T9Wf8CӂDN} sZ?ung &`' ǎ«?`#&ܤU#TC_'s_ >m3OZ;Y?0&@Eƞ'eޙd -)inn߿,DGyꄋaM#vT.D=n OЯX8 4wB-T^Z^b gX 8SHtZL@tӀ,4ORg) {*\b4gOCEԫIX Z+k] i#kpؐJQ?_K`-TCj%Nq:$)"+}DULWbUljđ91p񖄰% ^*}Ȓ$2E33-.%h:]YI!CsVLK(Ž;0)ۼdz j =6pE dơ>PWkE Q US,|2.7lADڟSʀuɭ8B<3H+==BM2(fBGU9'E,W6*<**5Uyj,&qSs4A~.o\3ԯe3XĴM$zjM+56NIXY5myOMih K,S.-c*YŐ ;x;LBq8r/b H"${ޫ.^܀&Gygѐ`t^N6VI g⪶Iolc| F!^X_Ic{JQM5*;K)(%#l}楹sA$FR̋q[eC-P4rCˮ [n!"b m|o 2NKJ 6<"UkD0in5񴎧;yJva2V[<6m5!Jh<4GQA]wɚwQBJ|btݻ|u~w5.W=gya[0Tj {.X-z5l;(=R4gɐ_4={FKL+9D I7<μ|aC_Nb[RݖOԧqq} mfI#24+) NK"׏OhH\Ĕvcl81bքؤj2 >QjUhPMIL@{@!^ 6Kѽ |^Ks_:LOx(Sh̩cb\k~_'I_4-Z 9Q p*EKi٧I6$~\g[R7)ɢ+E"B:{"dMJ뻕Egk䖦K|IhP=>4]& rhC [%S5ԬZS<@īu[X*)Z&sZU[MSNS=,_` ttb 晰qh}$`>5Ӵ8BXzۃ][;`^Sa2)XOHtATM վ&B·Q.]9p{%>a64°+A\V5#t$j4n"]ogFCM#x t/τ]R95lM7̧x4)7jjO&t%p(5P]s'D:}W>q_'^[VM*S1]ΐPR5OL a6a n_ ,w%vwT6 l+'? 5̈mM>’7ݜ Y/ږK5r-=* GA86=_LJ<ǵ= Oڂ^F8HsXF(^I6vWߢn})e_mC84V>WW<Ф$CʐP{z}ťCك( g6$ T%g^g]䙫QSq NMZTrSצ !5Ø,hҹs1ޫAD >Qt+xܥ1ד}pM5C\izN$h~  W.a]֏5OWy7Rr9?ݼ~IP;]\-!R U}[ .˂\S~ޣ?E\; #!] Lڤ^<씲S:aPPC-%4ܥnZ_& n)UǍ2GCxoYNԻ]Edǭ}Y|: ov/ϪS2%hJ2?DkWtuLZ-k'y iFe-x#ՔRdb-1+sHz>g<٘Kzŗ+_`K q@/TG%nAH\=tzg8@0.- @1jŔ\l8RFQԀx ' Ox|8$t&ȰE-VChq3x|Rr֖\P " ض0z[JR6ib#4Q3$Ci& hDHΊ?j:9t4Fg3G&.:TCF8D3CEnnHpCa^j!{)X>I[v;E!23|?>%;o·a.r0/z}lM(S-X6h%``Hp*.$QghqX}]=Ux2h4NâvAn5\<4 V7uB\N!@șRBL~tUIW!oJjgp} ۏ(hc@V-!MfSZV?Wf,|2+~)i{NV֚3Dx|}׏,H zQ9^y%JIA 4pD)_EOYͻvǣg<$xlu} +1 N)0aߛdyڴmTE>.&1{ E֚\p lqѴ0߫&2҄זvfW=Xa_[ib ]/wM)p(E5p #ؘ:zOSm,yPC ?c5衹aiţq 勓bcAJwp,9s4֗YHU}Ț ч}:aF,iٽImWmF8\Sb* m)a=X vh.Դ:^cL 1 ĸtPE[WUwQ̫۞.7GU8n綸wvo@!qSq^z.N@AyDg$N0Ű@ҠԴ[?arHa5\?EeHm~׆Y-I$$N1OSwtj4~b+Pjr3!0Tie]\򏞑1Lي'i1xHyG}ӽS]bneu 2|&M9++iw!'̸KS/NwxJrL#c_ IJ!-[N蚚 7RI4HhкDo4O9+x)8pK={Ss NfBD&XcQ'< {ј:mq_E\O&DWeڲcI9wx2USk]n0i֑U,c3W{lb:~P%ʝᴆCnumStY\ӁvH),iP+a#1eِy^tE{'[Bps fN t?XSp N:Ρ kҠ6m֙BԔxIfC\)mگ&S=Y븩aph >4mg\/EQ?d)w?M~T8% A2C>gVܕ}vgoۇ^ }ē_x8kñC̬b_BNک"mߔjJ(lye A(.ٻ.=d} t(ڨ|X2;Z^ȌǪH5$#,½x:b;Y#]Dt55#X&PTYꖵ^ulnS i𲁈cH XGgj!J'HCbm6g8EgdԢ]ljQ[̳e2|Rߖ_8dGacC 6Ք64JhJY%/)hzp Nzvp C-*V8BzB1&Ρ:uَװbL[7ܽ`SS CMI S-+ 5*Τm{2O;ȍpe[35xji4nu; c_ 5ʹ=(v7xa'K~XsPkVt6XҐ5ruhQuTK*9'y״~7 mR0,NrpvEip̡`c2-KІxyRv M?mFдhj ZQzZDи)f`lbC X.9BWi[dgmBw Rao]%6+:j"Rvۇ.GҍjSpYPpL:D/iviRHx]  4#2*fpw8PKYSjupjmqɇq5>+U6_qP/BgdX5lB,jɱ ]2fKRP6}$ڀ@ u:U±Wi!mphZ\I[rgLHDowp-.9i `SU}sҍUea}y)>ꪲ_Iή<6FpKa5mI1K@C1+Z5 S ejL͜>4P"uv)Ksci!?4pD7' o3^>TVpޮAcͫ*tdvd9p0 fɇń  od)] V=zG fzU÷i|| p%zN84(UcI݆MB*)0k945JZiE V>K(.bM+/V)I&$ M4pI3ո'khvrëPKG3O3k2f^xZy ٰe[%~ݯ-˕aeH\iD<{`4O[k0oCkfаӧ1˜R \h hs'ֻ݉'U/u=Vjc?.mev9*i)c FP:Бá5>8}#T4B$p9=A|.4hi M]L_+ho|4э씲`k{z?a]M}nMbZNg1dt.:jЈYG3R$C}F>N5XJbJ!Sg]B;3gaMmMc4^%cb  *|j$&4*UsK{i>ܤ*:+M8ݛp~$8kHCpWrhEYs]1kSrƵÚ_tڥN8$%jZϟ>gmƔ~iB =,7I{]z 9O3ljڽ3kh4^b_;ote5bR0N]Bs(w ҭr^<kV~}NA Zjԟ=Lg>ޟ1CK8N?`\:5G׊:L[IsW]FA s+wJ"cɯл;zL/F"\x{L>H ĶHa4xÆk#?>$nf?gE ? VYA7C=hﱆXr A16Rx5bq"#i LG05K3 /SyBCC[Th؃sЇ!}3Ԃ˂5x?iy=gk δ/,],myU.]AF*<$aѤz8IaY;f;B7G)!h+8`(0iFR޷Isleyܚ?, tRrjE&-pb3̋Q i=լ-uߵG·C3 \(vXn9qTڏ.&̥~mOmK*%S]fAҵ3jyŶk~>qQd JCVII&axJn ff~`!Cs=YQ Ď0qsxۘ4U1נ u.YZP\:[Y!f$ ӧ }¬/VE h@Ge'5 W2o.AZjj p[ZKҶ~Kn8T-7hl;V)mw ~T.Ю=EU{ˢfڎysE"k;qIjNbZ0ؘVDsOFZ)C?krgos$j;=_&\c\w$vĠ)]hw10py;CI ȧ@f ُ1 "9wx`ڄIrjDu,Rht][F~jكȞcΑGy%ը"zM6!~z.$G\DG^hЛWa mH'|!΂ pjPKo¸vEʻd%yY>II7piP&S NgUD\M"J$,SjI`-p0"{(]:rŢl@-N; %m5f>8iYRGb;ρ]Rf/q[#)EZh3%S v6n4Ny;B [. Pf 6SI{&NJLj ByÒ$#|Xpi#gBu.\V}pX>,4lir.::HX38P6ks&J 4WŰڕa=!AW=BCfI8Gi Vk><i-x 1wxtRy/t"L&!j/ض 5%"2yHّ9q" D H8Ҁt fY[l %THm"IdJٵ\C3³c 9YyuZ̮wkyf=Yd_ĝO9mx8qCػw`SSUXX '|>gM:D]>r_$ܦٔt쾿!^1CΫfM>k47G,b"SnNu|=ZN1y'=p *٭uZ֠hd.浽J<}/)=&pQXɬ**ЦajJzEgqwE4ZU{w IGs#ḟ uH>jx?WڲUACQ<=~ پsoI-sc2.JmKthx(!PnM^в>~h7XTޅffm~-_d + 5_(o0ɜ pC?z|`y[jDt84h,bR׼]ߕ鮫GqWhC\꒵u{诎tT`eϴ)g}d,1☦PPI\hu(I;%$,2]t! FdiI97KBy&ɹ\`<5XO*0M ݸ^nvYFZd!5@DLIwݞGfo1f'> }v~|fR^,t:wu?Q!(mLV+Z1 uմWo.$J?կ~d4ڮY`$a8^qad.' A-40 Pbe _~̗ sͨQշ;Fp15FyiͥAؓvjæBmi"}55{q,!.^=B.:BڻŮs&:\N󭫀Pb!ahdƤ[îKBy%sgbnOxPJ"W_k7 vQz+}h^G5j`K f'ߗ҉P_Kn;А`Xѻ˽|VIc B%1ˢzUxY7WiuSp8Tt.ԑZ7Gvt'z WnAJxL:FՓSm&!!7nM/|jQۅ4l+XNjkj U-7<?zP3mR4i}VƟ7sDwqަ1]ݛRTuä1s&YްSmVθcV\$eS= Ω5H:4ưZ4u>gn8^@TrlnZ_і5-H@i~#tmAo>~*!Z|G-8ڹ?cFhqI҂yH@ -هYyqqhD%c>`&.f腗!taQ97guglaEnN@-۝ &꿇P)7=*Ƥ>z'sa:FN7հVƶ5qԌu9ʪF ƣqܯO1̚$]=Blsa62~aLWg\i90~ɐ~d(2+Q'2naS"ac12aaas$V;ÎM M&qyEItBq:$Z D1tK$VX0~?p  'riGgQ]-7|gm=ؙ|*JW-X`xT~9O1>c4B~4 %eVkT̆8]v8&X%AB$9vVY BdvQ5 %$qz TSchL 6:ٟ64G?z$A]mŘNsc'.OkY}7d'j<Ե=}?$[fGdTP,&5wg%_QޝCxF7;,;jƼ ٭d٭7qgIۤf\& ؏s6n$vf3+9B]©T%8+?l>O|^I, ƃM[>xh6pRi#ĵk|8yXŪmu\UQ6M3Fp,G2v[ `aqcnDvoqr[0;&44A`ϸT>, W⦍Yў]LլWUdF(|b[O:V?v^.A0 BFE/{#yE; Fdp搴}a_5OzFEX}ZKrdh!NbNx㩹;5~bp *F/TOӕ VH2x\V5k'uCzdhbJ+OE?Lf_Pya{&NkM#ͽXnɡάHQdz$ii QI4M<}R W6:e /g]vrJ7؁]*KMnDMC4 Frk 쇠 LSI`D 8hfr e-yi`[\C1LXf4QZ`!Ktv Mj$!KjKP5TV\.ZBh -͓]&sȓ3>i !HpqʓF Rd .u9CC35 Sk$K3<'.V/O_<+S,=ݠ?Jyi#:Z,{`R.N>Ulv1[SnPqIܢv&zM,ŋ=k?߰ihCnSZ/ɻ,~V bkZS& #CyAtg>o%Ž@^ =)vyOwʙ6~Mgn8st8s+9pr+%щ~_ +I2]UVBK; am<Կ?=LαJ (8NV9 Eoom` J=?QJ47vAb<-OILSY5$ں+8' gpxP24TjYuK" ]ส= 6a82u|誓:9Np LӼaCKA<we^Mĉ$\ >ܫu7D%OZaش%TӲ=]$֩]{.l]qHB05nZ"u7G- p f_GVp;e nqoLC;(iC ;UdE~ʎhإ/-=XT.md69!Onn4m0vٷ1t>h]4y>{E U%USc!KfqM?LC hZĩw1CHTu8-ډݲ $f_f bihZP[ LMj[;H_SRW U?.^ .B$% BXmgST8e9TvR+K|LUdjzO+zHVl-J-h `]EY<`.ݸ> wif-Mҙ5^ϰ:0.|ż}BF`"KSk AޏsL:ﶚ]qۮvO6lO 8QS,gիܔ( y8f\Zٗpq$P0ԀƊ0n:煍ݵb5UN.elwhULiMU _6:trL'sUSnx]znVHB5hH_bJ6 =E[Ի+Xy\*JOU70škg.P%~e^b{E=dHA<"ΉK.sveIW~껤_Ik?{Vsz">U:HzC})Taѫ=@W]W2D9‘IXzxP:64@{ykX$֮?e$GT;l<$]~ذHD /lNwd'eWWʈ0B6.K2"K3^0Dxv= Q -V+3{О1OcuQE86}8IY8=$r&{KcuL&%K<ͭȗM7K/9mzf|>L@tUu@SWk qNqX5qʭ(1k^&pRy}}w*]ivPy22H Խ΃Se沕plb,/ bzi"!ӪQ~dxIȍeZ%IHvhz55{fzXb8ԲWIXIZYܮ!XkX\zKkߔs/kRSьI5Tv9|aIX[@v-)!1a\"S5eǫ;$&/(^lެ9ޭooygz,.{9r= Dc(.LHʼ+>3%eO@ vkft)Q_LU>쎌Qak)0JǁWb9t#Y`;n&M93yO8.*MGaĔv =^{S0`p?ˁBQi 7-/D$(}~u[-f2W{cKg"lR$< E{ <\)i7w6r>B.ȫ{O{lM434Ahct^eZ+Yq |&O *A3{bor&BP)n:׃T;_}m=O۵8OXK+ȗA:7H$ʊ]˞p?{s•gͮ Stmv+ c3>BJv]X-]쵰)v"{BZNH|0a(Q9Gؑ˜8E)=2 vXL<Kf\uGغxebe1V۾Է=RTͮ!t%]Pg[-'[^etI[n3Svea+ ĜS0\-#bHp+T6!3KHHc8G m㌧}`%KfLlpե\fZv1}-V=UI }H"d/t15TjSICsLB ,t  M9C_&1l]=["vkLG28?O.AU˕[ { 4)^S'WE$ C75VۮlͦFu矟1>};YiƓ<ӳ,r2`|#8'U 4vl+ɍ<;b\8%׏NҮN {BUh.B$c!Lb:'y*'%g-FCR`ZCj &pb; 4SgaOu-SMV 5!Rx[ktqk[bѶxM N%ف"FnSHiշ5t}&LˁIWܴ8 }XG*‡C|r0@;G#-`[uK&J `4'gӉ|h6hjUiŗ)&přfNMh/E"2Hdgahi7Drr}[k)Vt68 {=d| A7AZޣ],̮${Qv%R[CD͉:{[ pcл3\vZ/2nupv#apIlKboVL@R+knƚAtp,bMu0mXYis [`FUgv U0.)^yhZM i4黑$5^ʙGXAEo}hNH֦ܦ+TءƠ+H4p*$lɾXˠ }n6qW)2O>I_Bn@jq;]wTHI Yh- *Rz%m ^?Y~Dh.r6;Q>s6ĸ '(\ݖ` XL$F_}T PTo9w5an>w6OM%I'Rhaשxv7ک,rJffԱjXF:a3@([R{oΚ "[^1A5o)hR;ru!c#UߍŋVL@MM3lPI,=w?U36AWݙ7*]uhw-1'qc_w8ԯ׾6@E4fEįt1jx.gɄ~ CMP|H,󔴘 -$ٜU=$6d'\olZ8/^=2EFɿ+(E%?UTָΔBF*p3g!c5\g®?6#}] 7M/Ph[%ז@;ۊu6dK͓ϟ xEOp ,U!胙ak%3| 6oXūq!9FWg?Z㭏 DUE ȌDCN iS3`j^NMTH2]ɇ1/ڗᬫTдFCbz:/-Js~Pe\U_}ZCOph-ߢ=ITp?5sxh]vz,EZO(Sc(,U7gVXBD_'N#FM*m E!ei9R1ڤw9VjSنڔhP;jC{Sm@l$;>Jri+Aż,8.w*JV$]kT\y0iykV*K 5&u(NjO(˸%[MQUƫZm(p }_4NI.gIn_8(3I%Ur_+\rW/ʬ̃<[z=m!9PıɈ4Flh=RwOu^R󨟮G{@=t־UjBHL& ix4s0+gT89ciuѓ{vF識NpcDp_Xݘ;h_snV  oZdLEW+!C'ACӬX,8l WDK5BRM xT6`ԚC z\H;5`Ї6.`,muUnj8.ą*`)KzZ8h8Tm䓡 w:]Xl?Vv&3ϺH>d$㒧険~cSr6)i@<~pŚ᪅|Npm5n^;j8h:S`5. Dux>k:9՗ԕ*qF87|kaUPMc('RMAJ٧tV(>}ȣOӛX3/E\o=9[<ևz}Qd0SGμoy\ ]CQ3n'9.X>-goIN4E?'ίESph\Kj$#q|`ɝh [ݎC}|?۰SQ--)4 5qDZj֗3?ip<-N^]InE탱B[-gR`r)qo0)&|ktc=Մ-1Pϙ3Oz(:^ܡ\ M!JiqT*=+!L-RSCid<L3(~i59Ne(1% %ןԌLW jjb< iqMз i/ Esj 54(Vl[gkWZEZW{I\ǬIÖ7-!hci%{]X*3aoS|U+ 5#]Q MɱC 5*1xv%)\ţ%=1o}éOHWw-R}I?3J =K9We-|H{s"raKB&\}\a.i.Uy,~8CRubt4~g%DMCm\+0{둬95p(Z˧ke[+eksHܕrO,UڏfuhM;k DYi' HMm)C-P*8V|ބNYMs}5]`ù=}S`HqC=4Fet_ɓ!Ev_w_+}} oBnv Lfwi*[BWaN)Ip,1CgӈB4r`ہK?$;ߡv)RPl|HMԟPj?{xAeUg5xwZ|q˹ĬYMclOђFy)ϔ!N\3 R޻9PT7&\Ae'm<M PQEl޷]+sS}Y _ `j{28oՈ-11A_ 0Y=K6IQ%2i)(I&SFDE]?}W=: v=B*6A(j`dI ܂K 5f #&F^+ٌKfBK{Xc)֭iT|^7uaYhx֐M 7Im/6IQnzzmMm#ɰl5|(ݮvM `U_85W4֗h!h SnaME]bZuXWڒ&]eZw&3kdV1q)|jBD&s}0imbeGMiC)B0upoS30<w>׾By0W;$#40YG&ܫTV@.ZQϏfzhTC?4q9GdNF5TiWُ;Zz=HJhB⒔vح}k/Ώvh!Wgk[mgq ,|Z퓳R60-OcTsf'I] &eMHS})q~+%Xg#'qcisK-.r45-(֕}K F;"Sl#o#[`Sܒ0[X8!y*W +vR:k+'~dE^~"8Xa(a4DAK,cwf%4GYKt_꧴"%HkOwh3Z-m!PG?9}#,iY1&}Y<;Ȧe{ -nt(sTq`U2dK[6Eq_=78ɚJ$I-m#6xEp:tT]v;hCr`ͤJyGͦyFǔ㇗ƵkhR,Yr.^b+Ωȳk%}ǩ}0V:nm::.26X]I+䌎DL_=tqƎkQ::âرu M ߸&GۧeAd= b^8l)lE:ܤJi2)ƔvPѓ١io=]9F''!GR)ОAg.cO~aldٰz,&phCHyLM_=ʃoG~jJ2L A}*tRg×OIl:7C.A|LUwhk ynޥ[@9(DtchPtvI05m"~UCqꧏblNK&1scL EH85fG%0->߁M%=xצ#L.ҷɝ,4"יX+xs;)=ڼ&c}(}?4PIIz8}oIs].Y 㻑t n+حWuwUI#V]pf6Glj1 \K;@C~hH@*ClFGS X%%:xOV;^Iƅ0x3N݁e\?g]XBE=I.o9I6kB)CZբ~3㒘~&y$f7VM[S8姥J\u%[t3r"y[:[BDE[wIDEݾ-{w"`<.EUX `k>̤q LK>ً} 854 N,*ISʤ"Yũ&ߒ2 8$ 4 L&2^.Fn`_ ɬUP=^lpRRV;;uGUӮC/kg){p6Ymy?dL]&#r6B%J Nj];С2~d7aBL; }%$5JEEyKSc3Qr77j=p!Z,یY=<8ԛ'<`ns\py 8x gB5S/TN\X[}uWWytU Ц=ttC  6uCb'SJ&JCq(~elq ܥl]T5? _);*9w)zr㔜jGq-K wm0s旡7vȡI~p Sa1nj ]ƞiG0l)'P}A}p2] Oܘ-[J .'Iٕ3c~|j: U=U;d;<7a!Wq#wJ!pWĚg30"Ucֹ$2D١:WފB40)lj;qi`8vX\nÕE#!iG\t=¹J;ǡ|\qIr~.AXs!+9t2;!MN079+'ʏxG ] #V2N8zY-?#X?)~[xm\M) N<)-8X74=vDh@F;y`c6Z_Au|ޞWjf l4ܚ\юC&9A?[&no0GصwfZDbnW,懣`ĹtR[̮&o)Yڄr̚_M\Џ:7-#QlLN 6qh({Na3١ T8;.%NqهLmE*88?+aѶrC9-_y6oN۵`)uXv0F0t 3x~rə"AW7M8Otj3-gZ˦#% Yfq4܂,ƌB58Y(&9*+ΤhERJЛ-y.KFۏBH9[rX3|i[*ȗ|:s#?ji!gXev`e3\ڞN !VL1S/>3u9,sꔲ04ũo.*leJ9JËc'`,ÐL]3VV_gn=Bt vH[k8{Bñ1^6-?(OB _{Mvs/Ґ|G;XC?v_h7@UwDO[ qR@k|`b sq`.1B}sg)|b{xGU޺&뛱FIZt"m^2ؔu٭cSEBȵBttxLamۜVJmΥyǹ/Ӝ H.Ae`c &Z*(vH_%bN6X ]b"+ā#dX/o@#GW%.(X:1@(OM2Fu^JMddh\CZ$ 5NNyjb`ӆd~l[|iUE*p֎v$!ֺ[ջq ;٪;_ =ܤl.qt9\wN+ ?je^)i`<>M_+Q s4O Ci.б;T+6rA^Ʌ8ddGTwf7(g0ߪOoƌ;Ynr?A!5︵ TGdžMBQ;k,|Gt&EZ@MSTOqMyJjU%IGF}pu}֜lMmC%3szϺ>GP&H:d@kh[/}\OUȯ3:{F%Bg]STZE-{O練ѡBhwmx%a<śv`W ~C4#,54trUvq B/Y>Tn1sO¸XZ)WA9D-}W(R=G#Ɂu>2ޚ"{}e^0Q+`÷Y䀞O! $a_P2e#э}^JF&!}]O>$dev Ζ}ܵf LMK,n?Zk8 2rJRi{0;Rj$ Fs85T/7$.M*ȫkRza=`KX4%2tU;|| B.AR]kk%&Dʡ4 ~@w 2HTigδ0[QniJc@G2 Mu \ऋbhFN#i4q=QTJu76q9U̸bhHpNkӖs dbm{_St;nƵ$%RsKq%A+ENr94#1jʋw bB?y upF~w4Yزi6< sI?5X8$M?dWߑq$byF9 c^9klFEFKUcG-e\upԶ2&-J]ǪH-[+dkpdeg5m5FŒ9EP4yA51vRlg?VΥ6fmYuXNB9Jdp߈3`h\3&,!kZFK4RJ\TbS|Rs7塑>oٿ0P ݒ:3mL8Q5:oNq)YїVt+/Ashs̈́J:r.Z#d+1 <%-\Qre ذqC-XŮk.~'[X\88kLߊZ싀+}E .x^{h\QUgnuӏCInU/ Ĥn-ck{.IȊ|k h(F[kUZڢCW8>ܴ^댗V(7)CۓgdZW~8~MJ[bߌຨ]&-KI*# v^5#Հ;p»3nxI k"jnCibCp6 eVCޣ87)j 9jڦ+SDZj-i]2JZ7>W N7C\6><$q{XG[!Fc\p$09i,$Ƽ4#8~)y:ڷw!b}Fn{RϋH{E55R }sJėԀ9G% 1'% 0z~Ig"XԷ n )~]єK4]149ؿiJj<2s:UqKLN y6dMHc%SWUOjneqzj͡<UɁާC1X򙈭`Nun#@n;EH 7rItK#3 +ǜRBp*ЮveR})R )MO:ķPm!p:W9a̺`-:qWX7-d\Rߥ٠ 7ުN&nSx x"TNJ7&`w oYv[ӱU?wk;d7m}?$ܒ28lrplے^-|>G}G3nwa2z W.,U=;5x8`h!ڿ>Sn=l942MUD\KfdBU 3BiZB܀Cg#Wd %{ ״e㮣Id$Ώ%jwdqO$ٟШy%-r!f*`vǎ;)F1y/-ݎQ;nxtqH#JL *O(5뒧Hੑc ^3XbDq4]R3@UCpZ,IwOеirC>Rt gBv5J{,)иQ7jܺSktluD]čT] 6uC1٥mԢ@_֚iPf6 53[GSn0w}ϸ$MF@$! 40%B9.:&G:Z8`_.E?tB@+ءiᡳ#MbqsZ" AfuH/&ڎ#<]p^.3? ):dd{pOC [l!M5U98Bk 8t5HRLYc 7Vtl8j) k9"7W]bN I: rg?coR] w i[y7힥``㿋Կk^uYߺ#5mĖ#&ޤ]!<x| ٲ8ʏr~N?PZgiֹf:skԺoZ`XH+ rT&9T\/KI/. LWֽwy Wu*1=B ~u0-'`C.`EBixE|i"U'613v:WjʤM<W9Z[ISI [S29%Ʒ?{ 'Iz]Pi 8CvoSeXӔq 3 D"\ bpMiyCM)Ýt"CIdtBS(f5ȱKv+sOFr+s-'?׺tۣ[Q&lX RҪ|$ڛ S`i\6هj.>PxioY%`=NQҒ _Ě:TI=J8Fq8]KNw8V&ߠqpK6㰞eg=r# Mcs -qO麦7aUߪYMƍL.Vt^{'-qyM6g"4s9N-{1J&׬qT$0.HuYbLMޏC;}dbT)oGct*F9^ ר꽖xMQDb1h #B`5" 5!)%= Yx:5_볗G1$^: T\kRɧAr4";GDz~Ǧ)!#9+myֻ GH g߼e_ TxnX%ŷi#v#& -HaE567ScPsE[?HwTҏDJgY8hQXS|ÙtjѼ i|GI$<D56/f2gvU©-}sǔEwM9:&~[gxwQ.܀LB.؁6 >JumI0H­IJthԘQ3혁M}5fH" Z桱z}S9^8xm6h"ަ['JK{>~.ZBOP;`h' ZVkakFy)I5kgdfkᔿ~uOE7\3e"e \d`Bj4;꣓-(EPxկxOs6&] ;@a0At5.ELᬫԡκXl R\4yJ,T[̖*iy ?QHl]U(}H,pOhZGj6HET. Ѳ [Ӫ2-o~ c%&D/a_KQB]]qQjq*.A21mKy$i~q;a.XыiKۡTESwZB@1X1QH7euєKʮʴA s &b8ȓ?MLLLpRI).%m WE)72raNwMTb~fzcs;]`wx8I1lkm݁L$s IH_:\ Өiijt^Z")v؋!.+oC΢wVih&=<i-=bXG^).V(AhzU}T4%ߺ"( &"¹{OQ. {҄4=sP(_>41sA4Jt~ BnMf|"\i]6ءS'H[Z'%ؖ"H(l>1ܨɿ#*wH4r[4PA:8@~*1_'u&!r M"qfA\ջ$M/E-.+#5dNq!`Q!vCcRMM1b!]K[4KR`m)zfݚwz`-UQeIMJϚ4|Iiouʯ 6;:{jqVگhոScNe]\,9kKEs UfLLFAIàMɅxj#YEE_/'f'r2gk\) dzSi MV{ BkH*[L-(qn;6*tCǢU50)zZAkÏۡhL]#Z/p9ntkr-ζsR s6696b;6wׇ.~ Տj\[3/Ux.!,㴞75UoMC]G-LrV9fNEDzm]zkIGլbpkcHCogR Ө!:V.-a6ؙZǼړ7u/iz[jU!*i8A/C:7E!=^iZlfjR >z藔I51ӹp S.9_qkdixMu/nE1vWZ=$ݺ$n:]S"k[Ҏ]"%MC {mdt4v4.2eC+KP3$1T?~X45ut,y(44)LzN<xRr%C,pgm%.jD0dK ,t YM3l4~^NCö)\K-? L0 \0xqiB\]9j6h>&|:Yi kH%c:^tN ¡nb-r/M u #?h#U>rVx[צ2As./"2?_9[pâ YFGL6SP'jqC-'-yAf`; *Xun9=.-i )د[ bPw!|f$ 4;ոA Gq+ξuRڭc::xkxKs@>wo DQ:9(!Ax\y?zNשf"@S_ 48tjSyߤ64>C"#qT٠-pslZٴOT*يs6ߏFM;` ة;iƛ/x1pJI筜;4sPOߓyKݖNsNv\3R6%Wyt,HRyT8wq cDϓ=?MB`"k<"&"[y蝲[ǪS]f|OySCEhBVTA*|$iZx^4a*R_;U'RHj c^]Ee 4o7ܹmDE7 4A:rmO4ClbcX#h}8&$sq-A6d-؊d39 I^jZ[aVFrR"KfX`F!!|q?jV>i&Si!DMs' UjFa\c\¢w=I-! 7rvca\5Ð!.z/嬵7-[8e8~ 'q*LJw40Y\OSK38)ѴGn:'~gcvC0 [940c "}<&޼Rr>N甡JWR^?j G:2H ,مfLou;:!;"=1ݡ2wkiЧ^xqBX5$DRrhUs?^iA,uX!2390ckv>osn+ŷ"O=)SS'@VAwԩ QU=Cgvヾ1&%nqٷ)N%84!6xJ)7l0AWĚO^B!6edjJtk6}~Lk%7u^P<.;.ژmș^^*DG[{O޻IWrk?m{┅Dzݽd.41U&e94 J|#ޖNݽpZ!ET`b7 y5qa""2.cؽ|qyi^⦻ٸ!I~?8$.)̡,00GuۗlEm/ Ӑ40' zo ]I#8 .J 8h1ٛfDp/ݩv 8F8c8?TJL63=ro.ݶe$qD?P$|ء.hOm~rɣ^)[4*r|?KTĦS2:P|cejxEs"jG oRHaZHb͛8$dj Ьc.VUSe8d:])20ְCw_}sOE UۍPJaG+o/tW]-Xg)Z [EݔNg4WOQ!=EyKB/f!N/  -p-eq5a4Ez=KKwשKP&NdgU}J'e&_S\-MњnZj!<ܟfy< ) -o$<[kRYŪCnҞ$%ȁ©͟&[{S[>Z:YIk sjxci%V!X6]Y+Stu8Ə~™vk*&A3TJw;6qhp:&i?ۖ +b)eA l|BԀ:$A:'- tv}'K W܂8YX.]$5|VZp-,ؔ[\MN_c!ʖs.2ؼd}pj巹q HnmGa8~5 UM-@ X> +hbVԄiƹ-P)*A-i}n fL[v՚V%ޱ#n_N5qKK7TΚݸ#z{6=+^{ o:Tz S~{h)?/ZA-Kvv`MσDڏ?tڑ2ț[>E?R;rC 5OՁ)4w杗fY̽<xyFk{i-BQ+/rB ~E ~OxxHM<=3Mq ևʡ\tމ/kf1GݾC9g+a U|i;FM5$IEz^3jؿ"kڅv2TLĴIя6+K짣nr z_:H :qfo\>Q?C*dRr 7--&@spT|{٦Ш7ػj5)8ش>#sz-Eu2~HtrƹqbKrOiO|4rv+.)% 6f5$uB2^R˶O6եK^Z K+:o7m' 3ޗ8pI2/`d|󒍰JN輾<$:ܠih͙I)~;\&Iai9z~?κk>e3nׯ/N:vL` *Qz5,<""XVH'u]Jwle֭!|A۸B/J&̖)z(zhsK+PM2ՋeIֽLQq좢b[$2 â<?%5FU}O Eh (ePŮMŹHSR%.4d`=ŬI+0)hʒY Xt ~ n]r.D;?JCߧ+M'"EłAUhմp̠`pFEi[qԻ::}Z$hl`*gbԁnRp.7m'los(mBH'uH9% YƸiϲk\]2m7 {q8i ytZmqV(>J8Qdn} #cIw"*VӇ:~l벍bQ^& ɾU7D*ɷ%ߪﲜN%jVU*49b\2҃NԂ`ZP<-0Yδ4ip9K%Br WkrY ukE2NkΣ+Eb'U72jM>sj` Q"t]V|]%)oR r8;1y3m|(֡U"T=Cg}e6dMc#ضŝS iv hg{Q$;Lj HV6[ 3uN\Lm#Wl,qfl(}suxyxk8p xnI:XߺY[= ݦ9=qАov ~>*>[C3K-=sOy9w-' o"8׍2 $0]Re W[%+)zO^t ~% ʃ][Rѝ jwHF .4~P@y9G wޚ X$2*߷4w)GѶZ㪍i?IMOpzҧfG֢i 4M|C`ڵ1]Lhoׁهv8d#INXbN0 zLʵW:(Ԙ!Bµdi}Mo% YQ߭2]pkV~-> T;lLUĥ+e8Lg2c-JQ ҽBɛXYp8cطxK&b~}2c^H ^`N@MNL̒ 1/B54KB4ԿEm*M4Y6 C=`]LT@:qd5$Y۞+DzP)9p(zqp:7ag4KӲԸo+@9WukyF'䅢 \rO!P/}SC^v<CKjԘopHM};Z8^Hs(偁Z~-a@05ưʻRt[6KG@~ 5I^cPczGlF'S.㤩C2ng!7@G>9S:sy2$?`ZNGը9*ٽC\aV8HGцSp6^R\!o/jb'CָMlx=ޡ>S2[.)͛ë]FPg 7!f{D8؈0I(LN@oÔX)4iJ)kšTw 5 |mdXno9QBPr'@ Upa2\ l5{Jt Lŋ1 DvŮUeAZL:Z%R [&6[sh-HFrlBdzgB$_Ҫ#HM#whZvC9עsķ:۾!ndu)wK:7ѤlyefN~Ԍydh+KycVrt9b]h:K_z]"]^623N>sIt3RQ(#--AFj搕ij556`8ۂC}ڞP $sz \\vbմHTf !U^[-Cޚ<-:mcMP8<_ ѮlH5gҍ^<2 JT9)i9 Z YF@]5u%kU~$ehR&<(E1m98ܸМ x2㢩US,~MZ<1HDMHGS$ rl * 's8 C҇xLŃ_<j%v8s ΰ]_w 3=?Ve.9~v5rRP楈i㉲bnjwP<AS< \Gܙlٯ<1cc~ZM)w=8}e?86ضQ,Qr}E|K($K&s2CB|6d9sp.I8S0) ¹~P/d>7Ou߼fY˞yj,w4dV~n򐱌^ ,{\`SnIxYCW o }`Q6Mm?MyS(`la`/sG+q048\pYl\~i[L!x5ť$r6qSC<=xY1Z.ڹs4. TX[D\Q ]|kOطsR䁊c&y3aZûI R\x8չTp$CL~&rzx,"CVC(4Z|*wrOŰM&le7;7Ɏe0g1 [QUb  jb:Ã}3Uz"tÉdNE(u;.?Uptt!r!dG'0\! -u]R43spউu)Z"nC+*8 R~M3Y,XL\hL&yR=@_o}:kG[K‡^)]T]&) ݺ,o]ݘm⪐{@5m(<5k:;[ui<\k zhCҟZJ5]gi TbXetALl,$6 mR/.-kSf0gQ,NAq%Iף#Kq!9gPoKKz+}MY.]fH@վ`.Z@st]rXs/ AMX޸lܴkR·d۲IV&g\;s3ۃm/d}{r8m=lB^^b ΢nerF6^m,v$LG8HM7Ic]1Mi0u"Y"M] ҇ޭo I7xwަw9ɝ8/Ӣ>R .HP9}O(2ٵKz&뿊dJ<)8DXzŘt@GE~C?A4~ۦǖ/`&E1REWt$~kg\Qed]{a=' Z'q;0xhhY_Sr!CsN x9´Z"lI" 9G΍&JkiX%4^ 2M_A-$v'TjȰ)v) 4搌mžNPLɢe >\Q$KO-}z5{ZqKNtv4.2m L=SGoCDD8!ϭՊri,C'8:1a$!It_CHץԂ^0gm"xN%j 2,%cR|Lj1rwfTmiBâL{z|ifhNP3g܂!mڍ,6TɦٴSݍ!vNb-G?$tG)e&!uv8HIF*=^ tps9;T~d 9jk۔: /q[05qX;9$mlM8D%\uK[ {| yRܣ\*mQ-[[dek7QnpM~έt1&[GYq5 q4 [ kZ0r8K[A= : sy˒PtZ*r5B A* 1 LM%Sc2l +9T<s%$tקkH' +>PI HRإeu  1 ^[.ĨU;#&}dr!F74o)IԴhE16~d7.oB2~#iòo\pc2c3ʐU\m-]Gmt[`0-0>9Br놘Kr;U6>XF$Ԅc^g]OrQE:KvPHnuL[ZT7qIsMU#K⛺hAM_-~k>pq5Tѯ'¾D|bLUGiȕfw#% vt>FpLOUPd4!gZ@*98ի5bE6藯>Ȳ/*qWxrVEjvVd=SI 4Ucn0NsHcTԹiO;З2f5LR0\PjJvv奉[:vv ym>. FZ#۷+?h!oYE QPk l`ܙgCj`n!6 5QVM -U9^^OnSR,iX%bo&oM\*F5pT $t0->gUkI6LW<5Z&uhά|50?vX)QˤyLS3>)m]dUb?4ғ%vN[& *Qs6IMڐv˟Y=$QV)!QRr@)Yjյ뺖AS u䲅-\{~#`ۉ I=hPɜy6>dSsyC X_l*./%CLˌGU'ޖE 1Vxu3LfBSucT I1ia# &:qhfߴA6lT0nfKOeN㥨 pn2lCJ^ur/gTXn%6)<,ÉsP5)7x9d~syrЁZ?eL]F^`Ҭށډ|Q͑iج1.W\.=g?ųp9=yK/nqI[~wgrӖҎ 睓He.a0olYumqSFp%ëܺ-ƥg`?y/K{Tfm׹M{xA 9P6DKK\&K4V l2&A@5ÇӘ,QɤkQbֆip+ȶVݰxZXWm_%H ^q8Vª^ɾyлA?ѷ8/ 2hv}R36I}jF4JCi~]2#LSOŸ?9ê ˶Oy(:HU1q b}C-5c&\׌\Vt7\q"ò ҬskEC52Igga0SVjCv`Q(IC5pHݹ3M7WCir_CCs2cLhkV,˴i%Eh_F+b2 :4Y% =`vTOU @\G1Te!)Rk][|Yfo nChvY͇tT:) >`@?@*<~3ۂ'\v5A_ 5)nwkV,M&-6d:y(%q^,[L%ɔOCHqw}:Ji*r ]lS\.=Je-kqxiEY\z1S㴳⚁y0o^{|5ha94B2S`}уG$KK ṵihLrҤ\3IAaz4޺ T.jF vCӢҜ=qꓷr/۳ZS]>Y[IBX$0ݘBm-m,K=`IGHd{CM˿(- C1HFfRD 1IAgj&HbJ  OĪC`P?}iE@Cتr39—0_n6 !KRQp)M+R?gS=ӷN>22>Z?|)'AgOQv5ܰJl\\|"1֏٭u0vm4g^ԓnfxkZj] Dg-I悛 5 OqÞSgo_, qښ}빡94qx]_oʤz~eۖAiVUJ`3WMn Vppb czm큻sQz9\.?"jRp`ȲaE$l0j>غ#wm~L~;Mm 68U:CΙ J\THDH3[.% 5߮84[Y , ԇJMZ=opF4khM[ ]\nb%%WI1&]7P4ڬI#g [CBVaDw:;Y[%uj7kaYgFZV쀋V/lh?'6Wu8o]RbQNp>EҒ`9Iσͭx`Qԝe\a!Dj&P9 6b|re:|yΜ$m7L7l!UdbDJ>IM"Τ_X<<#r+طyTSAƥ+JXviRRM-_/сf1BwvKRhU#(ӱܵ㚔{ 6X[ktyh!2s 8$F Q?8af e~M?9 wp)>r!/Uցqqj8I|.|\\KZ"o*LN߯R'W-,Auː4Ƥ<%S$е(~dUmH mӚtlĜA/o#-ErXY6[lUWj)'G$Ӎ@s9lJ8 -o OTrmljjZ殡C04uk*vdP}koﲜ7tGrW̴NcNX]RJw"# 6aA\߇6iZ2ypk#n$l%-1Yo9=tVx#,/ >ͰfD'UskL'LR=6AB~%-Ϛc/@URsk>7mCj{z%:9h7[ 5zZ}c8']1LJYܫnv.g\ B=@maDzAl.fPT _h`O@1Q]pBc\E~rrSLJnP fCPj0(<{ՙ7ܢH-+[thĮ"ZN#Fy)&%IC0);6ZhulBZ䐌IB@ǼZINLPj{yNOфi{!y *`q@"`մUX[)siQAs cCQnB[nl8g|NYgSJ:M4s IdMT,sM<~اY .G-[|Hk'/4-?޷Mhq_$שw˼JԲ$0zзB+%LfM˖i/7[\{ʬÆ|NNKHjJB"y-+~=]<0EGT;Ýd%&rDrsuJW2)z9\|쯞D~4lWԙR52ݮ}= R&] p\T-鬉4ˇ<>!k垸F ehFǖ1 ii ~ &l`Fe6ȺcPY%ݵs \֕'hĢL`te luUIlU=#aq-DkQ+@XOX$ /$*[q^bUp ɑ~ŘNZdl@%X_y0]Hp%2$2n(u=E& ApZM!n\װй0m&ce!Z]RZ-h ۖ:2QٳŹqt=.7sp9;3T.!`hܶ&1_8p:b!- nU.se*䓶A3k:5uU#ӉQBgCcˈ!vn8m VRnHm6UY4][c)p1FG^eL6Fঅԃvڐ˛6 kձ(^n;}ywUOgq}QX(1%n&$E{xʢLx Ϫd+>JyIt%aK!,Ԯ=d,uo&r#5e{z˰Ku `{ArޯԦPyzky&4dH"I5a %$c؁;n6^7z!֏,Cdzox˚`pJ1 QO@v3,6I9JʂCC3X*bM P\&r!1Öt@4/&b"٧ĭGY^8M0`ЬE*6Ems?ZhC=8uQZhx(uD$jL()WDmrnCc)M{䌹&ʹ'Yu0Abe2V]4rc';0i?m$hs̯:jXcdJ[!D i%~ъ}ܖ$a> hwcbYȚ$-6[*y+_xveːNjLW[7e=tm?%?ל9GKmn3࢜iVJ3ʥZ|?u`5b< &gi¹4n,p"H.F \تu3͸hPL]sήkSaN.}I'L[݋Zf4_>*i|fX|B6;Q!ф\цlh dT#4/d Ѵ,[Jaդ4)wMgi^5]qHKmCKJCpRmy)^hCƒ.Cq Oo!hɶb_vZfN.\ wO[}Ⱥx>[7~{>غ$׍--DEP)[Gʖw -?8yKm.BXI7Xt'qUBkT, ֮f>1ceB6嵧-/j%/ąr 2C2v-1 lWeʖlYxs ?0 q:+sF"ozRk_ ]eGŨX`Ҥ0oRAj҉U+X]fC:P+\!fB7A2(څ]S:ԄΟ,j˺3$IzE.øIy;s`;kXJC-~.&&w-OK:Xxg5oWx)El԰i(ꔚ[egH}53o^}Ǡ_roA$;F14L$6ߘdsBU2>X̊Ғ~ ,Z ` *bEP T^E H)i>E֬I,q-Bw !HP3>wq)s:=ܶJ½Y4:.ω\UR'mC[z+sA$mo7飆gڮ@(:o+R':Af[|y<[\d)):ʃ%12jp \*R5˃΂D ߊZXf,"ǘ6*^6q !n*E6>Ք3M<|hv9EXCyi)uBMk# K%'}X?0:&ICnYN-~Β9ỎWpŜٖSA~Ҁ f>{ I:B5]%:N:m"e70 UCMiLPkh&]yږckC_%cڬ3~F#RZW p%)Ϲx3&JByNC( lבZ7jRȴ.HݑGR~jF|YwY#8u-Dz_tk[KX}bƍ^ j&p#s7XhO]SV)I->97?qkԌv[EIi9_#RsÓ]Rx^k;NB'yK!71o%<ۆK&w)\7ݳd5WeW͘W^ /,]2ACi/UQVW1hj,M!^mQX \@ળNvAp=21$=. FA-(|77 0<OLAOHl^Nb+#U`U_|-23phQ%EҺ ylu]/rSu t@uA:gmܿT,S ԏ6(M Lcں/$Z\fkQ$?\D=z;USýcWmPɉ$z52iHGVxyÕ@:R ugI 9Y9_̛ϩ~ Q㫍MyS06& ]g2M{pּG1m~tʬ6/&Ut!Y&;'*}:uBHxߪ+FtEL3`p hZERnG$ѻopqһU36ɺWjΓ̜}h`T\#_JdD/1C3#y 9Q_g.8oobŏy,.*H}ȄCGj"ԋp,9% +oNE&7e"&kxۡL6X\yh'X$Џf08O&~TPvyX%a(ʨL|n^(/X0\L<kHq0Ax.|Tz>9V1 1BE!g$MpCBMIÛ_ S1apz NpMHdjV5s-T6x#Zmw_a&4-)0H.@]2\͐ a[44Am7J~mhLlɖC.D ͘MS qyvYW?+]7L'-BX:զ!SZ~UtwYFڼɃ.3OIGuRH§3A$4T߅5 &3hxKl$tkèiժmCMkйR[ XC1"IN:I;L eKl}ߛ\6v4pȏW4I3n;6UUm b̚1R%hRzpnWش-H[&)'MKd1dg[z6_}uhR6oZ&1˃~_~}p~7b}%_~?}/?{䛸k$|:K)U?ioa;rq?/x ȟsR:SJ"rLgc߾l㮼_|xoojZ%x9Mס?/(DI׈nR~)Ejob[mGPVo j^.<4rϞ_7갅e5|BXܻz|]Ig?̺zHceC_?}3&7|wO߽ Oԗ~0Wvn evGPXw_& c̩otkO혫q̥%-N"U)k*F\fq[|~ia+p?zYM\,@O_}ojiKI7s)?FM}>[㰤busm跂MHy&nGEk-7=wm&)UwnGodk9J~1M C~~mݸ_*pY)~鯾9,v'S ӗor'Ohމ6gO?f~,ce; 5FKܼdzSߦ/v® ;dݻ,sUwڿ"qk;Mwc/צ/FY[{2k/_b>nmܳ#M~}󯾴9|%|];^:-qNv؜+7-q|\loy<>Iq3p~ԧ&ܯOHe%tuNiK~vI׌;hs/aY~yŽXԟ_tw:_jj ٚǝ2m5;Xߎp9/s"yŽ͜e{X3tԧ_kk>~n]3Wt/<\{!EX3>{>L7e|~[V_NGnu}q_u9-yN; ^n_tf eJ|7n= w WO϶ sAp/Ұ~K _&ew k)ޟ`t й=}u; D¬ ~%hܫx>ݥ 従:/Ro{Jia^5ϣ;^lv]]ԥOo2vaݫI۝aʻKTSޏ.;:gSܴ1۞[å7~]Rݭiݒ$[ҧ`|Iӗ_Z[R>[[oJɴwxѯ3?븴7;Z.P/L ˳??>_/?8c΀xtZK3^??_ۿ/,/%Aze ⨿87eS7߾?Qó ^~/?竔PK̷`CPKKB___MACOSX/study_1457_split_library_seqs_and_mapping/._study_1457_closed_reference_otu_table.biomUX Qc`cg`b`MLVVP'! 0CBL@!.XPWXXWPo```hmjdfdid힟SadQ amdjlnhkbhfkjaaljX2>[PKPK|KBEstudy_1457_split_library_seqs_and_mapping/study_1457_mapping_file.txtUX eRQ]ksؖTMMLU_ޏtYƘ$s qֵn2@\kx8흵N'˻t<ߗnNt|0ꄣ7N`ķQqunGm3lu/OoZq/wZr9}mN+AwWW9`ug<Ϟu.V<1}mߞnl+6 Ͼݎ{qw7ZpoGӻNк GݢwBg֠ 7D?wں9z(+/}7npxţo3Qpng.Z"ꅽ[+ѷAk x-tq㋝Ƿ_%zN0f%-4zU'i׊àa 8l@A q#ƭh1M5oZ|4kOl՞Oُt՞VN{}Z|ܭS}x\,wc~5iu}jF_^?WOO/wդjɼe~'?ۙN;aE=Ή.'៯y\ӗ8r! v#Su? ah{Df?#0>[O֭ӧу<쑰W1jd5dNDw~_ZliO/ы^媥[ۺ[<=O5aJM4[.I{6o?Ag1ߓXKuЭbE?':PZ 9 e~L'崥;rF%?P|Ziv04}-tʘ/lԬ-81]fvHfm"l䦖-ќ#\\o4:A#sA~1wFy7G#ť4<Ԭ\q_G'K).DT L(m.,6,/͞'kg|{C)DlxY (G\ID\FpU}ꘅH$x3u'Ǹyd6o}>E" 7&p3NtضFMJQd~;d!p:;:;t®_py6ZF/OPO

~Ǐ#k^pq|MmԱMvΆے=7F&Ph 6 L;9t 9:ʧ=6C`q?]*B/" "a"26^t5c48DYСiRv}l"HJzL&ԬE<зt}% U^pXUy9OI2d+hٶ^/$tnu:?DV&V  M5A*MIEkZu[l) L;8řTj40WE3ê7|l#o_{Cl;4dbo}o#}޵GWPqoL0JOO'w$N͐"e~]\ef/t1Ћq|i*E&62PA'GndloH 45!sEO;ӓӬKC:)8Ħ yئ N41y'cK+C!Ra%: AWQ; &I b[<^^ȦO3 0ΔZp) lu%^N櫿ՔW=O۱xr[uE7-Vnq O!1+"4o7o<`|4-ѧp'cwT w3BI ?I᧼S78Dm>*'ӭ]Y{1[=K"#@#P4M^[ઽ~8Y'SKܥݥϧ1>T](Dg!@n<_:")5$Zs]4&u${V!Ƽ'ʫ̐kA jVjf8sx9:?t$8<z` &U3O43t6X9RjV}y9_=O!lNqj aϮ'C܎&H)eY ˁWaA}>>dx [-$xD#6ڂܛG[iGBoAהNdGh6ώI%LEXw%/QWHW yK͎TBlxN[&t= z YcFC[2 rؖϜ" ~{x\odRWJZ0ysf%-V墄2ԂOX "O6p&t8bPus~^b=A]@3! S5UxLTOs%m }̆\bg^׃[XN'Kt'k?~|s nVO}cC'jʄt_O \PHuQ=OVqpm.Д9 Dk5ιP%rAtC%@dgFk8iVD/8*p?6M*Ҍo-PphD7,3iw8 cϤf_ɰ=3 <4uI¬d5:yg+DQm0D6-'J]TX5NVW+6n C[&alzx[qTKqHDf{6ktlo`*oo6sqEZc's8=|f.$|߀E=m>i䍏JrCPhTuHrB_Y[v[|P ^g$ LRݰeЖ[A ݐޒMR=clS5.7"AJ^˃/VUO58f1G3إM\l7A71C~=Mx2!Wxi1/3#chqo&@\NSqTS+L -OphǑr8Rr8|J-V6q bmNJA޸$G,GyNfʬR!i3u`r*g۵&:9m`9BsseR \-R$"&Um*U;j\+G&՚|>cl2'ȩ BmIڕ*Pi[G% 3%Qnnn~NzM, ~ãdtH-Nv WhirЮ3C2=)HSb~TzpycY)i/ c 3%ߚ}GrR-@St倱k Op KY(n;ƿ~GΦFyԎ4@ܤڈd}.U)uUk9XzƜ53tg.vr5]Y)jZEiMIQ-,bw^٣hz5|aFR'͠*DyzOh9ef@2)鐠~2u!s1Cu5ٺ9wˬ5fk{Cuf-Ρ94#2..{R:{\_K$HȻRǣr]Zف?נ{aJ㮇ʡ gv₨ S}zz"њ{.Ppegzn\"ooS5Z~lD_芀X띸B\>s$d] CNF=2 JMHBO+L#Y#&){IhTu$h/7eH"^7L(@H]# ?Yhޫ)jl_f}#K24?ֿVm=Bw<UZ6`wl r}=6)2Y "i$m !/SddoŬ 7 Xr 卵;āIMsp>r8R߆/- Qq5ûeJ>}YiSLN "+5="sFkJX}pÇV?JΪE dւ2DO .hi?d*j(nͲmIr2;O3+͑'/R4GrYNK#=sJZ5Y0<&NBmx@Sr&tb3׋gdV?DC]diU*V1ʲxWrPYP;5RX8ݛҼF hqX۩b#'#r]9G{[i%Fsg\zq8+t#rAg٬k1,"وdIEWIJݨE(D3-Y1q @jHmy`7>)M*lo8XP+V)h+A62JSd+ T!sV&,kU':\ e|k@H$GDDȤ?'uGG+ abADX!{PG-u&CHOiv{$U.˙O`Ԉ LJ[\V`kѕRyۮU,sM4Hr$G%06lHxgJ  U*=k򥷾@1v <7QEnh!jz&D-WmZNx05:5ijocŒ9nAM2T5l:*?d2Wd"ԭ\:G PHo8y1#> "ȅlMwDnQj!: j-#U0f&} jSA`͕Пwk ˔R So0vAWSv}wxS<1T5 G#@@4b?x9.WS #=@ZB~ԓ!妓2'sldyyPݤ|<SU*uKF8СD2\c+F>x嗕ma _1 P|сJTFowD%nȤIAJwW2EL!V]3$#d;{Rr̖eLZK UM(Z鲞;# t󸒰Tw,XW_Jm@&gP'_YaHR3:% KjJg劕y f# \c% SM,.$ K9-"N|M KV]S7+a;[&yQxc/Gc)/5=d)4==Ss8=¹<)Kۆ&tysoGWs|( RAX(Xˣg]ݞL0it=9>c͇k9҄Ibd C!?G%:Aϣnfg xy;гlo65ZS`w%87D5ЛJI T%h .i{H8x!k! [ȭvʩY7{6M>IfqtI5K]D2e+9MbyX|3;fh4:vD& >:FTq/s&|iҋns(Jw1]Jhkh:$SPp[A_K$o*m$Ivœ 7|h$1jEW>M4/#wHBm[Bu8jWgTgS$g%\^ B IYw~A5Fu,Ѐ̨*Gү3ÆB*93;m:TfaNⲍ{xFr%m]hP$5+Ɵn428$1i!}lUb*J>_c8PGճLbzENQ δgV3XM5M25Y^?,/?Ы^ >1ymww>/+MAɁ;}AB̓gApcH>6V>ܡfN9A`YOъ%j{(5ѿ_hR qj+M>#ݟoYeQD5+ ;6X VsX V11j$Vlt}R7^WX]_ymtK郷vmjuk^~Ψ^؄x6 ݥmq+'%qY4hG c7+nXʕ;rĩf>2o8A%U4n@q)S;t$) nHPC_uS߯{u&v]d_^bnVPt%Sɦ^]T}CoQZZSV'NT'`g˯05le|<9^)4/lGs]肩š.?*VDi x&<$sx$JuF7A> b*ׯ'XING\pYxi1#q F>=?o@*!G/hek%g(_}[qWdX:+hcNr'5eUZf>0]Pi1*5kE.r:n4L薢~F6x|ANELG(k<]`I`\\,>nx;Ė)Z PWi@(۔ADNHU:fQtZDPo2j7v | .PZ'Y`}MTT0v4u hcQ3MAڌԨ]C z(aV[x_ZrDM07[CiGr"twHLI ƪ HUű*k#kU7!] }~`P-YZLam8wHs9-**5FN& 8k4VtZ A?ӊBJOK'V],}N/rVSsZfBw(Iʷj6MS~;#l>WUf:mzWutJ=q A :GG!WY ݵDer4 ``dc5-uNG_Cif/T{k;%8qHa< } Ӕ5x COȤ?A{{|)ŘQ5pUi"kb҃bRjV g:l lqeqݢ&|›vBԧS/]5{惟>AR %V;g%"3Ƽ-2FֆJ^L((#˙vEdj|(S 0B ՟ q* .3 7P$X㣆.&UWC7UmkA7Cdlmb>Vk\@/Api KL85<[p3Fڬ/: 2=9:$={8(A>ZlWΦT1!$*p{kLɑݷi\kOg ^ p6D S7*߾HfT3׺u,OAK?Y Dȧ*c"q!zoTN#J%U4ƌ056o(^Ur{(lΡ6Z 6 QF :|LgTǠVq4 &aey"9ctƳc),)N~v(c$ uܨ>m5^?4Ag%PFjVxȇϥIJGO|y,&q"YS.;#؍ķYR|Jd$q!>J]0Uh!QF,-a!=%(Uؼ0D.iI&M/QLsk.REp{Q<- vǢFOz(G6* *ak/B*79 bN$D_-´0M]53\~s4LZk4Bt֣|ӻg\`*ӥUK~۞ #;B^mhgMi<zHH 5yv9YH;)t0+FnƯA2 PKduxp(PKЅUC4__MACOSX/._study_1457_split_library_seqs_and_mappingUX eR׼eRc`cg`b`MLVVP'! 0CBL@!.XPWXXWPo```hmjdfdid힟SadQ amdjlnhkbhfkjaaljX2>[PKPK ЅUC* @Astudy_1457_split_library_seqs_and_mapping/UXeR׼eRPK҅UCjm3 @Xstudy_1457_split_library_seqs_and_mapping/.DS_StoreUXмeRܼeRPK ۅUC @A{__MACOSX/UXeReRPK ۅUC3 @A__MACOSX/study_1457_split_library_seqs_and_mapping/UXeReRPK҅UC!(R> @__MACOSX/study_1457_split_library_seqs_and_mapping/._.DS_StoreUXмeRܼeRPKKB̷`CT @study_1457_split_library_seqs_and_mapping/study_1457_closed_reference_otu_table.biomUXQPKKB_ @F__MACOSX/study_1457_split_library_seqs_and_mapping/._study_1457_closed_reference_otu_table.biomUXQPK|KBduxp(E @Gstudy_1457_split_library_seqs_and_mapping/study_1457_mapping_file.txtUXeRQPKЅUC4 @gp__MACOSX/._study_1457_split_library_seqs_and_mappingUXeR׼eRPK uqphyloseq/inst/extdata/study_816_split_library_seqs_and_mapping.tar.gz0000644000175400017540000001157713175714136027322 0ustar00biocbuildbiocbuild]s8_SOUƲl^m9fS,ڢp1M DɔՕtϑ0N/w퍳E8Ln|:E4'qq^i8$_2.dӃW^{sX]7+E'[͆'񰪗-c=گITӗ3Rۖ;Olw"lOڹ DZoy⥖罴}8M5^j#yx7ӄ'rpZˬ=&N ph?aQjfRMazd lݦU &Mn9]GӾpi曬lOn|7=*\/:7qB؉vUcL[b̏_R8/5Y m$Hٌ/`b*&n^J8duDnѵ촋-:ݱ[w9o&W*)qHTtDU-ϧ7;ݴ+'tv'v|)Ez6ou_{i}{'߶~R뮔/=+n?7Nqp_*</)Ԕk=ٶC}>sAh,m`kaM`CsaE l3 ОdCjOq@IM9WSLz`h^/`./. 0OS'=8fkןY7 1;6k &?y>4YliiҌCc b~A-_6XSS'-6A0~4bP]m6`hۚqh3_;Cs|Dg[6Y=30]9w[J u6u 006|N+FڠD8hbd[mu 04\cC}`@ `߅0nm[ѓ=4`lQhm:/pm0c66иKTgɑ18 -l[٠\Ӣ:: 45-jLwmw6Z\"\sK# 06=yl<bs0(\ ɵ>#T Q#1j1Bl`7xYl;=M&7ʽ0kGG|л6?Hil1uj68CӾ!6[?EB`=riຼj'6 %J%D9!.un^4}GZbSFϗ=k}`hl˹лBG|#ų+ZӂQu/l14|!;w WP9+e@ЙМZ+sӵĀ{'P'/@ߡ?#^Fh2W!{T'#B4[H!{ `'\|o0ޢjfo!li\# % d-(&ٽ 04].4grp4ga@;\Ks5:\ GACz^ %kv0=s.G k*ƵFC;\C# LӦճk&v[QFXKCڏ۲. `azp*&A{\JXUA\L?y6ho"^Չ|>vm`hVDu8gg>s9-1pQbẮ ?N%4Su6l -בH,19^T~ gצ48IlOCm!/8fT7^pHnHng?rnpIn8jlym4j(μijnj~Z[Ost{Au̽at|~rZiײ܃4ge_V~2+Q~ZMkq~UlY&(V l`xƪM/>~'BzӢZѰ~oFvmR)w*Ln pث8 :9G??}2 n翫p߿ǫ0-^$KdJ9濅y´ǽ~hipv:u(yw@?wFǣ.{ipUY\4}=;gOUIt|_<>+ʟOgӢE4OA毛'ݭz<bppmՕ>uK[gp|(&iP?O&*~Qݿ]tr[[Y}ntS] _T\ǟ`Oك΀L|wb;G5i7kfۃ`9a\&EY}[΁g{^FqZ5eV #'ͧKʩ, ̊iy'22opne8I2 -bkě*4<:ܢBfEs+mGI>kƄ_4(Ju]eY&y4ϩ( i*%+ TzO,FƓ.%_xoYk NW.$d #5JM xwib"a}=[֠ AߤX#Z)ҝl}TkE-VLGeVӿ2VtWaWpXNR4EVNjKIкThQ'ij"h = p'zKBS_Pif'R"kL#کER&ḽFmMj67*W-PWZ'Uh 'AgGtDњIMu1-aff݆T9 %?¤&HFMװZ8}ۦV$fe͢u 7z:=ZGOgUInHLYTS]b_hhvі[~SOFg$:UTlM=6s=m|IX(,qtK8.‰.%6=xӠg?[AɨZ/bw׷M~*pwVB>a49_=[,}hS,fWz6B['lKb(?!S!vI0yvm='S\Sta$y6w̧mT 17DNxro%:ʤm݌ d|dl<t%LE^8s7My[98Mh޹.!Qg<"[ؓ}g;1Tޣ 3ATۤ>__l<b}qu\=y3чd缏 _ #F%鸞/^z6Q .gz>j'|:WǣN?ß0~:5dIyT&S.&Ś2F0Kw:}[:0S20X0K e3Θzf`O<2F@NY~@q@wf ̃5#%1{̞kz=w@Nɹ=/d{K&S9yf w#/}#nvY֌e*I@w}> ĐrG@ I8G 와=g*.Ue?|֘o :ʱr^FeY,Q5-P9od5s`X*id\66@w.sa3ugdy3- ]Nbr 6p6%y_H9o]c{ڐ8.w505ipZr &;`3wɁ]o`50)gH }0t7cO++ fzA>k``ߥ|AL ::@ ́y`3[pU\>9g r\pU/\ WT Le*8<%Y"RyMe`T^VN]cFNeט{>~|r2_s0s9163 8b;X><П#H9#?+8+ Geɠvbj'V{ZA-}^'@mA=-yh#σ8Aأb]^#c=3GCq"9\# ʟw0 z>$.UYuTe)K٭y e/8^=6zB)B:Gg/vw+]phZ@/] parNn$50k*X>_[:/ur ,e|f`FT2޺ЃnO*Oo,˸ӓE3j5[;\NpwDӗ9xG g˹_r~ ~%Wbi%9}ao`, r ˶&`b$H=(˼Nb(\?W"\KO0o#r&\ s" טySUQUѪg xVe)C+cQp_XV*RGTySUipZ_9RU.]g`*Qs =D 9!*_|*{@UAOU]iUC TUqWwܿVSUʜH8G:_b|UTy9 g _+ O(?'+##ܟPЋU5y{ xr,ty0/,$v!/^7hɣ_t&XoM>6Mj96zvm4/Gne9vѲhw7Jj+u+NW2f=7Xv[9,WMRAg^zd8ë+۷љ;NNzOti4[|KToh~{3\Lp̮G `jYLo^}.va=V?P|E™Sÿ{{ 7Bx8}ߴ3PKyBEz":sCstudy_816_split_library_seqs_and_mapping/study_816_mapping_file.txtmF?_ȟ.{hsԪI._,T`]X̂}JT)9ٷaf-^&qu/<(&XI&XqV=Gaa{+ ʂI0Ow;o0@]" |6C+fϞD0uϱlh:-$bS-Ǧnu?YHmݹ8|Di|1[L/)a: |>VZ7<$tɢy,˨H6:Q*n$ 5Ϸ.mBfY7i=Am69vvu zE^Mգ-]I {؅%)h4U,!FK$N)1l6!%$9 A;(re]a_teօ`q$;72Pqu"S\B!CMpDPL} uEǕT5+'xTqc=IKo*ϭ[ޕ+ң5cE1B p(b,jL/QTמu_$r09YLW/43 ].Pk@uT;mK\$FqA@jTnS("4i^UqI#T࣍3` %)vP1΁:7(c4`0M(m0CGsy.#D[݆/H= 9KIg8W%p:HSa oR))pR޴_#0>) YH Ky-o&6O qV46{3{E I3TIL ؆4׺[#u5'C;)c pN9v+~X}D#4 EmuA\[#cx!2UsN8@ŚlmԾp]^RPgG7Ɖt a&Ą9j1kVNz;ǶI6ss+`.Uӝ+ontMmbc~'ӚrF+sŵXR++v+7Kr$F1zH&1I$H|c;T$nն$fIlc3`FσQ~f E@YҌ` 3Lb&H<^DV$n(s8BP`3Lb&1I|"קnZ/%$/ J 'f3Lb&1t$T(ngĔ##bf1f3 bqDg%>7(m1I$f1LI>I`F0#oZwE1i0f3 S¸[L_3b3f3 c1d0;X(i½4_N3`F׿q86( z+m~0C c1Øa|2_hsbJŌb3`FwW~Y._f3 a0CC/PK yB)Astudy_816_split_library_seqs_and_mapping/PKyB6 [RGstudy_816_split_library_seqs_and_mapping/study_816_closed_reference_otu_table.biomPKyBEz":sCf study_816_split_library_seqs_and_mapping/study_816_mapping_file.txtPKHphyloseq/inst/extdata/study_gp.txt0000644000175400017540000000460613175714136020470 0ustar00biocbuildbiocbuild#SampleID Primer Final_Barcode Barcode_truncated_plus_T Barcode_full_length SampleType Description CL3 ILBC_01 AACGCA TGCGTT CTAGCGTGCGT Soil "Calhoun South Carolina Pine soil, pH 4.9" CC1 ILBC_02 AACTCG CGAGTT CATCGACGAGT Soil "Cedar Creek Minnesota, grassland, pH 6.1" SV1 ILBC_03 AACTGT ACAGTT GTACGCACAGT Soil "Sevilleta new Mexico, desert scrub, pH 8.3" M31Fcsw ILBC_04 AAGAGA TCTCTT TCGACATCTCT Feces "M3, Day 1, fecal swab, whole body study" M11Fcsw ILBC_05 AAGCTG CAGCTT CGACTGCAGCT Feces "M1, Day 1, fecal swab, whole body study " F11Fcsw ILBC_06 AATCAG CTGATT ACGAGACTGAT Feces "F1, Day 1, fecal swab, whole body study " M31Plmr ILBC_07 AATCGT ACGATT CGAGTCACGAT Skin "M3, Day 1, right palm, whole body study" M11Plmr ILBC_08 ACACAC GTGTGT GCCATAGTGTG Skin "M1, Day 1, right palm, whole body study " F21Plmr ILBC_09 ACACAT ATGTGT GTAGACATGTG Skin "F1, Day 1, right palm, whole body study " M31Tong ILBC_10 ACACGA TCGTGT TGTGGCTCGTG Tongue "M3, Day 1, tongue, whole body study " M11Tong ILBC_11 ACACGG CCGTGT TAGACACCGTG Tongue "M1, Day 1, tongue, whole body study " F11Tong ILBC_12 ACACTA TAGTGT CGGATCTAGTG Tongue "F1, Day 1, tongue, whole body study " LMEpi24M ILBC_13 ACACTG CAGTGT CATGAACAGTG Freshwater "Lake Mendota Minnesota, 24 meter epilimnion " SLEpi20M ILBC_15 ACAGAG CTCTGT AGCCGACTCTG Freshwater "Sparkling Lake Wisconsin, 20 meter eplimnion" AQC1cm ILBC_16 ACAGCA TGCTGT GACCACTGCTG Freshwater (creek) "Allequash Creek, 0-1cm depth" AQC4cm ILBC_17 ACAGCT AGCTGT CAAGCTAGCTG Freshwater (creek) "Allequash Creek, 3-4 cm depth" AQC7cm ILBC_18 ACAGTG CACTGT ATGAAGCACTG Freshwater (creek) "Allequash Creek, 6-7 cm depth" NP2 ILBC_19 ACAGTT AACTGT TCGCGCAACTG Ocean "Newport Pier, CA surface water, Time 1" NP3 ILBC_20 ACATCA TGATGT GCTAAGTGATG Ocean "Newport Pier, CA surface water, Time 2" NP5 ILBC_21 ACATGA TCATGT GAACGATCATG Ocean "Newport Pier, CA surface water, Time 3" TRRsed1 ILBC_22 ACATGT ACATGT CACGTGACATG Sediment (estuary) "Tijuana River Reserve, depth 1" TRRsed2 ILBC_23 ACATTC GAATGT TGCGCTGAATG Sediment (estuary) "Tijuana River Reserve, depth 2" TRRsed3 ILBC_24 ACCACA TGTGGT GATGTATGTGG Sediment (estuary) "Tijuana River Reserve, depth 2" TS28 ILBC_25 ACCAGA TCTGGT GCATCGTCTGG Feces Twin #1 TS29 ILBC_26 ACCAGC GCTGGT CTAGTCGCTGG Feces Twin #2 Even1 ILBC_27 ACCGCA TGCGGT TGACTCTGCGG Mock Even1 Even2 ILBC_28 ACCTCG CGAGGT TCTGATCGAGG Mock Even2 Even3 ILBC_29 ACCTGT ACAGGT AGAGAGACAGG Mock Even3phyloseq/inst/extdata/usearch.uc0000644000175400017540000002753713175714136020064 0ustar00biocbuildbiocbuildH 320 211 99.5 - 0 0 257I211M971I D21.a.393001_3 FYIZYI001CNZEI orig_bc=ACATACGCGT new_bc=ACATACGCGT bc_diffs=0 4416570 H 416 211 97.6 - 0 0 320I211M1022I D21.5n.392974_5 FYIZYI001CTYEF orig_bc=TCGTCGCTCG new_bc=TCGTCGCTCG bc_diffs=0 4480244 H 424 211 99.1 - 0 0 247I81MI130M962I D11.b.392956_4 FYIZYI001EQ4DZ orig_bc=ATATCGCGAG new_bc=ATATCGCGAG bc_diffs=0 4483037 H 354 211 98.6 - 0 0 295I211M889I D18.6m.393070_9 FYIZYI001CKKSP orig_bc=TGTACTACTC new_bc=TGTACTACTC bc_diffs=0 4449518 H 420 211 97.2 - 0 0 286I172MD38M997I D20.393127_12 FYIZYI001CGO3M orig_bc=TAGAGACGAG new_bc=TAGAGACGAG bc_diffs=0 4481359 H 428 211 98.6 - 0 0 254I211M944I D27.393075_13 FYIZYI001CQWMO orig_bc=CAGTAGACGT new_bc=CAGTAGACGT bc_diffs=0 4484111 H 236 211 100.0 - 0 0 251I211M986I D13.5n.393036_15 FYIZYI001BLMDT orig_bc=CTCGCGTGTC new_bc=CTCGCGTGTC bc_diffs=0 4226619 H 419 211 98.6 - 0 0 253I211M959I D2.393107_21 FYIZYI001CNI99 orig_bc=TACTCTCGTG new_bc=TACTCTCGTG bc_diffs=0 4481131 H 297 211 100.0 - 0 0 283I211M933I D19.a.393146_19 FYIZYI001C0CZP orig_bc=CGTAGACTAG new_bc=CGTAGACTAG bc_diffs=0 4381553 H 402 211 97.2 - 0 0 262I177MI34M965I D31.393093_22 FYIZYI001BNJ2B orig_bc=TACGCTGTCT new_bc=TACGCTGTCT bc_diffs=0 4475642 H 296 211 99.1 - 0 0 240I211M970I D13.a.393151_27 FYIZYI001EYIF0 orig_bc=TAGTATCAGC new_bc=TAGTATCAGC bc_diffs=0 4381430 H 354 211 98.1 - 0 0 294I9MI202M889I D10.b.393074_24 FYIZYI001BY1Z0 orig_bc=AGCACTGTAG new_bc=AGCACTGTAG bc_diffs=0 4449518 N * * * . * * * D15.b.393025_8 FYIZYI001BLWUY orig_bc=CGAGAGATAC new_bc=CGAGAGATAC bc_diffs=0 * N * * * . * * * D19.b.393086_17 FYIZYI001BNM56 orig_bc=TACGAGTATG new_bc=TACGAGTATG bc_diffs=0 * H 417 211 99.1 - 0 0 262I160MI51M969I D19.a.393146_25 FYIZYI001EKPWO orig_bc=CGTAGACTAG new_bc=CGTAGACTAG bc_diffs=0 4480359 N * * * . * * * D11.b.392956_23 FYIZYI001EQLMG orig_bc=ATATCGCGAG new_bc=ATATCGCGAG bc_diffs=0 * H 421 211 98.6 - 0 0 262I211M957I D10.5n.393082_28 FYIZYI001C0C4Q orig_bc=ACGCTCGACA new_bc=ACGCTCGACA bc_diffs=0 4481719 H 377 211 99.5 - 0 0 257I211M977I D2.393107_30 FYIZYI001D191N orig_bc=TACTCTCGTG new_bc=TACTCTCGTG bc_diffs=0 4463709 H 428 211 97.7 - 0 0 253I102MI30MI41MD37M944I D15.5n.393148_31 FYIZYI001CPTB3 orig_bc=TACTGAGCTA new_bc=TACTGAGCTA bc_diffs=0 4484111 H 424 211 100.0 - 0 0 248I211M962I D16.b.393030_32 FYIZYI001ELLNF orig_bc=TCACGTACTA new_bc=TCACGTACTA bc_diffs=0 4483037 H 388 211 99.5 - 0 0 281I211M944I D17.392970_33 FYIZYI001E1URB orig_bc=CGTCTAGTAC new_bc=CGTCTAGTAC bc_diffs=0 4468234 H 419 211 98.6 - 0 0 253I211M959I D1.393095_34 FYIZYI001BP0UJ orig_bc=ACGAGTGCGT new_bc=ACGAGTGCGT bc_diffs=0 4481131 H 419 211 97.6 - 0 0 255I68MD8MD133M959I D13.a.393151_35 FYIZYI001EP8YM orig_bc=TAGTATCAGC new_bc=TAGTATCAGC bc_diffs=0 4481131 H 297 211 99.5 - 0 0 284I8MD202M933I D26.392975_47 FYIZYI001EYIA0 orig_bc=CACGCTACGT new_bc=CACGCTACGT bc_diffs=0 4381553 H 419 211 98.6 - 0 0 255I77MD17MD115M959I D2.393107_40 FYIZYI001C79G7 orig_bc=TACTCTCGTG new_bc=TACTCTCGTG bc_diffs=0 4481131 H 421 211 99.1 - 0 0 262I211M957I D23.392960_44 FYIZYI001C0F4N orig_bc=AGACTATACT new_bc=AGACTATACT bc_diffs=0 4481719 N * * * . * * * D18.6m.393070_6 FYIZYI001BSDZT orig_bc=TGTACTACTC new_bc=TGTACTACTC bc_diffs=0 * H 388 211 100.0 - 0 0 281I211M944I D11.a.392963_48 FYIZYI001EVLXY orig_bc=ATCAGACACG new_bc=ATCAGACACG bc_diffs=0 4468234 H 428 211 98.1 - 0 0 255I173MD37M944I D16.a.393131_38 FYIZYI001EF2LA orig_bc=ATACGACGTA new_bc=ATACGACGTA bc_diffs=0 4484111 H 315 211 97.2 - 0 0 248I160MI51M986I D15.5n.393148_36 FYIZYI001CPH7M orig_bc=TACTGAGCTA new_bc=TACTGAGCTA bc_diffs=0 4412540 H 419 211 98.6 - 0 0 253I211M959I D21.a.393001_54 FYIZYI001CFHC4 orig_bc=ACATACGCGT new_bc=ACATACGCGT bc_diffs=0 4481131 H 180 211 97.6 - 0 0 226I75MD95MD39M952I D2.393107_49 FYIZYI001B14Y3 orig_bc=TACTCTCGTG new_bc=TACTCTCGTG bc_diffs=0 2232355 H 354 211 98.6 - 0 0 295I211M889I D21.b.393031_50 FYIZYI001E0FZ4 orig_bc=ACGCGAGTAT new_bc=ACGCGAGTAT bc_diffs=0 4449518 H 200 211 98.1 - 0 0 269I177MI34M954I D21.5n.392974_53 FYIZYI001ERQIR orig_bc=TCGTCGCTCG new_bc=TCGTCGCTCG bc_diffs=0 3154070 H 337 211 98.6 - 0 0 244I51MD26MD19MI113M973I D24.393019_55 FYIZYI001CNZ0K orig_bc=AGTACGCTAT new_bc=AGTACGCTAT bc_diffs=0 4437368 H 424 211 99.5 - 0 0 249I77MD133M962I D19.b.393086_52 FYIZYI001ES8M6 orig_bc=TACGAGTATG new_bc=TACGAGTATG bc_diffs=0 4483037 N * * * . * * * D12.392988_51 FYIZYI001EYE44 orig_bc=CGTGTCTCTA new_bc=CGTGTCTCTA bc_diffs=0 * H 421 211 99.1 - 0 0 262I211M957I D21.a.393001_58 FYIZYI001B7A6L orig_bc=ACATACGCGT new_bc=ACATACGCGT bc_diffs=0 4481719 H 350 211 98.1 - 0 0 269I177MI34M956I D15.b.393025_57 FYIZYI001EX2HO orig_bc=CGAGAGATAC new_bc=CGAGAGATAC bc_diffs=0 4447950 H 272 211 99.1 - 0 0 281I211M877I D16.a.393131_63 FYIZYI001B319H orig_bc=ATACGACGTA new_bc=ATACGACGTA bc_diffs=0 619817 H 52 211 99.1 - 0 0 261I211M1008I D11.a.392963_62 FYIZYI001D7ZJ9 orig_bc=ATCAGACACG new_bc=ATCAGACACG bc_diffs=0 269386 H 350 211 97.6 - 0 0 269I177MI34M956I D17.392970_60 FYIZYI001CQCCL orig_bc=CGTCTAGTAC new_bc=CGTCTAGTAC bc_diffs=0 4447950 H 419 211 98.6 - 0 0 253I211M959I D3.393129_66 FYIZYI001CGPI0 orig_bc=TACACGTGAT new_bc=TACACGTGAT bc_diffs=0 4481131 N * * * . * * * D21.5n.392974_43 FYIZYI001B1B5X orig_bc=TCGTCGCTCG new_bc=TCGTCGCTCG bc_diffs=0 * H 419 211 98.6 - 0 0 253I211M959I D22.5n.393054_72 FYIZYI001B41NB orig_bc=ACTGTACAGT new_bc=ACTGTACAGT bc_diffs=0 4481131 H 121 211 99.1 - 0 0 262I90MD86MI34M895I D21.a.393001_64 FYIZYI001C6RLV orig_bc=ACATACGCGT new_bc=ACATACGCGT bc_diffs=0 174337 H 121 211 99.1 - 0 0 262I90MD86MI34M895I D22.393118_67 FYIZYI001BV2N4 orig_bc=ACTACTATGT new_bc=ACTACTATGT bc_diffs=0 174337 H 67 211 98.6 - 0 0 293I211M992I D18.6m.393070_70 FYIZYI001EWXE9 orig_bc=TGTACTACTC new_bc=TGTACTACTC bc_diffs=0 215097 H 276 211 99.5 - 0 0 282I143MI68M933I D22.393118_59 FYIZYI001CVL1U orig_bc=ACTACTATGT new_bc=ACTACTATGT bc_diffs=0 4358723 H 118 211 99.5 - 0 0 284I211M894I D20.393127_79 FYIZYI001CMKWC orig_bc=TAGAGACGAG new_bc=TAGAGACGAG bc_diffs=0 175279 H 121 211 99.5 - 0 0 261I177MI34M895I D2.393107_74 FYIZYI001E0128 orig_bc=TACTCTCGTG new_bc=TACTCTCGTG bc_diffs=0 174337 H 424 211 100.0 - 0 0 248I211M962I D19.a.393146_78 FYIZYI001ECT9S orig_bc=CGTAGACTAG new_bc=CGTAGACTAG bc_diffs=0 4483037 H 350 211 98.1 - 0 0 269I177MI34M956I D13.a.393151_73 FYIZYI001BPHT0 orig_bc=TAGTATCAGC new_bc=TAGTATCAGC bc_diffs=0 4447950 H 350 211 97.7 - 0 0 268I144MI26MI41M956I D13.b.393109_77 FYIZYI001CIMAS orig_bc=TCTCTATGCG new_bc=TCTCTATGCG bc_diffs=0 4447950 H 307 211 98.6 - 0 0 276I10MD166MI34M954I D15.a.392972_76 FYIZYI001CXV9P orig_bc=CATAGTAGTG new_bc=CATAGTAGTG bc_diffs=0 4401375 H 379 211 100.0 - 0 0 256I211M896I D1.393095_84 FYIZYI001CU1AD orig_bc=ACGAGTGCGT new_bc=ACGAGTGCGT bc_diffs=0 4465746 H 388 211 100.0 - 0 0 281I211M944I D21.5n.392974_80 FYIZYI001EX5NI orig_bc=TCGTCGCTCG new_bc=TCGTCGCTCG bc_diffs=0 4468234 H 352 211 97.6 - 0 0 265I211M962I D29.393071_87 FYIZYI001CNMM0 orig_bc=TACACACACT new_bc=TACACACACT bc_diffs=0 4448492 H 421 211 98.6 - 0 0 262I211M957I D14.393072_81 FYIZYI001B1IQ2 orig_bc=TGATACGTCT new_bc=TGATACGTCT bc_diffs=0 4481719 H 354 211 98.1 - 0 0 294I9MI202M889I D22.393118_83 FYIZYI001B40WY orig_bc=ACTACTATGT new_bc=ACTACTATGT bc_diffs=0 4449518 H 121 211 99.5 - 0 0 261I177MI34M895I D27.393075_82 FYIZYI001CEE2P orig_bc=CAGTAGACGT new_bc=CAGTAGACGT bc_diffs=0 174337 H 121 211 99.1 - 0 0 261I177MI34M895I D26.392975_89 FYIZYI001EWXH6 orig_bc=CACGCTACGT new_bc=CACGCTACGT bc_diffs=0 174337 H 350 211 98.1 - 0 0 269I177MI34M956I D10.5n.393082_86 FYIZYI001EZG8Q orig_bc=ACGCTCGACA new_bc=ACGCTCGACA bc_diffs=0 4447950 H 297 211 97.2 - 0 0 280I12MI132MI42MI25M933I D10.b.393074_85 FYIZYI001CW3N2 orig_bc=AGCACTGTAG new_bc=AGCACTGTAG bc_diffs=0 4381553 H 388 211 100.0 - 0 0 281I211M944I D20.393127_93 FYIZYI001B06HR orig_bc=TAGAGACGAG new_bc=TAGAGACGAG bc_diffs=0 4468234 H 67 211 99.1 - 0 0 293I211M992I D26.392975_91 FYIZYI001E2TAL orig_bc=CACGCTACGT new_bc=CACGCTACGT bc_diffs=0 215097 H 421 211 98.6 - 0 0 262I211M957I D16.b.393030_90 FYIZYI001DLIP0 orig_bc=TTACGTACTA new_bc=TCACGTACTA bc_diffs=1 4481719 H 388 211 100.0 - 0 0 281I211M944I D19.b.393086_98 FYIZYI001B020X orig_bc=TACGAGTATG new_bc=TACGAGTATG bc_diffs=0 4468234 H 379 211 99.5 - 0 0 255I201MI10M896I D12.392988_99 FYIZYI001EY4UF orig_bc=CGTGTCTCTA new_bc=CGTGTCTCTA bc_diffs=0 4465746 H 246 211 97.6 - 0 0 273I77MD133M1000I D19.a.393146_95 FYIZYI001B0J90 orig_bc=CGTAGACTAG new_bc=CGTAGACTAG bc_diffs=0 4308637 H 354 211 98.6 - 0 0 295I211M889I D19.a.393146_97 FYIZYI001CTYTS orig_bc=CGTAGACTAG new_bc=CGTAGACTAG bc_diffs=0 4449518 H 350 211 98.1 - 0 0 269I177MI34M956I D22.5n.393054_96 FYIZYI001EPS5M orig_bc=ACTGTACAGT new_bc=ACTGTACAGT bc_diffs=0 4447950 H 428 211 97.2 - 0 0 255I173MD37M944I D13.5n.393036_100 FYIZYI001E1HSI orig_bc=CTCGCGTGTC new_bc=CTCGCGTGTC bc_diffs=0 4484111 H 419 211 98.6 - 0 0 253I211M959I D30.392996_94 FYIZYI001CZLJH orig_bc=TACAGATCGT new_bc=TACAGATCGT bc_diffs=0 4481131 H 421 211 97.6 - 0 0 264I7MD168MD34M957I D14.393072_103 FYIZYI001CUDP6 orig_bc=TGATACGTCT new_bc=TGATACGTCT bc_diffs=0 4481719 H 354 211 98.6 - 0 0 295I211M889I D13.5n.393036_108 FYIZYI001CEUZ0 orig_bc=CTCGCGTGTC new_bc=CTCGCGTGTC bc_diffs=0 4449518 H 121 211 99.1 - 0 0 262I90MD86MI34M895I D31.393093_109 FYIZYI001B0AY7 orig_bc=TACGCTGTCT new_bc=TACGCTGTCT bc_diffs=0 174337 H 322 211 99.5 - 0 0 218I176MI35M950I D19.a.393146_106 FYIZYI001EC6BS orig_bc=CGTAGACTAG new_bc=CGTAGACTAG bc_diffs=0 4416951 H 388 211 99.1 - 0 0 279I144MI42MI25M944I D18.6m.393070_102 FYIZYI001CZX37 orig_bc=TGTACTACTC new_bc=TGTACTACTC bc_diffs=0 4468234 H 421 211 99.1 - 0 0 262I211M957I D22.5n.393054_111 FYIZYI001EY7NF orig_bc=ACTGTACAGT new_bc=ACTGTACAGT bc_diffs=0 4481719 H 419 211 98.6 - 0 0 253I211M959I D13.b.393109_110 FYIZYI001CQ5AR orig_bc=TCTCTATGCG new_bc=TCTCTATGCG bc_diffs=0 4481131 H 417 211 99.1 - 0 0 261I142MI15MI54M969I D10.5n.393082_113 FYIZYI001CQG96 orig_bc=ACGCTCGACA new_bc=ACGCTCGACA bc_diffs=0 4480359 H 348 211 99.1 - 0 0 267I144MI30MI37M962I D14.393072_112 FYIZYI001AZNVD orig_bc=TGATACGTCT new_bc=TGATACGTCT bc_diffs=0 4446898 H 388 211 100.0 - 0 0 281I211M944I D21.5n.392974_116 FYIZYI001EZT0I orig_bc=TCGTCGCTCG new_bc=TCGTCGCTCG bc_diffs=0 4468234 N * * * . * * * D13.5n.393036_101 FYIZYI001AJUVV orig_bc=CTCGCGTGTC new_bc=CTCGCGTGTC bc_diffs=0 * H 421 211 98.6 - 0 0 261I143MI68M957I D14.393072_114 FYIZYI001BZEMP orig_bc=TGATACGTCT new_bc=TGATACGTCT bc_diffs=0 4481719 H 297 211 100.0 - 0 0 283I211M933I D10.a.393084_120 FYIZYI001BWLI0 orig_bc=AGACGCACTC new_bc=AGACGCACTC bc_diffs=0 4381553 H 388 211 100.0 - 0 0 281I211M944I D11.a.392963_122 FYIZYI001CPM06 orig_bc=ATCAGACACG new_bc=ATCAGACACG bc_diffs=0 4468234 H 420 211 97.2 - 0 0 286I172MD38M997I D13.b.393109_119 FYIZYI001EFI76 orig_bc=TCTCTATGCG new_bc=TCTCTATGCG bc_diffs=0 4481359 H 419 211 98.6 - 0 0 253I211M959I D1.393095_127 FYIZYI001C7QWM orig_bc=ACGAGTGCGT new_bc=ACGAGTGCGT bc_diffs=0 4481131 H 421 211 99.1 - 0 0 262I211M957I D28.393022_124 FYIZYI001D0O24 orig_bc=CGACGTGACT new_bc=CGACGTGACT bc_diffs=0 4481719 H 388 211 100.0 - 0 0 281I211M944I D11.a.392963_126 FYIZYI001C17CY orig_bc=ATCAGACACG new_bc=ATCAGACACG bc_diffs=0 4468234 H 421 211 99.1 - 0 0 262I211M957I D24.393019_128 FYIZYI001CW7C8 orig_bc=AGTACGCTAT new_bc=AGTACGCTAT bc_diffs=0 4481719 H 261 211 99.1 - 0 0 261I211M981I D21.a.393001_132 FYIZYI001DWUG5 orig_bc=ACATACGCGT new_bc=ACATACGCGT bc_diffs=0 4331364 H 388 211 100.0 - 0 0 281I211M944I D3.393129_130 FYIZYI001EX2KV orig_bc=TACACGTGAT new_bc=TACACGTGAT bc_diffs=0 4468234 H 320 211 97.6 - 0 0 257I211M971I D21.5n.392974_134 FYIZYI001DFZEH orig_bc=TCGTCGCTCG new_bc=TCGTCGCTCG bc_diffs=0 4416570 H 276 211 99.5 - 0 0 282I143MI68M933I D30.392996_125 FYIZYI001CAW20 orig_bc=TACAGATCGT new_bc=TACAGATCGT bc_diffs=0 4358723 H 350 211 98.1 - 0 0 269I177MI34M956I D13.b.393109_131 FYIZYI001EDVLU orig_bc=TCTCTATGCG new_bc=TCTCTATGCG bc_diffs=0 4447950 H 354 211 98.6 - 0 0 295I211M889I D19.5n.393000_136 FYIZYI001COL2A orig_bc=ACGACTACAG new_bc=ACGACTACAG bc_diffs=0 4449518 H 388 211 100.0 - 0 0 281I211M944I D28.393022_140 FYIZYI001CXW17 orig_bc=CGACGTGACT new_bc=CGACGTGACT bc_diffs=0 4468234 phyloseq/inst/scripts/0000755000175400017540000000000013175714136016120 5ustar00biocbuildbiocbuildphyloseq/inst/scripts/installer.R0000644000175400017540000000340613175714136020243 0ustar00biocbuildbiocbuild############################## # An example function for installing phyloseq from various sources ############################## install_phyloseq = function(branch = "release", minRVersion = "3.3.0", verbose = TRUE){ if(!compareVersion(as.character(getRversion()), minRVersion) >=0){ stop("phyloseq installation script failed.\n", "R ", minRVersion, " or greater is required.") } branch <- as.character(branch) if(branch == "release"){ if(verbose){ message("Installing the release version from BioC") } source("http://bioconductor.org/biocLite.R") biocLite("phyloseq", suppressUpdates=TRUE) return("phyloseq installed from BioC release branch (if no errors).") } if(branch == "devel"){ if(verbose){ message("\n\nInstalling phyloseq from the devel version from BioC...\n") } biocLite("phyloseq", siteRepos="http://bioconductor.org/packages/devel/bioc", suppressUpdates=TRUE, type="source") return("phyloseq installed from BioC devel branch (if no errors).") } if(branch == "github"){ if(verbose){ message("Installing the devel version from joey711/master from GitHub") } if(!require("devtools", quietly=TRUE)){ # Note: needs Curl for RCurl install.packages("devtools") } library("devtools") devtools::install_github("joey711/phyloseq") return("phyloseq installed from GitHub `joey711/phyloseq` (if no errors).") } return("You probably selected an unsupported argument to `branch`. Try again using 'release', 'devel', or 'github'.") } ############### # Execute the function w/ default params. # You can select alternatives if you want :-) ############### install_phyloseq() phyloseq/man/0000755000175400017540000000000013177706002014222 5ustar00biocbuildbiocbuildphyloseq/man/DPCoA.Rd0000644000175400017540000000660213177706002015403 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/ordination-methods.R \name{DPCoA} \alias{DPCoA} \title{Calculate Double Principle Coordinate Analysis (DPCoA) using phylogenetic distance} \usage{ DPCoA(physeq, correction = cailliez, scannf = FALSE, ...) } \arguments{ \item{physeq}{(Required). A \code{\link{phyloseq-class}} object containing, at a minimum, abundance (\code{\link{otu_table-class}}) and phylogenetic (\code{\link[ape]{phylo}}) components. As a test, the accessors \code{\link{otu_table}} and \code{\link{phy_tree}} should return an object without error.} \item{correction}{(Optional). A function. The function must be able to take a non-Euclidean \code{\link{dist}}ance object, and return a new \code{dist}ance object that is Euclidean. If testing a distance object, try \code{\link[ade4]{is.euclid}}. Although the distance matrix should always be Euclidean, for numerical reasons it will sometimes appear non-Euclidean and a correction method must be applied. Two recommended correction methods are \code{\link[ade4]{cailliez}} and \code{\link[ade4]{lingoes}}. The default is \code{cailliez}, but not for any particularly special reason. If the distance matrix is Euclidian, no correction will be performed, regardless of the value of the \code{correction} argument.} \item{scannf}{(Optional). Logical. Default is \code{FALSE}. This is passed directly to \code{\link[ade4]{dpcoa}}, and causes a barplot of eigenvalues to be created if \code{TRUE}. This is not included in \code{...} because the default for \code{\link[ade4]{dpcoa}} is \code{TRUE}, although in many expected situations we would want to suppress creating the barplot.} \item{...}{Additional arguments passed to \code{\link[ade4]{dpcoa}}.} } \value{ A \code{dpcoa}-class object (see \code{\link[ade4]{dpcoa}}). } \description{ Function uses abundance (\code{\link{otu_table-class}}) and phylogenetic (\code{\link[ape]{phylo}}) components of a \code{\link{phyloseq-class}} experiment-level object to perform a Double Principle Coordinate Analysis (DPCoA), relying heavily on the underlying (and more general) function, \code{\link[ade4]{dpcoa}}. The distance object ultimately provided is the square root of the cophenetic/patristic (\code{\link[ape]{cophenetic.phylo}}) distance between the species, which is always Euclidean. Although this distance is Euclidean, for numerical reasons it will sometimes look non-Euclidean, and a correction will be performed. See \code{correction} argument. } \examples{ # # # # # # Esophagus data(esophagus) eso.dpcoa <- DPCoA(esophagus) eso.dpcoa plot_ordination(esophagus, eso.dpcoa, "samples") plot_ordination(esophagus, eso.dpcoa, "species") plot_ordination(esophagus, eso.dpcoa, "biplot") # # # # # # # # GlobalPatterns data(GlobalPatterns) # subset GP to top-150 taxa (to save computation time in example) keepTaxa <- names(sort(taxa_sums(GlobalPatterns), TRUE)[1:150]) GP <- prune_taxa(keepTaxa, GlobalPatterns) # Perform DPCoA GP.dpcoa <- DPCoA(GP) plot_ordination(GP, GP.dpcoa, color="SampleType") } \references{ Pavoine, S., Dufour, A.B. and Chessel, D. (2004) From dissimilarities among species to dissimilarities among communities: a double principal coordinate analysis. Journal of Theoretical Biology, 228, 523-537. } \seealso{ \code{\link[ade4]{dpcoa}} } \author{ Julia Fukuyama \email{julia.fukuyama@gmail.com}. Adapted for phyloseq by Paul J. McMurdie. } phyloseq/man/JSD.Rd0000644000175400017540000000405713177706002015137 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/distance-methods.R \name{JSD} \alias{JSD} \title{Calculate the Jensen-Shannon Divergence (distance)} \usage{ JSD(physeq) } \arguments{ \item{physeq}{(Required). \code{\link{phyloseq-class}}. The phyloseq data on which to compute the pairwise sample distance matrix.} } \value{ An object of class ``\code{\link{dist}}'' suitable for certain ordination methods and other distance-based analyses. See \code{\link{distance}}. } \description{ This is a phyloseq-specific implementation of the Jensen-Shannon Divergence for comparing pairs of microbial communities (samples) in an experiment. The expectation is that you have many samples (say. more than two) and you want a distance matrix on which will perform further analysis. \code{JSD} is intended to be ``wrapped'' by the more general \code{\link{distance}} function in phyloseq, and it can be invoked using \code{"jsd"} as the argument to the \code{method} parameter of \code{\link{distance}}. } \details{ One of the motivations for providing JSD in phyloseq was its recent use in the analysis of the \code{\link{enterotype}} dataset. } \examples{ # library(doParallel) # Do this and next line only if you have multi-cores # registerDoParallel(cores=6) # data(enterotype) # # ent.jsd <- JSD(enterotype, TRUE) # internal only # ent.jsd <- distance(enterotype, "jsd", parallel=TRUE) # ent.PCoA <- ordinate(enterotype, "PCoA", ent.jsd) # Perform principle coordinate analysis # p <- plot_ordination(enterotype, ent.PCoA, color="Enterotype", shape="SeqTech") # (p <- p + geom_point(size=5, alpha=0.5)) } \references{ Jensen-Shannon Divergence and Hilbert space embedding. Bent Fuglede and Flemming Topsoe University of Copenhagen, Department of Mathematics \url{http://www.math.ku.dk/~topsoe/ISIT2004JSD.pdf} } \seealso{ \code{\link{distance}} \code{\link{enterotype}} \url{http://en.wikipedia.org/wiki/Jensen-Shannon_divergence} } \author{ Susan Holmes \email{susan@stat.stanford.edu}. Adapted for phyloseq by Paul J. McMurdie. } \keyword{internal} phyloseq/man/UniFrac-methods.Rd0000644000175400017540000001757013177706002017513 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/distance-methods.R \docType{methods} \name{UniFrac} \alias{UniFrac} \alias{UniFrac,phyloseq-method} \title{Calculate weighted or unweighted (Fast) UniFrac distance for all sample pairs.} \usage{ UniFrac(physeq, weighted=FALSE, normalized=TRUE, parallel=FALSE, fast=TRUE) \S4method{UniFrac}{phyloseq}(physeq, weighted = FALSE, normalized = TRUE, parallel = FALSE, fast = TRUE) } \arguments{ \item{physeq}{(Required). \code{\link{phyloseq-class}}, containing at minimum a phylogenetic tree (\code{\link{phylo-class}}) and contingency table (\code{\link{otu_table-class}}). See examples below for coercions that might be necessary.} \item{weighted}{(Optional). Logical. Should use weighted-UniFrac calculation? Weighted-UniFrac takes into account the relative abundance of species/taxa shared between samples, whereas unweighted-UniFrac only considers presence/absence. Default is \code{FALSE}, meaning the unweighted-UniFrac distance is calculated for all pairs of samples.} \item{normalized}{(Optional). Logical. Should the output be normalized such that values range from 0 to 1 independent of branch length values? Default is \code{TRUE}. Note that (unweighted) \code{UniFrac} is always normalized by total branch-length, and so this value is ignored when \code{weighted == FALSE}.} \item{parallel}{(Optional). Logical. Should execute calculation in parallel, using multiple CPU cores simultaneously? This can dramatically hasten the computation time for this function. However, it also requires that the user has registered a parallel ``backend'' prior to calling this function. Default is \code{FALSE}. If FALSE, UniFrac will register a serial backend so that \code{foreach::\%dopar\%} does not throw a warning.} \item{fast}{(Optional). Logical. DEPRECATED. Do you want to use the ``Fast UniFrac'' algorithm? Implemented natively in the \code{phyloseq-package}. \code{TRUE} is now the only supported option. There should be no difference in the output between the two algorithms. Moreover, the original UniFrac algorithm only outperforms this implementation of fast-UniFrac if the datasets are so small (approximated by the value of \code{ntaxa(physeq) * nsamples(physeq)}) that the difference in time is inconsequential (less than 1 second). In practice it does not appear that this parameter should have ever been set to \code{FALSE}, and therefore the original UniFrac implementation perhaps never should have been supported here. For legacy code support the option is now deprecated here (the implementation was an internal function, anyway) and the \code{fast} option will remain for one release cycle before being removed completely in order to avoid causing unsupported-argument errors.} } \value{ a sample-by-sample distance matrix, suitable for NMDS, etc. } \description{ This function calculates the (Fast) UniFrac distance for all sample-pairs in a \code{\link{phyloseq-class}} object. } \details{ \code{UniFrac()} accesses the abundance (\code{\link{otu_table-class}}) and a phylogenetic tree (\code{\link{phylo-class}}) data within an experiment-level (\code{\link{phyloseq-class}}) object. If the tree and contingency table are separate objects, suggested solution is to combine them into an experiment-level class using the \code{\link{phyloseq}} function. For example, the following code \code{phyloseq(myotu_table, myTree)} returns a \code{phyloseq}-class object that has been pruned and comprises the minimum arguments necessary for \code{UniFrac()}. Parallelization is possible for UniFrac calculated with the \code{\link{phyloseq-package}}, and is encouraged in the instances of large trees, many samples, or both. Parallelization has been implemented via the \code{\link{foreach-package}}. This means that parallel calls need to be preceded by 2 or more commands that register the parallel ``backend''. This is acheived via your choice of helper packages. One of the simplest seems to be the \emph{doParallel} package. For more information, see the following links on registering the ``backend'': \emph{foreach} package manual: \url{http://cran.r-project.org/web/packages/foreach/index.html} Notes on parallel computing in \code{R}. Skip to the section describing the \emph{foreach Framework}. It gives off-the-shelf examples for registering a parallel backend using the \emph{doMC}, \emph{doSNOW}, or \emph{doMPI} packages: \url{http://trg.apbionet.org/euasiagrid/docs/parallelR.notes.pdf} Furthermore, as of \code{R} version \code{2.14.0} and higher, a parallel package is included as part of the core installation, \code{\link{parallel-package}}, and this can be used as the parallel backend with the \code{\link{foreach-package}} using the adaptor package ``doParallel''. \url{http://cran.r-project.org/web/packages/doParallel/index.html} See the vignette for some simple examples for using doParallel. \url{http://cran.r-project.org/web/packages/doParallel/vignettes/gettingstartedParallel.pdf} UniFrac-specific examples for doParallel are provided in the example code below. } \examples{ ################################################################################ # Perform UniFrac on esophagus data ################################################################################ data("esophagus") (y <- UniFrac(esophagus, TRUE)) UniFrac(esophagus, TRUE, FALSE) UniFrac(esophagus, FALSE) # ################################################################################ # # Now try a parallel implementation using doParallel, which leverages the # # new 'parallel' core package in R 2.14.0+ # # Note that simply loading the 'doParallel' package is not enough, you must # # call a function that registers the backend. In general, this is pretty easy # # with the 'doParallel package' (or one of the alternative 'do*' packages) # # # # Also note that the esophagus example has only 3 samples, and a relatively small # # tree. This is fast to calculate even sequentially and does not warrant # # parallelized computation, but provides a good quick example for using UniFrac() # # in a parallel fashion. The number of cores you should specify during the # # backend registration, using registerDoParallel(), depends on your system and # # needs. 3 is chosen here for convenience. If your system has only 2 cores, this # # will probably fault or run slower than necessary. # ################################################################################ # library(doParallel) # data(esophagus) # # For SNOW-like functionality (works on Windows): # cl <- makeCluster(3) # registerDoParallel(cl) # UniFrac(esophagus, TRUE) # # Force to sequential backed: # registerDoSEQ() # # For multicore-like functionality (will probably not work on windows), # # register the backend like this: # registerDoParallel(cores=3) # UniFrac(esophagus, TRUE) ################################################################################ } \references{ \url{http://bmf.colorado.edu/unifrac/} The main implementation (Fast UniFrac) is adapted from the algorithm's description in: Hamady, Lozupone, and Knight, ``\href{http://www.nature.com/ismej/journal/v4/n1/full/ismej200997a.html}{Fast UniFrac:} facilitating high-throughput phylogenetic analyses of microbial communities including analysis of pyrosequencing and PhyloChip data.'' The ISME Journal (2010) 4, 17--27. See also additional descriptions of UniFrac in the following articles: Lozupone, Hamady and Knight, ``UniFrac - An Online Tool for Comparing Microbial Community Diversity in a Phylogenetic Context.'', BMC Bioinformatics 2006, 7:371 Lozupone, Hamady, Kelley and Knight, ``Quantitative and qualitative (beta) diversity measures lead to different insights into factors that structure microbial communities.'' Appl Environ Microbiol. 2007 Lozupone C, Knight R. ``UniFrac: a new phylogenetic method for comparing microbial communities.'' Appl Environ Microbiol. 2005 71 (12):8228-35. } \seealso{ \code{\link{distance}} \code{unifrac} in the picante package. } phyloseq/man/access.Rd0000644000175400017540000000353413177706002015757 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/phyloseq-class.R \name{access} \alias{access} \title{Universal slot accessor function for phyloseq-class.} \usage{ access(physeq, slot, errorIfNULL=FALSE) } \arguments{ \item{physeq}{(Required). \code{\link{phyloseq-class}}.} \item{slot}{(Required). A character string indicating the slot (not data class) of the component data type that is desired.} \item{errorIfNULL}{(Optional). Logical. Should the accessor stop with an error if the slot is empty (\code{NULL})? Default \code{FALSE}.} } \value{ Returns the component object specified by the argument \code{slot}. Returns NULL if slot does not exist. Returns \code{physeq} as-is if it is a component class that already matches the slot name. } \description{ This function is used internally by many accessors and in many functions/methods that need to access a particular type of component data. If something is wrong, or the slot is missing, the expected behavior is that this function will return NULL. Thus, the output can be tested by \code{\link{is.null}} as verification of the presence of a particular data component. Unlike the component-specific accessors (e.g. \code{\link{otu_table}}, or \code{\link{phy_tree}}), the default behavior is not to stop with an error if the desired slot is empty. In all cases this is controlled by the \code{errorIfNULL} argument, which can be set to \code{TRUE} if an error is desired. } \examples{ # ## data(GlobalPatterns) ## access(GlobalPatterns, "tax_table") ## access(GlobalPatterns, "phy_tree") ## access(otu_table(GlobalPatterns), "otu_table") ## # Should return NULL: ## access(otu_table(GlobalPatterns), "sample_data") ## access(otuTree(GlobalPatterns), "sample_data") ## access(otuSam(GlobalPatterns), "phy_tree") } \seealso{ \code{\link{getslots.phyloseq}}, \code{\link{merge_phyloseq}} } phyloseq/man/assign-otu_table.Rd0000644000175400017540000000237113177706002017754 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/assignment-methods.R \docType{methods} \name{otu_table<-} \alias{otu_table<-} \alias{assign-otu_table} \alias{otu_table<-,phyloseq,otu_table-method} \alias{otu_table<-,otu_table,otu_table-method} \alias{otu_table<-,phyloseq,phyloseq-method} \title{Assign a new OTU Table to \code{x}} \usage{ otu_table(x) <- value \S4method{otu_table}{phyloseq,otu_table}(x) <- value \S4method{otu_table}{otu_table,otu_table}(x) <- value \S4method{otu_table}{phyloseq,phyloseq}(x) <- value } \arguments{ \item{x}{(Required). \code{\link{phyloseq-class}}} \item{value}{(Required). \code{\link{otu_table-class}} or \code{\link{phyloseq-class}}.} } \description{ Assign a new OTU Table to \code{x} } \examples{ # data(GlobalPatterns) # # An example of pruning to just the first 100 taxa in GlobalPatterns. # ex2a <- prune_taxa(taxa_names(GlobalPatterns)[1:100], GlobalPatterns) # # The following 3 lines produces an ex2b that is equal to ex2a # ex2b <- GlobalPatterns # OTU <- otu_table(GlobalPatterns)[1:100, ] # otu_table(ex2b) <- OTU # identical(ex2a, ex2b) # print(ex2b) # # Relace otu_table by implying the component in context. # ex2c <- GlobalPatterns # otu_table(ex2c) <- ex2b # identical(ex2a, ex2c) } phyloseq/man/assign-phy_tree.Rd0000644000175400017540000000166713177706002017624 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/assignment-methods.R \docType{methods} \name{phy_tree<-} \alias{phy_tree<-} \alias{assign-phy_tree} \alias{phy_tree<-,phyloseq,phylo-method} \alias{phy_tree<-,phyloseq,phyloseq-method} \title{Assign a (new) phylogenetic tree to \code{x}} \usage{ phy_tree(x) <- value \S4method{phy_tree}{phyloseq,phylo}(x) <- value \S4method{phy_tree}{phyloseq,phyloseq}(x) <- value } \arguments{ \item{x}{(Required). \code{\link{phyloseq-class}}} \item{value}{(Required). \code{\link{phylo-class}}, or \code{\link{phyloseq-class}}} } \description{ Assign a (new) phylogenetic tree to \code{x} } \examples{ # data("esophagus") # An example of pruning to just the first 20 taxa in esophagus ex2a <- prune_taxa(taxa_names(esophagus)[1:20], esophagus) # The following 3 lines produces an ex2b that is equal to ex2a ex2b <- ex2a phy_tree(ex2b) <- phy_tree(esophagus) identical(ex2a, ex2b) } phyloseq/man/assign-sample_data.Rd0000644000175400017540000000372013177706002020247 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/assignment-methods.R \name{sample_data<-} \alias{sample_data<-} \alias{assign-sample_data} \title{Assign (new) sample_data to \code{x}} \usage{ sample_data(x) <- value } \arguments{ \item{x}{(Required). \code{\link{phyloseq-class}}. The object to modify.} \item{value}{(Required). Either a \code{\link{sample_data-class}}, a \code{data.frame} that can be coerced into \code{\link{sample_data-class}}, or a \code{\link{phyloseq-class}} that contains a suitable \code{sample_data} component to assign to \code{x}. If unsure, try \code{\link{sample_data}}\code{(value)}, which should return a \code{\link{sample_data-class}} object without error.} } \value{ No return. This is an assignment statement. } \description{ This replaces the current \code{sample_data} component of \code{x} with \code{value}, if \code{value} is a \code{\link{sample_data-class}}. However, if \code{value} is a \code{data.frame}, then \code{value} is first coerced to a \code{\link{sample_data-class}}, and then assigned. Alternatively, if \code{value} is \code{\link{phyloseq-class}}, then the \code{\link{sample_data}} component will first be accessed from \code{value} and then assigned. This makes possible some concise assignment/replacement statements when adjusting, modifying, or building subsets of experiment-level data. See some examples below. Internally, this re-builds the \code{\link{phyloseq-class}} object using the standard \code{\link{phyloseq}} constructor. Thus, index mismatches between sample-describing components will not be allowed, and subsetting will occurr automatically such that only the intersection of sample IDs are included in any components. This has the added benefit of re-checking (internally) for any other issues. } \examples{ data(soilrep) soilrep head(sample_data(soilrep)) sample_data(soilrep)$Time <- as.integer(substr(sample_data(soilrep)$Sample, 1, 1)) head(sample_data(soilrep)) } phyloseq/man/assign-sample_names.Rd0000644000175400017540000000332213177706002020437 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/assignment-methods.R \docType{methods} \name{sample_names<-} \alias{sample_names<-} \alias{assign-sample_names} \alias{sample_names<-,ANY,ANY-method} \alias{sample_names<-,ANY,character-method} \alias{sample_names<-,otu_table,character-method} \alias{sample_names<-,sample_data,character-method} \alias{sample_names<-,phyloseq,character-method} \title{Replace OTU identifier names} \usage{ sample_names(x) <- value \S4method{sample_names}{ANY,ANY}(x) <- value \S4method{sample_names}{ANY,character}(x) <- value \S4method{sample_names}{otu_table,character}(x) <- value \S4method{sample_names}{sample_data,character}(x) <- value \S4method{sample_names}{phyloseq,character}(x) <- value } \arguments{ \item{x}{(Required). An object defined by the \code{\link{phyloseq-package}} that describes OTUs in some way.} \item{value}{(Required). A character vector to replace the current \code{\link{sample_names}}.} } \description{ Replace OTU identifier names } \examples{ data("esophagus") sample_names(esophagus) # plot_tree(esophagus, color="sample_names", ladderize="left") sample_names(esophagus) <- paste("Sa-", sample_names(esophagus), sep="") sample_names(esophagus) # plot_tree(esophagus, color="sample_names", ladderize="left") ## non-characters are first coerced to characters. sample_names(esophagus) <- 1:nsamples(esophagus) sample_names(esophagus) # plot_tree(esophagus, color="sample_names", ladderize="left") ## Cannot assign non-unique or differently-lengthed name vectors. Error. # sample_names(esophagus) <- sample(c(TRUE, FALSE), nsamples(esophagus), TRUE) # sample_names(esophagus) <- sample(sample_names(esophagus), nsamples(esophagus)-1, FALSE) } phyloseq/man/assign-tax_table.Rd0000644000175400017540000000351413177706002017741 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/assignment-methods.R \docType{methods} \name{tax_table<-} \alias{tax_table<-} \alias{assign-tax_table} \alias{tax_table<-,phyloseq,taxonomyTable-method} \alias{tax_table<-,phyloseq,ANY-method} \alias{tax_table<-,taxonomyTable,taxonomyTable-method} \alias{tax_table<-,taxonomyTable,ANY-method} \title{Assign a (new) Taxonomy Table to \code{x}} \usage{ tax_table(x) <- value \S4method{tax_table}{phyloseq,taxonomyTable}(x) <- value \S4method{tax_table}{phyloseq,ANY}(x) <- value \S4method{tax_table}{taxonomyTable,taxonomyTable}(x) <- value \S4method{tax_table}{taxonomyTable,ANY}(x) <- value } \arguments{ \item{x}{(Required). \code{\link{phyloseq-class}}} \item{value}{(Required). \code{\link{taxonomyTable-class}}. Alternatively, \code{value} can be a \code{\link{phyloseq-class}} that has a \code{\link{tax_table}} component, or a \code{\link{matrix-class}} that can be coerced to a \code{\link{taxonomyTable-class}} with row indices that match at least some of the \code{\link{taxa_names}} of \code{x}.} } \description{ Assign a (new) Taxonomy Table to \code{x} } \examples{ # data(GlobalPatterns) # # An example of pruning to just the first 100 taxa in GlobalPatterns. # ex2a <- prune_taxa(taxa_names(GlobalPatterns)[1:100], GlobalPatterns) # # The following 3 lines produces an ex2b that is equal to ex2a # ex2b <- GlobalPatterns # TT <- tax_table(GlobalPatterns)[1:100, ] # tax_table(ex2b) <- TT # identical(ex2a, ex2b) # print(ex2b) # # 2 examples adding a tax_table component from phyloseq or matrix classes # ex2c <- phyloseq(otu_table(ex2b), sample_data(ex2b), phy_tree(ex2b)) # tax_table(ex2c) <- ex2b # identical(ex2a, ex2c) # ex2c <- phyloseq(otu_table(ex2b), sample_data(ex2b), phy_tree(ex2b)) # tax_table(ex2c) <- as(tax_table(ex2b), "matrix") # identical(ex2a, ex2c) } phyloseq/man/assign-taxa_are_rows.Rd0000644000175400017540000000173413177706002020636 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/assignment-methods.R \docType{methods} \name{taxa_are_rows<-} \alias{taxa_are_rows<-} \alias{assign-taxa_are_rows} \alias{taxa_are_rows<-,otu_table,logical-method} \alias{taxa_are_rows<-,phyloseq,logical-method} \title{Manually change taxa_are_rows through assignment.} \usage{ taxa_are_rows(x) <- value \S4method{taxa_are_rows}{otu_table,logical}(x) <- value \S4method{taxa_are_rows}{phyloseq,logical}(x) <- value } \arguments{ \item{x}{\code{\link{otu_table-class}} or \code{\link{phyloseq-class}}} \item{value}{A logical of length equal to 1. If \code{length(value) > 1}, the additional elements will be ignored. Only the first element is assigned to the taxa_are_rows slot.} } \description{ The taxa_are_rows slot is a logical indicating the orientation of the abundance table contained in object \code{x}. } \examples{ data(esophagus) taxa_are_rows(esophagus) taxa_are_rows(otu_table(esophagus)) } phyloseq/man/assign-taxa_names.Rd0000644000175400017540000000355713177706002020125 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/assignment-methods.R \docType{methods} \name{taxa_names<-} \alias{taxa_names<-} \alias{assign-taxa_names} \alias{taxa_names<-,ANY,ANY-method} \alias{taxa_names<-,ANY,character-method} \alias{taxa_names<-,otu_table,character-method} \alias{taxa_names<-,taxonomyTable,character-method} \alias{taxa_names<-,phylo,character-method} \alias{taxa_names<-,XStringSet,character-method} \alias{taxa_names<-,phyloseq,character-method} \title{Replace OTU identifier names} \usage{ taxa_names(x) <- value \S4method{taxa_names}{ANY,ANY}(x) <- value \S4method{taxa_names}{ANY,character}(x) <- value \S4method{taxa_names}{otu_table,character}(x) <- value \S4method{taxa_names}{taxonomyTable,character}(x) <- value \S4method{taxa_names}{phylo,character}(x) <- value \S4method{taxa_names}{XStringSet,character}(x) <- value \S4method{taxa_names}{phyloseq,character}(x) <- value } \arguments{ \item{x}{(Required). An object defined by the \code{\link{phyloseq-package}} that describes OTUs in some way.} \item{value}{(Required). A character vector to replace the current \code{\link{taxa_names}}.} } \description{ Replace OTU identifier names } \examples{ data("esophagus") taxa_names(esophagus) # plot_tree(esophagus, label.tips="taxa_names", ladderize="left") taxa_names(esophagus) <- paste("OTU-", taxa_names(esophagus), sep="") taxa_names(esophagus) # plot_tree(esophagus, label.tips="taxa_names", ladderize="left") ## non-characters are first coerced to characters. taxa_names(esophagus) <- 1:ntaxa(esophagus) taxa_names(esophagus) # plot_tree(esophagus, label.tips="taxa_names", ladderize="left") ## Cannot assign non-unique or differently-lengthed name vectors. Error. # taxa_names(esophagus) <- sample(c(TRUE, FALSE), ntaxa(esophagus), TRUE) # taxa_names(esophagus) <- sample(taxa_names(esophagus), ntaxa(esophagus)-5, FALSE) } phyloseq/man/build_tax_table.Rd0000644000175400017540000000327613177706002017643 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/IO-methods.R \name{build_tax_table} \alias{build_tax_table} \title{Build a \code{\link{tax_table}} from a named possibly-jagged list} \usage{ build_tax_table(taxlist) } \arguments{ \item{taxlist}{(Required). A list in which each element is a vector of taxonomic assignments named by rank. Every element of every vector must be named by the rank it represents. Every element of the list (every vector) should correspond to a single OTU and be named for that OTU.} } \value{ A \code{\link{tax_table}} (\code{\link{taxonomyTable-class}}) that has been built from \code{taxlist}. The OTU names of this output will be the element names of \code{taxlist}, and a separate taxonomic rank (column) will be included for each unique rank found among the element names of each vector in the list. \code{NA_character_} is the default value of elements in the \code{\link{tax_table}} for which there is no corresponding information in \code{taxlist}. } \description{ Build a \code{\link{tax_table}} from a named possibly-jagged list } \examples{ taxvec1 = c("Root", "k__Bacteria", "p__Firmicutes", "c__Bacilli", "o__Bacillales", "f__Staphylococcaceae") parse_taxonomy_default(taxvec1) parse_taxonomy_greengenes(taxvec1) taxvec2 = c("Root;k__Bacteria;p__Firmicutes;c__Bacilli;o__Bacillales;f__Staphylococcaceae") parse_taxonomy_qiime(taxvec2) taxlist1 = list(OTU1=parse_taxonomy_greengenes(taxvec1), OTU2=parse_taxonomy_qiime(taxvec2)) taxlist2 = list(OTU1=parse_taxonomy_default(taxvec1), OTU2=parse_taxonomy_qiime(taxvec2)) build_tax_table(taxlist1) build_tax_table(taxlist2) } \seealso{ \code{\link{import_biom}} \code{\link{import_qiime}} } phyloseq/man/capscale-phyloseq-methods.Rd0000644000175400017540000000506713177706002021577 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/ordination-methods.R \docType{methods} \name{capscale.phyloseq} \alias{capscale.phyloseq} \alias{capscale.phyloseq,phyloseq,formula,dist-method} \alias{capscale.phyloseq,phyloseq,formula,character-method} \title{Constrained Analysis of Principal Coordinates, \code{\link[vegan]{capscale}}.} \usage{ capscale.phyloseq(physeq, formula, distance, ...) \S4method{capscale.phyloseq}{phyloseq,formula,dist}(physeq, formula, distance, ...) \S4method{capscale.phyloseq}{phyloseq,formula,character}(physeq, formula, distance, ...) } \arguments{ \item{physeq}{(Required). Phylogenetic sequencing data (\code{\link{phyloseq-class}}). The data on which you want to perform the ordination.} \item{formula}{(Required). A \code{\link{formula}}, specifying the input. No need to directly access components. \code{capscale.phyloseq} understands where to find the abundance table (LHS) and \code{\link{sample_data}} (RHS) from within the phyloseq object.} \item{distance}{(Required). A \code{\link{character}} string, specifying the name of the dissimilarity (or distance) method supported by the phyloseq \code{\link[phyloseq]{distance}} function. Alternatively, a pre-computed \code{\link{dist}}-object can be provided here, in which case it supersedes any use of the \code{\link{otu_table}} in your phyloseq object. Note that \code{\link[vegan]{capscale}} with Euclidean distances will be identical to \code{\link[vegan]{rda}} in eigenvalues and in site, species, and biplot scores (except for possible sign reversal). However, it makes no sense to use \code{\link[vegan]{capscale}} with Euclidean distances, since direct use of \code{\link[vegan]{rda}} is much more efficient (and supported in the \code{\link{ordinate}} function with \code{method=="RDA"}) Even with non-Euclidean dissimilarities, the rest of the analysis will be metric and linear.} \item{...}{(Optional). Additional named arguments passed to \code{\link[vegan]{capscale}}.} } \value{ Ordination object defined by \code{\link[vegan]{capscale}}. } \description{ See \code{\link[vegan]{capscale}} for details. A formula is main input. } \examples{ # See other examples at # http://joey711.github.io/phyloseq/plot_ordination-examples data(GlobalPatterns) GP = prune_taxa(names(sort(taxa_sums(GlobalPatterns), TRUE)[1:50]), GlobalPatterns) ordcap = ordinate(GP, "CAP", "bray", ~SampleType) plot_ordination(GP, ordcap, "samples", color="SampleType") } \seealso{ \code{\link{plot_ordination}} \code{\link[vegan]{rda}} \code{\link[vegan]{capscale}} } \keyword{internal} phyloseq/man/cca-rda-phyloseq-methods.Rd0000644000175400017540000000361113177706002021307 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/ordination-methods.R \docType{methods} \name{cca.phyloseq} \alias{cca.phyloseq} \alias{rda.phyloseq} \alias{cca.phyloseq,phyloseq,formula-method} \alias{cca.phyloseq,otu_table,ANY-method} \alias{cca.phyloseq,otu_table-method} \alias{cca.phyloseq,phyloseq,NULL-method} \title{Constrained Correspondence Analysis and Redundancy Analysis.} \usage{ cca.phyloseq(physeq, formula = NULL, method = "CCA", ...) \S4method{cca.phyloseq}{phyloseq,formula}(physeq, formula = NULL, method = "CCA", ...) \S4method{cca.phyloseq}{otu_table,ANY}(physeq, formula = NULL, method = "CCA", ...) \S4method{cca.phyloseq}{phyloseq,`NULL`}(physeq, formula = NULL, method = "CCA", ...) } \arguments{ \item{physeq}{(Required). Phylogenetic sequencing data (\code{\link{phyloseq-class}}). The data on which you want to perform the ordination.} \item{formula}{(Optional). A \code{\link{formula}}, specifying the contraining variable(s) format, with variable names corresponding to \code{\link{sample_data}} (RHS) from within \code{physeq}.} \item{method}{(Optional). A single \code{\link{character}} string, specifying \code{"RDA"} or \code{"CCA"}. Default is \code{"CCA"}.} \item{...}{(Optional). Additional named arguments passed to \code{\link[vegan]{capscale}}.} } \value{ same output as \code{\link[vegan]{cca}} or \code{\link[vegan]{rda}}, respectively. } \description{ This is the internal function that simplifies getting phyloseq data into the constrained ordination functions, \code{\link[vegan]{cca}} and \code{\link[vegan]{rda}}. Unlike \code{\link[phyloseq]{capscale.phyloseq}}, the formula argument to these methods is optional, and results in an unconstrained ordination. } \examples{ # # cca.phyloseq(physeq, formula, method, ...) } \seealso{ \code{\link{plot_ordination}}, \code{\link[vegan]{rda}}, \code{\link[vegan]{cca}} } \keyword{internal} phyloseq/man/chunkReOrder.Rd0000644000175400017540000000206113177706002017103 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plot-methods.R \name{chunkReOrder} \alias{chunkReOrder} \title{Chunk re-order a vector so that specified newstart is first.} \usage{ chunkReOrder(x, newstart = x[[1]]) } \description{ Different than relevel. } \examples{ # Typical use-case # chunkReOrder(1:10, 5) # # Default is to not modify the vector # chunkReOrder(1:10) # # Another example not starting at 1 # chunkReOrder(10:25, 22) # # Should silently ignore the second element of `newstart` # chunkReOrder(10:25, c(22, 11)) # # Should be able to handle `newstart` being the first argument already # # without duplicating the first element at the end of `x` # chunkReOrder(10:25, 10) # all(chunkReOrder(10:25, 10) == 10:25) # # This is also the default # all(chunkReOrder(10:25) == 10:25) # # An example with characters # chunkReOrder(LETTERS, "G") # chunkReOrder(LETTERS, "B") # chunkReOrder(LETTERS, "Z") # # What about when `newstart` is not in `x`? Return x as-is, throw warning. # chunkReOrder(LETTERS, "g") } \keyword{internal} phyloseq/man/data-GlobalPatterns.Rd0000644000175400017540000000540513177706002020345 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/allData.R \docType{data} \name{data-GlobalPatterns} \alias{data-GlobalPatterns} \alias{GlobalPatterns} \title{(Data) Global patterns of 16S rRNA diversity at a depth of millions of sequences per sample (2011)} \description{ Published in PNAS in early 2011. This work compared the microbial communities from 25 environmental samples and three known ``mock communities'' -- a total of 9 sample types -- at a depth averaging 3.1 million reads per sample. Authors were able to reproduce diversity patterns seen in many other published studies, while also invesitigating technical issues/bias by applying the same techniques to simulated microbial communities of known composition. } \details{ abstract from research article (quoted): The ongoing revolution in high-throughput sequencing continues to democratize the ability of small groups of investigators to map the microbial component of the biosphere. In particular, the coevolution of new sequencing platforms and new software tools allows data acquisition and analysis on an unprecedented scale. Here we report the next stage in this coevolutionary arms race, using the Illumina GAIIx platform to sequence a diverse array of 25 environmental samples and three known ``mock communities'' at a depth averaging 3.1 million reads per sample. We demonstrate excellent consistency in taxonomic recovery and recapture diversity patterns that were previously reported on the basis of metaanalysis of many studies from the literature (notably, the saline/nonsaline split in environmental samples and the split between host-associated and free-living communities). We also demonstrate that 2,000 Illumina single-end reads are sufficient to recapture the same relationships among samples that we observe with the full dataset. The results thus open up the possibility of conducting large-scale studies analyzing thousands of samples simultaneously to survey microbial communities at an unprecedented spatial and temporal resolution. (end quote) Many thanks to J. Gregory Caporaso for directly providing the OTU-clustered data files for inclusion in this package. } \examples{ data(GlobalPatterns) plot_richness(GlobalPatterns, x="SampleType", measures=c("Observed", "Chao1", "Shannon")) } \references{ Caporaso, J. G., et al. (2011). Global patterns of 16S rRNA diversity at a depth of millions of sequences per sample. PNAS, 108, 4516-4522. PMCID: PMC3063599 The primary article can be viewed/downloaded at: \url{http://www.pnas.org/content/108/suppl.1/4516.short} } \seealso{ The examples on the phyloseq wiki page for \code{\link{plot_ordination}} show many more examples: \url{https://github.com/joey711/phyloseq/wiki/plot_ordination} } \author{ Caporaso, J. G., et al. } \keyword{data} phyloseq/man/data-enterotype.Rd0000644000175400017540000000557113177706002017626 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/allData.R \docType{data} \name{data-enterotype} \alias{data-enterotype} \alias{enterotype} \title{(Data) Enterotypes of the human gut microbiome (2011)} \description{ Published in Nature in early 2011, this work compared (among other things), the faecal microbial communities from 22 subjects using complete shotgun DNA sequencing. Authors further compared these microbial communities with the faecal communities of subjects from other studies. A total of 280 faecal samples / subjects are represented in this dataset, and 553 genera. The authors claim that the data naturally clumps into three community-level clusters, or ``enterotypes'', that are not immediately explained by sequencing technology or demographic features of the subjects, but with potential relevance to understanding human gut microbiota. } \details{ abstract from research article (quoted): Our knowledge of species and functional composition of the human gut microbiome is rapidly increasing, but it is still based on very few cohorts and little is known about variation across the world. By combining 22 newly sequenced faecal metagenomes of individuals from four countries with previously published data sets, here we identify three robust clusters (referred to as enterotypes hereafter) that are not nation or continent specific. We also confirmed the enterotypes in two published, larger cohorts, indicating that intestinal microbiota variation is generally stratified, not continuous. This indicates further the existence of a limited number of well-balanced host-microbial symbiotic states that might respond differently to diet and drug intake. The enterotypes are mostly driven by species composition, but abundant molecular functions are not necessarily provided by abundant species, highlighting the importance of a functional analysis to understand microbial communities. Although individual host properties such as body mass index, age, or gender cannot explain the observed enterotypes, data-driven marker genes or functional modules can be identified for each of these host properties. For example, twelve genes significantly correlate with age and three functional modules with the body mass index, hinting at a diagnostic potential of microbial markers. (end quote) } \examples{ data(enterotype) ig <- make_network(enterotype, "samples", max.dist=0.3) plot_network(ig, enterotype, color="SeqTech", shape="Enterotype", line_weight=0.3, label=NULL) } \references{ Arumugam, M., et al. (2011). Enterotypes of the human gut microbiome. Nature, 473(7346), 174-180. \url{http://www.nature.com/doifinder/10.1038/nature09944} See supplemental information for subject data. OTU-clustered data was downloaded from the publicly-accessible: \url{http://www.bork.embl.de/Docu/Arumugam_et_al_2011/downloads.html} } \author{ Arumugam, M., Raes, J., et al. } \keyword{data} phyloseq/man/data-esophagus.Rd0000644000175400017540000000614713177706002017426 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/allData.R \docType{data} \name{data-esophagus} \alias{data-esophagus} \alias{esophagus} \title{(Data) Small example dataset from a human esophageal community (2004)} \description{ Includes just 3 samples, 1 each from 3 subjects. Although the research article mentions 4 subjects, only 3 are included in this dataset. } \details{ abstract from research article (quoted): The esophagus, like other luminal organs of the digestive system, provides a potential environment for bacterial colonization, but little is known about the presence of a bacterial biota or its nature. By using broad-range 16S rDNA PCR, biopsies were examined from the normal esophagus of four human adults. The 900 PCR products cloned represented 833 unique sequences belonging to 41 genera, or 95 species-level operational taxonomic units (SLOTU); 59 SLOTU were homologous with culture-defined bacterial species, 34 with 16S rDNA clones, and two were not homologous with any known bacterial 16S rDNA. Members of six phyla, Firmicutes, Bacteroides, Actinobacteria, Proteobacteria, Fusobacteria, and TM7, were represented. A large majority of clones belong to 13 of the 41 genera (783/900, 87\%), or 14 SLOTU (574/900, 64\%) that were shared by all four persons. Streptococcus (39\%), Prevotella (17\%), and Veilonella (14\%) were most prevalent. The present study identified 56-79\% of SLOTU in this bacterial ecosystem. Most SLOTU of esophageal biota are similar or identical to residents of the upstream oral biota, but the major distinction is that a large majority (82\%) of the esophageal bacteria are known and cultivable. These findings provide evidence for a complex but conserved bacterial population in the normal distal esophagus. (end quote) A description of the 16S rRNA sequence processing can be found on the mothur-wiki at the link below. A cutoff of 0.10 was used for OTU clustering in that example, and it is taken here as well to create example data, \code{esophagus}, which was easily imported with the \code{import_mothur()} function. } \examples{ data(esophagus) UniFrac(esophagus, weighted=TRUE) # How to re-create the esophagus dataset using import_mothur function mothlist <- system.file("extdata", "esophagus.fn.list.gz", package="phyloseq") mothgroup <- system.file("extdata", "esophagus.good.groups.gz", package="phyloseq") mothtree <- system.file("extdata", "esophagus.tree.gz", package="phyloseq") show_mothur_cutoffs(mothlist) cutoff <- "0.10" esophman <- import_mothur(mothlist, mothgroup, mothtree, cutoff) } \references{ Pei, Z., Bini, E. J., Yang, L., Zhou, M., Francois, F., & Blaser, M. J. (2004). Bacterial biota in the human distal esophagus. Proceedings of the National Academy of Sciences of the United States of America, 101(12), 4250-4255. \url{http://www.ncbi.nlm.nih.gov/pmc/articles/PMC384727} mothur-processed files and the sequence data can be downloaded from a zip-file, along with additional description, from the following URL: \url{http://www.mothur.org/wiki/Esophageal_community_analysis} } \author{ Pei et al. \email{zhiheng.pei@med.nyu.edu} } \keyword{data} phyloseq/man/data-soilrep.Rd0000644000175400017540000001120413177706002017073 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/allData.R \docType{data} \name{data-soilrep} \alias{data-soilrep} \alias{soilrep} \title{(Data) Reproducibility of soil microbiome data (2011)} \description{ Published in early 2011, this work compared 24 separate soil microbial communities under four treatment conditions via multiplexed/barcoded 454-pyrosequencing of PCR-amplified 16S rRNA gene fragments. The authors found differences in the composition and structure of microbial communities between soil treatments. As expected, the soil microbial communities were highly diverse, with a staggering 16,825 different OTUs (species) observed in the included dataset. Interestingly, this study used a larger number of replicates than previous studies of this type, for a total of 56 samples, and the putatively low resampling rate of species between replicated sequencing trials (``OTU overlap'') was a major concern by the authors. } \details{ This dataset contains an experiment-level (\code{\link{phyloseq-class}}) object, which in turn contains the taxa-contingency table and soil-treatment table as \code{\link{otu_table-class}} and \code{\link{sample_data-class}} components, respectively. This data was imported from raw files supplied directly by the authors via personal communication for the purposes of including as an example in the \code{\link{phyloseq-package}}. As this data is sensitive to choices in OTU-clustering parameters, attempts to recreate the \code{otu_table} from the raw sequencing data may give slightly different results than the table provided here. abstract from research article (quoted): To determine the reproducibility and quantitation of the amplicon sequencing-based detection approach for analyzing microbial community structure, a total of 24 microbial communities from a long-term global change experimental site were examined. Genomic DNA obtained from each community was used to amplify 16S rRNA genes with two or three barcode tags as technical replicates in the presence of a small quantity (0.1\% wt/wt) of genomic DNA from Shewanella oneidensis MR-1 as the control. The technical reproducibility of the amplicon sequencing-based detection approach is quite low, with an average operational taxonomic unit (OTU) overlap of 17.2\%\code{+/-}2.3\% between two technical replicates, and 8.2\%\code{+/-}2.3\% among three technical replicates, which is most likely due to problems associated with random sampling processes. Such variations in technical replicates could have substantial effects on estimating beta-diversity but less on alpha-diversity. A high variation was also observed in the control across different samples (for example, 66.7-fold for the forward primer), suggesting that the amplicon sequencing-based detection approach could not be quantitative. In addition, various strategies were examined to improve the comparability of amplicon sequencing data, such as increasing biological replicates, and removing singleton sequences and less-representative OTUs across biological replicates. Finally, as expected, various statistical analyses with preprocessed experimental data revealed clear differences in the composition and structure of microbial communities between warming and non-warming, or between clipping and non-clipping. Taken together, these results suggest that amplicon sequencing-based detection is useful in analyzing microbial community structure even though it is not reproducible and quantitative. However, great caution should be taken in experimental design and data interpretation when the amplicon sequencing-based detection approach is used for quantitative analysis of the beta-diversity of microbial communities. (end quote) } \examples{ # Load the data data(soilrep) ################################################################################ # Alpha diversity (richness) example. Accept null hypothesis: # No convincing difference in species richness between warmed/unwarmed soils. ################################################################################ # Graphically compare richness between the different treatments. man.col <- c(WC="red", WU="brown", UC="blue", UU="darkgreen") plot_richness(soilrep, x="Treatment", color="Treatment", measures=c("Observed", "Chao1", "Shannon")) } \references{ Zhou, J., Wu, L., Deng, Y., Zhi, X., Jiang, Y.-H., Tu, Q., Xie, J., et al. Reproducibility and quantitation of amplicon sequencing-based detection. The ISME Journal. (2011) 5(8):1303-1313. \code{doi:10.1038/ismej.2011.11} The article can be accessed online at \url{http://www.nature.com/ismej/journal/v5/n8/full/ismej201111a.html} } \author{ Jizhong Zhou, et al. } \keyword{data} phyloseq/man/decorana.Rd0000644000175400017540000000176713177706002016300 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/allClasses.R \docType{data} \name{decorana} \alias{decorana} \title{S3 class placeholder definition (list) for decorana} \format{An object of class \code{decorana} of length 0.} \usage{ decorana } \description{ The ape package does export a version of its \code{\link[vegan]{decorana}}-class, partly because it is not really defined formally anywhere. Instead, it is an S3 class extended from the base class, \code{\link{list}} -- this is a very common and easy approach -- and proper behavior of any method taking an instance of this class requires exact naming conventions for element names of the list components. The phyloseq package does not provide any validity checks that a given phylo instance is valid (conforms to the conventions in the ape package)... yet. If problems arise, this might be considered, and they could be defined judiciously and within phyloseq. } \seealso{ \code{\link[vegan]{decorana}} } \keyword{internal} phyloseq/man/dist-class.Rd0000644000175400017540000000055313177706002016562 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/allClasses.R \name{dist-class} \alias{dist-class} \title{An S4 placeholder for the \code{\link[stats]{dist}} class.} \description{ See \code{\link[stats]{dist}} for details about this type of a distance matrix object. } \seealso{ \code{\link[stats]{dist}}, \code{\link{setOldClass}} } phyloseq/man/distance.Rd0000644000175400017540000000754313177706002016314 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/distance-methods.R \docType{methods} \name{distance} \alias{distance} \alias{distance,phyloseq,ANY-method} \alias{distance,otu_table,character-method} \alias{distance,phyloseq,character-method} \title{Calculate distance, dissimilarity} \usage{ distance(physeq, method, type = "samples", ...) \S4method{distance}{phyloseq,ANY}(physeq, method) \S4method{distance}{otu_table,character}(physeq, method, type = "samples", ...) \S4method{distance}{phyloseq,character}(physeq, method, type = "samples", ...) } \arguments{ \item{physeq}{(Required). A \code{\link{phyloseq-class}} or an \code{\link{otu_table-class}} object. The latter is only appropriate for methods that do not require any additional data (one-table). For example, the ``wunifrac'' option (\code{\link{UniFrac}}) requires \code{\link{phyloseq-class}} that contains both an \code{otu_table} and a phylogenetic tree (\code{phylo}).} \item{method}{(Required). A character string. Provide one of the currently supported options. See \code{\link{distanceMethodList}} for a detailed list of the supported options here, and links to accompanying documentation. Note that for the common definition of \code{Jaccard} distance using the \code{vegan-package} implementation, an additional argument is needed, with the full call having the form: \code{distance(physeq, method = "jaccard", binary = TRUE)} The following methods are implemented explicitly within the \code{\link{phyloseq-package}}, and accessed by the following \code{method} options: \describe{ \item{\code{"unifrac"}}{Original (unweighted) UniFrac distance, \code{\link[phyloseq]{UniFrac}}} \item{\code{"wunifrac"}}{weighted-UniFrac distance, \code{\link[phyloseq]{UniFrac}}} \item{\code{"dpcoa"}}{ sample-wise distance used in Double Principle Coordinate Analysis, \code{\link[phyloseq]{DPCoA}}} \item{\code{"jsd"}}{Jensen-Shannon Divergence, \code{\link{JSD}}} } Alternatively, you can provide a character string that defines a custom distance method, if it has the form described in \code{\link{designdist}}.} \item{type}{(Optional). A character string. The type of pairwise comparisons being calculated: sample-wise or taxa-wise. The default is \code{c("samples")}.} \item{...}{Additional arguments passed on to the appropriate distance function, determined by the \code{method} argument.} } \value{ An object of class ``\code{\link{dist}}'' suitable for certain ordination methods and other distance-based analyses. } \description{ Takes a \code{\link{phyloseq-class}} object and method option, and returns a \code{\link{dist}}ance object suitable for certain ordination methods and other distance-based analyses. Only sample-wise distances are currently supported (the \code{type} argument), but eventually species-wise (OTU-wise) distances may be supported as well. } \details{ Depending on the \code{method} argument, \code{distance()} wraps one of \code{\link{UniFrac}}, \code{\link{DPCoA}}, \code{\link{JSD}}, \code{\link[vegan]{vegdist}}, \code{\link[vegan]{betadiver}}, \code{\link[vegan]{designdist}}, or \code{\link{dist}}. } \examples{ data(esophagus) distance(esophagus, "uunifrac") # Unweighted UniFrac distance(esophagus, "wunifrac") # weighted UniFrac distance(esophagus, "jaccard", binary = TRUE) # vegdist jaccard distance(esophagus, "gower") # vegdist option "gower" distance(esophagus, "g") # designdist method option "g" distance(esophagus, "minkowski") # invokes a method from the base dist() function. distance(esophagus, "(A+B-2*J)/(A+B)") # designdist custom distance distanceMethodList help("distance") } \seealso{ \code{\link{plot_ordination}}, \code{\link{UniFrac}}, \code{\link{DPCoA}}, \code{\link{JSD}}, \code{\link[vegan]{vegdist}}, \code{\link[vegan]{betadiver}}, \code{\link[vegan]{designdist}}, \code{\link{dist}}. } phyloseq/man/distanceMethodList.Rd0000644000175400017540000000616513177706002020310 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/distance-methods.R \docType{data} \name{distanceMethodList} \alias{distanceMethodList} \title{List of distance method keys supported in \code{\link[phyloseq]{distance}}} \format{A list of character vectors. Every entry specifies a supported distance method. Names in the list indicate which downstream function is being utilized for further details. Same functions are linked in the itemized list below. \describe{ \item{\code{unifrac}}{\code{\link[phyloseq]{UniFrac}}} \item{\code{wunifrac}}{\code{\link[phyloseq]{UniFrac}}} \item{\code{dpcoa}}{\code{\link[phyloseq]{DPCoA}}} \item{\code{jsd}}{\code{\link{JSD}}} \item{\code{manhattan}}{\code{\link[vegan]{vegdist}}} \item{\code{euclidean}}{\code{\link[vegan]{vegdist}}} \item{\code{canberra}}{\code{\link[vegan]{vegdist}}} \item{\code{bray}}{\code{\link[vegan]{vegdist}}} \item{\code{kulczynski}}{\code{\link[vegan]{vegdist}}} \item{\code{jaccard}}{\code{\link[vegan]{vegdist}}} \item{\code{gower}}{\code{\link[vegan]{vegdist}}} \item{\code{altGower}}{\code{\link[vegan]{vegdist}}} \item{\code{morisita}}{\code{\link[vegan]{vegdist}}} \item{\code{horn}}{\code{\link[vegan]{vegdist}}} \item{\code{mountford}}{\code{\link[vegan]{vegdist}}} \item{\code{raup}}{\code{\link[vegan]{vegdist}}} \item{\code{binomial}}{\code{\link[vegan]{vegdist}}} \item{\code{chao}}{\code{\link[vegan]{vegdist}}} \item{\code{cao}}{\code{\link[vegan]{vegdist}}} \item{\code{w}}{\code{\link[vegan]{betadiver}}} \item{\code{-}}{\code{\link[vegan]{betadiver}}} \item{\code{c}}{\code{\link[vegan]{betadiver}}} \item{\code{wb}}{\code{\link[vegan]{betadiver}}} \item{\code{r}}{\code{\link[vegan]{betadiver}}} \item{\code{I}}{\code{\link[vegan]{betadiver}}} \item{\code{e}}{\code{\link[vegan]{betadiver}}} \item{\code{t}}{\code{\link[vegan]{betadiver}}} \item{\code{me}}{\code{\link[vegan]{betadiver}}} \item{\code{j}}{\code{\link[vegan]{betadiver}}} \item{\code{sor}}{\code{\link[vegan]{betadiver}}} \item{\code{m}}{\code{\link[vegan]{betadiver}}} \item{\code{-}}{\code{\link[vegan]{betadiver}}} \item{\code{co}}{\code{\link[vegan]{betadiver}}} \item{\code{cc}}{\code{\link[vegan]{betadiver}}} \item{\code{g}}{\code{\link[vegan]{betadiver}}} \item{\code{-}}{\code{\link[vegan]{betadiver}}} \item{\code{l}}{\code{\link[vegan]{betadiver}}} \item{\code{hk}}{\code{\link[vegan]{betadiver}}} \item{\code{rlb}}{\code{\link[vegan]{betadiver}}} \item{\code{sim}}{\code{\link[vegan]{betadiver}}} \item{\code{gl}}{\code{\link[vegan]{betadiver}}} \item{\code{z}}{\code{\link[vegan]{betadiver}}} \item{\code{maximum}}{\code{\link[stats]{dist}}} \item{\code{binary}}{\code{\link[stats]{dist}}} \item{\code{minkowski}}{\code{\link[stats]{dist}}} \item{\code{ANY}}{\code{\link[vegan]{designdist}}} }} \usage{ distanceMethodList } \description{ Distance methods should be specified by exact string match. Cannot do partial matching for all options, because too many similar options in downstream method dispatch. } \examples{ distanceMethodList } \seealso{ \code{\link[phyloseq]{distance}} } \keyword{datasets} phyloseq/man/envHash2otu_table.Rd0000644000175400017540000000303213177706002020064 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/IO-methods.R \name{envHash2otu_table} \alias{envHash2otu_table} \title{Convert a sequence-sample hash (like ENV file) into an OTU table.} \usage{ envHash2otu_table(tipSampleTable) } \arguments{ \item{tipSampleTable}{(Required). A two-column character table (matrix or data.frame), where each row specifies the sequence name and source sample, consistent with the env-file for the UniFrac server (\url{http://bmf2.colorado.edu/unifrac/}).} } \value{ \code{\link{otu_table}}. A trivial OTU table where each sequence is treated as a separate OTU. } \description{ Parses an ENV-file into a sparse matrix of species-by-sample, where each species-row has only one non-zero value. We call this sparse abundance table the trivial OTU table, where every sequence is treated as a separate species. If a phylogenetic tree is available, it can be submitted with this table as arguments to \code{\link{tip_glom}} to create an object with a non-trivial \code{otu_table}. } \examples{ # ## fakeSeqNameVec <- paste("seq_", 1:8, sep="") ## fakeSamNameVec <- c(rep("A", 4), rep("B", 4)) ## fakeSeqAbunVec <- sample(1:50, 8, TRUE) ## test <- cbind(fakeSeqNameVec, fakeSamNameVec, fakeSeqAbunVec) ## testotu <- envHash2otu_table( test ) ## test <- cbind(fakeSeqNameVec, fakeSamNameVec) ## testotu <- envHash2otu_table( test ) } \references{ \url{http://bmf2.colorado.edu/unifrac/} } \seealso{ \code{\link{import_env_file}} \code{\link{tip_glom}} \code{\link{otu_table}} } \keyword{internal} phyloseq/man/estimate_richness.Rd0000644000175400017540000000454713177706002020234 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/extend_vegan.R \name{estimate_richness} \alias{estimate_richness} \title{Summarize alpha diversity} \usage{ estimate_richness(physeq, split = TRUE, measures = NULL) } \arguments{ \item{physeq}{(Required). \code{\link{phyloseq-class}}, or alternatively, an \code{\link{otu_table-class}}. The data about which you want to estimate the richness.} \item{split}{(Optional). Logical. Should a separate set of richness estimates be performed for each sample? Or alternatively, pool all samples and estimate richness of the entire set.} \item{measures}{(Optional). Default is \code{NULL}, meaning that all available alpha-diversity measures will be included. Alternatively, you can specify one or more measures as a character vector of measure names. Values must be among those supported: \code{c("Observed", "Chao1", "ACE", "Shannon", "Simpson", "InvSimpson", "Fisher")}.} } \value{ A \code{data.frame} of the richness estimates, and their standard error. } \description{ Performs a number of standard alpha diversity estimates, and returns the results as a \code{data.frame}. Strictly speaking, this function is not only estimating richness, despite its name. It can operate on the cumulative population of all samples in the dataset, or by repeating the richness estimates for each sample individually. NOTE: You must use untrimmed datasets for meaningful results, as these estimates (and even the ``observed'' richness) are highly dependent on the number of singletons. You can always trim the data later on if needed, just not before using this function. } \examples{ ## There are many more interesting examples at the phyloseq online tutorials. ## http://joey711.github.com/phyloseq/plot_richness-examples data("esophagus") # Default is all available measures estimate_richness(esophagus) # Specify just one: estimate_richness(esophagus, measures="Observed") # Specify a few: estimate_richness(esophagus, measures=c("Observed", "InvSimpson", "Shannon", "Chao1")) } \seealso{ Check out the custom plotting function, \code{\link{plot_richness}}, for easily showing the results of different estimates, with method-specific error-bars. Also check out the internal functions borrowed from the \code{vegan} package: \code{\link[vegan]{estimateR}} \code{\link[vegan]{diversity}} \code{\link[vegan]{fisherfit}} } phyloseq/man/export_env_file.Rd0000644000175400017540000000251213177706002017701 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/IO-methods.R \name{export_env_file} \alias{export_env_file} \title{Export environment (ENV) file for UniFrac Server.} \usage{ export_env_file(physeq, file = "", writeTree = TRUE, return = FALSE) } \arguments{ \item{physeq}{(Required). Experiment-level (\code{\link{phyloseq-class}}) object. Ideally this also contains the phylogenetic tree, which is also exported by default.} \item{file}{(Optional). The file path for export. If not-provided, the expectation is that you will want to set \code{return} to \code{TRUE}, and manipulate the ENV table on your own. Default is \code{""}, skipping the ENV file from being written to a file.} \item{writeTree}{(Optional). Write the phylogenetic tree as well as the the ENV table. Default is \code{TRUE}.} \item{return}{(Optional). Should the ENV table be returned to the R workspace? Default is \code{FALSE}.} } \description{ Creates the environment table that is needed for the original UniFrac algorithm. Useful for cross-checking, or if want to use UniFrac server. Optionally the ENV-formatted table can be returned to the \code{R} workspace, and the tree component can be exported as Nexus format (Recommended). } \examples{ # # Load example data # data(esophagus) # export_env_file(esophagus, "~/Desktop/esophagus.txt") } phyloseq/man/export_mothur_dist.Rd0000644000175400017540000000337013177706002020456 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/IO-methods.R \name{export_mothur_dist} \alias{export_mothur_dist} \title{Export a distance object as \code{.names} and \code{.dist} files for mothur} \usage{ export_mothur_dist(x, out=NULL, makeTrivialNamesFile=NULL) } \arguments{ \item{x}{(Required). A \code{"dist"} object, or a symmetric matrix.} \item{out}{(Optional). The desired output filename for the \code{.dist} file, OR left \code{NULL}, the default, in which case the mothur-formated distance table is returned to \code{R} standard out.} \item{makeTrivialNamesFile}{(Optional). Default \code{NULL}. The desired name of the \code{.names} file. If left \code{NULL}, the file name will be a modified version of the \code{out} argument.} } \value{ A character vector of the different cutoff values contained in the file. For a given set of arguments to the \code{cluster()} command from within \emph{mothur}, a number of OTU-clustering results are returned in the same list file. The exact cutoff values used by \emph{mothur} can vary depending on the input data. This simple function returns the cutoffs that were actually included in the \emph{mothur} output. This an important extra step prior to importing the OTUs with the \code{import_mothur_otulist()} function. } \description{ The purpose of this function is to allow a user to easily export a distance object as a pair of files that can be immediately imported by mothur for OTU clustering and related analysis. A distance object can be created in \code{R} in a number of ways, including via cataloguing the cophentic distances of a tree object. } \examples{ # data(esophagus) myDistObject <- as.dist(ape::cophenetic.phylo(phy_tree(esophagus))) export_mothur_dist(myDistObject) } phyloseq/man/extract-methods.Rd0000644000175400017540000000602413177706002017626 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/extract-methods.R \docType{methods} \name{[,otu_table,ANY,ANY,ANY-method} \alias{[,otu_table,ANY,ANY,ANY-method} \alias{[,sample_data,ANY,ANY,ANY-method} \alias{[,taxonomyTable,ANY,ANY,ANY-method} \alias{[,XStringSet,character,ANY,ANY-method} \title{Method extensions to extraction operator for phyloseq objects.} \usage{ \S4method{[}{otu_table,ANY,ANY,ANY}(x, i, j, ..., drop = TRUE) \S4method{[}{sample_data,ANY,ANY,ANY}(x, i, j, ..., drop = TRUE) \S4method{[}{taxonomyTable,ANY,ANY,ANY}(x, i, j, ..., drop = TRUE) \S4method{[}{XStringSet,character,ANY,ANY}(x, i) } \arguments{ \item{x}{ object from which to extract element(s) or in which to replace element(s). } \item{i}{ indices specifying elements to extract or replace. Indices are \code{numeric} or \code{character} vectors or empty (missing) or \code{NULL}. Numeric values are coerced to integer as by \code{\link{as.integer}} (and hence truncated towards zero). Character vectors will be matched to the \code{\link{names}} of the object (or for matrices/arrays, the \code{\link{dimnames}}): see \sQuote{Character indices} below for further details. For \code{[}-indexing only: \code{i}, \code{j}, \code{\dots} can be logical vectors, indicating elements/slices to select. Such vectors are recycled if necessary to match the corresponding extent. \code{i}, \code{j}, \code{\dots} can also be negative integers, indicating elements/slices to leave out of the selection. When indexing arrays by \code{[} a single argument \code{i} can be a matrix with as many columns as there are dimensions of \code{x}; the result is then a vector with elements corresponding to the sets of indices in each row of \code{i}. An index value of \code{NULL} is treated as if it were \code{integer(0)}. } \item{j}{See \code{\link[base]{Extract}}} \item{...}{See \code{\link[base]{Extract}}} \item{drop}{For matrices and arrays. If \code{TRUE} the result is coerced to the lowest possible dimension (see the examples). This only works for extracting elements, not for the replacement. See \code{\link{drop}} for further details. } } \description{ See the documentation for the \code{\link[base]{Extract}} generic, defined in the R \code{\link[base]{base-package}} for the expected behavior. } \details{ One special exception to standard behavior of these methods in phyloseq is that the \code{drop} argument is set internally to \code{FALSE}. This helps avoid bugs during complicated subsetting with multiple components, where it is necessary to be able to use a two dimensional indexing even if one of those dimensions has only 1 rank. Put another way, these phyloseq-defined extractions never collapse their result into a vector. See the documentation of \code{\link[base]{Extract}} for more information about the \code{drop} argument. } \examples{ data(esophagus) nrow(otu_table(esophagus)) nrow(otu_table(esophagus)[1:5, ]) } \seealso{ \code{\link[base]{Extract}} } phyloseq/man/filter_taxa.Rd0000644000175400017540000000406213177706002017015 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/transform_filter-methods.R \name{filter_taxa} \alias{filter_taxa} \title{Filter taxa based on across-sample OTU abundance criteria} \usage{ filter_taxa(physeq, flist, prune=FALSE) } \arguments{ \item{physeq}{(Required). A \code{\link{phyloseq-class}} object that you want to trim/filter.} \item{flist}{(Required). A function or list of functions that take a vector of abundance values and return a logical. Some canned useful function types are included in the \code{genefilter}-package.} \item{prune}{(Optional). A logical. Default \code{FALSE}. If \code{TRUE}, then the function returns the pruned \code{\link{phyloseq-class}} object, rather than the logical vector of taxa that passed the filter.} } \value{ A logical vector equal to the number of taxa in \code{physeq}. This can be provided directly to \code{\link{prune_taxa}} as first argument. Alternatively, if \code{prune==TRUE}, the pruned \code{\link{phyloseq-class}} object is returned instead. } \description{ This function is directly analogous to the \code{\link[genefilter]{genefilter}} function for microarray filtering, but is used for filtering OTUs from phyloseq objects. It applies an arbitrary set of functions --- as a function list, for instance, created by \code{\link[genefilter]{filterfun}} --- as across-sample criteria, one OTU at a time. It takes as input a phyloseq object, and returns a logical vector indicating whether or not each OTU passed the criteria. Alternatively, if the \code{"prune"} option is set to \code{FALSE}, it returns the already-trimmed version of the phyloseq object. } \examples{ data("enterotype") require("genefilter") flist <- filterfun(kOverA(5, 2e-05)) ent.logi <- filter_taxa(enterotype, flist) ent.trim <- filter_taxa(enterotype, flist, TRUE) identical(ent.trim, prune_taxa(ent.logi, enterotype)) identical(sum(ent.logi), ntaxa(ent.trim)) filter_taxa(enterotype, flist, TRUE) } \seealso{ \code{\link[genefilter]{filterfun}}, \code{\link{genefilter_sample}}, \code{\link{filterfun_sample}} } phyloseq/man/filterfun_sample.Rd0000644000175400017540000000220113177706002020043 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/transform_filter-methods.R \name{filterfun_sample} \alias{filterfun_sample} \title{A sample-wise filter function builder analogous to \code{\link[genefilter]{filterfun}}.} \usage{ filterfun_sample(...) } \arguments{ \item{...}{A comma-separated list of functions.} } \value{ An enclosure (function) that itself will return a logical vector, according to the functions provided in the argument list, evaluated in order. The output of filterfun_sample is appropriate for the `flist' argument to the genefilter_sample method. } \description{ See the \code{\link[genefilter]{filterfun}}, from the Bioconductor repository, for a taxa-/gene-wise filter (and further examples). } \examples{ # Use simulated abundance matrix set.seed(711) testOTU <- otu_table(matrix(sample(1:50, 25, replace=TRUE), 5, 5), taxa_are_rows=FALSE) f1 <- filterfun_sample(topk(2)) wh1 <- genefilter_sample(testOTU, f1, A=2) wh2 <- c(TRUE, TRUE, TRUE, FALSE, FALSE) prune_taxa(wh1, testOTU) prune_taxa(wh2, testOTU) } \seealso{ \code{\link[genefilter]{filterfun}}, \code{\link{genefilter_sample}} } phyloseq/man/fix_phylo.Rd0000644000175400017540000000066113177706002016515 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/phylo-class.R \docType{methods} \name{fix_phylo} \alias{fix_phylo} \alias{fix_phylo,phylo-method} \title{Method for fixing problems with phylo-class trees in phyloseq} \usage{ fix_phylo(tree) \S4method{fix_phylo}{phylo}(tree) } \description{ For now this only entails replacing each missing (\code{NA}) branch-length value with 0.0. } \keyword{internal} phyloseq/man/gapstat_ord.Rd0000644000175400017540000000556213177706002017030 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/ordination-methods.R \name{gapstat_ord} \alias{gapstat_ord} \title{Estimate the gap statistic on an ordination result} \usage{ gapstat_ord(ord, axes = c(1:2), type = "sites", FUNcluster = function(x, k) { list(cluster = pam(x, k, cluster.only = TRUE)) }, K.max = 8, ...) } \arguments{ \item{ord}{(Required). An ordination object. The precise class can vary. Any ordination classes supported internally by the phyloseq package should work, ultimately by passing to the \code{\link[vegan]{scores}} function or its internal extensions in phyloseq.} \item{axes}{(Optional). The ordination axes that you want to include.} \item{type}{(Optional). One of \code{"sites"} (the vegan package label for samples) or \code{"species"} (the vegan package label for OTUs/taxa). Default is \code{"sites"}.} \item{FUNcluster}{(Optional). This is passed to \code{\link[cluster]{clusGap}}. The documentation is copied here for convenience: a function which accepts as first argument a (data) matrix like \code{x}, second argument, say (the number of desired clusters) \code{k}, where \code{k >= 2}, and returns a list with a component named (or shortened to) cluster which is a vector of length \code{n = nrow(x)} of integers in \code{1:k} determining the clustering or grouping of the \code{n} observations. The default value is the following function, which wraps partitioning around medoids, \code{\link[cluster]{pam}}: \code{function(x, k){list(cluster = pam(x, k, cluster.only=TRUE))}} Any function that has these input/output properties (performing a clustering) will suffice. The more appropriate the clustering method, the better chance your gap statistic results will be useful.} \item{K.max}{(Optional). A single positive integer value. It indicates the maximum number of clusters that will be considered. Value must be at least two. This is passed to \code{\link[cluster]{clusGap}}.} \item{...}{(Optional). Additional named parameters passed on to \code{\link[cluster]{clusGap}}. For example, the \code{method} argument provides for extensive options regarding the method by which the ``optimal'' number of clusters is computed from the gap statistics (and their standard deviations). See the \code{\link[cluster]{clusGap}} documentation for more details.} } \value{ An object of S3 class \code{"clusGap"}, basically a list with components. See the \code{\link[cluster]{clusGap}} documentation for more details. } \description{ This is a wrapper for the \code{\link[cluster]{clusGap}} function, expecting an ordination result as the main data argument. } \examples{ data("soilrep") sord = ordinate(soilrep, "PCoA", "bray") # Evaluate axes with scree plot plot_scree(sord) # Gap Statistic gs = gapstat_ord(sord, axes=1:3, verbose=FALSE) # plot_ordination(soilrep, sord, color="Treatment") plot_clusgap(gs) print(gs, method="Tibs2001SEmax") } phyloseq/man/genefilter_sample-methods.Rd0000644000175400017540000000532013177706002021637 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/transform_filter-methods.R \docType{methods} \name{genefilter_sample} \alias{genefilter_sample} \alias{genefilter_sample,matrix-method} \alias{genefilter_sample,otu_table-method} \alias{genefilter_sample,phyloseq-method} \title{Filter OTUs with arbitrary function, sample-wise.} \usage{ genefilter_sample(X, flist, A=1) \S4method{genefilter_sample}{matrix}(X, flist, A = 1) \S4method{genefilter_sample}{otu_table}(X, flist, A = 1) \S4method{genefilter_sample}{phyloseq}(X, flist, A = 1) } \arguments{ \item{X}{The object that needs trimming. Can be matrix, otu_table, or higher- order phyloseq classes that contain an otu_table.} \item{flist}{An enclosure object, typically created with \code{\link{filterfun_sample}}} \item{A}{An integer. The number of samples in which a taxa / OTUs passed the filter for it to be labeled TRUE in the output logical vector.} } \value{ A logical vector with names equal to taxa_names (or rownames, if matrix). } \description{ A general OTU trimming function for selecting OTUs that satisfy some criteria within the distribution of each sample, and then also an additional criteria for number of samples that must pass. This is a genefilter-like function that only considers sample-wise criteria. The number of acceptable samples is used as the final criteria (set by the argument \code{A}) to determine whether or not the taxa should be retained (\code{TRUE}) or not (\code{FALSE}). Just like with genefilter, a logical having length equal to nrow()/\code{\link{ntaxa}} is returned, indicating which should be kept. This output can be provided directly to OTU trimming function, \code{\link{prune_taxa}}. By contrast, \code{\link[genefilter]{genefilter}}, of the genefilter package in Bioconductor, works only on the rows of a matrix. Note that, because \code{\link{otu_table-class}} inherits directly from the \code{\link{matrix-class}}, an unmodified otu_table can be provided to \code{genefilter}, but be mindful of the orientation of the otu_table (use \code{\link{taxa_are_rows}}), and transpose (\code{\link[phyloseq]{t}}) if needed. } \examples{ # ## testOTU <- otu_table(matrix(sample(1:50, 25, replace=TRUE), 5, 5), taxa_are_rows=FALSE) ## f1 <- filterfun_sample(topk(2)) ## wh1 <- genefilter_sample(testOTU, f1, A=2) ## wh2 <- c(TRUE, TRUE, TRUE, FALSE, FALSE) ## prune_taxa(wh1, testOTU) ## prune_taxa(wh2, testOTU) ## ## tax_table1 <- tax_table(matrix("abc", 5, 5)) ## prune_taxa(wh1, tax_table1) ## prune_taxa(wh2, tax_table1) } \seealso{ \code{\link[genefilter]{genefilter}}, \code{\link{filterfun_sample}}, \code{\link[phyloseq]{t}}, \code{\link{prune_taxa}} } \keyword{OTU} \keyword{agglomerate} \keyword{cluster} \keyword{tree} phyloseq/man/get.component.classes.Rd0000644000175400017540000000114613177706002020727 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/phyloseq-class.R \name{get.component.classes} \alias{get.component.classes} \title{Show the component objects classes and slot names.} \usage{ get.component.classes() } \value{ a character vector of the component objects classes, where each element is named by the corresponding slot name in the phyloseq-class. } \description{ There are no arguments to this function. It returns a named character when called, which can then be used for tests of component data types, etc. } \examples{ # #get.component.classes() } \keyword{internal} phyloseq/man/get_sample-methods.Rd0000644000175400017540000000174713177706002020303 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/almostAllAccessors.R \docType{methods} \name{get_sample} \alias{get_sample} \alias{get_sample,otu_table-method} \alias{get_sample,phyloseq-method} \title{Returns all abundance values for species \code{i}.} \usage{ get_sample(physeq, i) \S4method{get_sample}{otu_table}(physeq, i) \S4method{get_sample}{phyloseq}(physeq, i) } \arguments{ \item{physeq}{(Required). \code{\link{otu_table-class}}, or \code{\link{phyloseq-class}}.} \item{i}{(Required). A single taxa/species/OTU ID for which you want to know the abundance in each sample.} } \value{ An integer vector of the abundance values for each sample in \code{physeq} for species \code{i} } \description{ This is a simple accessor function for investigating a single species-of-interest. } \examples{ data(esophagus) taxa_names(esophagus) get_sample(esophagus, "59_5_19") } \seealso{ \code{\link{get_taxa}} \code{\link{taxa_names}} \code{\link{sample_names}} } phyloseq/man/get_taxa-methods.Rd0000644000175400017540000000176613177706002017760 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/almostAllAccessors.R \docType{methods} \name{get_taxa} \alias{get_taxa} \alias{get_taxa,otu_table-method} \alias{get_taxa,phyloseq-method} \title{Returns all abundance values of sample \code{i}.} \usage{ get_taxa(physeq, i) \S4method{get_taxa}{otu_table}(physeq, i) \S4method{get_taxa}{phyloseq}(physeq, i) } \arguments{ \item{physeq}{(Required). \code{\link{otu_table-class}}, or \code{\link{phyloseq-class}}.} \item{i}{(Required). A single sample for which you want to know the abundance of each species. Can be integer for index value, or sample name.} } \value{ An integer vector of the abundance values for each species in \code{physeq} for sample \code{i} } \description{ This is a simple accessor function for investigating a single sample-of-interest. } \examples{ data(esophagus) sample_names(esophagus) get_taxa(esophagus, "B") } \seealso{ \code{\link{get_sample}} \code{\link{taxa_names}} \code{\link{sample_names}} } phyloseq/man/get_taxa_unique.Rd0000644000175400017540000000237713177706002017704 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/almostAllAccessors.R \name{get_taxa_unique} \alias{get_taxa_unique} \title{Get a unique vector of the observed taxa at a particular taxonomic rank} \usage{ get_taxa_unique(physeq, taxonomic.rank=rank_names(physeq)[1], errorIfNULL=TRUE) } \arguments{ \item{physeq}{(Required). \code{\link{taxonomyTable-class}}, or \code{\link{phyloseq-class}}.} \item{taxonomic.rank}{(Optional). Character. The taxonomic rank to use. Must select from the set indicated by \code{get_taxa_unique}. Default is to take the first column of the \code{taxonomyTable} component.} \item{errorIfNULL}{(Optional). Logical. Should the accessor stop with an error if the slot is empty (\code{NULL})? Default \code{TRUE}.} } \value{ Character vector. Unique vector of the observed taxa at a particular taxonomic rank } \description{ This is a simple accessor function to make it more convenient to determine the different taxa present for a particular taxonomic rank in a given \code{\link{phyloseq-class}} object. } \examples{ data(enterotype) get_taxa_unique(enterotype) data(GlobalPatterns) get_taxa_unique(GlobalPatterns, "Family") } \seealso{ \code{\link{get_taxa}} \code{\link{taxa_names}} \code{\link{sample_names}} } phyloseq/man/get_variable.Rd0000644000175400017540000000202513177706002017134 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/almostAllAccessors.R \name{get_variable} \alias{get_variable} \title{Get the values for a particular variable in sample_data} \usage{ get_variable(physeq, varName) } \arguments{ \item{physeq}{(Required). \code{\link{sample_data-class}}, or \code{\link{phyloseq-class}}.} \item{varName}{(Required). Character string of the variable name in \code{sample_data}. Use \code{sample_variables(physeq)} for available variables in your object.} } \value{ Data. The clas of the data depends on what the contents of sample_data. } \description{ This is a simple accessor function for streamlining access to values/vectors/factors/etc contained in the sample_data. } \examples{ # Load the GlobalPatterns dataset into the workspace environment data(GlobalPatterns) # Look at the different values for SampleType get_variable(GlobalPatterns, "SampleType") } \seealso{ \code{\link{get_taxa}} \code{\link{taxa_names}} \code{\link{sample_names}} \code{\link{sample_variables}} } phyloseq/man/getslots.phyloseq.Rd0000644000175400017540000000172313177706002020223 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/phyloseq-class.R \name{getslots.phyloseq} \alias{getslots.phyloseq} \title{Return the non-empty slot names of a phyloseq object.} \usage{ getslots.phyloseq(physeq) } \arguments{ \item{physeq}{A \code{\link{phyloseq-class}} object. If \code{physeq} is a component data class, then just returns the class of \code{physeq}.} } \value{ identical to getSlots. A named character vector of the slot classes of a particular S4 class, where each element is named by the slot name it represents. If \code{physeq} is a component data object, then a vector of length (1) is returned, named according to its slot name in the \code{\link{phyloseq-class}}. } \description{ Like \code{\link{getSlots}}, but returns the class name if argument is component data object. } \examples{ # data(GlobalPatterns) getslots.phyloseq(GlobalPatterns) data(esophagus) getslots.phyloseq(esophagus) } \seealso{ merge_phyloseq } phyloseq/man/import.Rd0000644000175400017540000000436613177706002016034 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/IO-methods.R \name{import} \alias{import} \title{Universal import method (wrapper) for phyloseq-package} \usage{ import(pipelineName, ...) } \arguments{ \item{pipelineName}{(Required). Character string. The name of the analysis tool / pipeline / package that created the OTU-cluster data or other data that you now want to import. Current options are \code{c("mothur", "pyrotagger", "QIIME", "RDP")}, and only the first letter is necessary.} \item{...}{(Required). Additional named arguments providing file paths, and possible other paramaters to the desired tool-specific import function.} } \value{ In most cases a \code{\link{phyloseq-class}} will be returned, though the included component data will vary by pipeline/tool, and also by the types of data files provided. The expected behavior is to return the most-comprehensive object possible, given the provided arguments and pipeline/tool. } \description{ A user must still understand the additional arguments required for each type of import data. Those arguments are described in detail at the tool-specific \code{import_*} links below. Each clustering tool / package / pipeline has its own idiosyncratic set of file names / types, and it remains the responsibility of the user to understand which file-path should be provided to each argument for the particular importing submethod. This method merely provides a central documentation and method-name, and the arguments are passed along as-is. } \examples{ ## See documentation of a specific import function } \references{ BIOM: \url{http://www.biom-format.org/} mothur: \url{http://www.mothur.org/wiki/Main_Page} PyroTagger: \url{http://pyrotagger.jgi-psf.org/} QIIME: \url{http://qiime.org/} RDP pipeline: \url{http://pyro.cme.msu.edu/index.jsp} } \seealso{ For BIOM format, see: \code{\link{import_biom}} For mothur, see: \code{\link{import_mothur}} Separate tools for mothur are also: \code{\link{show_mothur_cutoffs}} \code{\link{import_mothur_dist}} \code{\link{export_mothur_dist}} For PyroTagger, see: \code{\link{import_pyrotagger_tab}} For QIIME legacy format, see: \code{\link{import_qiime}} For RDP pipeline, see: \code{\link{import_RDP_cluster}} \code{\link{import_RDP_otu}} } phyloseq/man/import_RDP_cluster.Rd0000644000175400017540000000361113177706002020272 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/IO-methods.R \name{import_RDP_cluster} \alias{import_RDP_cluster} \title{Import RDP cluster file and return otu_table (abundance table).} \usage{ import_RDP_cluster(RDP_cluster_file) } \arguments{ \item{RDP_cluster_file}{A character string. The name of the \code{".clust"} file produced by the the complete linkage clustering step of the RDP pipeline.} } \value{ An \code{\link{otu_table}} object parsed from the \code{".clust"} file. } \description{ The RDP cluster pipeline (specifically, the output of the complete linkage clustering step) has no formal documentation for the \code{".clust"} file or its apparent sequence naming convention. } \details{ \code{http://pyro.cme.msu.edu/index.jsp} The cluster file itself contains the names of all sequences contained in input alignment. If the upstream barcode and aligment processing steps are also done with the RDP pipeline, then the sequence names follow a predictable naming convention wherein each sequence is named by its sample and sequence ID, separated by a \code{"_"} as delimiter: \code{"sampleName_sequenceIDnumber"} This import function assumes that the sequence names in the cluster file follow this convention, and that the sample name does not contain any \code{"_"}. It is unlikely to work if this is not the case. It is likely to work if you used the upstream steps in the RDP pipeline to process your raw (barcoded, untrimmed) fasta/fastq data. This function first loops through the \code{".clust"} file and collects all of the sample names that appear. It secondly loops through each OTU (\code{"cluster"}; each row of the cluster file) and sums the number of sequences (reads) from each sample. The resulting abundance table of OTU-by-sample is trivially coerced to an \code{\link{otu_table}} object, and returned. } \references{ \url{http://pyro.cme.msu.edu/index.jsp} } phyloseq/man/import_RDP_otu.Rd0000644000175400017540000000275313177706002017426 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/IO-methods.R \name{import_RDP_otu} \alias{import_RDP_otu} \title{Import new RDP OTU-table format} \usage{ import_RDP_otu(otufile) } \arguments{ \item{otufile}{(Optional). A character string indicating the file location of the OTU file, produced/exported according to the instructions above.} } \value{ A \code{\link{otu_table-class}} object. } \description{ Recently updated tools on RDP Pyro site make it easier to import Pyrosequencing output into R. The modified tool ``Cluster To R Formatter'' can take a cluster file (generated from RDP Clustering tools) to create a community data matrix file for distance cutoff range you are interested in. The resulting output file is a tab-delimited file containing the number of sequences for each sample for each OTU. The OTU header naming convention is \code{"OTU_"} followed by the OTU number in the cluster file. It pads ``0''s to make the OTU header easy to sort. The OTU numbers are not necessarily in order. } \examples{ otufile <- system.file("extdata", "rformat_dist_0.03.txt.gz", package="phyloseq") ### the gzipped file is automatically recognized, and read using R-connections ex_otu <- import_RDP_otu(otufile) class(ex_otu) ntaxa(ex_otu) nsamples(ex_otu) sample_sums(ex_otu) head(t(ex_otu)) } \seealso{ An alternative ``cluster'' file importer for RDP results: \code{\link{import_RDP_cluster}} The main RDP-pyrosequencing website \url{http://pyro.cme.msu.edu/index.jsp} } phyloseq/man/import_biom.Rd0000644000175400017540000002003513177706002017031 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/IO-methods.R \name{import_biom} \alias{import_biom} \title{Import phyloseq data from biom-format file} \usage{ import_biom(BIOMfilename, treefilename=NULL, refseqfilename=NULL, refseqFunction=readDNAStringSet, refseqArgs=NULL, parseFunction=parse_taxonomy_default, parallel=FALSE, version=1.0, ...) } \arguments{ \item{BIOMfilename}{(Required). A character string indicating the file location of the BIOM formatted file. This is a JSON formatted file, specific to biological datasets, as described in \url{http://www.qiime.org/svn_documentation/documentation/biom_format.html}{the biom-format home page}. In principle, this file should include you OTU abundance data (OTU table), your taxonomic classification data (taxonomy table), as well as your sample data, for instance what might be in your ``sample map'' in QIIME. A phylogenetic tree is not yet supported by biom-format, and so is a separate argument here. If, for some reason, your biom-format file is missing one of these mentioned data types but you have it in a separate file, you can first import the data that is in the biom file using this function, \code{import_biom}, and then ``merge'' the remaining data after you have imported with other tools using the relatively general-purpose data merging function called \code{\link{merge_phyloseq}}.} \item{treefilename}{(Optional). Default value is \code{NULL}. A file representing a phylogenetic tree or a \code{\link{phylo}} object. Files can be NEXUS or Newick format. See \code{\link{read_tree}} for more details. Also, if using a recent release of the GreenGenes database tree, try the \code{\link{read_tree_greengenes}} function -- this should solve some issues specific to importing that tree. If provided, the tree should have the same OTUs/tip-labels as the OTUs in the other files. Any taxa or samples missing in one of the files is removed from all. As an example from the QIIME pipeline, this tree would be a tree of the representative 16S rRNA sequences from each OTU cluster, with the number of leaves/tips equal to the number of taxa/species/OTUs, or the complete reference database tree that contains the OTU identifiers of every OTU in your abundance table. Note that this argument can be a tree object (\code{\link[ape]{phylo}}-class) for cases where the tree has been --- or needs to be --- imported separately, as in the case of the GreenGenes tree mentioned earlier (code{\link{read_tree_greengenes}}).} \item{refseqfilename}{(Optional). Default \code{NULL}. The file path of the biological sequence file that contains at a minimum a sequence for each OTU in the dataset. Alternatively, you may provide an already-imported \code{\link[Biostrings]{XStringSet}} object that satisfies this condition. In either case, the \code{\link{names}} of each OTU need to match exactly the \code{\link{taxa_names}} of the other components of your data. If this is not the case, for example if the data file is a FASTA format but contains additional information after the OTU name in each sequence header, then some additional parsing is necessary, which you can either perform separately before calling this function, or describe explicitly in a custom function provided in the (next) argument, \code{refseqFunction}. Note that the \code{\link[Biostrings]{XStringSet}} class can represent any arbitrary sequence, including user-defined subclasses, but is most-often used to represent RNA, DNA, or amino acid sequences. The only constraint is that this special list of sequences has exactly one named element for each OTU in the dataset.} \item{refseqFunction}{(Optional). Default is \code{\link[Biostrings]{readDNAStringSet}}, which expects to read a fasta-formatted DNA sequence file. If your reference sequences for each OTU are amino acid, RNA, or something else, then you will need to specify a different function here. This is the function used to read the file connection provided as the the previous argument, \code{refseqfilename}. This argument is ignored if \code{refseqfilename} is already a \code{\link[Biostrings]{XStringSet}} class.} \item{refseqArgs}{(Optional). Default \code{NULL}. Additional arguments to \code{refseqFunction}. See \code{\link[Biostrings]{XStringSet-io}} for details about additional arguments to the standard read functions in the Biostrings package.} \item{parseFunction}{(Optional). A function. It must be a function that takes as its first argument a character vector of taxonomic rank labels for a single OTU and parses and names each element (an optionally removes unwanted elements). Further details and examples of acceptable functions are provided in the documentation for \code{\link{parse_taxonomy_default}}. There are many variations on taxonomic nomenclature, and naming conventions used to store that information in various taxonomic databases and phylogenetic assignment algorithms. A popular database, \url{http://greengenes.lbl.gov/cgi-bin/nph-index.cgi}{greengenes}, has its own custom parsing function provided in the phyloseq package, \code{\link{parse_taxonomy_greengenes}}, and more can be contributed or posted as code snippets as needed. They can be custom-defined by a user immediately prior to the the call to \code{\link{import_biom}}, and this is a suggested first step to take when trouble-shooting taxonomy-related errors during file import.} \item{parallel}{(Optional). Logical. Wrapper option for \code{.parallel} parameter in \code{plyr-package} functions. If \code{TRUE}, apply parsing functions in parallel, using parallel backend provided by \code{\link{foreach}} and its supporting backend packages. One caveat, plyr-parallelization currently works most-cleanly with \code{multicore}-like backends (Mac OS X, Unix?), and may throw warnings for SNOW-like backends. See the example below for code invoking multicore-style backend within the \code{doParallel} package. Finally, for many datasets a parallel import should not be necessary because a serial import will be just as fast and the import is often only performed one time; after which the data should be saved as an RData file using the \code{\link{save}} function.} \item{version}{(Optional). Numeric. The expected version number of the file. As the BIOM format evolves, version-specific importers may be available by adjusting the version value. Default is \code{1.0}. Not yet implemented. Parsing of the biom-format is done mostly by the biom package now available in CRAN.} \item{...}{Additional parameters passed on to \code{\link{read_tree}}.} } \value{ A \code{\link{phyloseq-class}} object. } \description{ New versions of QIIME produce a more-comprehensive and formally-defined JSON file format, called biom file format: } \details{ ``The biom file format (canonically pronounced `biome') is designed to be a general-use format for representing counts of observations in one or more biological samples. BIOM is a recognized standard for the Earth Microbiome Project and is a Genomics Standards Consortium candidate project.'' \url{http://biom-format.org/} } \examples{ # An included example of a rich dense biom file rich_dense_biom <- system.file("extdata", "rich_dense_otu_table.biom", package="phyloseq") import_biom(rich_dense_biom, parseFunction=parse_taxonomy_greengenes) # An included example of a sparse dense biom file rich_sparse_biom <- system.file("extdata", "rich_sparse_otu_table.biom", package="phyloseq") import_biom(rich_sparse_biom, parseFunction=parse_taxonomy_greengenes) # # # Example code for importing large file with parallel backend # library("doParallel") # registerDoParallel(cores=6) # import_biom("my/file/path/file.biom", parseFunction=parse_taxonomy_greengenes, parallel=TRUE) } \references{ \href{http://www.qiime.org/svn_documentation/documentation/biom_format.html}{biom-format} } \seealso{ \code{\link{import}} \code{\link{import_qiime}} \code{\link{read_tree}} \code{\link{read_tree_greengenes}} \code{\link[biomformat]{read_biom}} \code{\link[biomformat]{biom_data}} \code{\link[biomformat]{sample_metadata}} \code{\link[biomformat]{observation_metadata}} \code{\link[Biostrings]{XStringSet-io}} } phyloseq/man/import_env_file.Rd0000644000175400017540000000237013177706002017674 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/IO-methods.R \name{import_env_file} \alias{import_env_file} \title{Read a UniFrac-formatted ENV file.} \usage{ import_env_file(envfilename, tree=NULL, sep="\t", ...) } \arguments{ \item{envfilename}{(Required). A charater string of the ENV filename (relative or absolute)} \item{tree}{(Optional). \code{\link{phylo-class}} object to be paired with the output otu_table.} \item{sep}{A character string indicating the delimiter used in the file. The default is \code{"\t"}.} \item{...}{Additional parameters passed on to \code{\link{read.table}}.} } \value{ An \code{\link{otu_table-class}}, or \code{\link{phyloseq-class}} if a \code{\link{phylo-class}} argument is provided to \code{tree}. } \description{ Convenience wrapper function to read the environment-file, as formatted for input to the UniFrac server (\url{http://bmf2.colorado.edu/unifrac/}). The official format of these files is that each row specifies (in order) the sequence name, source sample, and (optionally) the number of times the sequence was observed. } \examples{ # import_env_file(myEnvFile, myTree) } \references{ \url{http://bmf2.colorado.edu/unifrac/} } \seealso{ \code{\link{import}} \code{\link{tip_glom}} } phyloseq/man/import_mothur.Rd0000644000175400017540000001344413177706002017427 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/IO-methods.R \name{import_mothur} \alias{import_mothur} \title{General function for importing mothur data files into phyloseq.} \usage{ import_mothur(mothur_list_file = NULL, mothur_group_file = NULL, mothur_tree_file = NULL, cutoff = NULL, mothur_shared_file = NULL, mothur_constaxonomy_file = NULL, parseFunction = parse_taxonomy_default) } \arguments{ \item{mothur_list_file}{(Optional). The list file name / location produced by \emph{mothur}.} \item{mothur_group_file}{(Optional). The name/location of the group file produced by \emph{mothur}'s \code{make.group()} function. It contains information about the sample source of individual sequences, necessary for creating a species/taxa abundance table (\code{otu_table}). See \code{http://www.mothur.org/wiki/Make.group}} \item{mothur_tree_file}{(Optional). A tree file, presumably produced by \emph{mothur}, and readable by \code{\link{read_tree}}. The file probably has extension \code{".tree"}.} \item{cutoff}{(Optional). A character string indicating the cutoff value, (or \code{"unique"}), that matches one of the cutoff-values used to produce the OTU clustering results contained within the list-file created by \emph{mothur} (and specified by the \code{mothur_list_file} argument). The default is to take the largest value among the cutoff values contained in the list file. If only one cutoff is included in the file, it is taken and this argument does not need to be specified. Note that the \code{cluster()} function within the \emph{mothur} package will often produce a list file with multiple cutoff values, even if a specific cutoff is specified. It is suggested that you check which cutoff values are available in a given list file using the \code{\link{show_mothur_cutoffs}} function.} \item{mothur_shared_file}{(Optional). A \href{http://www.mothur.org/wiki/Shared_file}{shared file} produced by \emph{mothur}.} \item{mothur_constaxonomy_file}{(Optional). A \href{http://www.mothur.org/wiki/Constaxonomy_file}{consensus taxonomy file} produced by \emph{mothur}.} \item{parseFunction}{(Optional). A specific function used for parsing the taxonomy string. See \code{\link{parse_taxonomy_default}} for an example. If the default is used, this function expects a semi-colon delimited taxonomy string, with no additional rank specifier. A common taxonomic database is GreenGenes, and in recent versions its taxonomy entries include a prefix, which is best cleaved and used to precisely label the ranks (\code{\link{parse_taxonomy_greengenes}}).} } \value{ The object class depends on the provided arguments. A phyloseq object is returned if enough data types are provided. If only one data component can be created from the data, it is returned. FASTER (recommended for larger data sizes): If only a \code{mothur_constaxonomy_file} is provided, then a \code{\link{taxonomyTable-class}} object is returned. If only a \code{mothur_shared_file} is provided, then an \code{\link{otu_table}} object is returned. SLOWER (but fine for small file sizes): The list and group file formats are extremely inefficient for large datasets, and they are not recommended. The mothur software provides tools for converting to other file formats, such as a so-called ``shared'' file. You should provide a shared file, or group/list files, but not both at the same time. If only a list and group file are provided, then an \code{otu_table} object is returned. Similarly, if only a list and tree file are provided, then only a tree is returned (\code{\link[ape]{phylo}}-class). } \description{ Technically all parameters are optional, but if you don't provide any file connections, then nothing will be returned. While the \code{list} and \code{group} files are the first two arguments for legacy-compatibility reasons, we don't recommend that you use these file types with modern (large) datasets. They are comically inefficient, as they store the name of every sequencing read in both files. The \emph{mothur} package provides conversions utilities to create other more-efficient formats, which we recommend, like the \href{http://www.mothur.org/wiki/Shared_file}{shared file} for an OTU table. Alternatively, mothur also provides a utility to create a biom-format file that is independent of OTU clustering platform. Biom-format files should be imported not with this function, but with \code{\link{import_biom}}. The resulting objects after import should be \code{\link{identical}} in R. } \examples{ # # The following example assumes you have downloaded the esophagus example # # dataset from the mothur wiki: # # "http://www.mothur.org/wiki/Esophageal_community_analysis" # # "http://www.mothur.org/w/images/5/55/Esophagus.zip" # # The path on your machine may (probably will) vary # mothur_list_file <- "~/Downloads/mothur/Esophagus/esophagus.an.list" # mothur_group_file <- "~/Downloads/mothur/Esophagus/esophagus.good.groups" # mothur_tree_file <- "~/Downloads/mothur/Esophagus/esophagus.tree" # # # Actual examples follow: # show_mothur_cutoffs(mothur_list_file) # test1 <- import_mothur(mothur_list_file, mothur_group_file, mothur_tree_file) # test2 <- import_mothur(mothur_list_file, mothur_group_file, mothur_tree_file, cutoff="0.02") # # Returns just a tree # import_mothur(mothur_list_file, mothur_tree_file=mothur_tree_file) # # Returns just an otu_table # import_mothur(mothur_list_file, mothur_group_file=mothur_group_file) # # Returns an error # import_mothur(mothur_list_file) # # Should return an "OMG, you must provide the list file" error # import_mothur() } \references{ \url{http://www.mothur.org/wiki/Main_Page} Schloss, P.D., et al., Introducing mothur: Open-source, platform-independent, community-supported software for describing and comparing microbial communities. Appl Environ Microbiol, 2009. 75(23):7537-41. } phyloseq/man/import_mothur_constaxonomy.Rd0000644000175400017540000000227213177706002022245 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/IO-methods.R \name{import_mothur_constaxonomy} \alias{import_mothur_constaxonomy} \title{Import mothur constaxonomy file and return a taxonomyTable} \usage{ import_mothur_constaxonomy(mothur_constaxonomy_file, parseFunction = parse_taxonomy_default) } \arguments{ \item{mothur_constaxonomy_file}{(Required). A \href{http://www.mothur.org/wiki/Constaxonomy_file}{consensus taxonomy file} produced by \emph{mothur}.} \item{parseFunction}{(Optional). A specific function used for parsing the taxonomy string. See \code{\link{parse_taxonomy_default}} for an example. If the default is used, this function expects a semi-colon delimited taxonomy string, with no additional rank specifier. A common taxonomic database is GreenGenes, and for recent versions its taxonomy includes a prefix, which is best cleaved and used to precisely label the ranks (\code{\link{parse_taxonomy_greengenes}}).} } \value{ An \code{\link{taxonomyTable-class}} object. } \description{ Import mothur constaxonomy file and return a taxonomyTable } \seealso{ \code{\link{import_mothur}} \code{\link{tax_table}} \code{\link{phyloseq}} } \keyword{internal} phyloseq/man/import_mothur_dist.Rd0000644000175400017540000000213213177706002020442 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/IO-methods.R \name{import_mothur_dist} \alias{import_mothur_dist} \title{Import mothur-formatted distance file} \usage{ import_mothur_dist(mothur_dist_file) } \arguments{ \item{mothur_dist_file}{Required. The distance file name / location produced by \emph{mothur}.} } \value{ A distance matrix object describing all sequences in a dataset. } \description{ The mothur application will produce a file containing the pairwise distances between all sequences in a dataset. This distance matrix can be the basis for OTU cluster designations. R also has many built-in or off-the-shelf tools for dealing with distance matrices. } \examples{ # # Take a look at the dataset shown here as an example: # # "http://www.mothur.org/wiki/Esophageal_community_analysis" # # find the file ending with extension ".dist", download to your system # # The location of your file may vary # mothur_dist_file <- "~/Downloads/mothur/Esophagus/esophagus.dist" # myNewDistObject <- import_mothur_dist(mothur_dist_file) } \seealso{ \code{\link{import_mothur}} } phyloseq/man/import_mothur_groups.Rd0000644000175400017540000000223113177706002021016 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/IO-methods.R \name{import_mothur_groups} \alias{import_mothur_groups} \title{Parse mothur group file into a simple hash table.} \usage{ import_mothur_groups(mothur_group_file) } \arguments{ \item{mothur_group_file}{A character string indicating the location of the \emph{mothur}-produced group file in which the sample-source of each sequence is recorded. See \code{http://www.mothur.org/wiki/Make.group}} } \value{ A data.frame that is effectively a hash table between sequence names and their sample source. } \description{ The data.frame object returned by this function is not immediately useable by other \emph{phyloseq} functions, and must be first parsed in conjunction with a separate \emph{mothur} \code{"list"} file. This function is made accessible to \emph{phyloseq} users for troubleshooting and inspection, but the \code{link{import_mothur()}} function is suggested if the goal is to import the OTU clustering results from \emph{mothur} into \emph{phyloseq}. You will need both a group file and a list file for that end. } \seealso{ \code{\link{import_mothur}} } \keyword{internal} phyloseq/man/import_mothur_otu_table.Rd0000644000175400017540000000324413177706002021462 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/IO-methods.R \name{import_mothur_otu_table} \alias{import_mothur_otu_table} \title{Import mothur list and group files and return an otu_table} \usage{ import_mothur_otu_table(mothur_list_file, mothur_group_file, cutoff=NULL) } \arguments{ \item{mothur_list_file}{The list file name and/or location as produced by \emph{mothur}.} \item{mothur_group_file}{The name/location of the group file produced by \emph{mothur}'s \code{make.group()} function. It contains information about the sample source of individual sequences, necessary for creating a species/taxa abundance table (\code{otu_table}). See \code{http://www.mothur.org/wiki/Make.group}} \item{cutoff}{A character string indicating the cutoff value, (or \code{"unique"}), that matches one of the cutoff-values used to produce the OTU clustering results contained within the list-file created by \emph{mothur} (and specified by the \code{mothur_list_file} argument). The default is to take the largest value among the cutoff values contained in the list file. If only one cutoff is included in the file, it is taken and this argument does not need to be specified. Note that the \code{cluster()} function within the \emph{mothur} package will often produce a list file with multiple cutoff values, even if a specific cutoff is specified. It is suggested that you check which cutoff values are available in a given list file using the \code{\link{show_mothur_cutoffs}} function.} } \value{ An \code{\link{otu_table}} object. } \description{ Import mothur list and group files and return an otu_table } \seealso{ \code{\link{import_mothur}} } \keyword{internal} phyloseq/man/import_mothur_otulist.Rd0000644000175400017540000000404513177706002021207 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/IO-methods.R \name{import_mothur_otulist} \alias{import_mothur_otulist} \title{Import mothur list file and return as list object in R.} \usage{ import_mothur_otulist(mothur_list_file, cutoff=NULL) } \arguments{ \item{mothur_list_file}{The list file name and/or location as produced by \emph{mothur}.} \item{cutoff}{A character string indicating the cutoff value, (or \code{"unique"}), that matches one of the cutoff-values used to produce the OTU clustering results contained within the list-file created by \emph{mothur}. The default is to take the largest value among the cutoff values contained in the list file. If only one cutoff is included in the file, it is taken and this argument does not need to be specified. Note that the \code{cluster()} function within the \emph{mothur} package will often produce a list file with multiple cutoff values, even if a specific cutoff is specified. It is suggested that you check which cutoff values are available in a given list file using the \code{\link{show_mothur_cutoffs}} function.} } \value{ A list, where each element is a character vector of 1 or more sequence identifiers, indicating how each sequence from the original data is clustered into OTUs by \emph{mothur}. Note that in some cases this is highly dependent on the choice for \code{cutoff}. } \description{ This is a user-available module of a more comprehensive function for importing OTU clustering/abundance data using the \emph{mothur} package. The list object returned by this function is not immediately useable by other \emph{phyloseq} functions, and must be first parsed in conjunction with a separate \emph{mothur} \code{"group"} file. This function is made accessible to \emph{phyloseq} users for troubleshooting and inspection, but the \code{link{import_mothur()}} function is suggested if the goal is to import the OTU clustering results from \emph{mothur} into \emph{phyloseq}. } \seealso{ \code{\link{show_mothur_cutoffs}}, \code{\link{import_mothur}} } \keyword{internal} phyloseq/man/import_mothur_shared.Rd0000644000175400017540000000111013177706002020740 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/IO-methods.R \name{import_mothur_shared} \alias{import_mothur_shared} \title{Import mothur shared file and return an otu_table} \usage{ import_mothur_shared(mothur_shared_file, cutoff = NULL) } \arguments{ \item{mothur_shared_file}{(Required). A \href{http://www.mothur.org/wiki/Shared_file}{shared file} produced by \emph{mothur}.} } \value{ An \code{\link{otu_table}} object. } \description{ Import mothur shared file and return an otu_table } \seealso{ \code{\link{import_mothur}} } \keyword{internal} phyloseq/man/import_pyrotagger_tab.Rd0000644000175400017540000000576013177706002021124 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/IO-methods.R \name{import_pyrotagger_tab} \alias{import_pyrotagger_tab} \title{Imports a tab-delimited version of the pyrotagger output file.} \usage{ import_pyrotagger_tab(pyrotagger_tab_file, strict_taxonomy=FALSE, keep_potential_chimeras=FALSE) } \arguments{ \item{pyrotagger_tab_file}{(Required). A character string. The name of the tab-delimited pyrotagger output table.} \item{strict_taxonomy}{(Optional). Logical. Default \code{FALSE}. Should the taxonomyTable component be limited to just taxonomic data? Default includes all fields from the pyrotagger file.} \item{keep_potential_chimeras}{(Optional). Logical. Default \code{FALSE}. The pyrotagger output also includes OTUs that are tagged by pyrotagger as likely chimeras. These putative chimeric OTUs can be retained if set to \code{TRUE}. The putative chimeras are excluded by default.} } \value{ An \code{otuTax} object containing both the otu_table and TaxonomyTable data components, parsed from the pyrotagger output. } \description{ PyroTagger is a web-server that takes raw, barcoded 16S rRNA amplicon sequences and returns an excel spreadsheet (\code{".xls"}) with both abundance and taxonomy data. It also includes some confidence information related to the taxonomic assignment. } \details{ PyroTagger is created and maintained by the Joint Genome Institute at \code{"http://pyrotagger.jgi-psf.org/"} The typical output form PyroTagger is a spreadsheet format \code{".xls"}, which poses additional import challenges. However, virtually all spreadsheet applications support the \code{".xls"} format, and can further export this file in a tab-delimited format. It is recommended that you convert the xls-file without any modification (as tempting as it might be once you have loaded it) into a tab-delimited text file. Deselect any options to encapsulate fields in quotes, as extra quotes around each cell's contents might cause problems during file processing. These quotes will also inflate the file-size, so leave them out as much as possible, while also resisting any temptation to modify the xls-file ``by hand''. A highly-functional and free spreadsheet application can be obtained as part of the cross-platform \code{OpenOffice} suite. It works for the above required conversion. Go to \code{"http://www.openoffice.org/"}. It is regrettable that this importer does not take the xls-file directly as input. However, because of the moving-target nature of spreadsheet file formats, there is limited support for direct import of these formats into \code{R}. Rather than add to the dependency requirements of emph{phyloseq} and the relative support of these xls-support packages, it seems more efficient to choose an arbitrary delimited text format, and focus on the data structure in the PyroTagger output. This will be easier to support in the long-run. } \examples{ ## New_otuTaxObject <- import_pyrotagger_tab(pyrotagger_tab_file) } \references{ \url{http://pyrotagger.jgi-psf.org/} } phyloseq/man/import_qiime.Rd0000644000175400017540000001603513177706002017214 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/IO-methods.R \name{import_qiime} \alias{import_qiime} \title{Import function to read the now legacy-format QIIME OTU table.} \usage{ import_qiime(otufilename = NULL, mapfilename = NULL, treefilename = NULL, refseqfilename = NULL, refseqFunction = readDNAStringSet, refseqArgs = NULL, parseFunction = parse_taxonomy_qiime, verbose = TRUE, ...) } \arguments{ \item{otufilename}{(Optional). A character string indicating the file location of the OTU file. The combined OTU abundance and taxonomic identification file, tab-delimited, as produced by QIIME under default output settings. Default value is \code{NULL}.} \item{mapfilename}{(Optional). The QIIME map file is required for processing barcoded primers in QIIME as well as some of the post-clustering analysis. This is a required input file for running QIIME. Its strict formatting specification should be followed for correct parsing by this function. Default value is \code{NULL}.} \item{treefilename}{(Optional). Default value is \code{NULL}. A file representing a phylogenetic tree or a \code{\link{phylo}} object. Files can be NEXUS or Newick format. See \code{\link{read_tree}} for more details. Also, if using a recent release of the GreenGenes database tree, try the \code{\link{read_tree_greengenes}} function -- this should solve some issues specific to importing that tree. If provided, the tree should have the same OTUs/tip-labels as the OTUs in the other files. Any taxa or samples missing in one of the files is removed from all. As an example from the QIIME pipeline, this tree would be a tree of the representative 16S rRNA sequences from each OTU cluster, with the number of leaves/tips equal to the number of taxa/species/OTUs, or the complete reference database tree that contains the OTU identifiers of every OTU in your abundance table. Note that this argument can be a tree object (\code{\link[ape]{phylo}}-class) for cases where the tree has been --- or needs to be --- imported separately, as in the case of the GreenGenes tree mentioned earlier (code{\link{read_tree_greengenes}}).} \item{refseqfilename}{(Optional). Default \code{NULL}. The file path of the biological sequence file that contains at a minimum a sequence for each OTU in the dataset. Alternatively, you may provide an already-imported \code{\link[Biostrings]{XStringSet}} object that satisfies this condition. In either case, the \code{\link{names}} of each OTU need to match exactly the \code{\link{taxa_names}} of the other components of your data. If this is not the case, for example if the data file is a FASTA format but contains additional information after the OTU name in each sequence header, then some additional parsing is necessary, which you can either perform separately before calling this function, or describe explicitly in a custom function provided in the (next) argument, \code{refseqFunction}. Note that the \code{\link[Biostrings]{XStringSet}} class can represent any arbitrary sequence, including user-defined subclasses, but is most-often used to represent RNA, DNA, or amino acid sequences. The only constraint is that this special list of sequences has exactly one named element for each OTU in the dataset.} \item{refseqFunction}{(Optional). Default is \code{\link[Biostrings]{readDNAStringSet}}, which expects to read a fasta-formatted DNA sequence file. If your reference sequences for each OTU are amino acid, RNA, or something else, then you will need to specify a different function here. This is the function used to read the file connection provided as the the previous argument, \code{refseqfilename}. This argument is ignored if \code{refseqfilename} is already a \code{\link[Biostrings]{XStringSet}} class.} \item{refseqArgs}{(Optional). Default \code{NULL}. Additional arguments to \code{refseqFunction}. See \code{\link[Biostrings]{XStringSet-io}} for details about additional arguments to the standard read functions in the Biostrings package.} \item{parseFunction}{(Optional). An optional custom function for parsing the character string that contains the taxonomic assignment of each OTU. The default parsing function is \code{\link{parse_taxonomy_qiime}}, specialized for splitting the \code{";"}-delimited strings and also attempting to interpret greengenes prefixes, if any, as that is a common format of the taxonomy string produced by QIIME.} \item{verbose}{(Optional). A \code{\link{logical}}. Default is \code{TRUE}. Should progresss messages be \code{\link{cat}}ted to standard out?} \item{...}{Additional arguments passed to \code{\link{read_tree}}} } \value{ A \code{\link{phyloseq-class}} object. } \description{ QIIME produces several files that can be directly imported by the \code{\link{phyloseq-package}}. Originally, QIIME produced its own custom format table that contained both OTU-abundance and taxonomic identity information. This function is still included in phyloseq mainly to accommodate these now-outdated files. Recent versions of QIIME store output in the biom-format, an emerging file format standard for microbiome data. If your data is in the biom-format, if it ends with a \code{.biom} file name extension, then you should use the \code{\link{import_biom}} function instead. } \details{ Other related files include the mapping-file that typically stores sample covariates, converted naturally to the \code{\link{sample_data-class}} component data type in the phyloseq-package. QIIME may also produce a phylogenetic tree with a tip for each OTU, which can also be imported specified here or imported separately using \code{\link{read_tree}}. See \url{"http://www.qiime.org/"} for details on using QIIME. While there are many complex dependencies, QIIME can be downloaded as a pre-installed linux virtual machine that runs ``off the shelf''. The different files useful for import to \emph{phyloseq} are not collocated in a typical run of the QIIME pipeline. See the main \emph{phyloseq} vignette for an example of where ot find the relevant files in the output directory. } \examples{ otufile <- system.file("extdata", "GP_otu_table_rand_short.txt.gz", package="phyloseq") mapfile <- system.file("extdata", "master_map.txt", package="phyloseq") trefile <- system.file("extdata", "GP_tree_rand_short.newick.gz", package="phyloseq") import_qiime(otufile, mapfile, trefile) } \references{ \url{http://qiime.org/} ``QIIME allows analysis of high-throughput community sequencing data.'' J Gregory Caporaso, Justin Kuczynski, Jesse Stombaugh, Kyle Bittinger, Frederic D Bushman, Elizabeth K Costello, Noah Fierer, Antonio Gonzalez Pena, Julia K Goodrich, Jeffrey I Gordon, Gavin A Huttley, Scott T Kelley, Dan Knights, Jeremy E Koenig, Ruth E Ley, Catherine A Lozupone, Daniel McDonald, Brian D Muegge, Meg Pirrung, Jens Reeder, Joel R Sevinsky, Peter J Turnbaugh, William A Walters, Jeremy Widmann, Tanya Yatsunenko, Jesse Zaneveld and Rob Knight; Nature Methods, 2010; doi:10.1038/nmeth.f.303 } \seealso{ \code{\link{phyloseq}} \code{\link{merge_phyloseq}} \code{\link{read_tree}} \code{\link{read_tree_greengenes}} \code{\link[Biostrings]{XStringSet-io}} } phyloseq/man/import_qiime_otu_tax.Rd0000644000175400017540000000607413177706002020761 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/IO-methods.R \name{import_qiime_otu_tax} \alias{import_qiime_otu_tax} \title{Import now legacy-format QIIME OTU table as a list of two matrices.} \usage{ import_qiime_otu_tax(file, parseFunction = parse_taxonomy_qiime, verbose = TRUE, parallel = FALSE) } \arguments{ \item{file}{(Required). The path to the qiime-formatted file you want to import into R. Can be compressed (e.g. \code{.gz}, etc.), though the details may be OS-specific. That is, Windows-beware.} \item{parseFunction}{(Optional). An optional custom function for parsing the character string that contains the taxonomic assignment of each OTU. The default parsing function is \code{\link{parse_taxonomy_qiime}}, specialized for splitting the \code{";"}-delimited strings and also attempting to interpret greengenes prefixes, if any, as that is a common format of the taxonomy string produced by QIIME.} \item{verbose}{(Optional). A \code{\link{logical}}. Default is \code{TRUE}. Should progresss messages be \code{\link{cat}}ted to standard out?} \item{parallel}{(Optional). Logical. Should the parsing be performed in parallel?. Default is \code{FALSE}. Only a few steps are actually parallelized, and for most datasets it will actually be faster and more efficient to keep this set to \code{FALSE}. Also, to get any benefit at all, you will need to register a parallel ``backend'' through one of the backend packages supported by the \code{\link{foreach-package}}.} } \value{ A list of two matrices. \code{$otutab} contains the OTU Table as a numeric matrix, while \code{$taxtab} contains a character matrix of the taxonomy assignments. } \description{ Now a legacy-format, older versions of QIIME produced an OTU file that typically contains both OTU-abundance and taxonomic identity information in a tab-delimted table. If your file ends with the extension \code{.biom}, or if you happen to know that it is a biom-format file, or if you used default settings in a version of QIIME of \code{1.7} or greater, then YOU SHOULD USE THE BIOM-IMPORT FUNCTION instead, \code{\link{import_biom}}. } \details{ This function uses chunking to perform both the reading and parsing in blocks of optional size, thus constrain the peak memory usage. feature should make this importer accessible to machines with modest memory, but with the caveat that the full numeric matrix must be a manageable size at the end, too. In principle, the final tables will be large, but much more efficiently represented than the character-stored numbers. If total memory for storing the numeric matrix becomes problematic, a switch to a sparse matrix representation of the abundance -- which is typically well-suited to this data -- might provide a solution. } \examples{ otufile <- system.file("extdata", "GP_otu_table_rand_short.txt.gz", package="phyloseq") import_qiime_otu_tax(otufile) } \seealso{ \code{\link{import}} \code{\link{merge_phyloseq}} \code{\link{phyloseq}} \code{\link{import_qiime}} \code{\link{read_tree}} \code{\link{read_tree_greengenes}} \code{\link{import_env_file}} } phyloseq/man/import_qiime_sample_data.Rd0000644000175400017540000000304613177706002021544 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/IO-methods.R \name{import_qiime_sample_data} \alias{import_qiime_sample_data} \title{Import just \code{sample_data} file from QIIME pipeline.} \usage{ import_qiime_sample_data(mapfilename) } \arguments{ \item{mapfilename}{(Required). A character string or connection. That is, any suitable \code{file} argument to the \code{\link{read.table}} function. The name of the QIIME map file required for processing pyrosequencing tags in QIIME as well as some of the post-clustering analysis. This is a required input file for running QIIME. Its strict formatting specification is expected by this function, do not attempt to modify it manually once it has worked properly in QIIME.} } \value{ A \code{sample_data} object. } \description{ QIIME produces several files that can be analyzed in the phyloseq-package, This includes the map-file, which is an important \emph{input} to QIIME that can also indicate sample covariates. It is converted naturally to the sample_data component data type in phyloseq-package, based on the R data.frame. } \details{ See \code{\link{import_qiime}} for more information about QIIME. It is also the suggested function for importing QIIME-produced data files. } \examples{ mapfile <- system.file("extdata", "master_map.txt", package = "phyloseq") import_qiime_sample_data(mapfile) } \seealso{ \code{\link{import}} \code{\link{merge_phyloseq}} \code{\link{phyloseq}} \code{\link{import_qiime}} \code{\link{import_qiime_otu_tax}} \code{\link{import_env_file}} } phyloseq/man/import_uparse.Rd0000644000175400017540000000511713177706002017406 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/IO-methods.R \name{import_uparse} \alias{import_uparse} \title{Import \href{http://www.drive5.com/usearch/manual/opt_uparseout.html}{UPARSE file format}} \usage{ import_uparse(upFile, omitChimeras = TRUE, countTable = TRUE, OTUtable = TRUE, verbose = TRUE) } \arguments{ \item{upFile}{(Required). A file location character string or \code{\link{connection}} corresponding to the file that contains the UPARSE output table. This is passed directly to \code{\link[data.table]{fread}}. Please see its \code{file} argument documentation for further links and details.} \item{omitChimeras}{(Optional). \code{logical(1)}. Default is \code{TRUE}. Whether to omit entries that correspond to sequences/OTUs that were identified as chimeras.} \item{countTable}{(Optional). \code{logical(1)}. Default is \code{TRUE}. Whether to return the result as a wide-format table with dimensions OTU-by-sample, or to leave the table in its original sparse long-format that might be more suitable for certain \code{\link{data.table}} operations. If \code{TRUE}, entries corresponding to the same sample and OTU have their counts summed.} \item{OTUtable}{(Optional). \code{logical(1)}. Default is \code{TRUE}. Whether to coerce the result to \code{\link{otu_table}} format, or leave it as a \code{\link{data.table}} format. The former is appropriate for most \code{\link{phyloseq}} operations, the latter is useful for a lot of custom operations and custom \code{\link[ggplot2]{ggplot}2} graphics calls.} \item{verbose}{(Optional). A \code{\link{logical}}. Default is \code{TRUE}. Should progresss messages be \code{\link{cat}}ted to standard out?} } \description{ UPARSE is an algorithm for OTU-clustering implemented within usearch. At last check, the UPARSE algortihm was accessed via the \code{-cluster_otu} option flag. For details about installing and running usearch, please refer to the \href{http://drive5.com/usearch/}{usearch website}. For details about the output format, please refer to the \href{http://www.drive5.com/usearch/manual/opt_uparseout.html}{uparse format definition}. } \details{ Because UPARSE is an external (non-R) application, there is no direct way to continuously check that these suggested arguments and file formats will remain in their current state. If there is a problem, please verify your version of usearch, create a small reproducible example of the problem, and post it as an issue on the \href{https://github.com/joey711/phyloseq/issues}{phyloseq issues tracker}. } \examples{ ### } \seealso{ \code{\link{import_usearch_uc}} } phyloseq/man/import_usearch_uc.Rd0000644000175400017540000000667513177706002020242 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/IO-methods.R \name{import_usearch_uc} \alias{import_usearch_uc} \title{Import usearch table format (\code{.uc}) to OTU table} \usage{ import_usearch_uc(ucfile, colRead = 9, colOTU = 10, readDelimiter = "_", verbose = TRUE) } \arguments{ \item{ucfile}{(Required). A file location character string or \code{\link{connection}} corresponding to the file that contains the usearch output table. This is passed directly to \code{\link{read.table}}. Please see its \code{file} argument documentation for further links and details.} \item{colRead}{(Optional). Numeric. The column index in the uc-table file that holds the read IDs. The default column index is \code{9}.} \item{colOTU}{(Optional). Numeric. The column index in the uc-table file that holds OTU IDs. The default column index is \code{10}.} \item{readDelimiter}{(Optional). An R \code{\link{regex}} as a character string. This should be the delimiter that separates the sample ID from the original ID in the demultiplexed read ID of your sequence file. The default is plain underscore, which in this \code{\link{regex}} context is \code{"_"}.} \item{verbose}{(Optional). A \code{\link{logical}}. Default is \code{TRUE}. Should progresss messages be \code{\link{cat}}ted to standard out?} } \description{ UPARSE is an algorithm for OTU-clustering implemented within usearch. At last check, the UPARSE algortihm was accessed via the \code{-cluster_otu} option flag. For details about installing and running usearch, please refer to the \href{http://drive5.com/usearch/}{usearch website}. For details about the output format, please refer to the \href{http://www.drive5.com/usearch/manual/opt_uc.html}{uc format definition}. This importer is intended to read a particular table format output that is generated by usearch, its so-called ``cluster format'', a file format that is often given the \code{.uc} extension in usearch documentation. } \details{ Because usearch is an external (non-R) application, there is no direct way to continuously check that these suggested arguments and file formats will remain in their current state. If there is a problem, please verify your version of usearch, create a small reproducible example of the problem, and post it as an issue on the phyloseq issues tracker. The version of usearch upon which this import function was created is \code{7.0.109}. Hopefully later versions of usearch maintain this function and format, but the phyloseq team has no way to guarantee this, and so any feedback about this will help maintain future functionality. For instance, it is currently assumed that the 9th and 10th columns of the \code{.uc} table hold the read-label and OTU ID, respectively; and it is also assumed that the delimiter between sample-name and read in the read-name entries is a single \code{"_"}. If this is not true, you may have to update these parameters, or even modify the current implementation of this function. Also note that there is now a UPARSE-specific output file format, \href{http://www.drive5.com/usearch/manual/opt_uparseout.html}{uparseout}, and it might make more sense to create and import that file for use in phyloseq. If so, you'll want to import using the \code{\link{import_uparse}()} function. } \examples{ usearchfile <- system.file("extdata", "usearch.uc", package="phyloseq") import_usearch_uc(usearchfile) } \seealso{ \code{\link{import}} \code{\link{import_biom}} \code{\link{import_qiime}} } phyloseq/man/index_reorder.Rd0000644000175400017540000000144713177706002017350 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/phyloseq-class.R \docType{methods} \name{index_reorder} \alias{index_reorder} \alias{index_reorder,phyloseq-method} \title{Force index order of phyloseq objects} \usage{ index_reorder(ps, index_type) \S4method{index_reorder}{phyloseq}(ps, index_type = "both") } \arguments{ \item{ps}{(Required). A \code{\link{phyloseq-class}} instance.} \item{index_type}{(Optional). A character string specifying the indices to properly order. Supported values are \code{c("both", "taxa", "samples")}. Default is \code{"both"}, meaning samples and taxa indices will be checked/re-ordered.} } \description{ Force index order of phyloseq objects } \examples{ ## data("GlobalPatterns") ## GP = index_reorder(GlobalPatterns) } \keyword{internal} phyloseq/man/intersect_taxa.Rd0000644000175400017540000000166613177706002017537 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/phyloseq-class.R \name{intersect_taxa} \alias{intersect_taxa} \title{Returns the intersection of species and samples for the components of x} \usage{ intersect_taxa(x) } \arguments{ \item{x}{(Required). A \code{\link{phyloseq-class}} object that contains 2 or more components that in-turn describe species/taxa.} } \value{ Returns a character vector of only those species that are present in all species-describing components of \code{x}. } \description{ This function is used internally as part of the infrastructure to ensure that component data types in a phyloseq-object have exactly the same taxa/species. It relies heavily on the \code{\link{Reduce}} function to determine the strictly common species. } \examples{ # ## data(GlobalPatterns) ## head(intersect_taxa(GlobalPatterns), 10) } \seealso{ \code{\link{Reduce}}, \code{\link{intersect}} } \keyword{internal} phyloseq/man/make_network.Rd0000644000175400017540000000742013177706002017202 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/network-methods.R \name{make_network} \alias{make_network} \title{Make microbiome network (igraph)} \usage{ make_network(physeq, type="samples", distance="jaccard", max.dist = 0.4, keep.isolates=FALSE, ...) } \arguments{ \item{physeq}{(Required). Default \code{NULL}. A \code{\link{phyloseq-class}} object, or \code{\link{otu_table-class}} object, on which \code{g} is based. \code{phyloseq-class} recommended.} \item{type}{(Optional). Default \code{"samples"}. Whether the network should be samples or taxa/OTUs. Supported arguments are \code{"samples"}, \code{"taxa"}, where \code{"taxa"} indicates using the OTUs/taxaindices, whether they actually represent species or some other taxonomic rank. NOTE: not all distance methods are supported if \code{"taxa"} selected for type. For example, the UniFrac distance and DPCoA cannot be calculated for taxa-wise distances, because they use a taxa-wise tree as part of their calculation between samples, and there is no transpose-equivalent for this tree.} \item{distance}{(Optional). Default \code{"jaccard"}. Any supported argument to the \code{method} parameter of the \code{\link{distance}} function is supported here. Some distance methods, like \code{"unifrac"}, may take a non-trivial amount of time to calculate, in which case you probably want to calculate the distance matrix separately, save, and then provide it as the argument to \code{distance} instead. See below for alternatives). Alternatively, if you have already calculated the sample-wise distance object, the resulting \code{dist}-class object can be provided as \code{distance} instead (see examples). A third alternative is to provide a function that takes a sample-by-taxa matrix (typical vegan orientation) and returns a sample-wise distance matrix.} \item{max.dist}{(Optional). Default \code{0.4}. The maximum ecological distance (as defined by \code{distance}) allowed between two samples to still consider them ``connected'' by an edge in the graphical model.} \item{keep.isolates}{(Optional). Default \code{FALSE}. Logical. Whether to keep isolates (un-connected samples, not microbial isolates) in the graphical model that is returned. Default results in isolates being removed from the object.} \item{...}{(Optional). Additional parameters passed on to \code{\link{distance}}.} } \value{ A \code{igraph}-class object. } \description{ A specialized function for creating a network representation of microbiomes, sample-wise or taxa-wise, based on a user-defined ecological distance and (potentially arbitrary) threshold. The graph is ultimately represented using the \code{igraph}-package. } \examples{ # # Example plots with Enterotype Dataset data(enterotype) ig <- make_network(enterotype, max.dist=0.3) plot_network(ig, enterotype, color="SeqTech", shape="Enterotype", line_weight=0.3, label=NULL) # ig1 <- make_network(enterotype, max.dist=0.2) plot_network(ig1, enterotype, color="SeqTech", shape="Enterotype", line_weight=0.3, label=NULL) # # # Three methods of choosing/providing distance/distance-method # Provide method name available to distance() function ig <- make_network(enterotype, max.dist=0.3, distance="jaccard") # Provide distance object, already computed jaccdist <- distance(enterotype, "jaccard") ih <- make_network(enterotype, max.dist=0.3, distance=jaccdist) # Provide "custom" function. ii <- make_network(enterotype, max.dist=0.3, distance=function(x){vegan::vegdist(x, "jaccard")}) # The have equal results: all.equal(ig, ih) all.equal(ig, ii) # # Try out making a trivial "network" of the 3-sample esophagus data, # with weighted-UniFrac as distance data(esophagus) ij <- make_network(esophagus, "samples", "unifrac", weighted=TRUE) } \seealso{ \code{\link{plot_network}} } phyloseq/man/merge_phyloseq.Rd0000644000175400017540000000573613177706002017547 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/merge-methods.R \name{merge_phyloseq} \alias{merge_phyloseq} \title{Merge arguments into one phyloseq object.} \usage{ merge_phyloseq(...) } \arguments{ \item{...}{a comma-separated list of phyloseq objects.} } \value{ Merges are performed by first separating higher-order objects into a list of their component objects; then, merging any component objects of the same class into one object according to the behavior desribed in \code{\link{merge_phyloseq_pair}}; and finally, re-building a merged-object according to the constructor behavior of the \code{\link{phyloseq}} method. If the arguments contain only a single component type -- several otu_table objects, for example -- then a single merged object of the relevant component type is returned. Merges between 2 or more tree objects are ultimately done using \code{\link[ape]{consensus}} from the ape package. This has the potential to limit somewhat the final data object, because trees don't merge with other trees in the same granular manner as data tables, and ultimately the species/taxa in higher-order phyloseq objects will be clipped to what is contained in the tree. If this an issue, the tree component should be ommitted from the argument list. } \description{ Takes a comma-separated list of phyloseq objects as arguments, and returns the most-comprehensive single phyloseq object possible. } \details{ Higher-order objects can be created if arguments are appropriate component data types of different classes, and this should mirror the behavior of the \code{\link{phyloseq}} method, which is the suggested method if the goal is simply to create a higher-order phyloseq object from different data types (1 of each class) describing the same experiment. By contrast, this method is intended for situations in which one wants to combine multiple higher-order objects, or multiple core component data objects (e.g. more than one \code{otu_table}) that should be combined into one object. Merges are performed by first separating higher-order objects into a list of their component objects; then, merging any component objects of the same class into one object according to the behavior desribed in \code{\link{merge_phyloseq_pair}}; and finally, building back up a merged-object according to the constructor behavior of the \code{\link{phyloseq}} method. If the arguments contain only a single component type -- several otu_table objects, for example -- then a single merged object of that component type is returned. } \examples{ # ## # Make a random complex object ## OTU1 <- otu_table(matrix(sample(0:5,250,TRUE),25,10), taxa_are_rows=TRUE) ## tax1 <- tax_table(matrix("abc", 30, 8)) ## map1 <- data.frame( matrix(sample(0:3,250,TRUE),25,10), ## matrix(sample(c("a","b","c"),150,TRUE), 25, 6) ) ## map1 <- sample_data(map1) ## exam1 <- phyloseq(OTU1, map1, tax1) ## x <- exam1 ## x <- phyloseq(exam1) ## y <- tax_table(exam1) ## merge_phyloseq(x, y) ## merge_phyloseq(y, y, y, y) } phyloseq/man/merge_phyloseq_pair-methods.Rd0000644000175400017540000000611513177706002022213 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/merge-methods.R \docType{methods} \name{merge_phyloseq_pair} \alias{merge_phyloseq_pair} \alias{merge_phyloseq_pair,otu_table,otu_table-method} \alias{merge_phyloseq_pair,taxonomyTable,taxonomyTable-method} \alias{merge_phyloseq_pair,sample_data,sample_data-method} \alias{merge_phyloseq_pair,phylo,phylo-method} \alias{merge_phyloseq_pair,XStringSet,XStringSet-method} \title{Merge pair of phyloseq component data objects of the same class.} \usage{ merge_phyloseq_pair(x, y) \S4method{merge_phyloseq_pair}{otu_table,otu_table}(x, y) \S4method{merge_phyloseq_pair}{taxonomyTable,taxonomyTable}(x, y) \S4method{merge_phyloseq_pair}{sample_data,sample_data}(x, y) \S4method{merge_phyloseq_pair}{phylo,phylo}(x, y) \S4method{merge_phyloseq_pair}{XStringSet,XStringSet}(x, y) } \arguments{ \item{x}{A character vector of the species in object x that you want to keep -- OR alternatively -- a logical vector where the kept species are TRUE, and length is equal to the number of species in object x. If \code{species} is a named logical, the species retained is based on those names. Make sure they are compatible with the \code{taxa_names} of the object you are modifying (\code{x}).} \item{y}{Any \code{phyloseq} object.} } \value{ A single component data object that matches \code{x} and \code{y} arguments. The returned object will contain the union of the species and/or samples of each. If there is redundant information between a pair of arguments of the same class, the values in \code{x} are used by default. Abundance values are summed for \code{otu_table} objects for those elements that describe the same species and sample in \code{x} and \code{y}. } \description{ Internal S4 methods to combine pairs of objects of classes specified in the phyloseq package. These objects must be component data of the same type (class). This is mainly an internal method, provided to illustrate how merging is performed by the more general \code{\link{merge_phyloseq}} function. } \details{ The \code{\link{merge_phyloseq}} function is recommended in general. Special note: non-identical trees are merged using \code{\link[ape]{consensus}}. } \examples{ # ## # merge two simulated otu_table objects. ## x <- otu_table(matrix(sample(0:5,200,TRUE),20,10), taxa_are_rows=TRUE) ## y <- otu_table(matrix(sample(0:5,300,TRUE),30,10), taxa_are_rows=FALSE) ## xy <- merge_phyloseq_pair(x, y) ## yx <- merge_phyloseq_pair(y, x) ## # merge two simulated tax_table objects ## x <- tax_table(matrix("abc", 20, 6)) ## y <- tax_table(matrix("def", 30, 8)) ## xy <- merge_phyloseq_pair(x, y) ## # merge two simulated sample_data objects ## x <- data.frame( matrix(sample(0:3,250,TRUE),25,10), ## matrix(sample(c("a","b","c"),150,TRUE),25,6) ) ## x <- sample_data(x) ## y <- data.frame( matrix(sample(4:6,200,TRUE),20,10), ## matrix(sample(c("d","e","f"),120,TRUE),20,8) ) ## y <- sample_data(y) ## merge_phyloseq_pair(x, y) ## data.frame(merge_phyloseq_pair(x, y)) ## data.frame(merge_phyloseq_pair(y, x)) } \seealso{ \code{\link{merge_phyloseq}} \code{\link{merge_taxa}} } phyloseq/man/merge_samples-methods.Rd0000644000175400017540000000523213177706002020777 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/merge-methods.R \docType{methods} \name{merge_samples} \alias{merge_samples} \alias{merge_samples,sample_data-method} \alias{merge_samples,otu_table-method} \alias{merge_samples,phyloseq-method} \title{Merge samples based on a sample variable or factor.} \usage{ merge_samples(x, group, fun=mean) \S4method{merge_samples}{sample_data}(x, group, fun = mean) \S4method{merge_samples}{otu_table}(x, group) \S4method{merge_samples}{phyloseq}(x, group, fun = mean) } \arguments{ \item{x}{(Required). An instance of a phyloseq class that has sample indices. This includes \code{\link{sample_data-class}}, \code{\link{otu_table-class}}, and \code{\link{phyloseq-class}}.} \item{group}{(Required). Either the a single character string matching a variable name in the corresponding sample_data of \code{x}, or a factor with the same length as the number of samples in \code{x}.} \item{fun}{(Optional). The function that will be used to merge the values that correspond to the same group for each variable. It must take a numeric vector as first argument and return a single value. Default is \code{\link[base]{mean}}. Note that this is (currently) ignored for the otu_table, where the equivalent function is \code{\link[base]{sum}}, but evaluated via \code{\link[base]{rowsum}} for efficiency.} } \value{ A phyloseq object that has had its sample indices merged according to the factor indicated by the \code{group} argument. The output class matches \code{x}. } \description{ The purpose of this method is to merge/agglomerate the sample indices of a phyloseq object according to a categorical variable contained in a sample_data or a provided factor. } \details{ NOTE: (\code{\link[ape]{phylo}}) trees and \code{\link{taxonomyTable-class}} are not modified by this function, but returned in the output object as-is. } \examples{ # data(GlobalPatterns) GP = GlobalPatterns mergedGP = merge_samples(GlobalPatterns, "SampleType") SD = merge_samples(sample_data(GlobalPatterns), "SampleType") print(SD) print(mergedGP) sample_names(GlobalPatterns) sample_names(mergedGP) identical(SD, sample_data(mergedGP)) # The OTU abundances of merged samples are summed # Let's investigate this ourselves looking at just the top10 most abundance OTUs... OTUnames10 = names(sort(taxa_sums(GP), TRUE)[1:10]) GP10 = prune_taxa(OTUnames10, GP) mGP10 = prune_taxa(OTUnames10, mergedGP) ocean_samples = sample_names(subset(sample_data(GP), SampleType=="Ocean")) print(ocean_samples) otu_table(GP10)[, ocean_samples] rowSums(otu_table(GP10)[, ocean_samples]) otu_table(mGP10)["Ocean", ] } \seealso{ \code{\link{merge_taxa}}, code{\link{merge_phyloseq}} } phyloseq/man/merge_taxa-methods.Rd0000644000175400017540000000537513177706002020300 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/merge-methods.R \docType{methods} \name{merge_taxa} \alias{merge_taxa} \alias{merge_taxa,phyloseq-method} \alias{merge_taxa,sample_data-method} \alias{merge_taxa,otu_table-method} \alias{merge_taxa,phylo-method} \alias{merge_taxa,XStringSet-method} \alias{merge_taxa,taxonomyTable-method} \title{Merge a subset of the species in \code{x} into one species/taxa/OTU.} \usage{ merge_taxa(x, eqtaxa, archetype=1) \S4method{merge_taxa}{phyloseq}(x, eqtaxa, archetype = eqtaxa[which.max(taxa_sums(x)[eqtaxa])]) \S4method{merge_taxa}{sample_data}(x, eqtaxa, archetype = 1L) \S4method{merge_taxa}{otu_table}(x, eqtaxa, archetype = eqtaxa[which.max(taxa_sums(x)[eqtaxa])]) \S4method{merge_taxa}{phylo}(x, eqtaxa, archetype = 1L) \S4method{merge_taxa}{XStringSet}(x, eqtaxa, archetype = 1L) \S4method{merge_taxa}{taxonomyTable}(x, eqtaxa, archetype = 1L) } \arguments{ \item{x}{(Required). An object that describes species (taxa). This includes \code{\link{phyloseq-class}}, \code{\link{otu_table-class}}, \code{\link{taxonomyTable-class}}, \code{\link[ape]{phylo}}.} \item{eqtaxa}{(Required). The species names, or indices, that should be merged together. If \code{length(eqtaxa) < 2}, then the object \code{x} will be returned safely unchanged.} \item{archetype}{(Optional). A single-length numeric or character. The index of \code{eqtaxa}, or OTU ID, indicating the species that should be kept to represent the summed/merged group of species/taxa/OTUs. The default is to use the OTU with the largest count total if counts are available, or to use \code{1} (the first OTU in \code{eqtaxa}) otherwise. If \code{archetype} is not a valid index or index-name in \code{eqtaxa}, the first will be used, and the value in archetype will be used as the index-name for the new species.} } \value{ The object, \code{x}, in its original class, but with the specified species merged into one entry in all relevant components. } \description{ Takes as input an object that describes species/taxa (e.g. \code{\link{phyloseq-class}}, \code{\link{otu_table-class}}, \code{\link{phylo-class}}, \code{\link{taxonomyTable-class}}), as well as a vector of species that should be merged. It is intended to be able to operate at a low-level such that related methods, such as \code{\link{tip_glom}} and \code{\link{tax_glom}} can both reliably call \code{merge_taxa} for their respective purposes. } \examples{ # data(esophagus) tree <- phy_tree(esophagus) otu <- otu_table(esophagus) otutree0 <- phyloseq(otu, tree) # plot_tree(otutree0) otutree1 <- merge_taxa(otutree0, 1:8, 2) # plot_tree(esophagus, ladderize="left") } \seealso{ \code{\link{tip_glom}}, \code{\link{tax_glom}}, \code{\link{merge_phyloseq}}, \code{\link{merge_samples}} } phyloseq/man/metaMDS.Rd0000644000175400017540000000176013177706002016007 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/allClasses.R \docType{data} \name{metaMDS} \alias{metaMDS} \title{S3 class placeholder definition (list) for metaMDS} \format{An object of class \code{metaMDS} of length 0.} \usage{ metaMDS } \description{ The ape package does export a version of its \code{\link[vegan]{metaMDS}}-class, partly because it is not really defined formally anywhere. Instead, it is an S3 class extended from the base class, \code{\link{list}} -- this is a very common and easy approach -- and proper behavior of any method taking an instance of this class requires exact naming conventions for element names of the list components. The phyloseq package does not provide any validity checks that a given phylo instance is valid (conforms to the conventions in the ape package)... yet. If problems arise, this might be considered, and they could be defined judiciously and within phyloseq. } \seealso{ \code{\link[vegan]{metaMDS}} } \keyword{internal} phyloseq/man/microbio_me_qiime.Rd0000644000175400017540000001074413177706002020167 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/IO-methods.R \name{microbio_me_qiime} \alias{microbio_me_qiime} \title{Import microbio.me/qiime (QIIME-DB) data package} \usage{ microbio_me_qiime(zipftp, ext = ".zip", parsef = parse_taxonomy_greengenes, ...) } \arguments{ \item{zipftp}{(Required). A character string that is the full URL path to a zipped file that follows the file naming conventions used by \href{http://www.microbio.me/qiime/index.psp}{microbio.me/qiime}. Alternatively, you can simply provide the study number as a single \code{\link{integer}} or other single-length vector that can be \code{\link{coerce}}d to an integer; this function will complete the remainder of the ftp URL hosted at \href{http://www.microbio.me/qiime/index.psp}{microbio.me/qiime}. For example, instead of the full URL string, \code{"ftp://thebeast.colorado.edu/pub/QIIME_DB_Public_Studies/study_494_split_library_seqs_and_mapping.zip"}, you could simply provide \code{494} or \code{"494"} as the first (`zipftp`) argument.} \item{ext}{(Optional). A \code{\link{character}} string of the expected file extension, which also indicates the compression type, if \code{zipftp} is a study number instead of the full path. Note that this argument has no effect if \code{zipftp} is the full path, in which case the file extension is read directly from the downloaded file.} \item{parsef}{(Optional). The type of taxonomic parsing to use for the OTU taxonomic classification, in the \code{.biom} file, if present. This is passed on to \code{\link{import_biom}}, but unlike that function the default parsing function is \code{\link{parse_taxonomy_greengenes}}, rather than \code{\link{parse_taxonomy_default}}, because we know ahead of time that most (or all?) of the taxonomic classifications in the \code{microbio.me/qiime} repository will be based on GreenGenes.} \item{...}{(Optional, for advanced users). Additional arguments passed to \code{\link{download.file}}. This is mainly for non-standard links to resources (in this case, a zipped file) that are not being hosted by \href{http://www.microbio.me/qiime/index.psp}{microbio.me/qiime}. If you are using a FTP address or study number from their servers, then you shouldn't need to provide any additional arguments.} } \value{ A \code{\link{phyloseq-class}} object if possible, a component if only a component could be imported, or \code{NULL} if nothing could be imported after unzipping the file. Keep in mind there is a specific naming-convention that is expected based on the current state of the \href{http://www.microbio.me/qiime/index.psp}{microbio.me/qiime} servers. Several helpful messages are \code{\link{cat}}ted to standard out to help let you know the ongoing status of the current download and import process. } \description{ Originally, this function was for accessing microbiome datasets from the \href{http://www.microbio.me/qiime/index.psp}{microbio.me/qiime} public repository from within R. As you can see by clicking on the above link, the QIIME-DB sever is down indefinitely. However, this function will remain supported here in case the FTP server goes back up, and also for phyloseq users that have downloaded one or more data packages prior to the server going down. } \examples{ # This should return TRUE on your system if you have internet turned on # and a standard R installation. Indicates whether this is likely to # work on your system for a URL or local file, respectively. capabilities("http/ftp"); capabilities("fifo") # A working example with a local example file included in phyloseq zipfile = "study_816_split_library_seqs_and_mapping.zip" zipfile = system.file("extdata", zipfile, package="phyloseq") tarfile = "study_816_split_library_seqs_and_mapping.tar.gz" tarfile = system.file("extdata", tarfile, package="phyloseq") tarps = microbio_me_qiime(tarfile) zipps = microbio_me_qiime(zipfile) identical(tarps, zipps) tarps; zipps plot_heatmap(tarps) # An example that used to work, before the QIIME-DB server was turned off by its host. # # Smokers dataset # smokezip = "ftp://thebeast.colorado.edu/pub/QIIME_DB_Public_Studies/study_524_split_library_seqs_and_mapping.zip" # smokers1 = microbio_me_qiime(smokezip) # # Alternatively, just use the study number # smokers2 = microbio_me_qiime(524) # identical(smokers1, smokers2) } \seealso{ See \code{\link{download.file}} and \code{\link{url}} for details about URL formats -- including local file addresses -- that might work here. \code{\link{import_biom}} \code{\link{import_qiime}} } phyloseq/man/mt-methods.Rd0000644000175400017540000000722013177706002016573 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/multtest-wrapper.R \docType{methods} \name{mt} \alias{mt} \alias{mt,phyloseq,ANY-method} \alias{mt,otu_table,integer-method} \alias{mt,otu_table,numeric-method} \alias{mt,otu_table,logical-method} \alias{mt,otu_table,character-method} \alias{mt,otu_table,factor-method} \title{Multiple testing of taxa abundance according to sample categories/classes} \usage{ mt(physeq, classlabel, minPmaxT = "minP", method = "fdr", ...) \S4method{mt}{phyloseq,ANY}(physeq, classlabel, minPmaxT = "minP", method = "fdr", ...) \S4method{mt}{otu_table,integer}(physeq, classlabel, minPmaxT = "minP", method = "fdr", ...) \S4method{mt}{otu_table,numeric}(physeq, classlabel, minPmaxT = "minP", method = "fdr", ...) \S4method{mt}{otu_table,logical}(physeq, classlabel, minPmaxT = "minP", method = "fdr", ...) \S4method{mt}{otu_table,character}(physeq, classlabel, minPmaxT = "minP", method = "fdr", ...) \S4method{mt}{otu_table,factor}(physeq, classlabel, minPmaxT = "minP", method = "fdr", ...) } \arguments{ \item{physeq}{(Required). \code{\link{otu_table-class}} or \code{\link{phyloseq-class}}. In this multiple testing framework, different taxa correspond to variables (hypotheses), and samples to observations.} \item{classlabel}{(Required). A single character index of the sample-variable in the \code{\link{sample_data}} of \code{physeq} that will be used for multiple testing. Alternatively, \code{classlabel} can be a custom integer (or numeric coercable to an integer), character, or factor with length equal to \code{nsamples(physeq)}. NOTE: the default test applied to each taxa is a two-sample two-sided \code{\link{t.test}}, WHICH WILL FAIL with an error if you provide a data variable (or custom vector) that contains MORE THAN TWO classes. One alternative to consider is an F-test, by specifying \code{test="f"} as an additional argument. See the first example below, and/or further documentation of \code{\link[multtest]{mt.maxT}} or \code{\link[multtest]{mt.minP}} for other options and formal details.} \item{minPmaxT}{(Optional). Character string. \code{"mt.minP"} or \code{"mt.maxT"}. Default is to use \code{"\link[multtest]{mt.minP}"}.} \item{method}{(Optional). Additional multiple-hypthesis correction methods. A character vector from the set \code{\link[stats]{p.adjust.methods}}. Default is \code{"fdr"}, for the Benjamini and Hochberg (1995) method to control False Discovery Rate (FDR). This argument is passed on to \code{\link[stats]{p.adjust}}, please see that documentation for more details.} \item{...}{(Optional). Additional arguments, forwarded to \code{\link[multtest]{mt.maxT}} or \code{\link[multtest]{mt.minP}}} } \value{ A dataframe with components specified in the documentation for \code{\link[multtest]{mt.maxT}} or \code{\link[multtest]{mt.minP}}, respectively. } \description{ Please note that it is up to you to perform any necessary normalizing / standardizing transformations prior to these tests. See for instance \code{\link{transform_sample_counts}}. } \examples{ ## # Simple example, testing genera that sig correlate with Enterotypes data(enterotype) # Filter samples that don't have Enterotype x <- subset_samples(enterotype, !is.na(Enterotype)) # (the taxa are at the genera level in this dataset) res = mt(x, "Enterotype", method=c("fdr", "bonferroni"), test="f", B=300) head(res, 10) ## # Not surprisingly, Prevotella and Bacteroides top the list. ## # Different test, multiple-adjusted t-test, whether samples are ent-2 or not. ## mt(x, get_variable(x, "Enterotype")==2) } \seealso{ \code{\link[multtest]{mt.maxT}} \code{\link[multtest]{mt.minP}} \code{\link[stats]{p.adjust}} } phyloseq/man/nodeplotblank.Rd0000644000175400017540000000233413177706002017347 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plot-methods.R \name{nodeplotblank} \alias{nodeplotblank} \title{Function to avoid plotting node labels} \usage{ nodeplotblank(p, nodelabdf) } \arguments{ \item{p}{(Required). The \code{\link{plot_tree}} graphic.} \item{nodelabdf}{(Required). The \code{data.frame} produced internally in \code{link{plot_tree}} to use as data for creating ggplot2-based tree graphics.} } \value{ The same input object, \code{p}, provided as input. Unmodified. } \description{ Unlike, \code{\link{nodeplotdefault}} and \code{\link{nodeplotboot}}, this function does not return a function, but instead is provided directly to the \code{nodelabf} argument of \code{\link{plot_tree}} to ensure that node labels are not added to the graphic. Please note that you do not need to create or obtain the arguments to this function. Instead, you can provide this function directly to \code{\link{plot_tree}} and it will know what to do with it. Namely, use it to avoid plotting any node labels. } \examples{ data("esophagus") plot_tree(esophagus) plot_tree(esophagus, nodelabf=nodeplotblank) } \seealso{ \code{\link{nodeplotdefault}} \code{\link{nodeplotboot}} \code{\link{plot_tree}} } phyloseq/man/nodeplotboot.Rd0000644000175400017540000000430113177706002017217 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plot-methods.R \name{nodeplotboot} \alias{nodeplotboot} \title{Generates a function for labeling bootstrap values on a phylogenetic tree.} \usage{ nodeplotboot(highthresh=95L, lowcthresh=50L, size=2L, hjust=-0.2) } \arguments{ \item{highthresh}{(Optional). A single integer between 0 and 100. Any bootstrap values above this threshold will be annotated as a black filled circle on the node, rather than the bootstrap percentage value itself.} \item{lowcthresh}{(Optional). A single integer between 0 and 100, less than \code{highthresh}. Any bootstrap values below this value will not be added to the graphic. Set to 0 or below to add all available values.} \item{size}{(Optional). Numeric. Should be positive. The size parameter used to control the text size of taxa labels. Default is \code{2}. These are ggplot2 sizes.} \item{hjust}{(Optional). The horizontal justification of the node labels. Default is \code{-0.2}.} } \value{ A function that can add a bootstrap-values layer to the tree graphic. The values are represented in two ways; either as black filled circles indicating very high-confidence nodes, or the bootstrap value itself printed in small text next to the node on the tree. } \description{ Is not a labeling function itself, but returns one. The returned function is specialized for labeling bootstrap values. Note that the function that is returned has two completely different arguments from the four listed here: the plot object already built by earlier steps in \code{\link{plot_tree}}, and the \code{\link{data.frame}} that contains the relevant plotting data for the nodes (especially \code{x, y, label}), respectively. See \code{\link{nodeplotdefault}} for a simpler example. The main purpose of this and \code{\link{nodeplotdefault}} is to provide a useful default function generator for arbitrary and bootstrap node labels, respectively, and also to act as examples of functions that can successfully interact with \code{\link{plot_tree}} to add node labels to the graphic. } \examples{ nodeplotboot() nodeplotboot(3, -0.4) } \seealso{ \code{\link{nodeplotdefault}} \code{\link{nodeplotblank}} \code{\link{plot_tree}} } phyloseq/man/nodeplotdefault.Rd0000644000175400017540000000301513177706002017701 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plot-methods.R \name{nodeplotdefault} \alias{nodeplotdefault} \title{Generates a default node-label function} \usage{ nodeplotdefault(size=2L, hjust=-0.2) } \arguments{ \item{size}{(Optional). Numeric. Should be positive. The size parameter used to control the text size of taxa labels. Default is \code{2}. These are ggplot2 sizes.} \item{hjust}{(Optional). The horizontal justification of the node labels. Default is \code{-0.2}.} } \value{ A function that can add a node-label layer to a graphic. } \description{ Is not a labeling function itself, but returns one. The returned function is capable of adding whatever label is on a node. Note that the function that is returned has two completely different arguments to those listed here: the plot object already built by earlier steps in \code{\link{plot_tree}}, and the \code{\link{data.frame}} that contains the relevant plotting data for the nodes (especially \code{x, y, label}), respectively. See \code{\link{nodeplotboot}} for a more sophisticated example. The main purpose of this and \code{\link{nodeplotboot}} is to provide a useful default function generator for arbitrary and bootstrap node labels, respectively, and also to act as examples of functions that will successfully interact with \code{\link{plot_tree}} to add node labels to the graphic. } \examples{ nodeplotdefault() nodeplotdefault(3, -0.4) } \seealso{ \code{\link{nodeplotboot}} \code{\link{nodeplotblank}} \code{\link{plot_tree}} } phyloseq/man/nsamples-methods.Rd0000644000175400017540000000170613177706002020000 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/almostAllAccessors.R \docType{methods} \name{nsamples} \alias{nsamples} \alias{nsamples,ANY-method} \alias{nsamples,phyloseq-method} \alias{nsamples,otu_table-method} \alias{nsamples,sample_data-method} \title{Get the number of samples.} \usage{ nsamples(physeq) \S4method{nsamples}{ANY}(physeq) \S4method{nsamples}{phyloseq}(physeq) \S4method{nsamples}{otu_table}(physeq) \S4method{nsamples}{sample_data}(physeq) } \arguments{ \item{physeq}{A \code{\link{phyloseq-class}}, \code{\link{sample_data}}, or \code{\link{otu_table-class}}.} } \value{ An integer indicating the total number of samples. } \description{ Get the number of samples. } \examples{ # data("esophagus") tree <- phy_tree(esophagus) OTU1 <- otu_table(esophagus) nsamples(OTU1) physeq1 <- phyloseq(OTU1, tree) nsamples(physeq1) } \seealso{ \code{\link{taxa_names}}, \code{\link{sample_names}}, \code{\link{ntaxa}} } phyloseq/man/ntaxa-methods.Rd0000644000175400017540000000173113177706002017267 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/almostAllAccessors.R \docType{methods} \name{ntaxa} \alias{ntaxa} \alias{ntaxa,ANY-method} \alias{ntaxa,phyloseq-method} \alias{ntaxa,otu_table-method} \alias{ntaxa,taxonomyTable-method} \alias{ntaxa,phylo-method} \alias{ntaxa,XStringSet-method} \title{Get the number of taxa/species.} \usage{ ntaxa(physeq) \S4method{ntaxa}{ANY}(physeq) \S4method{ntaxa}{phyloseq}(physeq) \S4method{ntaxa}{otu_table}(physeq) \S4method{ntaxa}{taxonomyTable}(physeq) \S4method{ntaxa}{phylo}(physeq) \S4method{ntaxa}{XStringSet}(physeq) } \arguments{ \item{physeq}{\code{\link{phyloseq-class}}, \code{\link{otu_table-class}}, \code{\link{taxonomyTable-class}}, or \code{\link[ape]{phylo}}} } \value{ An integer indicating the number of taxa / species. } \description{ Get the number of taxa/species. } \examples{ data("esophagus") ntaxa(esophagus) phy_tree(esophagus) ntaxa(phy_tree(esophagus)) } \seealso{ taxa_names } phyloseq/man/ordinate.Rd0000644000175400017540000001637013177706002016325 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/ordination-methods.R \name{ordinate} \alias{ordinate} \title{Perform an ordination on phyloseq data} \usage{ ordinate(physeq, method = "DCA", distance = "bray", formula = NULL, ...) } \arguments{ \item{physeq}{(Required). Phylogenetic sequencing data (\code{\link{phyloseq-class}}). The data on which you want to perform the ordination. In general, these methods will be based in some fashion on the abundance table ultimately stored as a contingency matrix (\code{\link{otu_table-class}}). If you're able to import data into \code{\link{phyloseq-class}} format, than you don't need to worry, as an \code{otu_table} is a required component of this class. In addition, some ordination methods require additional data, like a constraining variable or phylogenetic tree. If that is the case, the relevant data should be included in \code{physeq} prior to running. Integrating the data in this way also results in these different data components being checked for validity and completeness by the method.} \item{method}{(Optional). A character string. Default is \code{"DCA"}. Currently supported method options are: \code{c("DCA", "CCA", "RDA", "CAP", "DPCoA", "NMDS", "MDS", "PCoA")} \describe{ \item{DCA}{Performs detrended correspondence analysis using\code{\link{decorana}}} \item{CCA}{Performs correspondence analysis, or optionally, constrained correspondence analysis (a.k.a. canonical correspondence analysis), via \code{\link[vegan]{cca}}} \item{RDA}{Performs redundancy analysis, or optionally principal components analysis, via \code{\link[vegan]{rda}}} \item{CAP}{[Partial] Constrained Analysis of Principal Coordinates or distance-based RDA, via \code{\link[vegan]{capscale}}. See \code{\link[phyloseq]{capscale.phyloseq}} for more details. In particular, a \code{\link{formula}} argument must be provided.} \item{DPCoA}{Performs Double Principle Coordinate Analysis using a (corrected, if necessary) phylogenetic/patristic distance between species. The calculation is performed by \code{\link{DPCoA}}(), which ultimately uses \code{\link[ade4]{dpcoa}} after making the appropriate accessions/corrections of the data.} \item{NMDS}{Performs Non-metric MultiDimenstional Scaling of a sample-wise ecological distance matrix onto a user-specified number of axes, \code{k}. By default, \code{k=2}, but this can be modified as a supplementary argument. This method is ultimately carried out by \code{\link{metaMDS}} after the appropriate accessions and distance calculations. Because \code{metaMDS} includes its own distance calculation wrappers to \code{\link[vegan]{vegdist}}, and these provide additional functionality in the form of species scores, \code{ordinate} will pass-on the \code{distance} argument to \code{metaMDS} if it is among the supported \code{vegdist} methods. However, all distance methods supported by \code{\link{distance}} are supported here, including \code{"unifrac"} (the default) and \code{"DPCoA"}.} \item{MDS/PCoA}{Performs principal coordinate analysis (also called principle coordinate decomposition, multidimensional scaling (MDS), or classical scaling) of a distance matrix (Gower 1966), including two correction methods for negative eigenvalues. See \code{\link[ape]{pcoa}} for further details. } }} \item{distance}{(Optional). A character string. Default is \code{"bray"}. The name of a supported \code{\link{distance}} method; or, alternatively, a pre-computed \code{\link{dist}}-class object. This argument is only utilized if a distance matrix is required by the ordination method specified by the \code{method} argument (above). Any supported \code{\link{distance}} methods are supported arguments to \code{distance} here. See \code{\link{distance}} for more details, examples.} \item{formula}{(Optional). A model \code{\link{formula}}. Only relevant for certain ordination methods. The left hand side is ignored, defined by the \code{physeq} and \code{distance} arguemnts. The right hand side gives the constraining variables, and conditioning variables can be given within a special function \code{Condition}. See \code{\link[vegan]{cca}} or \code{\link[vegan]{capscale}} for examples/details.} \item{...}{(Optional). Additional arguments to supporting functions. For example, the additional argument \code{weighted=TRUE} would be passed on to \code{\link{UniFrac}} if \code{"unifrac"} were chosen as the \code{distance} option and \code{"MDS"} as the ordination \code{method} option. Alternatively, if \code{"DCA"} were chosen as the ordination \code{method} option, additional arguments would be passed on to the relevant ordination function, \code{\link{decorana}}, for example.} } \value{ An ordination object. The specific class of the returned object depends upon the ordination method, as well as the function/package that is called internally to perform it. As a general rule, any of the ordination classes returned by this function will be recognized by downstream tools in the \code{phyloseq} package, for example the ordination plotting function, \code{\link{plot_ordination}}. } \description{ This function wraps several commonly-used ordination methods. The type of ordination depends upon the argument to \code{method}. Try \code{ordinate("help")} or \code{ordinate("list")} for the currently supported method options. } \examples{ # See http://joey711.github.io/phyloseq/plot_ordination-examples # for many more examples. # plot_ordination(GP, ordinate(GP, "DCA"), "samples", color="SampleType") } \seealso{ \href{http://joey711.github.io/phyloseq/plot_ordination-examples}{The plot_ordination Tutorial} Related component ordination functions described within phyloseq: \code{\link{DPCoA}} Described/provided by other packages: \code{\link{cca}}/\code{\link{rda}}, \code{\link{decorana}}, \code{\link{metaMDS}}, \code{\link{pcoa}}, \code{\link[vegan]{capscale}} NMDS and MDS/PCoA both operate on distance matrices, typically based on some pairwise comparison of the microbiomes in an experiment/project. There are a number of common methods to use to calculate these pairwise distances, and the most convenient function (from a \code{phyloseq} point of view) for calculating these distance matrices is the \code{\link{distance}} function. It can be thought of as a distance / dissimilarity-index companion function for \code{ordinate}, and indeed the distance options provided to \code{ordinate} are often simply passed on to \code{\link{distance}}. A good quick summary of ordination is provided in the introductory vignette for vegan: \href{http://cran.r-project.org/web/packages/vegan/vignettes/intro-vegan.pdf}{vegan introductory vignette} The following \code{R} task views are also useful for understanding the available tools in \code{R}: \href{http://cran.r-project.org/web/views/Environmetrics.html}{Analysis of Ecological and Environmental Data} \href{http://cran.r-project.org/web/views/Multivariate.html}{Multivariate Statistics} } phyloseq/man/otu_table-class.Rd0000644000175400017540000000146713177706002017602 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/allClasses.R \docType{class} \name{otu_table-class} \alias{otu_table-class} \title{The S4 class for storing taxa-abundance information.} \description{ Because orientation of these tables can vary by method, the orientation is defined explicitly in the \code{taxa_are_rows} slot (a logical). The \code{otu_table} class inherits the \code{\link{matrix}} class to store abundance values. Various standard subset and assignment nomenclature has been extended to apply to the \code{otu_table} class, including square-bracket, \code{\link{t}}, etc. } \details{ \describe{ \item{taxa_are_rows}{ A single logical specifying the orientation of the abundance table. } \item{.Data}{This slot is inherited from the \code{\link{matrix}} class.} } } phyloseq/man/otu_table-methods.Rd0000644000175400017540000000366513177706002020142 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/otuTable-class.R \docType{methods} \name{otu_table} \alias{otu_table} \alias{otu_table,phyloseq-method} \alias{otu_table,otu_table-method} \alias{otu_table,matrix-method} \alias{otu_table,data.frame-method} \alias{otu_table,ANY-method} \title{Build or access the otu_table.} \usage{ otu_table(object, taxa_are_rows, errorIfNULL=TRUE) \S4method{otu_table}{phyloseq}(object, errorIfNULL = TRUE) \S4method{otu_table}{otu_table}(object, errorIfNULL = TRUE) \S4method{otu_table}{matrix}(object, taxa_are_rows) \S4method{otu_table}{data.frame}(object, taxa_are_rows) \S4method{otu_table}{ANY}(object, errorIfNULL = TRUE) } \arguments{ \item{object}{(Required). An integer matrix, \code{\link{otu_table-class}}, or \code{\link{phyloseq-class}}.} \item{taxa_are_rows}{(Conditionally optional). Logical; of length 1. Ignored unless \code{object} is a matrix, in which case it is is required.} \item{errorIfNULL}{(Optional). Logical. Should the accessor stop with an error if the slot is empty (\code{NULL})? Default \code{TRUE}. Ignored if \code{object} argument is a matrix (constructor invoked instead).} } \value{ An \code{\link{otu_table-class}} object. } \description{ This is the suggested method for both constructing and accessing Operational Taxonomic Unit (OTU) abundance (\code{\link{otu_table-class}}) objects. When the first argument is a matrix, otu_table() will attempt to create and return an otu_table-class object, which further depends on whether or not \code{taxa_are_rows} is provided as an additional argument. Alternatively, if the first argument is an experiment-level (\code{\link{phyloseq-class}}) object, then the corresponding \code{otu_table} is returned. } \examples{ # # data(GlobalPatterns) # otu_table(GlobalPatterns) } \seealso{ \code{\link{phy_tree}}, \code{\link{sample_data}}, \code{\link{tax_table}} \code{\link{phyloseq}}, \code{\link{merge_phyloseq}} } phyloseq/man/parseTaxonomy-functions.Rd0000644000175400017540000000636013177706002021375 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/IO-methods.R \name{parse_taxonomy_default} \alias{parse_taxonomy_default} \alias{parse_taxonomy_greengenes} \alias{parse_taxonomy_default} \alias{parse_taxonomy_qiime} \alias{parse_taxonomy_default} \title{Parse elements of a taxonomy vector} \usage{ parse_taxonomy_default(char.vec) parse_taxonomy_greengenes(char.vec) parse_taxonomy_qiime(char.vec) } \arguments{ \item{char.vec}{(Required). A single character vector of taxonomic ranks for a single OTU, unprocessed (ugly).} } \value{ A character vector in which each element is a different taxonomic rank of the same OTU, and each element name is the name of the rank level. For example, an element might be \code{"Firmicutes"} and named \code{"phylum"}. These parsed, named versions of the taxonomic vector should reflect embedded information, naming conventions, desired length limits, etc; or in the case of \code{\link{parse_taxonomy_default}}, not modified at all and given dummy rank names to each element. } \description{ These are provided as both example and default functions for parsing a character vector of taxonomic rank information for a single taxa. As default functions, these are intended for cases where the data adheres to the naming convention used by greengenes (\url{http://greengenes.lbl.gov/cgi-bin/nph-index.cgi}) or where the convention is unknown, respectively. To work, these functions -- and any similar custom function you may want to create and use -- must take as input a single character vector of taxonomic ranks for a single OTU, and return a \strong{named} character vector that has been modified appropriately (according to known naming conventions, desired length limits, etc. The length (number of elements) of the output named vector does \strong{not} need to be equal to the input, which is useful for the cases where the source data files have extra meaningless elements that should probably be removed, like the ubiquitous ``Root'' element often found in greengenes/QIIME taxonomy labels. In the case of \code{parse_taxonomy_default}, no naming convention is assumed and so dummy rank names are added to the vector. More usefully if your taxonomy data is based on greengenes, the \code{parse_taxonomy_greengenes} function clips the first 3 characters that identify the rank, and uses these to name the corresponding element according to the appropriate taxonomic rank name used by greengenes (e.g. \code{"p__"} at the beginning of an element means that element is the name of the phylum to which this OTU belongs). Most importantly, the expectations for these functions described above make them compatible to use during data import, specifcally the \code{\link{import_biom}} function, but it is a flexible structure that will be implemented soon for all phyloseq import functions that deal with taxonomy (e.g. \code{\link{import_qiime}}). } \examples{ taxvec1 = c("Root", "k__Bacteria", "p__Firmicutes", "c__Bacilli", "o__Bacillales", "f__Staphylococcaceae") parse_taxonomy_default(taxvec1) parse_taxonomy_greengenes(taxvec1) taxvec2 = c("Root;k__Bacteria;p__Firmicutes;c__Bacilli;o__Bacillales;f__Staphylococcaceae") parse_taxonomy_qiime(taxvec2) } \seealso{ \code{\link{import_biom}} \code{\link{import_qiime}} } phyloseq/man/pcoa.Rd0000644000175400017540000000112513177706002015432 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/allClasses.R \docType{data} \name{pcoa} \alias{pcoa} \title{S3 class for ape-calculated MDS results} \format{An object of class \code{pcoa} of length 0.} \usage{ pcoa } \description{ Nothing to import, because ape doesn't (yet) export this S3 class. We will define it here, but keep it internal. For the moment, its only use is for proper dispatch in our extensions to the scores S3 generic from vegan, for generic extraction of coordinates and possibly other features from any ordination results. } \keyword{internal} phyloseq/man/phy_tree-methods.Rd0000644000175400017540000000421213177706002017770 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/almostAllAccessors.R \docType{methods} \name{phy_tree} \alias{phy_tree} \alias{phy_tree,ANY-method} \alias{phy_tree,phylo-method} \title{Retrieve phylogenetic tree (\code{\link[ape]{phylo}}-class) from object.} \usage{ phy_tree(physeq, errorIfNULL=TRUE) \S4method{phy_tree}{ANY}(physeq, errorIfNULL = TRUE) \S4method{phy_tree}{phylo}(physeq) } \arguments{ \item{physeq}{(Required). An instance of phyloseq-class that contains a phylogenetic tree. If physeq is a phylogenetic tree (a component data class), then it is returned as-is.} \item{errorIfNULL}{(Optional). Logical. Should the accessor stop with an error if the slot is empty (\code{NULL})? Default \code{TRUE}.} } \value{ The \code{\link[ape]{phylo}}-class object contained within \code{physeq}; or NULL if \code{physeq} does not have a tree. This method stops with an error in the latter NULL case be default, which can be over-ridden by changing the value of \code{errorIfNULL} to \code{FALSE}. } \description{ This is the suggested method for accessing the phylogenetic tree, (\code{\link[ape]{phylo}}-class) from a \code{\link{phyloseq-class}}. Like other accessors (see See Also, below), the default behavior of this method is to stop with an error if \code{physeq} is a \code{phyloseq-class} but does not contain a phylogenetic tree (the component data you are trying to access in this case). } \details{ Note that the tip labels should be named to match the \code{taxa_names} of the other objects to which it is going to be paired. The \code{\link{phyloseq}} constructor automatically checks for exact agreement in the set of species described by the phlyogenetic tree and the other components (taxonomyTable, otu_table), and trims as-needed. Thus, the tip.labels in a phylo object must be named to match the results of \code{\link{taxa_names}} of the other objects to which it will ultimately be paired. } \examples{ data(GlobalPatterns) phy_tree(GlobalPatterns) } \seealso{ \code{\link{otu_table}}, \code{\link{sample_data}}, \code{\link{tax_table}} \code{\link{refseq}}, \code{\link{phyloseq}}, \code{\link{merge_phyloseq}} } phyloseq/man/phylo-class.Rd0000644000175400017540000000067213177706002016754 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/allClasses.R \name{phylo-class} \alias{phylo-class} \title{An S4 placeholder of the main phylogenetic tree class from the ape package.} \description{ See the \code{\link[ape]{ape}} package for details about this type of representation of a phylogenetic tree. It is used throughout the ape package. } \seealso{ \code{\link[ape]{phylo}}, \code{\link{setOldClass}} } phyloseq/man/phylo.Rd0000644000175400017540000000312013177706002015640 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/allClasses.R \docType{data} \name{phylo} \alias{phylo} \title{S3 class placeholder definition (list) for phylogenetic trees.} \format{An object of class \code{phylo} of length 0.} \usage{ phylo } \description{ The ape package does not export a version of its \code{\link[ape]{phylo}}-class, partly because it is not really defined formally anywhere. Instead, it is an S3 class extended from the base class, \code{\link{list}} -- this is a very common and easy approach -- and proper behavior of any method taking an instance of this class requires exact naming conventions for element names of the components. The phyloseq package does not provide any validity checks that a given phylo instance is valid (conforms to the conventions in the ape package). Yet. If problems arise, this might be considered, and they could be defined judiciously and within phyloseq. Similarly, if a formal definition for the the phylo-class is ever exported by ape, the current philosophy of phyloseq would be to remove this internal definition and import the former. Note that there is still some work going on for the phylobase package, which is addressing these same exact issues for S4 phylogenetic tree interaction. A very large number of packages (around 60 at my last count), depend on ape, making it easily the de facto standard for representing phylogenetic trees in R; and the phyloseq team would prefer to use any exported definitions from the ape package if possible and available. } \seealso{ \code{\link[ape]{phylo}} } \keyword{internal} phyloseq/man/phyloseq-class.Rd0000644000175400017540000000475413177706002017472 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/allClasses.R \docType{class} \name{phyloseq-class} \alias{phyloseq-class} \title{The main experiment-level class for phyloseq data} \description{ Contains all currently-supported component data classes: \code{\link{otu_table-class}}, \code{\link{sample_data-class}}, \code{\link{taxonomyTable-class}} (\code{"tax_table"} slot), \code{\link[ape]{phylo}}-class (\code{"phy_tree"} slot), and the \code{\link[Biostrings]{XStringSet-class}} (\code{"refseq"} slot). There are several advantages to storing your phylogenetic sequencing experiment as an instance of the phyloseq class, not the least of which is that it is easy to return to the data later and feel confident that the different data types ``belong'' to one another. Furthermore, the \code{\link{phyloseq}} constructor ensures that the different data components have compatible indices (e.g. OTUs and samples), and performs the necessary trimming automatically when you create your ``experiment-level'' object. Downstream analyses are aware of which data classes they require -- and where to find them -- often making your \code{phyloseq-class} object the only data argument required for analysis and plotting functions (although there are many options and parameter arguments available to you). } \details{ In the case of missing component data, the slots are set to \code{NULL}. As soon as a \code{phyloseq-class} object is to be updated with new component data (previously missing/\code{NULL} or not), the indices of all components are re-checked for compatibility and trimmed if necessary. This is to ensure by design that components describe the same taxa/samples, and also that these trimming/validity checks do not need to be repeated in downstream analyses. slots: \describe{ \item{otu_table}{a single object of class otu_table.} \item{sam_data}{ a single object of class sample_data.} \item{tax_table}{ a single object of class taxonomyTable.} \item{phy_tree}{ a single object of the \code{\link[ape]{phylo}}-class, from the ape package.} \item{refseq}{ a biological sequence set object of a class that inherits from the \code{\link[Biostrings]{XStringSet-class}}, from the Biostrings package.} } } \seealso{ The constructor, \code{\link{phyloseq}}, the merger \code{\link{merge_phyloseq}}, and also the component constructor/accessors \code{\link{otu_table}}, \code{\link{sample_data}}, \code{\link{tax_table}}, \code{\link{phy_tree}}, and \code{\link{refseq}}. } phyloseq/man/phyloseq-deprecated.Rd0000644000175400017540000001112313177706002020451 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/deprecated_functions.R \docType{package} \name{phyloseq-deprecated} \alias{phyloseq-deprecated} \alias{deprecated_phyloseq_function} \alias{plot_taxa_bar} \alias{taxaplot} \alias{taxtab} \alias{taxTab} \alias{sampleData} \alias{samData} \alias{sam_data} \alias{speciesSums} \alias{sampleSums} \alias{nspecies} \alias{species.names} \alias{sampleNames} \alias{sample.names} \alias{getSamples} \alias{getSpecies} \alias{rank.names} \alias{getTaxa} \alias{sample.variables} \alias{getVariable} \alias{merge_species} \alias{otuTable} \alias{speciesarerows} \alias{speciesAreRows} \alias{plot_richness_estimates} \alias{import_qiime_sampleData} \alias{filterfunSample} \alias{genefilterSample} \alias{prune_species} \alias{subset_species} \alias{tipglom} \alias{taxglom} \alias{tre} \alias{show_mothur_list_cutoffs} \alias{sam_data<-} \alias{sampleData<-} \alias{tre<-} \alias{speciesAreRows<-} \alias{otuTable<-} \alias{taxTab<-} \alias{phyloseq-deprecated-package} \title{Depcrecated functions in the phyloseq package.} \usage{ deprecated_phyloseq_function(x, value, ...) } \arguments{ \item{x}{For assignment operators, the object that will undergo a replacement (object inside parenthesis).} \item{value}{For assignment operators, the value to replace with (the right side of the assignment).} \item{...}{For functions other than assignment operators, parameters to be passed to the modern version of the function (see table).} } \description{ These will be migrated to \code{"defunct"} status in the next release, and removed completely in the release after that. These functions are provided for compatibility with older version of the phyloseq package. They may eventually be completely removed. } \details{ \tabular{rl}{ \code{plot_taxa_bar} \tab now a synonym for \code{\link{plot_bar}}\cr \code{taxaplot} \tab now a synonym for \code{\link{plot_bar}}\cr \code{taxtab} \tab now a synonym for \code{\link{tax_table}}\cr \code{taxTab} \tab now a synonym for \code{\link{tax_table}}\cr \code{sampleData} \tab now a synonym for \code{\link{sample_data}}\cr \code{samData} \tab now a synonym for \code{\link{sample_data}}\cr \code{sam_data} \tab now a synonym for \code{\link{sample_data}}\cr \code{speciesSums} \tab now a synonym for \code{\link{taxa_sums}}\cr \code{sampleSums} \tab now a synonym for \code{\link{sample_sums}}\cr \code{nspecies} \tab now a synonym for \code{\link{ntaxa}}\cr \code{species.names} \tab now a synonym for \code{\link{taxa_names}}\cr \code{sampleNames} \tab now a synonym for \code{\link{sample_names}}\cr \code{sample.names} \tab now a synonym for \code{\link{sample_names}}\cr \code{getSamples} \tab now a synonym for \code{\link{get_sample}}\cr \code{getSpecies} \tab now a synonym for \code{\link{get_taxa}}\cr \code{rank.names} \tab now a synonym for \code{\link{rank_names}}\cr \code{getTaxa} \tab now a synonym for \code{\link{get_taxa_unique}}\cr \code{sample.variables} \tab now a synonym for \code{\link{sample_variables}}\cr \code{getVariable} \tab now a synonym for \code{\link{get_variable}}\cr \code{merge_species} \tab now a synonym for \code{\link{merge_taxa}}\cr \code{otuTable} \tab now a synonym for \code{\link{otu_table}}\cr \code{speciesarerows} \tab now a synonym for \code{\link{taxa_are_rows}}\cr \code{speciesAreRows} \tab now a synonym for \code{\link{taxa_are_rows}}\cr \code{plot_richness_estimates} \tab now a synonym for \code{\link{plot_richness}}\cr \code{import_qiime_sampleData} \tab now a synonym for \code{\link{import_qiime_sample_data}}\cr \code{filterfunSample} \tab now a synonym for \code{\link{filterfun_sample}}\cr \code{genefilterSample} \tab now a synonym for \code{\link{genefilter_sample}}\cr \code{prune_species} \tab now a synonym for \code{\link{prune_taxa}}\cr \code{subset_species} \tab now a synonym for \code{\link{subset_taxa}}\cr \code{tipglom} \tab now a synonym for \code{\link{tip_glom}}\cr \code{taxglom} \tab now a synonym for \code{\link{tax_glom}}\cr \code{tre} \tab now a synonym for \code{\link{phy_tree}}\cr \code{show_mothur_list_cutoffs} \tab now a synonym for \code{\link{show_mothur_cutoffs}}\cr \code{sam_data<-} \tab now a synonym for \code{\link{sample_data<-}}\cr \code{sampleData<-} \tab now a synonym for \code{\link{sample_data<-}}\cr \code{tre<-} \tab now a synonym for \code{\link{phy_tree<-}}\cr \code{speciesAreRows<-} \tab now a synonym for \code{\link{taxa_are_rows<-}}\cr \code{otuTable<-} \tab now a synonym for \code{\link{otu_table<-}}\cr \code{taxTab<-} \tab now a synonym for \code{\link{tax_table<-}}\cr } } phyloseq/man/phyloseq-package.Rd0000644000175400017540000000263513177706002017754 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/allPackage.R \docType{package} \name{phyloseq-package} \alias{phyloseq-package} \title{Handling and analysis of high-throughput phylogenetic sequence data.} \description{ There are already several ecology and phylogenetic packages available in R, including the adephylo, vegan, ade4, picante, ape, phangorn, phylobase, and OTUbase packages. These can already take advantage of many of the powerful statistical and graphics tools available in R. However, prior to \emph{phyloseq} a user must devise their own methods for parsing the output of their favorite OTU clustering application, and, as a consequence, there is also no standard within Bioconductor (or R generally) for storing or sharing the suite of related data objects that describe a phylogenetic sequencing project. The phyloseq package seeks to address these issues by providing a related set of S4 classes that internally manage the handling tasks associated with organizing, linking, storing, and analyzing phylogenetic sequencing data. \emph{phyloseq} additionally provides some convenience wrappers for input from common clustering applications, common analysis pipelines, and native implementation of methods that are not available in other R packages. } \references{ \url{www.stanford.edu/~mcmurdie} } \author{ Paul J. McMurdie II \email{mcmurdie@stanford.edu} } \keyword{package} phyloseq/man/phyloseq.Rd0000644000175400017540000000351513177706002016361 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/phyloseq-class.R \name{phyloseq} \alias{phyloseq} \title{Build phyloseq-class objects from their components.} \usage{ phyloseq(...) } \arguments{ \item{...}{One or more component objects among the set of classes defined by the phyloseq package, as well as \code{phylo}-class (defined by the \code{\link{ape-package}}). Each argument should be a different class. For combining multiple components of the same class, or multiple phyloseq-class objects, use the \code{\link{merge_phyloseq}} function. Unlike in earlier versions, the arguments to phyloseq do not need to be named, and the order of the arguments does not matter.} } \value{ The class of the returned object depends on the argument class(es). For an experiment-level object, two or more component data objects must be provided. Otherwise, if a single component-class is provided, it is simply returned as-is. The order of arguments does not matter. } \description{ \code{phyloseq()} is a constructor method, This is the main method suggested for constructing an experiment-level (\code{\link{phyloseq-class}}) object from its component data (component data classes: \code{\link{otu_table-class}}, \code{\link{sample_data-class}}, \code{\link{taxonomyTable-class}}, \code{\link{phylo-class}}). } \examples{ data(esophagus) x1 = phyloseq(otu_table(esophagus), phy_tree(esophagus)) identical(x1, esophagus) # # data(GlobalPatterns) # # GP <- GlobalPatterns # # phyloseq(sample_data(GP), otu_table(GP)) # # phyloseq(otu_table(GP), phy_tree(GP)) # # phyloseq(tax_table(GP), otu_table(GP)) # # phyloseq(phy_tree(GP), otu_table(GP), sample_data(GP)) # # phyloseq(otu_table(GP), tax_table(GP), sample_data(GP)) # # phyloseq(otu_table(GP), phy_tree(GP), tax_table(GP), sample_data(GP)) } \seealso{ \code{\link{merge_phyloseq}} } phyloseq/man/phyloseq_to_deseq2.Rd0000644000175400017540000000442013177706002020322 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/extend_DESeq2.R \name{phyloseq_to_deseq2} \alias{phyloseq_to_deseq2} \title{Convert phyloseq data to DESeq2 dds object} \usage{ phyloseq_to_deseq2(physeq, design, ...) } \arguments{ \item{physeq}{(Required). \code{\link{phyloseq-class}}. Must have a \code{\link{sample_data}} component.} \item{design}{(Required). A \code{\link{formula}} which specifies the design of the experiment, taking the form \code{formula(~ x + y + z)}. That is, a formula with right-hand side only. By default, the functions in this package and DESeq2 will use the last variable in the formula (e.g. \code{z}) for presenting results (fold changes, etc.) and plotting. When considering your specification of experimental design, you will want to re-order the levels so that the \code{NULL} set is first. For example, the following line of code would ensure that Enterotype 1 is used as the reference sample class in tests by setting it to the first of the factor levels using the \code{\link{relevel}} function: \code{sample_data(entill)$Enterotype <- relevel(sample_data(entill)$Enterotype, "1")}} \item{...}{(Optional). Additional named arguments passed to \code{\link[DESeq2]{DESeqDataSetFromMatrix}}. Most users will not need to pass any additional arguments here. Most testing-related options should be provided in a following call to \code{\link[DESeq2]{DESeq}}.} } \value{ A \code{\link[DESeq2]{DESeqDataSet}} object. } \description{ No testing is performed by this function. The phyloseq data is converted to the relevant \code{\link[DESeq2]{DESeqDataSet}} object, which can then be tested in the negative binomial generalized linear model framework of the \code{\link[DESeq2]{DESeq}} function in DESeq2 package. See the \href{http://joey711.github.io/phyloseq-extensions}{phyloseq-extensions} tutorials for more details. } \examples{ # Check out the vignette phyloseq-mixture-models for more details. # vignette("phyloseq-mixture-models") data(soilrep) phyloseq_to_deseq2(soilrep, ~warmed) } \seealso{ \code{vignette("phyloseq-mixture-models")} The \href{http://joey711.github.io/phyloseq-extensions}{phyloseq-extensions} tutorials. \code{\link[DESeq2]{DESeq}} \code{\link[DESeq2]{results}} \code{\link[DESeq2]{DESeqDataSetFromMatrix}} } phyloseq/man/phyloseq_to_metagenomeSeq.Rd0000644000175400017540000000254013177706002021732 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/extend_metagenomeSeq.R \name{phyloseq_to_metagenomeSeq} \alias{phyloseq_to_metagenomeSeq} \title{Convert phyloseq data to MetagenomeSeq MRexperiment object} \usage{ phyloseq_to_metagenomeSeq(physeq, ...) } \arguments{ \item{physeq}{(Required). \code{\link{phyloseq-class}}.} \item{...}{(Optional). Additional named arguments passed to \code{\link[metagenomeSeq]{newMRexperiment}}. Most users will not need to pass any additional arguments here.} } \value{ A \code{\link[metagenomeSeq]{MRexperiment-class}} object. } \description{ No testing is performed by this function. The phyloseq data is converted to the relevant \code{\link[metagenomeSeq]{MRexperiment-class}} object, which can then be tested in the zero-inflated mixture model framework (e.g. \code{\link[metagenomeSeq]{fitZig}}) in the metagenomeSeq package. See the \href{http://joey711.github.io/phyloseq-extensions}{phyloseq-extensions} tutorials for more details. } \examples{ # Check out the vignette metagenomeSeq for more details. # vignette("metagenomeSeq") data(soilrep) phyloseq_to_metagenomeSeq(soilrep) } \seealso{ \code{\link[metagenomeSeq]{fitTimeSeries}} \code{\link[metagenomeSeq]{fitLogNormal}} \code{\link[metagenomeSeq]{fitZig}} \code{\link[metagenomeSeq]{MRtable}} \code{\link[metagenomeSeq]{MRfulltable}} } phyloseq/man/plot_bar.Rd0000644000175400017540000000544613177706002016324 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plot-methods.R \name{plot_bar} \alias{plot_bar} \title{A flexible, informative barplot phyloseq data} \usage{ plot_bar(physeq, x="Sample", y="Abundance", fill=NULL, title=NULL, facet_grid=NULL) } \arguments{ \item{physeq}{(Required). An \code{\link{otu_table-class}} or \code{\link{phyloseq-class}}.} \item{x}{(Optional). Optional, but recommended, especially if your data is comprised of many samples. A character string. The variable in the melted-data that should be mapped to the x-axis. See \code{\link{psmelt}}, \code{\link{melt}}, and \code{\link{ggplot}} for more details.} \item{y}{(Optional). A character string. The variable in the melted-data that should be mapped to the y-axis. Typically this will be \code{"Abundance"}, in order to quantitatively display the abundance values for each OTU/group. However, alternative variables could be used instead, producing a very different, though possibly still informative, plot. See \code{\link{psmelt}}, \code{\link{melt}}, and \code{\link{ggplot}} for more details.} \item{fill}{(Optional). A character string. Indicates which sample variable should be used to map to the fill color of the bars. The default is \code{NULL}, resulting in a gray fill for all bar segments.} \item{title}{(Optional). Default \code{NULL}. Character string. The main title for the graphic.} \item{facet_grid}{(Optional). A formula object. It should describe the faceting you want in exactly the same way as for \code{\link[ggplot2]{facet_grid}}, and is ulitmately provided to \code{\link{ggplot}}2 graphics. The default is: \code{NULL}, resulting in no faceting.} } \value{ A \code{\link[ggplot2]{ggplot}}2 graphic object -- rendered in the graphical device as the default \code{\link[base]{print}}/\code{\link[methods]{show}} method. } \description{ There are many useful examples of phyloseq barplot graphics in the \href{http://joey711.github.io/phyloseq/plot_bar-examples}{phyloseq online tutorials}. This function wraps \code{ggplot2} plotting, and returns a \code{ggplot2} graphic object that can be saved or further modified with additional layers, options, etc. The main purpose of this function is to quickly and easily create informative summary graphics of the differences in taxa abundance between samples in an experiment. } \examples{ data("GlobalPatterns") gp.ch = subset_taxa(GlobalPatterns, Phylum == "Chlamydiae") plot_bar(gp.ch) plot_bar(gp.ch, fill="Genus") plot_bar(gp.ch, x="SampleType", fill="Genus") plot_bar(gp.ch, "SampleType", fill="Genus", facet_grid=~Family) # See additional examples in the plot_bar online tutorial. Link above. } \seealso{ \href{http://joey711.github.io/phyloseq/plot_bar-examples}{phyloseq online tutorials}. \code{\link{psmelt}} \code{\link{ggplot}} \code{\link{qplot}} } phyloseq/man/plot_clusgap.Rd0000644000175400017540000000340013177706002017202 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plot-methods.R \name{plot_clusgap} \alias{plot_clusgap} \title{Create a ggplot summary of gap statistic results} \usage{ plot_clusgap(clusgap, title = "Gap Statistic results") } \arguments{ \item{clusgap}{(Required). An object of S3 class \code{"clusGap"}, basically a list with components. See the \code{\link[cluster]{clusGap}} documentation for more details. In most cases this will be the output of \code{\link{gapstat_ord}}, or \code{\link[cluster]{clusGap}} if you called it directly.} \item{title}{(Optional). Character string. The main title for the graphic. Default is \code{"Gap Statistic results"}.} } \value{ A \code{\link[ggplot2]{ggplot}} plot object. The rendered graphic should be a plot of the gap statistic score versus values for \code{k}, the number of clusters. } \description{ Create a ggplot summary of gap statistic results } \examples{ # Load and process data data("soilrep") soilr = rarefy_even_depth(soilrep, rngseed=888) print(soilr) sample_variables(soilr) # Ordination sord = ordinate(soilr, "DCA") # Gap Statistic gs = gapstat_ord(sord, axes=1:4, verbose=FALSE) # Evaluate results with plots, etc. plot_scree(sord) plot_ordination(soilr, sord, color="Treatment") plot_clusgap(gs) print(gs, method="Tibs2001SEmax") # Non-ordination example, use cluster::clusGap function directly library("cluster") pam1 = function(x, k){list(cluster = pam(x, k, cluster.only=TRUE))} gs.pam.RU = clusGap(ruspini, FUN = pam1, K.max = 8, B = 60) gs.pam.RU plot(gs.pam.RU, main = "Gap statistic for the 'ruspini' data") mtext("k = 4 is best .. and k = 5 pretty close") plot_clusgap(gs.pam.RU) } \seealso{ \code{\link{gapstat_ord}} \code{\link[cluster]{clusGap}} \code{\link[ggplot2]{ggplot}} } phyloseq/man/plot_heatmap.Rd0000644000175400017540000002463413177706002017177 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plot-methods.R \name{plot_heatmap} \alias{plot_heatmap} \title{Create an ecologically-organized heatmap using ggplot2 graphics} \usage{ plot_heatmap(physeq, method = "NMDS", distance = "bray", sample.label = NULL, taxa.label = NULL, low = "#000033", high = "#66CCFF", na.value = "black", trans = log_trans(4), max.label = 250, title = NULL, sample.order = NULL, taxa.order = NULL, first.sample = NULL, first.taxa = NULL, ...) } \arguments{ \item{physeq}{(Required). The data, in the form of an instance of the \code{\link{phyloseq-class}}. This should be what you get as a result from one of the \code{\link{import}} functions, or any of the processing downstream. No data components beyond the \code{\link{otu_table}} are strictly necessary, though they may be useful if you want to re-label the axis ticks according to some observable or taxonomic rank, for instance, or if you want to use a \code{\link{UniFrac}}-based distance (in which case your \code{physeq} data would need to have a tree included).} \item{method}{(Optional). The ordination method to use for organizing the heatmap. A great deal of the usefulness of a heatmap graphic depends upon the way in which the rows and columns are ordered.} \item{distance}{(Optional). A character string. The ecological distance method to use in the ordination. See \code{\link{distance}}.} \item{sample.label}{(Optional). A character string. The sample variable by which you want to re-label the sample (horizontal) axis.} \item{taxa.label}{(Optional). A character string. The name of the taxonomic rank by which you want to re-label the taxa/species/OTU (vertical) axis. You can see available options in your data using \code{\link{rank_names}(physeq)}.} \item{low}{(Optional). A character string. An R color. See \code{?\link{colors}} for options support in R (there are lots). The color that represents the lowest non-zero value in the heatmap. Default is a dark blue color, \code{"#000033"}.} \item{high}{(Optional). A character string. An R color. See \code{\link{colors}} for options support in R (there are lots). The color that will represent the highest value in the heatmap. The default is \code{"#66CCFF"}. Zero-values are treated as \code{NA}, and set to \code{"black"}, to represent a background color.} \item{na.value}{(Optional). A character string. An R color. See \code{\link{colors}} for options support in R (there are lots). The color to represent what is essentially the background of the plot, the non-observations that occur as \code{NA} or \code{0} values in the abundance table. The default is \code{"black"}, which works well on computer-screen graphics devices, but may be a poor choice for printers, in which case you might want this value to be \code{"white"}, and reverse the values of \code{high} and \code{low}, above.} \item{trans}{(Optional). \code{"trans"}-class transformer-definition object. A numerical transformer to use in the continuous color scale. See \code{\link[scales]{trans_new}} for details. The default is \code{\link{log_trans}(4)}.} \item{max.label}{(Optional). Integer. Default is 250. The maximum number of labeles to fit on a given axis (either x or y). If number of taxa or samples exceeds this value, the corresponding axis will be stripped of any labels. This supercedes any arguments provided to \code{sample.label} or \code{taxa.label}. Make sure to increase this value if, for example, you want a special label for an axis that has 300 indices.} \item{title}{(Optional). Default \code{NULL}. Character string. The main title for the graphic.} \item{sample.order}{(Optional). Default \code{NULL}. Either a single character string matching one of the \code{\link{sample_variables}} in your data, or a character vector of \code{\link{sample_names}} in the precise order that you want them displayed in the heatmap. This overrides any ordination ordering that might be done with the \code{method}/\code{distance} arguments.} \item{taxa.order}{(Optional). Default \code{NULL}. Either a single character string matching one of the \code{\link{rank_names}} in your data, or a character vector of \code{\link{taxa_names}} in the precise order that you want them displayed in the heatmap. This overrides any ordination ordering that might be done with the \code{method}/\code{distance} arguments.} \item{first.sample}{(Optional). Default \code{NULL}. A character string matching one of the \code{\link{sample_names}} of your input data (\code{physeq}). It will become the left-most sample in the plot. For the ordination-based ordering (recommended), the left and right edges of the axes are adjaacent in a continuous ordering. Therefore, the choice of starting sample is meaningless and arbitrary, but it is aesthetically poor to have the left and right edge split a natural cluster in the data. This argument allows you to specify the left edge and thereby avoid cluster-splitting, emphasize a gradient, etc.} \item{first.taxa}{(Optional). Default \code{NULL}. A character string matching one of the \code{\link{taxa_names}} of your input data (\code{physeq}). This is equivalent to \code{first.sample} (above), but for the taxa/OTU indices, usually the vertical axis.} \item{...}{(Optional). Additional parameters passed to \code{\link{ordinate}}.} } \value{ A heatmap plot, in the form of a \code{\link{ggplot}2} plot object, which can be further saved and modified. } \description{ There are many useful examples of phyloseq heatmap graphics in the \href{http://joey711.github.io/phyloseq/plot_heatmap-examples}{phyloseq online tutorials}. In a 2010 article in BMC Genomics, Rajaram and Oono show describe an approach to creating a heatmap using ordination methods to organize the rows and columns instead of (hierarchical) cluster analysis. In many cases the ordination-based ordering does a much better job than h-clustering. An immediately useful example of their approach is provided in the NeatMap package for R. The NeatMap package can be used directly on the abundance table (\code{\link{otu_table-class}}) of phylogenetic-sequencing data, but the NMDS or PCA ordination options that it supports are not based on ecological distances. To fill this void, phyloseq provides the \code{plot_heatmap()} function as an ecology-oriented variant of the NeatMap approach to organizing a heatmap and build it using ggplot2 graphics tools. The \code{distance} and \code{method} arguments are the same as for the \code{\link{plot_ordination}} function, and support large number of distances and ordination methods, respectively, with a strong leaning toward ecology. This function also provides the options to re-label the OTU and sample axis-ticks with a taxonomic name and/or sample variable, respectively, in the hope that this might hasten your interpretation of the patterns (See the \code{sample.label} and \code{taxa.label} documentation, below). Note that this function makes no attempt to overlay hierarchical clustering trees on the axes, as hierarchical clustering is not used to organize the plot. Also note that each re-ordered axis repeats at the edge, and so apparent clusters at the far right/left or top/bottom of the heat-map may actually be the same. For now, the placement of this edge can be considered arbitrary, so beware of this artifact of this graphical representation. If you benefit from this phyloseq-specific implementation of the NeatMap approach, please cite both our packages/articles. } \details{ This approach borrows heavily from the \code{heatmap1} function in the \code{NeatMap} package. Highly recommended, and we are grateful for their package and ideas, which we have adapted for our specific purposes here, but did not use an explicit dependency. At the time of the first version of this implementation, the NeatMap package depends on the rgl-package, which is not needed in phyloseq, at present. Although likely a transient issue, the rgl-package has some known installation issues that have further influenced to avoid making NeatMap a formal dependency (Although we love both NeatMap and rgl!). } \examples{ data("GlobalPatterns") gpac <- subset_taxa(GlobalPatterns, Phylum=="Crenarchaeota") # FYI, the base-R function uses a non-ecological ordering scheme, # but does add potentially useful hclust dendrogram to the sides... gpac <- subset_taxa(GlobalPatterns, Phylum=="Crenarchaeota") # Remove the nearly-empty samples (e.g. 10 reads or less) gpac = prune_samples(sample_sums(gpac) > 50, gpac) # Arbitrary order if method set to NULL plot_heatmap(gpac, method=NULL, sample.label="SampleType", taxa.label="Family") # Use ordination plot_heatmap(gpac, sample.label="SampleType", taxa.label="Family") # Use ordination for OTUs, but not sample-order plot_heatmap(gpac, sample.label="SampleType", taxa.label="Family", sample.order="SampleType") # Specifying both orders omits any attempt to use ordination. The following should be the same. p0 = plot_heatmap(gpac, sample.label="SampleType", taxa.label="Family", taxa.order="Phylum", sample.order="SampleType") p1 = plot_heatmap(gpac, method=NULL, sample.label="SampleType", taxa.label="Family", taxa.order="Phylum", sample.order="SampleType") #expect_equivalent(p0, p1) # Example: Order matters. Random ordering of OTU indices is difficult to interpret, even with structured sample order rando = sample(taxa_names(gpac), size=ntaxa(gpac), replace=FALSE) plot_heatmap(gpac, method=NULL, sample.label="SampleType", taxa.label="Family", taxa.order=rando, sample.order="SampleType") # # Select the edges of each axis. # First, arbitrary edge, ordering plot_heatmap(gpac, method=NULL) # Second, biological-ordering (instead of default ordination-ordering), but arbitrary edge plot_heatmap(gpac, taxa.order="Family", sample.order="SampleType") # Third, biological ordering, selected edges plot_heatmap(gpac, taxa.order="Family", sample.order="SampleType", first.taxa="546313", first.sample="NP2") # Fourth, add meaningful labels plot_heatmap(gpac, sample.label="SampleType", taxa.label="Family", taxa.order="Family", sample.order="SampleType", first.taxa="546313", first.sample="NP2") } \references{ Because this function relies so heavily in principle, and in code, on some of the functionality in NeatMap, please site their article if you use this function in your work. Rajaram, S., & Oono, Y. (2010). NeatMap--non-clustering heat map alternatives in R. BMC Bioinformatics, 11, 45. Please see further examples in the \href{http://joey711.github.io/phyloseq/plot_heatmap-examples}{phyloseq online tutorials}. } phyloseq/man/plot_net.Rd0000644000175400017540000001201113177706002016330 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plot-methods.R \name{plot_net} \alias{plot_net} \title{Microbiome Network Plot using ggplot2} \usage{ plot_net(physeq, distance = "bray", type = "samples", maxdist = 0.7, laymeth = "fruchterman.reingold", color = NULL, shape = NULL, rescale = FALSE, point_size = 5, point_alpha = 1, point_label = NULL, hjust = 1.35, title = NULL) } \arguments{ \item{physeq}{(Required). The \code{\link{phyloseq-class}} object that you want to represent as a network.} \item{distance}{(Optional). Default is \code{"bray"}. Can be either a distance method supported by \code{\link[phyloseq]{distance}}, or an already-computed \code{\link{dist}}-class with labels that match the indices implied by both the \code{physeq} and \code{type} arguments (that is, either sample or taxa names). If you used \code{\link[phyloseq]{distance}} to pre-calculate your \code{\link{dist}}ance, and the same \code{type} argument as provided here, then they will match.} \item{type}{(Optional). Default \code{"samples"}. Whether the network represented in the primary argument, \code{g}, is samples or taxa/OTUs. Supported arguments are \code{"samples"}, \code{"taxa"}, where \code{"taxa"} indicates using the taxa indices, whether they actually represent species or some other taxonomic rank.} \item{maxdist}{(Optional). Default \code{0.7}. The maximum distance value between two vertices to connect with an edge in the graphic.} \item{laymeth}{(Optional). Default \code{"fruchterman.reingold"}. A character string that indicates the method that will determine the placement of vertices, typically based on conectedness of vertices and the number of vertices. This is an interesting topic, and there are lots of options. See \code{\link{igraph-package}} for related topics in general, and see \code{\link[igraph]{layout.auto}} for descriptions of various alternative layout method options supported here. The character string argument should match exactly the layout function name with the \code{"layout."} omitted. Try \code{laymeth="list"} to see a list of options.} \item{color}{(Optional). Default \code{NULL}. The name of the sample variable in \code{physeq} to use for color mapping of points (graph vertices).} \item{shape}{(Optional). Default \code{NULL}. The name of the sample variable in \code{physeq} to use for shape mapping. of points (graph vertices).} \item{rescale}{(Optional). Logical. Default \code{FALSE}. Whether to rescale the distance values to be \code{[0, 1]}, in which the min value is close to zero and the max value is 1.} \item{point_size}{(Optional). Default \code{5}. The size of the vertex points.} \item{point_alpha}{(Optional). Default \code{1}. A value between 0 and 1 for the alpha transparency of the vertex points.} \item{point_label}{(Optional). Default \code{NULL}. The variable name in \code{physeq} covariate data to map to vertex labels.} \item{hjust}{(Optional). Default \code{1.35}. The amount of horizontal justification to use for each label.} \item{title}{(Optional). Default \code{NULL}. Character string. The main title for the graphic.} } \value{ A \code{\link{ggplot}}2 network plot. Will render to default graphic device automatically as print side effect. Can also be saved, further manipulated, or rendered to a vector or raster file using \code{\link{ggsave}}. } \description{ There are many useful examples of phyloseq network graphics in the \href{http://joey711.github.io/phyloseq/plot_net-examples}{phyloseq online tutorials}. A custom plotting function for displaying networks using advanced \code{\link[ggplot2]{ggplot}}2 formatting. Note that this function is a performance and interface revision to \code{\link{plot_network}}, which requires an \code{\link[igraph]{igraph}} object as its first argument. This new function is more in-line with other \code{plot_*} functions in the \code{\link{phyloseq-package}}, in that its first/main argument is a \code{\link{phyloseq-class}} instance. Edges in the network are created if the distance between nodes is below a (potentially arbitrary) threshold, and special care should be given to considering the choice of this threshold. However, network line thickness and opacity is scaled according to the similarity of vertices (either samples or taxa), helping to temper, somewhat, the effect of the threshold. Also note that the choice of network layout algorithm can have a large effect on the impression and interpretability of the network graphic, and you may want to familiarize yourself with some of these options (see the \code{laymeth} argument). } \examples{ data(enterotype) plot_net(enterotype, color="SeqTech", maxdist = 0.3) plot_net(enterotype, color="SeqTech", maxdist = 0.3, laymeth = "auto") plot_net(enterotype, color="SeqTech", maxdist = 0.3, laymeth = "svd") plot_net(enterotype, color="SeqTech", maxdist = 0.3, laymeth = "circle") plot_net(enterotype, color="SeqTech", shape="Enterotype", maxdist = 0.3, laymeth = "circle") } \seealso{ Original network plotting functions: \code{\link{make_network}} \code{\link{plot_network}} } phyloseq/man/plot_network.Rd0000644000175400017540000001044213177706002017241 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plot-methods.R \name{plot_network} \alias{plot_network} \title{Microbiome Network Plot using ggplot2} \usage{ plot_network(g, physeq=NULL, type="samples", color=NULL, shape=NULL, point_size=4, alpha=1, label="value", hjust = 1.35, line_weight=0.5, line_color=color, line_alpha=0.4, layout.method=layout.fruchterman.reingold, title=NULL) } \arguments{ \item{g}{(Required). An \code{igraph}-class object created either by the convenience wrapper \code{\link{make_network}}, or directly by the tools in the igraph-package.} \item{physeq}{(Optional). Default \code{NULL}. A \code{\link{phyloseq-class}} object on which \code{g} is based.} \item{type}{(Optional). Default \code{"samples"}. Whether the network represented in the primary argument, \code{g}, is samples or taxa/OTUs. Supported arguments are \code{"samples"}, \code{"taxa"}, where \code{"taxa"} indicates using the taxa indices, whether they actually represent species or some other taxonomic rank.} \item{color}{(Optional). Default \code{NULL}. The name of the sample variable in \code{physeq} to use for color mapping of points (graph vertices).} \item{shape}{(Optional). Default \code{NULL}. The name of the sample variable in \code{physeq} to use for shape mapping. of points (graph vertices).} \item{point_size}{(Optional). Default \code{4}. The size of the vertex points.} \item{alpha}{(Optional). Default \code{1}. A value between 0 and 1 for the alpha transparency of the vertex points.} \item{label}{(Optional). Default \code{"value"}. The name of the sample variable in \code{physeq} to use for labelling the vertex points.} \item{hjust}{(Optional). Default \code{1.35}. The amount of horizontal justification to use for each label.} \item{line_weight}{(Optional). Default \code{0.3}. The line thickness to use to label graph edges.} \item{line_color}{(Optional). Default \code{color}. The name of the sample variable in \code{physeq} to use for color mapping of lines (graph edges).} \item{line_alpha}{(Optional). Default \code{0.4}. The transparency level for graph-edge lines.} \item{layout.method}{(Optional). Default \code{layout.fruchterman.reingold}. A function (closure) that determines the placement of the vertices for drawing a graph. Should be able to take an \code{igraph}-class as sole argument, and return a two-column coordinate matrix with \code{nrow} equal to the number of vertices. For possible options already included in \code{igraph}-package, see the others also described in the help file:} \item{title}{(Optional). Default \code{NULL}. Character string. The main title for the graphic. \code{\link[igraph]{layout.fruchterman.reingold}}} } \value{ A \code{\link{ggplot}}2 plot representing the network, with optional mapping of variable(s) to point color or shape. } \description{ There are many useful examples of phyloseq network graphics in the \href{http://joey711.github.io/phyloseq/plot_network-examples}{phyloseq online tutorials}. A custom plotting function for displaying networks using advanced \code{\link[ggplot2]{ggplot}}2 formatting. The network itself should be represented using the \code{igraph} package. For the \code{\link{phyloseq-package}} it is suggested that the network object (argument \code{g}) be created using the \code{\link{make_network}} function, and based upon sample-wise or taxa-wise microbiome ecological distances calculated from a phylogenetic sequencing experiment (\code{\link{phyloseq-class}}). In this case, edges in the network are created if the distance between nodes is below a potentially arbitrary threshold, and special care should be given to considering the choice of this threshold. } \examples{ data(enterotype) ig <- make_network(enterotype, max.dist=0.3) plot_network(ig, enterotype, color="SeqTech", shape="Enterotype", line_weight=0.3, label=NULL) # Change distance parameter ig <- make_network(enterotype, max.dist=0.2) plot_network(ig, enterotype, color="SeqTech", shape="Enterotype", line_weight=0.3, label=NULL) } \references{ This code was adapted from a repo original hosted on GitHub by Scott Chamberlain: \url{https://github.com/SChamberlain/gggraph} The code most directly used/modified was first posted here: \url{http://www.r-bloggers.com/basic-ggplot2-network-graphs/} } \seealso{ \code{\link{make_network}} } phyloseq/man/plot_ordination.Rd0000644000175400017540000001122413177706002017715 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plot-methods.R \name{plot_ordination} \alias{plot_ordination} \title{General ordination plotter based on ggplot2.} \usage{ plot_ordination(physeq, ordination, type = "samples", axes = 1:2, color = NULL, shape = NULL, label = NULL, title = NULL, justDF = FALSE) } \arguments{ \item{physeq}{(Required). \code{\link{phyloseq-class}}. The data about which you want to plot and annotate the ordination.} \item{ordination}{(Required). An ordination object. Many different classes of ordination are defined by \code{R} packages. Ordination classes currently supported/created by the \code{\link{ordinate}} function are supported here. There is no default, as the expectation is that the ordination will be performed and saved prior to calling this plot function.} \item{type}{(Optional). The plot type. Default is \code{"samples"}. The currently supported options are \code{c("samples", "sites", "species", "taxa", "biplot", "split", "scree")}. The option ``taxa'' is equivalent to ``species'' in this case, and similarly, ``samples'' is equivalent to ``sites''. The options \code{"sites"} and \code{"species"} result in a single-plot of just the sites/samples or species/taxa of the ordination, respectively. The \code{"biplot"} and \code{"split"} options result in a combined plot with both taxa and samples, either combined into one plot (``biplot'') or separated in two facet panels (``split''), respectively. The \code{"scree"} option results in a call to \code{\link{plot_scree}}, which produces an ordered bar plot of the normalized eigenvalues associated with each ordination axis.} \item{axes}{(Optional). A 2-element vector indicating the axes of the ordination that should be used for plotting. Can be \code{\link{character-class}} or \code{\link{integer-class}}, naming the index name or index of the desired axis for the horizontal and vertical axes, respectively, in that order. The default value, \code{c(1, 2)}, specifies the first two axes of the provided ordination.} \item{color}{(Optional). Default \code{NULL}. Character string. The name of the variable to map to colors in the plot. This can be a sample variable (among the set returned by \code{sample_variables(physeq)} ) or taxonomic rank (among the set returned by \code{rank_names(physeq)}). Note that the color scheme is chosen automatically by \code{link{ggplot}}, but it can be modified afterward with an additional layer using \code{\link[ggplot2]{scale_color_manual}}.} \item{shape}{(Optional). Default \code{NULL}. Character string. The name of the variable to map to different shapes on the plot. Similar to \code{color} option, but for the shape if points. The shape scale is chosen automatically by \code{link{ggplot}}, but it can be modified afterward with an additional layer using \code{\link[ggplot2]{scale_shape_manual}}.} \item{label}{(Optional). Default \code{NULL}. Character string. The name of the variable to map to text labels on the plot. Similar to \code{color} option, but for plotting text.} \item{title}{(Optional). Default \code{NULL}. Character string. The main title for the graphic.} \item{justDF}{(Optional). Default \code{FALSE}. Logical. Instead of returning a ggplot2-object, do you just want the relevant \code{data.frame} that was used to build the plot? This is a user-accessible option for obtaining the \code{data.frame}, in in principal to make a custom plot that isn't possible with the available options in this function. For contributing new functions (developers), the \code{\link{phyloseq-package}} provides/uses an internal function to build the key features of the \code{data.frame} prior to plot-build.} } \value{ A \code{\link{ggplot}} plot object, graphically summarizing the ordination result for the specified axes. } \description{ There are many useful examples of phyloseq ordination graphics in the \href{http://joey711.github.io/phyloseq/plot_ordination-examples}{phyloseq online tutorials}. Convenience wrapper for plotting ordination results as a \code{ggplot2}-graphic, including additional annotation in the form of shading, shape, and/or labels of sample variables. } \examples{ # See other examples at # http://joey711.github.io/phyloseq/plot_ordination-examples data(GlobalPatterns) GP = prune_taxa(names(sort(taxa_sums(GlobalPatterns), TRUE)[1:50]), GlobalPatterns) gp_bray_pcoa = ordinate(GP, "CCA", "bray") plot_ordination(GP, gp_bray_pcoa, "samples", color="SampleType") } \seealso{ Many more examples are included in the \href{http://joey711.github.io/phyloseq/plot_ordination-examples}{phyloseq online tutorials}. Also see the general wrapping function: \code{\link{plot_phyloseq}} } phyloseq/man/plot_phyloseq-methods.Rd0000644000175400017540000000305513177706002021057 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plot-methods.R \docType{methods} \name{plot_phyloseq} \alias{plot_phyloseq} \alias{plot_phyloseq,phyloseq-method} \title{Generic plot defaults for phyloseq.} \usage{ plot_phyloseq(physeq, ...) \S4method{plot_phyloseq}{phyloseq}(physeq, ...) } \arguments{ \item{physeq}{(Required). \code{\link{phyloseq-class}}. The actual plot type depends on the available (non-empty) component data types contained within.} \item{...}{(Optional). Additional parameters to be passed on to the respective specific plotting function. See below for different plotting functions that might be called by this generic plotting wrapper.} } \value{ A plot is created. The nature and class of the plot depends on the \code{physeq} argument, specifically, which component data classes are present. } \description{ There are many useful examples of phyloseq graphics functions in the \href{http://joey711.github.io/phyloseq}{phyloseq online tutorials}. The specific plot type is chosen according to available non-empty slots. This is mainly for syntactic convenience and quick-plotting. See links below for some examples of available graphics tools available in the \code{\link{phyloseq-package}}. } \examples{ data(esophagus) plot_phyloseq(esophagus) } \seealso{ \href{http://joey711.github.io/phyloseq/tutorials-index.html}{phyloseq frontpage tutorials}. \code{\link{plot_ordination}} \code{\link{plot_heatmap}} \code{\link{plot_tree}} \code{\link{plot_network}} \code{\link{plot_bar}} \code{\link{plot_richness}} } phyloseq/man/plot_richness.Rd0000644000175400017540000001365713177706002017401 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plot-methods.R \name{plot_richness} \alias{plot_richness} \title{Plot alpha diversity, flexibly with ggplot2} \usage{ plot_richness(physeq, x = "samples", color = NULL, shape = NULL, title = NULL, scales = "free_y", nrow = 1, shsi = NULL, measures = NULL, sortby = NULL) } \arguments{ \item{physeq}{(Required). \code{\link{phyloseq-class}}, or alternatively, an \code{\link{otu_table-class}}. The data about which you want to estimate.} \item{x}{(Optional). A variable to map to the horizontal axis. The vertical axis will be mapped to the alpha diversity index/estimate and have units of total taxa, and/or index value (dimensionless). This parameter (\code{x}) can be either a character string indicating a variable in \code{sample_data} (among the set returned by \code{sample_variables(physeq)} ); or a custom supplied vector with length equal to the number of samples in the dataset (nsamples(physeq)). The default value is \code{"samples"}, which will map each sample's name to a separate horizontal position in the plot.} \item{color}{(Optional). Default \code{NULL}. The sample variable to map to different colors. Like \code{x}, this can be a single character string of the variable name in \code{sample_data} (among the set returned by \code{sample_variables(physeq)} ); or a custom supplied vector with length equal to the number of samples in the dataset (nsamples(physeq)). The color scheme is chosen automatically by \code{link{ggplot}}, but it can be modified afterward with an additional layer using \code{\link[ggplot2]{scale_color_manual}}.} \item{shape}{(Optional). Default \code{NULL}. The sample variable to map to different shapes. Like \code{x} and \code{color}, this can be a single character string of the variable name in \code{sample_data} (among the set returned by \code{sample_variables(physeq)} ); or a custom supplied vector with length equal to the number of samples in the dataset (nsamples(physeq)). The shape scale is chosen automatically by \code{link{ggplot}}, but it can be modified afterward with an additional layer using \code{\link[ggplot2]{scale_shape_manual}}.} \item{title}{(Optional). Default \code{NULL}. Character string. The main title for the graphic.} \item{scales}{(Optional). Default \code{"free_y"}. Whether to let vertical axis have free scale that adjusts to the data in each panel. This argument is passed to \code{\link[ggplot2]{facet_wrap}}. If set to \code{"fixed"}, a single vertical scale will be used in all panels. This can obscure values if the \code{measures} argument includes both richness estimates and diversity indices, for example.} \item{nrow}{(Optional). Default is \code{1}, meaning that all plot panels will be placed in a single row, side-by-side. This argument is passed to \code{\link[ggplot2]{facet_wrap}}. If \code{NULL}, the number of rows and columns will be chosen automatically (wrapped) based on the number of panels and the size of the graphics device.} \item{shsi}{(Deprecated). No longer supported. Instead see `measures` below.} \item{measures}{(Optional). Default is \code{NULL}, meaning that all available alpha-diversity measures will be included in plot panels. Alternatively, you can specify one or more measures as a character vector of measure names. Values must be among those supported: \code{c("Observed", "Chao1", "ACE", "Shannon", "Simpson", "InvSimpson", "Fisher")}.} \item{sortby}{(Optional). A character string subset of \code{measures} argument. Sort x-indices by the mean of one or more \code{measures}, if x-axis is mapped to a discrete variable. Default is \code{NULL}, implying that a discrete-value horizontal axis will use default sorting, usually alphabetic.} } \value{ A \code{\link{ggplot}} plot object summarizing the richness estimates, and their standard error. } \description{ There are many useful examples of alpha-diversity graphics in the \href{http://joey711.github.io/phyloseq/plot_richness-examples}{phyloseq online tutorials}. This function estimates a number of alpha-diversity metrics using the \code{\link{estimate_richness}} function, and returns a \code{ggplot} plotting object. The plot generated by this function will include every sample in \code{physeq}, but they can be further grouped on the horizontal axis through the argument to \code{x}, and shaded according to the argument to \code{color} (see below). You must use untrimmed, non-normalized count data for meaningful results, as many of these estimates are highly dependent on the number of singletons. You can always trim the data later on if needed, just not before using this function. } \details{ NOTE: Because this plotting function incorporates the output from \code{\link{estimate_richness}}, the variable names of that output should not be used as \code{x} or \code{color} (even if it works, the resulting plot might be kindof strange, and not the intended behavior of this function). The following are the names you will want to avoid using in \code{x} or \code{color}: \code{c("Observed", "Chao1", "ACE", "Shannon", "Simpson", "InvSimpson", "Fisher")}. } \examples{ ## There are many more interesting examples at the phyloseq online tutorials. ## http://joey711.github.io/phyloseq/plot_richness-examples data("soilrep") plot_richness(soilrep, measures=c("InvSimpson", "Fisher")) plot_richness(soilrep, "Treatment", "warmed", measures=c("Chao1", "ACE", "InvSimpson"), nrow=3) data("GlobalPatterns") plot_richness(GlobalPatterns, x="SampleType", measures=c("InvSimpson")) plot_richness(GlobalPatterns, x="SampleType", measures=c("Chao1", "ACE", "InvSimpson"), nrow=3) plot_richness(GlobalPatterns, x="SampleType", measures=c("Chao1", "ACE", "InvSimpson"), nrow=3, sortby = "Chao1") } \seealso{ \code{\link{estimate_richness}} \code{\link[vegan]{estimateR}} \code{\link[vegan]{diversity}} There are many more interesting examples at the \href{http://joey711.github.io/phyloseq/plot_richness-examples}{phyloseq online tutorials}. } phyloseq/man/plot_scree.Rd0000644000175400017540000000354113177706002016653 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plot-methods.R \name{plot_scree} \alias{plot_scree} \title{General ordination eigenvalue plotter using ggplot2.} \usage{ plot_scree(ordination, title = NULL) } \arguments{ \item{ordination}{(Required). An ordination object. Many different classes of ordination are defined by \code{R} packages. Ordination classes currently supported/created by the \code{\link{ordinate}} function are supported here. There is no default, as the expectation is that the ordination will be performed and saved prior to calling this plot function.} \item{title}{(Optional). Default \code{NULL}. Character string. The main title for the graphic.} } \value{ A \code{\link{ggplot}} plot object, graphically summarizing the ordination result for the specified axes. } \description{ Convenience wrapper for plotting ordination eigenvalues (if available) using a \code{ggplot2}-graphic. } \examples{ # First load and trim a dataset data("GlobalPatterns") GP = prune_taxa(names(sort(taxa_sums(GlobalPatterns), TRUE)[1:50]), GlobalPatterns) # Test plots (preforms ordination in-line, then makes scree plot) plot_scree(ordinate(GP, "DPCoA", "bray")) plot_scree(ordinate(GP, "PCoA", "bray")) # Empty return with message plot_scree(ordinate(GP, "NMDS", "bray")) # Constrained ordinations plot_scree(ordinate(GP, "CCA", formula=~SampleType)) plot_scree(ordinate(GP, "RDA", formula=~SampleType)) plot_scree(ordinate(GP, "CAP", formula=~SampleType)) # Deprecated example of constrained ordination (emits a warning) #plot_scree(ordinate(GP ~ SampleType, "RDA")) plot_scree(ordinate(GP, "DCA")) plot_ordination(GP, ordinate(GP, "DCA"), type="scree") } \seealso{ \code{\link{plot_ordination}} \code{\link{ordinate}} \code{\link{distance}} \href{http://joey711.github.io/phyloseq/plot_ordination-examples}{phyloseq online tutorials} } phyloseq/man/plot_tree.Rd0000644000175400017540000002066113177706002016513 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plot-methods.R \name{plot_tree} \alias{plot_tree} \title{Plot a phylogenetic tree with optional annotations} \usage{ plot_tree(physeq, method = "sampledodge", nodelabf = NULL, color = NULL, shape = NULL, size = NULL, min.abundance = Inf, label.tips = NULL, text.size = NULL, sizebase = 5, base.spacing = 0.02, ladderize = FALSE, plot.margin = 0.2, title = NULL, treetheme = NULL, justify = "jagged") } \arguments{ \item{physeq}{(Required). The data about which you want to plot and annotate a phylogenetic tree, in the form of a single instance of the \code{\link{phyloseq-class}}, containing at minimum a phylogenetic tree component (try \code{\link{phy_tree}}). One of the major advantages of this function over basic tree-plotting utilities in the \code{\link{ape}}-package is the ability to easily annotate the tree with sample variables and taxonomic information. For these uses, the \code{physeq} argument should also have a \code{\link{sample_data}} and/or \code{\link{tax_table}} component(s).} \item{method}{(Optional). Character string. Default \code{"sampledodge"}. The name of the annotation method to use. This will be expanded in future versions. Currently only \code{"sampledodge"} and \code{"treeonly"} are supported. The \code{"sampledodge"} option results in points drawn next to leaves if individuals from that taxa were observed, and a separate point is drawn for each sample.} \item{nodelabf}{(Optional). A function. Default \code{NULL}. If \code{NULL}, the default, a function will be selected for you based upon whether or not there are node labels in \code{phy_tree(physeq)}. For convenience, the phyloseq package includes two generator functions for adding arbitrary node labels (can be any character string), \code{\link{nodeplotdefault}}; as well as for adding bootstrap values in a certain range, \code{\link{nodeplotboot}}. To not have any node labels in the graphic, set this argument to \code{\link{nodeplotblank}}.} \item{color}{(Optional). Character string. Default \code{NULL}. The name of the variable in \code{physeq} to map to point color. Supported options here also include the reserved special variables of \code{\link{psmelt}}.} \item{shape}{(Optional). Character string. Default \code{NULL}. The name of the variable in \code{physeq} to map to point shape. Supported options here also include the reserved special variables of \code{\link{psmelt}}.} \item{size}{(Optional). Character string. Default \code{NULL}. The name of the variable in \code{physeq} to map to point size. A special argument \code{"abundance"} is reserved here and scales point size using abundance in each sample on a log scale. Supported options here also include the reserved special variables of \code{\link{psmelt}}.} \item{min.abundance}{(Optional). Numeric. The minimum number of individuals required to label a point with the precise number. Default is \code{Inf}, meaning that no points will have their abundance labeled. If a vector, only the first element is used.} \item{label.tips}{(Optional). Character string. Default is \code{NULL}, indicating that no tip labels will be printed. If \code{"taxa_names"}, then the name of the taxa will be added to the tree; either next to the leaves, or next to the set of points that label the leaves. Alternatively, if this is one of the rank names (from \code{rank_names(physeq)}), then the identity (if any) for that particular taxonomic rank is printed instead.} \item{text.size}{(Optional). Numeric. Should be positive. The size parameter used to control the text size of taxa labels. Default is \code{NULL}. If left \code{NULL}, this function will automatically calculate a (hopefully) optimal text size given the vertical constraints posed by the tree itself. This argument is included in case the automatically-calculated size is wrong, and you want to change it. Note that this parameter is only meaningful if \code{label.tips} is not \code{NULL}.} \item{sizebase}{(Optional). Numeric. Should be positive. The base of the logarithm used to scale point sizes to graphically represent abundance of species in a given sample. Default is 5.} \item{base.spacing}{(Optional). Numeric. Default is \code{0.02}. Should be positive. This defines the base-spacing between points at each tip/leaf in the the tree. The larger this value, the larger the spacing between points. This is useful if you have problems with overlapping large points and/or text indicating abundance, for example. Similarly, if you don't have this problem and want tighter point-spacing, you can shrink this value.} \item{ladderize}{(Optional). Boolean or character string (either \code{FALSE}, \code{TRUE}, or \code{"left"}). Default is \code{FALSE}. This parameter specifies whether or not to \code{\link[ape]{ladderize}} the tree (i.e., reorder nodes according to the depth of their enclosed subtrees) prior to plotting. This tends to make trees more aesthetically pleasing and legible in a graphical display. When \code{TRUE} or \code{"right"}, ``right'' ladderization is used. When set to \code{FALSE}, no ladderization is applied. When set to \code{"left"}, the reverse direction (``left'' ladderization) is applied. This argument is passed on to \code{\link{tree_layout}}.} \item{plot.margin}{(Optional). Numeric. Default is \code{0.2}. Should be positive. This defines how much right-hand padding to add to the tree plot, which can be required to not truncate tip labels. The margin value is specified as a fraction of the overall tree width which is added to the right side of the plot area. So a value of \code{0.2} adds twenty percent extra space to the right-hand side of the plot.} \item{title}{(Optional). Default \code{NULL}. Character string. The main title for the graphic.} \item{treetheme}{(Optional). A custom \code{\link{ggplot}}2 \code{\link[ggplot2]{theme}} layer to use for the tree. Supplants any default theme layers used within the function. A value of \code{NULL} uses a default, minimal-annotations theme. If anything other than a them or \code{NULL}, the current global ggplot2 theme will result.} \item{justify}{(Optional). A character string indicating the type of justification to use on dodged points and tip labels. A value of \code{"jagged"}, the default, results in these tip-mapped elements being spaced as close to the tips as possible without gaps. Currently, any other value for \code{justify} results in a left-justified arrangement of both labels and points.} } \value{ A \code{\link{ggplot}}2 plot. } \description{ There are many useful examples of phyloseq tree graphics in the \href{http://joey711.github.io/phyloseq/plot_tree-examples}{phyloseq online tutorials}. This function is intended to facilitate easy graphical investigation of the phylogenetic tree, as well as sample data. Note that for phylogenetic sequencing of samples with large richness, some of the options in this function will be prohibitively slow to render, or too dense to be interpretable. A rough ``rule of thumb'' is to use subsets of data with not many more than 200 OTUs per plot, sometimes less depending on the complexity of the additional annotations being mapped to the tree. It is usually possible to create an unreadable, uninterpretable tree with modern datasets. However, the goal should be toward parameter settings and data subsets that convey (honestly, accurately) some biologically relevant feature of the data. One of the goals of the \code{\link{phyloseq-package}} is to make the determination of these features/settings as easy as possible. } \details{ This function received an early development contribution from the work of Gregory Jordan via \href{https://github.com/gjuggler/ggphylo}{the ggphylo package}. \code{plot_tree} has since been re-written. For details see \code{\link{tree_layout}}. } \examples{ # # Using plot_tree() with the esophagus dataset. # # Please note that many more interesting examples are shown # # in the online tutorials" # # http://joey711.github.io/phyloseq/plot_tree-examples data(esophagus) # plot_tree(esophagus) # plot_tree(esophagus, color="Sample") # plot_tree(esophagus, size="Abundance") # plot_tree(esophagus, size="Abundance", color="samples") plot_tree(esophagus, size="Abundance", color="Sample", base.spacing=0.03) plot_tree(esophagus, size="abundance", color="samples", base.spacing=0.03) } \seealso{ \code{\link{plot.phylo}} There are many useful examples of phyloseq tree graphics in the \href{http://joey711.github.io/phyloseq/plot_tree-examples}{phyloseq online tutorials}. } phyloseq/man/prune_samples-methods.Rd0000644000175400017540000000337113177706002021033 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/transform_filter-methods.R \docType{methods} \name{prune_samples} \alias{prune_samples} \alias{prune_samples,character,otu_table-method} \alias{prune_samples,character,sample_data-method} \alias{prune_samples,character,phyloseq-method} \alias{prune_samples,logical,ANY-method} \title{Define a subset of samples to keep in a phyloseq object.} \usage{ prune_samples(samples, x) \S4method{prune_samples}{character,otu_table}(samples, x) \S4method{prune_samples}{character,sample_data}(samples, x) \S4method{prune_samples}{character,phyloseq}(samples, x) \S4method{prune_samples}{logical,ANY}(samples, x) } \arguments{ \item{samples}{(Required). A character vector of the samples in object x that you want to keep -- OR alternatively -- a logical vector where the kept samples are TRUE, and length is equal to the number of samples in object x. If \code{samples} is a named logical, the samples retained is based on those names. Make sure they are compatible with the \code{sample_names} of the object you are modifying (\code{x}).} \item{x}{A phyloseq object.} } \value{ The class of the object returned by \code{prune_samples} matches the class of the phyloseq object, \code{x}. } \description{ An S4 Generic method for pruning/filtering unwanted samples by defining those you want to keep. } \examples{ data(GlobalPatterns) # Subset to just the Chlamydiae phylum. GP.chl <- subset_taxa(GlobalPatterns, Phylum=="Chlamydiae") # Remove the samples that have less than 20 total reads from Chlamydiae GP.chl <- prune_samples(sample_sums(GP.chl)>=20, GP.chl) # (p <- plot_tree(GP.chl, color="SampleType", shape="Family", label.tips="Genus", size="abundance")) } \seealso{ \code{\link{subset_samples}} } phyloseq/man/prune_taxa-methods.Rd0000644000175400017540000000503413177706002020322 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/transform_filter-methods.R \docType{methods} \name{prune_taxa} \alias{prune_taxa} \alias{prune_taxa,NULL,ANY-method} \alias{prune_taxa,logical,ANY-method} \alias{prune_taxa,character,phylo-method} \alias{prune_taxa,character,otu_table-method} \alias{prune_taxa,character,sample_data-method} \alias{prune_taxa,character,phyloseq-method} \alias{prune_taxa,character,taxonomyTable-method} \alias{prune_taxa,character,XStringSet-method} \title{Prune unwanted OTUs / taxa from a phylogenetic object.} \usage{ prune_taxa(taxa, x) \S4method{prune_taxa}{`NULL`,ANY}(taxa, x) \S4method{prune_taxa}{logical,ANY}(taxa, x) \S4method{prune_taxa}{character,phylo}(taxa, x) \S4method{prune_taxa}{character,otu_table}(taxa, x) \S4method{prune_taxa}{character,sample_data}(taxa, x) \S4method{prune_taxa}{character,phyloseq}(taxa, x) \S4method{prune_taxa}{character,taxonomyTable}(taxa, x) \S4method{prune_taxa}{character,XStringSet}(taxa, x) } \arguments{ \item{taxa}{(Required). A character vector of the taxa in object x that you want to keep -- OR alternatively -- a logical vector where the kept taxa are TRUE, and length is equal to the number of taxa in object x. If \code{taxa} is a named logical, the taxa retained are based on those names. Make sure they are compatible with the \code{taxa_names} of the object you are modifying (\code{x}).} \item{x}{(Required). A phylogenetic object, including \code{phylo} trees, as well as all phyloseq classes that represent taxa. If the function \code{\link{taxa_names}} returns a non-\code{NULL} value, then your object can be pruned by this function.} } \value{ The class of the object returned by \code{prune_taxa} matches the class of the argument, \code{x}. } \description{ An S4 Generic method for removing (pruning) unwanted OTUs/taxa from phylogenetic objects, including phylo-class trees, as well as native phyloseq package objects. This is particularly useful for pruning a phyloseq object that has more than one component that describes OTUs. Credit: the \code{phylo}-class version is adapted from \href{http://cran.at.r-project.org/web/packages/picante/index.html}{prune.sample}. } \examples{ data("esophagus") esophagus plot(sort(taxa_sums(esophagus), TRUE), type="h", ylim=c(0, 50)) x1 = prune_taxa(taxa_sums(esophagus) > 10, esophagus) x2 = prune_taxa(names(sort(taxa_sums(esophagus), TRUE))[1:9], esophagus) identical(x1, x2) } \seealso{ \code{\link{prune_samples}} \href{http://cran.at.r-project.org/web/packages/picante/index.html}{prune.sample} } phyloseq/man/psmelt.Rd0000644000175400017540000000512613177706002016021 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plot-methods.R \name{psmelt} \alias{psmelt} \title{Melt phyloseq data object into large data.frame} \usage{ psmelt(physeq) } \arguments{ \item{physeq}{(Required). An \code{\link{otu_table-class}} or \code{\link{phyloseq-class}}. Function most useful for phyloseq-class.} } \value{ A \code{\link{data.frame}}-class table. } \description{ The psmelt function is a specialized melt function for melting phyloseq objects (instances of the phyloseq class), usually for producing graphics with \code{\link[ggplot2]{ggplot}2}. \code{psmelt} relies heavily on the \code{\link[reshape2]{melt}} and \code{\link{merge}} functions. The naming conventions used in downstream phyloseq graphics functions have reserved the following variable names that should not be used as the names of \code{\link{sample_variables}} or taxonomic \code{\link{rank_names}}. These reserved names are \code{c("Sample", "Abundance", "OTU")}. Also, you should not have identical names for sample variables and taxonomic ranks. That is, the intersection of the output of the following two functions \code{\link{sample_variables}}, \code{\link{rank_names}} should be an empty vector (e.g. \code{intersect(sample_variables(physeq), rank_names(physeq))}). All of these potential name collisions are checked-for and renamed automtically with a warning. However, if you (re)name your variables accordingly ahead of time, it will reduce confusion and eliminate the warnings. } \details{ Note that ``melted'' phyloseq data is stored much less efficiently, and so RAM storage issues could arise with a smaller dataset (smaller number of samples/OTUs/variables) than one might otherwise expect. For common sizes of graphics-ready datasets, however, this should not be a problem. Because the number of OTU entries has a large effect on the RAM requirement, methods to reduce the number of separate OTU entries -- for instance by agglomerating OTUs based on phylogenetic distance using \code{\link{tip_glom}} -- can help alleviate RAM usage problems. This function is made user-accessible for flexibility, but is also used extensively by plot functions in phyloseq. } \examples{ data("GlobalPatterns") gp.ch = subset_taxa(GlobalPatterns, Phylum == "Chlamydiae") mdf = psmelt(gp.ch) nrow(mdf) ncol(mdf) colnames(mdf) head(rownames(mdf)) # Create a ggplot similar to library("ggplot2") p = ggplot(mdf, aes(x=SampleType, y=Abundance, fill=Genus)) p = p + geom_bar(color="black", stat="identity", position="stack") print(p) } \seealso{ \code{\link{plot_bar}} \code{\link[reshape2]{melt}} \code{\link{merge}} } phyloseq/man/rank_names.Rd0000644000175400017540000000155213177706002016632 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/almostAllAccessors.R \name{rank_names} \alias{rank_names} \title{Retrieve the names of the taxonomic ranks} \usage{ rank_names(physeq, errorIfNULL=TRUE) } \arguments{ \item{physeq}{(Required). \code{\link{taxonomyTable-class}}, or \code{\link{phyloseq-class}}.} \item{errorIfNULL}{(Optional). Logical. Should the accessor stop with an error if the slot is empty (\code{NULL})? Default \code{TRUE}.} } \value{ Character vector. The names of the available taxonomic ranks. } \description{ This is a simple accessor function to make it more convenient to determine the taxonomic ranks that are available in a given \code{\link{phyloseq-class}} object. } \examples{ data(enterotype) rank_names(enterotype) } \seealso{ \code{\link{get_taxa}} \code{\link{taxa_names}} \code{\link{sample_names}} } phyloseq/man/rarefy_even_depth.Rd0000644000175400017540000001333513177706002020207 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/transform_filter-methods.R \name{rarefy_even_depth} \alias{rarefy_even_depth} \title{Resample an OTU table such that all samples have the same library size.} \usage{ rarefy_even_depth(physeq, sample.size = min(sample_sums(physeq)), rngseed = FALSE, replace = TRUE, trimOTUs = TRUE, verbose = TRUE) } \arguments{ \item{physeq}{(Required). A \code{\link{phyloseq-class}} object that you want to trim/filter.} \item{sample.size}{(Optional). A single integer value equal to the number of reads being simulated, also known as the depth, and also equal to each value returned by \code{\link{sample_sums}} on the output.} \item{rngseed}{(Optional). A single integer value passed to \code{\link{set.seed}}, which is used to fix a seed for reproducibly random number generation (in this case, reproducibly random subsampling). The default value is \code{711}. If set to \code{FALSE}, then no fiddling with the RNG seed is performed, and it is up to the user to appropriately call \code{\link{set.seed}} beforehand to achieve reproducible results.} \item{replace}{(Optional). Logical. Whether to sample with replacement (\code{TRUE}) or without replacement (\code{FALSE}). The default is with replacement (\code{replace=TRUE}). Two implications to consider are that (1) sampling with replacement is faster and more memory efficient as currently implemented; and (2), sampling with replacement means that there is a chance that the number of reads for a given OTU in a given sample could be larger than the original count value, as opposed to sampling without replacement where the original count value is the maximum possible. Prior to phyloseq package version number \code{1.5.20}, this parameter did not exist and sampling with replacement was the only random subsampling implemented in the \code{rarefy_even_depth} function. Note that this default behavior was selected for computational efficiency, but differs from analogous functions in related packages (e.g. subsampling in QIIME).} \item{trimOTUs}{(Optional). \code{\link{logical}(1)}. Whether to trim OTUs from the dataset that are no longer observed in any sample (have a count of zero in every sample). The number of OTUs trimmed, if any, is printed to standard out as a reminder.} \item{verbose}{(Optional). Logical. Default is \code{TRUE}. If \code{TRUE}, extra non-warning, non-error messages are printed to standard out, describing steps in the rarefying process, the OTUs and samples removed, etc. This can be useful the first few times the function is executed, but can be set to \code{FALSE} as-needed once behavior has been verified as expected.} } \value{ An object of class \code{phyloseq}. Only the \code{otu_table} component is modified. } \description{ Please note that the authors of phyloseq do not advocate using this as a normalization procedure, despite its recent popularity. Our justifications for using alternative approaches to address disparities in library sizes have been made available as \href{http://dx.plos.org/10.1371/journal.pcbi.1003531}{an article in PLoS Computational Biology}. See \code{\link{phyloseq_to_deseq2}} for a recommended alternative to rarefying directly supported in the phyloseq package, as well as \href{http://joey711.github.io/waste-not-supplemental/}{the supplemental materials for the PLoS-CB article} and \href{http://joey711.github.io/phyloseq-extensions}{the phyloseq extensions repository on GitHub}. Nevertheless, for comparison and demonstration, the rarefying procedure is implemented here in good faith and with options we hope are useful. This function uses the standard R \code{\link{sample}} function to resample from the abundance values in the \code{\link{otu_table}} component of the first argument, \code{physeq}. Often one of the major goals of this procedure is to achieve parity in total number of counts between samples, as an alternative to other formal normalization procedures, which is why a single value for the \code{sample.size} is expected. This kind of resampling can be performed with and without replacement, with replacement being the more computationally-efficient, default setting. See the \code{replace} parameter documentation for more details. We recommended that you explicitly select a random number generator seed before invoking this function, or, alternatively, that you explicitly provide a single positive integer argument as \code{rngseed}. } \details{ This approach is sometimes mistakenly called ``rarefaction'', which \href{http://en.wikipedia.org/wiki/Rarefaction}{in physics refers to a form of wave decompression;} but in this context, ecology, the term refers to a \href{http://en.wikipedia.org/wiki/Rarefaction_(ecology)}{repeated sampling procedure to assess species richness}, first proposed in 1968 by Howard Sanders. In contrast, the procedure implemented here is used as an \emph{ad hoc} means to normalize microbiome counts that have resulted from libraries of widely-differing sizes. Here we have intentionally adopted an alternative name, \code{rarefy}, that has also been used recently to describe this process and, to our knowledge, not previously used in ecology. Make sure to use \code{\link{set.seed}} for exactly-reproducible results of the random subsampling. } \examples{ # Test with esophagus dataset data("esophagus") esorepT = rarefy_even_depth(esophagus, replace=TRUE) esorepF = rarefy_even_depth(esophagus, replace=FALSE) sample_sums(esophagus) sample_sums(esorepT) sample_sums(esorepF) ## NRun Manually: Too slow! # data("GlobalPatterns") # GPrepT = rarefy_even_depth(GlobalPatterns, 1E5, replace=TRUE) ## Actually just this one is slow # system.time(GPrepF <- rarefy_even_depth(GlobalPatterns, 1E5, replace=FALSE)) } \seealso{ \code{\link{sample}} \code{\link{set.seed}} } phyloseq/man/read_tree.Rd0000644000175400017540000000355213177706002016450 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/IO-methods.R \name{read_tree} \alias{read_tree} \title{Somewhat flexible tree-import function} \usage{ read_tree(treefile, errorIfNULL=FALSE, ...) } \arguments{ \item{treefile}{(Required). A character string implying a file \code{\link{connection}} (like a path or URL), or an actual \code{\link{connection}}. Must be a Newick- or Nexus-formatted tree.} \item{errorIfNULL}{(Optional). Logical. Should an error be thrown if no tree can be extracted from the connection? Default is \code{FALSE}, indicating that \code{NULL} will be SILENTLY returned, rather than an error. Be cautious about this behavior. Useful for phyloseq internals, but might be hard to track in your own code if you're not aware of this ``no error by default'' setting. If this is a problem, change this value to \code{TRUE}, and you can still use the function.} \item{...}{(Optional). Additional parameter(s) passed to the relevant tree-importing function.} } \value{ If successful, returns a \code{\link{phylo}}-class object as defined in the \code{\link[ape]{ape-package}}. Returns NULL if neither tree-reading function worked. } \description{ This function is a convenience wrapper around the \code{\link[ape]{read.tree}} (Newick-format) and \code{\link[ape]{read.nexus}} (Nexus-format) importers provided by the \code{\link[ape]{ape-package}}. This function attempts to return a valid tree if possible using either format importer. If it fails, it silently returns \code{NULL} by default, rather than throwing a show-stopping error. } \examples{ read_tree(system.file("extdata", "esophagus.tree.gz", package="phyloseq")) read_tree(system.file("extdata", "GP_tree_rand_short.newick.gz", package="phyloseq")) } \seealso{ \code{\link{read_tree_greengenes}} \code{\link{phylo}} \code{\link[ape]{read.tree}} \code{\link[ape]{read.nexus}} } phyloseq/man/read_tree_greengenes.Rd0000644000175400017540000000422313177706002020646 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/IO-methods.R \name{read_tree_greengenes} \alias{read_tree_greengenes} \title{Read GreenGenes tree released in annotated newick format} \usage{ read_tree_greengenes(treefile) } \arguments{ \item{treefile}{(Required). A character string implying a file \code{\link{connection}} (like a path or URL), or an actual \code{\link{connection}}. Must be a Newick--formatted tree released by GreenGenes in October 2012 or later. The similarity threshold of the OTUs should not matter, except that it should match your OTU table.} } \value{ A tree, represented as a \code{\link{phylo}} object. } \description{ In principal, this is a standard newick format, that can be imported into R using \code{\link{read_tree}}, which in-turn utilizes \code{\link[ape]{read.tree}}. However, \code{\link[ape]{read.tree}} has failed to import recent (October 2012 and later) releases of the GreenGenes tree, and this problem has been traced to the additional annotations added to some internal nodes that specify taxonomic classification between single-quotes. To solve this problem and create a clear container for fixing future problems with the format of GreenGenes-released trees, this function is available in phyloseq and exported for users. It is also referenced in the documentation of the import functions for QIIME legacy and BIOM format importers -- \code{\link{import_qiime}} and \code{\link{import_biom}}, respectively. However, since the precise format of the tree is not restricted to GreenGenes trees by QIIME or for the biom-format, this function is not called automatically by those aforementioned import functions. If your tree is formatted like, or is one of, the official GreenGenes release trees, then you should use this function and provide its output to your relevant import function. } \examples{ # Read the May 2013, 73\% similarity official tree, # included as extra data in phyloseq. treefile = system.file("extdata", "gg13-5-73.tree.gz", package="phyloseq") x = read_tree_greengenes(treefile) x class(x) y = read_tree(treefile) y class(y) ## Not run, causes an error: # library("ape") # read.tree(treefile) } phyloseq/man/reconcile_categories.Rd0000644000175400017540000000234213177706002020662 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/sampleData-class.R \name{reconcile_categories} \alias{reconcile_categories} \title{Cleans absent levels in sample_data/data.frame.} \usage{ reconcile_categories(DFSM) } \arguments{ \item{DFSM}{(Required). A \code{data.frame} or \code{sample_data} object that needs to be cleaned.} } \value{ A single \code{data.frame} object. Even if the input argument is a \code{sample_data}, the return is a \code{data.frame}. Because this is intended to be used internally by the builder method, it cannot also call the builder function to re-build the cleaned \code{sample_data}. } \description{ This is used internally by the builder method, \code{\link{sample_data}}, to ensure that the factors describing categorical variables in a data.frame or sample_data object are free of extra levels that can plague downstream plots analysis. } \examples{ # # # data(GlobalPatterns) # # # SM <- sample_data(GlobalPatterns) # # # DF <- data.frame(SM) # # # DF <- data.frame(DF, col1=1:nrow(DF), col2=paste(1:nrow(DF), "t", sep="")) # # # DF <- reconcile_categories(DF) # # # SM <- sample_data(reconcile_categories(SM)) # # # sapply(DF, class) # # # sapply(SM, class) } \keyword{internal} phyloseq/man/refseq-methods.Rd0000644000175400017540000000330113177706002017434 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/almostAllAccessors.R \docType{methods} \name{refseq} \alias{refseq} \alias{refseq,ANY-method} \alias{refseq,XStringSet-method} \title{Retrieve reference sequences (\code{\link[Biostrings]{XStringSet}}-class) from object.} \usage{ refseq(physeq, errorIfNULL=TRUE) \S4method{refseq}{ANY}(physeq, errorIfNULL = TRUE) \S4method{refseq}{XStringSet}(physeq) } \arguments{ \item{physeq}{(Required). An instance of phyloseq-class that contains a phylogenetic tree. If physeq is a phylogenetic tree (a component data class), then it is returned as-is.} \item{errorIfNULL}{(Optional). Logical. Should the accessor stop with an error if the slot is empty (\code{NULL})? Default \code{TRUE}.} } \value{ The \code{\link[ape]{phylo}}-class object contained within \code{physeq}; or NULL if \code{physeq} does not have a tree. This method stops with an error in the latter NULL case be default, which can be over-ridden by changing the value of \code{errorIfNULL} to \code{FALSE}. } \description{ This is the suggested method for accessing the phylogenetic tree, (\code{\link[Biostrings]{XStringSet}}-class) from a phyloseq data object (\code{\link{phyloseq-class}}). Like other accessors (see See Also, below), the default behavior of this method is to stop with an error if \code{physeq} is a \code{phyloseq-class} but does not contain reference sequences (the component data type you are trying to access in this case). } \examples{ data(GlobalPatterns) refseq(GlobalPatterns, FALSE) } \seealso{ \code{\link{otu_table}}, \code{\link{sample_data}}, \code{\link{tax_table}} \code{\link{phy_tree}}, \code{\link{phyloseq}}, \code{\link{merge_phyloseq}} } phyloseq/man/rm_outlierf.Rd0000644000175400017540000000227713177706002017050 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/transform_filter-methods.R \name{rm_outlierf} \alias{rm_outlierf} \title{Set to FALSE any outlier species greater than f fractional abundance.} \usage{ rm_outlierf(f, na.rm=TRUE) } \arguments{ \item{f}{Single numeric value between 0 and 1. The maximum fractional abundance value that a taxa will be allowed to have in a sample without being marked for trimming.} \item{na.rm}{Logical. Should we remove NA values. Default \code{TRUE}.} } \value{ A function (enclosure), suitable for \code{\link{filterfun_sample}}. } \description{ This is for removing overly-abundant outlier taxa, not for trimming low-abundance taxa. } \examples{ t1 <- 1:10; names(t1)<-paste("t", 1:10, sep="") rm_outlierf(0.15)(t1) ## Use simulated abundance matrix set.seed(711) testOTU <- otu_table(matrix(sample(1:50, 25, replace=TRUE), 5, 5), taxa_are_rows=FALSE) taxa_sums(testOTU) f1 <- filterfun_sample(rm_outlierf(0.1)) (wh1 <- genefilter_sample(testOTU, f1, A=1)) wh2 <- c(TRUE, TRUE, TRUE, FALSE, FALSE) prune_taxa(wh1, testOTU) prune_taxa(wh2, testOTU) } \seealso{ \code{\link{topk}}, \code{\link{topf}}, \code{\link{topp}}, \code{\link{rm_outlierf}} } phyloseq/man/sample_data-class.Rd0000644000175400017540000000115213177706002020065 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/allClasses.R \docType{class} \name{sample_data-class} \alias{sample_data-class} \title{The S4 for storing sample variables.} \description{ Row indices represent samples, while column indices represent experimental categories, variables (and so forth) that describe the samples. } \details{ \describe{ \item{.Data}{data-frame data, inherited from the data.frame class.} \item{row.names}{ Also inherited from the data.frame class; it should contain the sample names. } \item{names}{Inherited from the data.frame class.} } } phyloseq/man/sample_data-methods.Rd0000644000175400017540000000344613177706002020433 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/sampleData-class.R \docType{methods} \name{sample_data} \alias{sample_data} \alias{sample_data,ANY-method} \alias{sample_data,data.frame-method} \title{Build or access sample_data.} \usage{ sample_data(object, errorIfNULL=TRUE) \S4method{sample_data}{ANY}(object, errorIfNULL = TRUE) \S4method{sample_data}{data.frame}(object) } \arguments{ \item{object}{(Required). A \code{\link{data.frame-class}}, or a \code{\link{phyloseq-class}} object.} \item{errorIfNULL}{(Optional). Logical. Should the accessor stop with an error if the slot is empty (\code{NULL})? Default \code{TRUE}.} } \value{ A \code{\link{sample_data-class}} object representing the sample variates of an experiment. } \description{ This is the suggested method for both constructing and accessing a table of sample-level variables (\code{\link{sample_data-class}}), which in the \code{\link{phyloseq-package}} is represented as a special extension of the \code{\link{data.frame-class}}. When the argument is a \code{\link{data.frame}}, \code{sample_data} will create a sample_data-class object. In this case, the rows should be named to match the \code{\link{sample_names}} of the other objects to which it will ultimately be paired. Alternatively, if the first argument is an experiment-level (\code{\link{phyloseq-class}}) object, then the corresponding \code{sample_data} is returned. Like other accessors (see See Also, below), the default behavior of this method is to stop with an error if \code{object} is a \code{phyloseq-class} but does not contain a \code{sample_data}. } \examples{ # data(soilrep) head(sample_data(soilrep)) } \seealso{ \code{\link{phy_tree}}, \code{\link{tax_table}}, \code{\link{otu_table}} \code{\link{phyloseq}}, \code{\link{merge_phyloseq}} } phyloseq/man/sample_names-methods.Rd0000644000175400017540000000157013177706002020621 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/almostAllAccessors.R \docType{methods} \name{sample_names} \alias{sample_names} \alias{sample_names,ANY-method} \alias{sample_names,phyloseq-method} \alias{sample_names,sample_data-method} \alias{sample_names,otu_table-method} \title{Get sample names.} \usage{ sample_names(physeq) \S4method{sample_names}{ANY}(physeq) \S4method{sample_names}{phyloseq}(physeq) \S4method{sample_names}{sample_data}(physeq) \S4method{sample_names}{otu_table}(physeq) } \arguments{ \item{physeq}{(Required). A \code{\link{phyloseq-class}}, \code{\link{sample_data}}, or \code{\link{otu_table-class}}.} } \value{ A character vector. The names of the samples in \code{physeq}. } \description{ Get sample names. } \examples{ data(esophagus) sample_names(esophagus) } \seealso{ \code{\link{taxa_names}}, \code{\link{nsamples}} } phyloseq/man/sample_sums.Rd0000644000175400017540000000153213177706002017042 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/otuTable-class.R \name{sample_sums} \alias{sample_sums} \title{Returns the total number of individuals observed from each sample.} \usage{ sample_sums(x) } \arguments{ \item{x}{\code{\link{otu_table-class}}, or \code{\link{phyloseq-class}}.} } \value{ A named \code{\link{numeric-class}} length equal to the number of samples in the \code{x}, name indicating the sample ID, and value equal to the sum of all individuals observed for each sample in \code{x}. } \description{ A convenience function equivalent to rowSums or colSums, but where the orientation of the otu_table is automatically handled. } \examples{ data(enterotype) sample_sums(enterotype) data(esophagus) sample_sums(esophagus) } \seealso{ \code{\link{taxa_sums}}, \code{\link{rowSums}}, \code{\link{colSums}} } phyloseq/man/sample_variables.Rd0000644000175400017540000000177713177706002020036 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/almostAllAccessors.R \name{sample_variables} \alias{sample_variables} \title{Get the sample variables present in sample_data} \usage{ sample_variables(physeq, errorIfNULL=TRUE) } \arguments{ \item{physeq}{(Required). \code{\link{sample_data-class}}, or \code{\link{phyloseq-class}}.} \item{errorIfNULL}{(Optional). Logical. Should the accessor stop with an error if the slot is empty (\code{NULL})? Default \code{TRUE}.} } \value{ Character vector. The names of the variables in the sample_data data.frame. Essentially the column names. Useful for selecting model and graphics parameters that interact with sample_data. } \description{ This is a simple accessor function to make it more convenient to determine the sample variable names of a particular \code{\link{phyloseq-class}} object. } \examples{ data(enterotype) sample_variables(enterotype) } \seealso{ \code{\link{get_taxa}} \code{\link{taxa_names}} \code{\link{sample_names}} } phyloseq/man/show-methods.Rd0000644000175400017540000000135013177706002017131 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/show-methods.R \docType{methods} \name{show,otu_table-method} \alias{show,otu_table-method} \alias{show,sample_data-method} \alias{show,taxonomyTable-method} \alias{show,phyloseq-method} \title{method extensions to show for phyloseq objects.} \usage{ \S4method{show}{otu_table}(object) \S4method{show}{sample_data}(object) \S4method{show}{taxonomyTable}(object) \S4method{show}{phyloseq}(object) } \arguments{ \item{object}{Any R object} } \description{ See the general documentation of \code{\link[methods]{show}} method for expected behavior. } \examples{ # data(GlobalPatterns) # show(GlobalPatterns) # GlobalPatterns } \seealso{ \code{\link[methods]{show}} } phyloseq/man/show_mothur_cutoffs.Rd0000644000175400017540000000210713177706002020620 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/IO-methods.R \name{show_mothur_cutoffs} \alias{show_mothur_cutoffs} \title{Show cutoff values available in a mothur file.} \usage{ show_mothur_cutoffs(mothur_list_file) } \arguments{ \item{mothur_list_file}{The file name and/or location as produced by \emph{mothur}.} } \value{ A character vector of the different cutoff values contained in the file. For a given set of arguments to the \code{cluster()} command from within \emph{mothur}, a number of OTU-clustering results are returned in the same file. The exact cutoff values used by \emph{mothur} can vary depending on the input data/parameters. This simple function returns the cutoffs that were actually included in the \emph{mothur} output. This an important extra step prior to importing data with the \code{\link{import_mothur}} function. } \description{ This is a helper function to report back to the user the different cutoff values available in a given mothur file -- for instance, a list or shared file. } \seealso{ \code{\link{import_mothur}} } phyloseq/man/splat.phyloseq.objects.Rd0000644000175400017540000000251313177706002021130 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/phyloseq-class.R \name{splat.phyloseq.objects} \alias{splat.phyloseq.objects} \title{Convert \code{\link{phyloseq-class}} into a named list of its non-empty components.} \usage{ splat.phyloseq.objects(x) } \arguments{ \item{x}{A \code{\link{phyloseq-class}} object. Alternatively, a component data object will work, resulting in named list of length 1.} } \value{ A named list, where each element is a component object that was contained in the argument, \code{x}. Each element is named according to its slot-name in the phyloseq-object from which it is derived. If \code{x} is already a component data object, then a list of length (1) is returned, also named. } \description{ This is used in internal handling functions, and one of its key features is that the names in the returned-list match the slot-names, which is useful for constructing calls with language-computing functions like \code{\link{do.call}}. Another useful aspect is that it only returns the contents of non-empty slots. In general, this should only be used by phyloseq-package developers. Standard users should not need or use this function, and should use the accessors and other tools that leave the multi-component object in one piece. } \examples{ # } \seealso{ merge_phyloseq } \keyword{internal} phyloseq/man/subset_ord_plot.Rd0000644000175400017540000000515213177706002017723 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plot-methods.R \name{subset_ord_plot} \alias{subset_ord_plot} \title{Subset points from an ordination-derived ggplot} \usage{ subset_ord_plot(p, threshold=0.05, method="farthest") } \arguments{ \item{p}{(Required). A \code{\link{ggplot}} object created by \code{\link{plot_ordination}}. It contains the complete data that you want to subset.} \item{threshold}{(Optional). A numeric scalar. Default is \code{0.05}. This value determines a coordinate threshold or population threshold, depending on the value of the \code{method} argument, ultimately determining which points are included in returned \code{data.frame}.} \item{method}{(Optional). A character string. One of \code{c("farthest", "radial", "square")}. Default is \code{"farthest"}. This determines how threshold will be interpreted. \describe{ \item{farthest}{ Unlike the other two options, this option implies removing a certain fraction or number of points from the plot, depending on the value of \code{threshold}. If \code{threshold} is greater than or equal to \code{1}, then all but \code{threshold} number of points farthest from the origin are removed. Otherwise, if \code{threshold} is less than \code{1}, all but \code{threshold} fraction of points farthests from origin are retained. } \item{radial}{ Keep only those points that are beyond \code{threshold} radial distance from the origin. Has the effect of removing a circle of points from the plot, centered at the origin. } \item{square}{ Keep only those points with at least one coordinate greater than \code{threshold}. Has the effect of removing a ``square'' of points from the plot, centered at the origin. } }} } \value{ A \code{\link{data.frame}} suitable for creating a \code{\link{ggplot}} plot object, graphically summarizing the ordination result according to previously-specified parameters. } \description{ Easily retrieve a plot-derived \code{data.frame} with a subset of points according to a threshold and method. The meaning of the threshold depends upon the method. See argument description below. There are many useful examples of phyloseq ordination graphics in the \href{http://joey711.github.io/phyloseq/subset_ord_plot-examples}{phyloseq online tutorials}. } \examples{ ## See the online tutorials. ## http://joey711.github.io/phyloseq/subset_ord_plot-examples } \seealso{ \href{http://joey711.github.io/phyloseq/subset_ord_plot-examples}{phyloseq online tutorial} for this function. \code{\link{plot_ordination}} } phyloseq/man/subset_samples-methods.Rd0000644000175400017540000000310013177706002021175 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/sampleData-class.R \docType{methods} \name{subset_samples} \alias{subset_samples} \title{Subset samples by sample_data expression} \usage{ subset_samples(physeq, ...) } \arguments{ \item{physeq}{A \code{\link{sample_data-class}}, or a \code{\link{phyloseq-class}} object with a \code{sample_data}. If the \code{sample_data} slot is missing in \code{physeq}, then \code{physeq} will be returned as-is, and a warning will be printed to screen.} \item{...}{The subsetting expression that should be applied to the \code{sample_data}. This is passed on to \code{\link{subset}}, see its documentation for more details.} } \value{ A subsetted object with the same class as \code{physeq}. } \description{ This is a convenience wrapper around the \code{\link{subset}} function. It is intended to allow subsetting complex experimental objects with one function call. Subsetting is based on an expression for which the context first includes the variables contained in \code{\link{sample_data}}. The \code{samples} retained in the dataset is equivalent to \code{x[subset & !is.na(subset)]}, where \code{x} is the vector of sample IDs and \code{subset} is the logical that results from your subsetting expression. This is important to keep in mind, as users are often unaware that this subsetting step also removes/omits samples that have a missing value, \code{NA}, somewhere in the expression. } \examples{ # data(GlobalPatterns) # subset_samples(GlobalPatterns, SampleType=="Ocean") } \seealso{ \code{\link{subset_species}} } phyloseq/man/subset_taxa-methods.Rd0000644000175400017540000000323113177706002020473 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/taxonomyTable-class.R \docType{methods} \name{subset_taxa} \alias{subset_taxa} \title{Subset species by taxonomic expression} \usage{ subset_taxa(physeq, ...) } \arguments{ \item{physeq}{A \code{\link{taxonomyTable-class}}, or \code{\link{phyloseq-class}} that contains a taxonomyTable. If the \code{tax_table} slot is missing in \code{physeq}, then \code{physeq} will be returned as-is and a warning will be printed to screen.} \item{...}{The subsetting expression that should be applied to the \code{taxonomyTable}. This is passed on to \code{\link{subset}}, and more details and examples about how it functions can be found in its documentation.} } \value{ A subsetted object with the same class as \code{physeq}. } \description{ This is a convenience wrapper around the \code{\link{subset}} function. It is intended to speed subsetting complex experimental objects with one function call. In the case of \code{subset_taxa}, the subsetting will be based on an expression related to the columns and values within the \code{tax_table} (\code{taxonomyTable} component) slot of \code{physeq}. The \code{OTUs} retained in the dataset is equivalent to \code{x[subset & !is.na(subset)]}, where \code{x} is the vector of OTU IDs and \code{subset} is the logical that results from your subsetting expression. This is important to keep in mind, as users are often unaware that this subsetting step also removes/omits OTUs that have a missing value result, \code{NA}, somewhere in the expression. } \examples{ ## ex3 <- subset_taxa(GlobalPatterns, Phylum=="Bacteroidetes") } \seealso{ \code{\link{subset_samples}} } phyloseq/man/tax_glom.Rd0000644000175400017540000000615413177706002016331 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/transform_filter-methods.R \name{tax_glom} \alias{tax_glom} \title{Agglomerate taxa of the same type.} \usage{ tax_glom(physeq, taxrank=rank_names(physeq)[1], NArm=TRUE, bad_empty=c(NA, "", " ", "\t")) } \arguments{ \item{physeq}{(Required). \code{\link{phyloseq-class}} or \code{\link{otu_table}}.} \item{taxrank}{A character string specifying the taxonomic level that you want to agglomerate over. Should be among the results of \code{rank_names(physeq)}. The default value is \code{rank_names(physeq)[1]}, which may agglomerate too broadly for a given experiment. You are strongly encouraged to try different values for this argument.} \item{NArm}{(Optional). Logical, length equal to one. Default is \code{TRUE}. CAUTION. The decision to prune (or not) taxa for which you lack categorical data could have a large effect on downstream analysis. You may want to re-compute your analysis under both conditions, or at least think carefully about what the effect might be and the reasons explaining the absence of information for certain taxa. In the case of taxonomy, it is often a result of imprecision in taxonomic designation based on short phylogenetic sequences and a patchy system of nomenclature. If this seems to be an issue for your analysis, think about also trying the nomenclature-agnostic \code{\link{tip_glom}} method if you have a phylogenetic tree available.} \item{bad_empty}{(Optional). Character vector. Default: \code{c(NA, "", " ", "\t")}. Defines the bad/empty values that should be ignored and/or considered unknown. They will be removed from the internal agglomeration vector derived from the argument to \code{tax}, and therefore agglomeration will not combine taxa according to the presence of these values in \code{tax}. Furthermore, the corresponding taxa can be optionally pruned from the output if \code{NArm} is set to \code{TRUE}.} } \value{ A taxonomically-agglomerated, optionally-pruned, object with class matching the class of \code{physeq}. } \description{ This method merges species that have the same taxonomy at a certain taxaonomic rank. Its approach is analogous to \code{\link{tip_glom}}, but uses categorical data instead of a tree. In principal, other categorical data known for all taxa could also be used in place of taxonomy, but for the moment, this must be stored in the \code{taxonomyTable} of the data. Also, columns/ranks to the right of the rank chosen to use for agglomeration will be replaced with \code{NA}, because they should be meaningless following agglomeration. } \examples{ # data(GlobalPatterns) # ## print the available taxonomic ranks # colnames(tax_table(GlobalPatterns)) # ## agglomerate at the Family taxonomic rank # (x1 <- tax_glom(GlobalPatterns, taxrank="Family") ) # ## How many taxa before/after agglomeration? # ntaxa(GlobalPatterns); ntaxa(x1) # ## Look at enterotype dataset... # data(enterotype) # ## print the available taxonomic ranks. Shows only 1 rank available, not useful for tax_glom # colnames(tax_table(enterotype)) } \seealso{ \code{\link{tip_glom}} \code{\link{prune_taxa}} \code{\link{merge_taxa}} } phyloseq/man/tax_table-methods.Rd0000644000175400017540000000375113177706002020123 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/taxonomyTable-class.R \docType{methods} \name{tax_table} \alias{tax_table} \alias{tax_table,ANY-method} \alias{tax_table,matrix-method} \alias{tax_table,data.frame-method} \title{Build or access the taxonomyTable.} \usage{ tax_table(object, errorIfNULL=TRUE) \S4method{tax_table}{ANY}(object, errorIfNULL = TRUE) \S4method{tax_table}{matrix}(object) \S4method{tax_table}{data.frame}(object) } \arguments{ \item{object}{An object among the set of classes defined by the phyloseq package that contain taxonomyTable.} \item{errorIfNULL}{(Optional). Logical. Should the accessor stop with an error if the slot is empty (\code{NULL})? Default \code{TRUE}.} } \value{ A \code{\link{taxonomyTable-class}} object. It is either grabbed from the relevant slot if \code{object} is complex, or built anew if \code{object} is a character matrix representing the taxonomic classification of species in the experiment. } \description{ This is the suggested method for both constructing and accessing a table of taxonomic names, organized with ranks as columns (\code{\link{taxonomyTable-class}}). When the argument is a character matrix, tax_table() will create and return a \code{\link{taxonomyTable-class}} object. In this case, the rows should be named to match the \code{species.names} of the other objects to which it will ultimately be paired. Alternatively, if the first argument is an experiment-level (\code{\link{phyloseq-class}}) object, then the corresponding \code{taxonomyTable} is returned. Like other accessors (see See Also, below), the default behavior of this method is to stop with an error if \code{object} is a \code{phyloseq-class} but does not contain a \code{taxonomyTable}. } \examples{ # # tax1 <- tax_table(matrix("abc", 30, 8)) # data(GlobalPatterns) # tax_table(GlobalPatterns) } \seealso{ \code{\link{phy_tree}}, \code{\link{sample_data}}, \code{\link{otu_table}} \code{\link{phyloseq}}, \code{\link{merge_phyloseq}} } phyloseq/man/taxa_are_rows-methods.Rd0000644000175400017540000000137013177706002021011 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/almostAllAccessors.R \docType{methods} \name{taxa_are_rows} \alias{taxa_are_rows} \alias{taxa_are_rows,ANY-method} \alias{taxa_are_rows,otu_table-method} \alias{taxa_are_rows,phyloseq-method} \title{Access taxa_are_rows slot from otu_table objects.} \usage{ taxa_are_rows(physeq) \S4method{taxa_are_rows}{ANY}(physeq) \S4method{taxa_are_rows}{otu_table}(physeq) \S4method{taxa_are_rows}{phyloseq}(physeq) } \arguments{ \item{physeq}{(Required). \code{\link{phyloseq-class}}, or \code{\link{otu_table-class}}.} } \value{ A logical indicating the orientation of the otu_table. } \description{ Access taxa_are_rows slot from otu_table objects. } \seealso{ \code{\link{otu_table}} } phyloseq/man/taxa_names-methods.Rd0000644000175400017540000000230313177706002020270 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/almostAllAccessors.R \docType{methods} \name{taxa_names} \alias{taxa_names} \alias{taxa_names,ANY-method} \alias{taxa_names,phyloseq-method} \alias{taxa_names,otu_table-method} \alias{taxa_names,taxonomyTable-method} \alias{taxa_names,sample_data-method} \alias{taxa_names,phylo-method} \alias{taxa_names,XStringSet-method} \title{Get species / taxa names.} \usage{ taxa_names(physeq) \S4method{taxa_names}{ANY}(physeq) \S4method{taxa_names}{phyloseq}(physeq) \S4method{taxa_names}{otu_table}(physeq) \S4method{taxa_names}{taxonomyTable}(physeq) \S4method{taxa_names}{sample_data}(physeq) \S4method{taxa_names}{phylo}(physeq) \S4method{taxa_names}{XStringSet}(physeq) } \arguments{ \item{physeq}{\code{\link{phyloseq-class}}, \code{\link{otu_table-class}}, \code{\link{taxonomyTable-class}}, or \code{\link[ape]{phylo}}} } \value{ A character vector of the names of the species in \code{physeq}. } \description{ Get species / taxa names. } \examples{ # data("esophagus") tree <- phy_tree(esophagus) OTU1 <- otu_table(esophagus) taxa_names(tree) taxa_names(OTU1) physeq1 <- phyloseq(OTU1, tree) taxa_names(physeq1) } \seealso{ ntaxa } phyloseq/man/taxa_sums.Rd0000644000175400017540000000152213177706002016515 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/otuTable-class.R \name{taxa_sums} \alias{taxa_sums} \title{Returns the total number of individuals observed from each species/taxa/OTU.} \usage{ taxa_sums(x) } \arguments{ \item{x}{\code{\link{otu_table-class}}, or \code{\link{phyloseq-class}}.} } \value{ A \code{\link{numeric-class}} with length equal to the number of species in the table, name indicated the taxa ID, and value equal to the sum of all individuals observed for each taxa in \code{x}. } \description{ A convenience function equivalent to rowSums or colSums, but where the orientation of the otu_table is automatically handled. } \examples{ data(enterotype) taxa_sums(enterotype) data(esophagus) taxa_sums(esophagus) } \seealso{ \code{\link{sample_sums}}, \code{\link{rowSums}}, \code{\link{colSums}} } phyloseq/man/taxonomyTable-class.Rd0000644000175400017540000000066113177706002020445 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/allClasses.R \docType{class} \name{taxonomyTable-class} \alias{taxonomyTable-class} \title{An S4 class that holds taxonomic classification data as a character matrix.} \description{ Row indices represent taxa, columns represent taxonomic classifiers. } \details{ \describe{ \item{.Data}{This slot is inherited from the \code{\link{matrix}} class.} } } phyloseq/man/threshrank.Rd0000644000175400017540000000260613177706002016666 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/transform_filter-methods.R \name{threshrank} \alias{threshrank} \title{Thresholded rank transformation.} \usage{ threshrank(x, thresh, keep0s=FALSE, ...) } \arguments{ \item{x}{(Required). Numeric vector to transform.} \item{thresh}{A single numeric value giving the threshold.} \item{keep0s}{A logical determining whether 0's in \code{x} should remain a zero-value in the output. If FALSE, zeros are treated as any other value.} \item{...}{Further arguments passes to the \code{\link{rank}} function.} } \value{ A ranked, (optionally) thresholded numeric vector with length equal to \code{x}. Default arguments to \code{rank} are used, unless provided as additional arguments. } \description{ The lowest \code{thresh} values in \code{x} all get the value 'thresh'. } \examples{ # (a_vector <- sample(0:10, 100, TRUE)) threshrank(a_vector, 5, keep0s=TRUE) data(GlobalPatterns) GP <- GlobalPatterns ## These three approaches result in identical otu_table (x1 <- transform_sample_counts( otu_table(GP), threshrankfun(500)) ) (x2 <- otu_table(apply(otu_table(GP), 2, threshrankfun(500)), taxa_are_rows(GP)) ) identical(x1, x2) (x3 <- otu_table(apply(otu_table(GP), 2, threshrank, thresh=500), taxa_are_rows(GP)) ) identical(x1, x3) } \seealso{ \code{\link{transform_sample_counts}}, \code{\link{rank}}, \code{\link{threshrankfun}} } phyloseq/man/threshrankfun.Rd0000644000175400017540000000234413177706002017376 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/transform_filter-methods.R \name{threshrankfun} \alias{threshrankfun} \title{A closure version of the \code{threshrank} function.} \usage{ threshrankfun(thresh, keep0s=FALSE, ...) } \arguments{ \item{thresh}{A single numeric value giving the threshold.} \item{keep0s}{A logical determining whether 0's in \code{x} should remain a zero-value in the output. If FALSE, zeros are treated as any other value.} \item{...}{Further arguments passes to the \code{\link{rank}} function.} } \value{ A single-argument function with the options to \code{\link{threshrank}} set. } \description{ Takes the same arguments as \code{\link{threshrank}}, except for \code{x}, because the output is a single-argument function rather than a rank-transformed numeric. This is useful for higher-order functions that require a single-argument function as input, like \code{\link{transform_sample_counts}}. } \examples{ data(esophagus) x1 = transform_sample_counts(esophagus, threshrankfun(50)) otu_table(x1) x2 = transform_sample_counts(esophagus, rank) otu_table(x2) identical(x1, x2) } \seealso{ \code{\link{transform_sample_counts}}, \code{\link{threshrankfun}}, \code{\link{threshrank}} } phyloseq/man/tip_glom.Rd0000644000175400017540000000467313177706002016335 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/transform_filter-methods.R \name{tip_glom} \alias{tip_glom} \title{Agglomerate closely-related taxa using single-linkage clustering.} \usage{ tip_glom(physeq, h = 0.2, hcfun = agnes, ...) } \arguments{ \item{physeq}{(Required). A \code{\link{phyloseq-class}}, containing a phylogenetic tree. Alternatively, a phylogenetic tree \code{\link[ape]{phylo}} will also work.} \item{h}{(Optional). Numeric scalar of the height where the tree should be cut. This refers to the tree resulting from hierarchical clustering of \code{\link[ape]{cophenetic.phylo}(phy_tree(physeq))}, not necessarily the original phylogenetic tree, \code{phy_tree(physeq)}. Default value is \code{0.2}. Note that this argument used to be named \code{speciationMinLength}, before this function/method was rewritten.} \item{hcfun}{(Optional). A function. The (agglomerative, hierarchical) clustering function to use. Good examples are \code{\link[cluster]{agnes}} and \code{\link[stats]{hclust}}. The default is \code{\link[cluster]{agnes}}.} \item{...}{(Optional). Additional named arguments to pass to \code{hcfun}.} } \value{ An instance of the \code{\link{phyloseq-class}}. Or alternatively, a \code{\link{phylo}} object if the \code{physeq} argument was just a tree. In the expected-use case, the number of OTUs will be fewer (see \code{\link{ntaxa}}), after merging OTUs that are related enough to be called the same OTU. } \description{ All tips of the tree separated by a cophenetic distance smaller than \code{h} will be agglomerated into one taxa using \code{\link{merge_taxa}}. } \details{ Can be used to create a non-trivial OTU Table, if a phylogenetic tree is available. For now, a simple, ``greedy'', single-linkage clustering is used. In future releases it should be possible to specify different clustering approaches available in \code{R}, in particular, complete-linkage clustering appears to be used more commonly for OTU clustering applications. } \examples{ data("esophagus") # for speed esophagus = prune_taxa(taxa_names(esophagus)[1:25], esophagus) plot_tree(esophagus, label.tips="taxa_names", size="abundance", title="Before tip_glom()") plot_tree(tip_glom(esophagus, h=0.2), label.tips="taxa_names", size="abundance", title="After tip_glom()") } \seealso{ \code{\link{merge_taxa}} \code{\link[cluster]{agnes}} \code{\link[stats]{hclust}} \code{\link[ape]{cophenetic.phylo}} \code{\link[ape]{phylo}} } phyloseq/man/topf.Rd0000644000175400017540000000252613177706002015466 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/transform_filter-methods.R \name{topf} \alias{topf} \title{Make filter fun. that returns the top f fraction of taxa in a sample.} \usage{ topf(f, na.rm=TRUE) } \arguments{ \item{f}{Single numeric value between 0 and 1.} \item{na.rm}{Logical. Should we remove NA values. Default \code{TRUE}.} } \value{ A function (enclosure), suitable for \code{\link{filterfun_sample}}, that will return \code{TRUE} for each element in the taxa comprising the most abundant f fraction of individuals. } \description{ As opposed to \code{\link{topp}}, which gives the most abundant p fraction of observed taxa (richness, instead of cumulative abundance. Said another way, topf ensures a certain fraction of the total sequences are retained, while topp ensures that a certain fraction of taxa/species/OTUs are retained. } \examples{ t1 <- 1:10; names(t1)<-paste("t", 1:10, sep="") topf(0.6)(t1) ## Use simulated abundance matrix set.seed(711) testOTU <- otu_table(matrix(sample(1:50, 25, replace=TRUE), 5, 5), taxa_are_rows=FALSE) f1 <- filterfun_sample(topf(0.4)) (wh1 <- genefilter_sample(testOTU, f1, A=1)) wh2 <- c(TRUE, TRUE, TRUE, FALSE, FALSE) prune_taxa(wh1, testOTU) prune_taxa(wh2, testOTU) } \seealso{ \code{\link{topk}}, \code{\link{topf}}, \code{\link{topp}}, \code{\link{rm_outlierf}} } phyloseq/man/topk.Rd0000644000175400017540000000173313177706002015472 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/transform_filter-methods.R \name{topk} \alias{topk} \title{Make filter fun. the most abundant \code{k} taxa} \usage{ topk(k, na.rm=TRUE) } \arguments{ \item{k}{An integer, indicating how many of the most abundant taxa should be kept.} \item{na.rm}{A logical. Should \code{NA}s be removed. Default is \code{TRUE}.} } \value{ Returns a function (enclosure) that will return TRUE for each element in the most abundant k values. } \description{ Make filter fun. the most abundant \code{k} taxa } \examples{ ## Use simulated abundance matrix set.seed(711) testOTU <- otu_table(matrix(sample(1:50, 25, replace=TRUE), 5, 5), taxa_are_rows=FALSE) f1 <- filterfun_sample(topk(2)) wh1 <- genefilter_sample(testOTU, f1, A=2) wh2 <- c(TRUE, TRUE, TRUE, FALSE, FALSE) prune_taxa(wh1, testOTU) prune_taxa(wh2, testOTU) } \seealso{ \code{\link{topk}}, \code{\link{topf}}, \code{\link{topp}}, \code{\link{rm_outlierf}} } phyloseq/man/topp.Rd0000644000175400017540000000215613177706002015477 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/transform_filter-methods.R \name{topp} \alias{topp} \title{Make filter fun. that returns the most abundant \code{p} fraction of taxa} \usage{ topp(p, na.rm=TRUE) } \arguments{ \item{p}{A numeric of length 1, indicating what fraction of the most abundant taxa should be kept.} \item{na.rm}{A logical. Should \code{NA}s be removed. Default is \code{TRUE}.} } \value{ A function (enclosure), suitable for \code{\link{filterfun_sample}}, that will return \code{TRUE} for each element in the most abundant p fraction of taxa. } \description{ Make filter fun. that returns the most abundant \code{p} fraction of taxa } \examples{ ## Use simulated abundance matrix set.seed(711) testOTU <- otu_table(matrix(sample(1:50, 25, replace=TRUE), 5, 5), taxa_are_rows=FALSE) sample_sums(testOTU) f1 <- filterfun_sample(topp(0.2)) (wh1 <- genefilter_sample(testOTU, f1, A=1)) wh2 <- c(TRUE, TRUE, TRUE, FALSE, FALSE) prune_taxa(wh1, testOTU) prune_taxa(wh2, testOTU) } \seealso{ \code{\link{topk}}, \code{\link{topf}}, \code{\link{topp}}, \code{\link{rm_outlierf}} } phyloseq/man/transformcounts.Rd0000644000175400017540000000360113177706002017760 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/transform_filter-methods.R \docType{methods} \name{transform_sample_counts} \alias{transform_sample_counts} \alias{transformSampleCounts} \alias{transformSampleCounts} \title{Transform abundance data in an \code{otu_table}, sample-by-sample.} \usage{ transform_sample_counts(physeq, fun, ...) transformSampleCounts(physeq, fun, ...) } \arguments{ \item{physeq}{(Required). \code{\link{phyloseq-class}} of \code{\link{otu_table-class}}.} \item{fun}{(Required). A single-argument function that will be applied to the abundance counts of each sample. Can be an anonymous \code{\link[base]{function}}.} \item{...}{(Optional). Additional, optionally-named, arguments passed to \code{fun} during transformation of abundance data.} } \value{ A transformed \code{otu_table} -- or \code{phyloseq} object with its transformed \code{otu_table}. In general, trimming is not expected by this method, so it is suggested that the user provide only functions that return a full-length vector. Filtering/trimming can follow, for which the \code{\link{genefilter_sample}} and \code{\link{prune_taxa}} functions are suggested. } \description{ This function transforms the sample counts of a taxa abundance matrix according to a user-provided function. The counts of each sample will be transformed individually. No sample-sample interaction/comparison is possible by this method. } \examples{ # data(esophagus) x1 = transform_sample_counts(esophagus, threshrankfun(50)) head(otu_table(x1), 10) x2 = transform_sample_counts(esophagus, rank) head(otu_table(x2), 10) identical(x1, x2) x3 = otu_table(esophagus) + 5 x3 = transform_sample_counts(x3, log) head(otu_table(x3), 10) x4 = transform_sample_counts(esophagus, function(x) round(x^2.2, 0)) head(otu_table(x4), 10) } \seealso{ \code{\link{threshrankfun}}, \code{\link{rank}}, \code{\link{log}} } phyloseq/man/transpose-methods.Rd0000644000175400017540000000140513177706002020170 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/transform_filter-methods.R \docType{methods} \name{t} \alias{t} \alias{t,otu_table-method} \alias{t,phyloseq-method} \title{Transpose \code{\link{otu_table-class}} or \code{\link{phyloseq-class}}} \usage{ t(x) \S4method{t}{otu_table}(x) \S4method{t}{phyloseq}(x) } \arguments{ \item{x}{An \code{otu_table} or \code{\link{phyloseq-class}}.} } \value{ The class of the object returned by \code{t} matches the class of the argument, \code{x}. The \code{otu_table} is transposed, and \code{\link{taxa_are_rows}} value is toggled. } \description{ Extends the base transpose method, \code{\link[base]{t}}. } \examples{ data(GlobalPatterns) otu_table(GlobalPatterns) t( otu_table(GlobalPatterns) ) } phyloseq/man/tree_layout.Rd0000644000175400017540000000536413177706002017055 0ustar00biocbuildbiocbuild% Generated by roxygen2: do not edit by hand % Please edit documentation in R/plot-methods.R \name{tree_layout} \alias{tree_layout} \title{Returns a data table defining the line segments of a phylogenetic tree.} \usage{ tree_layout(phy, ladderize = FALSE) } \arguments{ \item{phy}{(Required). The \code{\link{phylo}} or \code{\link{phyloseq-class}} object (which must contain a \code{\link{phylo}}genetic tree) that you want to converted to \code{\link{data.table}}s suitable for plotting with \code{\link[ggplot2]{ggplot}}2.} \item{ladderize}{(Optional). Boolean or character string (either \code{FALSE}, \code{TRUE}, or \code{"left"}). Default is \code{FALSE} (no ladderization). This parameter specifies whether or not to \code{\link[ape]{ladderize}} the tree (i.e., reorder nodes according to the depth of their enclosed subtrees) prior to plotting. This tends to make trees more aesthetically pleasing and legible in a graphical display. When \code{TRUE} or \code{"right"}, ``right'' ladderization is used. When set to \code{FALSE}, no ladderization is applied. When set to \code{"left"}, the reverse direction (``left'' ladderization) is applied.} } \value{ A list of two \code{\link{data.table}}s, containing respectively a \code{data.table} of edge segment coordinates, named \code{edgeDT}, and a \code{data.table} of vertical connecting segments, named \code{vertDT}. See \code{example} below for a simple demonstration. } \description{ This function takes a \code{\link{phylo}} or \code{\link{phyloseq-class}} object and returns a list of two \code{\link{data.table}}s suitable for plotting a phylogenetic tree with \code{\link[ggplot2]{ggplot}}2. } \examples{ library("ggplot2") data("esophagus") phy = phy_tree(esophagus) phy <- ape::root(phy, "65_2_5", resolve.root=TRUE) treeSegs0 = tree_layout(phy) treeSegs1 = tree_layout(esophagus) edgeMap = aes(x=xleft, xend=xright, y=y, yend=y) vertMap = aes(x=x, xend=x, y=vmin, yend=vmax) p0 = ggplot(treeSegs0$edgeDT, edgeMap) + geom_segment() + geom_segment(vertMap, data=treeSegs0$vertDT) p1 = ggplot(treeSegs1$edgeDT, edgeMap) + geom_segment() + geom_segment(vertMap, data=treeSegs1$vertDT) print(p0) print(p1) plot_tree(esophagus, "treeonly") plot_tree(esophagus, "treeonly", ladderize="left") } \seealso{ An early example of this functionality was borrowed directly, with permission, from the package called \code{ggphylo}, released on GitHub at: \url{https://github.com/gjuggler/ggphylo} by its author Gregory Jordan \email{gjuggler@gmail.com}. That original phyloseq internal function, \code{tree.layout}, has been completely replaced by this smaller and much faster user-accessible function that utilizes performance enhancements from standard \code{\link{data.table}} magic as well as \code{\link{ape-package}} internal C code. } phyloseq/tests/0000755000175400017540000000000013175714136014616 5ustar00biocbuildbiocbuildphyloseq/tests/testthat/0000755000175400017540000000000013177706002016451 5ustar00biocbuildbiocbuildphyloseq/tests/testthat-phyloseq.R0000644000175400017540000000172413175714136020447 0ustar00biocbuildbiocbuildlibrary("testthat") packageVersion("phyloseq") # As suggested for opt-out option on testing by users, recommended by CRAN # http://adv-r.had.co.nz/Testing.html # Previously, best practice was to put all test files in inst/tests and ensure that R CMD check ran them by putting the following code in tests/test-all.R: # library(testthat) # library(yourpackage) # test_package("yourpackage") # Now, recommended practice is to put your tests in tests/testthat, and ensure R CMD check runs them by putting the following code in tests/test-all.R: # library(testthat) # test_check("yourpackage") # The advantage of this new structure is that the user has control over whether or not tests are installed using the –install-tests parameter to R CMD install, or INSTALL_opts = c(“–install-tests”) argument to install.packages(). I’m not sure why you wouldn’t want to install the tests, but now you have the flexibility as requested by CRAN maintainers. test_check("phyloseq") phyloseq/tests/testthat/test-IO.R0000644000175400017540000004412313177706002020064 0ustar00biocbuildbiocbuild################################################################################ # Use testthat to test file import and resulting class (and values) ################################################################################ library("phyloseq"); library("testthat") # # # # TESTS! ################################################################################ # import_mothur tests mothlist <- system.file("extdata", "esophagus.fn.list.gz", package="phyloseq") mothgroup <- system.file("extdata", "esophagus.good.groups.gz", package="phyloseq") mothtree <- system.file("extdata", "esophagus.tree.gz", package="phyloseq") cutoff <- "0.10" esophman <- import_mothur(mothlist, mothgroup, mothtree, cutoff) # mothur "Shared" file, create with mothur from these example data files mothshared = system.file("extdata", "esophagus.fn.shared.gz", package="phyloseq") constaxonomy = system.file("extdata", "mothur_example.cons.taxonomy.gz", package="phyloseq") test_that("import_mothur: import of esophagus dataset from mothur files in extdata/ produces a phyloseq object", { expect_that(esophman, is_a("phyloseq")) }) test_that("import_mothur: The two phyloseq objects, example and just-imported, are identical", { data("esophagus") expect_that(esophagus, is_equivalent_to(esophman)) }) test_that("import_mothur: Test mothur file import on the (esophagus data).", { smlc <- show_mothur_cutoffs(mothlist) expect_that(smlc, is_equivalent_to(c("unique", "0.00", "0.01", "0.02", "0.03", "0.04", "0.05", "0.06", "0.07", "0.08", "0.09", "0.10"))) }) test_that("import_mothur: abundances can be manipulated mathematically", { x1 <- as(otu_table(esophman), "matrix") expect_that(2*x1-x1, is_equivalent_to(x1) ) }) test_that("import_mothur: empty stuff is NULL", { expect_that(tax_table(esophman, FALSE), is_a("NULL")) expect_that(sample_data(esophman, FALSE), is_a("NULL")) }) test_that("import_mothur: Expected classes of non-empty components", { expect_that(otu_table(esophman), is_a("otu_table")) expect_that(phy_tree(esophman), is_a("phylo")) }) test_that("import_mothur: imported files become S4 object", { expect_that(isS4(esophman), is_true()) }) test_that("import_mothur: show method output tests", { expect_output(print(esophman), "phyloseq-class experiment-level object") }) test_that("Test newer supported mothur output files, constaxonomy and shared files", { # Shared file sharedOTU = import_mothur(mothur_shared_file=mothshared, cutoff=cutoff) expect_is(sharedOTU, "otu_table") expect_equivalent(as(sharedOTU[1:5, ], "matrix")[, "B"], c(50, 37, 14, 52, 2)) expect_equivalent(as(sharedOTU[1, ], "matrix")[1, ], c(50, 19, 5)) # Constaxonomy file tax = import_mothur(mothur_constaxonomy_file=constaxonomy) expect_is(tax, "taxonomyTable") }) ################################################################################ # import_RDP tests test_that("the import_RDP_otu function can properly read gzipped-example", { # Setup data otufile <- system.file("extdata", "rformat_dist_0.03.txt.gz", package="phyloseq") ex_otu <- import_RDP_otu(otufile) # test expectations expect_output(print(head(t(ex_otu))), "OTU Table:") expect_is(ex_otu, "otu_table") expect_equal(ntaxa(ex_otu), 5276) expect_equal(nsamples(ex_otu), 14) expect_is(sample_sums(ex_otu), "numeric") }) ################################################################################ # import_qiime tests ################################################################################ otufile <- system.file("extdata", "GP_otu_table_rand_short.txt.gz", package="phyloseq") mapfile <- system.file("extdata", "master_map.txt", package="phyloseq") trefile <- system.file("extdata", "GP_tree_rand_short.newick.gz", package="phyloseq") rs_file <- system.file("extdata", "qiime500-refseq.fasta", package="phyloseq") t0 <- import_qiime(otufile, mapfile, trefile, rs_file, verbose=FALSE) test_that("Class of import result is phyloseq-class", { expect_that(t0, is_a("phyloseq")) }) test_that("Classes of components are as expected", { expect_that(otu_table(t0), is_a("otu_table")) expect_that(tax_table(t0), is_a("taxonomyTable")) expect_that(sample_data(t0), is_a("sample_data")) expect_that(phy_tree(t0), is_a("phylo")) expect_that(refseq(t0), is_a("DNAStringSet")) }) test_that("Features of the abundance data are consistent, match known values", { expect_that(sum(taxa_sums(t0)), equals(1269671L)) expect_that(sum(taxa_sums(t0)==0), equals(5L)) expect_that(sum(taxa_sums(t0)>=100), equals(183L)) expect_that(sum(taxa_sums(t0)), equals(sum(sample_sums(t0)))) expect_that(sum(sample_sums(t0) > 10000L), equals(20L)) expect_that(nsamples(t0), equals(26L)) expect_that(ntaxa(t0), equals(500L)) expect_that(length(rank_names(t0)), equals(7L)) }) test_that("Features of the taxonomy table match expected values", { expect_that(length(rank_names(t0)), equals(7L)) expect_equal(rank_names(t0), c("Kingdom", "Phylum", "Class", "Order", "Family", "Genus", "Species")) tax53 = as(tax_table(t0), "matrix")[53, ] expect_that(tax53, is_equivalent_to(c("Bacteria", "Proteobacteria", "Deltaproteobacteria", "Desulfovibrionales", "Desulfomicrobiaceae", "Desulfomicrobium", "Desulfomicrobiumorale"))) }) ################################################################################ # parse function tests - note, these are also used by import_biom test_that("Taxonomy vector parsing functions behave as expected", { chvec1 = c("Bacteria", "Proteobacteria", "Gammaproteobacteria", "Enterobacteriales", "Enterobacteriaceae", "Escherichia") chvec2 = c("k__Bacteria", "p__Proteobacteria", "c__Gammaproteobacteria", "o__Enterobacteriales", "f__Enterobacteriaceae", "g__Escherichia", "s__") chvec3 = c("Root", "k__Bacteria", "p__Firmicutes", "c__Bacilli", "o__Bacillales", "f__Staphylococcaceae") # Example where only some entries have greengenes prefix. chvec4 = c("Root", "k__Bacteria", "Firmicutes", "c__Bacilli", "o__Bacillales", "Staphylococcaceae", "z__mistake") # Even more terrible example, where leading or trailing space characters included # (the exact weirdnes of chvec4, compounded by leading and/or trailing space characters) chvec5 = c(" Root \n ", " k__Bacteria", " Firmicutes", " c__Bacilli ", "o__Bacillales ", "Staphylococcaceae ", "\t z__mistake \t\n") # This should give a warning because there were no greengenes prefixes expect_warning(t1 <- parse_taxonomy_greengenes(chvec1)) # And output from previous call, t1, should be identical to default expect_that(parse_taxonomy_default(chvec1), is_equivalent_to(t1)) # All the greengenes entries get trimmed by parse_taxonomy_greengenes expect_that(all(sapply(chvec2, nchar) > sapply(parse_taxonomy_greengenes(chvec2), nchar)), is_true()) # None of the greengenes entries are trimmed by parse_taxonomy_default expect_that(any(sapply(chvec2, nchar) > sapply(parse_taxonomy_default(chvec2), nchar)), is_false()) # Check that the "Root" element is not removed by parse_taxonomy_greengenes and parse_taxonomy_default. expect_that("Root" %in% chvec3, is_true()) expect_that("Root" %in% parse_taxonomy_default(chvec3), is_true()) expect_that(length(parse_taxonomy_default(chvec3)) == length(chvec3), is_true()) # Check that non-greengenes prefixes, and those w/o prefixes, are given dummy rank(s) chvec4ranks = names(parse_taxonomy_greengenes(chvec4)) expect_that(grep("Rank", chvec4ranks, fixed=TRUE), is_equivalent_to(c(1, 3, 6, 7))) # Check that everything given dummy rank in default parse. chvec4ranks = names(parse_taxonomy_default(chvec4)) expect_that(grep("Rank", chvec4ranks, fixed=TRUE), is_equivalent_to(1:7)) # chvec4 and chvec5 result in identical vectors. expect_that(parse_taxonomy_default(chvec4), is_equivalent_to(parse_taxonomy_default(chvec5))) expect_that(parse_taxonomy_greengenes(chvec4), is_equivalent_to(parse_taxonomy_greengenes(chvec5))) # The names of chvec5, greengenes parsed, should be... correct5names = c("Rank1", "Kingdom", "Rank3", "Class", "Order", "Rank6", "Rank7") expect_that(names(parse_taxonomy_greengenes(chvec5)), is_equivalent_to(correct5names)) }) ################################################################################ # import_biom tests rich_dense_biom <- system.file("extdata", "rich_dense_otu_table.biom", package="phyloseq") rich_sparse_biom <- system.file("extdata", "rich_sparse_otu_table.biom", package="phyloseq") min_dense_biom <- system.file("extdata", "min_dense_otu_table.biom", package="phyloseq") min_sparse_biom <- system.file("extdata", "min_sparse_otu_table.biom", package="phyloseq") # the tree and refseq file paths that are suitable for all biom format style examples treefilename = system.file("extdata", "biom-tree.phy", package="phyloseq") refseqfilename = system.file("extdata", "biom-refseq.fasta", package="phyloseq") test_that("Importing biom files yield phyloseq objects", { library("biomformat") rdbiom = read_biom(rich_sparse_biom) rsbiom = read_biom(rich_sparse_biom) rich_dense = import_biom(rdbiom) rich_sparse = import_biom(rsbiom) expect_that(rich_dense, is_a("phyloseq")) expect_that(rich_sparse, is_a("phyloseq")) expect_that(ntaxa(rich_dense), equals(5L)) expect_that(ntaxa(rich_sparse), equals(5L)) # # Component classes # sample_data expect_that(access(rich_dense, "sam_data"), is_a("sample_data")) expect_that(access(rich_sparse, "sam_data"), is_a("sample_data")) # taxonomyTable expect_that(access(rich_dense, "tax_table"), is_a("taxonomyTable")) expect_that(access(rich_sparse, "tax_table"), is_a("taxonomyTable")) # otu_table expect_that(access(rich_dense, "otu_table"), is_a("otu_table")) expect_that(access(rich_sparse, "otu_table"), is_a("otu_table")) }) test_that("The different types of biom files yield phyloseq objects",{ rich_dense = import_biom(rich_dense_biom, treefilename, refseqfilename, parseFunction=parse_taxonomy_greengenes) rich_sparse = import_biom(rich_sparse_biom, treefilename, refseqfilename, parseFunction=parse_taxonomy_greengenes) min_dense = import_biom(min_dense_biom, treefilename, refseqfilename, parseFunction=parse_taxonomy_greengenes) min_sparse = import_biom(min_sparse_biom, treefilename, refseqfilename, parseFunction=parse_taxonomy_greengenes) expect_that(rich_dense, is_a("phyloseq")) expect_that(rich_sparse, is_a("phyloseq")) expect_that(min_dense, is_a("phyloseq")) expect_that(min_sparse, is_a("phyloseq")) expect_that(ntaxa(rich_dense), equals(5L)) expect_that(ntaxa(rich_sparse), equals(5L)) expect_that(ntaxa(min_dense), equals(5L)) expect_that(ntaxa(min_sparse), equals(5L)) # # Component classes # sample_data expect_that(access(rich_dense, "sam_data"), is_a("sample_data")) expect_that(access(rich_sparse, "sam_data"), is_a("sample_data")) expect_that(access(min_dense, "sam_data"), is_a("NULL")) expect_that(access(min_sparse, "sam_data"), is_a("NULL")) # taxonomyTable expect_that(access(rich_dense, "tax_table"), is_a("taxonomyTable")) expect_that(access(rich_sparse, "tax_table"), is_a("taxonomyTable")) expect_that(access(min_dense, "tax_table"), is_a("NULL")) expect_that(access(min_sparse, "tax_table"), is_a("NULL")) # phylo tree expect_that(access(rich_dense, "phy_tree"), is_a("phylo")) expect_that(access(rich_sparse, "phy_tree"), is_a("phylo")) expect_that(access(min_dense, "phy_tree"), is_a("phylo")) expect_that(access(min_sparse, "phy_tree"), is_a("phylo")) # reference sequences expect_that(inherits(access(rich_dense, "refseq"), "XStringSet"), is_true()) expect_that(inherits(access(rich_sparse, "refseq"), "XStringSet"), is_true()) expect_that(inherits(access(min_dense, "refseq"), "XStringSet"), is_true()) expect_that(inherits(access(min_sparse, "refseq"), "XStringSet"), is_true()) expect_that(access(rich_dense, "refseq"), is_a("DNAStringSet")) expect_that(access(rich_sparse, "refseq"), is_a("DNAStringSet")) expect_that(access(min_dense, "refseq"), is_a("DNAStringSet")) expect_that(access(min_sparse, "refseq"), is_a("DNAStringSet")) # otu_table expect_that(access(rich_dense, "otu_table"), is_a("otu_table")) expect_that(access(rich_sparse, "otu_table"), is_a("otu_table")) expect_that(access(min_dense, "otu_table"), is_a("otu_table")) expect_that(access(min_sparse, "otu_table"), is_a("otu_table")) # Compare values in the otu_table. For some reason the otu_tables are not identical # one position is plus-two, another is minus-two combrich <- c(access(rich_dense, "otu_table"), access(rich_sparse, "otu_table")) expect_that(sum(diff(combrich, length(access(rich_dense, "otu_table")))), is_equivalent_to(0)) expect_that(max(diff(combrich, length(access(rich_dense, "otu_table")))), is_equivalent_to(2)) expect_that(min(diff(combrich, length(access(rich_dense, "otu_table")))), is_equivalent_to(-2)) combmin <- c(access(min_dense, "otu_table"), access(min_sparse, "otu_table")) expect_that(sum(diff(combmin, length(access(min_dense, "otu_table")))), is_equivalent_to(0)) expect_that(max(diff(combmin, length(access(min_dense, "otu_table")))), is_equivalent_to(2)) expect_that(min(diff(combmin, length(access(min_dense, "otu_table")))), is_equivalent_to(-2)) expect_that(access(min_dense, "otu_table"), is_equivalent_to(access(rich_dense, "otu_table"))) expect_that(access(min_sparse, "otu_table"), is_equivalent_to(access(rich_sparse, "otu_table"))) # Compare values in the sample_data expect_that(access(rich_dense, "sam_data"), is_equivalent_to(access(rich_sparse, "sam_data"))) # Compare values in the taxonomyTable expect_that(access(rich_dense, "tax_table"), is_equivalent_to(access(rich_sparse, "tax_table"))) }) test_that("the import_biom and import(\"biom\", ) syntax give same result", { x1 <- import_biom(rich_dense_biom, parseFunction=parse_taxonomy_greengenes) x2 <- import("biom", BIOMfilename=rich_dense_biom, parseFunction=parse_taxonomy_greengenes) expect_that(x1, is_equivalent_to(x2)) }) ################################################################################ # read_tree tests test_that("The read_tree function works as expected:", { GPNewick <- read_tree(system.file("extdata", "GP_tree_rand_short.newick.gz", package="phyloseq")) expect_that(GPNewick, is_a("phylo")) expect_that(ntaxa(GPNewick), equals(length(GPNewick$tip.label))) expect_that(ntaxa(GPNewick), equals(500)) expect_that(GPNewick$Nnode, equals(499)) expect_that(taxa_names(GPNewick), is_equivalent_to(GPNewick$tip.label)) # Now read a nexus tree... # Some error-handling expectations expect_that(read_tree("alskflsakjsfskfhas.akshfaksj"), gives_warning()) # file not exist not_tree <- system.file("extdata", "esophagus.good.groups.gz", package="phyloseq") expect_that(read_tree(not_tree), is_a("NULL")) # file not a tree, gives NULL expect_that(read_tree(not_tree, TRUE), throws_error()) # file not a tree, check turned on/TRUE }) # read_tree_greengenes test_that("The specialized read_tree_greengenes function works:", { # The included, gzipped version of the the 13_5 73% similarity greengenes tree. # It causes ape::read.tree to fail with an error, but read_tree_greengenes should be fine. treefile = system.file("extdata", "gg13-5-73.tree.gz", package="phyloseq") x = read_tree_greengenes(treefile) expect_is(x, "phylo") # Happen to know that all OTU names should be numbers. expect_match(x$tip.label, "[[:digit:]]+") # All tip/OTU names should be unique expect_false(any(duplicated(taxa_names(x)))) # The more general read_tree function reads, but they are not equal y = read_tree(treefile) expect_false(all.equal(x, y)) }) ################################################################################ # microbio_me_qiime tests # This tests different features and expected behavior for # the functioning of an interface function to the # microbio.me/qiime data repository. # zipfile = "study_816_split_library_seqs_and_mapping.zip" zipfile = system.file("extdata", zipfile, package="phyloseq") tarfile = "study_816_split_library_seqs_and_mapping.tar.gz" tarfile = system.file("extdata", tarfile, package="phyloseq") tarps = suppressWarnings(microbio_me_qiime(tarfile)) zipps = suppressWarnings(microbio_me_qiime(zipfile)) # This function is intended to interface with an external server, # as described in the documentation. # However, I don't want successful testing of this package to # rely on the presence or form of particular files on an # external server, so these tests will be done exclusively on # compressed file(s) representing what is exposed by the data server # It is up to the user to provide valid a URL in practice, # and the function attempts to provide informative status # and error messages if things go awry. test_that("The microbio_me_qiime imports as expected: .tar.gz", { expect_is(tarps, "phyloseq") expect_is(sample_data(tarps, errorIfNULL=FALSE), "sample_data") expect_is(otu_table(tarps, errorIfNULL=FALSE), "otu_table") expect_identical(nrow(otu_table(tarps)), 50L) expect_identical(nrow(sample_data(tarps)), 15L) }) test_that("The microbio_me_qiime imports as expected: .zip", { expect_is(zipps, "phyloseq") expect_is(sample_data(zipps, errorIfNULL=FALSE), "sample_data") expect_is(otu_table(zipps, errorIfNULL=FALSE), "otu_table") expect_identical(nrow(otu_table(zipps)), 50L) expect_identical(nrow(sample_data(zipps)), 15L) }) test_that("Results of .tar.gz and .zip should be identical", { expect_identical(tarps, zipps) expect_identical(sample_data(tarps), sample_data(zipps)) expect_identical(otu_table(tarps), otu_table(zipps)) }) ################################################################################ # import_usearch_uc ################################################################################ usearchfile = system.file("extdata", "usearch.uc", package="phyloseq") OTU1 = import_usearch_uc(usearchfile) test_that("import_usearch_uc: Properly omit entries from failed search", { ucLines = readLines(usearchfile) expect_identical( sum(OTU1), (length(ucLines) - length(grep("*", ucLines, fixed=TRUE))) ) expect_identical( nrow(OTU1), 37L) expect_identical( nrow(OTU1), nsamples(OTU1)) expect_identical( ncol(OTU1), ntaxa(OTU1)) expect_identical( ncol(OTU1), 33L) expect_equivalent(colSums(OTU1)[1:6], c(6, 1, 2, 1, 1, 1)) }) ################################################################################phyloseq/tests/testthat/test-distance.R0000644000175400017540000001575713175714136021367 0ustar00biocbuildbiocbuild################################################################################ # Use testthat to test that distance methods return correct results. ################################################################################ library("phyloseq"); packageVersion("phyloseq") library("testthat"); packageVersion("testthat") ################################################################################ # UniFrac testing section. Relies on pre-computed results from pycogent # The relevant python code is saved in `extdata/gp500-pycogent.py` ################################################################################ # Define the test-example phyloseq dataset. A random subsample from Global Patterns treeFile = system.file("extdata", "GP_tree_rand_short.newick.gz", package="phyloseq") GP500File = system.file("extdata", "GP_otu_table_rand_short.txt.gz", package = "phyloseq") GP500 = import_qiime(GP500File, treefilename = treeFile) # # Example if you want to re-create the test files for calculating with pyCogent #export_env_file(GP500, file = "~/Downloads/gp500test.env.txt", writeTree = FALSE) #ape::write.tree(phy_tree(GP500), file = "~/Downloads/gp500test.tree") # Now import the results with read.table() gp500_uuf = read.csv(system.file("extdata", "gp500-uuf.csv", package = "phyloseq"), header = FALSE, fill = TRUE) gp500_wuf = read.csv(system.file("extdata", "gp500-wuf.csv", package = "phyloseq"), header = FALSE, fill = TRUE) gp500_wufu = read.csv(system.file("extdata", "gp500-wufu.csv", package = "phyloseq"), header = FALSE, fill = TRUE) # Add the sample names colnames(gp500_uuf) <- rownames(gp500_uuf) <- colnames(gp500_wuf) <- rownames(gp500_wuf) <- colnames(gp500_wufu) <- rownames(gp500_wufu) <- sample_names(GP500) # Coerce to Distance Matrices for comparison `"dist"` class gp500_wufu <- as.dist(gp500_wufu) gp500_wuf <- as.dist(gp500_wuf) gp500_uuf <- as.dist(gp500_uuf) # Define numerical tolerance tol = 0.00000001 test_that("UniFrac produces correct values on an example subset from Global Patterns. 'Correct' values are results from pyCogent", { # Using UniFrac function directly expect_equal(gp500_wufu, UniFrac(GP500, weighted = TRUE, normalized = FALSE), check.attributes = FALSE, tolerance = tol, label = "`UniFrac`: Weighted but Un-normalized UniFrac results did not match reference answer.") expect_equal(gp500_wuf, UniFrac(GP500, weighted = TRUE), check.attributes = FALSE, tolerance = tol, label = "`UniFrac`: Weighted, normalized UniFrac results did not match reference answer.") expect_equal(gp500_uuf, UniFrac(GP500, weighted = FALSE), check.attributes = FALSE, tolerance = tol, label = "`UniFrac`: Unweighted UniFrac results did not match reference answer.") # Using the `distance` wrapper expect_equal(gp500_wufu, distance(GP500, "unifrac", weighted = TRUE, normalized = FALSE), check.attributes = FALSE, tolerance = tol, label = "`distance`: Weighted but Un-normalized UniFrac results did not match reference answer.") expect_equal(gp500_wuf, distance(GP500, "unifrac", weighted = TRUE), check.attributes = FALSE, tolerance = tol, label = "`distance`: Weighted, normalized UniFrac results did not match reference answer.") expect_equal(gp500_uuf, distance(GP500, "unifrac", weighted = FALSE), check.attributes = FALSE, tolerance = tol, label = "`distance`: Unweighted UniFrac results did not match reference answer.") # Make sure reference files are different (at the very least) expect_false({isTRUE(all.equal(gp500_uuf, gp500_wuf, check.attributes = FALSE, tolerance = 0.01))}, label = "The reference matrices for UniFrac testing should be different, but were not. uuf/wuf") expect_false({isTRUE(all.equal(gp500_uuf, gp500_wufu, check.attributes = FALSE, tolerance = 0.01))}, label = "The reference matrices for UniFrac testing should be different, but were not. uuf/wufu") expect_identical(distance(GP500, "wunifrac"), distance(GP500, "unifrac", weighted = TRUE), label = "wunifrac output is not identical to unifrac with weighted=T flag") }) test_that("Check that regular-expression matching for unifrac method flag is working", { expect_identical(distance(GP500, "w-UniFrac"), distance(GP500, "unifrac", weighted = TRUE)) expect_identical(distance(GP500, "weighted-UniFrac"), distance(GP500, "unifrac", weighted = TRUE)) expect_identical(distance(GP500, "unweighted-UniFrac"), distance(GP500, "unifrac")) expect_identical(distance(GP500, "u-UniFrac"), distance(GP500, "unifrac")) }) ################################################################################ # Test other distances against their expected dispatch explicit calculation ################################################################################ test_that("Test accurate dispatch for other distances", { otumatgp500 = t(as(otu_table(GP500), "matrix")) # Test for all vegdist, phyloseq object expect_equal( lapply(distanceMethodList$vegdist, vegan::vegdist, x = otumatgp500), lapply(distanceMethodList$vegdist, distance, physeq = GP500), check.attributes = FALSE, tolerance = tol) # Test for all vegdist, OTU table expect_equal( lapply(distanceMethodList$vegdist, vegan::vegdist, x = otumatgp500), lapply(distanceMethodList$vegdist, distance, physeq = otu_table(GP500)), check.attributes = FALSE, tolerance = tol) # Test for all betadiver, phyloseq object expect_equal( lapply(distanceMethodList$betadiver, vegan::betadiver, x = otumatgp500), lapply(distanceMethodList$betadiver, distance, physeq = GP500), check.attributes = FALSE, tolerance = tol) # Test for all betadiver, OTU table expect_equal( lapply(distanceMethodList$betadiver, vegan::betadiver, x = otumatgp500), lapply(distanceMethodList$betadiver, distance, physeq = otu_table(GP500)), check.attributes = FALSE, tolerance = tol) # Test for all dist, phyloseq object expect_equal( lapply(distanceMethodList$dist, stats::dist, x = otumatgp500), lapply(distanceMethodList$dist, distance, physeq = GP500), check.attributes = FALSE, tolerance = tol) # Test for all dist, OTU table expect_equal( lapply(distanceMethodList$dist, stats::dist, x = otumatgp500), lapply(distanceMethodList$dist, distance, physeq = otu_table(GP500)), check.attributes = FALSE, tolerance = tol) # DPCoA #"dpcoa" # phyloseq object # TOO SLOW to test routinely. Commenting out. # expect_equal( # as.dist(DPCoA(GP500)$RaoDis, diag=FALSE), # distance(GP500, "dpcoa"), # check.attributes = FALSE, tolerance = tol) # OTU table doesn't have a tree expect_error(DPCoA(otu_table(GP500))) # JSD #"jsd" # phyloseq object expect_equal( phyloseq:::JSD(GP500), distance(GP500, "jsd"), check.attributes = FALSE, tolerance = tol) # OTU table expect_equal( phyloseq:::JSD(otu_table(GP500)), distance(otu_table(GP500), "jsd"), check.attributes = FALSE, tolerance = tol) }) ################################################################################ phyloseq/tests/testthat/test-merge.R0000644000175400017540000003377313175714136020672 0ustar00biocbuildbiocbuild# testthat tests don't do anything when successful. library("phyloseq"); packageVersion("phyloseq") library("testthat"); packageVersion("testthat") # # # Tests! ################################################################################ # merge_samples data(GlobalPatterns) # GP <- prune_taxa(taxa_sums(GlobalPatterns)>0, GlobalPatterns) GP <- GlobalPatterns mGP <- merge_samples(GlobalPatterns, "SampleType") test_that("Classes of merged phyloseq objects are as expected", { expect_that(merge_samples(otu_table(GP), get_variable(GP, "SampleType")), is_a("otu_table")) expect_that(merge_samples(sample_data(GP), "SampleType"), is_a("sample_data")) expect_that(mGP, is_a("phyloseq")) }) test_that("Same sam_data result for separate and combined merge in merge_samples", { expect_that( merge_samples(sample_data(GP), "SampleType"), is_identical_to(sample_data(mGP)) ) }) test_that("Same otu_table result for separate and combined merge in merge_samples", { expect_that( merge_samples(otu_table(GP), get_variable(GP, "SampleType")), is_identical_to(otu_table(mGP)) ) }) test_that("Sample Names of merged object now same set as merging factor levels", { sampleTypes = levels(data.frame(sample_data(GP))$SampleType) expect_that(setdiff(sampleTypes, sample_names(mGP)), is_identical_to(character())) }) test_that("Counts from merged-samples are summed...", { OTUnames10 = names(sort(taxa_sums(GP), TRUE)[1:10]) GP10 = prune_taxa(OTUnames10, GP) mGP10 = prune_taxa(OTUnames10, mGP) # Loop to check the correct summation has occured for all OTUs. for( i in OTUnames10 ){ isum = as(tapply(get_sample(GP10, i), get_variable(GP10, "SampleType"), sum), "numeric") expect_that(isum, is_equivalent_to(get_sample(mGP10, i))) } }) ################################################################################ # merge_phyloseq test_that("merge_phyloseq: Break apart GP based on human-association, then merge back together.", { data(GlobalPatterns) GP <- prune_taxa(taxa_names(GlobalPatterns)[1:100], GlobalPatterns) sample_data(GP)$human <- factor(get_variable(GP, "SampleType") %in% c("Feces", "Mock", "Skin", "Tongue")) h1 <- subset_samples(GP, human=="TRUE") h0 <- subset_samples(GP, human=="FALSE") GP1 <- merge_phyloseq(h0, h1) # The species order is fixed to the tree, # so should be the same between the original and merged expect_that(taxa_names(GP), is_identical_to(taxa_names(GP1))) expect_that(phy_tree(h1), is_identical_to(phy_tree(h0))) # However, the sample order has been shuffled by the split/merge. # Fix the sample order by re-ordering the otu_table, and reassigning sa.order <- sample_names(GP) sa.order <- sa.order[sa.order %in% sample_names(GP1)] otu_table(GP1) <- otu_table(GP1)[, sa.order] expect_equal(sample_names(GP), sample_names(GP1)) expect_equal(sample_names(sample_data(GP)), sample_names(sample_data(GP1))) # Sample data entries are the same, irrespective of factor levels GPfactors = which(sapply(sample_data(GP1), inherits, "factor")) for(j in GPfactors){ expect_equal(as.character(get_variable(GP, j)), as.character(get_variable(GP1, j))) } # Reconcile factor level order for remaining tests GP1factors = which(sapply(sample_data(GP1), inherits, "factor")) for(j in names(GP1factors)){ varj = as.character(get_variable(GP1, j)) sample_data(GP1)[, j] <- factor(varj, levels = sort(unique(varj))) } GPfactors = which(sapply(sample_data(GP), inherits, "factor")) for(j in names(GPfactors)){ varj = as.character(get_variable(GP, j)) sample_data(GP)[, j] <- factor(varj, levels = sort(unique(varj))) } # Check a specific variable expect_equal(sample_data(GP1)$SampleType, sample_data(GP)$SampleType) # Should be fixed now. Full object and components now identical expect_equal(GP1, GP) expect_identical(GP1, GP) expect_that(otu_table(GP1), is_identical_to(otu_table(GP))) expect_that(tax_table(GP1), is_identical_to(tax_table(GP))) expect_that(phy_tree(GP1), is_identical_to(phy_tree(GP))) ## Check factor levels # The set expect_identical(sort(levels(sample_data(GP1)$SampleType)), sort(levels(sample_data(GP)$SampleType))) # The order expect_identical(levels(sample_data(GP1)$SampleType), levels(sample_data(GP)$SampleType)) # Overall expect_identical(sample_data(GP1), sample_data(GP)) expect_identical(droplevels(sample_data(GP1)), droplevels(sample_data(GP))) # Check variable names are all there (set) expect_equal( object = sort(intersect(colnames(sample_data(GP1)), colnames(sample_data(GP)))), expected = sort(colnames(sample_data(GP1)))) # Check column classes expect_equal(sapply(sample_data(GP1), class), sapply(sample_data(GP), class)) # Check column names expect_equal(colnames(sample_data(GP1)), colnames(sample_data(GP))) # Check sample name order expect_equal(sample_names(sample_data(GP1)), sample_names(sample_data(GP))) expect_equal(sample_names(GP1), sample_names(GP)) }) ################################################################################ # tax_glom # Load data data("GlobalPatterns") GP.chl = subset_taxa(GlobalPatterns, Phylum == "Chlamydiae") test_that("the tax_table slot is identical whether tax_glom()ed by itself or as component", { expect_that(tax_glom(tax_table(GP.chl), "Family"), is_a("taxonomyTable")) expect_that(n1<-tax_glom(GP.chl, "Family"), is_a("phyloseq")) expect_that(ntaxa(n1), equals(4L)) expect_that( tax_glom(tax_table(GP.chl), taxrank="Family"), is_equivalent_to(tax_table(tax_glom(GP.chl, taxrank="Family"))) ) n1 = as(tax_glom(tax_table(GP.chl), taxrank="Family", NArm=FALSE), "matrix")[, "Family"] n2 = tax_glom(GP.chl, taxrank="Family", NArm=FALSE) expect_true(setequal(n1, as(tax_table(n2), "matrix")[, "Family"])) expect_that(ntaxa(n2), equals(5L)) }) test_that("tax_glom() handles clearly agglomeration to one taxa", { expect_that(n1 <- tax_glom(GP.chl, "Phylum"), gives_warning()) expect_that(n1, is_a("phyloseq")) expect_that(ntaxa(n1), equals(1L)) expect_that(access(n1, "phy_tree"), is_a("NULL")) }) test_that("tax_glom() can handle even the highest rank glom", { expect_warning(tax_glom(GP.chl, "Kingdom")) gpk = tax_glom(GlobalPatterns, "Kingdom") expect_is(gpk, "phyloseq") expect_equivalent(ntaxa(gpk), 2) expect_equivalent(taxa_sums(gpk), c(195598, 28021080)) }) ################################################################################ # prune_taxa # Use the GP.chl dataset from previous testing block test_that("prune_taxa() handles clearly pruning to one taxa", { # throws warning, and NULL-tre expect_that(n1 <- prune_taxa(taxa_names(GP.chl)[1:1], GP.chl), gives_warning()) expect_that(ntaxa(n1), equals(1L)) expect_that(n1, is_a("phyloseq")) expect_that(access(n1, "phy_tree"), is_a("NULL")) expect_that(access(n1, "otu_table"), is_a("otu_table")) }) test_that("prune_taxa() properly handles standard-cases", { # throws warning, and NULL-tre expect_that(n1 <- prune_taxa(taxa_names(GP.chl)[1:5], GP.chl), is_a("phyloseq")) expect_that(ntaxa(n1), equals(5L)) expect_that(access(n1, "phy_tree"), is_a("phylo")) expect_that(access(n1, "otu_table"), is_a("otu_table")) expect_that(access(n1, "sam_data"), is_a("sample_data")) expect_that(access(n1, "tax_table"), is_a("taxonomyTable")) # Use logical vector, and get same answer L2 <- vector(length=ntaxa(GP.chl)) L2[1:5] <- TRUE expect_that(n2 <- prune_taxa(L2, GP.chl), is_a("phyloseq")) expect_that(n2, is_identical_to(n1)) }) ################################################################################ # merge_taxa # Use the GP.chl dataset from previous testing block test_that("merge_taxa() properly handles standard-cases", { expect_that(n1 <- merge_taxa(GP.chl, c("24341", "579085")), is_a("phyloseq")) expect_that(ntaxa(n1), equals(20L)) # The first name is kept, others removed expect_that("579085" %in% taxa_names(n1), equals(FALSE)) expect_that("24341" %in% taxa_names(n1), equals(TRUE)) # Try a 3-element merge, check that the largest-count remains. OTUIDs = c("579085", "24341", "547579") biggestOTU = names(which.max(taxa_sums(GP.chl)[OTUIDs])) # Perform the merge of `OTUIDs`, and check the resulting class while at it. expect_is(n2 <- merge_taxa(GP.chl, OTUIDs), "phyloseq") # Check that there are now the correct, fewer number of OTUs expect_equal(ntaxa(n2), (ntaxa(GP.chl)-length(OTUIDs)+1)) # The biggest OTU is kept, others merged expect_true(biggestOTU %in% taxa_names(n2)) expect_true(!any(setdiff(OTUIDs, biggestOTU) %in% taxa_names(n2))) # Merge again, but only use the tax_table. No counts changes default retained to first in vector expect_is(n2b <- merge_taxa(tax_table(GP.chl), OTUIDs), "taxonomyTable") # Check that there are now the correct, fewer number of OTUs expect_equal(ntaxa(n2b), (ntaxa(GP.chl)-length(OTUIDs)+1)) # The biggest OTU is kept, others merged expect_true(OTUIDs[1] %in% taxa_names(n2b)) expect_true(!any(setdiff(OTUIDs, OTUIDs[1]) %in% taxa_names(n2b))) # Merge again, but specify the retained OTU name as the 3rd one, rather than the default expect_that(n3 <- merge_taxa(GP.chl, eqtaxa=OTUIDs, archetype=OTUIDs[3]), is_a("phyloseq")) # "547579" is kept, others removed expect_true(OTUIDs[3] %in% taxa_names(n3)) expect_true(!any(setdiff(OTUIDs, OTUIDs[3]) %in% taxa_names(n3))) # Check that the remaining OTU has the sum of the values merged expect_identical(get_sample(n3, OTUIDs[3]), colSums(as(otu_table(GP.chl), "matrix")[OTUIDs, ])) }) test_that("merge_taxa() replaces disagreements in taxonomy with NA", { # Try a more difficult merge from a different subset GP20 <- prune_taxa(taxa_names(GlobalPatterns)[1:20], GlobalPatterns) # Arbitrary merge into taxa "951", NA in ranks after Phylum OTUIDs = c("951", "586076", "141782", "30678", "30405") biggestOTU = names(which.max(taxa_sums(GP20)[OTUIDs])) n5 = merge_taxa(GP20, OTUIDs) # The biggest OTU is kept, others merged expect_true(biggestOTU %in% taxa_names(n5)) expect_true(!any(setdiff(OTUIDs, biggestOTU) %in% taxa_names(n5))) # The taxonomy should be NA_character_ after Phylum (OTUIDs chosen carefully in this case) n5_merged_taxonomy <- as(tax_table(n5), "matrix")[biggestOTU, ] expect_true(!any(is.na(n5_merged_taxonomy[1:2]))) expect_true(all(is.na(n5_merged_taxonomy[3:7]))) # Test how well it works at a different level (say first or last ranks) OTUIDs <- c("1126", "31759") biggestOTU = names(which.max(taxa_sums(GP20)[OTUIDs])) n6 <- merge_taxa(GP20, OTUIDs) # The biggest OTU is kept, others merged expect_true(biggestOTU %in% taxa_names(n6)) expect_true(!any(setdiff(OTUIDs, biggestOTU) %in% taxa_names(n6))) # Test that the taxonomy is NA after Order n6_merged_taxonomy <- as(tax_table(n6), "matrix")[biggestOTU, ] expect_true( !any(is.na(n6_merged_taxonomy[1:4])) ) expect_true( all(is.na(n6_merged_taxonomy[5:7])) ) # Test that it works for differences at the first rank GP20f <- GP20 tax_table(GP20f)[1, 1] <- "Bacteria" OTUIDs = taxa_names(GP20f)[1:2] biggestOTU = names(which.max(taxa_sums(GP20f)[OTUIDs])) expect_is(n7 <- merge_taxa(GP20f, OTUIDs), "phyloseq") # Should be all NA taxonomy expect_that( all(is.na(as(tax_table(n7), "matrix")[biggestOTU, ])), equals(TRUE)) # Test that it works for differences at the last rank # First, make the first taxa the same as "951" tax_table(GP20f)[1, ] <- tax_table(GP20f)["951", ] # Now change the last rank of this entry to something else tax_table(GP20f)[1, length(rank_names(GP20f))] <- "species_phyloseq_test" OTUIDs = c("951", biggestOTU) biggestOTU = names(which.max(taxa_sums(GP20f)[OTUIDs])) expect_is(n8 <- merge_taxa(GP20f, OTUIDs), "phyloseq") t951 <- as(tax_table(n8), "matrix")[biggestOTU, ] expect_equal( sum(is.na(t951)), 1L ) expect_true( is.na(t951[length(rank_names(n8))]) ) expect_identical( t951[-7], as(tax_table(GP20f), "matrix")["951", ][-7] ) # Test that it works if the taxonomies completely agree GP20f <- GP20 # Make the first taxa the same as "951" tax_table(GP20f)[1, ] <- tax_table(GP20f)["951", ] merge_these <- c("549322", "951") n9 <- merge_taxa(GP20f, merge_these) n9t1 <- as(tax_table(n9), "matrix")["549322", ] # None should be NA expect_that(any(is.na(n9t1)), equals(FALSE)) expect_that(length(n9t1), equals(7L)) # Merge worked, "951" is gone. expect_that("951" %in% taxa_names(n9), equals(FALSE)) }) test_that("merge_taxa() properly handles different types and orders of taxa specified by the eqtaxa and archetype arguments, and also handles refseq data", { # Test merge_taxa on data with a reference sequence file. otufile <- system.file("extdata", "GP_otu_table_rand_short.txt.gz", package="phyloseq") mapfile <- system.file("extdata", "master_map.txt", package="phyloseq") trefile <- system.file("extdata", "GP_tree_rand_short.newick.gz", package="phyloseq") rs_file <- system.file("extdata", "qiime500-refseq.fasta", package="phyloseq") rs0 <- import_qiime(otufile, mapfile, trefile, rs_file) rs1 = merge_taxa(rs0, c("71074", "10517", "8096")) rs2 = merge_taxa(rs0, c("71074", "8096", "10517"), "71074") rs3 = merge_taxa(rs0, c("71074", "10517", "8096"), 3) rs4 = merge_taxa(rs0, c("8096", "71074", "10517")) # rs1 and rs2 should be identical # rs3 and rs4 should be identical expect_equivalent(rs1, rs2) expect_true(!identical(rs1, rs3)) expect_equivalent(rs3, rs4) # double-check that components are all there expect_that(length(getslots.phyloseq(rs1)), equals(5L)) expect_that(length(getslots.phyloseq(rs2)), equals(5L)) expect_that(length(getslots.phyloseq(rs3)), equals(5L)) expect_that(length(getslots.phyloseq(rs4)), equals(5L)) # The number of taxa should be the same as the original less two expect_that(ntaxa(rs1), equals(ntaxa(rs0)-2L)) expect_that(ntaxa(rs2), equals(ntaxa(rs0)-2L)) expect_that(ntaxa(rs3), equals(ntaxa(rs0)-2L)) expect_that(ntaxa(rs4), equals(ntaxa(rs0)-2L)) # merge_taxa() errors when a bad archetype is provided # Throws error because keepIndex is NULL expect_that(merge_taxa(rs0, c("71074", "10517", "8096"), "wtf"), throws_error()) # Throws error because keepIndex is not part of eqtaxa (logic error, invalid merge) expect_that(merge_taxa(rs0, c("71074", "10517", "8096"), "13662"), throws_error()) }) phyloseq/tests/testthat/test-phyloseq.R0000644000175400017540000001565313175714136021434 0ustar00biocbuildbiocbuild################################################################################ # Use testthat to test phyloseq constructor and other class internals. ################################################################################ library("phyloseq"); library("testthat") # # # # TESTS! set.seed(8888) ################################################################################ test_that("phyloseq: Building a phyloseq-object when tree contains extra quotes, still works.", { data("esophagus") tree = phy_tree(esophagus) # Add extra quotes surrounding each OTU name in the tree tree$tip.label = paste("\"", taxa_names(tree), "\"", sep="") # Try to add the tree back to esophagus, replacing the original # (Should work with message.) esophagus1 = esophagus phy_tree(esophagus) = tree expect_that(esophagus1, is_identical_to(esophagus)) # Now try to "rebuild" using the quote-containing esophagus2 = phyloseq(tree, otu_table(esophagus)) expect_that(esophagus2, is_identical_to(esophagus)) # Try with a dataset with complete-set of components, Global Patterns data("GlobalPatterns") # Use a subset, because checking identicality of two large, complicated objects takes time. minsum = sort(taxa_sums(GlobalPatterns), TRUE)[20] GP = prune_taxa(taxa_sums(GlobalPatterns) >= minsum, GlobalPatterns) tree = phy_tree(GP) # Add extra quotes surrounding each OTU name in the tree tree$tip.label = paste("\"", taxa_names(tree), "\"", sep="") # Try to add the tree back to GP, replacing the original # (Should work with message.) GP1 = GP phy_tree(GP) = tree expect_that(GP1, is_identical_to(GP)) # Now try to "rebuild" using the quote-containing GP2 = phyloseq(tree, otu_table(GP), tax_table(GP), sample_data(GP)) expect_that(GP2, is_identical_to(GP)) }) ################################################################################ # More constructor-related tests needed here... ################################################################################ # - Test that re-assigning taxa_names and sample_names works. # - Use this to test that intersect_samples and intersect_taxa works. ################################################################################ data("GlobalPatterns") e1 = prune_taxa(taxa_names(GlobalPatterns)[1:25], GlobalPatterns) test_that("taxa_names(x)<- and sample_names(x)<- behaves as expected", { # taxa_names<- new_taxa_names = paste("OTU-", taxa_names(e1), sep="") taxa_names(e1) = new_taxa_names expect_that(identical(taxa_names(e1), new_taxa_names), is_true()) expect_that(identical(taxa_names(phy_tree(e1)), new_taxa_names), is_true()) expect_that(identical(taxa_names(otu_table(e1)), new_taxa_names), is_true()) expect_that(identical(taxa_names(tax_table(e1)), new_taxa_names), is_true()) # expect_that(identical(taxa_names(refseq(e1)), new_taxa_names), is_true()) # sample_names<- new_sample_names = paste("Sa-", sample_names(e1), sep="") sample_names(e1) = new_sample_names expect_that(identical(sample_names(e1), new_sample_names), is_true()) expect_that(identical(sample_names(sample_data(e1)), new_sample_names), is_true()) expect_that(identical(sample_names(otu_table(e1)), new_sample_names), is_true()) }) test_that("Test intersect_*() and prune_*() methods behave as expected", { e0 = e1 # taxa_names<- ## We assign new names to just one component, being sneaky and using the ## not-recommended direct replacement with @slotname ## This should work, but users should not do it in normal circumstances new_taxa_names = taxa_names(e1) nunchained = 5L i = sample(ntaxa(e1), ntaxa(e1)-nunchained, replace=FALSE) new_taxa_names[i] = paste("OTU-", taxa_names(e1)[i], sep="") taxa_names(e1@tax_table) = new_taxa_names expect_that(identical(taxa_names(e1), new_taxa_names), is_false()) expect_that(identical(taxa_names(tax_table(e1)), new_taxa_names), is_true()) expect_that(identical(taxa_names(otu_table(e1)), new_taxa_names), is_false()) expect_that(identical(taxa_names(phy_tree(e1)), new_taxa_names), is_false()) # expect_that(identical(taxa_names(refseq(e1)), new_taxa_names), is_false()) ## Okay so that worked. Now we test if the intersection functions behave expect_that(identical(length(phyloseq:::intersect_taxa(e1)), nunchained), is_true()) e2 = prune_taxa(phyloseq:::intersect_taxa(e1), e1) expect_that(identical(ntaxa(e2), nunchained), is_true()) expect_that(setequal(taxa_names(e2), taxa_names(e1)[-i]), is_true()) # sample_names<- e1 = e0 ## We assign new names to just one component, being sneaky and using the ## not-recommended direct replacement with @slotname ## This should work, but users should not do it in normal circumstances new_sample_names = sample_names(e1) nunchained = 5L i = sample(nsamples(e1), nsamples(e1)-nunchained, replace=FALSE) new_sample_names[i] = paste("Sa-", sample_names(e1)[i], sep="") sample_names(e1@sam_data) = new_sample_names expect_that(identical(sample_names(e1), new_sample_names), is_false()) expect_that(identical(sample_names(sample_data(e1)), new_sample_names), is_true()) expect_that(identical(sample_names(otu_table(e1)), new_sample_names), is_false()) ## Okay so that worked. Now we test if the intersection functions behave expect_that(identical(length(phyloseq:::intersect_samples(e1)), nunchained), is_true()) e2 = prune_samples(phyloseq:::intersect_samples(e1), e1) expect_that(identical(nsamples(e2), nunchained), is_true()) expect_that(setequal(sample_names(e2), sample_names(e1)[-i]), is_true()) }) test_that("Test ordering", { OTU = otu_table(e1) tree = phy_tree(e1) expect_that(identical(taxa_names(OTU), taxa_names(tree)), is_true()) reotaxnames = sample(taxa_names(tree), ntaxa(tree), FALSE) expect_that(identical(taxa_names(OTU), reotaxnames), is_false()) # scramble order of taxa_names in tree by random arbitrary assignment taxa_names(tree) <- reotaxnames expect_that(identical(taxa_names(OTU), taxa_names(tree)), is_false()) # implicitly re-order in constructor e3 = phyloseq(OTU, tree) expect_that(identical(taxa_names(e3), taxa_names(tree)), is_true()) expect_that(identical(taxa_names(otu_table(e3)), taxa_names(phy_tree(e3))), is_true()) expect_that(identical(taxa_names(otu_table(e3)), taxa_names(phy_tree(e3))), is_true()) # Glad that worked. Now let's mess up sample indices in one component, and OTU indices in another # then fix explicitly with index_reorder(e4, "both") e4 = e1 reosamplenames = sample(sample_names(e1), nsamples(e1), FALSE) sample_names(e4@sam_data) <- reosamplenames taxa_names(e4@tax_table) <- reotaxnames expect_that(identical(taxa_names(otu_table(e4)), taxa_names(tax_table(e4))), is_false()) expect_that(identical(sample_names(otu_table(e4)), sample_names(sample_data(e4))), is_false()) e4 = phyloseq:::index_reorder(e4, "both") expect_that(identical(taxa_names(otu_table(e4)), taxa_names(tax_table(e4))), is_true()) expect_that(identical(sample_names(otu_table(e4)), sample_names(sample_data(e4))), is_true()) }) ################################################################################ phyloseq/tests/testthat/test-plot.R0000644000175400017540000006202013175714136020534 0ustar00biocbuildbiocbuild################################################################################ # plot_ordination unit tests ################################################################################ library("phyloseq"); library("testthat"); library("ggplot2") data("GlobalPatterns") # Subset to small dataset for quicker testing GP <- prune_taxa(tail(names(sort(taxa_sums(GlobalPatterns))), 50), GlobalPatterns) # Pretend GP doesn't have sample_data or tax_table GP.tax <- tax_table(GP) GP.sd <- sample_data(GP) GP.tr <- phy_tree(GP) # GP <- phyloseq(otu_table(GP), GP.tr) GP.otu <- otu_table(GP) # Try ordination GP.ord <- ordinate(GP.otu, "DCA") # test_that encapsulation makes it difficult to fully test the formula / get() # step in the formula conversion, but that deprecated workaround is # still included and will hopefully bridge the gap for users switching # from previous formula-first use-cases, where the left-hand side of # the formula specified the phyloseq-data #test_that("plot_ordination: formula-first should give a deprecation warning", { # expect_warning(GP.ord.cap <- ordinate(GP~SampleType, "CAP")) # expect_warning(GP.ord.cca <- ordinate(GP~SampleType, "CCA")) # expect_warning(GP.ord.rda <- ordinate(GP~SampleType, "RDA")) # # But it still works. # expect_is(GP.ord.cap, "capscale") # expect_is(GP.ord.cca, "cca") # expect_is(GP.ord.rda, "rda") test_that("plot_ordination: Naked otu_table results in warning, but no error", { expect_is(GP.ord, "decorana") # samples-only expect_that(plot_ordination(GP.otu, GP.ord, "samples"), gives_warning()) # species. expect_that(plot_ordination(GP.otu, GP.ord, "species"), gives_warning()) # split expect_that(plot_ordination(GP.otu, GP.ord, "split"), gives_warning()) # biplot expect_that(plot_ordination(GP.otu, GP.ord, "biplot"), gives_warning()) }) # Create (merged) phyloseq-class GP, and run comparisons test_that("all 4 plot_ordination type options result in valid ggplot2 object", { GP <- merge_phyloseq(GP.otu, GP.tr) # Print. Don't want the render directive to have an error, # even while the ggplot object is created. expect_that(print(plot_ordination(GP, GP.ord, "samples")), is_a("list")) expect_that(print(plot_ordination(GP, GP.ord, "species")), is_a("list")) expect_that(print(plot_ordination(GP, GP.ord, "split")), is_a("list")) expect_that(print(plot_ordination(GP, GP.ord, "biplot")), is_a("list")) # Don't print. Test that result is ggplot-class expect_that(plot_ordination(GP, GP.ord, "samples"), is_a("ggplot")) expect_that(plot_ordination(GP, GP.ord, "species"), is_a("ggplot")) expect_that(plot_ordination(GP, GP.ord, "split"), is_a("ggplot")) expect_that(plot_ordination(GP, GP.ord, "biplot"), is_a("ggplot")) }) test_that("plot_ordination: The justDF=TRUE option returns a data.frame", { # Make GP a phyloseq object with only tree (no ordination co-variables to plot) GP <- merge_phyloseq(GP.otu, GP.tr) expect_that(df0 <- plot_ordination(GP, GP.ord, "species", justDF=TRUE), is_a("data.frame")) expect_that(df1 <- plot_ordination(GP, GP.ord, "samples", justDF=TRUE), is_a("data.frame")) expect_that(df2 <- plot_ordination(GP, GP.ord, "split", justDF=TRUE), is_a("data.frame")) expect_that(df3 <- plot_ordination(GP, GP.ord, "biplot", justDF=TRUE), is_a("data.frame")) # split and biplot data.frames should be same. expect_that(df2, is_identical_to(df3)) }) test_that("plot_ordination: When variables are present or not, color SampleType", { p1 <- plot_ordination(GP, GP.ord, "samples", color="SampleType") expect_that(p2<-plot_ordination(GP, GP.ord, "species", color="SampleType"), gives_warning()) p3 <- plot_ordination(GP, GP.ord, "split", color="SampleType") p4 <- plot_ordination(GP, GP.ord, "biplot", color="SampleType") # ggplot-class tests expect_is(p1, "ggplot") expect_is(p2, "ggplot") expect_is(p3, "ggplot") expect_is(p4, "ggplot") expect_is(print(p1), "list") expect_is(print(p2), "list") expect_is(print(p3), "list") expect_is(print(p4), "list") }) test_that("plot_ordination: When variables are present or not, shape SamplyType", { # GP <- merge_phyloseq(GP.otu, GP.tr, GP.sd, GP.tax) # Pair down samples to just five sampleTypes, for shape plotting. GP <- subset_samples(GP, SampleType %in% c("Feces", "Freshwater", "Ocean", "Tongue", "Sediment (estuary)")) # Some legend issues here that need tidying... p1 <- plot_ordination(GP, GP.ord, "samples", shape="SampleType") expect_warning(p2 <- plot_ordination(GP, GP.ord, "species", shape="SampleType")) p3 <- plot_ordination(GP, GP.ord, "split", shape="SampleType") p4 <- plot_ordination(GP, GP.ord, "biplot", shape="SampleType") # ggplot-class tests expect_is(p1, "ggplot") expect_is(p2, "ggplot") expect_is(p3, "ggplot") expect_is(p4, "ggplot") expect_is(print(p1), "list") expect_is(print(p2), "list") expect_is(print(p3), "list") expect_is(print(p4), "list") }) test_that("plot_ordination: When variables are present or not, label SamplyType", { p1 <- plot_ordination(GP, GP.ord, "samples", label="SampleType") expect_warning(p2 <- plot_ordination(GP, GP.ord, "species", label="SampleType")) p3 <- plot_ordination(GP, GP.ord, "split", label="SampleType") p4 <- plot_ordination(GP, GP.ord, "biplot", label="SampleType") # ggplot-class tests expect_is(p1, "ggplot") expect_is(p2, "ggplot") expect_is(p3, "ggplot") expect_is(p4, "ggplot") expect_is(print(p1), "list") expect_is(print(p2), "list") expect_is(print(p3), "list") expect_is(print(p4), "list") }) test_that("plot_ordination: Continuous variables still mapped, uses added dummy variable", { # Add the fake continuous variable sample_data(GP)$OMEGA3_FA_CONC <- sample(1:100, nsamples(GP)) expect_is(p1 <- plot_ordination(GP, GP.ord, "samples", color="OMEGA3_FA_CONC"), "ggplot") # Continuous variable cannot be mapped to shape. This is a ggplot object, # but will throw error when 'printed' p2 <- plot_ordination(GP, GP.ord, "samples", shape="OMEGA3_FA_CONC") expect_is(p2, "ggplot") expect_error(print(p2)) # A `label` can be mapped to continuous var. It is coerced to char and printed. expect_is(p3 <- plot_ordination(GP, GP.ord, "samples", label="OMEGA3_FA_CONC"), "ggplot") expect_that(print(p1), is_a("list")) #expect_that(print(p2), is_a("list")) expect_that(print(p3), is_a("list")) }) test_that("plot_ordination: Some additional formats and warnings.", { GP.ord.cca = ordinate(GP, "CCA") GP.ord.mdsbray = ordinate(GP, "MDS", "bray") expect_is(p1 <- plot_ordination(GP, GP.ord.mdsbray, type="TaXa", color="Phylum", title="p1"), "ggplot") expect_is(p2 <- plot_ordination(GP, GP.ord.mdsbray, type="SpLit", color="Phylum", title="p2"), "ggplot") expect_warning(p3 <- plot_ordination(GP, GP.ord.mdsbray, type="SamplE", color="Kingdom", title="p3")) expect_is(p3, "ggplot") expect_is(p4 <- plot_ordination(GP, GP.ord.cca, type="TaXa", color="Kingdom", title="p4"), "ggplot") expect_is(p5 <- plot_ordination(GP, GP.ord.cca, type="samPle", color="SampleType", title="p5"), "ggplot") expect_is(p6 <- plot_ordination(GP, GP.ord.cca, type="biplot", color="SampleType", title="p6"), "ggplot") expect_is(p7 <- plot_ordination(GP, GP.ord.cca, type="biplot", label="X.SampleID", color="SampleType", title="p7"), "ggplot") expect_is(p7b <- plot_ordination(GP, GP.ord.cca, type="biplot", label="X.SampleID", color=NULL, title="p7b"), "ggplot") expect_is(p7c <- plot_ordination(GP, GP.ord.cca, type="biplot", label="Phylum", color=NULL, title="p7c"), "ggplot") expect_is(p7d <- plot_ordination(GP, GP.ord.cca, type="biplot", label="Phylum", color="SampleType", title="p7d"), "ggplot") expect_is(p8 <- plot_ordination(GP, GP.ord.cca, type="scree", label="X.SampleID", color="SampleType", title="p8"), "ggplot") expect_is(p9 <- plot_ordination(GP, GP.ord.cca, type=" sPlit __ ", label="Phylum", color="SampleType", title="p8"), "ggplot") expect_that(print(p1), is_a("list")) expect_that(print(p2), is_a("list")) expect_that(print(p3), is_a("list")) expect_that(print(p4), is_a("list")) expect_that(print(p5), is_a("list")) expect_that(print(p6), is_a("list")) expect_that(print(p7), is_a("list")) expect_that(print(p7b), is_a("list")) expect_that(print(p7c), is_a("list")) expect_that(print(p7d), is_a("list")) expect_that(print(p8), is_a("list")) expect_that(print(p9), is_a("list")) # A few more related to new `wascores` support as default backup coordinates xnames = tapply(taxa_sums(GlobalPatterns), tax_table(GlobalPatterns)[, "Phylum"], sum) xnames <- names(sort(xnames, decreasing = TRUE))[1:5] GP = prune_taxa(taxa_sums(GlobalPatterns) > 1E4, GlobalPatterns) GP <- prune_taxa(tax_table(GP)[, "Phylum"] %in% xnames, GP) x = ordinate(GP, method = "MDS", distance = "unifrac", weighted=TRUE) y = ordinate(GP, method = "CCA") z = ordinate(GP, method = "CAP", "unifrac", ~SampleType) z1 = ordinate(GP, method = "CAP", "bray", ~SampleType) # Try a bunch more with splits and biplots expect_is(p11 <- plot_ordination(GP, x, type = "biplot", color="Phylum"), "ggplot") expect_is(print(p11), "list") expect_is(p12 <- plot_ordination(GP, x, type = "biplot", color="SampleType", shape="Phylum"), "ggplot") expect_is(print(p12), "list") expect_is(p13 <- plot_ordination(GP, x, type = "split", color="SampleType", shape="Phylum"), "ggplot") expect_is(print(p13), "list") expect_is(p14 <- plot_ordination(GP, x, type = "split", color="Phylum"), "ggplot") expect_is(print(p14), "list") expect_is(p15 <- plot_ordination(GP, y, type = "biplot", color="Phylum"), "ggplot") expect_is(print(p15), "list") expect_is(p16 <- plot_ordination(GP, y, type = "species", color="Phylum"), "ggplot") expect_is(print(p16), "list") expect_is(p17 <- plot_ordination(GP, z, type = "biplot", color="Phylum"), "ggplot") expect_is(print(p17), "list") expect_is(p18 <- plot_ordination(GP, z, type = "biplot", color="SampleType", shape="Phylum"), "ggplot") expect_is(print(p18), "list") expect_is(p19 <- plot_ordination(GP, z1, type = "biplot", color="Phylum"), "ggplot") expect_is(print(p19), "list") }) test_that("plot_ordination: CAP method", { # Works with a named formula argument GP.ord.cap1 = ordinate(GP, method="CAP", distance="bray", formula=~SampleType) expect_is(GP.ord.cap1, "capscale") # Works without naming the formula argument GP.ord.cap2 = ordinate(GP, method="CAP", distance="bray", ~SampleType) expect_is(GP.ord.cap2, "capscale") expect_equivalent(GP.ord.cap1, GP.ord.cap2) # Works with precomputed distance matrix Dist = distance(GP, "bray", type="samples") GP.ord.cap3 = ordinate(physeq=GP, method="CAP", distance=Dist, ~SampleType) expect_is(GP.ord.cap3, "capscale") # Can't expect equivalent b/c pre-computed distance # won't carryover any species/taxa scores. #expect_equivalent(GP.ord.cap1, GP.ord.cap3) GP.ord.cap = ordinate(GP, method="CAP", distance="bray", formula=~SampleType) expect_is(GP.ord.cap, "capscale") expect_is(p4 <- plot_ordination(GP, GP.ord.cap, type="TaXa", color="Phylum", title="p4"), "ggplot") expect_is(p5 <- plot_ordination(GP, GP.ord.cap, type="samPle", color="SampleType", title="p5"), "ggplot") expect_is(p6 <- plot_ordination(GP, GP.ord.cap, type="biplot", color="SampleType", title="p6"), "ggplot") expect_is(p7 <- plot_ordination(GP, GP.ord.cap, type="biplot", label="X.SampleID", color="SampleType", title="p7"), "ggplot") expect_is(p7b <- plot_ordination(GP, GP.ord.cap, type="biplot", label="X.SampleID", color=NULL, title="p7b"), "ggplot") expect_is(p7c <- plot_ordination(GP, GP.ord.cap, type="biplot", label="Phylum", color=NULL, title="p7c"), "ggplot") expect_is(p7d <- plot_ordination(GP, GP.ord.cap, type="biplot", label="Phylum", color="SampleType", title="p7d"), "ggplot") expect_is(p8 <- plot_ordination(GP, GP.ord.cap, type="scree", label="X.SampleID", color="SampleType", title="p8"), "ggplot") expect_is(p9 <- plot_ordination(GP, GP.ord.cap, type=" sPlit __ ", label="Phylum", color="SampleType", title="p8"), "ggplot") expect_that(print(p4), is_a("list")) expect_that(print(p5), is_a("list")) expect_that(print(p6), is_a("list")) expect_that(print(p7), is_a("list")) expect_that(print(p7b), is_a("list")) expect_that(print(p7c), is_a("list")) expect_that(print(p7d), is_a("list")) expect_that(print(p8), is_a("list")) expect_that(print(p9), is_a("list")) }) # Constrained CCA / RDA test_that("plot_ordination: CCA, RDA method", { # Constrained RDA and CCA both work. GP.ord.cca = ordinate(GP, "CCA", NULL, formula=~SampleType) expect_is(GP.ord.cca, "cca") GP.ord.rda = ordinate(GP, "RDA", NULL, formula=~SampleType) expect_is(GP.ord.rda, "rda") # Test plotting CCA expect_is(p4 <- plot_ordination(GP, GP.ord.cca, type="TaXa", color="Phylum", title="p4"), "ggplot") expect_is(p5 <- plot_ordination(GP, GP.ord.cca, type="samPle", color="SampleType", title="p5"), "ggplot") expect_is(p6 <- plot_ordination(GP, GP.ord.cca, type="biplot", color="SampleType", title="p6"), "ggplot") expect_is(p7 <- plot_ordination(GP, GP.ord.cca, type="biplot", label="X.SampleID", color="SampleType", title="p7"), "ggplot") expect_is(p7b <- plot_ordination(GP, GP.ord.cca, type="biplot", label="X.SampleID", color=NULL, title="p7b"), "ggplot") expect_is(p7c <- plot_ordination(GP, GP.ord.cca, type="biplot", label="Phylum", color=NULL, title="p7c"), "ggplot") expect_is(p7d <- plot_ordination(GP, GP.ord.cca, type="biplot", label="Phylum", color="SampleType", title="p7d"), "ggplot") expect_is(p8 <- plot_ordination(GP, GP.ord.cca, type="scree", label="X.SampleID", color="SampleType", title="p8"), "ggplot") expect_is(p9 <- plot_ordination(GP, GP.ord.cca, type=" sPlit __ ", label="Phylum", color="SampleType", title="p8"), "ggplot") expect_that(print(p4), is_a("list")) expect_that(print(p5), is_a("list")) expect_that(print(p6), is_a("list")) expect_that(print(p7), is_a("list")) expect_that(print(p7b), is_a("list")) expect_that(print(p7c), is_a("list")) expect_that(print(p7d), is_a("list")) expect_that(print(p8), is_a("list")) expect_that(print(p9), is_a("list")) # Repeat test-plotting RDA expect_is(p4 <- plot_ordination(GP, GP.ord.rda, type="TaXa", color="Phylum", title="p4"), "ggplot") expect_is(p5 <- plot_ordination(GP, GP.ord.rda, type="samPle", color="SampleType", title="p5"), "ggplot") expect_is(p6 <- plot_ordination(GP, GP.ord.rda, type="biplot", color="SampleType", title="p6"), "ggplot") expect_is(p7 <- plot_ordination(GP, GP.ord.rda, type="biplot", label="X.SampleID", color="SampleType", title="p7"), "ggplot") expect_is(p7b <- plot_ordination(GP, GP.ord.rda, type="biplot", label="X.SampleID", color=NULL, title="p7b"), "ggplot") expect_is(p7c <- plot_ordination(GP, GP.ord.rda, type="biplot", label="Phylum", color=NULL, title="p7c"), "ggplot") expect_is(p7d <- plot_ordination(GP, GP.ord.rda, type="biplot", label="Phylum", color="SampleType", title="p7d"), "ggplot") expect_is(p8 <- plot_ordination(GP, GP.ord.rda, type="scree", label="X.SampleID", color="SampleType", title="p8"), "ggplot") expect_is(p9 <- plot_ordination(GP, GP.ord.rda, type=" sPlit __ ", label="Phylum", color="SampleType", title="p8"), "ggplot") expect_that(print(p4), is_a("list")) expect_that(print(p5), is_a("list")) expect_that(print(p6), is_a("list")) expect_that(print(p7), is_a("list")) expect_that(print(p7b), is_a("list")) expect_that(print(p7c), is_a("list")) expect_that(print(p7d), is_a("list")) expect_that(print(p8), is_a("list")) expect_that(print(p9), is_a("list")) }) ################################################################################ # Other plot function tests... ################################################################################ # plot_richness tests ################################################################################ test_that("estimate_richness: test values, classes", { data("soilrep") data("GlobalPatterns") # Default is all available measures erdf = estimate_richness(soilrep) expect_is(erdf, "data.frame") expect_equivalent(nrow(erdf), 56) # Contains all expected measures expect_true(all(c("Observed", "Chao1", "ACE", "Shannon", "Simpson", "InvSimpson", "Fisher") %in% colnames(erdf))) # and certain standard errors: expect_true(all(c("se.chao1", "se.ACE") %in% colnames(erdf))) # Test some values. expect_equivalent(erdf$Observed, apply(otu_table(soilrep), 2, function(x){sum(x>0)})) expect_equivalent(estimate_richness(GlobalPatterns, measures="Observed")[, 1], apply(otu_table(GlobalPatterns), 2, function(x){sum(x>0)})) # Calculate "manually" the values that should be Chao1, compare with result. S_0 = apply(otu_table(soilrep), 2, function(x){sum(x>0)}) a1 = apply(otu_table(soilrep), 2, function(x){sum(x==1)}) a2 = apply(otu_table(soilrep), 2, function(x){sum(x==2)}) S_P = S_0 + a1*(a1-1)/(2*(a2+1)) expect_equivalent(round(S_P, 4), round(estimate_richness(soilrep, measures="Chao1")[, "Chao1"], 4)) # Expect a data.frame, even with just one column expect_is(estimate_richness(soilrep, measures="Observed"), "data.frame") # Specify a few: x = estimate_richness(soilrep, measures=c("Observed", "InvSimpson", "Shannon", "Chao1")) expect_equivalent(round(x[1:5, "Shannon"], 4), round(c(6.540578, 6.715170, 6.948412, 7.343088, 6.838917), 4)) }) test_that("plot_richness: Standard plots work", { data("soilrep") p = plot_richness(soilrep) expect_is(p, "ggplot") expect_equivalent(levels(p$data$variable), c("Observed", "Chao1", "ACE", "Shannon", "Simpson", "InvSimpson", "Fisher")) expect_false(all(is.na(p$data$se))) expect_true(any(is.na(p$data$se))) p = plot_richness(soilrep, measures=c("Observed", "Chao1")) expect_is(p, "ggplot") expect_equivalent(levels(p$data$variable), c("Observed", "Chao1")) }) test_that("plot_richness: sortby argument works correctly", { data("soilrep") # sortby must be among the `measures`. # Should throw warning if not, but still produce a plot. expect_warning({p1 <- plot_richness(soilrep, sortby="Treatment")}) expect_is(p1, "ggplot") # sortby is only relevant if `x` argument is discrete. # Should throw warning if not, but still produce a plot. # First add dummy numeric sample variable sample_data(soilrep)$dummy <- runif(nsamples(soilrep)) expect_warning({p2 <- plot_richness(soilrep, x="dummy", sortby="Chao1")}) expect_is(p2, "ggplot") # Default `x` is "samples", always discrete p3 = plot_richness(soilrep, sortby="Chao1") expect_equivalent(levels(p3$data$samples)[1:5], c("a_C137", "a_C145", "a_C126", "a_C156", "a_C139")) expect_is(p3, "ggplot") # Make sure the discrete aggregation sort gets the order correct as well. p4 = plot_richness(soilrep, x="Treatment", sortby="Simpson") expect_equivalent(levels(p4$data$Treatment), c("UC", "WC", "WU", "UU")) expect_is(p4, "ggplot") }) test_that("plot_richness/estimate_richness: fisher.alpha", { data("GlobalPatterns") data("soilrep") p = plot_richness(soilrep, measures="Fisher") expect_is(p, "ggplot") expect_is(p123123 <- plot_richness(GlobalPatterns, measures="Fisher"), "ggplot") expect_equivalent(levels(p123123$data$variable), "Fisher") }) ################################################################################ # Test psmelt properly protects against various name collisions ################################################################################ test_that("psmelt properly protects against various name collisions", { data("GlobalPatterns") gp.ch = subset_taxa(GlobalPatterns, Phylum == "Chlamydiae") ps1 = NULL gp1 = gp.ch # type-1a conflict, Abundance sample_data(gp1)$Abundance <- paste0("Sa-", 1:nsamples(gp1)) expect_warning(ps1 <- psmelt(gp1)) expect_equal(colnames(ps1)[1:3], c("OTU", "Sample", "Abundance")) expect_equal(dim(ps1), c(546L, 18L)) expect_true("sample_Abundance" %in% colnames(ps1)) # A different type-1a conflict, OTU ps1 = NULL gp1 = gp.ch sample_data(gp1)$OTU <- paste0("Sa-", 1:nsamples(gp1)) expect_warning(ps1 <- psmelt(gp1)) expect_equal(colnames(ps1)[1:3], c("OTU", "Sample", "Abundance")) expect_equal(dim(ps1), c(546L, 18L)) expect_true("sample_OTU" %in% colnames(ps1)) # A different type-1a conflict, Sample ps1 = NULL gp1 = gp.ch sample_data(gp1)$Sample <- paste0("Sa-", 1:nsamples(gp1)) expect_warning(ps1 <- psmelt(gp1)) expect_equal(colnames(ps1)[1:3], c("OTU", "Sample", "Abundance")) expect_equal(dim(ps1), c(546L, 18L)) expect_true("sample_Sample" %in% colnames(ps1)) # type-1b conflict. rank_names conflict with special variables ps1 = NULL gp1 = gp.ch tax_table(gp1) <- cbind(tax_table(gp1), Sample=paste0("ta", taxa_names(gp1))) expect_warning(ps1 <- psmelt(gp1)) expect_equal(colnames(ps1)[1:3], c("OTU", "Sample", "Abundance")) expect_equal(dim(ps1), c(546L, 18L)) expect_true("taxa_Sample" %in% colnames(ps1)) # type-2 conflict. Variable collision between rank_names and sample_data ps1 = NULL gp1 = gp.ch tax_table(gp1) <- cbind(tax_table(gp1), Primer=paste0("ta", taxa_names(gp1))) expect_warning(ps1 <- psmelt(gp1)) expect_equal(colnames(ps1)[1:3], c("OTU", "Sample", "Abundance")) expect_equal(dim(ps1), c(546L, 18L)) expect_true("sample_Primer" %in% colnames(ps1)) # All conflict types at once. ps1 = NULL gp1 = gp.ch sample_data(gp1)$Abundance <- paste0("Sa-", 1:nsamples(gp1)) sample_data(gp1)$OTU <- paste0("Sa-", 1:nsamples(gp1)) sample_data(gp1)$Sample <- paste0("Sa-", 1:nsamples(gp1)) tax_table(gp1) <- cbind(tax_table(gp1), Sample=paste0("ta", taxa_names(gp1))) tax_table(gp1) <- cbind(tax_table(gp1), Primer=paste0("ta", taxa_names(gp1))) expect_warning(ps1 <- psmelt(gp1)) expect_equal(colnames(ps1)[1:3], c("OTU", "Sample", "Abundance")) expect_equal(dim(ps1), c(546L, 22L)) newvars = c("sample_OTU", "sample_Sample", "sample_Abundance", "sample_Primer", "taxa_Sample") expect_true(all(newvars %in% colnames(ps1))) }) ################################################################################ test_that("psmelt correctly handles phyloseq data with NULL components, and OTU tables", { data("GlobalPatterns") GP = prune_taxa(names(sort(taxa_sums(GlobalPatterns), TRUE)[1:50]), GlobalPatterns) # The objects with NULL components GPS = phyloseq(otu_table(GP), sample_data(GP), phy_tree(GP)) GPT = phyloseq(otu_table(GP), tax_table(GP), phy_tree(GP)) GPTr = phyloseq(otu_table(GP), phy_tree(GP)) GPN = otu_table(GP) # Try psmelt directly. Should be no errors or warnings. expect_is((testT <- psmelt(GPT)), "data.frame") expect_is((testS <- psmelt(GPS)), "data.frame") expect_is((testTr <- psmelt(GPTr)), "data.frame") expect_is((testN <- psmelt(GPN)), "data.frame") # Test values of the results. expect_is(testT$Abundance, "numeric") expect_is(testT$OTU, "character") expect_is(testT$Sample, "character") expect_equivalent(colnames(testT), c("OTU", "Sample", "Abundance", "Kingdom", "Phylum", "Class", "Order", "Family", "Genus", "Species")) expect_equivalent(colnames(testS), c("Sample", "OTU", "Abundance", "X.SampleID", "Primer", "Final_Barcode", "Barcode_truncated_plus_T", "Barcode_full_length", "SampleType", "Description")) # Try psmelt via plot function that relies on it expect_is(pS <- plot_tree(GPS, color="SampleType"), "ggplot") expect_is(pT <- plot_tree(GPT, shape="Kingdom"), "ggplot") expect_is(pTr <- plot_tree(GPTr), "ggplot") expect_is(pN <- plot_bar(GPN), "ggplot") expect_is((prPS<-print(pS)), "list") expect_is((prPT<-print(pT)), "list") expect_is((prPTr<-print(pTr)), "list") expect_is((prPN<-print(pN)), "list") }) test_that("psmelt doesn't break when the number of taxa is 1", { data(GlobalPatterns) # tree removal warning when prune to 1 OTU. expect_warning(GP1 <- prune_taxa(taxa_names(GlobalPatterns)[1], GlobalPatterns)) expect_equal(ntaxa(GP1), 1) df <- psmelt(GP1) expect_is(df, 'data.frame') reqnames = c("OTU", "Sample", "Abundance", "SampleType", "Kingdom", "Phylum") expect_true(all(reqnames %in% names(df))) expect_equivalent(sum(df$Abundance, na.rm = TRUE), taxa_sums(GP1)) }) ################################################################################ phyloseq/tests/testthat/test-rarefy.R0000644000175400017540000000641513175714136021054 0ustar00biocbuildbiocbuild################################################################################ # Use testthat to test phyloseq transformation functions/methods ################################################################################ library("phyloseq"); library("testthat") # # # # TESTS! ################################################################################ # rarefy_even_depth ################################################################################ data("GlobalPatterns") set.seed(711) # The random seed for randomly selecting subset of OTUs randoOTUs = sample(taxa_names(GlobalPatterns), 100, FALSE) GP100 = prune_taxa(randoOTUs, GlobalPatterns) min_lib = 1000 # The default rng seed is being implied in this call (also 711) rGP = suppressMessages(rarefy_even_depth(GP100, sample.size=min_lib, rngseed=FALSE)) rGPr = suppressMessages(rarefy_even_depth(GP100, sample.size=min_lib, rngseed=FALSE, replace=FALSE)) ################################################################################ # Test that specific OTUs and samples were removed ################################################################################ test_that("Test that empty OTUs and samples were automatically pruned", { rmOTU = setdiff(taxa_names(GP100), taxa_names(rGP)) expect_equal(length(rmOTU), 20L) expect_equal(rmOTU[1:5], c("534601", "408325", "325564", "8112", "571917")) expect_true(taxa_names(GP100)[taxa_sums(GP100) <= 0] %in% rmOTU) expect_true(all(taxa_sums(rGP) > 0)) rmsam = setdiff(sample_names(GP100), sample_names(rGP)) expect_equal(length(rmsam), 12L) expect_equal(rmsam[1:5], c("M11Fcsw", "M31Tong", "M11Tong", "NP2", "TRRsed1")) expect_true(all(sample_sums(rGP) > 0)) }) ################################################################################ # Test specific values. Should be reproducible, and you set the seed. ################################################################################ test_that("Test values", { # with replacement values expect_equal(as(otu_table(rGP)[1, 3:10], "vector"), rep(0, 8)) expect_equal(as(otu_table(rGP)[2, 1:10], "vector"), c(rep(0, 9), 2)) expect_equal(as(otu_table(rGP)[3, 8:12], "vector"), c(892, 956, 56, 10, 25)) expect_equal(as(otu_table(rGP)[70:78, 4], "vector"), c(710, 2, 0, 2, 0, 8, 154, 2, 0)) # without replacement values expect_equal(as(otu_table(rGPr)[1, 3:10], "vector"), c(rep(0, 7), 1)) expect_equal(as(otu_table(rGPr)[2, 1:10], "vector"), c(rep(0, 5), 4, 0, 877, 960, 55)) expect_equal(as(otu_table(rGPr)[3, 8:12], "vector"), c(10, 34, 2, 0, 2)) expect_equal(as(otu_table(rGPr)[70:78, 4], "vector"), c(0, 706, 1, 0, 2, 0, 5, 173, 1)) }) ################################################################################ # Include tests from the rarefy-without-replacement results, used by many. ################################################################################# test_that("Test library sizes are all the same set value", { expect_true(all(sample_sums(rGP )==min_lib)) expect_true(all(sample_sums(rGPr)==min_lib)) }) test_that("The same samples should have been cut in each results", { expect_equal(nsamples(rGP), 14) expect_true(setequal(sample_names(rGP), sample_names(rGPr))) }) ################################################################################phyloseq/tests/testthat/test-subset.R0000644000175400017540000001120013175714136021055 0ustar00biocbuildbiocbuild# load libraries library("phyloseq"); library("testthat") # # # # TESTS! set.seed(888) # Load GP dataset data("GlobalPatterns") GP <- GlobalPatterns keepNames <- sample_names(GP)[5:7] ################################################################################ # prune_ ################################################################################ test_that("Classes of pruned phyloseq and its components are as expected", { GP3 <- prune_samples(keepNames, GP) expect_that(nsamples(GP3), is_identical_to(3L)) expect_that(GP3, is_a("phyloseq")) expect_that(access(GP3, "sam_data"), is_a("sample_data")) expect_that(access(GP3, "otu_table"), is_a("otu_table")) expect_that(access(GP3, "phy_tree"), is_a("phylo")) expect_that(access(GP3, "tax_table"), is_a("taxonomyTable")) # Now try on instance without sample data (empty slot) GPnoSD <- phyloseq(otu_table(GP), tax_table(GP)) GP3noSD <- prune_samples(keepNames, GPnoSD) expect_that(nsamples(GP3noSD), is_identical_to(3L)) expect_that(access(GP3noSD, "otu_table"), is_a("otu_table")) expect_that(access(GP3noSD, "sam_data"), is_a("NULL")) expect_that(access(GP3noSD, "phy_tree"), is_a("NULL")) expect_that(access(GP3noSD, "tax_table"), is_a("taxonomyTable")) }) test_that("prune_samples works on sample_data-only and otu_table-only data", { GPotu <- prune_samples(keepNames, access(GP, "otu_table", TRUE)) GPsd <- prune_samples(keepNames, access(GP, "sam_data", TRUE)) expect_that(nsamples(GPotu), is_identical_to(3L)) expect_that(nsamples(GPsd), is_identical_to(3L)) expect_that(GPotu, is_a("otu_table")) expect_that(GPsd, is_a("sample_data")) expect_that(dim(GPotu), is_identical_to(c(19216L, 3L))) expect_that(dim(GPsd), is_identical_to(c(3L, 7L))) }) # Coerce orientation for apply if(taxa_are_rows(GP)){ otumat = as(otu_table(GP), "matrix") } else { otumat = t(as(otu_table(GP), "matrix")) } # Count in how many samples each OTU was observed more than 5 times. samobs = apply(otumat, 1, function(x, m) sum(x > m), m=5L) # Keep only the most prevalent 50 of these samobs = sort(samobs, TRUE)[1:50] # Shuffle the names on purpose. samobs = sample(samobs, length(samobs), FALSE) test_that("Initial order before pruning check is different", { expect_that(setequal(names(samobs), taxa_names(phy_tree(GP))[1:50]), is_false()) expect_that(setequal(names(samobs), taxa_names(GP)[1:50]), is_false()) expect_that(identical(names(samobs), taxa_names(GP)[1:50]), is_false()) }) # prune to just samobs OTUs pGP = prune_taxa(names(samobs), GP) test_that("The set of names should be the same after pruning, names(samobs)", { expect_that(setequal(names(samobs), taxa_names(phy_tree(pGP))), is_true()) expect_that(setequal(names(samobs), taxa_names(otu_table(pGP))), is_true()) expect_that(setequal(names(samobs), taxa_names(tax_table(pGP))), is_true()) }) test_that("The set/order of taxa names after pruning should be consistent", { # set equal expect_that(setequal(taxa_names(pGP), taxa_names(phy_tree(pGP))), is_true()) expect_that(setequal(taxa_names(otu_table(pGP)), taxa_names(phy_tree(pGP))), is_true()) expect_that(setequal(taxa_names(tax_table(pGP)), taxa_names(phy_tree(pGP))), is_true()) # identical expect_that(identical(taxa_names(pGP), taxa_names(phy_tree(pGP))), is_true()) expect_that(identical(taxa_names(otu_table(pGP)), taxa_names(phy_tree(pGP))), is_true()) expect_that(identical(taxa_names(tax_table(pGP)), taxa_names(phy_tree(pGP))), is_true()) expect_that(identical(names(samobs), taxa_names(phy_tree(pGP))), is_false()) # plot_tree(pGP, "sampledodge", nodeplotblank, label.tips="taxa_names", plot.margin=0.75) }) ## Add this as backup test #' data("esophagus") #' esophagus #' plot(sort(taxa_sums(esophagus), TRUE), type="h", ylim=c(0, 50)) #' x1 = prune_taxa(taxa_sums(esophagus) > 10, esophagus) #' x2 = prune_taxa(names(sort(taxa_sums(esophagus), TRUE))[1:9], esophagus) #' identical(x1, x2) ################################################################################ # test filter_taxa and other filter methods. ################################################################################ library("genefilter") data("enterotype") test_that("filter_taxa gives correct, reliable logicals and pruning", { flist <- filterfun(kOverA(5, 2e-05)) ent.logi <- filter_taxa(enterotype, flist) expect_that(ent.logi, is_a("logical")) ent.trim <- filter_taxa(enterotype, flist, TRUE) expect_that(ent.trim, is_a("phyloseq")) expect_that(sum(ent.logi), equals(ntaxa(ent.trim))) expect_that(prune_taxa(ent.logi, enterotype), is_identical_to(ent.trim)) expect_that(ntaxa(ent.trim), equals(416L)) expect_that(nsamples(ent.trim), equals(nsamples(enterotype))) }) phyloseq/tests/testthat/test-transform.R0000644000175400017540000001213613175714136021574 0ustar00biocbuildbiocbuild################################################################################ # Use testthat to test phyloseq transformation functions/methods ################################################################################ library("phyloseq"); library("testthat") # # # # TESTS! #set.seed(8888) ################################################################################ test_that("Can transform_sample_counts of an OTU table that is either orientation", { data("esophagus") OTU0 = otu_table(esophagus) OTU1 = transform_sample_counts(OTU0, rank) OTU2 = transform_sample_counts(t(OTU0), rank) expect_that(identical(ntaxa(OTU0), ntaxa(OTU1)), is_true(), "ntaxa OTU1 doesn't match original after transformation.") expect_that(identical(ntaxa(OTU0), ntaxa(OTU2)), is_true(), "ntaxa OTU2 doesn't match original after transformation.") }) test_that("Can transform_sample_counts on phyloseq with either orientation", { data("esophagus") eso1 = eso2 = NULL try(eso1 <- transform_sample_counts(esophagus, rank), TRUE) try(eso2 <- transform_sample_counts(t(esophagus), rank), TRUE) expect_false(is.null(eso1), "eso1 is NULL, valid phyloseq construction failed.") expect_false(is.null(eso2), "eso2 is NULL, valid phyloseq construction failed.") expect_is(eso1, "phyloseq", "class of eso1 is not phyloseq") expect_is(eso2, "phyloseq", "class of eso2 is not phyloseq") expect_equal(ntaxa(esophagus), ntaxa(eso1), info="ntaxa eso1 doesn't match original after transformation.") expect_equal(ntaxa(esophagus), ntaxa(eso2), info="ntaxa eso2 doesn't match original after transformation.") }) test_that("Test transform_sample_counts edge-cases", { data("esophagus") # Randomly pick the OTU and sample names to use for subsetting # (Will be different each time tests are run) OTUname1 = sample(taxa_names(esophagus), 1) samname1 = sample(sample_names(esophagus), 1) # Test that a one-OTU dataset still works # It throws a warning because the tree is being removed when it becomes just one tip. #suppressWarnings(eso1otu <- prune_taxa(sample(taxa_names(esophagus), 1), esophagus)) expect_warning(try(eso1otu <- prune_taxa(OTUname1, esophagus), TRUE)) try(eso1sam <- prune_samples(samname1, esophagus), TRUE) # Test eso1otu expect_equal(ntaxa(eso1otu), 1L) expect_equal(nsamples(eso1otu), 3L) # Behavior strange when tree removed by necessity. # In this case a "phyloseq" object with just an OTU table. # Really, this should just be considered an object of class "otu_table". #expect_is(eso1otu, "phyloseq", "pruned-to-1-OTU esophagus not phyloseq") eso1otu = otu_table(eso1otu) expect_is(eso1otu, "otu_table") expect_equal(dim(otu_table(eso1otu)), c(1L, nsamples(esophagus))) # Test eso1sam expect_is(eso1sam, "phyloseq", "pruned-to-1-sample esophagus not phyloseq") expect_is(otu_table(eso1sam), "otu_table", "pruned-to-1-sample esophagus OTU table not otu_table") expect_equal(nsamples(eso1sam), 1L) expect_equal(dim(otu_table(eso1sam)), c(ntaxa(esophagus), 1L)) # Now test transform_sample_counts eso1samrank = eso1oturank = NULL try(eso1samrank <- transform_sample_counts(eso1sam, rank), TRUE) try(eso1samrankt <- transform_sample_counts(t(eso1sam), rank), TRUE) try(eso1oturank <- transform_sample_counts(eso1otu, rank), TRUE) try(eso1oturankt <- transform_sample_counts(t(eso1otu), rank), TRUE) expect_is(eso1samrank, "phyloseq") expect_is(eso1samrankt, "phyloseq") expect_is(eso1oturank, "otu_table") expect_is(eso1oturankt, "otu_table") }) test_that("Test transform_sample_counts numerical result accuracy", { data("esophagus") es = esophagus # addition es1 = transform_sample_counts(es, function(x) x + 1) expect_equal(otu_table(es1), otu_table(es) + 1, tolerance=0.1, info="addition fail") # multiplication es1 = transform_sample_counts(es, function(x) x * 2.5) expect_equal(otu_table(es1), otu_table(es) * 2.5, tolerance=0.1, info="multiplication fail") # element-wise exponentiation es1 = transform_sample_counts(es, function(x) x ^ 2.5) expect_equal(otu_table(es1), otu_table(es) ^ 2.5, tolerance=0.1, info="exponentiation fail") # logarithm es1 = transform_sample_counts(es, function(x) log(x+10) ) expect_equal(otu_table(es1), log(otu_table(es) + 10), tolerance=0.1, info="logarithm fail") # Prune to a small subset. Need a test where "by-sample" matters. E.g. rank es = prune_taxa(taxa_names(es)[1:5], esophagus) es1 = transform_sample_counts(es, rank) ans = c(5, 2, 4, 2, 2, 5, 2.5, 4, 2.5, 1, 5, 1.5, 1.5, 3.5, 3.5) ans = otu_table(matrix(ans, ntaxa(es), nsamples(es), FALSE, list(taxa_names(es), sample_names(es))), taxa_are_rows=TRUE) expect_equal(otu_table(es1), ans, tolerance=0.1, info="rank fail") # test where "by-sample" matters, after transpose es = prune_taxa(taxa_names(esophagus)[1:5], t(esophagus)) es1 = transform_sample_counts(es, rank) ans = c(5, 2, 4, 2, 2, 5, 2.5, 4, 2.5, 1, 5, 1.5, 1.5, 3.5, 3.5) ans = otu_table(matrix(ans, nsamples(es), ntaxa(es), TRUE, list(sample_names(es), taxa_names(es))), taxa_are_rows=FALSE) expect_equal(otu_table(es1), ans, tolerance=0.1, info="rank fail") }) phyloseq/vignettes/0000755000175400017540000000000013177723156015470 5ustar00biocbuildbiocbuildphyloseq/vignettes/import_qiime_directory_structure.jpg0000644000175400017540000005773213175714136025106 0ustar00biocbuildbiocbuildJFIFKK@ICC_PROFILE0ADBEmntrRGB XYZ  3;acspAPPLnone-ADBE cprt2desc0kwtptbkptrTRCgTRCbTRCrXYZgXYZbXYZtextCopyright 2000 Adobe Systems IncorporateddescAdobe RGB (1998)XYZ QXYZ curv3curv3curv3XYZ OXYZ 4,XYZ &1/tExifMM*>F(iNKK OC  $" &0P40,,0bFJ:Ptfzxrfpnnpڢ|C"$$0*0^44^ƄpO " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?U_z`sqMH*_>O4+~}=dVCU'3 " !N?*<`~Y'@˝hy}TIv9- }M,%PQ%Iz{A-HH >n?*Y|8w4netPH$ϵlr(%TvW.S,jKxZ'v!60OEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP@@QE j""-i0*JdqQE4.F9FO3< Hhgo)+&9<.eF aHZ2SCm \$Φ_>ҧ=(})PlQ%9c(wZoJM'Ԝv2$42 }+OpE12}1SFM럡3ꪺ"~FDrO!OO;#82D rG4OO? u"Ңm>wͧҍҟE3ii@ }(})P6J6J}ͧҍҟE3ii@ }(})P6J6J}ͧҍҟE3ii@ }(})P6J6J}ͧҍҟE3ii@ }( w>(vJ6Jiiy̒N-g@ }(}(&+dfQS #4dE3iU;G@AA~PtQE!Ly' v$e{RMH1;w`9m?Φ R83aqP<ޕ%o|iYO6J4t-EXd?h$,sdc֯D602F+o8!bVbI *3c"*uZ]0DT(cn1L{eyگyRg?h tqIހ)7ݟ/;d3t*&߳OCp>&^ ߴaGZѢ*Zyi)׸E#8ddP?3FAeK PA#c57rw(VAҮQ@yD7&7o,~j@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@-Q@/b>hgl'NŎ<b% @ubP[̉6=+ZhP#<#$0RS h@]IQcCV-" 9FO!h'֒\Z2}i)C!iw4di4Lo@ pN F'Fj9_-yjGMi= =:vz6{rF`փ16{ѳހ 6(UJ{H)$F*z6{gM2/iZ];+0 Mލ Pٛs;7ROH{PQEQEQEQE#p(OJCsP1"yz$ !xM0:˗OUcpMg9YF7E֩`R+)']`mPI\]B\gi~>?/~vޝ$ ?dߔ1k^2&T[<8JbGl8 .ZMÞ5"vcH|(Lq-) ~4.뵁RG*qQ74>kW41 ʬ3Rp5T,,9NVee+s6VlYHt%M66Uwɏ~-wz<ػ8@F&HyrX8_xUŊ4UǠ}9 #; B03ݩ l)oR9?~,ƀ*"9$dbRIC"S}*v脳*n$r*M61ހ*4+S葊yX̠,G29 *M>nu R3D"Hp$nOIg,A(jǒK~#!Du—Gqn99h_Qd\p@g4K~y/f/俧@_Oր4fO֏%?ZLњ_%?ZjLJ׎Ҁ *LJ0=(:*LJ0=(:dq,l2Ku$`zPtT`zPtGҥP6;P((((((*}=}jh #?Zo#H}wM*X';H&Ƒ3A% άK ˌ tєUv K%ôq11 K`d۽0KpP@f ȠUFER[+lqZV,f#kchxXq@d,$1juY[,JJѡ',Č|8Y!DaW?RJ^h;$0*U3rs@(((((((}J(}~Ҁ%e Xd7)#>N #QRZY&,p0N=jhvCs,vX19 PzHoe)>h}¡9cTfp1u#Fbv94+oq=NӶo_-dpIap:fkH8.tǙ = $RNICڍ@Fjmo@Fjmo@Fjm݁BO~_)*ar@MPGןK1~j7T2J#e]4BYh}oiL.ffҁX9 Ue( *¡ 6j7UIJQЁǽ1Q ~^ڀ/oVYϑ \z}iVY*84c+ p6U4c34)9+Ӯ" @Qګ27|èk3N027@wQګV1>Oa#q"^ր$Fjmo@Fjm׎қ@ QڛE;88PI#]F,oTUJ *6mWIڍF+kgvU1n Qjk3LvӴ252RzQ@ E.>RQ@ E.>RQ@ E.>`=ޥ7?֛H֜F81|wMVBJ0}(ђHP@ >899񃚿HER%Yya7 m)(-VaW jP:Kp gv{V L &؏Ϊ wb(H jȂ0r"PG}&T a$ms֧J}cf! 320@XT =;Ҁ)[!` 65ydwPNr=P(®Vkv@=IlIW0}( @sޜƛH'x q@fB5E C,؀P3Nw>eP?FVh͓VA`(T0j>L1HRќ= /p"TeloҌJ0I6.XiuOV0}( i,Q3ж- nW0}( #!F RZB$}(ҌJJ)p}(ҌJJ_.z}>`PUheRс7kҌJm+9[h0cҀ)i9 9Iy+q1 J0}(N# (5:`R(;G((((((}y=GҤ_{cSГzw)@? ~Ϡ*o(r J hFTgV#3:b xYUsf4設^e]*'d;F4j͵Fc 6?,[SZԢҳ0 d^Z< #e9" rrZ`@(hp*h6O_V<J3V, t뚒Kn_N}q4vy[eA=)&ՏwhrL63sUmv(VX>bޞU(2LHsI1_ "C{tkYTBpsj[G‘r((((((((}J( Es`%Q>|Q]:|s22!FX=:K⸊V*pAaUvFj2 r@̈al6B+n8c“zhܢ<xg:wYZ٢}P`Lmpx)ҩq4vK@L,sF@Ѹn>n>)>fF@ѸI?Υ}hKϨԑ]sՏjsƏ[4F]WЎ)7Z7ZSQv☖C*,XezfѸ2˟ݺ**`B@&F@ w9X )aъO}h}hf*l4BJ">(5mʊ֍%=~L*+`yYB9(Rn>n>sz֑F9dR}H}h}h@9 Aa]޸qqX\E֔*a@⛸ѸQݱsh"=qqk^:Ҫ*} ֍րE3qqL}h}hS7Z7Z}֍րE3qqL}h}hS7Z7Z}S7Z@(Z7ZV'9xяPiLhE$t$t>n>s=xBFUϠ7qq`g4 Ќ9QPa(ҙ+h4PEPEPEPEPEPM?tsa\I [6;'SCHe pF(=9-̦?5BnHx/EQCn Lhjg} Dd˜-w9i\6T ĺv |0RZ209zrmOeŝjʀ .a51n$ڒ2p&tnr0Fs-Tɘ.?5%]iEǕpjH_npSzՉ!g_ܧ=h}QEgYy2mxZ]xH3`x<Y-YMY>ۚYm2s,.;*+' 9\ϸv$G/CMY|$`q( +E?}034~J%`IT%)w۷ʹGh+?:K&beR@<*ݺb_>NhiPv6uݦE7iiQ@ hiO<nFL'ϮGRrHv.Lg uGT%R@(M0Bym UIl援BsZnrjb&hiT;u3Rp&FMPqu>yl߼m3@hirŒch7+m2A;ii-w p[ҀѴ$Hxrc8hMM..S?0"ѴӨ4m4(MM:nFNѴӨ4m4(MM:nFNѴӨ4;)_@hiP66d)I݊p=]Z V6#%AOD^fw;ii}|qҬ2^Ҁ*K(%8/J(((M%eP= gԓrh=M(R'⥼f?Nrf'oChZڊWtӺ{Uir~b4XHIl'}Jn][l97$fy#`P 2wV5d]2+c\֍Fm2o*KX?NYo\:)""a#`# (R+ˏx.})j#nL?ѿƀ DQJl{+(r'#bQ@!Dha\4 ؙ6W])L H!1[xVG={Q@RhA>H=. [,Uq@Y6CqViBU` Z((((((((((}~Ҋ_ hyǎV N '~ zQ@4ȑ^(HT|>S\⴨ mYɟ=:Út4ۑ_;(HKPcieMX_>Ҁ+SEQEQEQEQESd<'P?B? '9A8?B̡q:Rv)+g8U^U˙*}^Р:rXV(HWm2#;|m;ֆe*;,w?9On*@ zF`X2jC#o Q,7O@ 3j^82!+<ʍ7cfNh4aRPEPEPEPEPEPEPEPEPEPEPEPEPEPEP@@QERnPK f\"v_ Xf PA}+V8 T -# Uwsrd{sjQI6\ EP[K9}=ju@ =M'qu-?*WSrޣ-?*.GF[~T\QMzʌoQQp4ܷzʁ'?fK(urF>q52\BJ;Z"bgG8r[q8v;j3Oj"I@3O"-6sIOUî?*c[DyI?_Z30chzʕi6byn[2vJ$_ʑ]W1nxSM!nuG3@nuG3@nuG3@nuG3@nuG3@nuG3@nFrUiPkzʝ-=,OxBKvisU,X*!Idt U.+0pC%p q`JȆbU QOOz{K"m9 k"Gcs]em=:3ڡs )Q߽%nN1?*ݎ:̊sң d@Xֆ&FI"dmx Zkᑀ'5*dܬX;TMݸzSr ms*miY*>*Tmzӑ]%lq@ uJc[*[Jl+2!9868~K}Mm3g\_ZuW^4p:zԙ 7Q 7Q 7Q 7Q 7Q 7Q 7Q 7Q 7Q 7R}i'@M$oĊrxLrj\eH.zs)22>4yscE OQK"HZ?,&}>fWefrCɓi&NqZb+|6 1W;eX0*'$$%zmPsH)Nd'h[i@0SýJWYݗH(bsI?jh`[?jX.VyOڳE SvEo)Gݫ4Q`[?jX.V[~jT`׵ |TX*~  `鿸) 6jj3LEo)Gݫ9#֕rݣ՚3E_)GݫY"Sv)Vh |SvcJDuC)4X.A?h;H)X.VyOڳE Sv`[?ji۔ , yOڳFE Svzњ,+yOGV}~X.VdLݫRʐ^C׸0@&Lݣɓ;D ,)y2v&OըqƟE/&Oڶ,sAdQ`Kɓ,2m/j/J,z(=MQEQEQEQEQE  '{#݉p?ƞ~?DyAc^&P~Y:pŃ+Ҵ( F/5` ֘?(vZTy$@ m)ٳڢhN^6fȕz?!@,XϷPZ=Ң6M䀿V28iIǭ85B22CFp7;BI@1\Kr0OךC_ƬFOPB1<-(]XqU~w4p>osZF 86 Cn:ZEFcrI{a€)L7iQ.sb?x}*F2r,ǑH|<\=3W!q( S1 /ڹb% I9$4zp:SdsA>ER$yr$!yC`޹ (pI?2Yė@ϗ??i?޽kJ0npZG`Bb%((((}@ )UT8cMWIc9ȫP{)rymF 1S B?Tʧ;UW8噙B,SaVP nGPmaHظh@lIuE4} Y_>GҀҌJ(ҌJ(ҌJ(ҌJ(ҌJ(ҌJ(ҙ>;*N4:TCjqZvMU9˕$ʣ凖C,X~B-zQUi6"G9$`{~4ߵMڟ3m@p=(ۣ [=סI~cBBn$ =(P##l%iRo+m7`@0=(S;H˕R=0J0=*\L :l6'Keu28l8`zUk30( ɮ7$0eSҀ.`zQUe'5j J0=*L0e ?=ѱdO=(&9GdNHTG=( ϓ@0=(h;p͞+\L'\H8 J0=* ?p~oc (UfIXwSsҙ:2Pc3hV y >jFA gҌJg\]ݻL o^,zQE`zQE`zQE`zQE`zP޼wP>IF-S"þ~ToҌJιwg vS;-`w$!AW }q `zT7,ZSn@"9ր-zQTnxT2c'=M-ʘ2$k@p=) Vśt $ p}(:)7RnQMFjunQMFjunQMiw@ P7?'z\ހשSZnߝ*I#<Y#/H9?TΌj]n}>Fyu"|ЃڍDi 4@y2]N)۽@n##dtL B#a~vd`խn Y<{~wfGy8*7cjMnf!QRF)MڢY~_RwFb$?֚jdp_ʦFjQ,X qJe`qHqwB֊f-#;r1RnwG|v ri@4$%H}n ~ ޥ6d/pw45ܮ9&j7{PVoŶ昶 ;Q#w1oi5B~&pFj쩝mn,;e.w%xnw:nj7{Pw:nj7{Pw:) OU&Y|^cQڀ {5vsHT2F;r)[,oX.j7PyLSa*3f69@J*O(L ;YOSIv# *GJF5 I?7@LRJTMG n#?Ҁ%kC0pNBKs1QN*1!&ݕݓ f6;t@ɂ U:[㟾Hր$J#<5nL*#|ABcfRFcOWth y}h˖ Jfg3yRa)KHc,UF~C-,N>-.mݞ#*ǔܞ t)4BAڟ+6i$A~hh&2V]"_>^6F~RV44%%%%% ngSoG4ӝi U9qRPtTPECc#892Rd+Hے5w(A#8Sd9q ltȩR4a(ꒊy`)#'wT@ ##############}Ԕ_@&2"q$Gt>@Ҹv>[X>ƍ1ά2"F8H#[^W@Wd m;ϹO1PAJueDv[E"Lۻ1S+e[R>Kgm`[rāp)Vg#Hfy6`i^\ ԁ.YUAԎ*o-w08E*@Z0C\FJjD#EQ1N_> cMƐ4P4n4P4n4P4n4Pcmr)~#(Bw@4WQ⣞o$/88I;q\jl_[ZrH8 [Taa[v[K ,>Ѹ2JO.44-4n5^2 p}*7SnΪ?Ҁ-4n5U{U_\P.b8 {ƍƫ;I!P$b$5wu@4n5]p̡2fB~u }?qqqqqqqqqqqqqqqqqqqqqqqqqqqqq1޿_I@ 7m2b1qqq0&]vd+Yɞ]s@1@77+HToH֝k+K_ ,n4n5Ԧ݃6e'8'lZVRyA?(GqV;GҪyxSHEX_>JT捦]]]#' 9=iXQ SeVu•2 9QNhڔT(:) kQ"qѴ(cr;RRlV66Pp20r84y˶wӁV66 zrTai"M̠kii +Q O7W9Zii iٗ9\Εv KTMMU3䷘7:q'bѴQKѴQKѴQKѴQKѴQKѴQKѴQKѴQKѴQKѴQKѴQKѴQKѴQKѴQKѴP>ivG T8n+,G Bp*!̒@X) MMWxd, ]HCL>.F@DX|΀Zo]c#軑֭m4m40;foA*UNiN((((? ὆?Ɔ'sMx~c(T84ꋹ('߅Eyj33)SB&2yB#=⨱v&QFJi@H>w-z@<趖hb9GI\.{zUVg7zd1$ HC9XKʅGL !pæq{zc;sޓ͏~1ww<m<;[1p9#l X%-'1펽)|޻j hJ'qPv;ݜ{9P,jZD XfYX7Cy?((((((((((((((((}J(}~Ҁ 1R?%@WGAo$\QfO>)>ddѓ@,RR1[j2}E$g.x8ǥIQ'.O>fO>$krM$l/)r}h"Pݺ2}hL'րE3'֌Zc[ɽv犚FO>fO>)>ddѓ@FO>fO>)>ddѓ@FO>fO>)>ddѓ@FO>fO>)>ddѓ@}JfO 'zހ,Qѓ@QQѓ@TqB0,K2}h (}h )3'֑I9@SEQEQEQE5_oMg'8~B$?{8nEUFH/#K zPvϖ6I`<{Q$R6% dR}=FӐA@%Cg%%Td ŽCP[ H&a9GƏ*8j/41rpN SnP2zh/9͟ImإIO],@F6';Ng 1,pr< eҒݱLY#a1婌 Wi-9Pm![Jkl8犳QJ%`O^x5%QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEZ(}~%Q@ Np*bXtza e~ j#,`U Kd5Fg=Zb>lG?}?~`O$hG 4kH?A"T+;/JdP[IɧJMlQ@ Fzuݞ:tݧ;xoi1^ONPA9G*WK&XT ANA?.zQ,C iN VVQP{ѳމ<ͿۜVTS } YFz%<2 : $ܶP=P%}p +NqG*6$U$eڀ'Fz ̒8_ݹd->&I]x=UA8nshKp1zPlH !>f RY~cpF(]l%HU&6 l{չsp̊mzPlBѢܧƧ1@FzܢVN3bnT9V\t>z6{Өg:nz6{Өg:nz6{Өg:nz6{Өg:nz6{Өg:nz6{Өg:nz|N}J~z6{Өg:ܴ$1ݞPl/ ItQ20Or *g=~MǖFrP:O4B $g'$ =>Qjv 8ܝ Np}(:( ( lwΝMr(*3/?:6>0G@_U$rYe.zVa@=-Rxe%` O`1Nv{Y_L "-|F(&_+ 8<ͺc#dAYH;W=vSk/$ΘbU%8KEPT˫;Fx*^XH,qmbzlQ $"9MZ*Ojfx0:6Dx29P[XWdՕKHp}(phyloseq/vignettes/phyloseq-FAQ.Rmd0000644000175400017540000005225213175714136020407 0ustar00biocbuildbiocbuild--- title: "phyloseq Frequently Asked Questions (FAQ)" date: "`r date()`" author: "Paul McMurdie and Susan Holmes" output: BiocStyle::html_document: fig_height: 7 fig_width: 10 toc: yes toc_depth: 2 number_sections: true vignette: > %\VignetteIndexEntry{phyloseq Frequently Asked Questions (FAQ)} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- This vignette includes answers and supporting materials that address [frequently asked questions (FAQs)](https://en.wikipedia.org/wiki/FAQ), especially those posted on [the phyloseq issues tracker](https://github.com/joey711/phyloseq/issues). For most issues [the phyloseq issues tracker](https://github.com/joey711/phyloseq/issues) should suffice; but occasionally there are questions that are asked repeatedly enough that it becomes appropriate to canonize the answer here in this vignette. This is both (1) to help users find solutions more quickly, and (2) to mitigate redundancy on [the issues tracker](https://github.com/joey711/phyloseq/issues). All users are encouraged to perform a google search and review other questions/responses to both open and closed issues on [the phyloseq issues tracker](https://github.com/joey711/phyloseq/issues) before seeking an active response by posting a new issue. ```{r, warning=FALSE, message=FALSE} library("phyloseq"); packageVersion("phyloseq") library("ggplot2"); packageVersion("ggplot2") theme_set(theme_bw()) ``` # - I tried reading my biom file using phyloseq, but it didn’t work. What’s wrong? The most common cause for this errors is derived from a massive change to the way biom files are stored on disk. There are currently two "versions" of the biom-format, each of which stores data very differently. The original format -- and original support in phyloseq -- was for biom-format version 1 based on [JSON](https://en.wikipedia.org/wiki/JSON). The latest version -- version 2 -- is based on the [HDF5](https://www.hdfgroup.org/HDF5/doc/UG/index.html) file format, and this new biom format version recently become the default file output format for popular workflows like QIIME. ## Good News: HDF5-biom should be supported in next release The *biomformat* package is the Bioconductor incarnation of R package support for the biom file format, written by Paul McMurdie (phyloseq author) and Joseph Paulson (metagenomeSeq author). Although it has been available on GitHub and BioC-devel for many months now, the first release version of *biomformat* on Bioconductor will be in April 2016. In that same release, phyloseq will switch over from the JSON-only *biom* package hosted on CRAN to this new package, *biomformat*, which simultaneously supports biom files based on either HDF5 or JSON. This difference will be largely opaque to users, and phyloseq will "just work" after the next release in April. Use the `import_biom` function to read your recent QIIME or other biom-format data. Additional back details are described in [Issue 443](https://github.com/joey711/phyloseq/issues/443). ## HDF5 (Version 2.0) biom-format: *biomformat* As just described, HDF5 biom format is currently supported in the development version of phyloseq, via the new beta/development package called *biomformat* on BioC-devel and GitHub: https://github.com/joey711/biomformat If you need to use HDF5-based biom format files **immediately** and cannot wait for the upcoming release, then you should install the development version of the *biomformat* package by following the instructions at the link above. ## Not every data component is included in .biom files Even though the biom-format supports the self-annotated inclusion of major components like that taxonomy table and sample data table, many tools that generate biom-format files (like QIIME, MG-RAST, mothur, etc.) do not export this data, even if you provided the information in your data input files. The reason for this boggles me, and I've shared my views on this with QIIME developers, but there nevertheless seems to be no plan to include your sample data in the ouput biom file. Furthermore, even though I have proposed it to the biom-format team, there is currently no support (or timeline for support) for inclusion of a phylogenetic tree within a ".biom" file. A number of tutorials are available demonstrating how one can add components to a phyloseq object after it has been created/imported. The following tutorial is especially relevant http://joey711.github.io/phyloseq-demo/import-biom-sd-example.html Which makes use of the following functions: - `import_qiime_sample_data` - `merge_phyloseq` ## Other issues related the biom-format There are a number of different Issue Tracker posts discussing this format with respect to phyloseq: https://github.com/joey711/phyloseq/issues/302 https://github.com/joey711/phyloseq/issues/272 https://github.com/joey711/phyloseq/issues/392 [Issue 443](https://github.com/joey711/phyloseq/issues/443) has details for updated format. # - `microbio_me_qiime()` returned an error. What’s wrong? ## The QIIME-DB Server is Permanently Down. The QIIME-DB server is permanently down. Users are suggested to migrate their queries over to Qiita. Indeed, the previous link to [microbio.me/qiime](http://www.microbio.me/qiime/index.psp) now sends users to the new Qiita website. ## An interface to Qiita is Planned. Stay tuned. The Qiita API needs to be released by the Qiita developers first. The phyloseq developers have no control over this, as we are not affiliated directly with the QIIME developers. Once there is an official Qiita API with documentation, an interface for phyloseq will be added. We found the `microbio_me_qiime()` function to be very convenient while the QIIME-DB server lasted. Hopefully an equivalent is hosted soon. # - I want a phyloseq graphic that looks like... Great! **Every plot function in phyloseq returns a ggplot2 object**. When these objects are "printed" to standard output in an R session, for instance, ```{r} data(esophagus) plot_tree(esophagus) ``` then the graphic is rendered in [the current graphic device](https://stat.ethz.ch/R-manual/R-devel/library/grDevices/html/Devices.html). Alternatively, if you save the object output from a phyloseq `plot_` function as a variable in your session, then you can further modify it, interactively, at your leisure. For instance, ```{r} p1 = plot_tree(esophagus, color = "Sample") p1 p1 + ggtitle("This is my title.") + annotate("text", 0.25, 3, color = "orange", label = "my annotation") ``` There are lots of ways for you to generate custom graphics with phyloseq as a starting point. The following sections list some of my favorites. ## Modify the ggplot object yourself. For example, [the plot_ordination() examples tutorial](http://joey711.github.io/phyloseq/plot_ordination-examples.html) provides several examples of using additional ggplot2 commands to modify/customize the graphic encoded in the ggplot2 object returned by `plot_ordination`. [The ggplo2 documentation](http://docs.ggplot2.org/current/) is the current and canonical online reference for creating, modifying, and developing with ggplot2 objects. For simple changes to aesthetics and aesthetic mapping, [the aesthetic specifications vignette](http://docs.ggplot2.org/current/vignettes/ggplot2-specs.html) is a useful resource. ## psmelt and ggplot2 The `psmelt` function converts your phyloseq object into a table (`data.frame`) that is very friendly for defining a custom ggplot2 graphic. This function was originally created as an internal (not user-exposed) tool within phyloseq to enable a [DRY](https://en.wikipedia.org/wiki/Don%27t_repeat_yourself) approach to building ggplot2 graphics from microbiome data represented as phyloseq objects. When applicable, the phyloseq `plot_` family of functions use `psmelt`. This function is now a documented and user-accessible function in phyloseq -- for the main purpose of enabling users to create their own ggplot2 graphics as needed. There are lots of great documentation examples for ggplot2 at - [the ggplot2 official documentation site](http://docs.ggplot2.org/current/), - [ggplot2 on StackOverflow](http://stackoverflow.com/tags/ggplot2), and - [phyloseq documentation pages](https://joey711.github.io/phyloseq/). The following are two very simple examples of using `psmelt` to define your own ggplot2 object "from scratch". It should be evident that you could include further ggplot2 commands to modify each plot further, as you see fit. ```{r} data("esophagus") mdf = psmelt(esophagus) # Simple bar plot. See plot_bar() for more. ggplot(mdf, aes(x = Sample, y = Abundance)) + geom_bar(stat = "identity", position = "stack", color = "black") # Simple heat map. See plot_heatmap() for more. ggplot(mdf, aes(x = Sample, y = OTU, fill = Abundance)) + geom_raster() ``` ## Submit a Pull Request (Advanced) If your new custom plot function is awesome and you think others might use it, add it to the `"plot-methods.R"` source file and submit a pull request on GitHub. [GitHub Official Pull Request Documentation](https://help.github.com/articles/using-pull-requests/) Please include example and test code in the code included in your pull request. I'll try and add it to the package by the next release. I will also give you authorship credit in the function doc. See the "typo fix" section below for further details about GitHub pull requests... ## Define a ggplot2 extension (Advanced) Development of new R functions/commands for creating/modifying new geometric objects is now formally documented in [the ggplot2 extension vignette](http://docs.ggplot2.org/current/vignettes/extending-ggplot2.html). This may be related to the previous section, in that your ggplot2 extension for phyloseq could be contributed to the phyloseq project as a pull request. # - There’s a typo in phyloseq documentation, tutorials, or vignettes This is something that is actually faster and less work for you to solve yourself and contribute back to the phyloseq package. For trivial typo fixes, I will quickly include your fixes into the package code. Sometimes I accept them on my cell phone while I'm still in bed. No wasted time on either end! :-) The point is that this should be simple, and is simple if you follow one of the following suggestions. ## Fix the typo directly on GitHub GitHub now provides the option to make changes to code/text of a repository directly from your web browser through an in-page editor. This handles all the Git details for you. If you have a GitHub account and you're logged in, all you'd have to do is locate the file with the offending typo, then use the "edit" button to make the changes and send the to me as a pull request. ## Minimal GIT and GitHub Exercise ![](http://i.imgur.com/j9NYXiQ.png) (The following instructions are borrowed from [Yihui Xie's site about fixing typos](http://yihui.name/en/2013/06/fix-typo-in-documentation/)) Alternatively, for those who want to try GIT and Github pull requests, which make it possible for you to contribute to open source and fix obvious problems with no questions being asked -- just do it yourself, and send the changes to the original author(s) through Github. The official documentation for Github pull requests is a little bit verbose for beginners. Basically what you need to do for simple tasks are: 1. click the Fork button and clone the repository in your own account; 2. make the changes in your cloned version; 3. push to your repository; 4. click the Pull Request button to send a request to the original author; # - I read ["Waste Not, Want Not..."](http://journals.plos.org/ploscompbiol/article?id=10.1371/journal.pcbi.1003531) but... Before getting to more specific issues, let's start by keeping appropriately separate the concept of - (1) denoising amplicon sequences, and/or denoising features in the contingency table, and - (2) standardization These two concepts have been often-conflated -- mostly by purveyors of methods that use rarefying -- wrongly insisting that rarefying is somehow addressing both problems and the matter is settled. Unfortunately rarefying is a very inefficient, noise-introducing method that poorly addresses the data analysis challenges that motivate either concept. DESeq2 and related solutions can help you address the need for standardization (e.g. differing library sizes) at a particular step in your analysis while still making efficient inferences from your data. The denoising problem is best addressed at the sequence-processing level, and the best general-purpose option currently available is: - [The dada2 algorithm](http://benjjneb.github.io/dada2/), if your data works well with it. Current support is mainly Illumina sequence data, or - [UPARSE](http://drive5.com/uparse/) in the usearch package, if you don't have sequencing data that works well with [dada2](http://benjjneb.github.io/dada2/) ## I tried to [use DESeq2](http://joey711.github.io/phyloseq-extensions/DESeq2.html) to normalize my data, but now I don't know what to do... The answer to a question of this category depends a lot on your experiment, and what you want to learn from your data. The following are some resources that may help. - [Waste Not, Want Not Supplemental Materials](http://joey711.github.io/waste-not-supplemental/) - [Differential Abundance Vignette](https://www.bioconductor.org/packages/release/bioc/vignettes/phyloseq/inst/doc/phyloseq-mixture-models.html) - [The phyloseq front page](https://joey711.github.io/phyloseq/) ## My libraries/samples had different total number of reads, what do I do? That is an expected artifact of current sequencing technologies, and not a "problem" on its own. In most cases, differences in total counts are uncorrelated with any variable in your experimental design. **You should check that this is the case**. It remains possible that there are structural/procedural artifacts in your experiment that have influenced the total counts. If library sizes are correlated with one of your design variables, then this *might* represent an artifact that you need to address more carefully. This is a decision that you will have to make and defend. No software package or workflow can address this for you, but phyloseq/R can certainly help you check for correlation. See the `sample_sums()` and `sample_data()` accessor functions. Other than the portent of structural biases in your experiment, you should recall that comparisons between observation classes that have **uneven sample sizes is not a new nor unsolved problem in statistics**. The most useful analytical methods you can use in this context are therefore methods that expect and account for differences in total number of reads between samples. How you account for these *library size* differences should depend on the type of analysis in which you are engaged, and which methods you plan to use. For instance, for a beta-diversity measure like Bray-Curtis Dissimilarity, you might simply use the relative abundance of each taxa in each sample, as the absolute counts are not appropriate to use directly in the context where count differences are not meaningful. For further information, see - ["Waste Not, Want Not..."](http://journals.plos.org/ploscompbiol/article?id=10.1371/journal.pcbi.1003531) - [Discussion for Issue 229](https://github.com/joey711/phyloseq/issues/229) - [Discussion for Issue 299](https://github.com/joey711/phyloseq/issues/299) ## Should I normalize my data before alpha-diversity analysis **No.** Generally speaking, the answer is **no**. Most alpha diversity methods will be most effective when provided with the originally-observed count values. The misleading notion -- that normalization is necessary prior to alpha-diversity analysis -- seems to be derived from various "one size fits all" pipeline tools like QIIME, in which it is often encouraged to [*rarefy*](http://journals.plos.org/ploscompbiol/article?id=10.1371/journal.pcbi.1003531) counts as a normalizing transformation prior to any/all analysis. While this may simplify certain aspects of pipeline software development, it is analytical and statistical folly. **Rarefying microbiome data is statistically inadmissible**. For further information, I suggest reviewing literature such as - [Gotelli Colwell (2001)](http://onlinelibrary.wiley.com/doi/10.1046/j.1461-0248.2001.00230.x/abstract;jsessionid=A5EF264ABB5EADD5CCE9EF3AEE50CA41.f01t03), and of course, - ["Waste Not, Want Not..."](http://journals.plos.org/ploscompbiol/article?id=10.1371/journal.pcbi.1003531) ## Negative numbers in my transformed data table? This sort of question usually appears after someone used a log-like transformation / variance stabilizing transformation on their data, in preparation for an exploratory analysis via ordination. Negative values in this context probably correspond to **"less than one count"** after rescaling. For many ordination methods, like [PCA](https://en.wikipedia.org/wiki/Principal_component_analysis), negative numbers are not a problem. Instead, the problem is often posed because a user also wants to use **a particular distance measure** that is undefined or unstable in the presence of negative entries. In this context, however, the more negative a value is, the more likely that it was zero, or very small, in the original "raw" count matrix. For most distances and hypotheses, these values are probably not very important, or even negligible. Given this, it is probably quite reasonable to do one of the following: (1) Set to zero all values less than zero. If `X` is your matrix, you can accomplish this with `X[X < 0.0] <- 0.0` (2) Add a pseudocount prior to data transformation. This often curbs or prevents the presence of zeroes in the table of transformed values. Some people don't like this approach for their dataset, and they may or may not be correct. It is up to you to decide for your data. See [Discussion on Issue 445](https://github.com/joey711/phyloseq/issues/445). Please also note that taxa entries that are all negative after transformation, or equivalently are very small or almost always zero, should probably be filtered from your data prior to analysis. There are many different reasons for this. ## I get an error regarding geometric mean See my [SO post on alternative geometric mean functions in R](http://stackoverflow.com/a/25555105/935950) There are several examples for alternative calculations of geometric mean, and some of these might solve the problem of having an error. See also the discussion on [Issue 445](https://github.com/joey711/phyloseq/issues/445) regarding geometric means. Alternative library size estimators may be appropriate for your data, and it remains your responsibility to determine if any specific approach is valid. Mike Love (a developer for DESeq2), suggested the following consideration: "On the other hand, very sparse count datasets, with large counts for single samples per row and the rest at 0, don't fit well to the negative binomial distribution. Here, the VST or simply shifted log, `log(count+k)`, might be a safer choice than the `rlog`. A way that I test for sparsity is looking at a plot of the row sum of counts and the proportion of count which is in a single sample." ## Pseudocounts are not appropriate for my data, because... See [Discussion on Issue 445](https://github.com/joey711/phyloseq/issues/445). Also, think carefully about what you mean here. I suspect this statement could be more accurately stated as, *pseudocounts are not appropriate for my experiment, data, and the analysis step I was about to perform*. Your position in this case is thus based on a combination of how the data appears to behave, and your knowledge of how pseudocounts would affect the analysis you were going to use. Consider the following. - Is there an alternative analysis method? - Is the method you were about to use really that sensitive to adding a pseucocount? - Is a pseudocount really needed, or were you copying/pasting this step to an analysis script that you found somewhere? ## I’m scared that the Negative Binomial doesn’t fit my data well See [Discussion on Issue 445](https://github.com/joey711/phyloseq/issues/445). ## I don’t know how to test for differential abundance now. How do I do that? There is now lots of documentation on this topic. For starters, please see [the phyloseq vignette devoted to this topic](http://bioconductor.org/packages/release/bioc/vignettes/phyloseq/inst/doc/phyloseq-mixture-models.html). A Google search for "phyloseq differential abundance" will also likely turn up a number of useful, related resources. # - I need help analyzing my data. It has the following study design... I am currently a biostatistician at Second Genome, Inc., which offers complete [end-to-end microbiome experiment solutions](http://www.secondgenome.com/solutions) as a fee-for-service. In some cases Second Genome clients already have their microbiome data and want to make use of our team of trained microbiome analysts to get the most information from their expeirment. I recommend contacting one of the sales associates at the link above. My day-to-day efforts are in understanding the role of the microbiome in human health and disease. If you're looking for a collaboration on your microbiome data collection or data analysis, please contact [Second Genome Solutions](http://www.secondgenome.com/solutions). phyloseq/vignettes/phyloseq-analysis.Rmd0000644000175400017540000011635313175714136021626 0ustar00biocbuildbiocbuild--- title: "Vignette for phyloseq: Analysis of high-throughput microbiome census data" output: BiocStyle::html_document: fig_height: 7 fig_width: 10 toc: yes toc_depth: 2 number_sections: true --- `r library("knitr")` `r opts_chunk$set(cache=FALSE, fig.width=9, message=FALSE, warning=FALSE)` Paul J. McMurdie and Susan Holmes [phyloseq Home Page](http://joey711.github.io/phyloseq/) If you find phyloseq and/or its tutorials useful, please acknowledge and cite phyloseq in your publications: **phyloseq: An R package for reproducible interactive analysis and graphics of microbiome census data** (2013) PLoS ONE 8(4):e61217 http://dx.plos.org/10.1371/journal.pone.0061217 # Other resources The phyloseq project also has a number of supporting online resources, most of which can by found at [the phyloseq home page](http://joey711.github.com/phyloseq/), or from the phyloseq stable release [page on Bioconductor](http://bioconductor.org/packages/release/bioc/html/phyloseq.html). To post feature requests or ask for help, try [the phyloseq Issue Tracker](https://github.com/joey711/phyloseq/issues). # Summary The analysis of microbiological communities brings many challenges: the integration of many different types of data with methods from ecology, genetics, phylogenetics, network analysis, visualization and testing. The data itself may originate from widely different sources, such as the microbiomes of humans, soils, surface and ocean waters, wastewater treatment plants, industrial facilities, and so on; and as a result, these varied sample types may have very different forms and scales of related data that is extremely dependent upon the experiment and its question(s). The phyloseq package is a tool to import, store, analyze, and graphically display complex phylogenetic sequencing data that has already been clustered into Operational Taxonomic Units (OTUs), especially when there is associated sample data, phylogenetic tree, and/or taxonomic assignment of the OTUs. This package leverages many of the tools available in R for ecology and phylogenetic analysis (vegan, ade4, ape, picante), while also using advanced/flexible graphic systems (ggplot2) to easily produce publication-quality graphics of complex phylogenetic data. phyloseq uses a specialized system of S4 classes to store all related phylogenetic sequencing data as single experiment-level object, making it easier to share data and reproduce analyses. In general, phyloseq seeks to facilitate the use of R for efficient interactive and reproducible analysis of OTU-clustered high-throughput phylogenetic sequencing data. # About this vignette A separate vignette is included within the phyloseq-package that describes the basics of importing pre-clustered phylogenetic sequencing data, data filtering, as well as some transformations and some additional details about the package and installation. A quick way to load it is: ```{r dontrun-basics-vignette, eval=FALSE} vignette("phyloseq-basics") ``` By contrast, this vignette is intended to provide functional examples of the analysis tools and wrappers included in phyloseq. All necessary code for performing the analysis and producing graphics will be included with its description, and the focus will be on the use of example data that is included and documented within the phyloseq-package. Let's start by loading the `phyloseq-package: ```{r load-packages, message=FALSE, warning=FALSE} library("phyloseq") library("ggplot2") ``` And because we will show examples of custom modifications to ggplot2 plots, we also loaded ggplot2 as well. Here I'll set as default my favorite ggplot2 theme. These are completely optional, and modifiable. ```{r ggplot2-themes} theme_set(theme_bw()) ``` # Data ## Interface with the microbio.me/qiime server See the [microbio_me_qiime tutorial](http://joey711.github.io/phyloseq/download-microbio.me.html) for more details and examples downloading and importing into phyloseq/R directly from this public database. ## Included Data To facilitate testing and exploration of tools in phyloseq, this package includes example data from published studies. Many of the examples in this vignette use either the [Global Patterns](http://www.pnas.org/content/early/2010/06/02/1000080107) or `enterotype` datasets as source data. The [Global Patterns](http://www.pnas.org/content/early/2010/06/02/1000080107) data was described in a [2011 article in PNAS](http://www.pnas.org/content/early/2010/06/02/1000080107)([Caporaso 2011](http://www.pnas.org/content/early/2010/06/02/1000080107)), and compares the microbial communities of 25 environmental samples and three known "mock communities" --- a total of 9 sample types --- at a depth averaging 3.1 million reads per sample. The [human enterotype dataset](http://www.nature.com/nature/journal/v473/n7346/full/nature09944.html) was described in a [2011 article in Nature](http://www.nature.com/nature/journal/v473/n7346/full/nature09944.html) ([Arumugam 2011](http://www.nature.com/nature/journal/v473/n7346/full/nature09944.html)), which compares the faecal microbial communities from 22 subjects using complete shotgun DNA sequencing. The authors further compare these microbial communities with the faecal communities of subjects from other studies, for a total of 280 faecal samples / subjects, and 553 genera. Sourcing data from different studies invariable leads to gaps in the data for certain variables, and this is easily handled by `R's core `NA features. Because this data is included in the package, the examples can easily be run on your own computer using the code shown in this vignette. The data is loaded into memory using the `data` command. Let's start by loading the [Global Patterns](http://www.pnas.org/content/early/2010/06/02/1000080107) data. ```{r} data(GlobalPatterns) ``` Later on we will use an additional categorical designation --- human versus non-human associated samples --- that was not in the original dataset. Now is a good time to add it as an explicit variable of the `sample_data`, and because we don't want to type long words over and over, we'll choose a shorter name for this modified version of [Global Patterns](http://www.pnas.org/content/early/2010/06/02/1000080107), call it `GP`, and also remove a handful of taxa that are not present in any of the samples included in this dataset (probably an artifact): ```{r } # prune OTUs that are not present in at least one sample GP <- prune_taxa(taxa_sums(GlobalPatterns) > 0, GlobalPatterns) # Define a human-associated versus non-human categorical variable: human <- get_variable(GP, "SampleType") %in% c("Feces", "Mock", "Skin", "Tongue") # Add new human variable to sample data: sample_data(GP)$human <- factor(human) ``` # Simple exploratory graphics ## Easy Richness Estimates For further details, see the [plot_richness tutorial](http://joey711.github.io/phyloseq/plot_richness-examples.html) We can easily create a complex graphic that compares the richness estimates of samples from different environment types in the [Global Patterns](http://www.pnas.org/content/early/2010/06/02/1000080107) dataset, using the `plot_richness` function. Note that it is important to use raw (untrimmed) OTU-clustered data when performing richness estimates, as they can be highly dependent on the number of singletons in a sample. ```{r richness_estimates0, fig.width=13, fig.height=7} alpha_meas = c("Observed", "Chao1", "ACE", "Shannon", "Simpson", "InvSimpson") (p <- plot_richness(GP, "human", "SampleType", measures=alpha_meas)) ``` Add a ggplot2 box plot layer to the previous plot ```{r richness_estimates, fig.width=13,height=7} p + geom_boxplot(data=p$data, aes(x=human, y=value, color=NULL), alpha=0.1) ``` Alpha diversity estimators for samples in the *Global Patterns* dataset. Each panel shows a different type of estimator. Individual color-shaded points and brackets represent the richness estimate and the theoretical standard error range associated with that estimate, respectively. The colors group the sample-sources into "types". Within each panel, the samples are further organized into human-associated (`TRUE`) or not (`FALSE`), and a boxplot is overlayed on top of this for the two groups, illustrating that these human-associated samples are less rich than the environmental samples (although the type of environment appears to matter a great deal as well). ## Exploratory tree plots For further details, see the [plot_tree tutorial](http://joey711.github.io/phyloseq/plot_tree-examples.html) phyloseq also contains a method for easily plotting an annotated phylogenetic tree with information regarding the sample in which a particular taxa was observed, and optionally the number of individuals that were observed. For the sake of creating a readable tree, let's subset the data to just the [Chlamydiae](http://en.wikipedia.org/wiki/Chlamydiae) phylum, which consists of obligate intracellular pathogens and is present in only a subset of environments in this dataset. ```{r } GP.chl <- subset_taxa(GP, Phylum=="Chlamydiae") ``` And now we will create the tree graphic form this subset of [Global Patterns](http://www.pnas.org/content/early/2010/06/02/1000080107), shading by the "`SampleType" variable, which indicates the environment category from which the microbiome samples originated. The following command also takes the option of labeling the number of individuals observed in each sample (if at all) of each taxa. The symbols are slightly enlarged as the number of individuals increases. ```{r GP-chl-tree, fig.width=15, fig.height=7, message=FALSE, warning=FALSE} plot_tree(GP.chl, color="SampleType", shape="Family", label.tips="Genus", size="Abundance") ``` Phylogenetic tree representation of the Chlamydiae species in the microbiome samples of the "Global Patterns" dataset([Caporaso 2011](http://www.pnas.org/content/early/2010/06/02/1000080107)). ## Exploratory bar plots For further details, see the [plot_bar tutorial](http://joey711.github.io/phyloseq/plot_bar-examples.html) In the following example we use the included "enterotype" dataset ([Arumugam 2011](http://www.nature.com/nature/journal/v473/n7346/full/nature09944.html)). ```{r} data(enterotype) ``` We start with a simple rank-abundance barplot, using the cumulative fractional abundance of each OTU in the dataset. In the enterotype dataset, the available published data are simplified as sample-wise fractional occurrences, rather than counts of individuals\footnote{Unfortunate, as this means we lose information about the total number of reads and associated confidences, ability to do more sophisticated richness estimates, etc. For example, knowing that we observed 1 sequence read of a species out of 100 total reads means something very different from observing 10,000 reads out of 1,000,000 total., and OTUs are clustered/labeled at the genus level, but no other taxonomic assignment is available. In this barplot we further normalized by the total number of samples (`r nsamples(enterotype)`). ```{r EntAbundPlot, fig.height=6, fig.width=8} par(mar = c(10, 4, 4, 2) + 0.1) # make more room on bottom margin N <- 30 barplot(sort(taxa_sums(enterotype), TRUE)[1:N]/nsamples(enterotype), las=2) ``` An example exploratory barplot using base `R graphics and the `taxa_sums and `nsamples functions. Note that this first barplot is clipped at the `r N`th OTU. This was chosen because `ntaxa(enterotype) =``r ntaxa(enterotype)` OTUs would not be legible on the plot. As you can see, the relative abundances have decreased dramatically by the 10th-ranked OTU. So what are these OTUs? In the `enterotype` dataset, only a single taxonomic rank type is present: ```{r} rank_names(enterotype) ``` This means the OTUs in this dataset have been grouped at the level of genera, and no other taxonomic grouping/transformation is possible without additional information (like might be present in a phylogenetic tree, or with further taxonomic classification analysis). We need to know which taxonomic rank classifiers, if any, we have available to specify in the second barplot function in this example, `plot_bar(). We have already observed how quickly the abundance decreases with rank, so wo we will subset the enterotype dataset to the most abundant `N taxa in order to make the barplot legible on this page. ```{r} TopNOTUs <- names(sort(taxa_sums(enterotype), TRUE)[1:10]) ent10 <- prune_taxa(TopNOTUs, enterotype) print(ent10) ``` Note also that there are `r nsamples(ent10)` samples in this dataset, and so a remaining challenge is to consolidate these samples into meaningful groups. A good place to look is the available sample variables, which in most cases will carry more "meaning" than the sample names alone. ```{r} sample_variables(ent10) ``` The parameters to `plot_bar` in the following code-chunk were chosen after various trials. We suggest that you also try different parameter settings while you're exploring different features of the data. In addition to the variables names of `sample_data`, the `plot_bar()` function recognizes the names of taxonomic ranks (if present). See the help documentation and further details in the examples and on the wiki page. In this example we have also elected to organize data by "facets" (separate, adjacent sub-plots) according to the genus of each OTU. Within each genus facet, the data is further separated by sequencing technology, and the enterotype label for the sample from which each OTU originated is indicated by fill color. Abundance values from different samples and OTUs but having the same variables mapped to the horizontal (`x`) axis are sorted and stacked, with thin horizontal lines designating the boundaries. With this display it is very clear that the choice of sequencing technology had a large effect on which genera were detected, as well as the fraction of OTUs that were assigned to a Genus. ```{r entbarplot0, fig.height=6, fig.width=10} plot_bar(ent10, "SeqTech", fill="Enterotype", facet_grid=~Genus) ``` An example exploratory bar plot using the `plot_bar` function. In this case we have faceted the data (abundance values) according to the genera of each OTU. The subset of OTUs that have not been assigned to a specific genus are in the `NA` panel. Within each facet, the data is further separated by sequencing technology, and each OTU is shaded according to the enterotype of the sample it form which it came. Abundance values from different samples and OTUs but having the same variables mapped to the horizontal (`x`) axis are sorted and stacked, with thin horizontal lines designating the boundaries. Figure summarizes quantitatively the increased abundances of Bacteroides and Prevotella in the Enterotypes 1 and 2, respectively. Interestingly, a large relative abundance of Blautia was observed for Enterotype 3, but only from 454-pyrosequencing data sets, not the Illumina or Sanger datasets. This suggests the increased Blautia might actually be an artifact. Similarly, Prevotella appears to be one of the most abundant genera in the Illumina-sequenced samples among Enterotype 3, but this is not reproduced in the 454-pyrosequencing or Sanger sequencing data. # Exploratory analysis and graphics ## Exploratory Heat Map For further details, see the [plot_heatmap tutorial](http://joey711.github.io/phyloseq/plot_heatmap-examples.html) As the number of taxa in a dataset gets very large, the ability to effectively display all of the elements of the data becomes compromised, and a heatmap representation is no exception. It can also be time-consuming to render. To address both these issues, we show an example in which we have subsetted the Global Patterns dataset to a manageable portion, in this case, the Crenarchaeota phylum. ```{r GPheatmap} data("GlobalPatterns") gpac <- subset_taxa(GlobalPatterns, Phylum=="Crenarchaeota") (p <- plot_heatmap(gpac, "NMDS", "bray", "SampleType", "Family")) ``` What if you wanted to change the axis labels? ```{r GPheatmap-rename-axes} p$scales$scales[[1]]$name <- "My X-Axis" p$scales$scales[[2]]$name <- "My Y-Axis" print(p) ``` Note that it is possible to order the sample/species indices by any of the ordination methods supported in the `ordinate` function; and also that the color scheme can be modified with additional arguments. Heat map representation of the Crenarchaeota phylum abundance pattern across different sample types in the Global Patterns dataset. ## Microbiome Network Representation For further details, see the [plot_network tutorial](http://joey711.github.io/phyloseq/plot_network-examples.html) Continuing with the `enterotype` dataset, here are some examples for creating a custom network representation of the relationship between microbiome samples in an experiment. This relies heavily on the igraph and ggplot2 packages to create a network display of the "connectedness" of samples according to some user-provided ecological similarity. By default, points represent microbiom samples, and are determined using an algorithm that optimizes the clarity of the display of network "edges", but the spatial position of points does not imply any continuous similarity information like would be the case in an ordination. In this example, the default dissimilarity index was used (Jaccard, co-occurrence), with a maximum distance of `0.3` required to create an edge. Any function that can operate on phyloseq-objects and return a sample-wise distance can be provided as the `dist.fun` argument, or a character string of the name of the distance function already supported in phyloseq. Other distances may result in very different clustering, and this is a choice that should be understood and not taken too lightly, although there is little harm in trying many different distances. Interestingly, at this level of analysis and parameter-settings the two major sub-graphs appear to be best explained by the sequencing technology and not the subject enterotype, suggesting that the choice of sequencing technology has a major effect on the microbial community one can observe. This seems to differ somewhat with the inferences described in the "enterotype" article ([Arumugam 2011](http://www.nature.com/nature/journal/v473/n7346/full/nature09944.html)). However, there could be some confounding or hidden variables that might also explain this phenomenon, and the well-known differences in the sequence totals between the technologies may also be an important factor. Furthermore, since this is clearly an experimental artifact (and they were including data from multiple studies that were not orginally planned for this purpose), it may be that the enterotype observation can also be shown in a network analysis of this data after removing the effect of sequencing technology and related sequencing effort. Such an effort would be interesting to show here, but is not yet included. ```{r plot_sample_network, fig.width=11, fig.height=7, message=FALSE, warning=FALSE} data(enterotype) plot_net(enterotype, maxdist=0.4, color="SeqTech", shape="Enterotype") ``` Network representation of the relationship between microbiome samples in the "Enterotype" dataset ([Arumugam 2011](http://www.nature.com/nature/journal/v473/n7346/full/nature09944.html)). ## Ordination Methods For further details, see the [plot_ordination tutorial](http://joey711.github.io/phyloseq/plot_ordination-examples.html) Ordination methods can be a useful tool for exploring complex phylogenetic sequencing data, particularly when the hypothesized structure of the data is poorly defined (or there isn't a hypothesis). The phyloseq package provides some useful tools for performing ordinations and plotting their results, via the `ordinate() and `plot_ordination() functions, respectively. Although there are many options and methods supported, a first-step will probably look something like the following: ```{r eval=FALSE} my.physeq <- import("Biom", BIOMfilename="myBiomFile.biom") my.ord <- ordinate(my.physeq) plot_ordination(my.physeq, my.ord, color="myFavoriteVarible") ``` It is probably a good idea to read the documentation for these two functions, as they also provide links to related functions and additional examples you can try immediately on your own machine. ```{r help-import, eval=FALSE} help(import) help(ordinate) help(distance) help(plot_ordination) ``` ### Principal Coordinates Analysis (PCoA) We take as our first example, a reproduction of Figure 5 from the "Global Patterns" article([Caporaso 2011](http://www.pnas.org/content/early/2010/06/02/1000080107)). The authors show a 3-dimensional representation of the first three axes of a Principal Coordinates Analysis (PCoA; This is also sometimes referred to as "Multi-Dimensional Scaling", or "MDS") performed on the unweighted-UniFrac distance using all of the available sequences (their approach included both 5' and 3' sequences). According to the authors, "the first axis [appears to be associated with a] host associated/free living [classification]," and similarly the third axis with "saline/nonsaline environment[s]." The following reproduces the unweighted UniFrac distance calculation on the full dataset. Note that this calculation can take a long time because of the large number of OTUs. Parallelization is recommended for large datasets, typically if they are as large as [Global Patterns](http://www.pnas.org/content/early/2010/06/02/1000080107), or larger. For details on parallelization, see the details section and examples in the `UniFrac()` documentation, and also the page dedicated to the topic on [the phyloseq-demos site](http://joey711.github.io/phyloseq-demo/): http://joey711.github.io/phyloseq-demo/unifrac.html ```{r GP-data-load} data(GlobalPatterns) ``` ```{r, eval=FALSE} GPUF <- UniFrac(GlobalPatterns) ``` Load the pre-computed distance matrix, `GPUF` ```{r load-precomputed-UF} load(system.file("doc", "Unweighted_UniFrac.RData", package="phyloseq")) ``` Calculate the PCoA on this distance matrix, `GPUF`. ```{r} GloPa.pcoa = ordinate(GlobalPatterns, method="PCoA", distance=GPUF) ``` Before we look at the results, let's first investigate how much of the total distance structure we will capture in the first few axes. We can do this graphically with a "scree plot", an ordered barplot of the relative fraction of the total eigenvalues associated with each axis. ```{r PCoAScree, fig.width=6, fig.height=4} plot_scree(GloPa.pcoa, "Scree plot for Global Patterns, UniFrac/PCoA") ``` Scree plot of the PCoA used to create Figure 5 from the "Global Patterns" article([Caporaso 2011](http://www.pnas.org/content/early/2010/06/02/1000080107)). The first three axes represent `r round(100*sum(GloPa.pcoa$values$Relative_eig[1:3]))`% of the total variation in the distances. Interestingly, the fourth axis represents another `r round(100*(GloPa.pcoa$values$Relative_eig[4]))`%, and so may warrant exploration as well. A scree plot is an important tool for any ordination method, as the relative importance of axes can vary widely from one dataset to another. Next, we will reproduce Figure 5 from the "Global Patterns" article([Caporaso 2011](http://www.pnas.org/content/early/2010/06/02/1000080107)), but separating the three axes into 2 plots using `plot_ordination()`. ```{r GPfig5ax1213} (p12 <- plot_ordination(GlobalPatterns, GloPa.pcoa, "samples", color="SampleType") + geom_point(size=5) + geom_path() + scale_colour_hue(guide = FALSE) ) (p13 <- plot_ordination(GlobalPatterns, GloPa.pcoa, "samples", axes=c(1, 3), color="SampleType") + geom_line() + geom_point(size=5) ) ``` A reproduction in phyloseq / R of the main panel of Figure 5 from the "Global Patterns" article([Caporaso 2011](http://www.pnas.org/content/early/2010/06/02/1000080107)), on two plots. The horizontal axis represents the first axis in the PCoA ordination, while the top and bottom vertical axes represent the second and third axes, respectively. Different points represent different samples within the dataset, and are shaded according to the environment category to which they belong. The color scheme is the default used by ggplot. ### non-metric Multi-Dimensional Scaling (NMDS) We repeat the previous example, but instead using non-metric multidimensional scaling (NMDS) limited to just two dimensions. This approach limits the amount of residual distance "not shown" in the first two (or three) axes, but forefeits some mathematical properties and does not always converge within the specified number of axes. ```{r GP_UF_NMDS0} # (Re)load UniFrac distance matrix and GlobalPatterns data data(GlobalPatterns) load(system.file("doc", "Unweighted_UniFrac.RData", package="phyloseq")) # perform NMDS, set to 2 axes GP.NMDS <- ordinate(GlobalPatterns, "NMDS", GPUF) (p <- plot_ordination(GlobalPatterns, GP.NMDS, "samples", color="SampleType") + geom_line() + geom_point(size=5) ) ``` An example exploratory ordination using non-metric multidimensional scaling (NMDS) on the unweighted UniFrac distance between samples of the "Global Patterns" dataset. Sample points are shaded by environment type, and connected by a line if they belong to the same type. Compare with Figure 5 from the "Global Patterns" article([Caporaso 2011](http://www.pnas.org/content/early/2010/06/02/1000080107)). The figure nicely shows the relative dissimilarities between microbial communities from different habitats. However, it fails to indicate what was different between the communities. For an ordination method that provides information on the taxa that explain differences between samples (or groups of samples), we use Correspondence Analysis. ### Correspondence Analysis (CA) In the following section we will show continue our exploration of the "GlobalPatterns" dataset using various features of an ordination method called Correspondence Analysis. We give special emphasis to exploratory interpretations using the biplot, because it provides additional information that is not available from PCoA or NMDS. Let's start by performing a Correspondence Analysis and investigating the scree plot. Both interestingly and challengingly, the scree plot suggests that the [Global Patterns](http://www.pnas.org/content/early/2010/06/02/1000080107) abundance data is quite high-dimensional, with the first two CA axes accounting for not quite 17% of the total (chi-square) variability. Note the absence of a steep decline in eigenvalue fraction as axis number increases. Each additional axis represents only marginally less variability than the previous. It is often more convenient if the first two (or three) axes account for most of the variability. First, let's severely subset the number of species for the sake of run-time.\footnote{This is for illustration purposes only, do not repeat unless you are very sure you have a good reason for doing this. ```{r GPCAscree0, fig=FALSE} data(GlobalPatterns) # Take a subset of the GP dataset, top 200 species topsp <- names(sort(taxa_sums(GlobalPatterns), TRUE)[1:200]) GP <- prune_taxa(topsp, GlobalPatterns) # Subset further to top 5 phyla, among the top 200 OTUs. top5ph <- sort(tapply(taxa_sums(GP), tax_table(GP)[, "Phylum"], sum), decreasing=TRUE)[1:5] GP <- subset_taxa(GP, Phylum %in% names(top5ph)) # Re-add human variable to sample data: sample_data(GP)$human <- factor(human) ``` Now perform the correspondence analysis. ```{r GPCAscree, fig.width=8, fig.height=5} # Now perform a unconstrained correspondence analysis gpca <- ordinate(GP, "CCA") # Scree plot plot_scree(gpca, "Scree Plot for Global Patterns Correspondence Analysis") ``` The correspondence analysis (CA) scree plot of the "Global Patterns" dataset. Now let's investigate how the samples behave on the first few CA axes. ```{r GPCA1234} (p12 <- plot_ordination(GP, gpca, "samples", color="SampleType") + geom_line() + geom_point(size=5) ) (p34 <- plot_ordination(GP, gpca, "samples", axes=c(3, 4), color="SampleType") + geom_line() + geom_point(size=5) ) ``` First 4 axes of Correspondence Analysis (CA) of the "Global Patterns" dataset ([Caporaso 2011](http://www.pnas.org/content/early/2010/06/02/1000080107)). A clear feature of these plots is that the feces and mock communities cluster tightly together, far away from all other samples on the first axis (CA1). The skin and tongue samples separate similarly, but on the second axis. Taken together, it appears that the first two axes are best explained by the separation of human-associated "environments" from the other non-human environments in the dataset, with a secondary separation of tongue and skin samples from feces. We will now investigate further this top-level structure of the data, using an additional feature of correspondence analysis that allows us to compare the relative contributions of individual taxa on the same graphical space: the "biplot". However, because we just displayed the position of samples in the ordination and there are often many thousands of OTUs, we will focus on creating an interpretable plot of the OTUs. For creating graphics that combine the two plots, try the `"biplot"` or `"split"` option for `type` in `plot_ordination()`. ```{r GPCAspecplot0} p1 <- plot_ordination(GP, gpca, "species", color="Phylum") (p1 <- ggplot(p1$data, p1$mapping) + geom_point(size=5, alpha=0.5) + facet_wrap(~Phylum) + scale_colour_hue(guide = FALSE) ) ``` Species plot of the "Global Patterns" correspondence analysis first two axes, with each phylum on a different panel ("facet"). Only the most abundant 5 phyla among the most abundant 200 taxa (cumulative, all samples) are included. Arbitrary reduction, for computational efficiency of example. Let's try drawing the figure again, only this time summarizing the species points as a 2D density estimate, without any individual points. ```{r GPCAspecplotTopo0} (p3 <- ggplot(p1$data, p1$mapping) + geom_density2d() + facet_wrap(~Phylum) + scale_colour_hue(guide = FALSE) ) ``` Redrawn figure, which is severely overplotted, as a 2-dimensional species-density topographic map, faceted in the same way. These figures reveal some useful patterns and interesting outliers, but what if we want a complete summary of how each phylum is represented along each axis? The following code is a way to show this using boxplots, while still avoiding the occlusion problem (points layered on top of each other), and also conveying some useful information about the pattern of taxa that contribute to the separation of human-associated samples from the other sample types. It re-uses the data that was stored in the `ggplot2` plot object created in the previous figure, `p`, and creates a new boxlot graphical summary of the positions of each phylum. ```{r GPCAjitter0} library("reshape2") # Melt the species-data.frame, DF, to facet each CA axis separately mdf <- melt(p1$data[, c("CA1", "CA2", "Phylum", "Family", "Genus")], id=c("Phylum", "Family", "Genus") ) # Select some special outliers for labelling LF <- subset(mdf, variable=="CA2" & value < -1.0) # build plot: boxplot summaries of each CA-axis, with labels p <- ggplot(mdf, aes(Phylum, value, color=Phylum)) + geom_boxplot() + facet_wrap(~variable, 2) + scale_colour_hue(guide = FALSE) + theme_bw() + theme( axis.text.x = element_text(angle = -90, vjust = 0.5) ) # Add the text label layer, and render ggplot graphic (p <- p + geom_text(data=subset(LF, !is.na(Family)), mapping = aes(Phylum, value+0.1, color=Phylum, label=Family), vjust=0, size=2)) ``` Boxplot of taxa (species in this case) of the "Global Patterns" CA first two axes, shaded/separated by phylum. Through this approach it is much easier to see particular species that cluster unusually relative to the rest of their phylum, for example the Bacteroidetes species (Prevotellaceae family) that is positioned most in the negative CA2 direction toward the Tongue/Skin samples. One way to relate some of the high-level patterns we observed from correspondence analysis is to directly visualize the abundances in an organized, quantitative way, to see if this does in fact support / explain the human/environment microbiome differences. Here is an example using the `plot_bar` function described in an earlier section. ```{r GPtaxaplot0} plot_bar(GP, x="human", fill="SampleType", facet_grid= ~ Phylum) ``` Phylum-level comparison of relative abundance of taxa in samples that are from human microbiomes (or not). In this figure we've used the `threshold` parameter to omit all but phyla accounting for the top 90% of phyla in any one sample. Some patterns emerging from this display appear to be: (1) Cyanobacteria, Actinobacteria appear under-represented in human samples; (2) conversely, Firmicutes appear over-represented in human samples; (3) Acidobacteria, Verrucomicrobia appear over-represented in the fecal samples; (4) the only Crenarchaeota were observed in the Mock sample, which is not really a community but a simulated community used as a control. These are not hugely surprising based on previous biological observations from the field, but it is hopefully useful code that can be applied on other datasets that you might have. ### Double Principle Coordinate Analysis (DPCoA) Here is a quick example illustrating the use of Double Principal Coordinate Analysis (DPCoA~\cite{Pavoine2004523), using the using the `ordinate()` function in phyloseq, as well as the "biplot" option for `plot_ordination(). For a description that includes an applied example using the "enterotype" dataset and comparison with UniFrac/PCoA, see Fukuyama et al~\cite{fukuyama2012com. ```{r GPdpcoa01} GP.dpcoa <- ordinate(GP, "DPCoA") pdpcoa <- plot_ordination(GP, GP.dpcoa, type="biplot", color="SampleType", shape="Phylum") shape.fac <- pdpcoa$data[, deparse(pdpcoa$mapping$shape)] man.shapes <- c(19, 21:25) names(man.shapes) <- c("Samples", levels(shape.fac)[levels(shape.fac)!="Samples"]) p2dpcoa <- pdpcoa + scale_shape_manual(values=man.shapes) ``` A biplot representation of a Double Principal Coordinate Analysis (DPCoA), on a simplified version of the "Global Patterns" dataset with only the most abundant 200 OTUs included. ```{r GPdpcoa02} # Show just Samples or just Taxa plot_ordination(GP, GP.dpcoa, type="taxa", shape="Phylum") plot_ordination(GP, GP.dpcoa, type="samples", color="SampleType") # Split plot_ordination(GP, GP.dpcoa, type="split", color="SampleType", shape="Phylum") + ggplot2::scale_colour_discrete() ``` ## Distance Methods ### distance(): Central Distance Function Many comparisons of microbiome samples, including the graphical model and the PCoA analysis, require a calculation for the relative dissimilarity/distance between one microbial community and another. The phyloseq-package provides a general "wrapper" function for calculating ecological distance matrices between the samples in an experiment. `distance()` currently supports 43 method options, as well as user-provided arbitrary methods via an interface to vegan's `designdist()` function. Currrently only sample-wise distances are supported (the `type` argument), but eventually species-wise (OTU-wise) distances will be supported as well. In addition to supporting any of the method options to the three main distance functions of the vegan-package~\cite{veganpkg --- including the 14 distances of the `vegdist()` function and all 24 ecological distances reviewed in Koleff et al. 2003~\cite{Koleff2003JAE coded by `betadiver` --- `distance()` will eventually support many of the distance methods in the ade4-package~\cite{Dray:2007vs, and others. It also supports the Fast UniFrac distance function (Section~\ref{sec:unifrac) included in phyloseq as native R code, and a wrapper for retreiving the sample-distances from Double Principal Coordinate Analysis (DPCoA). The function takes a `phyloseq-class` object and an argument indicating the distance type; and it returns a `dist-class distance matrix. ```{r distancefun} data(esophagus) distance(esophagus, "bray") distance(esophagus, "wunifrac") # weighted UniFrac distance(esophagus, "jaccard") # vegdist jaccard distance(esophagus, "g") # betadiver method option "g" ``` ### UniFrac and weighted UniFrac UniFrac is a recently-defined~\cite{Lozupone:2005gn and popular distance metric to summarize the difference between pairs of ecological communities. All UniFrac variants use a phylogenetic tree of the relationship among taxa as central information to calculating the distance between two samples/communities. An unweighted UniFrac distance matrix only considers the presence/absence of taxa, while weighted UniFrac accounts for the relative abundance of taxa as well as their phylogenetic distance. Prior to phyloseq, a non-parallelized, non-Fast implementation of the unweighted UniFrac was available in \R{ packages (`picante::unifrac`~\cite{Kembel:2010ft). In the phyloseq package we provide optionally-parallelized implementations of Fast UniFrac~\cite{Hamady:2009fk (both weighted and unweighted, with plans for additional UniFrac variants), all of which return a sample-wise distance matrix from any `phyloseq-class object that contains a phylogenetic tree component. The following is an example calculating the UniFrac distance (both weighted and unweighted) matrix using the "esophagus" example dataset: ```{r eval=FALSE, echo=TRUE} data(esophagus) distance(esophagus, "wUniFrac") distance(esophagus, "uUniFrac") ``` See the phyloseq demo page about fast parallel UniFrac. ## Hierarchical Clustering Another potentially useful and popular way to visualize/decompose sample-distance matrices is through hierarchical clustering (e.g. `hclust`). In the following example, we reproduce Figure~4 from the ["Global Patterns" article](http://www.pnas.org/content/early/2010/06/02/1000080107), using the unweighted UniFrac distance and the UPGMA method (`hclust` parameter `method="average"`). Try `help("hclust")` for alternative clustering methods included in standard R. ```{r} # (Re)load UniFrac distance matrix and GlobalPatterns data data(GlobalPatterns) load(system.file("doc", "Unweighted_UniFrac.RData", package="phyloseq")) # Manually define color-shading vector based on sample type. colorScale <- rainbow(length(levels(get_variable(GlobalPatterns, "SampleType")))) cols <- colorScale[get_variable(GlobalPatterns, "SampleType")] GP.tip.labels <- as(get_variable(GlobalPatterns, "SampleType"), "character") # This is the actual hierarchical clustering call, specifying average-link clustering GP.hclust <- hclust(GPUF, method="average") plot(GP.hclust, col=cols) ``` An alternative means of summarizing a distance matrix via hierarchical clustering and plotting as an annotated dendrogram. Compare with Figure 4 from the [Global Patterns](http://www.pnas.org/content/early/2010/06/02/1000080107)). Some differences in Figure~\ref{fig:GPfig4 from the original article might be explained by [Global Patterns](http://www.pnas.org/content/early/2010/06/02/1000080107) in phyloseq being the summed observations from both primer directions (5' and 3'), while in the article they show the results separately. Furthermore, in the article the "mock" community is not included in the dataset, but an extra fecal sample is included. # Multiple Testing and Differential Abundance One of our recommended approaches to this problem was described in McMurdie and Holmes (2014) [Waste Not, Want Not: Why Rarefying Microbiome Data is Inadmissible](http://dx.plos.org/10.1371/journal.pcbi.1003531). PLoS Computational Biology. 10(4):e1003531 Some reproducible demonstrations of this approach are included in [the phyloseq extensions repository](http://joey711.github.io/phyloseq-extensions/extensions-index.html), the `phyloseq_to_deseq2` function, as well as a separate vignetted dedicated to this topic (phyloseq and DESeq2 on Colorectal Cancer Data). Please make use of these materials for differential abundance testing. phyloseq/vignettes/phyloseq-basics.Rmd0000644000175400017540000011007513175714136021242 0ustar00biocbuildbiocbuild--- title: "Basic storage, access, and manipulation of phylogenetic sequencing data with *phyloseq*" output: BiocStyle::html_document: fig_height: 7 fig_width: 10 toc: yes toc_depth: 2 number_sections: true --- `r library("knitr")` `r opts_chunk$set(cache=FALSE, fig.width=9, message=FALSE, warning=FALSE)` Paul J. McMurdie and Susan Holmes [phyloseq Home Page](http://joey711.github.io/phyloseq/) If you find phyloseq and/or its tutorials useful, please acknowledge and cite phyloseq in your publications: **phyloseq: An R package for reproducible interactive analysis and graphics of microbiome census data** (2013) PLoS ONE 8(4):e61217 http://dx.plos.org/10.1371/journal.pone.0061217 ## Other resources The phyloseq project also has a number of supporting online resources, most of which can by found at [the phyloseq home page](http://joey711.github.com/phyloseq/), or from the phyloseq stable release [page on Bioconductor](http://bioconductor.org/packages/release/bioc/html/phyloseq.html). To post feature requests or ask for help, try [the phyloseq Issue Tracker](https://github.com/joey711/phyloseq/issues). # Introduction The analysis of microbiological communities brings many challenges: the integration of many different types of data with methods from ecology, genetics, phylogenetics, network analysis, visualization and testing. The data itself may originate from widely different sources, such as the microbiomes of humans, soils, surface and ocean waters, wastewater treatment plants, industrial facilities, and so on; and as a result, these varied sample types may have very different forms and scales of related data that is extremely dependent upon the experiment and its question(s). The phyloseq package is a tool to import, store, analyze, and graphically display complex phylogenetic sequencing data that has already been clustered into Operational Taxonomic Units (OTUs), especially when there is associated sample data, phylogenetic tree, and/or taxonomic assignment of the OTUs. This package leverages many of the tools available in R for ecology and phylogenetic analysis (vegan, ade4, ape, picante), while also using advanced/flexible graphic systems (ggplot2) to easily produce publication-quality graphics of complex phylogenetic data. phyloseq uses a specialized system of S4 classes to store all related phylogenetic sequencing data as single experiment-level object, making it easier to share data and reproduce analyses. In general, phyloseq seeks to facilitate the use of R for efficient interactive and reproducible analysis of OTU-clustered high-throughput phylogenetic sequencing data. # About this vignette ## Typesetting Legend - **bold** - Bold is used for emphasis. - *italics* - Italics are used for package names, and special words, phrases. - `code font` - The font for code, usually courrier-like, but depends on the theme. - `myFun()` - Code font word with `()` attached at the right-end, is a function name. - [Hyperlink](#sec:typeset-legend) - Hyperlinks are clickable text that will jump to sections and external pages. ## Other links and tutorials An overview of phyloseq's intended functionality, goals, and design is provided in the following free and open access article: McMurdie and Holmes (2013). [phyloseq: An R package for reproducible interactive analysis and graphics of microbiome census data](http://dx.plos.org/10.1371/journal.pone.0061217). PLoS ONE e61217. The most updated examples are posted in our online tutorials from [the phyloseq home page](http://joey711.github.com/phyloseq) A separate vignette describes analysis tools included in phyloseq along with various examples using included example data. A quick way to load it is: ```{r, eval=FALSE} vignette("phyloseq_analysis") ``` By contrast, this vignette is intended to provide functional examples of the basic data import and manipulation infrastructure included in phyloseq. This includes example code for importing OTU-clustered data from different clustering pipelines, as well as performing clear and reproducible filtering tasks that can be altered later and checked for robustness. The motivation for including tools like this in phyloseq is to save time, and also to build-in a structure that requires consistency across related data tables from the same experiment.This not only reduces code repetition, but also decreases the likelihood of mistakes during data filtering and analysis. For example, it is intentionally difficult in phyloseq to create an experiment-level object in which a component tree and OTU table have different OTU names. The import functions, trimming tools, as well as the main tool for creating an experiment-level object, `phyloseq`, all automatically trim the OTUs and samples indices to their intersection, such that these component data types are exactly coherent. # phyloseq classes The class structure in the *phyloseq* package follows the inheritance diagram shown in the figure below. Currently, *phyloseq* uses 4 core data classes. They are (1) the OTU abundance table (`otu_table`), a table of sample data (`sample_data`); (2) a table of taxonomic descriptors (`taxonomyTable`); and (3) a phylogenetic tree (`"phylo"`-class, [ape package](http://cran.r-project.org/web/packages/ape/). The `otu_table` class can be considered the central data type, as it directly represents the number and type of sequences observed in each sample. `otu_table` extends the numeric matrix class in the `R` base, and has a few additonal feature slots. The most important of these feature slots is the `taxa_are_rows` slot, which holds a single logical that indicates whether the table is oriented with taxa as rows (as in the *genefilter* package in [Bioconductor](#cite:bioconductor) or with taxa as columns (as in *vegan* and *picante* packages). In *phyloseq* methods, as well as its extensions of methods in other packages, the `taxa_are_rows` value is checked to ensure proper orientation of the `otu_table`. A *phyloseq* user is only required to specify the `otu_table` orientation during initialization, following which all handling is internal. The `sample_data` class directly inherits `R`'s `data.frame` class, and thus effectively stores both categorical and numerical data about each sample. The orientation of a `data.frame` in this context requires that samples/trials are rows, and variables are columns (consistent with *vegan* and other packages). The `taxonomyTable` class directly inherits the `matrix` class, and is oriented such that rows are taxa/OTUs and columns are taxonomic levels (e.g. *Phylum*). The phyloseq-class can be considered an "experiment-level class" and should contain two or more of the previously-described core data classes. We assume that *phyloseq* users will be interested in analyses that utilize their abundance counts derived from the phylogenetic sequencing data, and so the `phyloseq()` constructor will stop with an error if the arguments do not include an `otu_table`. There are a number of common methods that require either an `otu_table` and `sample_data` combination, or an `otu_table` and phylogenetic tree combination. These methods can operate on instances of the phyloseq-class, and will stop with an error if the required component data is missing. ![phyloseq class structure](phyloseq_classes_7.png) Classes and inheritance in the *phyloseq* package. The class name and its slots are shown with red- or blue-shaded text, respectively. Coercibility is indicated graphically by arrows with the coercion function shown. Lines without arrows indicate that the more complex class (``phyloseq") contains a slot with the associated data class as its components. # Load *phyloseq* and import data Now let's get started by loading phyloseq, and describing some methods for importing data. ## Load *phyloseq* To use *phyloseq* in a new R session, it will have to be loaded. This can be done in your package manager, or at the command line using the `library()` command: ```{r load-packages, message=FALSE, warning=FALSE} library("phyloseq") ``` ## Import data An important feature of *phyloseq* are methods for importing phylogenetic sequencing data from common taxonomic clustering pipelines. These methods take file pathnames as input, read and parse those files, and return a single object that contains all of the data. Some additional background details are provided below. The best reproducible examples on importing data with phyloseq can be found on the official data import tutorial page: http://joey711.github.com/phyloseq/import-data ## Import from biom-format New versions of QIIME (see below) produce a file in *version 2* of the [biom file format](http://biom-format.org/), which is a specialized definition of the HDF5 format. The phyloseq package provides the `import_biom()` function, which can import both *Version 1* (JSON) and *Version 2* (HDF5) of the BIOM file format. The *phyloseq* package fully supports both taxa and sample observations of the biom format standard, and works with the BIOM files output from QIIME, RDP, MG-RAST, etc. ## Import from QIIME (Modern) The default output from modern versions of QIIME is a BIOM-format file (among others). This is suppored in phyloseq. ### Sample data from QIIME Sometimes inaccurately referred to as *metadata*, additional observations on samples provided as *mapping file* to QIIME have not typically been output in the BIOM files, **even though BIOM format supports it**. This failure to support the full capability of the BIOM format means that you'll have to provide sample observations as a separate file. There are many ways to do this, but the QIIME sample map is supported. ### Input Two QIIME output files (`.biom`, `.tre`) are recognized by the `import_biom()` function. One QIIME input file (sample map, tab-delimited), is recognized by the `import_qiime_sample_data()` function. --- Input File(s) | phyloseq function | Output --- | --- | --- `.biom`, `.tre` | `import_biom()` | phyloseq object with OTU table, taxonomy table, and tree (if provided) `.tre` | `read_tree()` | `phylo` object, representing phylogenetic tree. `map.txt` | `import_qiime_sample_data()` | A `sample_data` object --- The objects created by each of the import functions above should be merged using `merge_phyloseq` to create one coordinated, self-consistent object. ### Output - **Before Merging** - Before merging with `merge_phyloseq`, the output from these import activities is the three separate objects listed in the previous table. - **After Merging** - After merging you have a single self-consistent phyloseq object that contains an OTU table, taxonomy table, sample-data, and a phylogenetic tree. ### QIIME Example Tutorial QIIME's "Moving Pictures" example tutorial output is a little too large to include within the phyloseq package (and thus is not directly included in this vignette). However, the phyloseq home page includes a full reproducible example of the import procedure described above: **Link HERE** For reference, or if you want to try yourself, the following is the relative paths within the QIIME tutorial directory for each of the files you will need. - BIOM file, originally at: `r "moving_pictures_tutorial-1.9.0/illumina/precomputed-output/otus/otu_table_mc2_w_tax_no_pynast_failures.biom"` - Tree file, originally at: `r "moving_pictures_tutorial-1.9.0/illumina/precomputed-output/otus/rep_set.tre"` - Map File, originally at: `r "moving_pictures_tutorial-1.9.0/illumina/map.tsv"` ## Import from QIIME Legacy [QIIME](#cite:QIIME) is a free, open-source OTU clustering and analysis pipeline written for Unix (mostly Linux). It is distributed in a number of different forms (including a pre-installed virtual machine). See [the QIIME home page](http://qiime.org/) for details. ### Input One QIIME input file (sample map), and two QIIME output files (`otu_table.txt`, `.tre`) are recognized by the `import_qiime()` function. Only one of the three input files is required to run, although an `"otu_table.txt"` file is required if `import_qiime()` is to return a complete experiment object. In practice, you will have to find the relevant QIIME files among a number of other files created by the QIIME pipeline. A screenshot of the directory structure created during a typical QIIME run is shown in [the QIIME Directory Figure](#fig:qiimedirectory). ![QIIME directory structure](import_qiime_directory_structure.jpg) A typical QIIME output directory. The two output files suitable for import by *phyloseq* are highlighted. A third file describing the samples, their barcodes and covariates, is created by the user and required as *input* to QIIME. It is a good idea to import this file, as it can be converted directly to a `sample_data` object and can be extremely useful for certain analyses. ### Output The class of the object returned by `import_qiime()` depends upon which filenames are provided. The most comprehensive class is chosen automatically, based on the input files listed as arguments. At least one argument needs to be provided. ## Import from mothur The open-source, platform-independent, locally-installed software package, [mothur](#cite:Schloss:2009do), can also process barcoded amplicon sequences and perform OTU-clustering. It is extensively documented on [the mothur wiki](http://www.mothur.org/wiki/) ### Input Currently, there are three different files produced by the *mothur* package (Ver `1.22+`) that can be imported by *phyloseq*. At minimum, a user must supply a "`.list`" file, and at least one of the following two files: `.groups` or `.tree`. The group file is produced by *mothur*'s `make.group()` function. Details can be found at [its wiki page](http://www.mothur.org/wiki/Make.group). The tree file is a phylogenetic tree calculated by *mothur*. ### Output The output from `import_mothur()` depends on which file types are provided. If all three file types are provided, an instance of the phyloseq-class is returned that contains both an OTU abundance table and its associated phylogenetic tree. ## Import from PyroTagger PyroTagger is an OTU-clustering pipeline for barcoded 16S rRNA amplicon sequences, served and maintained by the Department of Energy's (DOE's) Joint Genome Institute (JGI). It can be used through a straightforward web interface at [the PyroTagger home page](http://pyrotagger.jgi-psf.org/) PyroTagger takes as input the untrimmed sequence (`.fasta`) and sequence-quality (`.qual`) files, as well as a sample mapping file that contains the bar code sequence for each sample and its name. It uses a 97\% identity threshold for defining OTU clusters (approximately species-level of taxonomic distinction), and provides no options for specifying otherwise. It does allow users to modify the threshold setting for low-quality bases. ### Input PyroTagger returns a single excel spreadsheet file (`.xls`) containing both abundance and taxonomy data, as well as some associated confidence information related to each taxonomic assignment. This spreadsheet also reports on potential chimeric sequences. This single output file is sufficient for `import_RDP_tab()`, provided the file has been converted to a tab-delimited plain-text format. Any spreadsheet application should suffice. No other changes should be made to the `.xls` file. ### Output `import_RDP_tab()` returns an instance of the phyloseq-class that contains the OTU abundance table and taxonomy table. To my knowledge, PyroTagger does not calculate a tree of the representative sequences from each OTU cluster, nor a distance object, so analyses like `tip_glom()` and `UniFrac` are not applicable. ## Import from RDP pipeline The Ribosomal Database Project ([RDP](http://rdp.cme.msu.edu/)) provides a web-based barcoded 16S rRNA amplicon sequence processing pipeline called the [RDP Pyrosequencing Pipeline](http://pyro.cme.msu.edu/). A user must run all three of the "Data Processing" steps sequentially through the web interface in order to acquire the output from Complete Linkage Clustering, the approach to OTU clustering used by the RDP Pipeline. Note that this import function assumes that the sequence names in the resulting cluster file follow a particular naming convention with underscore delimiter (see below). ### Input The output from the Complete Linkage Clustering, `.clust`, is the only input to the RDP pipeline importer: ```{r, eval=FALSE} myOTU1 <- import_RDP_cluster("path/to/my/filename.clust") ``` ### Output This importer returns an `otu_table` object. ### Expected Naming Convention The RDP cluster pipeline (specifically, the output of the complete linkage clustering step) has no formal documentation for the ".clust" file structure or its apparent sequence naming convention. The cluster file itself contains the names of all sequences contained in the input alignment. If the upstream barcode and aligment processing steps are also done with the RDP pipeline, then the sequence names follow a predictable naming convention wherein each sequence is named by its sample and sequence ID, separated by a `"_"` as delimiter: `sampleName_sequenceIDnumber` This import function assumes that the sequence names in the cluster file follow this convention, and that the sample name does not contain any `"_"`. It is unlikely to work if this is not the case. It is likely to work if you used the upstream steps in the RDP pipeline to process your raw (barcoded, untrimmed) fasta/fastq data. ## Example Data (included) There are multiple example data sets included in *phyloseq*. Many are from published investigations and include documentation with a summary and references, as well as some example code representing some aspect of analysis available in *phyloseq*. In the package index, go to the names beginning with "data-" to see the documentation of currently available example datasets. To load example data into the working environment, use the `data()` command: ```{r, eval=FALSE} data(GlobalPatterns) data(esophagus) data(enterotype) data(soilrep) ``` Similarly, entering `?enterotype` will reveal the documentation for the so-called "enterotype" dataset. For details examples, see [the Example Data tutorial](http://joey711.github.io/phyloseq/Example-Data.html) ## phyloseq Object Summaries In small font, the following is the summary of the `GlobalPatterns` dataset that prints to the terminal. These summaries are consistent among all `phyloseq-class` objects. Although the components of `GlobalPatterns` have many thousands of elements, the command-line returns only a short summary of each component. This encourages you to check that an object is still what you expect, without needing to let thousands of elements scroll across the terminal. In the cases in which you do want to see more of a particular component, use an accessor function (see table below). ```{r} data(GlobalPatterns) GlobalPatterns ``` ## Convert raw data to phyloseq components Suppose you have already imported raw data from an experiment into `R`, and their indices are labeled correctly. How do you get *phyloseq* to recognize these tables as the appropriate class of data? And further combine them together? Table [Table of Component Constructor Functions](#table:build) lists key functions for converting these core data formats into specific component data objects recognized by *phyloseq*. These will also Table of component constructor functions for building component data objects --- Function | Input Class | Output Description --- | --- | --- `otu_table` | numeric matrix | `otu_table` object storing OTU abundance `otu_table` | data.frame | `otu_table` object storing OTU abundance `sample_data` | data.frame | `sample_data` object storing sample variables `tax_table` | character matrix | `taxonomyTable` object storing taxonomic identities `tax_table` | data.frame | `taxonomyTable` object storing taxonomic identities `read_tree` | file path char | phylo-class tree, read from file `read.table` | table file path | A matrix or data.frame (Std `R` core function) --- phyloseq constructors: functions for building/merging *phyloseq* objects. --- Function | Input Class | Output Description --- | --- | --- `phyloseq` | Two or more component objects | phyloseq-class, *experiment-level* object `merge_phyloseq`| Two or more component or phyloseq-class objects | Combined instance of phyloseq-class --- The following example illustrates using the constructor methods for component data tables. ```{r, eval=FALSE} otu1 <- otu_table(raw_abundance_matrix, taxa_are_rows=FALSE) sam1 <- sample_data(raw_sample_data.frame) tax1 <- tax_table(raw_taxonomy_matrix) tre1 <- read_tree(my_tree_file) ``` ## phyloseq() function: building complex phyloseq objects Once you've converted the data tables to their appropriate class, combining them into one object requires only one additional function call, `phyloseq()`: ```{r, eval=FALSE} ex1b <- phyloseq(my_otu_table, my_sample_data, my_taxonomyTable, my_tree) ``` You do not need to have all four data types in the example above in order to combine them into one validity-checked experiment-level phyloseq-class object. The `phyloseq()` method will detect which component data classes are present, and build accordingly. Downstream analysis methods will access the required components using *phyloseq*'s accessors, and throw an error if something is missing. For most downstream methods you will only need to supply the combined, phyloseq-class object (the output of `phyloseq()` ), usually as the first argument. ```{r, eval=FALSE} ex1c <- phyloseq(my_otu_table, my_sample_data) ``` Whenever an instance of the phyloseq-class is created by *phyloseq* --- for example, when we use the `import_qiime()` function to import data, or combine manually imported tables using `phyloseq()` --- the row and column indices representing taxa or samples are internally checked/trimmed for compatibility, such that all component data describe exactly (and only) the same OTUs and samples. ## Merge The phyloseq project includes support for two complete different categories of merging. - Merging the OTUs or samples in a phyloseq object, based upon a taxonomic or sample variable: `merge_samples()`, `merge_taxa()` - Merging two or more data objects that come from the same experiment, so that their data becomes part of the same phyloseq object: `merge_phyloseq()` For further details, see the reproducible online tutorial at: http://joey711.github.com/phyloseq/merge # Accessor functions Once you have a phyloseq object available, many accessor functions are available to query aspects of the data set. The function name and its purpose are summarized in [the Accessor Functions Table](#table:access). Accessor functions for *phyloseq* objects. --- Function | Returns --- | --- `[` | Standard extraction operator. Works on `otu_table`, `sample_data`, and `taxonomyTable` `access` | General slot accessor function for phyloseq-package `get_taxa` | Abundance values of all taxa in sample `i' `get_sample` | Abundance values of taxa `i' for all samples `get_taxa_unique` | A unique vector of the observed taxa at a particular taxonomic rank `get_variable` | An individual sample variable vector/factor `nsamples` | Get the number of samples described by an object `ntaxa` | Get the number of OTUs (taxa) described by an object `otu_table` | Build or access otu_table objects `rank_names` | Get the names of the available taxonomic ranks `sample_data` | Build or access `sample_data` objects `sample_names` | The names of all samples `taxa_names` | The names of all taxa `sample_sums` | The sum of the abundance values of each sample `sample_variables` | The names of sample variables `taxa_sums` | The sum of the abundance values of each taxa `taxa_are_rows` | `TRUE` if taxa are row indices in `otu_table` `tax_table` | A taxonomy table `phy_tree` | Access the tree contained in a phyloseq object --- # Trimming, subsetting, filtering phyloseq data ## Trimming: prune_taxa() Trimming high-throughput phylogenetic sequencing data can be useful, or even necessary, for certain types of analyses. However, it is important that the original data always be available for reference and reproducibility; and that the methods used for trimming be transparent to others, so they can perform the same trimming or filtering steps on the same or related data. To facilitate this, *phyloseq* contains many ways to trim/filter the data from a phylogenetic sequencing project. Because matching indices for taxa and samples is strictly enforced, subsetting one of the data components automatically subsets the corresponding indices from the others. Variables holding trimmed versions of your original data can be declared, and further trimmed, without losing track of the original data. In general, most trimming should be accomplished using the S4 methods `prune_taxa()` or `prune_samples()`. ## Simple filtering example ```{r echo=FALSE} topN <- 20 ``` For example, lets make a new object that only holds the most abundant `r topN` taxa in the experiment. To accomplish this, we will use the `prune_taxa()` function. ```{r} data(GlobalPatterns) most_abundant_taxa <- sort(taxa_sums(GlobalPatterns), TRUE)[1:topN] ex2 <- prune_taxa(names(most_abundant_taxa), GlobalPatterns) ``` Now we can ask the question, "what taxonomic Family are these OTUs?" (Subsetting still returns a `taxonomyTable` object, which is summarized. We will need to convert to a vector) ```{r} topFamilies <- tax_table(ex2)[, "Family"] as(topFamilies, "vector") ``` ## Arbitrarily complex abundance filtering The previous example was a relatively simple filtering in which we kept only the most abundant `r topN` in the whole experiment. But what if we wanted to keep the most abundant `r topN` taxa of each sample? And of those, keep only the taxa that are also found in at least one-third of our samples? What if we wanted to keep only those taxa that met some across-sample criteria? ### genefilter_sample(): Filter by Within-Sample Criteria For this more complicated filtering *phyloseq* contains a function, `genefilter_sample`, that takes as an argument a *phyloseq* object, as well as a list of one or more filtering functions that will be applied to each sample in the abundance matrix (`otu_table`), as well as an integer argument, `A`, that specifies for how many samples the filtering function must return `TRUE` for a particular taxa to avoid removal from the object. A supporting function `filterfun_sample` is also included in *phyloseq* to facilitate creating a properly formatted function (enclosure) if more than one function is going to be applied simultaneously. `genefilter_sample` returns a logical vector suitable for sending directly to `prune_taxa` for the actual trimming. Here is an example on a completely fabricated `otu_table` called `testOTU`. ```{r, eval=FALSE} testOTU <- otu_table(matrix(sample(1:50, 25, replace=TRUE), 5, 5), taxa_are_rows=FALSE) f1<- filterfun_sample(topk(2)) wh1 <- genefilter_sample(testOTU, f1, A=2) wh2 <- c(T, T, T, F, F) prune_taxa(wh1, testOTU) prune_taxa(wh2, testOTU) ``` Here is a second example using the included dataset, `GlobalPatterns`. The most abundant taxa are kept only if they are in the most abundant 10\% of taxa in at least half of the samples in dataset `GlobalPatterns`. Note that it is not necessary to subset `GlobalPatterns` in order to do this filtering. The S4 method `prune_taxa` subsets each of the relavent component objects, and returns the complex object back. ```{r} data(GlobalPatterns) f1<- filterfun_sample(topp(0.1)) wh1 <- genefilter_sample(GlobalPatterns, f1, A=(1/2*nsamples(GlobalPatterns))) sum(wh1) ex2 <- prune_taxa(wh1, GlobalPatterns) ``` ```{r} print(ex2) ``` If instead of the most abundant fraction of taxa, you are interested in the most abundant fraction of individuals (aka sequences, observations), then the `topf` function is appropriate. For steep rank-abundance curves, `topf` will seem to be much more conservative (trim more taxa) because it is based on the cumulative sum of relative abundance. It does not guarantee that a certain number or fraction of total taxa (richness) will be retained. ```{r, eval=FALSE} data(GlobalPatterns) f1<- filterfun_sample(topf(0.9)) wh1 <- genefilter_sample(GlobalPatterns, f1, A=(1/3*nsamples(GlobalPatterns))) sum(wh1) prune_taxa(wh1, GlobalPatterns) ``` ### filter_taxa(): Filter by Across-Sample Criteria The `filter_taxa` function is directly analogous to the `genefilter` function for microarray filtering, but is used for filtering OTUs from phyloseq objects. It applies an arbitrary set of functions -- as a function list, for instance, created by `genefilter::filterfun` -- as across-sample criteria, one OTU at a time. It can be thought of as an extension of the genefilter-package (from the Bioconductor repository) for phyloseq objects. It takes as input a phyloseq object, and returns a logical vector indicating whether or not each OTU passed the criteria. Alternatively, if the `prune` option is set to `r FALSE`, it returns the already-trimmed version of the phyloseq object. Inspect the following example. Note that the functions `genefilter` and `kOverA` are from the genefilter package. ```{r} data("enterotype") library("genefilter") flist<- filterfun(kOverA(5, 2e-05)) ent.logi <- filter_taxa(enterotype, flist) ent.trim <- filter_taxa(enterotype, flist, TRUE) identical(ent.trim, prune_taxa(ent.logi, enterotype)) identical(sum(ent.logi), ntaxa(ent.trim)) filter_taxa(enterotype, flist, TRUE) ``` ## subset_samples(): Subset by Sample Variables It is possible to subset the samples in a *phyloseq* object based on the sample variables using the `subset_samples()` function. For example to subset `GlobalPatterns` such that only certain environments are retained, the following line is needed (the related tables are subsetted automatically as well): ```{r} ex3 <- subset_samples(GlobalPatterns, SampleType%in%c("Freshwater", "Ocean", "Freshwater (creek)")) ex3 ``` For this example only a categorical variable is shown, but in principle a continuous variable could be specified and a logical expression provided just as for the `subset` function. In fact, because `sample_data` component objects are an extension of the data.frame class, they can also be subsetted with the `subset` function: ```{r} subset(sample_data(GlobalPatterns), SampleType%in%c("Freshwater", "Ocean", "Freshwater (creek)")) ``` ## subset_taxa(): subset by taxonomic categories It is possible to subset by specific taxonomic category using the `subset_taxa()` function. For example, if we wanted to subset `GlobalPatterns` so that it only contains data regarding the phylum *Firmicutes*: ```{r} ex4 <- subset_taxa(GlobalPatterns, Phylum=="Firmicutes") ex4 ``` ## random subsample abundance data Can also randomly subset, for example a random subset of 100 taxa from the full dataset. ```{r} randomSpecies100 <- sample(taxa_names(GlobalPatterns), 100, replace=FALSE) ex5 <- prune_taxa(randomSpecies100, GlobalPatterns) ``` # Transform abundance data Sample-wise transformation can be achieved with the `transform_sample_counts()` function. It requires two arguments, (1) the *phyloseq* object that you want to transform, and the function that you want to use to perform the transformation. Any arbitrary function can be provided as the second argument, as long as it returns a numeric vector with the same length as its input. In the following trivial example, we create a second object, `ex2`, that has been "transformed" by the identity function such that it is actually identical to `GlobalPatterns`. ```{r, eval=FALSE} data(GlobalPatterns) ex2 <- transform_sample_counts(GlobalPatterns, I) ``` For certain kinds of analyis we may want to transform the abundance data. For example, for RDA we want to transform abundance counts to within-sample ranks, and to further include a threshold beyond which all taxa receive the same rank value. The ranking for each sample is performed independently, so that the rank of a particular taxa within a particular sample is not influenced by that sample's total quantity of sequencing relative to the other samples in the project. The following example shows how to perform such a thresholded-rank transformation of the abundance table in the complex *phyloseq* object `GlobalPatterns` with an arbitrary threshold of 500. ```{r} ex4<- transform_sample_counts(GlobalPatterns, threshrankfun(500)) ``` # Phylogenetic smoothing ## tax_glom() Suppose we are skeptical about the importance of OTU-level distinctions in our dataset. For this scenario, *phyloseq* includes a taxonomic-agglommeration method,`tax_glom()`, which merges taxa of the same taxonomic category for a user-specified taxonomic level. In the following code, we merge all taxa of the same Genus, and store that new object as `ex6`. ```{r, eval=FALSE} ex6 <- tax_glom(GlobalPatterns, taxlevel="Genus") ``` ## tip_glom() Similarly, our original example object (`GlobalPatterns`) also contains a phlyogenetic tree corresponding to each OTU, which we could also use as a means to merge taxa in our dataset that are closely related. In this case, we specify a threshold patristic distance. Taxa more closely related than this threshold are merged. This is especially useful when a dataset has many taxa that lack a taxonomic assignment at the level you want to investigate, a problem when using `tax_glom()`. Note that for datasets with a large number of taxa, `tax_glom` will be noticeably faster than `tip_glom`. Also, keep in mind that `tip_glom` requires that its first argument be an object that contains a tree, while `tax_glom` instead requires a `taxonomyTable` (See [phyloseq classes](#sec:app-classes)). ```{r, eval=FALSE} ex7 <- tip_glom(GlobalPatterns, speciationMinLength = 0.05) ``` Command output not provided here to save time during compilation of the vignette. The user is encouraged to try this out on your dataset, or even this example, if interested. It may take a while to run on the full, untrimmed data. # Installation ## Installation Please check [the phyloseq installation tutorial](http://joey711.github.com/phyloseq/install) for help with installation. This is likely to be the first place news and updated information about installation will be posted, as well. Also check out the rest of [the phyloseq homepage on GitHub](http://joey711.github.io/phyloseq/), as this is the best place to post issues, bug reports, feature requests, contribute code, etc. ## Installing Parallel Backend For running parallel implementation of functions/methods in *phyloseq* (e.g. `UniFrac(GlobalPatterns, parallel=TRUE)`), you will need also to install a function for registering a parallel "backend". Only one working parallel backend is needed, but there are several options, and the best one will depend on the details of your particular system. The "doParallel" package is a good place to start. Any one of the following lines from an `R` session will install a backend package. ```{r, eval=FALSE} install.packages("doParallel") install.packages("doMC") install.packages("doSNOW") install.packages("doMPI") ``` # References Robert C Gentleman, Vincent J. Carey, Douglas M. Bates, et al. **Bioconductor: Open software development for computational biology and bioinformatics.** *Genome Biology* 5:R80, 2004. J Gregory Caporaso, Justin Kuczynski, Jesse Stombaugh, Kyle Bittinger, Frederic D Bushman **QIIME allows analysis of high-throughput community sequencing data.** *Nature Methods* 7(5):335-336, 2010. P D Schloss, S L Westcott, T Ryabin, J R Hall, M Hartmann, et al. **Introducing mothur: Open-Source, Platform-Independent, Community-Supported Software for Describing and Comparing Microbial Communities.** *Applied and Environmental Microbiology* 75(23):7537-7541, 2009. J R Cole, Q Wang, E Cardenas, J Fish, B Chai et al. **The Ribosomal Database Project: improved alignments and new tools for rRNA analysis.** *Nucleic Acids Research* 37(Database issue):D141-5, 2009. phyloseq/vignettes/phyloseq-mixture-models.Rmd0000644000175400017540000002252213175714136022753 0ustar00biocbuildbiocbuild--- title: "Example using Negative Binomial in Microbiome Differential Abundance Testing" output: BiocStyle::html_document: fig_height: 7 fig_width: 10 toc: yes toc_depth: 2 number_sections: true --- `r library("knitr")` `r opts_chunk$set(cache=FALSE, fig.width=9, message=FALSE, warning=FALSE)` Paul J. McMurdie and Susan Holmes [phyloseq Home Page](http://joey711.github.io/phyloseq/) If you find phyloseq and/or its tutorials useful, please acknowledge and cite phyloseq in your publications: **phyloseq: An R package for reproducible interactive analysis and graphics of microbiome census data** (2013) PLoS ONE 8(4):e61217 http://dx.plos.org/10.1371/journal.pone.0061217 # Other resources The phyloseq project also has a number of supporting online resources, most of which can by found at [the phyloseq home page](http://joey711.github.com/phyloseq/), or from the phyloseq stable release [page on Bioconductor](http://bioconductor.org/packages/release/bioc/html/phyloseq.html). To post feature requests or ask for help, try [the phyloseq Issue Tracker](https://github.com/joey711/phyloseq/issues). # The experimental data used in this example In this example I use the publicly available data from a study on colorectal cancer: [Genomic analysis identifies association of Fusobacterium with colorectal carcinoma](http://genome.cshlp.org/content/22/2/292.long). Kostic, A. D., Gevers, D., Pedamallu, C. S., Michaud, M., Duke, F., Earl, A. M., et al. (2012). *Genome research*, 22(2), 292-298. As a side-note, this work was published ahead of print in [Genome Research](http://genome.cshlp.org/) alongside a highly-related article from a separate group of researchers (long-live reproducible observations!): [Fusobacterium nucleatum infection is prevalent in human colorectal carcinoma](http://genome.cshlp.org/content/22/2/299.long). In case you are interested. For the purposes of example, however, we will stick to the data from the former study, with data available at the [microbio.me/qiime](http://www.microbio.me/qiime/) server. Data source, from methods section in article: > The 16S gene data set consists of 454 FLX Titanium sequences spanning the V3 to V5 variable regions obtained for 190 samples (95 pairs). Detailed protocols used for 16S amplification and se- quencing are available on the HMP Data Analysis and Coordination Center website (http://www.hmpdacc.org/tools_protocols/tools_ protocols.php). Study ID: `1457` Project Name: `Kostic_colorectal_cancer_fusobacterium` Study Abstract: > The tumor microenvironment of colorectal carcinoma is a complex community of genomically altered cancer cells, nonneoplastic cells, and a diverse collection of microorganisms. Each of these components may contribute to carcino genesis; however, the role of the microbiota is the least well understood. We have characterized the composition of the microbiota in colorectal carcinoma using whole genome sequences from nine tumor/normal pairs. Fusobacterium sequences were enriched in carcinomas, confirmed by quantitative PCR and 16S rDNA sequence analysis of 95 carcinoma/normal DNA pairs, while the Bacteroidetes and Firmicutes phyla were depleted in tumors. Fusobacteria were also visualized within colorectal tumors using FISH. These findings reveal alterations in the colorectal cancer microbiota; however, the precise role of Fusobacteria in colorectal carcinoma pathogenesis requires further investigation. # Import data with phyloseq, convert to DESeq2 Start by loading phyloseq. ```{r load-phyloseq, message=FALSE, warning=FALSE} library("phyloseq"); packageVersion("phyloseq") ``` Defined file path, and import the published OTU count data into R. ```{r filepath} filepath = system.file("extdata", "study_1457_split_library_seqs_and_mapping.zip", package="phyloseq") kostic = microbio_me_qiime(filepath) ``` Here I had to use a relative file path so that this example works on all systems that have phyloseq installed. In practice, your file path will look like this (if you've downloaded the data ahead of time): ```{r example-path-local, eval=FALSE} filepath = "~/Downloads/study_1457_split_library_seqs_and_mapping.zip" kostic = microbio_me_qiime(filepath) ``` Or like this (if you're accessing data directly from the microbio.me/qiime server directly): ```{r example-path-remote, eval=FALSE} kostic = microbio_me_qiime(1457) ``` # Convert to DESeq2's DESeqDataSet class In this example I'm using the major sample covariate, `DIAGNOSIS`, as the study design factor. The focus of this study was to compare the microbiomes of pairs of healthy and cancerous tissues, so this makes sense. Your study could have a more complex or nested design, and you should think carefully about the study design formula, because this is critical to the test results and their meaning. You might even need to define a new factor if none of the variables in your current table appropriately represent your study's design. See [the DESeq2 home page](http://www.bioconductor.org/packages/release/bioc/html/DESeq2.html) for more details. Here is the summary of the data variable `kostic` that we are about to use, as well as the first few entries of the `DIAGNOSIS` factor. ```{r show-variables} kostic head(sample_data(kostic)$DIAGNOSIS, 10) ``` # DESeq2 conversion and call First load DESeq2. ```{r deseq2, message=FALSE, warning=FALSE} library("DESeq2"); packageVersion("DESeq2") ``` The following two lines actually do all the complicated DESeq2 work. The function `phyloseq_to_deseq2` converts your phyloseq-format microbiome data into a `DESeqDataSet` with dispersions estimated, using the experimental design formula, also shown (the `~DIAGNOSIS` term). The `DESeq` function does the rest of the testing, in this case with default testing framework, but you can actually use alternatives. First remove the 5 samples that had no `DIAGNOSIS` attribute assigned. These introduce a spurious third design class that is actually a rare artifact in the dataset. Also remove samples with less than `500` reads (counts). Note that this kind of data cleanup is useful, necessary, and should be well-documented because it can also be dangerous to alter or omit data without clear documentation. In this case I actually explored the data first, and am omitting some of the details (and explanatory plots) here for clarity. ```{r rm-bad-samples} kostic <- subset_samples(kostic, DIAGNOSIS != "None") kostic <- prune_samples(sample_sums(kostic) > 500, kostic) kostic ``` ```{r run-deseq2} diagdds = phyloseq_to_deseq2(kostic, ~ DIAGNOSIS) # calculate geometric means prior to estimate size factors gm_mean = function(x, na.rm=TRUE){ exp(sum(log(x[x > 0]), na.rm=na.rm) / length(x)) } geoMeans = apply(counts(diagdds), 1, gm_mean) diagdds = estimateSizeFactors(diagdds, geoMeans = geoMeans) diagdds = DESeq(diagdds, fitType="local") ``` Note: The default multiple-inference correction is Benjamini-Hochberg, and occurs within the `DESeq` function. # Investigate test results table The following `results` function call creates a table of the results of the tests. Very fast. The hard work was already stored with the rest of the DESeq2-related data in our latest version of the `diagdds` object (see above). I then order by the adjusted p-value, removing the entries with an `NA` value. The rest of this example is just formatting the results table with taxonomic information for nice(ish) display in the HTML output. ```{r grab-results-process-table} res = results(diagdds) res = res[order(res$padj, na.last=NA), ] alpha = 0.01 sigtab = res[(res$padj < alpha), ] sigtab = cbind(as(sigtab, "data.frame"), as(tax_table(kostic)[rownames(sigtab), ], "matrix")) head(sigtab) ``` Let's look at just the OTUs that were significantly enriched in the carcinoma tissue. First, cleaning up the table a little for legibility. ```{r table-prelim} posigtab = sigtab[sigtab[, "log2FoldChange"] > 0, ] posigtab = posigtab[, c("baseMean", "log2FoldChange", "lfcSE", "padj", "Phylum", "Class", "Family", "Genus")] ``` ```{r make-markdown-table, echo=FALSE, results='asis'} # Make a markdown table posigtab = data.frame(OTU=rownames(posigtab), posigtab) cat(paste(colnames(posigtab), collapse=" | "), fill=TRUE) cat(paste(rep("---", times=ncol(posigtab)), collapse=" | "), fill=TRUE) dummy = apply(posigtab, 1, function(x){ cat(paste(x, collapse=" | "), fill=TRUE) }) ``` As expected from the original study abstract and title, a *Fusobacterium* OTU was among the most-significantly differentially abundant between the cancerous and healthy samples. # Plot Results Here is a bar plot showing the log2-fold-change, showing Genus and Phylum. Uses some ggplot2 commands. ```{r bar-plot} library("ggplot2") theme_set(theme_bw()) sigtabgen = subset(sigtab, !is.na(Genus)) # Phylum order x = tapply(sigtabgen$log2FoldChange, sigtabgen$Phylum, function(x) max(x)) x = sort(x, TRUE) sigtabgen$Phylum = factor(as.character(sigtabgen$Phylum), levels=names(x)) # Genus order x = tapply(sigtabgen$log2FoldChange, sigtabgen$Genus, function(x) max(x)) x = sort(x, TRUE) sigtabgen$Genus = factor(as.character(sigtabgen$Genus), levels=names(x)) ggplot(sigtabgen, aes(y=Genus, x=log2FoldChange, color=Phylum)) + geom_vline(xintercept = 0.0, color = "gray", size = 0.5) + geom_point(size=6) + theme(axis.text.x = element_text(angle = -90, hjust = 0, vjust=0.5)) ``` phyloseq/vignettes/phyloseq_classes_7.png0000644000175400017540000107676313175714136022025 0ustar00biocbuildbiocbuildPNG  IHDR?/iCCPICC Profilec``2ptqre``+) rwRR` ``\\yy | 2 U +'300%@q9@HR6. r!+ v.z H}:b'A2 vIj^ʢ#ǔTbϼĒZ@! A!ahii "q(v!( cd2f` G1G)I/15C}}sïPoW pHYsgR@IDATx]`U7Bi mqwwwƆ   w! 6|[[bu﫽$g[&'ɗsss"'&RɥbRđL&!`bbXr$1Zh44W`ɐD@" 0D)TD@" H$D@" ySCFN9Ҙ~iq SSSX[[9VMs|}yO||XG Ro{---aaaH$TUM?NNN̡K-Fa̘1|c(Qr(D}| !o޼XlRUhڴ)ʔ)#ޣO޼6#7[[[b޼y]gJr H$fν7n߾ÇOR"iBܾ};>|>ۑVڱTP!MVp|k>r l޼/~(| ???ʕK ZpEQ:!EDD`ɒ% ;r&H$9Y!T;'>{2uT 4HtCΙ3'm33#$aqqqٳ'&L :>I L\Cb&CBmŋ߇SieeW^ +I$@~xǙ2I sVce| Q:?A+vwec!q_D !˕Džˏ/#.>+ȕ.*-:U9oRb ={?w⎿Src>>\K$/TUB&;%IIPe_ӃY"B^x"/$D@" H)P" H$D@" {BP@" H$D@" ;Bp$D@" H$@G!LH$D@" H{|1%Cc [=-%  '_f-H$D@"Wpc_DKI& a/ɭD@" H$iS@F.i۸Ӯ+(iDgh8-?^HU§C\amF|VPEG"B,>[Ie-Eṱ1;'7E~d@A@*i*$#D@" 7٠w "A$uj짖UM#s4ҩP*x+HYj)LXb,V47ks*,.ÄM0aL$wו2D ZkLPuTӚ"C,4 =12J\&(FeZeH$D  %AQ"Q:ڤѩqш$h"](īJBh&*Lgubz:H㛳vR\{a!G@@]XCR^8x#)cO!0*V7Wĸ^Ƞ G~\{NI 3,|*tKY9gf,R3o^o}#TWLECQ^)A!b(R '2m4r9KVSk9~Y VB2FbbCyK = hQ-ŒLsxNf@b[ 2ڈt5/p'^Efɍ50衇B^ kٲ%9s&TKS&y#jEWX*WhxNK24aֻwϻ"dRU~=ʇCYppp˵9sFqT#UAT|ݻw #:{s{ǎzm>Ŧv/%o:'y<\ vUddsv¿뼃,F͒ݭ(1*ءydW0.USE3],;<;e~W-zE+F{_53 .x1Jק3x1vZ۞c,u=R7YczvѥE| g0ELS֭c+CtKlD\(Fgo)id"$D@" /9lfN:;ّxxYRfX(aHn_)˜)w12B?yA8{f=Ƥ>Q"#hmx9* S.>twNEn*\a/#KPyY{=е6؁ML3xv lek7cRNJ0>4ZэwJ}"5CU-LBrYōYGBCvoQ+t J)nTn?ɠr@ RM8W)= Q- ZY"c:Dy NjMQJyd˂-G&:Qzti Hzq+Jp  ď(O)6#~|:V"?/fgbb(72X[ 5<%PKhM̈N~9"42鹲Ͳ x) P114Ch% <}6dȃ3*@?{%MZ2[ѦIM8Yepu[_Dl"U\l0}gp2Aʝ=2r%#1V(դ/6ΉG1 *˰k(,+ė~A"k6gRTWl嗄{R=k[Z@>Mf@L5zC@V:^1%aV2E"ZŨ ~XEQ\:M3Vc(_?sj7i}ͧV4Hw@oegBeA\W'i!Ĉj}HEYJeN͍:΢GעUCBy2H ‹,?n6 ;y" mġsDsR@}rgcvdn{O~++k+ŵPDYt{#D'UЋ rGz|6gTA;GNgBg ;FDrPz47E,%fbv}Gx]< 'eX;{$j WX?i5>] ??/WJ3 a)xR&iRQzuҟ`x2HD3-)W!0v=S1,_sF@ :5# |˻T-r9w> %4/ݗ"PR 9O+ @VIzK>:ꠉC8&ΗI'{{-:`8xu`iڲq*zCM͕7ջ}| h[art̀[Pۼ/V:W/pC;_WEF+ 1]衧|}I%垦q_hw'ꝢH˲rBs@{M+:~&=l 4XX6fDn(S&?u#R Gď+40k}j;La {ibh5,>bG!`QpefaahM_^A^\nĖD9^E zU ?'F@*4 Q19?  rXڧV2<~v3=:EXH0£bs!eAOrdɃf!yNNX&Ji" QY}(G[&/{r˔Jd>=Z%jat6b4V n=b5n /D՟m3kK[RZՀ{a|5cP=&{رo5 z<.{#Eaֆ\3:.nq.U wo\H)nI,\0jvCbDG폙XhI{lР 6k߅()&~.B 8g4'`%p5+a hO;L _]j#|g"(HU ,shF2,9l\9ѣ2GŸ+1Qa./i氣%ҥ=¤uBu)JkDo>\*$̈IGHf\/x /F5A LE|r۷mBc(hhzs"OAg7EHhւdHGEh71Q !pYw0Cz~MT$%DYw|~9KO°F=ʧಪ\%QxQXd{%U7JGҿ zWD@@#e$:zVdȘ ָ%ٿo9F,9˗VAʈNQY)q> >P6ш?EKOorg̜2euZ݄X9dF<pϛси`G{"|쌟Q^_Xgq[pɗ*2fbbMb1#baDF>';,H.U9N>\Mtj3Y9sƠLN".RYZMKL-sU׵8!flWF~{\>n&A )]&cNѸ.&qz)vE+D?똷c*KE". NG{ 0eb4^ xPtm|C,reJ\lm-W+g%2F-kh^nEs8f6ı;^!4j['D@*D΀ Msv/t މG\3= { 3TR""m j":#)x\{Ëp31zM_\Ngr 6;rc_q~EᖃнasjTS+eبRȭګL#|B6(|y6E52XExkx+S: |[q1¢caBkC%z:M(ޣeʴsg_E=}uQp.x_;/u[ͼX"V&{k7 EJo:J[%%JF ˢB1K^EV,蜷2*%Aym\jgiL$%dG뱯( gUD9eءtQWܼPNy":RXu A҅"׀OpKX"% NO~t eiU)a.#vh@8%>${܂d2( 5>7P+ GC@ hܮߌ_RlGT\U2)Ҍ2) kbR[Xz%mMF8:$s)Z})= *cF8ɔM|hlsC焋e,hڭ#:9NYKȖB1=zp%R#j뷤35?V3#S%<\)'F.\˖-̙3i"̩>ˊʃ(ǰ)q f_kZ&=QhZ׊+XʕYXXX}„ w?B_u@R ;n(ĆVMen܏33`Vϐޡ~?4QW=u.2 ۽zGwF e[泞 (o{ɽ$ӧu % 1J5G ^S=o9s۩G"cZ!@C]ztc\6m<ֵzzf<$$VN4zh5fOߢ$v!SF%ҥ ]@l8[2=fhͅ;|6C_٥gJŇa6?NJ)).}oߊ޽;uZf@@m b#^YÎ$mZޤxҹ{3.и~8}ZC'O>$5<8EwvB/RռdWYpx$ z}hC ]^+Qq1f+$i>BjsPOlbuBߴ$vvpbVq ߶sgN#/Ws6A /V_-o;?~¼Ndj,&nN|t(|ڧ7v72?6wWw~0{.)~)FD݀k$`[>46Vͩک !6ȺhvxaF^l_'؅SHi6o^ݡmlo˘-/a#}HBxVgCaװC wz߳MOӇߗn"z&}]]mݚd[b}[D۫| [Wdvkg)Z QIӇ،m+ٙOْ 5({&ګ(@T1o؜^U] J\%^ݡWS*} e!aQL> XLiER)}kvAjon{vR?UΆ1Ed* T;n`@lz"f"41N/Ɖ`ΎۦT" X;1h|z$ց i=j ӣ(6iyȔ5-{RXCo'1qgZObX ;2_>l"Z@+ҥ/xKk->VMKwpbh*[T|0/Q^)KH-t<`&%2kN7lZ)4PYn\V&@qSйYE0g>֓l~9w,xd*7h 6`d!7͛$1ߏf7;Z7)n^6hfC3oq' x~_ahR.YO1A23}vFש8 BXc'zvn9% Dt0%z܍Zz&@!KL|D+AƶYs|\H0hѯM#Ajg3مa?,- N/Nc$QjԜw9QCj! e3woOcQ a4qh-kLŅ_kcÄjG'a'ŸHLHDІ&D  ޑ(ADiaͻ q=\= dȟ'+DGG@*I0wF[V8 bA7 쫒 kޚGuc)g)V k(yἓC ! 1це1Z׭%A-J疁 gM.t;׽tDWLض@A}@He qeLJkMagB8א0 o>pVJ]GG#і% ,yAd7N% M%(8#NS?Bބ FfV:n7Q8rQ\܁4^'a.G8Zޤ!˨ɨXNSzim# &N4v޴%8Mth9}=l7=Qh>8;e{QaDq J"OwcLsd1B 9}"w\DE=û!^0՛~L;NJRÁ 9G1\pψLJя3mw{c̣hy&,+~UCd~W܍mI jNwew) fy_%k` =G̰0yI4%s LB%R.Kٲu B#-YXRpsa8A|":PTGWJҴ8 ъëPɧc=,\KÙLy|Uv%3DZpxH"F9{ Hu-*wI>۪8 NQ !ao-_EMGOfp&iL߶rM"LT"NCge y]n+:O s}YXɉ$'+ga!Գ/aӴ([(,;+*^وGaWu!#J/:QxyRԌd)ޗ->G-phd,ŗS*ǔϤќ6)Bean5UgO+] PqͰDV4^6●(v\ ~@Pڒ>(<8‡OVpȨ 3˃%+7O?;T$q$#*y HN|\2^*]tV@?_Lg9ɸTѵRY5)%IVgC_Ƃa];]-'P0jGߐI7P%6rHIDtL*( 5q{oA$qMGϦJ<&t.ƴ)iL(|HNV;TvͫšFo+$p˔? c+IyI]gJgdvI^X :aѸ} ! 4Q|( b6kI;84Bݍ#;uV5e&&O&G3}TXH.Ȕ,:%ַ =Bh'a) ;Q5=APh(>^G֐\!Q|QR@H(93UN}H\=Zq3.GR;+VϧO P'\ /yY;Ldd,DTt8x =&o#喧bR,BF7 '=өkP}_ _}?T ߏ FTF+rIݓgm=o9~) ,H>/]D ^nK*whI"0s MBk\1N`9ާǴ[VFsK-?i;^)OJQ 9m)yB̭i Npt)}>K7ONCXCD]a. W(@$;)E(M c :M8 mi? |1o*_jzF3J-]D a(5]Lb5Rh v,Ě$!~4F8 RQ'%jԣܬ. x-!-Jw0k5u ׯ@KvE1q՟ڽ"}hiHъ9=;M{ecpVH37Ɩi]~&(/oGAD?im&2׸MXy;X7. C^ LZ#FRԬʕiH~ЦUw U:ً<%JMti26֢Ear E/2Z~:*JV.gv;a+Lhbp2}.V*ۛZ_7$R?Btg+R˦CwP&Y3q{`cӺCO^#DVL=!Vou2jo sˆ ۘOh_僑߁^"^p>$ˡyУq%>bbho59p&l]B7h-Ŭk-Ь-WF :,{btF\91fuǽP`QZ>S{?~w_c.7u u9 8 &aZ]vENR𢵖舒:xl?| ..m;Fr6:v,'qy5EV0%[TsU]bwR k5s# 9JaSp)rڡEӾ᷍angx3-\c&G;CYerFۥQɾ8m\R<exEf5'pa>عǰqаU[*ODd$!?**(Wk6): YOe"aLV 5ݽ4zW+g{NeɘsAظ2h+EuNxΙHP4LpAVM3AEpVfdƤ)Pz+T H2,A+ ׁ`0\yg' "*=9m+ƅK|750 B,6EgAPj :ȕ삓[f좃Q>~OjPAoxgS:1Mh e\ YN.;GvC. К#ؼu.ԟ|ecm (WmCzJ~7d鍼@OB/8lSVńU5uFd}\ߣC(Q&[Al2#s9!2?CMQ.\r82>[#(:>Р o@8:#c'Yo'C+,4[$sbGNaduȊ -3$L8pq_!V#qV . JRMWTs`zzըQa׏EĨ^,hxj.qI!^ ݻA)J;`p!-0E0_c$OX1Aǽ#AB^ã 1~6 ]/j^YDjX,M$uJ^Ro#Pe( +P<|ث'ن_ ծ y}l6~N+6[swAXw|z>y֮g̯Y^hX(9y=z]u JuؾoEޞrd\`O>aggp^3ecV>zϳ,'w簠h};mi;7AUMYE>o{M`'=Nͧp/gz2Ymlhl,B!#Y]4jgK8B4 /*6(ҿBHP/q{VyN.O%QHV<bw"g\!Ȉq,+$tȫJCT*'vz9NiI0y\L, mq,A(ޕe8WhUzF}V䯆Z/U!<'54]3̼Lp lՌzш'׶#VwZh>UP{<:H܀hv!ַy^XEgW6N 03m^؃c7 8?gy\& ͂t{~"` %gAQ"LD"*xy*Pk~g+Mg97v Ƈ]#_f}*~}g;N?#.Ɵ[]/zVjDN~Di՟B󚭚GqsEnZf+k6ů0v"O/z~;˖,Y:5* y/$W#%-قUYJF>fx -J%*r(sL;.ioMDT^!IfTiωčI s\>d.9Q&U(;?MWPl2ˑ\ 񕸆C=t iɛ@&'{/<1O,nl26>V֙åH1MX$Pέ*h##jehi}Ƙ6{962YP }%P9B$NCJ@rJO2eKIR7N"%;R{8%ϡ1m"@+)e2fk/yt6=QQ9)|5?8*Nlc/dd q@Wx e{>{uL ~eGccJ: f6]"ٹ?''t(S3/QI az%ɣD@" H$2hh-.m\rJ0#B,٪/2\1^>aYPXGgG8efصj**IYX!W&7!IrGFű)($2zRLY6c3Q3#KOgՑب::N|8cBwsAQGED錰Εqܿ{ ҔpthFP2P8[&eUEop R!L/5%H$D?"@[7h[вXeҍ;pz? &;zv[5`P-אo8 Y픥oz^2O*Š%"TŚ(ׅ,M! z`V}lyIH0=ԒQ" H$TAgOO3дb~=E 80vi:9Ms: p8.ً?: U(ΕGB ں:b^êŋ§-DKQmhB9e&TX֣l? ˸!}lu*ڈf4s$?D@YB gA.?A0ܼ:W"E<ѩv)RWrv\ w0֙,\d2k,01 CGF;VzJ}y#\l gG`DӞמʹ5!9Ȋ!oB^9ȗ/Q 1ЋXܙ .Y-~jXJШ?>wWq+3*2i6;D@" H$r@<-ٍU ^(Wfo8F]ju[9`nhܴ UqDV]`]'T"_GƔU`,FO%IMmT׀ί,EsѾVY!QRLD1 TÀNjGv)4OC"hֲ92̏cw|A|SÃΗ}RzbnhP2eʊꭻ^S%JKr`غ`px5@6mP׭Lވ'avGr*/`G4ŝ0>"ŝ7ڇߗSv]swᯈ)r#77Qzq8}M@L.3ػU(^8/"Ngcl+/(A-8c2iKggmJho,^go)`P%.eqe7.bBh`0+3ƆD$&3iZ$SD@" |hiP ?o_ 8sjVBEKzZpb!fAroNy@0:͏W?Q(X(_)Hy^_[ o\*\E.yF긫3rТ))MmQYoޗgܡfZoUE!'48g0 u͇ŐRG>7Vk {8}: D31PqTVnv\SA^TϹCu]L4^>P$oNj#`Luk[M-77vmڀZ Hq=.fپ&\ُ#iY)ZgC2*dHj 4)k4VkcO1:U~X=K]]ТzayLV2 ܆mTKvh҃$4Äb1Yb'8ŒA&Z h 'Ul X=3ReSP.ɖpA^*,!L54dB<}P4 s؁h[ v[9{M41W1"#"Yo@:eq,>^=<0lMCdMltkst7i:,8=QVq MGvDִ7$qMm7;Jg'V;Pi6Gm<VE S0 xĖO9eu&)_zEK'H$:#+ZrXfgWu~&62p+%X'hxJȆ?A="BAC%Di,l퇈9'P[4n&܎<}r GyPZQ%n6KkdSXDB~<7?"`7Rn[ti: >AN9 s& ץmV +ZuXggJ"˶Ȕ-,j~{D$haa9r RˎS[f+bxTh]RdDʢ>q_! ٜs"Gē%C4!/./ۀ4֚exxaRMh3mkG5M70@fG,\Ƥ|HN*飞$D@" gtdşRIKߔl4!:u^^yjYr4*KJ)Z\"ք6d)9*z"2i쫨ʤ^iRM`Po3j 0c:4.[<JOj:yLp6wM/Aʪbyr )/*Ov aڭəD@" H$͈OGM+\)4u@ҕ_R MRD>3׶eU#BiW9WV2.%)9L)<g% ES-MQb \;{:WlP\Z2mnfBԴԫ1?>}" YokD@" HY 1C/HQPM2+e34T+ԲhϩtϔjbRuڠdFҰ,6(r!?f*Rpq}| ttPIE.|*V0Ȭ0_|4\EZrHD-4KGJ` %탥-M5zv QF~nܤ^ک*jz*과Jݛd?ޫy#ʥW{:Y?*+j/ji59RU!4333tKS_ڸ'UD>G2rl,ߵ;Oߩÿ!=ʵ]c2KWߧ.ʈ}P84.>Οk.&?R\E$rgbkkaÆtx~I fܴu\\{]`GNBB$](Zܭ8UZ-uh@[B;!{r r yw;;ʬ%222 M,XikעqOp=|t߳X<Î뫰2ɴ]VVsTsYnΞ=+rŋhѢxi=2< _vX>UL y|w39S`&N(wF[H*X):~8ڶmÇjժHsmeΒi|ȲsN[u̘1XpE>2bpΜ9~ɝWqTi{R/&+E-6DDD`޼yZ]L#~ mʕA ~++kXrLH5ޣvH=7oY8y,I^\\m60WK]g+%-nTs>%wT-0nj\ _> .g5\z?:wAg|3 £>zA|!4lP4܋^{rpgyv̨;хMP1cxUw?yuY]dD$+&Km[H;vL֭[W,D=;,@Z_`kt? 괝~)J_[U2h錞 +A^w)T4^*B_ӓ[7o9E܃P-iA#^ !Grµא|QG;x ! rSluN<3+GFvr.rq=[}זͣZfdQò}7Xd 7OZGUe'h˯nW?vŠ+lapoo?*yddfCr~AAU?Y{fPރUh82oGa_Ӣ+MV̓;*|WИL. K\9OJ R~rr~ Ynz ϥ|vRS␐̐C8,lP ĸX$eΉjl̑Tnfi'{d &6Or P)Py&BL30y2'7:*G#Tέp,# ?CY 1$!MLMpe+7WzۊD gVe ɛi3pu=[ӫ4lm䓕FHEMY.9 )AvGG>ıkQI)٤Gyo+>(,^&.u`SWGpdTq32 U9Oz(>[0k "fLT*iEVQ:TX=!Aa#P毥JxB0yƝ x^ҥKMo^xժUu8rM^jq^r{M矨QܗvO(! Ӊf <]\9dV\) /_^og rRp+$9(^9zhWDi73NliK ʖ+{%jW#x 7qw*(H qۈO]qԮU?DAkh&Q#kw!%D ,"&V.늘 Ծ*'9#p7o!9Jx|r3W,1~q+4S;*TK Ykٳ?wL-|tDo@Nفٻ*n=UF WhfzҬ b ҞR_/Qƾ5s?\kХJ vt"){w/TT_rh@Rl"i0p@bJl򽵥9Ғb=`gkW#ɳl%.H d&BOՉ&E-fђ^kKD#& (StS%LҟfᐴJWe-Ót*}tODŽ*gN ]ζ/S  _+3=@G>2#nQ1p$#i_VXQ^ݣ#b|LvS/XXOY-R)Sb1:/;O.ʌ',?Ge|{"49ÐtqtjQV"^2SLRj~͎*?Q4k\KZ=^:a8$}M榵@9%{ûK9ni#.UtU(Ǝ+-N'+yd*)ȑdT-ק'G(J,!h^̵â#ݝ7/V%jTo8?1}DckmVBl8h7,&Lƈ#tp8z8gGP1iѳ b͞c /=MڤFkY$g2Xɜ;o(d%ňֹ*gh7[\ QdDLq!PY;; uQfm>.ï'ty2~Ǽ*oFxͫEVuOU1`X1q@}q`k!t3SsG˔JlAEGO0i6"<>A$&%3Ŏ"+C#2򁭢&)WA`pȐ!2OB->xgS[gD_o.||X`;/[v= xBF 8T? /EW#ozhOxu1շĊUkB%.] ڶ"E;zP}"egfpc$S> B##ߥ\>II" Z#0(CI"o .1Ay$q" tжsIq%!I[>,0<̙3Xx<U|ϳ,YB6N+@^2|X5kd < -їm0+UT9ѣAꅿc1QHIArL4bS49uDʄ|+bkT)N5Ѣes4k\&q8viIGFuX v lF9|ۻzlf ~ڰ)d ~=JAZJ2)mOa^hߢ~{;VfX18Ğ\?|7GN9$DFA"uʓRQ Y|$e֢(j5n[N/D< ףQ4;hTqRZ$^ƹkyJ2~z)DyDfjOi"W.eDs$GG6p,*ނgH e+=7z,ZxĤo"&*/Ap9QJIyzȪ=% '|+FJxT3ѴDvlZ95ɱX1e,_ $}Dژ 4 k{oJM4kMևe2t;kj.p)\d(eР923Xu#RwO/8:yRΰ| FŋQ=.y3|۷(ƍ˓JCb޼yF:UVy#} ,Ty:A@RĘ1 2N W٨{a-*'ùqㆌ*9jueszHL|#51"}<<k(kw^%ǥxUa"q=RZ g6_*rrvŲ\B$ Mß>n2rbE ==?GܥᾥXύγĉQ $]_1`*^9k ZK w6Z˷BŮ/Fgv S~_}X~-ѣP켬댑/h(rCfbەi*@Ip9ۇP:}j!|8z+Pld~i%a7Ng~#f'I Dp<O "ro:No7{SG:*[9 b0E++mKQN|ކI `$P{B)ѣGK<32wa)dw}W|\\>Jq4jGAICJ1c 9­yB>u4kL"A !Wc;GJݻ7N={epBcشi{6WΈ2@(|@2d/B 4r,[x饗 777AR֭[)w^cM0v,SӒOH Hrh/ ޫ].V7 p-$$gE]KLiOXj="wC/7Zt{ƒ @z._о>O:"%1if-LWdr2?$|Ć?p(ℒp ~t,EF|@yN6(r^S .׮q4f G'',WʟtY0 s!#QKpfcAG,ZJ uhy+){o`]TybtĄ"8*f1.(WNKƉ+ZYqs8X"T%}"3HfL[&fX.=vì'%72\iҐ\2D'P.Pfi2!4{⎶ EoڣA.ǕI( @')SRGP/yqb_jJ7nX ;ITgaش?;|t#lBha NA*m&-r6VXa駟ʜأGA%:_%B [d 9\Yn cϤ0pڷm-1;m;KJ?| ~^a*߇1,QgtÕgri2*..}kyH M.|&!QII';$R}"Vk|kAjz-&$4T4k(?1O aAh~0mFyiodcǎ^z0SH/|̒\x _ǎH"S#7:ٗQo5yc^-v\O/|=zTP<,,Z* c{{Uga'*_z4˒Sc a\1q' K"ЦbGs=&Pˇ阫G7'S?C~J2pQ96Ô8'YOEF WRWa2\<T~OU)ǝpeq4և z΃!<P 9q%"N QZ,oLO7nr'y) gꓩ"ȃJ,:m Zu`pߎp67bgFydq w!FGqdjFӋ[D՝ +c/r۶mX ظP+!GJxt9;'Zcdv{5\+ʰ˥ڷooPyI& Uƴ,Zh!9XUjkA@ߗLiK$ś7?|~,%N QRA0(OCsgO_&M _IFX. kTij % ̧ؠpzq_-IsĀ01̉^+kUNZ?}ҨIs+^_u }9/-VB}Zzâp< 'gܱVUKi󤆫aNNxT8lOK翪4z;*4?6p?qS"_}nA{@4&Z4'˧dcGzs@~YR?-,iawٻ!s*n>TҎ><<|Er䔀ק6=΋t >CXXN98=S˰Ygˠ×u#!򩷳O[3ZZ~ݜX}=Q|96ݽTL' DJɫH:FITz5*U_{˥Ӑ7Vl0iat*?|CgF!)] ΂5s"IHLDp S7*wHI@hx ťO%agh"$Nz4&̓4AR Yɤѳʎ8)a)9Jڼv%>YfLBq cs?J4r (4EɿҙWy(qU~V1p~Y$7yh陆BN%O}HL: /GUu%$ws&x5!恭:d|?>(A~SLDǞs?iRnr\w[3kj֪.ݢg,Y NT(smIcJ"QTܣ,ּ-JU+EԩY^ XHD Ry,gwcFߚs# 򭎚 0"M+2h§~8R)5^ӓB Z 4ڗQu5Lr'#p',vV݉ѓHÅAfX)8}:3,Qzup.k&/ fս %ͤQLh)\ dX;r(b+)ی\LKxso}\\<"Aȱs%)(!ppCz5hhE,56g]BXL"P/vHík7A}KxV(`G'"ʔIrnDwYqwAsO΀*W( REf.[atp3M e[flVOۍA0vB7ǛoEzull(ڼV `qLM_xݦF.ﵠ1j=MLo=WobѳcMxZ)ߝGw`]y/-sFĥe|):IJG|l4- {: q~H.V, {=s Y(S&*.Fzf/SӺ Jy:*SYs2qDfŽ%E *P*xЬ )&4kX q 0- _OK~(>Y/}vpF אIiYÌ)$]@0%B*rHIZZ"NE3vY01G*"DNGa%aP{8]<p:S\ă8S==39z;ȈWCú1ͷ1cl]:W[*i}a8z`35V-!=Uuxil'ƒ9Pn4jT b䍴iGuj5h:>V>^}sZ5k!C*@X8E4j9 {7Zç(q42n:]£cg)ԭuFbHn݌FM'~*Bb6g#{}ju?97lF>B\*`$t aRt\Q|/SPVSg8RPKm_Cpauk}P,CQV,@IDATLFrر}#öaQ"YH(WC~gSUoB. wB_݊1et ># =&+5@Ƶ0i\̚Mt@0냠-HA]4lTkUǩ8Tl3ԩ _5t:s4# u^3zWFQzU/_>&}I)5+݉dm/ġói٫L+:<-'SXVkTC_1WCx{+>y^_ <  8|e|=hOԡ? /w֡J/м Q٬brX j;Yً_IoƔ }a9mZ4ak /Z}2`f_߀Հ+y.T$ѺЉ3>DޘPJ1̌qز'ԩ5m@揰atmVEhO# ,:N1`D=T샶;^Ig2JߣKѮVIǧw9Y(;JXz,ŀ>[_oCM$gvGC_io:-gڂt, "xQ 7@p˄[ X5ob֐fsWԪZKp C)E$WE>a,-|S} Uķ]ƈɯy&RMQC9ٔYES@nKd濘_LGgӨ4@xigˢ=TgԴq+-51 s8ZgB&.M,,@YmDJb>ߏ,>uVR};f;2xNqU*B ŃGJ\?uz6% %-<tz Ş7@G8ƾ H""l̃ݍ1y' ;K*é8$":mZfA($%"",~QjMl:sSy!;d$xNaz oW_y i\VKçp-$1smJDfIZ2/qz,*2Νsr!ݲ{Zv%"<1)1ard˗❶٫Tom$}r gBNF}o{  Gpv n5'ÐIej:BN4tcMasa?.\>],oD'Q}hrDηLFEd#QtF(Ɛ\s'FG!:&rlҕ1m8ЮJc;~Y5#90Rj"~|m:~ee!=9aie:ckv)J>>(]/E| Q8ΜCb|4.KAiă eNG!s謤Oܳo=Ck]~]hBơ"11QAxvY%q̘1N>0 O'|v(\;[8¢r:g?^FU7?ȑ#83^~>m1Ts@uq(0O8JMQ-DIbے¶h@ѩBDH :'6o[5ѬEUgC"ې[Þ깾{ۅ߭#IVYB\KƷ~7ҿ6~S,}YM&NH|1VD]_SZ$żᕕ8yEdZ!g6>~䝝Kc,ؿyc諈hj1}o);_CŪo^37}{KE9$ ;?n N?7f bܴWDp٤dkIy,O (g-DLq`yum,_8 }4HTxE|lܴ;sXh:#rDJU\bꄗd!QI$¯Ir-yŋCvNQkzEwzra"4>֌˧*C>H i~ΕGٕO)(r%yx?p QAvҽp C=LfiOmT.'Pb!wH;'>yWGO£0m# y( cãlMԬ♷5"H}5V.IaiI_A~/*}AOi/pwkB9'<\ƟX,m2!c)\\#lJAah`iɢci?:ВPrU; BY#B*Pݍ㲑 ;b:)]9]A|H ΣV[![1pv0HzΡ;J,i6@'ڶ\\V•@OˋmwЦâE?PnzR +E5`NS1Fj"aAGFKD_iH0TYo:~;jXv&,c!0 s:WTjH1G38&:.ԍ ǭolcՏ#755Kkkk`94Ζ ǀQbx4Gqa/$d΁dt}]󣕛|)8KKPIKD9wimPܕgtHΨ-u#{GzV°sd2llmqm4C)`S$ډ%<`@_;EٶX8g 'Cy F5=ZDJ.n~BW`LC-zH?kWâaOG#zsk,~JWNØ6 C.NwgS@-o\9yƩjC<$E\΢,jIC,3; @؈kڵ;f/ی${]JGN =ǍXM~%>,h|yewṀc]<ބzn֎Pe4CRe_:#t_ s\ ;|/iҩ-`:(EZWKUX_NÂŊ>Ed^Iyn%KE\4^,fp+]4QWWيm+#:gJ,R4PHestkCUظ!O8t&BY)L&(M-.L@J2+%2Ȓ*'Q<#%its[-\JPEI`ɰe'BVL-`m䏅Ls2ljtRK`̣_i2h12?LyAQNf*%knØ&Sʡ ?Bz>|wr۸pL< )c bB.)=B,D48}X`+Rh/u-X7/&)aG/KOB/`ꈗEGtjI7ꃅ柁90q*S2F\=) dFbJC1']iغ+}A[Rb]8a5۰pɗ 晴ܽf̘9XR\H,Q˕BՃi^s澎Z~Xh,tEf8};ӭЬc?ޒR+Ǝ6]~ y?}[NZ ۩2&2+1CY F𮑝+Gw`wmV G9)/}0)h3 vd-M.50sx.Mcqʱ*)!8YҦ{2=ՉhX$d-z%vmvKk*||6.Oc{ Ǯ[Q6uZ66)#}&4}&`tv(JW_ ލIn[{/Ap V\ y%WRSp']LbZz;l_Nq1m$bܠcjsfLQ) _,ZECR gC|W-GF2އ9Mmy6nNI6NtTo &N衝1gX' SwFv4`.!%=[__/V\9Z'pGy٠M~bێ cG݋mdC4DĥbN7aƎ셥c{bpA>u,pZwDXjV +(&4.V,hGw,nL~E`):e\Z.s>Gh"Yۓ2ǏJ<~qXa5-)e2 /51A߉+q)0Iv 耐r=i ߯C]<2O} q%(fڶQC=ChEz~#4X2 Rldlŧl =[vâ5rF8N}h1P*M1qMv6).Eq2ǻ~KȹO<̜tx'-w2z$saؾX {3ΓɦʴMZq^j"J =x3R6ͧ\?4EV0/M`Ŵ80i zVɻWAnE|PVZGbnѼc\2g(Z;o"$FMe 1.Q~ݕ)i@;2bPY ZwUrebo߆zё)K;8vbP]t5ϛP6xbqƇWB`~CalZ)z6SUtMnׅd-oT&n0o, -DJ96n_x|kZL1rJ %Rnϖoj02Qo~KQ:ѦРa=dCTh(2Q讆%۪ ծUvf l\HVEsZ‰Pu}ci0%ֹ9}IeނCASu +=?.գ@fCP`+ N\l-J3f4kFFbub*n_ +C6%skqyf,-崲Ax"bBCN3wdY}ךGy !*Tǂbuv)o: TŏgNCfFZi.L>UݭH%t"=vQ.b<릔Aـ͈йd(Yk d9jDg[m>2EEig3p.l|Ӽ6nSozZὉ3on #*juXBz p#2wN!&*(eOiF&i366E<+bw_d(…"T^2 ^$S⏜̳G.ĀdGY1>Ys\!FroR\>$!֥T33i UjŐ"ARŞl6\[>KS벐LLh)RӐt-}_5+wy琝=)3’{t੽ao{ cٍ=BS*fGS3лKK2CVEФeGX#5jZI7p|ۏF3yuǬw#OfdtTGp+E|]ŠCP;H *M~[V,6 fw Z[vC*MC#fGg0AV}K~X=t=t0k(^1Y"wGF%,(EKSJJ%eӡƠ=AɨEH~h6JYH5zwG fSNK6U4(;i8(F&$]ڃNmFL Y:WѰa,iT*iέ"ӹUh;1}tOWx]2YϦHvw.Z5W7c+/#BX٤ƽ52%?2ro  _-EcY$%LiЈMx'ԪlkˎwwVKww#b(v]x>yJw#ݱۻ;3ݻw؅;o̙3;3gLѝ1MD9.+KQ 㮣7c<:b*Ke\)^9?s&>۞7~AYz˩Z,@2H[OYxB 1~ܮNe{N- P= :(gx{iw12j-&!?/淆X»r4:>4ңes2=!Ӓd_ ܈WD h00X95CVh 9q3'pGmͥ~ lv"Z\rᾄGo o祣a8dEܷJ۫2=vokU*{X+Q1 {BTGE,ܙQ غy)~< 7ߒtr|" ~:r7͆^۷c+  v pPjt>_LLXQz[@LZDn32~ߦH*bh.^ꑏyLFnLCԉr0442XYSDÝZ-:6FR-M%QT.o=,yKM/၁Ub[-3l\O61lm5gs~TC›^xR׏49#8wfq`˷݉gZ9:?H4Ln Dx i=)^]`VnhmD,!y@e8)*emymx6nB`e%ϪB1mb\^cS$ϤWNvOG2C6-_FXGZKxm&6ʷI۱A'46cd9&]wSo߶3)>kKva %\ڢk^sqe +ZnBia1Zz B41mW*z;ee oޔd߾z1&d ɰ%{#?ϐc0Q&}&>n/xoՍM*ePx248(9;q>$y[6@Bص/|3 -)s'PD3aJvR&#D$B,>Û#b]R~EDL)9KC] pCϣq\L$$jlpUm?WΪp][߾d = Pi9_ 7n/o7BP\yÀ+ƐӻI KUĶ= `lG }`eY9ϰ)ksǬ'"3:xr'J߭o8o/]f]ѤUaUy#xYlIO|[Q>)GB5ȗ xHqSh.ל1_+}'Xt:4GGo7Gp7Y0ۃO |}_\vi KϏ{Z`IxyпV݆>Q{ayxWT~mkozGb9b|Cfse8}2gǢxm .9 ŽBiQ9qزbnxәn#zQ)n>>^/ј˧xyd0(D҄H{0ugx_~]4:'Bܨ`og1x`X:2j'Hm-k`/*q;\u4?v 2> <ȱ;7,CAyCn/ޏg ;tjT/Fh" #35WW([GOהqpVD9O#9>ۖo4 /տXǡS]hxx3\MyH7l}KbP>R,84g<oaHtl74|GhW?*LmKc#ḑ聵s0ƞr6a՜0ifg_NoI(k]sp&F?l l,;y~~\16J=&„/Si&*>|[`~p;F{"x\1~BlFc!1!wqylZLXpT"cMYN_aMㅡR%=<f^5r,k:-B-D\C$bBԕxEH]oTOzkQ][`рT`&( Ć<ⳉ qחNN@,w툓QKq6Μ!~=|)GF-Q?Y\LWWVV.@ /B-ulRk~CgV⾋:+ &%U: `aH^SR̜9'&#F(^6-5!m+-O_} _܋gSijwg?~{y-OC/E?_{6$c1zsh32K?db藑تFXzvX&iics#/J wr)=o?C]o0Q8g]ź*|&Jc,;1~U+V(|뭷xGϗ_~w} yWpDZ%āFmhӕqpI  Y@n% <_j8gҾŤdk1}29[;'xB吉=0g϶&)}Ih|(((pD=j8ihJscBiܶ#K21c"?.,]}Y;}*^mվ 7\ p^A`h4ZwVnW|lܑ: s>><6sisomx!+Tgy'Qi$Z\KlE@t:Oǖdץ'oVΙmԪS]{vCӶ@)'Bfc58P³Iuѹg[9[/zH:gtYvܕ2݋_>^{[J _їtqKil0?3~o٘;|g tmF]po1Ng!s"L+䃻$#@)IbD8r`'E43gG63nܮ:6CkX6!ɧEoNn$.d+/.3Q4rc32sВ5ji)KК-ԤZ|4'_T=tmO=t)ByЧU[p[hW_|ڹsföyfkğ}eNN.O7ynysEj%$!Fd1a裏mNRCǎk8~2DP?>g85koݭQESV\ Aq*y9 y*Sʢ0'\Gx*fi {d1@`  Pc nсY\0YU7*a֥up5oH8#Ԭ~Q~~T& =dL޴_:VVb_;o2OdV6|l50ô9],cO޹F0lՃm zT} 4&f$|OGX'|#yꚨ2ե'T ğlO]Owj`KV<奴U"^< Lcka"yIAߠ`SF:Xϴu!Y{nU= dΟʠ;o6jj؍o^_]--6^;8 f_g.睫=ae0WNfn;3a71`e90']MCߙWZE I g0뙈 Gc/= 4Nb6n:añ@>>ïs:A1n#eosmh?r 4 k_+OߋfUo7t@xѻ1n4{ α+[Ň客=NK`߯AӝBdÕy4p7fi/C^2ܽcٿ$ {y470itK"`FU JҸ]9`Tw> T̻7N\ =<ڞa5mcWL.,s61uh դU4H2+3*? v%"&̢۲t⺢atwv;ՕJGwʷ`Iz9!Gp0u5=kN.zmqT]'+Y'+L:\4 _|.x0D'NGrwZIe 6&\YUC3e*jC,F'Ӵ㽿mW3p97u_mtVЖpym >   krm_iMiUym ,@xh\yGX3 ,+YCct\zˣhk ,!WAh܀{z-NffMف yng`򉸂c[/`nص#ZǨExC7P'ҧ'zi/low΀1D_=x7<CF܎EnFݮ鬝|еu<2uviˉfm>y2W>]yta Чq1p5pN:ȦU4E&xb|!߃z2 f"/d$0*/ ;W;Ʋ)ymx9Q|hU\.6~?.坲 ~7?0҃JQG ǩѪjK2y|8 BhXJ^evCVp53>^ 烯|͑j`sUP84P# x_Ɓ&tqJ z 2Isk\=Jx 26N[PٓB;SCSݴǡ N5T */]79r.*u:\<5.}0Zծ 1Ro6fђmWD_Jϴ'Ɓ5 GpPYݍ|brGymuiߠy=(fM78 rD%qo|е6^ZqdH>Om_ҭ #{(,5Y-!ʱ9s׸tܭn?^"v(̝O/_`ke~Y:z/[b,mިx$5?_ `zt{n&D'4GBR7hzPwfz*> INS|(. ħan "嘊Lꖳvhõ=t9!w-il6Wp6]z:ddisPt4t5oNx!XS-ĺ2c|~dqX=߷Aw[; 7]hֺ ML 2=Gn!Om1w5-)-&ZehlMLҪNV:Xq[c|RX5_%b@5nAVĖ@0|s9b<FkxhG],ݑIaIc_VbC>#'W֑FQ`$JtƒbtJ$-f]SQGwKq TWNx8Y,82m,yg%Q݉O; "MqeDmìi?aE\1u|Mgu0,7B]2{^ov5P)< ĨstM+3 ZeyawlGZ!; b,&@4:*Z Զ񡵣. W [х@T)9 HHkV2.},{3^y- z ߾sѐ3U-hQ6x4Cpu3A:e0ޫ'ɠ;w\oWBlA[dU1q8EVR`ޞZ7rzvMy$ۯ=oqi!rx|(kz3`rJQ{h|HrR-JرnX dM.* 3"Џ1j!:"M{] Z73{ǟN'<}Zey.xcXeV͟W;wB<^%bgر~=&VeQE+kxl;V3~uv{H5Z4ig#bdYkڢvѲ pE3>|9S|?iɳ#W>'O'LC~=1pi(znlٰ&_摸_|{{_v홏i,vI>`H$[qY?1wZ߉UKg߈¢|lY[vsvlܲȇiHoTsnu7KoAQصc 6Ǻy>pچmkkLŐƧ_×Ƣ4lc_^}6؋yYرyG*ŇkZo>J dPLB"xU3Wr‚.8<F"|:op]/bîTNiY^<}Rয়~رc,5k8hN塵_%_d04N~PVt߹݃T[;}7Ց.q[}=-k )qLn\rUʬY1x&\o{s=3 c \cŴoYx6.W?蘱tJv/&c:Ct>(**r<βheTŕ9iΎVi1q~cB9>cկ/ 1>zOq\} ׭[)r-s g>qm9[:6.-\ΎY=ظeQ,W:fⵛ0Yٵ/8bgt|h|ܱ5QqE>CÇ TGU7\hq$|\×;\?cw^ NJَ#nt͝;WUj8Sl%K}fRSQfQ@͠r8(=}vo8{vg|%?AD ., n}?8=P0E\L$7mE591x2DDʞ@VdrZ,zjX=̩*"-86 #_ KKhZ6ν4W,+ڗX4y>߳Xkbbi1:.r78ۅڃ²֑g\U"X LI5iwf˥b{6+vѺX Q>/XV-sn#F'ӡٷ _q!ܾ u4gVl4G#kڇHD?"BP23m4KN~ @Ñy%q2*f%A! <VKSg â D%cuw%E ²fA(chb*=c (C)zU 'oY<#+gcc_X2-5YFQSe/:~|8< ãa6Q29jyXo3iu{PV D-U夽]nF0X\M BRZ:\ 8PX1L^.gKcZ)1gwoGؗ{=)YBtd+X<"ha!# ~"k-] |lWj* !AJ)OѼI 幹m4m˫ixōL-Iv6kW Op88I<-y_nz396]hؐ2c-G ^Cūو5'(<N2P?_1O!<~)qI>>  )aɟ(P])j2"/#W+\6snET"aNQW?G^t4$e#ؿ^3;:#J8 3q>aPx[Mz[15vBO0I+I=!*ʃ$N2ha:PNxU hn8|lU94T-Sqi]a+zӭ@yI#y%e> *| R0ҩ?Wqw~m}|H{nFVF!IO({'#"%*䧨G/)W&}eGS PZhElЃavq?rt)P=/Pm" ː VJ𭈓/ ysx v8"㬓0gxNS=*i?eBW* {p"0[Zmg(xWSٷ񭀋VUْ> TO!@d%(*?PmT.C|UQGs8ӱGÄ =P>C=WYg 7O{xPjEad>g-i0fڊqbp,x&g?nRk/JKKHUq<*<xY%7i4gͣ/ޓGJ{,O9Y;ΆcA~x)}aV>18u-"?> 78+ޣeK*k.]hQڙl.&,! eP yQF˱/OgIy@RFhW0Q릠$o-7[Y} >W-&޽gmm޼~-"""EOjHE9_VǙQ0( |.)S`߾} rJg)i ᆪH5:8g> rsҤIضmxqQ,| Qs) r0//Y ៭?NR)%%%HKKC=T'_e[CaQXdmyJ,ޫ"sJ*K"VV;~"t\0N\cw.6Mtg2O.u2N|{9lN$B2%P !-U:9ʬgCqW:Q ø%s&^3JVǞQP)`xԤKchݾm)|w8 _Aye3QQrsv!T |qHK&U A*UMyQd'SdOkenigJ.W6C]Q*RIcxEwQEG)U<e?PsS VQn O.T6O'1i}Okg({!!!UqגGxl2qǃ̦S O9r(5b"hrM`DiCeO)3*܃*46t mpYzEF,)Y`{BoߡĄ]`ɟod<(`^IO^}쫅*|sjjkԤoIWq れPO\{!/R>wx"+P?)"5>(689(@(pX~3 %Q0)p0~-0%QS_V%koy:b>5 :FTԇqO!45" ygP餘{B)G( lTe#8H(Kcظz1Bi 0z QQt"V®]$t&UV3xyQ1u-~QXQ@K]i<ϙ ''/Yj޾q5yQ|1I|ON0O?ӧ$\LJg$M9zVmNH|ǯ ܲeR<2^+R.\qaϞ=SCjF%E9sY7lؠ^5μl285)b,6W39}ϓF'pزe?UjӏKl(D>)6JpQNX>A( }WnÒХ8Q\1+ϥҸ gw 1$֩21jt<ǃP%⮺*$''Z H 'WƢcǎxbػwotY%gʂ+V+R]% S N/w| L>M6Uq -~¦MT-[*Q`P £WZR4xa3+״mož][rLvĺ ۠u3kzXG}Hy Ef;u3f 22Ru6R ^eī&۫H_9F0 6DVԊ O.'Ase]85P>7p>> fPߠA5={I:u8ϊMAe{Z0ufТE 5Y0a_jZ"Fxx8>C7œviW|SFm qfz(NoUT`Xx4m3|۩s/ȲR}nAr=]_ AICɤo߾j]ڵUD-N{U2h ))I:eEdA&*uCQllA*<)+(Rj٬,RS&ɊOtt}!VxVxY*LȖ@/+r?cBda.] lۺMfDBB>j޼ҬSi嫥Bh,_Y5+*aaqSk)PR\ FA~BB#P+9,Bz^hԶ@%UB:"#6qՉ])γt&Q@:iF-F@QEY>Un5TKB>qLpV|QDm!!q=ϳfdCcrძNwxv0ebIUl6N:.?Ӛ4'iES=RS*ձm@?cycNPB1(FD߿quЦu[ś'9SՓ?Uɯr\VY PArB;Wwxerdd:wYf)+.)Bet3Io !!j {S]! cYN=O9eaLt NןQ KB&rQV5D&M9y&M(ǒvPe"#@UpEO\@0DZyi|i4.Apے2mAJLOCCwˢ7OS2A$B-ɓȓ#_/?zK?ۏ Q_IlnUK10ӄS o*0?^GycDD$vf@]p9@c2Kz6oe ­Myzj7~4y*>D>9 #e(rB>NB( *( IT IAT| _jP{%Q</{O#8XW/VRkc9+ph٤ w٨S+-Nغ`ׯgGvWJ|^+yҙ 5NrDVq8FPεlqq2DQa5G:Y FDmE1EEsԥ$ ;]yl[gBQc͕|z_b꯲YWHJhԯB dwی5;sufq@@- ^j|C*H$)z֟քO*7_]|u*KEBV&:g_T/>j4h,_eT*Z{Վ4*Mn2*M0Y!xd rQA穅VE[-\=FhwVB} s4~l+ 5"Fi% 0Ț4ЄYDkzɻpd pFB ^_P&$,)& z.3*_s&eSMJ=?<_5iݸC-Ee̎ S?wxʯ4"?U8b9:UBTu_īGVFt"#DՎ@ƧUzu^]'՚ 4||$qeP$o,%'kvnS VfSLuhQ_8 4~# EQ+›Tx9詗 M(BR&E5ypĤ Ttիf+\L z؄3ؤuy$V NH[>ta4w?} _{C!`srʀ8Y8Yk+W`_U+N/ 闤֛gg*{nq#QhUXy6īR7"U+6ZetC Ri1C{Xݴn45im=2g5\a[ ysʈאR]sbO W¯ĸ"ng&,xرBA*#ař8{6IyVqQC=drAjD/4 YyEnw:1U5AIy1'O)'Ȍ\,%AT[rnQzUl/I"ŕ4O|MjƉ{ ɂLJ;dfVW-nёv(qf d ^/qÇ܊p{Ķ+c%q5y4^u0"i<(%[Sb3K\gmW׋!xSNRBt>3OgwգJΧ~]b%vh&[۷܍6}uF݆i[ KBpYh4 c3/Y+BA&Mfu%AA̙4oҙ0Ju 9Iw{>{ݯ`y wm7i)q >TB>L 8h* QӴhdU5@2/g lV , 'zyUV/ ,Y~}n{M$ߢ.(,8e Q[iOwTU:Gh*Ȍ7r&P* -GUaRi*lwi猔f@$/\9JUΒCΊ yyR9! #459&: 䪉GGHq愅9;XJ=b@|y([EU[,Gpse4mQx.# P+6gӸjqV Vҗrh5I&VK|FJRZ\ bK{dHYi& :޲"xE#OޤixTl#~GNo7bbzRS-7;~BBE9Рpu^91-^U!M=#U 86oXISʝW>h ]6uTrosOOhk^I}LݢUB>v,PفL̛;2h;bx_/042,WDbJ*' , ֡+b]3(^:;lm3۷dYrfQ!?DrvaInƭCmH#_]/% u}939IJĪ 1̓k5PN?. Eُٲ{ABx %⪢JPG(5EPj }EB rIj' XI@^,\4[KhbdAHIm&V2F$ٳ~|y,{_7[@Rs'xV`:6W{| rnq,Rʻ^p/ȏk͛x :yxݺa[ݾkL0nhU>XM%^轖2{i w4sBD)I- ޯVj"GI]癩LוXTp9?]e^dK,ףۗGJ`,{q8sK']Sǀ"(D"TeX.%FًrU?x+}oz?1*؅w@<akhWݳh/fB< |uoԍ{WNLe/}~Şw_nq@T| MDfk2(\:ÐZ?$GL&jXCQ2?Rxo!@LjӁg4e`#9TKRJnpa*^]h:)VAU8Jyy'D%%VY4 Q }4kTWi'YLJC=2fn+(O,[3o{*zYا1(/|Ҕr>vgO#-ڒ#:SC{b@ o zu"8ɪ L31໬4TKEqW`V:rELJ,X*'$Ņ0[LihT6!}h/`͘0˦@IDATw&>h`bKKHU‚5c?'q`6jDŽ`#;(h:h7L {;{.u?nGi&Q|"!  I%(ߥYia^]Ka h2t"|K2|ZΚ*N_3(u#+Qaiड़{dRY8Q;x"1')O Tj *Š eM'Ђr"*BFՀ ŦyX; Sqgl$D[r2$2%K,#wςAr˕A= ȕ" R5w]₇rѤvZ,PM"iT 彺;ȕڨzIGҟsiCsaÐI\

"ooJhp Cxim0ʂ J^ڷuQ \װ3>,֜b(m*&R"_1 n T^>/8\pYK2lJ2,E ucQunf5>eܵVQ+CtxwOX3ؼ~>x?GA9GYiS G˞KV8yYKUϊ۹1Ap^i̕KKM i8H;=<$'%sl Od6N qSU=AX2.F;5>‹/)1˺֜XNZ ë}J^!yf!eg9Qnc&C/]?Ii㫆Tݗ+8TBpZ8wcg2 @YB|j3} T!.WN^g86^^)IfWdrW s>h(˕Rr$cIieCͥTAZrɘɍV)5yԖ iUߗ_2ZmӞ_;ڧ>,+DؓUGpO4W{-#12(%4?e.~ܿ\ʝc&07M>(}CXh(BsdJ_u5.> ;^a!'=e𑑮rݗ)_m:Pz5w9wwspWX|$Zԇ,C0}6=Οg^.k^0Dxdhj|>b"\;Q?2%Ta}9ظ!:ys!$ZnhdsKK ߍ#aѨQe {x'R  #"`CJ7=lI #QtCx:ت y8;N^ 'DzM1DP7lՅ&%BN!ken9$Q@VD*Tȩi4ofrS7B=bRTB?'|U͗W09>޽4KG"G37LYFh{gq=xzєy/a4Є92^n`ϞQKq{FTF"VTp% Qڒ & GKNqhQ̅2@f9,j x39guQ4;3G!iw[1L%¼<<שAxvvVkWL qn֬FޖkD۪;&ч.-piU̔77s\; Cmϱ Mh'ݜ \8[hE2I`BɊ_!gl)T5!9P4=Ӝsaq|BbU5%#G8y ޵(4˦܉ضw*@hxS4n\SqCDGբq'a>7;D##9􋣚Hdg<©[䘸""9.V3jThŽPhe[LX2ՙ“⬻طg |au'n); r2ƭp\'MLT z)I?Ĺ;h, ̝(ơp ]5Jċ <Bb\n,"@3`:ߒTϴRJ? (]*[~2[?}ɋ|MAKt[-yZW|4a$G쀮Z]o' .^c"w04L>V(;+]IaURҟMlT1O?eg9ۨOE2É·K~w!> 9 i Ҳ""G1~bk\MLйX'D?]GN "CмelL]J<k2} ҳGSѻt@ɗ!\C_[nC:`3IMfe,}.F19.g]ݕͳ ^n_iu>&Mz  rg0wIa ^-[$؇]c۳v^jbQnt qT S$0[2OymA^ϣF%/[Hčuޝ0^%u h~} r9_wVRbII3k;͢_]Gu'⽍e˧O(4)kX,}k|EzSCZz{$zmW1Ӣz;4 ?̨Xh:uonH_DKaEAVGi .{NneR%~'fm9C͐XJU:7wazʵB!UnقL—oc鑋8}t[Ǧ[B?Ę7"7vNavj(@Os1j|+0=LocڴX-yIŦukKMD^Aׯíd\:Ѝn,vݎ2=08ƏaЬq7kEv# 5K#!yװrGZSHIHӚ#yoakcъܼ;zh}ǝKkEQF{?|9 } Ef?څ1yA6uׄu_Ϳ\\ 9-dnX%.ҔݓaR<'@@h} V3|Φ@k-Y;r`d$A8!%Ru2mF|?dQZQf[5*s\Ӓ,2L;P³)F_ɷ*T0!璖<-d&}S%ʊ@=T!{19r$I)Y. 2qAYڄ$ZyVA/?=FTÕ潡Knd_D7_C8_ /g|5!: qWϜhM26e9wbl~ nЋMW Zƛ$0?eNlD[bAF.vԾ+Ln?m.Aps?Ѩ٢0X?GnaJ0ϻI ͪ]SZ냼xڢmx!4 D?> {SX{Ԡ& -"k‰f;I9t|As(L ρs1d gP&<4ix^-祢v\L]6 ڷB-79>?ܔ;iE1^\֣/|}&are2S! =Zui1{`MR\VOVB'iۿ4bߌ|C\lEvP̥•B䐠Q(R, ὛرنMkt- թ3l,@iӰq{:-q(IMs~}|f2cAPfNlt(^s Z֩N@kOw^ 6哛0p•g)Xo h@Ãpyd? !UHp (Xy9Fp6¹˷S0HUƕ`fАC'׬r:+&@kԎ!<6|]I ;?+Na͛4EvUH!Arh@3 ʡ їn,uYXs{nSU942BSgG1F܉LA1qYzmҴ>vd"BBjoMDžmm󙃸0Εk+ܿ ;Pxr<+?я?23b?|?+8C(' k1ũJ Il_-Cʵ\=IZ.ҋ'\3Mg1PT%mI#/];od{wb a6 l"g?;,pRSLI{n/c{E_JBrtm!ٵjЮ-HjPx#i!)_f^"Bon"&RV ~X_5ri-0݌:t4 haon+(0*"jW^uJLj6aÉ_)v|D4 d[~FR{Q ْ,ObsdS% ~\(ߨj:Hh|=v܅!+P'8 cz>_Oȇ0$ACtoֈ\3]Q'4'CXL;gVgy"y甼CՆ|U81#u m^B7JUլ5r7nI=mi4Z887`-8dlm𥀌egօo;:6ok2+6&p--1ߓIA+ꛓ}h9;4bDc@Qp0R!|iοr%ľ'aҢTd\OJN#ii&&oDs䱃qŊ˨ub#I ZK;ZY!<@Q ɄJ[v%YQR#L}JPyxD)ke/^rЙ1`P+*St nhdmH.!vڵ-%+i 7L J*T5ψ i~z '~Mh]!}kp&1&6DV;8&< SU1Rpe;1r] ɈH&)LS;d^9I;_,Y*opI vyJ4ER>yIK !Avݚ:{(<85M_ >AXj5>7QH22SS+GO8غ(T #-PFsdg{QxH_ _~2*mK~'KRLIa݄j|dM$ ٮbj4S,\j=d2s # !+v2RHOzߟו$sԇȴu~szżƼ7^bV i%GL5#=ׯgtFԉMdIRN&Ф?#>ңL"ӗ5  ڪSt| áz,I| <3\шYoOBH1Iϡgñ2MK4D4>K ɴtP12ӻ$Կ6l9r(מij^u?mB^N&\ޏO!ɃcI̹q| n/ρYӷYnBe^0Kl\A]ķ~ﲘrlX$ 0.@Z)Z QL g~X-XP]؋>ZBɥ1&0lj4` Fܥ/l ˓ߏߣ@` 0w7|d!3OI qiO¡Aj5ڟw?/BXso ,hz6ؓG ?Wmm=m*} wD$fQE=p?vfS12%+E켌Xh7Szt.;y]vUt`>yJe1 rr >gRJu'܎t'a'q9FԼ2O!ȦS㓕DaaMR*a-|yDd^~2`i&:|c yMrzEܹkYw )0KcvO0)$, 'iYYlM.ՑY'pbV{LeMƾ|,;EfuN"Mr:` W+`q=es-(:}6*ȑM!wsZx%i1:T3]ș_@CGK^Qu1D/}_Z}%ڇ%d L^h3c( U1S3t~oQ_`XH t_^I6ZKF78jX' WXAAC1voyG13Tf=u1!bbq4[! QdV`%8|w ¼q׊0f5j܇k0{zTs}= _DK K\&߫:vhKbD:-tƬyhy"srpv1%+ YNf0>d"yӝE䷾  obGO/֏@ ^Ow+15KK\WxG;Ű HLniEs9s¬CTÇm jDESl%O.>TGPbv.!D=I^^DumJɢBZ(C%-("aBGĤ[زgndSгvUky>2;'A:,Cd r24~&Ցg0DH&|jmc=͑7U a'ÐFFV}ah1?: ^A"g>̽~retϥ~w.5)7T3` @ =,CF ($GJV9("LO>'il6 bI|d\|`fJX]&B܎&>WLX=Vc_`c=lĔZ2_9_zal2?J>t4DHQSHbN9q!,W'66Y%,^4axzISf4*ȥy4N45E;.7% CF0ցo{h G*'wĘEK0~x!wa"&đS{P?d #c6ZPKK|g kN$&,*Xp$b~qc1/#S!~6 +fS!LEKϥjzE{97̼n*dhu2ԲҊ'4KcX.56i˿ňqc0?F L!n'g*Uk#& њ1iS:,>X&Iz4&sMXGvrאF$V@+.<765lOCoEi?ep@@LDhljz/w=Ro Z%h#Z T|$8BbմWATH& [y'{ ,/f|k8zT#-DKX>KC[{6 _gdg7ʥaJ),_7Y|$%'ƋLS2'i .lEO+k(kϋjsskcPmOW"ˆj@wpEYE5sj0`W u_"j(+;_r&V{X vzFw"iF78wr>&gV Eʾ.zN'o#Xw =;D/FHxKLk5 vĨa:O/ ˳l7cw &;۷FXx&Ma@T!z눙p%ĝ^ 3хh<]G9ak_))RCx$/>4Mer[/'Q?d0vAh=fz`dF{s+|qadPsyQwA ENU7 -l Q :UX[$3gxS¬I䦘wͣ[nh\gyEhZuA?R?ci4M<y,~ +~ވ ]E*dEwQ唌 c#q\Kt$ $&d1W8Ѵ=kܔkxϊ4aF6(χCl}"d'bECY,Gף\$ѱp=!LB/O9=V>PAͽҹPuԩFYW?d/kI)J6l"&EOLO&u}#vߏdF8 ;(Dr}^F: U/!irX$ڒJךO3Y_Bp;l!{"52N,2.Hzp ĭ3aQ&~gvB/HVwS`&bّm КGD_C7Q? ݺ{6dqėf-W(V4)F/Ptx.(=!x^}^-܌>^ӧm0*6gM=*B4|'ZB+j.2fBx:y>(Z<(,p!Vf}:Zˤ[gTyf ~5gL` x3^WMg_\#-`RF\MȎ]Sq8jxIc,&;Я}8}>5?֜?vvBf?ԗt\kl1]!U_m5#̼9 u$"x򢂤2)[`O`+3q{,p._[F|zllF_fMG+crG[9InP -P?a!/hHe;3|H !3^&0WbYNJK]jlU$>.pKtMwk/\L-EXxn~ֈ Rs-p,#yV#~w鰴_r1MW7qUְ0S[AueJ 8+;OT bH}a;ڂaKc( .#Ğfӑt],$UVV "  ձ [W1419{>Šqmq=9'ǎj62T5X_#f }Bw\:?94 c"m{bD2s^2B`!;(x*jܨhl$xda#_XmdߒVw/R V0-p]2WCɞ,|RNt aj Ռ>[3nx{^'vQcُAYHp* ^#1Č\; ,#[w TM=ͼM >^DL Į &N]4bQ/!˚T#pxݎN>VmpA] l2 zicx%I41Eϓѵ!^pqJD)61Q1}.> ~ZqL]<>HiǑNpW*5W'l&HF7dOp>|:ÙBtmb9Z tD/{rD_cߥ mCD@D\Iicon\z*%N/Ӯ3M(-ҞA$rhWOի$3 ^UpL?A1Ue2p䒪lK/l)lZ>h r_WWz`#Tk=l9oД3-sn~3G/vVvՙ TD-p~;cǝ+.dҶuyv`|jSD?nnHJ`uw T.[.C8T9sg^au3ϥ\C/ )#o_7c 8ȋBX6WMp u.BL7tzN۝aI|()̅Xgc2ExPY(*P !!ߒ S"C_>7u%+ (;d-m}K$ޥ=x{Jû`ƍ.qneX{@IDAT:%#Z[4'QGV !SnzBMYX(MY5uoa)H;YPMԂzZGm #fue| RL-p4h]I˨ | ˍ~E8t[ʦ\x!pλYO{m$x4,2@ː:LׇIqP91WGAQp7-ġ qX2~K$T>tmU[X %?[ނ2) ^œ?ΈZ_L5ϝͤFZUA`|"p׎;giSeN`MG^ÜSR>^GX纃=0k,zd^k-aBi3}^~0uLRc"B%78@"U«cy.mGXd?ƅ 8ܻ-ɠ1b"iI E]OH30aE˘cvYtS!!uk9'NUk$ l1|2yxO ewb5`645 W}`,օ lUk׵OaeAWݗ_%)QZq9 ' oホ15(a6dd)40̹tV<֫j)/؇ 3Jҧ^X@W+=r)lhoB-RZ/̡%KrCA8Wh~^7*q;$ 2,?l*0i3R\Cɉ3W!Ah$^o ߈g4k5y" E>QŕsA`Bk ½ɨdFyX%ecD:P1K8x&gFiWګ givj)P'jS\ZVw7/ J?H_~fzPxfB1$Hi W_&՚SjGcdlyiTvJ}7Xqڌ{E~ʊ>! c(0?bwqtdF]0~<#}r1Sa#_9>v7{F@4ӀKɚ0Ì;tz kJmѠA[ğ]wVo LPlAyZc"ر{?? Ն/Ei.S;ZX/('׌ F-U),<(W'9#7U]qbWtE3G~15#:Gه7,ϻaӶmgFؑ\Z%hTSCnfǧܪ(|O`R34!^Pl/&b13Cd;q aG͏!2Ⱥka݄$Tw2WfG3%djɣâV ͘.b竱Z$S<=F c HN r5Դ_)o3jե2BkkXp +>[Io3N`_ϦpNx05!$g8IP%9KtQ8.eeڠshE ֆ9NfnCS?]䒺6LOaf;QP7}GN5c! Z P3 džC3Xl`Ȱذ.@ 5% FhHqg5송 W%Ckm:5ɨi`]F4AO)=FO FL_@Ee LB:|$&0PK-U933ev$ BIX+SbY=B5 Pk RcVFctNzbϥݠ mˇ[Vрts=|k"Ǔ}o8coKo@ߖlNv3֩{z8q: ¬8.č2N a3_M09֞<6?Ay*II܀YAU/Qi֍iEv!àZI|{':cxNO0RRS?c6^M<>K8ZW?Z`p(>8s+bgF1ů?]0 FٟXN+ [ף hMՀgnc߷+z("qƇV4yXz;Ѻ n`Xh5߂oBl/o"E|ˏi2Br妯QHtiγWNKk/:)ԃ h|7xB95)ȠXE|-wy"3)IE;Lqxi QHm:u%a;LrSƏPP[4HcYޗ"pJX$Q?C.u } 5Wirĩٴw dUgiXƚlL ۯ/}!8h/R%'GgEHɄ! iڐJBg;(ls23g 0DR(22#Hsn ዤ>/) 蠖vM .qԗl2U7-Jʤ}j\!)qL bߜ Z*U%riߟ'7xW˒%6Qpt݂Tck#s<<#q v3Y9岠)LN,1o$oyi1q[k;gj5IDK=eZfKk_>jOyupx{ .ҲHn֩#$cpq9 `ZgjFĄ`NRUd¹ĹTi8t [p5<.&W){>oE6{k. ,İ!&&lPK|<#4S1v9M*7˒5 'N\9iGs&}XZ+Y<400m۶,w˷Xcq-hLmlRԳ/u}4۹x`O=b%R(YJUkb^>0F(h0RBQe E (Iޔ*8є*i7+q$x O32GG7J)y .hnud Pr.=@1:|(I4SgWo*a`Ji:ŤC +Iꗮ?KN0T|L˪dd8;$`k/-L0ڼ<^*O?U:۠?}"xTH}^pk֑^jUʤFײABA`+WAO'K7'x7tdֳ\Dz'sCk]' eSOޙ̩&$?L'Y3ϪבkX`UGA1k-DT+hqYpuVFY7NT){wCadMQ$$=+/( Z02%EEj}Sއ`\O_-_ .i&0?nhDZN)RW]z sGypu] [YJ}K}żGM% NWwOjU (iKޗrte5#wHv <սW),%q.C`5,% G4g7S`JRO8Hzy퉖= #g|lq5'暃O7JnGo_݃'ͯcPxP;GDw2R" LAG"iJFvm}eڿmZ,Շ}Oc0uD# ")$;E[c^>fy2c;Lm!JA2p,t,jW->ᖁ -huԤkGscm=K)+WTp7=Wy=<KڒB&" 3k ̠PP7$oD6ؔHO(z?ˇKaƩrC`bP1jz,1,)~ؔԊC>rWO|nd|Fb؎tcʜMh@V#cbN w#}~"^K-ĜŃL_㗱1ܰMOMާU%o2dqEuS1j$l^ky&^n<~{>.y j0} 45QEN%8̚ީ$WK0s{+KD42QX: y0DF"ܖT\B`ό4?Wb5r,h JfRۮ X\Ox[JI?eU㡙ӊJa %c=(o5gR?0/RlI$PJl 7FC(?jX2N҉ `NMLXg6_alXFIxcJA(Fx2oTX@9W$CgŲm.A(?>%c͝H{4y2I'o̕]CԏpfɔRKJA7K6mˏsLiEzqϝ[to*)([\K??=6Ÿ3УEJµR U?+zOZ6O]="x!­wU[{8Y^@,Z(P+-t0ZZF)J gX%Yd؎'=w3HZ?7Wёt$Iۗq'r,I '6}Mx yFNӘK('p vpvaj9p,n`cc>_v=iw6>Mq|,m}$\ٟ.˵Hޥ@MhRp2WI6xT.d%z ;)cpI d l<|ȡUxLVyQ>RڞGw^j{'MM@>3 ] FZLw\]'Õ#yWzx=oh_/ Gy>!ZXFHTۗ< Ƈz..(KM|E&?(Dx/o'^ F9?*wޡهY_&O4HFx!isy֛Xxjwdt7٧px N~r0pC'/wp^vᓟ BѤM˾_  \/̾|< >MgOyOn&xa=$O”[ ܊N/}tn߹i(=5;³;kd`spලq_eОua4mRfN*DFnoFBm<C+SKjO9XG_h :Pnޝ7}&fSwjB3&WQP-458|tJ1n[,*ĄҼׄQ;)l ưȍLlU`&2qmY@ݼ/3z ?te^ɪv9rH!Rf<|c٪mݤYZZy: #޳^^?ȄhmXm6\ p0^PPp; s~;p~ya;U{ano\/4SOǛw0T%>N2Ͻ'BaC6LfRԹ юt?4 T$ rhZTgtD 24;l}iO'qnMʦ-P;#Tn{xr܁B~C|xCI7|a^ălToE{59 .?77|x[y~ ӟ d @ڋm*;WJ65ki*`/qW>_/n0/5_q[m?+2&ȾҰ^qY804/8uJS[iz&ysA& N%$[pi;N pvLv.K; C~A)܇/n(:Gcu}|:J΢R[a>:\t8cA|ta.YFA.o]hσ_ڧof hR ˍvo& T F1|;pP^?a|}M+ Dd ՞p7ox@/oSo)o?(>[-؟gWwT˟/e luB [o57G 7Pp1.ܱu@r\Q,@q]< P[sPVP! ^]sN"|. u;\f፣wmc)XQtU >}xUh8ގ}+0lHp :lo2qqo1&BA-_'ަ>zھ%<|i{팦x@Vu ʃ oMFeFٛq&^~˃{]d ?uX;-_B/ݭ*!9ˁN~*˦ .簐`wKH$Iӑֺ`OtB+fq1q<=% >Im9\:ϭay{;pSsh]$/7{9?S <&+_9ܷˋo/=e\/)ht5$X.wQ)K4^BÜJuM0Wx>A׻7_^l=)G |TB,m"¢sCctܾHr6SA|x[iz5!W\dx/[WGҒweu$^V^$ 3la—'O8@$| %q,x~xoL[.C䜾wx O|mmxJ-%}Ec mhT鄤a㷏#l~o/~hۓ4yTfaPۇERCq;(AC"eɥF\['?νMڝG%'J )FUXbv6nKE{ďc(GM>S&Fc.M4uiGpҾG*Dj2/7ѬؤA%QEFlt{ѨibO~Є_ھ=kGsksѥw_D%2b ^j).><lq `M*#z-t 7|xͅ󣪉)7qZ$ۦOq94-}t{*)IH#@ [g[c'3.FZ_ 'WeON>n*Ƭ7O -/ ݦ3OD s Fgtxsm7LL#4זcӧa>|=w++;? ؠw FT6}=t$coc=ʇG[nXDG/A``}e>Sdf*CV!1_OL?QD%e9ޤKs طkFI_%IU- LPxK١;K޿z2RS￁UDqџfWL#wq:I1D}A4n~EiQH'_{!ʿ}%p@&*M2ezp9>:ۗcoO -/z+VP<tvtN1IHLGc]MS8Iذt*k !)2zjTT⩽܈];)Lp  (lҰSq*QzڄQ%ڙ&NӐM )݈՛q9ګ 5d05tF_9 m|_Hħ{5=4&`k O}KBx과q wn#pM*6ceUQ$''sD~Hd&Rfy4֖aú(#L#y#*)zE,j }mkPQ^nHnέ Cӎؼ~b3򐑚Q؊l R9] $][n*)䟬ts˷-8@wm]m;YQ,ĤL`5qA-ZhcۉGnֽ|Z9HVWU(ۊV4$">JVcu#"9V`Z-.Lpʼ yCIp+gGwSCjC)}V奜6:OJT/jk܅uVt4IFעQmb+6oZfpӥg/4mDIy-5MN+@nMظzZSIGr"W뫱y\1(%5۱cg)"{p&8d&.AɎR Lw0sPs=Y[UvDcH.~EQeVqkZcsI9멍Hln`{Yt<"'u,ߌgI^ؼqj0%zR8Lv@*ӲA2T WCYyGvV:WhʋMbY%%Yl[SMNɻec㺵Cd\*rz @aϞT Z'cf}kѩ?a E M{^p8viۥu6XoH8mKôaǟO]Mmj,V|L ODON bmL]kIJWӏgX:,$B_p\}y<˹'O(|8/>%?oeQbEsO.?;..[a.[eJ9-*c|;VSNJgwJ+IGTN&&1 w?W \ldXYd4R- u) &j3eWrlnCbVOtM6n*)~1= Cnf2 l\:5-1=e,eib~'.Y ⍨Yzr~?3&*?E4WaÚElRR)TnACD"*.p28gpI"1|fcŠIjk u&MI̢l Js=+њ UU(+)FDBaʟIi6;vuo=.ܺڇ{]|ׅ+W(6LUQnpKզ ݲ{Xjǣa l#Ȥ=S8S~ e[7,G~Uڰκ X͕NBƻK~ߞOӀpkAbLjo %Oڒhjx.FlNTEĀ\n Q3|E(0>* 5䳌VZ5?/Aٜ R!qLF6bh5GNfĪa[wc_GZCUЄ k8kQGaE2'ի:w7aIầT*'ԭ0NMN'ϼ|M[>ҹ8==؎ᡟ "#';~\q ӯ9 "%3|mQ=2ysď<?AL:TdShuMZ>i"?|$".XG\CM7D %[X? +A:;Y3u]F J}xғm>f[^6 }o[R\cP0^ptMf_uW.qAwqB ;W`5ga6qnxUT/yoT}"To^yWwGTزxp ++<ϼ֬ͅ3}8O~%(޽>'c˼Hz.N Ӯ=K/nPSJ˟;ږns'_=u+3ń;1^zFŰAŦ"1g4RimޅY?4-êykqԯ^Ǥ#Q"8Wi?OYܴї܀$(qҋ(YgؕFGukW[qx+K@IDAT!'Jw=cF!+ %_xx@|i>Q7m7ooz߽mu鍫x؁0ނ2IRNPՁyQ_GVlvo| fpR.jOE][QM9JC'TDDD_=1X;oaOt^cTWy'r,Bou>ޛwovz0va:={ 11ű)<;ʹBMN"p? Tv杉O?]s(+iuuՊҵ?lq7F!%7մeose Ѻ>a:꩘8 '{ eRi3x*X ;b+q{\^wEM0qb6UmSa]WLN}~(*țu1罿{3r^Pn#qٳ@oZI,qT76Ep=|[x_S 莭_;/֚uhX UD8 %8;0gOSN)jýIyv Wi~t1}s:& ҉G't tt1#\%AO^ߛ8Hs /&J;sa&FCN3bm9'_!?#u&PG^D%|wvxԤ 6iˣ&`ݸoprӨF4jbH34aO#!729t<le(A,WRdWH80KiᕻB|z}˼ާe5"#hhEA<)̟x{7z∻lx^@\ӹۃE,ӽ$#`c}mj p?cU 55iMu=FУX 9qc: Nqŗy /ħcJ=W4tUate MmuXq7?/^b$0o_ Dlox%//G]1 LLdBK1Q(NjgvF*˗+Ww>IJEs~fm1' ;'[51EJ@#MHFn~"+0[0烩1a<%Ep3^書L9FpF v1$ ?hBJ[ i&w>>LCũ'.F_ߊ^BiⲸ:>{C7aD|/ahBa[op".KhH_x>O1c##-79vrDNPq^z*^},#ϗ?z$mƣ13BQG݌+"^ǞH4:O~)\K+_daAl$?yCr(g gLCǠK22϶߿ÊPs q% :%BЀ@hdB^_<s2zopݥ!C3O]r<A^8Oގ5ԦXM\0)SY/|$<{+=Xy$zg^ymX?PU.GqG]2bSIVEo?Y+HuOq̅O|\2o<;4CSu91E"q]y'wᖓ:ZZmT9ՙ.WϿn]?1Ǝ@ L])Q~KۡfǮս&tnޖկFdmw\yᜟK8FJe'CO)7[Ա8t8a ӄ>'xkХ{wҜ eEc1V@nFL_cSIY.H5P "60j ~#šp_go~,-#WoGLrM8v5/63eVd9?^d4M5νdFG9s1|AOᶢ[NIL\Ѽs ?vKE]S\B/8.% ]ab`]Z1^d'T*JjKW_? /9=z0dr6GSHd%Qc Npaށ: 'M{%cfEB5F A>ٙթj.\^oiÔw.&sv\b 1kv ;kTO{R@O'FqO6.F|f"biGEou;58= *e| M|0k#KLf|4y{Yil{dFa=ɔ@Qt ! \~i^8bݑS\)FVv&MSMp/ k00蓮EiXs'5A:m'I7q ?¶-̡ ?TИɊq{b?he؉CqΥW0ZV<*T ؠƇ:{4p+VN;v*CBQ*1j㉩8`Wxu0h0UijBm7b'#wJ'E&ߎNʋ}RcS=˙7۞LQFr d5ȽtҜ K Q0H K.c'sB ۹Ȅ6: ܗWE/܋JRE,`w!&xIT>?W+ C IМ= [nǸH-aGc2WظjNsMՉ7TGs͕s\b^*.|)|Ե%MŖ[ѳgRUBgXGWa硫nV Y.xzMb^oGP:-g=EGP1+4OBeƼ{|.J *8.EEb⯞İS륧!1 )}7J)]ѣh8% nd d`ZŠ2κgGҼjyqܣŕ۞`vly?J.|3H`.LS; \D{0Ezt6 {8л[8=vÆBB1B+/%h_T$$#6T}oпWYa<mB9uҎ+R I?rA,oQGz[{bQ<";:7r,MA ܁3v$K+3?Aﱿ{3m, *bǪfe0!+McN>y+~q/6W\a(i\ɉ(;&[ e>*_[Q}Y1%?Sǵ':#Рͱ'.)`6[4ŚQTL2=~g־Y[NΘ 3l\l`4oL?hvjn M|ɥE2(4%hbzl2&AR?0~sdv&Z0va Y{")FЌ5)Eh7dCI3,>r%P"1\tl`iSb6.sE3%F !=`I:ؤ#ʃ]"5Wucx@>pAdrVZ_Ly̛*}1 Qw bszБP[<\|J#/sPc Vi%ӇKO㒺pI^ \ 5 4L~-4q$.>hJi9B&0:DĞ(I=|"(DDT?2ϔD6or(C2o">! iUCkK1skpǘze' '*oMlcw#m::Zk͢_ӿ9 Ͽ Gr)Rh`j D5mj}(D}5qZ,k9Yor A]y<5ඉGdM&2#Vw;cޢ17G|~nV|U6fjGMD&0"fM5YUqUXN .ʴ8QOy4ik`\h&M5빯(j9]ld?)Tbq_b`fFQ@3X Q0Ҏv&*R~ÓX;fʦ??ƀ>StSƓ/XSY:IOwx靘+JR-^qr~T|c:H'?V6dl/e+o^U;L |IE_qQ+S.:}_wC!,iv,[Ã2c~  4G1dR,ym5N317MѫO?zE3X:Uj6~c-]JiB-|=J>{ %\q9iq1 IMD7ja>gL<;4+~{I9 4K|C(瞔~O"LSfBMwvaTdh'ZIn\Og"*lv^ ~M5"m<˂q^2,Z|MpOTRj2l_l|U@- dU?YߢZ~ V·T_ siOiTqQH?/rC2{˴JDTY0gRPYKlS&}' %0Q;\yyZlWoRp\݅ *C(s4҂͘2hjT k/tU,ʜc̘}?&ߌjOUj"z[jćLUYhCKmqHH}[dmKh%0L0^5հ pR 4(}~Ըdwe`(\Ѹ[x uq l 0t0|QI+xEˋQRZJađF t >Ttk@L ؔ T+p1ﰑH u$>\ ]EL..iRH9l%9?lRmQcuF=ȟ7߁š"HmweIH[]}5`Ƽ6>Ào)Q<Ϝ{6,;cFq;uLU*l[N.%XG U+u*I 1 x/X5dEIgaǯ#qJ(EѾnxO6HDZ4sX#)NJHaMQ9nœF*_`O9:<1.'Rĉt;I@ʲSb;E@$˔9ƬƺvaFD@~F/CUY18FFt;O~SWW챗`'4nG#ﴁX_ϜjSWPzx&NuAݎ~ӽ'A 0G1T4W3T5d&/ȄJ7Pzo:ψùT(AˠJ^pxsVRME6VwDKq[_y7Ttx r[vz.ZD2Ob|2h(NydRt-񬈷w_ wE7!;\p0m_p˕jTmG%dt1[;$I'2әWhAح>*E™SF'.[_ci.Aelwxǘ5iF CXу\!J?翍}=>,k@1țTp [\JЛuoH JURH6S$8!]%(Zξ>)\մdQϭ~e  ih0Z^mV,VC~H '];7bo1pPL5-+!0'8'*.="N{_}.5+2 Hj=2̹nsgBFyO^459wcz$Gtbpᓋ/9,ehhi^&ױ$ y1X[>eu\%k3nt 6ǒek &6ʤxR^b@"{r-u86B k{raHK*Z0;nGsR8=^u" Hʹ/7x)Uxe},EO <#x k8@OC!/K o{8O5|IY˓# )%p"^yWqG?fwDOPGbHoyn'y?q#ȩ={3̊.Adc y3S1/=CGĽ\}J21<bFh*ʱa3&?싄m{/ ૿ߊ-2e,Ij.{=G>Z\am葿+'wc,x7*º+Ǫrwa4QŪ/x4{~.,̊q߻OVt9< LB[+ ?v,E*jᓔT GBz@= uil+s^AtqrCP<}l&Դ5+$mW@Ev>E٬Q->FNޣ0\1?tDCu16}1=0G }1_aym<#\_cro?*zv(o/(Ni5[1y>(>>iywM͋8a2tx{|@?4:UM8:k.zgGYܗ?f\ dZ_.ĶEssRsE%/lE9Dծ@M{t8MD9fN˘v~T$qO ]IQ; gA(s&&Ob#:w%R4 -K?A1G#->3%~6dVoGgocV#̜\us$rxio}mz/b­#oNb[/uSI6@Wԭ|:"_H,lɕ(᳖x0)"+ VH-%/3yҰyC 7FlFycFu>5K#ƕ(v2]|XQW'b(kBסQy}B3!ɗWHdpo o`7Ư֠9m0&\v+4T$ՊGDZu{z3 -OxA2ξ91,{no3<\] |pUؾ-!%c@'{a/ZGtkXظj,-A׳17ҴWOX-M|s5Dƣ*ZPhE*];\ub\cS $W?A-!/]yص"%[cQnȚp4[`]mF]p%?3テoiETj[5Y 9{BJ/5C!Xr6-#EB2޾e@ё":%]۰8Z4-3Q7ObQ[_a8Ww} Um3rWʗa{bϰ}K=z~ M3ޤ*j,y.ofcr#X.};W]6'x x ?Cְ ?{;q# 4{X+1wXCiEQ܁>h/?uT|l#_}&O9~Yad ː7e`6j$m-#LB(`Λo`DQwlXoe [x5 f]Ƚzbn’G&//ġJ5ؼʎnXωmU MQv֤ae$ V)Ԛm2{E6uT k_~q]}`.EsR֭D3]}iZ5ַP?[/2{(TG/|8? oKKlZރdw}~|.< u  u(uK1\X&rcxeK^>K7m-Yo?䃏B:uCy2jAXnEᐱ)_+akͤ칦c 9 .ɨ)U3q*`zuAEK#7cg(K~zG ,~oНQG˸aT fmA1׺O!n؄!;fcWM2>%1t4Ԡܛ0{ki9-*x;A261PVC O" *=;alҳC.߅<3b{_,iQ /!O n,7\^ n}xyO5BB[~er+p^ԥc 2S^ʪXŧƞrܤN"׽*2hྒLͥtڢ%sCfz4S3'%i-t)7Ppr !ɦ\9YrmK[\:* $L :E'NᏢiQe`E8+I<5T8Y3 A=Zm[{hR SuLe=i:JO>gNP_l FӬ4.ڮڸNRYU+>69)·NU\KK}&rL-6'cǻqX*Q>#O; Qy%3sm_3nwwQ-ZDԯkŚqϯlKK o(O{O,w]Kʃ9L{yYY[}1lh_۟|r7e(Zfli\/L3h LN۵}FѶ@?a'ٮbʫiU\ɭA39\[3.EyBFORh۷=\ر7,oOB*(Ert؟:H=y4@l+?-5#UJmß OC~$ !.=&  `T4.+ۤ.4y%rjkBh"9N= Q JْGuM" v\Bbew5Bx24qWYYWL;a[N- aѥL\צLaPƉ`Rzɒ8mM6_WJekY~Tq5EQYUR^rюK;$TU=5a=r$ƶ|Շy˛ޜM`_:޴?33T.o@[LpK `%doCOs2/YSz^h%j`~2lݱ } I@]6$|ə0_^%IC[i\^N;=0m %pe{v6L[اŦKD4 icZN 7Rң2c0O;o@*L-Ft Ӆdt >婢uG{OMJ4tE'Ӓ'`dZcB́5ihIia ͸Lm=We-UY,]Jtˍ$7bJҒ@ͦV m50[qo?dÌwq,,##jطNJ:Okf>O^C,uҀ9i,"dў̠*bׯ1+;]zj+Z}2ʬk+'_|OtϧCnޡnU#:U"J3_M{KdS4.q3?ߚ Q8>@}Z;0԰X5-өڱŕqX7/^C>FϮF D% ZoZ4x&-N) m=<6 sa>HJ!5 ۥ%H}Dx*+L÷>: 6_FQ:{$D}Rd3ryG`=S`Lܖ ~S)o |x!' gރA ԝPJfqSb/*>wQs +]N]?o8A\~}ʂ9ñ/O&?}v^zؖ]g'>0Q^g8W>?\HAc5(۵<^vGO~*?u//?EÕC OpkW«-<ḅtdw+2pqi}_=00NsnKjуCz*ʹ,$j(]`M\ IɋT\KB^oHɑHۯYGv5m){| ƃl.~o4# G9$ˏ=ۓK>oMTJV~ &0~͋W[q4&9{76K_{f=J.7E򭘧UァK}VR5`Kj)ز3(`_v4)?X;bU]kՕaKV˞s rqJ.AP cq~U|ﵯ-w|ى*HgWfaJ)́7߅[C"\ڴ-77^ ̷<ekpHpiyӭ}Ktt?~PtYTrZX"ez(Q>8X7sbM"ඳſ׊=O?V؞ؖ#ӵ Xrp虦 [t}n*k].ph{Xmkuo|Ųf7ҵh8!gGZO\]S3\)IsW{L:hylKØ5n4ִ?Knh’?Lg!&ΝGemƞQm*Co1rb}uX[m7Fp3YwWϚV'hc孨='ԫXy^k>+Ҭ>ckV;0IVZcwJ>%~&<RbMq57qbJރ;9E`!mk!AmsN$`Pr3oҸ)&QrQ{o[z޼ʮu-c\pbBKsĖI/@PomsS} m(.OkO^쾲[voZʚus`n^Q˳+݆l<g+<~d}oS]JK)W-x۴gzR]{Ӭũ(-_/aNv,s2w6ϻɐX4b{~{(yoO(Jճrvm1ˤUN>^7W&=qGm0v?xm؛=Cuu\)ec-b̷4+덓p/A%q~'] Z {˳`Mڛ_Y6ݽ߸H VIma_s%ZBJ5 TxdY|.Y\]9>1,+zc}'m0SY[޶Voy-XZY3 P UWBv>@kP*IW695~{Qunƹ{M%**$bF4cݘ 9 y =ao~u'1_Zڴ7")[sX= am9%}_iɳȞP5OOVKiMZJǞp#<0 Y$[D΋8y}0/}H!Zj&[BUq[T&i7Q7iumUk>7T^7 &"_e|uoޛ򭼕qeLggBǼƛ$+-b;ʷe VSbD6J4VnĦ"a|H Z #?4K{,[|g~evo1Y]2|gs%#ľ~'I(=Mx]`uyK@IDATڱ| -{6=[ɊUƲ-Q 9d.[)Ԁ`=a[[TfqeuʷMBZm3wtme-b-bo[trۓJz2$@v"vv;yY3-f15ikoiŬoV6-M,"X%yQdXR>LkolV_ͳk˳v,f7X9Y-{o{kkYY9gy44KV7voetO&5WT,i5/B>mC(r!Gc(alW2hz,\colPVcEmz3fk=bY\A= :~]{2T뮴O2|]b" +foM'eZvMgo!9F ?u5<5`?(C.ab{Gv|׵{olc+c^:z|o[zMbouo7{Mh`cq^sJ[/< Y+KN)gތ,x\kc{X7,-WV[koTzmxӭ^enIÛ_Bҵtt{^W V1zjEm~_gӠ&Xyy۵rk[\ z2X|m1/_g1Kx7{*Ҫx,[KO}O\HMx4̋[Ƚϲn8XKȮ|;ٵRVbKҽc+cyVb˷k9Zl{o[%ѢKqD Ob 3SMAUD?()lҼg<pU1SsJ[M%hz|V@#ռ}޾7τ]~많󞪌 3.>x7hgъbb yqAZ8?n(l$}nh❪.g]ߍ8OqGPQ5gdfxEU )`g~ b;q dF薕D/5Ug1X.B,xYY.«W/9_ϐ-Hf9I7oE(h)I4+N,@BcXx=ן{׾ykzY΂iV3Xs3|U7PRA0H+> X~7¸ЌkJ*X[$AB|WÓeMT=xD(fױZ橎RV±0XvQR IiZ6ROxC-[3QjX|XI- 6/ռ}ׇǩm; \+$1-{ʚc4hOqӔBᬬoէ Awz%u-Y S/3Mٔ o3 RͲ)ԤboO$9/b~*y@H>(u,ӪHe[l{u\> 7/ K{Y32*XօX{qWbŚ+X6xzK{Ś'1G[  _;$ĠukaਬDڷNa0/epŵ!u"&pz?oWώ%ﭦy˳4MQ8VQrn==E'ޡ_bbv͸֋_kb:v>y IغG7{[TƏ]l\/0ۼ}KE7h.GQyW!䙃pe%swIޱ^{mivo 班Ŗω&w&whM =\Zҡcw DzpٍaB4X3JK1ߦ*ݛ-tۇc)5-K(%6Z^x/皵 &in뙺JlnS_cxd71 3rpu-XKgj:V8?hhlbv=ZS[ 3`⯎{x5 [UOsۦ7+ZX(H;Q`AK=WyyzY~ymN`D띂A[G3f{w|;X 槂3I,t>&2Eݙ4=~coxzF1x˸y\-gױc*F2X kʫq5vw-[\`(w^\0fdb=OG`ay$Ň"gN&ao dm0K~`[&}2˷03Xr0%ڡ/?q00mA~/Ry&= ¼Vma߾CKP1+KrrZHK\,}!$ݽ% = ±X$%!ٞKkΞ<ϩUS ,S [NMWV 79PrF~xgmSypmR  > 0ή鏫z>V*ϟV}ege"6^i슊Vg+8!NK/-ܳ?\:d=u^oj'1dK/ o;{o2Y\l/g}T޺vmypnXo-}_[לw6XfnOZyn⼘ f^yW@Xө!m[\z|3w,\4G6lX-|yȹ^)s[&t VПrW_U^Օ|ن^b*0Ⱦq5qۜ7@'ZqS0;pL)wt=bY|Ts\ Hsf/*AkLҕxg([h|}V*MmxMr}n A5/[plc=,ouWU=i`pg,ȕ8Xr=qң{;)/ K'K\gW$1g0> Wi@^FwNg?PkXco'>R6 6]-%Aֵ[*Ah=6p lZat3ɡ0 ׎8Jˡ}AvġeGoIν1+V)6+eoOOzʈ1豧b`co|]Twwob踻Dg 2JAPv~~9U=ZZZBn8~*## +II4[M3xm\kmX`398<)7'KղlcojZc4#o϶{/k&0=U,o%2) t9eP,(Zq]?dnv]>%T "X!-$٭nH&$;އϤX5cBeT Y=+cuj\lݺE7؄2ocsp{c27w᜚Inx~`yJFXލm$Աqfp0'@[/+E pb][lo{[ro4V$`>_"pFZm"E<dԨ 8J’8N~-TVykkiVi2vR+΋$ m%p/1/7hb!ۋdض an{occPp^ޮ-|3iNd].ƛe<:?ʀ)Շ0,4:+#Ғڊ{Y=6fey,kzymuv c*>qkm\w9e'25y}@9+WEʢeg~J۶-b lskmܦҥl|4IkU~s22%}{iK( `k&0q, w369(Ś/Y9"]،ZF v,=Vh\NHu [2zIiInR\]I%jcnʍ6A'u:+1l}1.C%nSgԦ4n۶A6nyys7/c^ܩR^p1/߮{ݩ4qEE[dʔ7nMl4Gt› 2:3+7E]'z Dk!tÇ(T`Zx+bޔݼ>yq'T劊VJEav{Ry 7mZk I[yݸp9|vݺ= 9Pi킹9dƀOM2@&LPN1PMƔPkƍۢ6~ȯW*cmΝ%b:<(YQ Q 09CɗN=O6\xm;W;In*BWcmBi*yZH< +{-'_(ӧ/پF#rLO н&M8/6ÜC$%vNſ}nl9ykbffX&N<62c;oj&U֮] y-Bl:ٳ`O@c\/#Qc]Xމd2f6|[9RTD86⥺AӺ6/7ΚaOz!\B[&2FS ?q Ԑur<СC_9믲`zՑqE"C2''MlƍFN1 9atlIkx=Xw=xߩ֓Kuk2?6`./Rtnba)\D!Yc&\xO濒*_Fwm -d/ΐ<%?px1i|q2v$d48_,:`NlT%ǜ|C V{#޵S{"_|/ B\6ZTWľ//{'z[qgLBpIf3GS 2Dt'i\78@#CƊlz,_t)#{# B킀MN\p\ 'V+gQ+NipvP&9ͳWտc9L?_T=2監*(W.={|!S1Q"n.^ܸKljnSnRl]pA!l%tQx1c9$ׯ_'=x+8/], p1)&k`.mvs{WNF#kﻺx$Eb`}ϋŔ6DkۼHIBL?~ 4H>3y뭷ǹj8//uaFc\y 2oAHQfGY q3]:uR[DZ#?Ɣ1vZ.ug^8 cM-*1cFI^`Ep%8a (ݛ :pǿnlv3Mg}!)#m^;q=#^ıe˖A2;vtS4K&{KQp|6 qJ)x ', 1$J``^D}82a@hҤTc&aȐ!(pP%= /HT cn]/:|+䋁ה>i'#l }{ &-A?N,aZ 6o̮rI'IϞ=;2 TaHd{{H{lwٹ)j|ήny8;Oe2ڌu0M+e\XL|-y ֭%;$ Fc$57l,FNC;!?%P/"D18 B'C[(mUa ]AL%\V `jo䭧7ƒ5nH*ƞLWA؛ Furen\Fwn+hc(ٟ!>93%_r)8ݮ|ˡJ\R6.@ "J|ljdnpC06UbȴVZs#Ȉbe\ \68CKQ>VB Nbj`_Ζ{W\,(p%%[uqL s^ Pwe5d5x@VpT5\n{1H5ٮfl/mڴT8qHb}Ʀg@C*oth7 f+q幓 ÿ{;ӑۺAV 裏*fS1GTbCC9LF:w`D}oݠ& F foڼD xwTZh :u*sEMi!kl^36S}j.p ir6Ǎ7ӻtJjh`YL,joBe TY_c{-Ӎ2%ߨ7UdFpEk&yIiLiipyZ+6H9f@qc+ ~$C8i&e@в@ - **!'NҢR~*ɍĜ{'?A<駟'{$O>dݻ7i/+3'ȁvI>CHK(9$6]/y-@5tit[TPCrpkCY$,- ?h Xy*^+z/`!]'|'HLXie^ rlҲcO~_Fvy9EnلFZy?:gahz6^:9.T2i\{ȋr,H !od{ڞB!= ogA:ҝ04L=Ji׹u9Jv_"g}O2ˤ 7:$ zbxӣz!u>  C% T3Ej. 堃҅RHKs1' @/iL'D"`j dS+VW_}UUHrS8UabP l'J}`Edlise@ nLEg}5C|jy΅dD  VDWe{ "Ԕ; |OK >SƊA ùÔ(A鱋qƩDp; -2w ԎO`vDAF`p Pdj G=ȓyp.if(_ 6K#iFZh61H2KNl~u2$-$y;9;?c6}fֹ%Pfyrut~\HoTA0qېrm>TQ?ISi:OdI1^ӲcOܘ :pw!Wm=h>g?I &Y,S)-tzĉr??JFV.#'OcOAHRFJ!x!Ap2MSXHO@`w!s \( ʔT:u.rڐPt\9 ~ Cbj6_[WYyɝwީб d깚"~.5=Z a/($%& z Akbl =Y2ƞa_4Ab}#FЍIAvr8U֮M|{qĿ0[TE47#,1?n@ GYCĕOxAY4w\;бF9XuhY4=#$=$+'"s? 9S) ]pI& A=:uC(:!΀QF Be0N=۳K;[܉+R>nxOg}Vߝ f84SR 8Fh#glc!/l`OTƹW^Qʅ6}O7&!nb[|? sw >xi\ Ha8Sn/uܿqI1j%Kd̙3rtAc1R]$0%> BeR5=i; O4NH$s@XPˆ!XCv0&eUVqumD1>JTͅFTx3F<W\]3 L%7=1_wo^q5`2eIAh5&bmhtpa̯"C 2Ʉjg}'#ġΝ;Y\3@@v =Ivlsq~70Wr/B(O?r}u3='-(I 873O`-RgMLs۟U׈ ,pZpWUsA^Ec@}9`\1w!)G K]+CbڽwppHƟrTal[" fEel8QX6$3 v#' G.UNO{rb-/^|w"N 7TՈ DZF3V;*s' |68jUCS@8J 5!@\.nӧO'Q#P/;|4U'luBt!sܜ3- nFYt3g1ٲe2H pG릞gu3#V":ag8r̕E>/o$֭ϫG(# (ARj|%8@bTIN؋`$JJ;p(O|V&@ bJ0Yj(]4J u"$y>MkLW6 .bRշB}jH Iڍ;\8C~oғ= Q|=S.dС@P/LDMYH:#2C̜)vl-[ rs[!y]ৡAcrSO=T/~{Jw( aBgY,ZhKU0/n}Tp(aa =$,1%<#|} z2l#q L!Ql&Kv6蜟A脖Wc$KP`>8:/8u1AHCF5y^r RT䮋{}vÑd $w\=s衇9/BͣQytypVDK$1usdNu]rUWi"7b\!9k֬2ėOƹ29Q5 xf@B8MϡI-"=P|>|5!вsSOaˋ/S넎) :zt4i3]H$qG`sԀX%Rb8"wpBE -)yx @y#SO=U7l7߬pK:Taȑ ;NT⋈<7ѡ3,y1!0V$+ ?vT]tEjbé>J$>x qO9$</qV.( d\݅E9l;OUO+Q|r_+VD7̗c2\0$>VQ3a/ U&֠AJ{Xۺx1l׭zQmkGd I~&VW~|oyjx[#_T?Jexʲ-n^**Iߩ,2X gR0IFA5mNg~_Dz,ceSu~uB2T 6UQꡇ~1c]׮]p]GƎL$1Jg?UEԈK.D5Ŋg6D"^J&Vm4ֲ-n$n&=nEEpuA15M84>F-oS#ȣ/ +m'Sª`e'@0c?Y9,>n8H6i^\,rp0w68[A2|> @7,+:5k(h!o>:S(MUq`LU䣎: k IA3 'G@8B"-`uTHϢ쳢 6fn~X9̀rw%ݺ9B:j '땽59 O>pFp$Gpw>O!hu  P!qTwEx@Aag:Ne`.o޼L~"iBc`ai*xO `8FKܼ'!g?kQ +9JOjU@IDAT?s^;{"jя .QNۡ.O rϹO> +o!}ϿVD~6 n=0S UuLBl%#+ 9 ONbT{ṭ &ҥKe̙RE %ͳ[y09ee9 蛄DGDvG+XSAH x7m+[tf,??$;ä'rB +(r)eѳ:K?|YY:qFUߍ7s`q`~m+c7µF&MFSs{^%/ȽEemX!] 08S"rܱai,W5AIv7a~|Ynv:2ûOG;Gj& p!Od*|?޻ rāE5?#|y芉o7L>|ۼC Q1_G3cFp㐭5O|~BF0`uD xF8̘C%5,IGquh #߶jG Mk{ |L&=dj$r2B) Y 8g&̆菛{<Ó:GuK.rAqo qL*/"PF =  sxrp1~ޖ<(UBylhM? S"8uZCt%p#f5?Г`T$ X?:Ѻ>sdl(~s[ERJ ^گ_$6r"͠QA'bBuI0ج{\Vq[nʽ/4gY8O`ҜM6!0 nJ˹Qi7}4&3 ]vYlmj'R՝C0![Tx5 rꩧJI TY?~#zAb7Qrg!uL͘ñ`+WT /Pŋa :'!^z8 fd'jtĥc(0vjHڷKHV6 AO$i4cb'o9Ix*!Hsr-z2TCԶB|]SD0ANԛ3leFx!`88uT9rdh7!ݠP=Y3&2 0P´!\L#<2 o ߔ4!h\F`F~H+|[bOң8;w2 '#_ʜ2,"O99X"(bN毽Z2xtxD\(( SDz0`6mQ9 H @nhb(@3rH 瞫i@xý''UdhY9iy/}\|ŪRa#(Q )Za K9 g.zThS{t2/QU`DoFm_PЀb Aj8Й4%?oQdcCw/ \M;,q]HJKKeɰy#Pr0UCr`߰1C[!ut2?\jV:}\xlN\~ryr`ā0)L-XX*+.A(ݻw9E2}thD5S‹p+ qO rI'髞s9駡Sm5'Cm 9KNH&Np6o]׭[x&Zfxwd̘1*y+Ju>"Ji2G#G jƂo62i,̚5K'd1Ceqn` θ8jJ‡:,RJL?nFƆ>p( ~42 `n۶r}l0(y 'wl:=ȇ"ŐPE룏'* 5XdB+:v쨆 (4~xxrCEh':2PIuFX7/F!5kpcU_t#v0,"L:05  _ROWt)ak3[{P@Q7dO.0$c8 QB F3=;Xդ36 $ugJT }(\DSXMhуBr1aHhuA H؈bKlO>L4IuȗGDyFIEJՋ'@ޟqz7z70냀q~7anTF߄ g7wG) 1g? +|ؼD0ZGf(7;wN^|)"<UBF}}B׆޽ ;E9r|9/GS3 ib dZ0qĸ@\XFC#2x؈;ƍp _|1f-W*ȵ$=+I/H ㌼;7ıug9tEF $>ݙ;6fd<($ƙjK CA P!y&!J 'eC_LG_oyN/|8k :p3p`Xjl!+PK.zJ۹kT$/_o[H7v^anW2I-FR- ^E8vQ=r%ܓd,IU B\={Bl2֭N5 5t4*gq> CW~,YVCofzGi Q!^\ţ+Q6bSfx1- ƛp$?Nj=YSg9h`̩6E:ϑra !@'M:j^: NɳEO<?ծ];Y`?|=k*'M3E%9fI VHa0pM@4!Q" 2DܦmD#Ǝ,V:m8yx@b ,гDgnD($'9Ʂaj>ԩtƞHZ4>Cr#aΘFN YLrVu!ػҺ7hK,W‰B]|zQœ8$1MpT~ egL!^92``X J Y^&vOyޚ[uG+k0 +LKbc`g?MIq.RGN-ZMT} D^cB2rDpP ϸɡ@: g H`9s꛰ ? pHXA\!3D 0r5A %AoUt@=Dwoh~1[k(%[TJD؜asŽP}来YIiiQ3aHª*he"l >3CaVAhܸz LA_ۏoi,^*:N 8!j.ͥ" aA-D\hݏ~.Dax뭷Y\7.v"_;G=DqBeu  "СCI|p|Hc ɳ> /E[wH߄uml4ՇG_@(ү+^7n@ ɔ)S8]Ѱǩ_Z #^PM")+-%=眰\ٳgOe.A @ @ |Ñ $핵ApѦޟ'X|F@CGz4Lwgq"m(d<WrΣ?< #!y%U"zПVJQe2 mݦ~rwCn1})`̨|Yq^u@rOry{#A# lBUu;v^s>|M4"uK D[!&!ˍ4y }ΝuYF 80ˈ<8"hs8 %ŭ0Է5~ BNxHKVC߰}ӧOI& ~7jlĠ+nCRB05$ `>aUW^6xj!Ղ' n ڗ9Comgunh x0 <?9QH1 +# EVF|Y}V˺ AX385R6YpbZ|'KЉ4@ ͇FaЫWH~xyXFEZ:$B8 w 7-Zг|nQ1}Y n0tVti? Co/ \@`.L'FH0m23D;JB타w\ ֯_ l2 K/&J r.0b"}/U(\*؁0tAXZ q gHfy_ɯNxq6:5+ P9"eiJYKT嶿իV %1bl 4g(w;y s믿^TY/B}т$# -Bri g ƉsvDFA`Qp3"`/t=hCmE=P5bt5ho|jmm|`Ĉ, nHS@V,_}>seРAz|~J?R` t8~!%X(T;j^ /Ȁdz>igoӂdpGW!k9h>>/*O<JiB]lA8E`jl>[tS9 y2SDfrx/=lG~C%p;}̚+!֘`seH#.X=hq~1繶b]Wa{6)<-uv k3vvNѲWe/JNԓOqG r!?(#Vh"6ߤ?ҽZ+ 2ZtHk`ԅؤ%9ݠG3t8KtHOSN9Ecr&j~t:o hG!B嗝 k {S.IcE'NT##W]u9oBNO}tD9;MQ |هp900߃q裏 lNpfL{7w{ o c{-*f(7f aKnܡ5aԈLm0:F"2^L [72s$6~#SwȨ ay֭ȫfI6kpc-~wV͓Ͽ\$;"}X:Avn9$vl^)g}-;9B4 zd{n9_9/yM=cjlz )E;0+'{ =DU dW e{7 S¨g~a4{BzkCQq$2 >C8$.a gN <Ēt°Of'_ /Qx?JE~ |m0,aÔљAR_}Z(1i0Jc.ZNؿ?])̍]aqMFޱ3(V֭NU U &w:G8΄N/|_,LP;-BᣏZ+ad$+)/0ov)o!""*'sA_>}h-aڽ'# J0;][ 0I` Eԓ-h4ciJwK:B{w!8VNĔ=4N!24g/4[Sʎ\hDPD>{5֋ 9UL|X|%@u M9U/%҅}iH1P%bhY좙AˎYA-NlEydUM,aG[W;_[-j$)8z43*v-A4i5ETp+aN1m~8ިWKUH{1/Ҽ1Tln%:kXF3$( D? -gAjТ] / OYi=PU-L5[1V{*W0wt'0S,lہTOǎlćб=;贛l9SaXz9:E%&ըۈ4K98D99>Egޣ!5nי^]t ?uM8H5^oC!'EzӁm_LRv鵪.jftLMkvA;{Tp.l8}{o?"jQN iL't3JT͈BdoС /11>f2DHյW^|- -5-4h 6&`w1qrN߀$?7 xn('Iji~ w"|1QBUXBP;u:+t5i&|=Çf͚fVTב#G2 UXbW^z{&~tg9sMuL17F?ϐaHMdygTiYAAmӮRrlÓ=~-6yS񇳇ov$RgDwiA4 ^JvÞ1?wBJ|+cnBUig'9+&ڔ;5)ko ^uM+ st0#vVx罗p |rRk \?pRIULFv|kYbB8d~byߴūQwrj$ޗxTou͎,p?l9 ɟ@o԰ŻAsijf,R:gK̑뼏o7`>x>ŋU~<<)9y^boa@aUń... K t4}a0Ľe&/*K|y*q<\9fk-7EL<;';#_i藿$6/W ) }GqqqhiiIHHXhګГ/b@AV Q = oE|dY۾ܹ4@YodX[smI ts;oijGalEspy4T>jz?civxo7|Ym~?dF t5g|N*ky3{֭[8ڙy&`=xEZݦPkRo:9X6M+'zQsr5;>79i݄zbRIᝋ'qWuwܮ9:i.?pk) _my[L)8ho\2I፪c_Y=ǃj <u{=_ oR'-Ȟ7]4D2_a3ܭ8pdj < ̇+:v5ΰ_Pߺr?7\}FQ \Q!|nn&qnH+;SM qFxH+Zw|B86&OYT9*k#!<}[沕Vm Wosx7ǦŲPs ݏ{X6l^4~ TO`1N͛7qBO?a`v_p7&}:@i70`td # 3ԞZE_:?Ho$q#Zt #YCLv޽w4?U~i|o`f- :J齽Ղ^&V4Yti>uꔥrƘ`...7oћ8I#M,'q$ٍ.sk+;g*+DFc3,E.C&i}V'i&c'ΰhyd>I銎gI '-`r`=WNZw|8χ}FCȯ<4?y]d!=hpcGeb^;ʞ~QѪq{ρoOMeZOojȳǼ 4IH+l%N_D]!1+5ŸVqw{q=Oܸ^0I^犦ŭS<\p~?]xۜO>y| `^5Z ;^y0g19GCgp)/Q]Q6ĺwO { NWB,aP='HOW5w;*>Z/XM>`vҼU'\ >%zz^4}29zT91.B96Ǫ/04 B-0 /1=f J}֬Y[nt9KL+WC*W{c%VE%%DA7D0,t??ԩtȡk#}4 ,̄/Й)߄bTF={6=zT=ˏ$HCot߄0Y7FS~ >D5Hyq޽{H=r)]h*,|,+7"qb9;Cg ?#2_Uϟ?OCbiZt8 AIY4bgrr`E{rȠ?qR(_]x͌T%onrrA+47>`3EQprvbٳbPF=OqjҸ>GAԷŠ{` P\nT3ٛEaTY$ũP!gjw+MmO4͙0:4KŊ~9I8X*}0s#S-ΝD52 [')ŇF}oոXfUtRLP KRJڑ/N)Qh|4۟7z0^G <?RS98fsQTPruЮ9hQ-_6uKiNAU~o֢0%E2ej r!Ag`4mTB>eb(sA1l!=7u9A.\|tI'  a0ux7[NS4Tx~ گ}?dRʕTlu-<9n~ԢvuOT"5ܞFN>Iv/W* bD!{N_ pUQ!9Ñ` /"k\\u% )\: b$D&s΅o 4k,Q %)ڷDE u0JXd-YNȑ$>gs,_YyS6$4h o©S*&bo)׷+W̾ oB(KzYMO'DC y` m۶%)S` \4+f HT?*ߡ<4m۶M-%}$*AHлヒMy[ǡ+WL0 ~%lΎ:ac2/> 8P)^v /V&tDD0}iUtaӿUB*ՔxN0!Sd*x< ( D SlNFϔ o&·^_LZ)Ґtٜq,28ưPՆ|y4ډwըvp h˦ #2S.NTśPk=}ꑸ 2}I1>=\)k>5r:$J(Asqq)S LǕ#*NIIQ Cv$ j4r_=MM0%K`_eOR4/QM@LfDG{B!ĎI|nܸQEnP^X%ߖY0Q O] Q!RO F'33&SBR*=n B<(&> 15xS&3@A!'I 9bf Q&Uڷ w3dF5e3SvD[#m:7&[ߊbB[QVx΄d9+#P` !~U4n;p!DVqiI7S,:f T:pƃaGnKfP\(W-iފ}ZG3^wMlOgInTL 3g-{ө#;}>={r"͊WȻX:k&;3BSNQx/JLGBIZd. ۖ 5r#EyW:9x \0@H1p  H*|Ӣ H4e (@x\|4H n4i'`Oe8 LGwhg4iZ*)PԝG@j @Xti%V*&U#1$mEbpM1C{bQZ,J?_*QfuQZ\< m")O8gjX@1#}[xI'5~;&NN򷤯  > 0bkMc&Ӷjx͐2:?_ ̺|I,Z(HV3:#f#jJvԺa7{p7 2c;4 pŧ li Y iN"2+ш1_㾢gq:*FW[y/`jjZDB@BGj⪈brvk@>;NmۑD]H#>LD@v-NUfU:ɜJi?f4DŽ$ %<-p\- 蛇Y>У Vw۷jaIhTLT =CB´o#iS츣Ju6P}<$"gan&% TYMFQ_ϧwI%=#cG`p0 cgW!tT&*S>̳`2DY!ۥt/D:T$SR=wl^{5NՔùذß2<;vq7*'?#T-%Wk.ϐ<1QF)^ GGkSᒾ𤯴wa~#I%|0x&mwϷ ɼf3}X>i~h΀I `|W/Gn6q-ڔs|.I! 챭tmX'cFd O'71膅|]OKCpj_Fe |]>BѠ @IDAT쥌x?it{ Q ~uW=O3kfv-6MOf 4ax+'y`޲`z9׶Wy}6(_#ګBZ|hpmx3CJ~`fёU+ͫoSz2_ؽq8T5 8Y4c4oi ʂ$3-1,sꐖǗ-v1‹wpz+$֨ޮA}"dO p @!adF |`NxdKVeNF C>#*] vV*ElZI%T٣IqQc,@yR)vòُI` xqJ.A9PVnt*%DGSʔhbʙǙBr]f_:~3fi_\(bTDa.<1.pB^N~DI̙3SԢE 30h9#inȞ &Zm@t  >0HLf)" 8UB,Zr;j$PP`N?)1-/HvP t$'D Q!O TRyʑCd瘓r`4_r"+)[~jں Cܩ+Ɓʋ N_D"e(Yr &pjJ<C&-[:oQbtSTd,؉.C7b)&9%R2hwɊY>BpzNq3˕0)STM6_ʩҺu}B&`+FʗvЅIiBl"!rvѤ'(,br) %J 'm 8*,;L;_^KQ "NZGȏ 2D`3-lY]:EQ D99SR({fi9Avح=E&DG$R$-{^*\ gvʍRetV2/@wI )92Sahȑ#&7o$1riL)¹󬜒G25nhPx8_X Q ,-\SM I>>g4s0UTl#*X(,#bѦPBATR)(כ|C(ũ'*b#UDl9uRq=1L$T_k[Hy'AM„ƏWAtKtT0 ~s~$WW-[u:("~zc{ nlL1 |eiS"(N$e +^pz$5N) zqET_"cA{\IzR]8~>T8WŐz>[<е3s -ӓNC£)f(Q }2jC!Al#1(JDӳZg.blcI``}ס֓R P願 4a;9FMڼGۚ~[ގJ9ֽ"ӘIe|( u~w} }iUQBtVP=4Iߢ@-@;Ȗ6&h3Mш hd*zőnmI QݚXjs:5MX8o@ow[uu@jU\yrR$tyVnKuhrR#GSD-%V.]9@֝$@y,ׅ9<άEwPm}xgV/=#->fCpsr^J(ˍ>}2oۉG˟CgHX sD0e>XOQҞTi2]H~=rE8G<~׫/o8ur"?Ur7n˧Kwsqt+硃2=>3{ Jc;pћ9EmBzcbLpzGrjWNЀ qp\SI5OHjeSZ7NdY~ ֝[#|ݗqܪ7RW5p—|Wh؎Ԕz6w#z?mhxX:N)[ t˧oJ[K#B~tފ{v;hM }"L_giSRZ͚UguRB!6cޟ[mu^wnT5;ݏnjÃkO[N}ϭ75FnfΚ+WT0ŊUWTYv ztq[}m^]?߄g_͟9ohgx{}y]froXuSϩ 6}wfN*=T!77lXtxǡ Y+600MSR7c+ (V&\;OlKp!|`z >K3)^Ͻ{wUyAN4`޽N:Ϯ]߭tWxNRPkYE??ڽHaܿv4,1KTYϢP9tgn4\>eߝ,eae=3qbҼiMm=f:?>IJ?OwGh=~?_389j8粯*ȣ2ǏAO{6i߾kۦhAXKMeF#GclJ+p&ɞ8>< U+}˛#kJ7ob`}#yZK$O))x,o] ֲ<?\t}aԧ2 voFAcM񪎓^Oxh$O#z=9y3yhW1|u7 :xx$g>y|힟yX9Q?{B(/_ĀH7O5@Q׉j |b6:5d8xƻ_DaT>l67kޏ=iI|4wO[a*߾;7, WA޺e_LLqA|>wMP~|K :E}oEW b DzɭLՂpnh *Qp`(ޗ񼧀kG/ڵk+×XC#-α}z`*IkFb$S|^8Ʋ]<|܌O/ r=ɷ8eU4yd.m^|v }o_.RunғΣ汻?{{⨷|7\wJ ,j8sLMLi;DDqtLJW k_+0`y2 8ZM?~ǪmKqɚH uxFb}۟(pouHbҍ;N#T^S Cd3>qxT1D$-Y.bXD?zo>,FHsEi&,\#,(;ˊvPiw2xG==>6^i(&_Ўcy~ofM`>ǽௗQܾ+7*,4 zO6G`nUI>|.fl_nwCؽs<~3Dyd3?>~|Q~umQQ|`UI,3ߛnAF70;pf3vnBʻo>ƉOu„ t[7ywV:Ol D]CRǓ߿qQ|Nn.KyiwGP0;M6Dw/!T~>sn|-uepv@vWzp y7֕ BzQpBӇd>A;U~#f|>(oѼ8lx܂ЀW40pt~|lO cg>6k`Bhz },R[pjnoG7|JҔ. $G "D*(C׹{fA)D o+sJlG@J*RmUH-[\S -R.":'*#{qCѶm&95=yrt4B ~hUWexn?D WoMm=;Eԯv>T 8E8g͛C Rɜ&ZiUٙ8SJ.T06D#Rꥩ2tIPX )?P!0k ͯ5yLRb(H5nV^=GSB 8(XjVN[F E{F]h6XQh<<#a@FJQle*\8*D͛SeU<ѥLb[vL%sۡuDeR(C '=t %r,ڴiC[VN u`Gu[ÖUg(|d?=LWŋz9J*ߒ7ʌ!><^ c`) r=OQz8r6oYloб˨IBz(C"i0~ZP5('yjZ{ʗ*+Nu?DSsA BbgOq*æ+騻7//"vBʅ44(.>9n,uvn-s PNQ`0w:uq^e`/tuEBZIQADSA {;m* & {fRXqOʝ73TMKupMI(R6>^+~ы"}m4wT.$hRgjW4/у߬Em[T?@"eJF|).h0Vh1vjEuwƕ~>KHOx ~j+|ItQOy&&bV|@8ߕvZڵ+DY7S{ a5x0VweK;6gO_ ~rSbj<ྌZW<BR: 4#y?AkC@<ݑ'D=ز)Vr%R*ըt6HcFEPZ(C6U r)~v&':yp]IO%G8u*pbR)Y*#x;TF}Pg"NJ`Ya6S2QxxMS6 =&Cv}9HN?֗j>m$czL~xy(xygDO_xGۗ.]d2C#'mP裌X4ΰQٳg|xg6p*ִjE سe!'-x{[iP={< ^2hk`Fd! NcҨFFH9啼JB[-LKqMuἰdXFp4Z $LDpbI!?\,8j _D1є$#2]*nL;%XݘvmCCe VAe1#t5J6N+ŘPc@Ȕ2+a} ,pY B)euB]{S` !LF-Y /b0eKdoQi!>DCqMQӦt1ܾ/nO%0)`H=fiwS\b2(&}0zt>{. ߠ! 5)G8*Ŕ =/:bG*HM:`MP+=9` Q̥K*YXN6CHN+^ЏKϩ*PTtcc_L91y0儎pmԾߏjFzLAJ Mo%ΤuP |E'~&c=i]+Zud:ߢ4E'hz"vS%[*Xgk h{W*S>~X&R8e%T&~U>ꤍrVTn -.4Do2w* y$NCL^:`IܲP .2g!QobQ7:l܅>.[GӖv3ik.i~Bencgۦ+ 0 ֫լi~*P ?צNiEyձtT2{ ܑc]r2.dJ8|E㫪}yzz*_]R%(ըQC  ">32<Ib85#N[S5gZb( snJե2|UСnLJ AzPuo5wj4vjG;=f mGQFMNjt?@yp|dWbc*9q<&xf=Gsg)7גּ1xZ#<)5>Ϛ#wTGb_.lh{_`xxOm>#ﴫ9l gBUGS )wiILKMGG߻>K-M8\sicjb'g69vycb&uvg .*dqKn`9iTc#z+ibpNo+jZ-*Wn2 +EYmbL m.T'U bH#^Ɋ&ht2+&79F;vB l\RCP@,3i';Թfp\޽Z,B\PJ?i2/A\N~>h"k@0\S2=iyl3rZwGИφo!׳2UH 妯7+R)ID(V dRS}aN~e`(n}6̴MevP8 w$F0mmNeʖD =$ŇZ$8N|wj Ф+jPҢaADO Ѩe+Gx3CsG.}DEP>=i8S PX#8:nw^LRbC-tN3l֜R;X;8M"(z+Q~^S~0B=88:QG|*'Vǎ='߄ ]8)>L#ʹKQ%WElфCʸu#L`D8]ZA{.ݥUhqõ{/pܾ~锒>g;m?F(C>͛RP(:*b߃S1&tI|^I5\pƥM)䁧PcJ7kʀ޲&-RWltlۄM)Hά] Vh |d "j QE|1?nYJq_7Z8m0$[s~0L\Ca`M i_x+PQ?Ѯ}ﰍeBORHOQ|u8u0m}"R-t.v-P"`U{uNvnO )ΔWLMm;.XEӢoѡޜУ?g%1-ooo5= K 1tznA0r}rp>'/yZ"|y*r-:=[ӫǛ/z=IZǶnb ApM:0-Q}1#:`hFt Ep@+)tLH\ YK0ׯ!5Qύxolb;qZ֫_ywg rwϗ?qO]Z{c7S^WnҏЌo9@FœUsAvC0\ǝyTv#^w2G4\ZV-zɜ$8QM .eNo `p^e'JZn#u04wܩ/Ν0lcV$JD)"BSҎ%*<0i'@`]WjUT_kUO]8W2E>kHg+f%v"6W Wx6W780W}\KnQߜ0v*O m{d26qy;gbp*m< =rQyOQӫxFΟO}13MпP js5tYR⎩L5pŬx(ݛIMM1?Z֞iN'.:|?a$b*Ո?ƁvnbBhg+`vdn3k/|q ,tbRxl6Dyսd4%8b| =Aq#}ڲ5 ƛ^9<ל9Ft\W3c'K sXK/~MmP :|𢌃)S חxC ?Ch')c@x"}jݡ ݹTdQ9a?н .L.@DNq{߂^Nb00yʽRH%H nRN`Fe] CJEEe IpR< P\P1T2Qxp(%bhT|QuS;IL Ȋvۑ t1+4rNpH"Uפ˧lu?n<; d1W*0 !&]G,Tl9*dOd=QD,KYBDwҧ"6tG[9E]I?Aє)'/X*)=%Eх('ypV:yl#U\"ܣPr(S2%?ۧQN/@ s6-e%)pQpDq” DE0E%d UEC|8lNE3oT}VtG) t6܋Hx8g͊TP pϝ>'N s奂KQr%x%Ki!'&p+PDH,M#8#HQ&"nm*sAPk>^Q'js~JJ@/!qEr)[r(\>@ @ ,1khJ\E˞ZtնRMA w-y8e ř0oV~F+Ϛ*`娤3hHwn!` Փ+ࢦF~qp *¥QUBN:E6l ѩ F%^b%Fd%*ؘx93O /O̟xo qQyLӾٖZ #(>'Eyo5k(A,bD˗/={B1B 8AJڼ%9 ~߂ɋKJ_JOhtLVSibް;uE_IG8<7mq㆚#"# n)oB#=WE!֊'ڨ0y; d,wƷ/ŕY 0cLa8Xq*JԨKʻP&+R% H#CPIdƭ|X'AV7:KwRkT; Ĕ;wn㏕L[zu;j Gq6h("SDPTmA͌m˭lƆd` 3PS1y"ٙ۲i$CpRr4 {*C_滑ƻ.*Sۺџ<zdBe1خ];jԨ9+/p, ݋] "?M ќɮz$zUb1-b0FяʽƇxD&}=3;zMk3aTsS*S.RH s,R mS΅M꣥ð#Pg/s+\9b8/18 .Z#{T3$,ixϼ,{>Bkn4p1_b4?u{¶LzSXLdԿ@6mcC(]IJ6:w5Lg! iа8 ZMYnt8 HGE|\4-1r8GE1#qFpQN=XL M(hoU QNa޼ym1[^  .#*iCvThN:yrrED^3<YL_I"1Wz9Ԁ|{.]}ΰ+SȠΘ?2~wK.7<Ҿ1o꧟&khBuB-OSAY Vڂ3,xX>=_I񤅵Kta=7@#k("n8ޭvN\1sț527@؎K]W3|Hs}oS*yHM/j p'??&yd?2:q.d##'' 8%Moyw/L@ Dž B],IԎaVۛwoMSGأn"E,ФC (ܹCG ;:0'¨y[J۶mSmb@7noѣ0|#Η.]ij L(`<ծǀ./^\qS^^G?s@ocry$XmAR%Ϥ>(K?}F5~0IIZ"])I0G&A80i Z#RhƁu,[RiW2]ҡH33ݾ|R6(>ѱcG̞=[#*I0p@W蛐OvM)t=rPWZJM9܉>ۯĉ4h}5-Q;p@aE?V҆kz߸KLgRv+>[l~P`V<ڼ0m:Y{Ϧm ٽVMKfNQi/=.t)KØ?eeFLyn"?•j)\z7NOHzKV6o=I !;Mcʜu:=$%nFRE WTX/}= G YGﶍElȤ}I6Р], rDlxe=JjWppSYҾٴ H`/C#[xw*$dF@_|0M,#CcŶ]Oн埀SBs}/۶Z97ҤK~q Ȝ^?aB4r~tp!{dd<Ͽ"WK8 } aءxqy G奶t; #RN6`m_зЫuN{l?gr"ʍ S.q!at`6vn'Ä1ѵ7^ C#6#';լ4vɎcz7(ć[C@vyq xsӵD3uC(_$V|'~\K5s''2oR QO]f(Bu3}~ʦjaa5flzL̾ y}NL=] Bt.qL[;PIP=zZm>7w{]5K1'J]1c'IT=z%no&S:I5Jil7T˗/We|W%B{ܶ͡^풠0^61q/ɉ&UC]͛Ɓ6ɑLDGn[t_(ȥ yNJstӦee%φZ|8WԸw0mسzm;յ[WUF5{y_̹x7ԶU+wWOANR?CފU:SQ1oZwi5}I] qjϚ9k XCrK:v#뮀7'N~_=Hu>wZpL?DlPT*>!N[>YumJ;"ϟSao۪Vd =BVd?m>N=^q=O2\;[l\W\kN}'Ԭce Ys؏X5ÖM;=3r{!" W[$8ih|p;@BD݃;f@N"3Ԡ2#LlDP(Ӯp3:1r%PnTj5 $=I{ g"Amch^jcuY|Nvl:y#;CZPhbG,؎|*AZr9*j\DEILa~E'䗈LDkhL"J6'j(e|"֣ ֑wzMT\$Y z*a,o}~J@ڴfȚ9Lj\ qyZǍ/QT M[ DF=8O?]z~a|7RVpIːYqNQ ؊O_>e:ty2'`TLffB[iӦifov| ֭[]S$t t@V >|8O}@ ]ٓ< ]D0m!fj<$āekL2u:Z+Ϟ9O;Հ5vmx>tM#V%&^(\$;cqxZ1g{ܖE o<!0sOŲ#9M[UFt1X|!6Ɏ7^o\Nc0 F&h,J1cT ܃T) J}b 1&&X]?KGHtt4Wq$/AjŤ7SD"%D:޼ڑX94e u]?jo%~Ǻw<2"ΕZ& CeHɓ'v>~Ș)2gl9w;G|4N8 zt@AmS"u4NNAG ZUrx,<5rwBd<('$Hi3d䂝.b_dpQٲ#K􈍌@Y "pC0' ~#筀D;{|'CЩi9(p1r ^v ">Sئ?䃕dl}4yo!ꕢė#mfDצU'5o@=@t:Ȓ߫f!c#2%^@\`Aty9nXZ>8!rC8ҁsv0stnP5>J:A8W -lY<ꀎmG 2# '|"bѰ{ͦ0(:KPNK<ߥ 8 9S11j+ =7[h[Ĺ5N´_EE͈ZMDw 65j#-EkDE.N)/CaS' S(Fॗ^TR{2(P@W 0S j;fԒ Zՙx $ІG@ -ܹs&10j[4 D&;ﮡލК*Uh頑dmmHQw/=.zcT؆[?AR)hCq#yy >fsk!M</!$aãލ.M?Oz\!맟~ /*zN^]_rbV,w'(!Fl:S[\.ov7Gk絞'Rm9ty,(>I LKwDS=qsb$i!}J6Ɲl; q1dc 7K[MY``\SG\[\U:I]kB* `vn1.r L8~̡]Sdf x7K1aUDTAٲeK oΨP2o:QӇek<.Na Jʕw]Mql7S]GjݺWxqf+[E@-b 3`OV<]a/^U@ec1pmΐ5kVm.vjf$Q NTueqߖZ/W_"M$+VKGoCnwTA`Xz#=֯Yb 6cQp_CFt< lfu!n=:cZ 2qXɢ*nI&H乤;Ck:纵.|)sRFьkG{Ht OI2c;h*Wb38In9/ǘI|2eSqy<\vIEJvWŎP ")S{r"fEOP<>D[!RIط-u6lxqndT}j1RӧOkFP6 96h۷ת9E` 往 jeتh`^een2X3{u\Lt!;|΂/Cx7x7Oa dA%6bkTQɮ]ju~iy$ Y$;P0Sh{#`ZGŗЮ)S5u_<7ɗ HV2P9׬iÖ6:T+ ڶqKYRWoi85:VIM2|K׭wh mH)Ks{tSꛖDFDlr!N:w6}YrIQ"Ο&0AA ]؉~is{7@UMƍ ³RJQ59n&֦d5|cd*i+#֮(+LA6T Z"()un63&"姆ieFzºyO ,w\E46euq`M3֐4jbiHs4 (;RyWWtÔ(u ah'o)oFZ$Zj8СCA(Y$>nŻヒG}I#kFO4jCQ׉&5ZяN"K}wutv鯸߄' ecǎn*6Z؁%č摅+q5!`=&FPV\3cGimA-Qɕ`k׆b{ D͑۸kqr JK5Tgқ<9zHϸg^o{ߍp(}/Cx%S|d)FϏ'|RWNl̚4i; "f*>= gNP+,p*@IH+YU6m뢈꨸JwؼՁKt WVh@h~;k)n 0Sm+X#.(\-WATtDoגuÔ܎<\#PQQQvn˽~4l-фI_̙Zeb|h"{?[8z(s0ڞA{ 1<%chgQ ?UCŞNTBE.֭m(W߫oG0y߉<cısEb'KNwkowsgqwb#v"-ZcǴ^/P.d0*n,_T>ٝ -Ҷ!Q6|5 'HBR@O. 2cذa_*sΜ64ofCDہcEB!"h2宨ӹ%VZdVӀU 3(D->f? 3(}VS3ց?T0›|δ73hm$qʸ J uvcP[֟IJh)Y X̶mBDNe:EUFJ+Z5"4(7}rI_|vsRrq3罸'ע8ya|L+*3Xe4$ܣZJJ+kw=2Ne| nsDa8&|<{7;=l٣vtKRa'gI"&ez0W}ݲBɋVxz17j -8wgiEy~8ﻕ/7TAIanP|z 6<A]TX2 ؃c@B? 3FD?`B/$Mr;C,_dmo^ z)QJ*FH^ā,miق \у@%$1*JMh/&eJ ~jA_dn, "kETۉzc OM1IڥD6J|PIh.42!<56Ţ+Z SUV}y]*Il*esCrκH:I#rOϝ%T xz2#7;+ϜsUt8 &Uޕ0J~!.NZgLI,رta҆PS"d! i:a(g̼_=q_RFZk迡7m砕`qM!@"aϞ=Z!jZO=Kd"sOqwށed]S84B˓9C"sBZ\;Ȓމ␕E*Ɲtܺqg(iYUE k>8s-m܁ Qh:Wba[&?Ν:8lȗ=Oh1Ĝ؅v!/3_ž݇u=G>_.ߋx0G$6U܅XR9t >S ֮ V? ;ql,2i*U.L?hW ?1O?oY5Od(:tOH5/qlOAS獵|S- R|>mk̘ *gIʓYF⃹ _i.u5E\GU#0<+g*FTq$ Ri@ldˤy}z($福1Qq3HM|bs/Co)M) JbK֭[7ds=wst([CEHefjó|?M!;UJV!mFM) &U-^nok`ݮ < } $}rdgVdvCr$.VƄy.tܸQQȅ30Dvg+q`$s0~wx ͮ]4YDvܒ"ZR qꔵQk&(K<$LG[545̠H$LPCEӣ@#~Ie)Y`V-ۼ7 I4a*TB-\nK>oG_7 }+b@V:-[i+M6{aYF߀v%vH x6c0jq'h\ 87cmen̝-&!gq|Ӷ+ZG0+zg+]@¡x9x FcSm0YVmggL Yo/jg8>"eU Vu%0 M[ bAUȵvQ$qgۡ/.15싿O_l#ܵ/MRQH`K89i>F8 62&' Qسy5+uƫB,xr]4Эgo4D@G5 B"6k:vŚ׻@vΆnƤ_~?{ϣhrȂ޶;5KԞo뼂O|4k>=AiL18 |6vo`_+p1 >E-=Ç?ALn,D:-G"uooMދ1ߎ9Jhn-k#;@i1˔b`Fy,3?L_ _2x]_ˢr, ;)7\PE'~BՖY=K&^Sko\Z_qVM_i5&(YTC:Qh8H(VDܬ^ixNY#tP·PK{_ߛtp"˩VχOȧj_XkQQg~5YfC2>n'V*yIm9gw/oZxq_}:Fm=ՐoS;wTNVdͪwYϿ-_VXx*% kḨNO/ڹ26:t٨P':/Ѽ+ ^ ](MM믵]ʛ7FTT3ff_,Ih;H Oq`#]S hmZۙdDÕ7m&b_jMȅVٓ8}2di#2m"K( _߄[`melrޥ+ :'N[;wd~OiƜ9s4Rւt)@G#Hf.⬢xU-K񡺁5NN6Jsw]oe<2D} AP+T@mJ5 ,fNF^N! }IoWhK>}M&[~to38҃=5?WyYҝZa}Yg BǕET APȒ)' !ύQW,-ThQ$G(Q* YvT?dA"?FD1 ?(Î}Bǣ4̈́K5CŘzN~V.A980wVI|98 ۼ)^#N&,EU]) kצoB2b&7 S-ç]PZCՄqdJ0`2jb97Q(Z]T|ok s's@'(n:iӦ\F0aa Ӧ2d+r.(x_kQT֙!ނR@m) =>">a>lB7ٖ K)l -օ°scU!ܴs[o;5% =hO8e+m5Fx'}%?dG4qUș7 q 5.}+0\/6dzW$R-Άn?3#b4^!{}Q0R<ju*Þ.1I?]2  \j}Pa%9Μ<'ٜ%,5=m _[G#IȨxȗHlڎ*@b7д¡6I>:cmJ s>Uq6їbpnڽqŖࠝЙccr|OÉA@d C$h Z 3H\ӈmUJps$3(.;*U#Ȗ'OI+%'`^yD'qC=<reT+Sƭw#bS~̠"O:TS0_By 4ݣ-{&=:|2fCaҠj^(1&XU`Ggi('hW*\3_8[%XWvU?ෆG282FQD.9ˉ3~9D Kt <9GD3Tfo#_GYyU]1t^ ܳ0 _?* yWcAFQ ō0`*80 miLĉm-mS@4m%m+!A$_C)Ё( ˲UtVsK&7NY| m,TR&-w*9Thwy<&_]3RBPD*wr{I if<7Uҿ]+;w-SUel:gYqFz٨(׵jբ; <,™FPTāMŲy. m8PFKb؏%ݱgFvϣfyje@ o`S"Mj4d 6n$m0qt7)x |쁭6O.<B0 '%~ (x 6V! gNPQlZ1o.7م݇!d\"拉dF^,L;ہ H[2c0ѿ h2GȕOD詋;GNnǖkᗍ!sD(Z3 #.` QQ2V|jc !@llqQ8x 5|kK_np|;6@B&c)rT~nCڴ)ePyhS)4o_R&/*N.=4/C6J̠i2"##1bv΄.F🨝T dbVF?@ZA-cȒ5<6Bբ{0Io:Z7x)@2nGbA72̡"T+7TqY y/Au=tFMTgLloznonK#U;=Rn\Hxm*lp elh1j(M#1b0jp~Vlh..׾m͛][oE?$ t4J _%^[V_-^ϩ42qnqG^khh^o>w4 +nDm+f[4I/ӆӡF~y3m]{$Գ< j֬DuDI3vx҆=Ti,5~͡#oROp\r*Rt,,Qz/sɋNhteO%cZzu6Jaʑ$eCxQݫ|-gA<]tgw졯?z"ηfLOXZ-n .uZjxW[߫}gAl(:94Vv砯txzUWM+ԍSK6Z8gtMī-?nU fкVms3m/#WF|g=ph˗u֫5ߌR_}.ov3}7~a?樱ZH_𞚿lg5vxgJFlu5DA극 mƈT?njp5롪qaeʃi!INdी)P@L&Lu.XRm;c.ge(hu i5 F @IDAT?eS(-K֢6:e)ό7. M8ksƬTɆ.})'OR_.*t;w.}`wb;bOkvu|Re9A;q!aҤIZETЍ=<;GٳZMY4#UExz(]+LzȹHD]Z*" m۶E͚5aCZ4rkD5t^%KREh RVlɩ݁SwQ%Xv;lˍh MHنXq( %܅H?"R pS#U5X:\8wq~\ _ F;@9)D_ę3g( f&J門|QkXRSjc_gy!OcvirqqlXf6}P% $χ#9 (!g."M@ZGG ʜ2x=U.t~I&;%w<} Y gEhآ<Ea涣TB>%b>ThؽT(bлVzwپUbiJg'AD՘h;p cj&aCZ*x'QF+"=ϟފOEdL"o<~9ʡQD[Sbodhܶ=*>8E3&b6(ӗAWоnJ e|h3ьc}C!L*{^ \F3ŋkxڿ?ɹ7O谛_~Q+M,6R'иqc  lTe!lH_rC,ՓGmfh$y 4%2vV"d˖M/!Ik9oDQ5 ΡObg9zh(bpej\ (L]8".JXe֢y@&jI0ٳB=ʵgF駟 mU'g#I{77V(lj4"@JG`1HMJ!4`۟0wc8%`s_1^N]>5I/s~z1yqe$I7Ν܆< 2xO#2Q^9*7b6|ewRkq޿_6n8ΞHRn S~3n ?DE?u6>;]?m䴄uueusX7i(*~ [~.D7<^H%ؠJp`3NxėE4ilxq ;'HDK;TsM 6͝;7qHA,* QCJwhrRY)D-%|}L)HG"%f ›XGTF'B3x/Y+^@fG7oT P j+$XkXƂt)t`6co3G~16R%q"/~N[=" G}#BRFPUd7Z~1mN)"` +bL6B㻑R;k>Ag±3oW̠LF"8RIGh(m~G.C<$yع CHvs0Cp@vq'a+&T@94E;)XsTQboej]Ij=jyH<+>:״!!jF\Wg<7n#a.'_>8;u  kX$d~3~0JuH%:ؖE>>=YPF~8 J!iZ}LJZHV_50}ĕ(;rCt_vc&"2:g$ ?uTkAY$7t{:B6g`bD2} Q1dB- 7KާH [l ~d!#̢,` @kp)?2/^T?߁d?j9[peJ;gwƦ-eN "T;wv,ns`pEs9E;JpKp\ ӵ?oCҏ?܁S[OV>6!CՐhM 3c$ZcPlžM^(7vl@{Ae+SvJcr~/I;;w… :vU#=8r\+i]TذRaH]az6Ja˚_|O%2ztWskM[7T ;Kta6}<`|5 "[~c^FM Dc;\JކّIf׼}720RxWe4xo{)p- #!Scҥ5r6LKDZ"1Vg3^uj)F`I8b9xKZ')[O.M6%S--)iM"zv}A0 Xkl2!˩RWFgP)h鋨ɂ^ c#0iCc?ʔ)U e_/N1+ZԆ~}D u`2+a9ǎ:k\%2]@o뢀,:3eʤF-@K 2.L ,}f6):7 KRHu@QX?-=5m!μEUxr0ٳ>| ШB.4Z @VYJ|goO&q2jgGR{zJZɟ˽[b.7/rO0bߩS' #&X4?sD"hb6,Ɵ&4 4kjC\&<{槶vp;-ۈҍ#Wۛbqt3Q6?2X}(i| q "ϝ)E))O<ߋ|5&q.c/y#ە5'?r7[/R C! Qu믿蚀F }:t^dK\XXI`Nv5E7Ъh1$% a9KGV8K/Q綼$}_һ)pn/01/_mnzY1aJo>' +=^c~ԳyNc%8K1r\]7KW.1p(vt2~؊^ DlAuY!m`pfT}h&:{W$&VΤܿ ޛ$^e^{@1;;vN.0<;25Oa_tz+_]Ik킧*tU7fRKs1>oH'w _+DP߆)]9{KOqo7G=3[u >Ih뺧! e qoV1qM!:HD7S`Cl /th3qMJ.'6wR^01 ".ĩ9q[-PXg/wm wF9M_3ĽS4*8/_>P; l8$V59a9MEDSN ŊS8"Ď&K+ T+V5[LZߪE\^4!(PA !}Ytܙ u+mZ37B879[;@Kʡ^$"ZWv@MZdqVC]rgĊcy22axx: sĭV[4: ;4FP>sjn'>̭Y;6I<~3pͷkĚeQ2 f ! mPyX% /><4_.}4:_ GrXR5y.gxh_|:W,-dYsz%h=Y:|߯FB8 TL愗BY84DRBtu7l~變rN%|=BP W~bX!@ ?Gg0낒{r7[㗒`UKΤ bq`x"!@ҥ?~x " ڲ ˶EHAJ Q@,y -pՆPt޼ mA\R:l<4ظ=4|^:.FgH9KC_( ȸ?4TXq @\rٖ}'NF:J*]H|(Q4TFoφuJg0Ba̦1eX|OaNhX9R%5IU]vF,XV_o{< KP'd͓. w(AsniёtDY+W⧒5LQ!?nA- &2;M@ ĠG Aa1#DXq3tP_^BHߑe4nhgDܸ9$n^ɨ~ h Jf9f|7耞w-:Wk1Kcۦ%z>:S6 G7'UgY"JGᵉKS+_ L<}2<;N_׬k^CN`oON]yklMn~_˷Aʢ@`<7 OBm8c%4G^磱IX>l$P)41,1tn; y ;w+H Ń҈,7gtdn“mph۵: Sqj.<3#e#oi7Q QZN4sڛJ%~2Ss9y Dѳ;8{Cj ϰX(kRrB %kT{?r$ZX; V *K.0\@ +'bhؾg?~|Qt ~qY|0y>\vVB"U5G\$^|LBh} T*ec!xK8H`_wo{/@(aɮX9OGEh,7=]l>$cgоa07ĢoEJ]Ӛf3dIATx oT}!`[ x .J3SGbd_g1pG;!ZseiӦ]teԟ1t޼"e<58xb@1pPƢEFz%#C@~8~ sWѯ1LQ^w6]-s9u.Š*Ef},w4-<԰X ( +cOv װIK3%K[0--222,:tc9O4hM٠Xgohx8W;z˸IIeC~Of|G}8xy κpTCo4"*3Fi qLyiT#^ش+gf;?o:dDM}Qc'TUGYơM+5.FN3R4@>ƦSf~`}=8pnceƦ[u+]o.j80!3wMSbCѰH:xG[#*iU[sZc_[s60ʊm<Fg4bRF4 xo.3**X9}+s f+aTqY\ưq7;N5ݝtߝi$peF|R1~S~k\cޕاs;h=q>Hmw*i1ط86ƺsư0^<o1k?.!S!}wГ:,Ԥ ztyK~} 5Y Q"/.ۅo>z?_BNJW*[&KfF`ϣ~Tʢ!bBѹT}ɲYϖUsBX H $^!b:;'1"~m1P^fCz[,ZNo4,")Oh87D7RWBH?d)+ĤxxS=Ffz *ka!g5)cVLftBMpV P0.œ"…;ACr!0_it5~ɋ-ƾɗbc^XbJk?5Wa> Q+.zeʢYKHGPoĝg^ŨɋЪC(u'{KJNŇ >NP>@B!8feNg;5J-ԥ .Z3eMVi␉ ,%ŌaJe$fQ וAkVLM4{2eɊ5Pr-<ԯHDM (WC@6dU@VB 4H9شir.FQͼ#G L27ϯRwz'NP.G>SC*bbD,.sbr֣Cn$f8DOcS1a%4ٯJ<8!E[nJlTDi%~&h$%طU0:nD\<3:PZ1 :/5Aǒ+Цtg{c玵 u,ne{3Aғpbt#Ȑ} #$>ZbHcUO@zx *x \C~ WmD1kTSjWDԯ$/`˅ T뉴(uf \i<}SrS!JOs'?NSe^E,dUm9~Rj%~x\(k7<[yܹA 35V=1^#K1fIbO`s4Kpk伻6^ԝF0<$}Дd_&1>^EZF{,Y N= o70%^l!屶,R J`*(zR9EO(J!oH&R7@AUz(vzوyi81V^G?2T 1%t~M9 8y5q>cNUJg@"<$ [#-~f1vLL'D8=k!2xE\ $p^<^`ʄ{SϖGY)EaKFO)ls} 'c#Qqd㦊~Zwndldc$)Ժk]޽;8za4zPafАpɁ隢7֩s9Am|`.bQ@!M^P [og_tH:7}FF X蹊11!A1OΗ-[XNs;27nܨ\J(\y&4*`j ~ V6G*໹;'(29ohAݼ%R$Vܜ鳗q\FCyP'JmUEÉ5ˑS5NZ,4dS۱vxeb뺹xm }D]A$DmنkS*U*!4P2ptwN-Fص[)ZFk|+Km;w|Їn;RGl3O>or!l>[?F27oG6nߍ;[*9ejޏŊ4."!~$j_bcBL?r@>;Ə GMunpVDnuZ ,^\ jj)<]{uӻb۰'J ґxE%ktz/v`lG<[nmH3{7ݏ6ߣB'AB pIcћO|D29~ Vb9ܕs֢w߱f m݃'a60<8Ԩ:AˊлIex{ر>RnALJBg"zO$"cm.luO;(jD&䰮X9<땃5- o[S>AЙ8/[<ܡ!Bs[<_w,w7Qvw֕3 nՕ.]LI%u[‹ƣԳ䝆5] >Rz_7~BjNp>ՄѿGieTڿslg24D7ỻo>/*迗x!$p~mwS2>}MQy{L#jdQYsԏ4ZtDW^qD{Q:$86߲?2E'Z~ƫ#2Խx ߫!tY 5E4:r^Zy cύR+VQ!Lr~^g&ul㍢LStgy?cGv1:R-Xv:wR/2>~O} ӏ_U~Xfl\=M7hTvpc)hLJSa#E6F*C#xtFǪaiPc'#gM) 64Ӆ7gʸppyhҤѶY=t0>711.1&Z}vxUc͎cS{q+1JVbcF_~݌$#nu'ܠ FW>2l$0W^Ѧm+Rd!ywp1$cĈ7+c5^2L1,Π̅ J k%~\J4uS{R uW 2Uo`tcR98Qc식Tۤ/54ڳQ1kfSջMeel8tؾxQ'o7ȷd|a 36n5F_J]mFgjX1hƼek4NՌ1-e\mԐe56kgtjY]1&Ji`OZdpCB@vr{E"7\ -Ck-[{~J\Kܟ:m`L1-ZU||) 'K%;9X8qtDWx>Ep>~†1RD'MퟫΥ"WX8cfRQE=-a*qhԫ o<Ǽ-DTVʘp$.h֬c]]JOmOQJW^_x@n9-$0I}Dr/q#G-F Έ #S4tͷS)MUB\ X']ֿ,M?QF9Txb PNl8:E:x)IqMXf)E2HIL@pv']AtL2 )UA71+# /S3"H <(jn L+i?GCG>8THtPG6rTuǔҐJՖB=LxQ$6WRlC&rs^#Z+9K,'2u(C}?x\͵ ѱ$m'h't/oZ$Xd ЭLiW^'EvAgD;![AHtiሄk$j+T"b!2z~M9 :Cv@:sUt# $\Ui%4iF'1J1qq5vL-캷bX~]E /[4"'0[/`,~&6<^CST880u6u &.!lGY-ց`>,Xzk]SD~mToP+ ΦwLwF^"g}pCؐV 1o}ʕ3bZѢEUN=ʃLzbGSp: YOM˦Mdjti! a7Ir WIHtK0'} o]; &3%XtҠNJr,$!wr;~ <}g2iGC jT T=N?#P6g.\b e~jk-xl>\ IE;7bZ#/W oFBR+3>82L\~NE8:3^mwQ|:t;ԕ uu9 {}]*w=_3@_P(u"voLSA /'cYLn[}L𢱛$mwHpPY3-9aG֝<U]w\UdVRs޹EF^KwC R'|+UVŤI +$r8d"ԓߡp$9<5k}I\=)9R܉4e,"B@L}:c79#؏X3<3ԊJ#GF?ꮪzğ@u:+bS,T}X(Ji.`TzS e ]ĴxX/(1m9:y҆h8F8!<k,ѝEogG*ǟ}D)nHK=zV\Ya#4,VCWPJ TvmŬtMA1Pk^V{7o+TRH8$~-fkMuc"*TEK &A6DFXgIkw^/*Śj\\YbP8gGm64V4+QOЏ[M" )>AK6mTjw[oBQݦ:hN!&iU֪8 mݭAjHEU `Rf 1[o)BP`$z0e)eú4ăI@gJwt:}+09*_֊ ZET BCLBn~EFs0o^̅SO=<ܐU:PNP i,NTG%)a,Siqnt_ì.]`ҥI FyEcbM[3 G ط_/4o_.3jB I7(",A!dD,R6<\])hp9\tVZq)!bC\mI`CYĆP䑜^ 9;>ciq&{+X-[VèQG 6Ng.SGv :m% bD9a& uH~]<wNq~7n?ny`mYww/notoכCM>nqhNLbetѢE&sU\#G:6i MlxCVo#'PyJXPsYhƃ 3wo  Z:t"3(Mm۶=7a{nL4 ,ZDe DFJ95 :bb<|o/R1"ġ&wU A'|N6M!&&FYQYLܴ=g#o֭=9L3VDFCc'P5&?`!q1#VCEH噵5QᚊJ*9J5 AI ""x B@PD!P̂"J@IDATա#(fXI nW9-2rsgMYxksC  W_)rzDGׯ_8SB4Jz \oVRL_(udq#lEak[%b|C記] Tըa8]6o&Ȃ~Yh{(k{zWE[mЀ Q4OB^չHPۉA8v^m޼~v"$m)+)JK]83t`aIK> #[7t6lPVCǍB {ʡB ,YDc1;f5+ٴJ>{=l p?9F]8g7^N$o2(Q 6 7n2n;n22'9+9Jv8J#4noX7Гz"Χ]SfN&L_OVz%󻸦d!#WH:F lvMIEb~wҥK&tnM "&wcMb DRn FB6n4CFj^͝5rF#&W@M ґ:}Y 4LZ(&tsU[QH{.D%*IТF` ݍ]O4T`ECW1ň~`P. N\Phc-uxj-f,CAL2L=^wt?;}+UicX^lݲ5 ֔R=N㞮Ñ:72Y,6ްS K x94b| #$Jr(6糼W WFݏ{Zԇ2YC${ghҽ^8en yz8^ܸqÆ&ݮ) ɘY+_u%*Q,R7V k %} er<2O&1cB",7jB, HP\9ܥAo$dl+&O<񄣵/(?|AlF4$\A:M'ӫ~'~Gwō[77 ҶRU_gkXv-T4\%`(w#+VQ4 >pZX(}w7H3_ktX|tu;mNA7^wRVF:3?6!/M%={ =ap]k0m$1zg&P6F_mܵ_&tk[&G֓/d3ۏ v5)iR[\4) n/LqMyiO DǏlG+ BF]GVF:B[w6.0"f{jΜ9NrwpC 2̀*ec*͔I1^&.=6h@|rl8|p$jԩ,trzdpJa_l֬)=Ǫ?PbG/aC+t;.BC.6s}vam۶6x;ʕ/F^'0ӘL/XEJ"0ms 1X1#zqǏwjb]c7:O B ^!1aEV훐>KЛ1믿B|+jA1N%ıX(.Q [c1"67ɴ*t/W`&&!F yv1}TćCd8xqD?+W>ebǚ1sj[EƆ~?B<[J:*5^#ӿogh9+/fdEK=pJŤL:(v 'ZuDSn zOpHIٽ@2uh.(&8ŝZmu~!\hm=]W5~ZXi: XCK(V^ċ,7 &!e50x!4PFZoVIE-PO#ٰ'tkPcX@O%h2RIBvepNLv*]HE6A;P.S[oq`^D8pWALKOH~TR/!/w3VS=PE't%utF135c59VjGjI̞-~=ϴGVpJՕU gz7LJJ C8Uk׮D͙3'<+_ -,*z'}]):H$6+,OCm8ĦXO]OE秿>]۠oxҮ%h] Y2NOuLe+nDyxznKGЮI ]2g_ [oТ[thRFg%TVwg~ÆMWP8? .opz+~?ʓ1`ާj۷Bmhx틆^>^ػvh}?"w@'~ \q]'vo͇o`.ĜمW[WƲho4m߁c-l};^p2Ro2\dv ~ ,ނ[WO嫠PH%J[[C!x⁧IRex['W^x;cw$ FvVO9isؼ4]"kxqQKF*99 =A$ŝD HqĢtB <%K#[Q9s eOH&m֞-g@Yffd!-) Y<=4/;! H.T?K3=c}buĉ4cԍ $ )!E\0/hC5QtZ)Þj2`|||`|M .{qT =@Ʀ?-_E2 U'EBeOoX̀T73[MvϚ5Ke#*""*>w 4$\1EDW yч]4ni|;BP}t PN^'q;]V6j>Q!E4neuJH]wl\~s#W|5 #ݰ4.7 2`ARNFy;큩Bm~~>@G|,ZW,&oe C1p?x/UO1gڏh[1ObPxϧhub"͚d8+cc3iέ0f |;//Ӕg@L>j¥hZae CsQ} ,B@A֝e`ȳ`R13fA"ag$ a yy ;mԀB}1~E_T)>scQGyԶېAkæU=g=zdүAbV(͓×0wBgT).{;l:<;}ڵDT\oXF,*L/܏wU->95=#]EQ;F+iEPaayl= _aP랄ЫOg'wџJToރ27dkșn0grȄ7T[6OLxܫ$TR Z:(x ٸW-kCC( ]Xw]&eb%Ŧ#1&&!! C>EI*^~)7cu"ĥFEF& @%88bXIMI yhR"3Ra""*sΛl@wH_O672!_~>8_]B%Q|M cx>ǂoP##O&i[6G*\>(m?\{V )A `*,G]QRq\޾A-(-#{wz"#n JpCbo6"(G֨Q#9fXfNoxT.sBLw" 3.`E}'1jnD\!كzu 3>{'͜&Y(grMH1eygQ4+REUeK3N꺝1zC茑;2 Ou5^?cgqW,R'yU3GiO+Sqt*R)]b_* 3KQ.\YF e%olz]b8WpI^Qgv\1 LOdğOCh?UW}ŴNSX1E s+9I+m"Kp.XA B +PDQ*}xz>CvD<51(:M6UA!AFE7cfJ!?/@ProFA-03n2;@Ο>Y=O‹]aUhm¬aJ\3R=,Z(Z|M*+#`췱iTftƔˣM:s M@㪅5ux_ϋ5GNB=G+zHcn\6V^Q;x#Zy{cq% m%Ob強P'2!< [v%1~~7z9l Y@ 7 ybQn! G${.O;vwV2B(r i)Ġ0h~ s+wwQ%T ۗ"%j=?\';\s|K^f}1^b>{0WRhAB .iة+a'dq^5$4㚒 !QbQjcґNή/-yhL+c/B)q"tq1}t%"Cfzr=Ç |7F3 V$= ECO˖-S… VR#FPpW]ae|COrL$oa9"#@S-] ?? n'p x." ]Z54n؜e9# ٧(f"0_)\QC 9=t7rjonBψ@ƏPfػ1DH'6"%r=m)%PL!Ğ\z ''ȫ$z*iIx᝱xVpҹv;v.HгX|$nƈ(Z o> aۺX? 65;Ѹp܂ aUմYԉwntrvM[;_IW ހuP\7SC]вEݷoN}Q⍨c4>h:edq/lZ sWlEdFV*,κ-y2O@oo4bJaEհ0mVl\OYahRrCr3hYOc8}:\lFFhm<ѻ u(|MKf/EF pd4xnyqEhD2uQ,rWDeQLU3Z#~?>ZI_|n g9_dX!|뭷Dkz \隂 H6i_:?+1"hd"! R)Dc9e@$ja52L:כA+ ԕ ↇT6pzu=7*_KYf "J!$>̜/ԝ!Jp- Iree);ۡd:+w2bԗ"gJ?'osȑSqZ?ϫW'Ǡ V ԁ$D@.N-h Jީ? nǘe-u„ j1>eq|]lJ- W*7ʗ`-"ڠ>uZ2$,ybH|Ύ^>"`\Y 7(BQ+((Kz~2W`5[g<6k3QDZM6l鈏K!_JW:s|^M'zBu)oUq_:#켻 9\;sNz:J]uiGZ'r3|xsyXX?S"9%;zAa͠ʐ ݺAn!p]IL6b}TFY˗?ᦈ{!anec*E *GbQ|Z!iຍ͑ &?DNrvpG u1foF %P-Udڕ>{J%'_'8!Dy+WgюM W^6hϥ@'&ـ~=aǡYB쮤ʯJ?;%X4Gwe]G+ܐt܀8IIw%bF'Uh[g೹E<ɄWѸq'4TtTMQ]fN>d bTl"#K 겪]J1-FgR؛H0Sg۷/q/rz Ġ E6,c-&EфK@D#(}P1 p2qF YGc1R?B'2ѧn9b$.Cn}]2p5r!?W]9XhT0'vOLfA ^wFZ?܈kv)Vf/Md![;4[r>4n+c3T2 WDR]POG90}FbƶX}}Js}ɝ7xxL#5<:@m>~\HhbHC7Aal\<帕VzuO޸ {rXݝC@=! ܾ J#/{1 Vӓ,y,&Feltvm:}tMѻ&GxK;/܁$؄K^- HKj_faD]>!<="S>/.6䐩5I Z,F8*%b\<<3&FuT64%A*` iPh M`Ԫ<`j^)QsQr}ft64# .oElҮLG,V[,ƋiDuǑ :'N@::tPFsc$y!#UH1#J#jYv,^! 8XAPvp{O8zU.G]%SBD(l^h8td2:8i`uqi/3F>G\Do ¡^lڎ[:6vf=>z:S5 =b1ޭW qF\Gc9`o+A 6H:;q<߫!ZnY~wu%;gU&e{I cׅ+OD̢0jh!u'VI_|E$Iڑ$eAO\SmA}*J/mԀʳu.m?Rmx(򗐩8"Z(4i 89d%{A Nbڞ_:Mi< &ObH&ҏbH!5!˝OF,E!r<6]TxbcADtJ $F}D1zv%T٢- Ø7FxL x[2NA(Pffq+>Ҿg0#:o([,*N6o)D=\sEbcMk+E8 W9ߖl",x"~wex΄oWشiSEW+WL(J:hrCyMI-Z6(PjwGYpBŪ/{cs{Xq}v%o}tR]w&w:x_\U#^nqU-Cl/UG t=-)"W CsM3d/kz{y-Zsڳ i#n231(VZrM1eȟ5EjVz;5ԩ,Ȼ`sV[7\ė#Iʥp1(B* ̈́ AixөXi\01XﮦbxIنon|!l])D]WG Ln^ZE]=c~՘Tƀk( ',Fj۸Q{f 念ïZQ?r8Eh L1D੧̛2It@k1-+Gn5`IxcDUkrmЯcҴyU?`(`q)=>h_z# @HPBe^"HG( ( "H齓@HHOo& z ޖyvwv4 syQyWOS>` rD* D(\=u(mz:M=BA t{oxxh3MGp̗&_DW:+Q7VEhj:n㕳f yaI [G9$ ,B0e[hAr=r(2IT)2ܨPGӱva=S28r׎'mATGz!:hTDCD/89r$]`4hgANA1 GCOOL}_ax 2JPJY2m6 (`á@A8c/聠_bKs)`c\zڠ(Q@]+Yp*},A֝rXhڷo?%''z( ۞:Yf|bgHxaz@LK~MKTif|8)$+QpOMisfV$*(0EXL30wo(q*Jk a`ĨT/l[3ǵ猝hC h{7Di3Ѫd]:o0b \Hs'0 |@f}PP0ӯ`E~a;!j,ۼyӗxsPEO2>7?,oLCP5|z+f}J{7o*H{_/Gb|+ñoo=_CpvhT!@y`5M)J/Ta'(Ρe$>a6F}/uCQ[+Jݻ+R^J9W jA&,F9ì9&g'*a,DU:%c¬X)WyeӺŗP*Kvnj"q3Ǹ(;FLZk.Ń|pns|sJ2=^]e++= =Zŏя0ӗl-Tnq""\p-z^>.aˤ}'un >?i#5 WV(Xk;Z֭L%{cX;m*FcNc')CGBp'y < Nޱ :C*X"I_{gꫨ;OQYr6j6iO @ﶫ>RÝY(~U1镞hGVExu]7LtJW˞6'DY2<cL>BF_J28b^[dZ)=KN` /'̈́{\@(8}~80s*̹2pN`Bb2r--*bC%%XUl\o*w/aH ʔ Z!L> 4Z\LxQ'B I<2nL_`od&ᆭ"C}A )8$:=h4bl1U !|8-b֭X$W`+=;S(s"\ԚiԄ<4Hg!dOzpA^L sβ%hQ(7'&kG2֋9dXNOPGC5y)a>0[ƿYߙ1e >W]V) Fׯ؋,]kxY*ZGf`g̉|4,#xv HNA V寍!+mFG2 !C&M( CBB©S_~hK lHQ-KW):dnu#۷+ߟ{Rߟ5jp!rSm#x,(^)e,Fjf> E5iI{8F9I?\^fЌhޱʞ ʗ$ [&%øb9a]qoPQg7nY1?/cy)>%R+O! 鴰MQ8ϸkf~YpKa?Nw“9c8#<&{GEeduItuO*f2o!_oxmLڏ./QOfN.meLV*A<}Ҏ{UM޳!|xAQ,W98B+1Æ SF/*oH"= <5y4O)GǙAj*,MWӳ>"d`.GX94An#&#k2Iݩ\Q/?8[4Sw΁xr,ZϷo'KeS/,/ x{rG%!oP0ʖYP68/^݇nذOq`LFąW&TQEWҍ`yķ(hGQOm^OVorMhm3ke*9 V)}*NXMJ]4ݥ^NA CKWSt?1OPӛUOA""2[Ov}&~M6!EOqs/tO>#bkty, _.N^B"1`3sgC׸GcA uKf٪J=w%^¼S(C;8:whBH3_ggѶ] Ǽ7tT,vf!#=;VƉ`m(1SQ+o(Gqb,7"} Jzr7ΜcsHI@P&IJymI}¶Sw9A{.38$1^N-oϖth3r#)$ pw? [b>~MZ#_ lټ hܺ Z+ `Wnѕz̏xwl D-tCѼɛ3?nČw>{*uAv955tb#K|"Ulw{Ww}K;0gԫWO Vz0E^UC?Z{(~2N>S i10u_#K` wt0sͩ4өw'9.)&>Wkkoj8:ǧb(Er g84Yύ?]@xN}+@IDAT?gBKQ<d6/c*;G7;ly_ei>èONiӦ)cL&Ƙ]i,G7j>\e[wCh,~/_&IXvҥ ˉE*/ 4]鹿];FJiL>iЗS)\= An8w ֭ߍ7;ob5N"d0вRI(\:T. Ww/VuhVtqo4sU99W B~/Jo1}Ivp@4pf㦠zy,|?[gAˮM1q(|$N[.}w#1]UxBqvJ ^y`[/ϡtַyY AEs3"Ӱwxf1a|$-*Fx8c>S0gqmp4^ uk]:}@'F˚wv;:47W5ċ1hO&N3e˕UN`E`HȊѺ=] B[_)Z4T|2lق7|(qj&qRz c186z5"o۶q4OQb} tazxmR/@qx|xyxTqA2<~<вKPkGg$$qͳC.TTq#uhWbЪ27QtYL .c8(ĝ> !QMJ-.uw_Gz0r~ pQ4մS5p Pㅎ5,KFQtlK^^pa%x V#9՞!vg4& 8g"3#*7h:focXjKp XQ}z͛ca8عB3OM'b + ENVu.^( \Qr=EMŢNF$:?G4@ * &:=s@"K2h:U "2mYS~eDfi*e;& 1 T И]$(w.O:"ih!|X5_ݔ;xhRa:wD(ŒJ(ݻĉxT>ESG2^0?o8Oބzyq>{I#A.e}fG/)V^ ˙FF>oA3|ɍ"G>S<*ŃP^]i%LW _/PJ*5TyBt F HKcFSM,wY+ 6yK (db+U s'^`X9`;S_6+< LIB*\uCJtN#3; ,NZP=f_' L3ի" `:EYpjo*Մ9"EzLdJ &4C}KQ=2 ]KH&EpY`43nؿG?okPq!B?COږa&66VA1+>@: o#+CDC΢#N`7GѾ16Or:_~&ٲ)`%p Z6vMpQ߂4ю h v.9voV'ЛNFyl& Bt=8hJ**[̄2} if?Ǣ3Qp~Dݖ-4oUE9|*R2$'!$b(^ cCr :r~s7ѝO zͅ09;S=2O$&s ˜ODg.R΍KQfvMLal^_& !͑7` u 1۠} k"Ɲx #:bcJTAuzu舣U*dBRmBJD!{y{;S1ɮ=߂̠(SV}[xa)<2ĉIWYp,[M։Ovϋ"0=vV̚gn";qc!p}C^('_cKP@޷ hrhk֬Q(ΝN L|_5qM!AqXۡc{R.\'O?MťKhybŸUF$'lr"`3sN c' V!k]VE32SjOJ!$GScY'pJJNҒ2VȦF@=Ij4&==+aȟ0P"㒒8 )(e8jVNRĠ CK}4/ JM; F$ i!0ڣt~l}U0,ega(GڬR0Hm ;2re.U~a-XT!O*=&Q09;ed?Dއr:.F39!Dҿd= ??1 Pm~aš|i*֪eoVb l28"+WWWp;OuHfއĴ$F4%3G87߽ S`euEG+>5`P_kW 1عu<]9c'yd[EG2рlu[UU'QWO)z7=:/xr</D =q\H7TF?tqu}PN"]? ~UkbW*60So[0zT%>-p_tA 'oN:(/20!|TObb";$z/h⿮ Mޕ1sRV… ^SFe\SȜXv2F#}C/Z=xkAr qMI"qQ!f")~YT5i yrtWYYPy,F}c*(`46kE"Ө z֨Lo8C$33H3xI5$j2JU'ǤZ/8Z8k$ςU~ΗQD(d/\:RҒI1Q~,]2[j in!钺sWFP΢C!88X')AlU2h!{~iI$/6d8(mŹi" ~$]2i~0%F]矾/DзqtV`!l';D^W;. |]4-s{//bͺO؅.Aioam_vPꂥbgBk=:v}1}m\#:UB)!:>s>0VեA'JWzGnuINES/nC1sZ"O'neh0Q*_EU׫P1mJ¹+XW \1Py0l2{ 㱪H#m rviCT'X>*TPN\$LwԕS7aؼojgZOQO@>ǏGLs Ѓ!|$gV Y4.O<'O3zĉ1bD=C4B9wPiF+X Zhӧ+KsmduYyW"$D߆fO 0s90~:-ˎ.x)AO&Z)VM J=u{,n pKY/VeM >1(9g= z42n0q@Ds Suޣ=~-Atј֯_')fCI?ު b63Oy]h1@FԫxJA]ހbQ|'14(7sbS~"Yz`Ə0/ŃptǼcP.+r’9h9=j6l+cG[qz"}O8=n`hQ3Le*{_}]&n Dqnܤzv+E*{Rzzj7v6 _㎝ݎvMkĘ[ѽ y|1jd9Mnw|76~:xb湨^.i0j(nމt&6 A&'kLJwϗlJ[~9*T}Q!G ]<Y{饗0v?ZRaZwׯGO?)gˆbe M!5Ӽ8\trބ)=ԣL8Jȩ8CW1Iy>sf-'OR*6JorFiUH%IAҌ'%$<-GF..x23ek2r`]ȕmO>ɯk6r2Ff[tK4vR֠E&.rEC;K Wnu^D4gϞ:*ڪU+_f AIdv(z، FPpo R%RtL+; t+UT3<+BDgQ>J$LTE0ً̞穑?&bqWkD~}*v9(kz֧4MU G=QdM~'֕φ~RYDUChh\"a8Pgj*X"}L.9|VמeC0+)}1~uΒAp/D I4v:qg2P"/;#}b*5JDWj;!FcV h&@{챬GPd!L? A'Tvk+J+/s3{uTz,̝ˋk 3 (Gy}̰Bڡ=FY V%D,Pjլ a^8 ^45ހU9hfNኌzf~y,I (3Y%#UP@Y<#wfrƝ'#Of '#RyF^ɣ}vuruYۭJ2YָhFnUVdcUy],,Ae>TfQfK݉C6;D̙3 LsZJժUa]Qwf,Js(*b?A(yM3tQ<|Rk$ۯ?o׍AhbW:xYR̃Av0ϿƒeP@#2鉗p,|UT|*zevt&=hiodC"&j.;w$Oo Uo݇(Gf~n<﫤_kXy Giե%򹚕HNek5<7v .10i(*21{j`SN=ɳA/FԄ ~ZUuԭ[Wu֍"Ce ̖ulgbzX/iX3Q0m0M4a\L1ή fYH rI9RO=o^tťAjFPteUaELcǎ7_4 ςBǂmoҏe؇BBŔ)Mh1C+Q[~n~m(l />m,HՀeUr 6 dc{ws?@][2`Zu>e2Ѽ{ktboOxZ o#9,6|F[y'*wS<ťh; 7u)5X\k#2 N5DPCyo)6T1_SBJRUۏ6 ()7]~5zߕ&:SGj1z6 ) T7T( 0P|F&"]Ɗ_XQ;<6avCt;7oм1R&KD  KكKӭ{ D6ΚuŒ1p! < ,n;4'+{L/,ۉ/saz4 Dp36o15X aqY&ӏq3*(S@:>owO`jX|FZNWč_෧x`;"!|4`zR[D7XmٲjsHH0̙3%bTƬCw:[hX>a (ߊc䭊r*n r*]Ni]\go*ν2iHkkz1Y&*88L[Qg"_(U&GUĭKÕHN<#X s)̨(*:y|fP&B969(̸tZ̶ !el ,ZSYQ*cm,7?qC!"z"B*1f0 [wrCv,_NEW!2E,Zgqr)Xs{P+=` i݃'pt @r!-fs޾¿X \$$KRLq9yPބ{5,h;txeT,fN(^W~GQ&$бm,I'5KGb2-2iJT袂ܐeэS;g1GY9> Mv͛Sc*nމoƩF wncӶip"Ss{YޞbPxQI7qpj|3a$3=RWT_LE1pzx૾7/>PȞ_?k6 ٣h(#O<|c6,K 9)_L[FZh0o'w([h, l2Xp BƙQj֠h(Ү Y=((6>FɩzG}@kĶ#%Ch ^NqR4բǬeS7Yd%zFȞv3 h=s^9':8}uh֐59]&y%~+~lY{QҺ~1iFN<(G3!|4ߋ ?)Twȟa$ExEhx$SB {5j|SY# {y#܊NS~rZ]j= Uꄎ.cp |J4sms{0OPTa$}"Z_'|B#w`9릾_CprMDqcx+6y A*-(P! JĔ'qDz-pLO<=w6r#n5 /ơߋ}&_^δy| Vri{ݫX4st9Jy̛a+{0~*Εocyc*T73&! Mqs('i[WoѣG_c᪐ O ݻwWz˗Ӌ[ ݻapQNE'|%K"A-Q&Lr 7o/P"#Y{ʥw/!dAɊ{ :~{N)8 N8˃#Uj2%3= xo/.ϒ߭7-11Ŗhz ˑ>t!C=dGl!; ZxHli: 'iz\^3w"/3CǫwŵZL]:wGnoZ8Q<% Y{%H\\L.UQVTr#ZGbB*ܨo qC{e&q,crBzPc&<++b  0cMƇ9߯nhp},ڸO7,1 (?c [z͉Fܣ+buFԩP; 3w3J_(;,YI|GK"gx9sM'O*fP6 |ITT)DP/;2whw A1*:#y 2Ҟ:v6c1g' x ߞP/O_\B1c>KEoaKT(I}K"6/)Ey,ۏ˃#GLg.]=pxُuں<3楬ZpD<6->܏pYس:FA_aNMxaT#DtG{ \IB2a6Qo*KWK`ˑp.EơgzTb)᫏1}pAjm%pn4toPliFkd/-<G(%[\GVOw(w 7 G=1ly^wWZϚ8i>jtFtQ;.x`DޏGoi0b@7xǹ0>KUU鈗%}ފnGRiwFJ#V~z) z jK$s"vY~"laܺȧb7la׊WpWO 3|\ίL] o|x1~,U.t_̫zD|z!Kcʰ 9|F̉~p4\S]̅,]Gfb.Ks Fs^Jz@؃H6;I sI•|Yd>RQ (1ǵkb;JTItWQT)z,M6׵JFҨ-Q`8 )4;#wp9 n! 'R@L䱦 ڋ,';Vwj7mlrԟ.;MRS ēAeEvT/7xٜ'0%ߣi:\<_Y]H/Mxb z, ʣhu\۹K6S\@^ndR勖BU*F hЦ׸֥CQ䍕1k8it莏)?Iy%Nps?_v`٨`,4q-^ ^ 50gKh&vOXR|= pCgFJ9aZл^-U7Bs1F  _[>bжYI` >~6ʅʑо>WĨՑvONق pҴ>mCgA?8yPJ ~j >^:f|ܵ7Jn 'OCO/oG/Ƴ]0o$=.̋ywӵ^3?qDp3Xi0zϠ)@e1M\;?oi+)6V> F&R%AwWFG¹e:'}>NP84ڻWP\үEfV"mTP9l-Ι"t3 *9{};VDѠ\44^>eLG0eq~m vu2܁%aRPzyb;p1(܈feָ>{+.n޽ %rQZ5Tre|.T JP\|Ql˖ћ_Wr۱i!oVXEG9p$FabUԎD"dejbPz589Cq\ WCHBp# 0̙3 xP@etF ȟX&U[ ByrBn>ۭo//E\= Nr2yAqP/f[1 ڧQЄ(v ߮zp+Q T2mrH4C2J"NbFX%ry!C}ŞFeizWC\OO%h3S!M VVǀ~*:c5^y5<8r]? z5IJ:ո|f,7y$B.CJ%x%t smM''_ 4nm5B}8b<dE /1XSֺ[0ԦN_ qe9{sa)1|rU$g'4YݚU~)E~܀톡^$JrWuYMU1mE,M5СCG"88ZŒ3+Yb^[%x8К詷rA>x3r;Şϧ@~搈K7SESbM&7ϓ=GW_TlzwwlXio!UNRX.LDqL@>I )'vE8vl \{ֿܗr//#Axf`_xAq9C`1K+5+Iٚ4*êJG^ $Fr/o_kN}C)UG=܉ԑ<xcnWǾϢS\|P"܆xܥ.Ǥx%XFS'zD`]|jC(i)Rw -#c'0Tn{A0c)46)1$jU$ʠC(pZܨOu7A2zJ\mR$1!n"R`yHNLD,-[5dF͛,VwmIHLs_^~eB{FeLpĈ)- *oFٵ" ];0eZXC61F8r_A5wX?w$ZCjlUBi՚}wCxq+,;/EfNB2Aqb?fumɼjp =bSdNZ9XΛL }ٳ.am%3XoD8;:[,DVQ`>[b,[u+!_-_ڵ0yW" tƷ=ިS8sTg Ƨe[ai<(n )'!'U'BdLySą]r-5."sa}'Bs[ڇڶW3g2^\p`Z h6[ѲEx"*[VD'GbńZ(Z8\eJ |WrEHEK\S۷nݺU<"'qbF:1V@SkgY۽2ne4STPiO"w=?G|Ik>1PP!'_l$3KeI1^BNVf"B#+S]_5#cϴ ܓ%Eų"`_:a:w"6d77;#˻t{V6#uy|BhuTzB;,caTh wϓ%o}1ds*xJW(DF׭^!VCKh"S%|\ %@E v>JF~m`YdI^6aMdK?`{o '\9GS Sc24@$n6 bc⸁p>júЬ!FBBqА@IDATjpq\q%PT<W .prS%gD5Gϭ[:Rp)n]rCp>|7WOG~N渟m A)*t(^>YuVQ4/;;HE"6 AT "tR.חݾ\ EA۝6+"m<69ś1c]fy|a1p[jPٯ*Ɂs>צo?Ux ulc%ibN8m5 Bic/ 31!7' WKtǻ'¥K_Xnџ%AWN0Vw*(QxNdy04h+8Ь /@ i[`gSѡZ1y=@hj*0#k@Sڳ|^CW zh:F=ƙ{ |r/Zƅq4BYV@rS ot쉅:˱ C*_aݸAi|xdjק(_yvt&/;@?L{:UB=F*ТQ% ڨռmbM_(mڪe2RUUV\#+< i;-I#sM* GQ8X{ x+Z֯ћB(%'Ќ?WhZv >6سkFAyCY+x_:YwV/ U_LQ \c ^Ŝ?|vwarݝJuBM >9wNS>ם(' GQ `ȒțNwҁ)R#F@DDЀ@H݃&MoF9l1qиxyNxI9Bϛ7^IutsCNRIbL8BpJIy0{N)tE!NU$ (A&4.JT̏8Dp21^*)x&+Wa1Vn35xX!Dwzj)gʲ/*:-T%O7P+v\| .E1 /Q[_' lYIbX]+ Ҕoz#4*4M;500ˆDbUm ?囶ao!5\+#Hʈ[;BP)i3b$j&IFc`2ptKD w") &ZN`1TCoACh?e\Jw {\耒4{^HBB+VDIiެfg]Rs{Xf~O+Nast"4R#ś꟣_f`QRl׬i7`֬ J˷T[ UGƾ+YTZ;`oS<9o43:|[v>##ؼy $p G=0g$ ^}GF߂1}r ~wOfjwٚB|q y.$g *m;J\bpmf1. pQ4`7^GvDfhܙ1E |ٹ+߀G7mᙾ1 oO{Q7R-"PX  0l~< s_ܓ$I@lZGV+c"$X"pU^ ~HWd-4yy"E VQ+»r0"Ye' $(K+%п\t eJCnws#jԍViz`urBxLlRt/A.Ұu{A.IEzW2AQo#{P"Ν'0jQemz о<WaRT]lfia4Yt0 +'CUW rR%jo&y1p+"!U|%BD`^? ~ٰx\8^8`Bg'prbYъjX:(;qgהIcF.hąFc(z)G oN.0v} C^υ(͸DF^\ᢣ昢Mduޕx%1}_x]:1ag/] t-?J*?kcSRϿaiЩtʼny:KfǯX^PU%vHgb7~ثW_ύͭ;zy2i b951CP ACg6 &LVY?)+Q4fӏY#$§"5Cʜ?t_ ar_eZN)z$UCɡre(re]xFPa$crz}9mDӛvu;t[#iʱ1;ۡєk○ϟ>d5k$YO9Wų coy0Yr.Α,}B5.• fI)"ZIȤI.Wv7'0uXJEIaO R^,VƨܾSS7Ӽ;ɻTlLU_J@yPᐈ9#ksVzèR,;7rgF_ĥt9iF^x&W8@L! [F+"[sJNCxs؋H8?D8xjC UhD |~YJ5|§ف8c3j{w^F.; Oe2%p33+&i»׏=m8qp#03[xgugfe$Ha38;JAʖ-I&lDYҋ97 ~>4T<_q&]&n~AxfN)O pܭKE% 2:O$LqrsAXR*Z XFJ/igdgSɏ/Vx{2i8OXTHzɊUKC,2N4E'8s Sf>#Ih^AͿذz P[n"A֡jT c^lB#Ɂ'^hVp2'x#DbBSMKLv.nxh7hxnWIy0\Nf0 t®CCW.A9R +>#Ϙ'ʹQ`MADroC*ZfI]nҞA}';4W; ȳN0~pi>4]=Ш[w`ʍe Б ԩQO,c31fzrʗٻKp*EPMa6@Hf̝e  gjy񷣄 _xs'OF MfKz*! vqrPk2hP:[/_STSMADKʸxt>奦-A1•Z¨s'iM  ԷP||ge<ڳ-}\y5rLn8SDFJX0WE:5ҩo ,۟-uLIJyWݠ uOaRŰqojYVCU+T~XÌ^> '?Qt@h5ޑ3Q3v'yVѯ65v c Z-vXҨ!~+'q`[+UꭉC[ɻOZ5W=fy3J?g`8wa~n[jTwAf.({Ο,h|xhhܣ$/e *jfWfTגC3׮AhNkWW"F5z=*6{V 2x"V1ɭ07wqi|NF58 B&g|Vmv/>}_{Y>ә_*/CR+u2N@_w |>w05*3lHc{ RՄP31w^Uc0vnH3?qwZp Q-:h:j oè lN7%#,\ŨEo.^)'cxhF^G^]g^8>s&62gEr {){-};`}Q-;MG7әhU}%ǩӳM3SiZX0%:ΫU<#*j='NkR猂e޲\5+BY]0 #%|(,VtR4ۉn/4jpaƫ4 | NCF<payϡkpٝ_Lؚc˻ONyxB sAô&L](К@na-倨^oiVN䷐z-+lVis68¿d&->4t2 @l 6U6AfAH`5p֗kGOVu5i=>bu4RS,5JG+>a~ZG^fڠu]Japȕ<~^S$FA@Me:Kuz FU6ۊT?mGpE F֑(bR=}> ³X 5-T# y#04o mԆy9妘X1uCӡIVLtW ~}RNJ)CїQWHtVbo}IAʟ ƪB Th 8Dk5"Wi]@p:d8p O͙=ُKYc̞!N7c!7^0DNdۍX5Mgj2!eENW\c:'` 0yYu27 DHh'dfW4~EO:dLUZBxL5FM<قǤZ:vceSAY$UZUgѡϵfq05A]98_#uEu(;Td({zK:Q#N?\yhI/(`KzW~߅ڟ]Y"hF S*f4[:bēfkV'rMLҼiD#^-\ZBps:' cG:.PDV1p85b%NM1vb_;O ]s瀨ۢWv5TOǴgjp8IG+;2R~VwRs?ջQ;ѤzIxM:vW#ym7xqXٙ4/Z49 8]Hɻc$vw;7>#v++M$A%)#e2-(!e'=058Ӊ@ge-P I<հqJ'N@; a9+WqeD9sr uBvFz$';t|c2]8ygRi$ a .ww= rG1̇FhGg`4ZW!tcSx1ulBF0g] Hb4NUfeJΓvey:q;9p;q@ڀs4TV|VlV# 4dK˾gqpj {a$tHkDcG7ȊG3ҋ~_#yr #+dVޥ%^Ʋ͇1ol0+NG.Wq A*V/O7,k?d#A\©7q$0 ;mf9q1LsZ>z.x\̍f㓼t7BV:Hs Șga_#Y?F(cJ"wi$ԋJye%&Q53PVu%"ˠ:9K xa|Fd/R^!96gc'0KP-{(ePR /;LM"*g өxҀv&| l<<]Kwڙ;+Nw#RSqEdz!ϓWXֹWoyc:Fcm _/^_}x~!z$ll<!ҲUn'a[>;)3-9/xszLt?5q14慰0^2JU*W舗o B|f)+"7b/EÍE!dh#//ޚOҿJ_kK͕| QxyU{)L]8Í̠?/1fw&%uB_ j6C/,S(9>RW<ҩWtϤ7: EG_Vyrl"E9wj JzbH-_#/e!zx  qU=d{3eÂ^yڨ6"82aC )D뗉:{d:Ҩ{$'NSnѣGeo7f5'E_L9gџI#,`&BDhO;MjBİtN 7nH€0aa",OFeG5?̡RV@o8Hp Ld uh '@ҾhT).#}>< <OsJ4]zލh> |!+XMCcw uRbgy!<Ǵp> dG嚑>#sɉ1T-{]Eq˂7PsW' =omĩyUxoSChpK||sj.Z:ģz#_Bh~׳v2VصtkXǰzI'Hxm=h{cxQr~Tg 1͹*v1b1ָ+4_.f%7]o3~F&/_3g=8 +'^}%=]ޙH%B&wᅡѪI5t|.wd郮ѢzuWtܸ'/̙3:ě}l^/`̏12}2l]@wq0<rHkPxy\\t+xDI\}1G0ʼ2>z6e;LB?CW/Ο?ݻcӦMsխ[gVnkC-$u] ]?)#(^7zx|MM4<6pAPJ?1ə><ٝ+WM,L74 /Ta=@HHB'p+wBaI׀)'iݸ[woSODpG }upO|C:hj4R? B}I+Iժ?۷)NœɁ&pQi%.f~2~QX9<~O2Tؠ_>v)jT@ѭ^t(W>o\Kuxuwm|t6f߮'7k5°aUo Za4A8%!_D9Y:y j6?\#=ZǑoƠT fZgDKUSoWa!8n<VDDvnܦ?~ a׏9h2ʔ^?S,XPS4T.j.y'dRz'Lm3R&AnدK.rzثӝU#~g^ዶ5=)pW[=T惢R44h+b%=PXR)-ePr/&ٰA*2͓vRE' .|(v C"t, [и 1R,wEjEz#jKQ& w~q7V_"t(?mJ Q,ɳ̔d_&Jǃ=@c5s@tjpr&`!Sg7uCѻèWӯq1̘y!#?]C!:x8˗{/?h?Bȶ: 3*C.q#{f>*6:._҈Xqx ȵXaͪ5(U0a0kQG*f&#&>hl\۠QAjfPjhqcU4IhdL5t(7;tӵ7_zŹ YAݚ! 0U<2b"jß0-k*ʬ#n<q 27k#(ݸ.Rq?P*UMcRcBGF :w|hx'J;cg\0@eذGc"FN@`V GV8v u릃oSTQEМ;w.x ԡW ZJ;zlŒ9QR$ruҗb9d7:iis'ExΈ3xMtAE@C3kcJcNZawܕ2s>oNTֺtIrlE; % q1M"w|X6PSm0^CAPhInʦKJ7mBGJwonD(Sd~2bHWg  rږRv?E1\颮 $}e!)KG*.8quD#|P)ZTӸ:bDXᛜ2 _'n1yi4 ؼtVE܁"PrT-kAȞ0 D.=КsW5⩪DU3Pa:jddPlU`g8w)qvL%qr5+驉Saظ(X hjI9:s\OHOyT; HIXHOHBrXQDZ ;?BR"Fb8l[=]ˢA|Dḝ~4ay0 pFc‹MDm όdrGӾp<†?wFZ24j"" K D)\L;1/w`Q4[T e;܍ZgNUx. (L}*3я=q䗑r14fEʑ(0jPTڼ+G-n xalW 5ACvccPH~x^( q3% zNI2qy)*m. QJ'ق=h[ E(DIڭ6z(Ri:n,OɧMV9w(rEvp]|@X^`T!Cu\EMqg7%PfklЫ{$աN{88f (N܈vZ`(ߐұ?Fy\:v,(-#0۸|86xLLe[vz䍩O~.ww@d0d& >BP(% z*oxx VD@`{傍xZBv:3}ntzƁAu{q:#Xh# O6hYCGq^4A3!j)'[(;NlPܜlݯ Fcc˖_Y &?3 ދjcށGPiCteL;CDΟ v7Q[Z?.^1u2y~\n QcKhP IQa4e;ɟz {c" x#]f}wY%Kp7pwzzÍ _UFY d j']c%ҝ;}xm)~k;gӉE6Is1+W }1QaA@/R-/.5Oc0t 0{Ꞇ=߼Rrۛ Wy~yyJJ /_#Gy҈0(j"iQk7 ӋtR.:n8ԩS&1bĈP(ֽ˝Ɲ"W+<}ԪL'` HkVI1 B|T!$S_&n^eHk"/ypŮY,={?.yƸ!M óZ> G6iYM116 g^w;/5V'ʖg2BIc<);KKB%‚$O9${4|Z|92Gpph'%f:jλcmy([I5(ZkͱI8xmKP: e٥ ,='RP6]rBZL"qaݐ&' P{BIq2/L/.8B' ֧GPjJ mCe=UͮNuo;Ƹx&.I:=q_Cߒ٩xq mc tĞl Ś_`\>7^}hXN@aڥg|4kGg;a)sy* Ə"cF^qFe9zǯx޶ģҪ>8=Zs_,wnOԳbQv;Gѡ;عUT4}TǞo=Uؠ?+aԔe 뇽D%W'RJ=w= Zej|&sڛ$h6Hn B/Ʒ?ñhhT>3Y2ٮ~XOO/pdvgxz95yޠƵx큦T :mUJdǁ|ȆhZ A#,E5R5NSoJ7P 7rC".TAj7-_w ]( ٝ tV:ymOT*硌x&SјƾF u܉I/D(w3{ymjWcػsBA!ZƴfV\Ы^9iIE#weO#;{ڔ,bno c7gt"T]|< ^bBWhܸ1ƌaÆݔ nTP'ND~5k֠E-BbPxsΏie&_o³Sߠf |? |EOqW|>;oFI ܷ$NB)o>z6 fƨcۼqE|tnC?}FSbKOr>Yɒ[ũG׷x4i۷é@լ ! qxO,͑{.Vn[8 kY)\bxܸM?}'L9'?/uR]sDQ˔UeM21Q(<:L0#ZP)~C &Nhw~A-MUh3S˟%v%3I/4ռ. Hr02 ۙ a VT nqUNf<$/qv 0Ta5xg:bH珓ySs#GƠ[.c LWbGCr5yJ@-G2sLfi/>`.+i:?jUDvb[Jy~}X)KA/K}1p@߿˗\@5!sv'Nq_0/,Wܟ*/i Ix+juTɣyXj"##\=!bŕf+U}d,SBYu8ªD}ѡq>yII'0}28~(Z 盛"C8eGaDJO sDoVj(#fbٻհa,R%<]~Pp~UP?vl~'DWR00z}GtASJe=V," ɥ9ug)Ο?a۫TXaFRkq2a_k_X% ~AB#bӧShFE@,&ө6j .iC4M#-+Im[`EЂܕTٱDNԝZF/Sر,% ێa4c rW"ؕ`&0JYѣB JB*:;Et+;].cD5 Z2ɭuΧ'FDt0CkZXN$Z ؇iDBDTJ)YXf.cz^W|,FF|Uߐ51{Juʭ`z#0 P8rÎqaA}h8'O1:ĺ[ ˯;Gol)L/z73b d0ǕIhȟsܑ%gdP>^0/JrDl,-2"[hG;y.*55ZWhzEa<s]įP>x] d%:V!|9(V.q6VKj3u֕)W[.yOZS0Z].Wu)MxlN q 3B;ss $~C!7… 4AYeϧ̎8@,/ ¼=,OY=VĭdĘjw:TZf^Tp;LSD&I.LPC4qC҉aWQOIh8x|:9un!&ۜ$cO->+iQt=[㩔T4bg˅7)"y&L`/)Wh2*z?<@ CQcV^ГUv oAq^kT"<{9%<(^ C=b<|پ)<~Z2kP "b:QLM Z-22@ӣc,X> ;^{mB-uނ ԥ9(;ijq k?.O^ ύI^" A1qcG2c & \e\L`҆(Fg \tOkaF /͛LD?DZE}$!riLe5bPx֤ V[_)ؼp&RÐ~hQ{cnpӨ޸ '.|('ph~;TjWGҡ8wx#&<:5T1iTi?7aI1 !_@CKpnk0>n)(|:i,!+5Ւ@28ɇ%<ת7K; IŧEf$ oOoW*@3X-*^&Ehk(:C%: 4eoP*@Y&N"1LcΊWIT*XΊppr/r@+":sAj0;=p{qXA QN怮%уg!{c;J:xsā] DtI,[Lݓ|6Z/M&&"T I'VyXr%ZlἸS(n{h9k,bc; Q-CvO a~uoY܇y;(ׅO{_hGd==!Dwdmx޼(V/L|߷pr}0k 4"⩗#^Lg `r%D~>|k1gȧAѝ{ujBǚebO_*qxƨWjԀ͢qe&FO֬gj/{O/07E5J+=o(FaD3/9PɳZ}TʐׄBQLXp?cgbP8ׯ`}M1xӪYW1G݃JVHCLYt)WGwyHj3 uxED_QxYp8ڬ ǢxRbШaM@_wqі m&~T/Q*6< '_:+)[(=%Iw/Sqk?)TՈNU" s@&*H?\+|lBdN qNנm9yer:[>e&N__RYɫNUW5bG:<+ O[:[V'n Ԅ,:y%w$ѮgLq 8w}){X?\_gIB!X>fLLPXV ٕ8?Pv'qR1)3s#F )dOnK籟X\|CQbԑ[M' .Rgu;fK|`iK Xj:|.<|%G]x*M;!;&d#i@X(m;E4$Sy8}x̗W8-Lzjz^WՔrCd6;iWIVN?Œ()vb]7+nE*ho(f㻡̝N89pUpw*2/ୖrr q]*cz,D?*JZj88^ssR%)BVu\qZ5E vӚX4YJ*AB]pH9/>2NF{@ħ*d>/Zq80S eb+{]?egH~UZ2IduNodE[h!^H[Vz HnVZ/}Ux ՛Fe|U1/M1^Q o¿ZGU|7;x򴪏J%%\l">7"xj4sV*z(UHa[qb-4YCJ5ŤD&-ĺeb@]S:;r,?,㆝ςgaI)vקQ?^[Z:ggh,,<1$kҗcƫ s#9: 5@5f7Z&uA$Śei/AnK^W@bוJ[ռФ +* S)e1Zb&8N89p[p@ګ}|̍lc :pQHZVt%oA1٨N%Q斗nt(u)McNq0FocQ뛮:5Z֍ .ΛV#~ w 7K }iXcCz־vwL!MCPVmW ȽͲ! x1C#M eD< 7ςT!rpWm9=A-Rn1~8 uRt:_a=Nx7 hI.bv `Re9 %w@ (`ǝ6s!p!@pj'yZ5^9N8`vI1L/y"% !E(X\ (~ɕ !1\HT7IKQE OFR2nԙ~o_?3!A]>Qc436rUb.hxSx:VbP*gBQN_{#%}ShHe9xϳ̳|yq24dpׇԤZTUKHvazv1/i\hUUu1!a׹E~NXqK/ΟG,C07\ ZrsG~wWw/Tg*6#/]Jsyq0>L}༣6)%n4ǫƌO2mFI3{^b@. ֟$%cf̍lLBq xi^2F}J9 "MM$IxD>JB4;Ց0S(Yޓl|CC@F§}; :7-,\|ic1뻥зZgAh{Xʙ>ꘑh\ߘ圽p{|5Uq'겞~uNc|7!#o /ͫ.:wAZ(Q ӿYͶ||09 ޼/B%׆pldFABwyBt @{Jvŏ4Ctb+^,l>gmƀq`wq@,s͸ f^B<[Q(G/pg̙*?q) ƒ&05eٞ_xpntq~Jyiw:㭮Na;Y_bՑtS=8UYx+b]lN/2QqF5AM$1v=CWeQƇi8 e[Nh pΎ(] μ~)H"]>_OZu愍 .|.L4뷼+V]ώIYyХ]6"ŲCvaW+ѣi8\Ē/^CӮiP=)#I`[jW| ɌE~2ܝtcxwIp wKLYHH@dD]% 7_ABXF{5u9" j+ŧ&˥KzfQ܉moT,ZpxH% GSH}u?k/ w_AWgbX֢UN8#N\8=%va8d/<^$RW]_rtlTNi i49NCiw/j2O$DE9n9ݻk}j]<<1߮؂5Ҡ~Rg8Gko~*,d~0t?_ 2Q5?!'9kajlԂNdd$&MU_ejitbA瞻=SfV-]-۟vJx k =x0ލ xy_ X>M J. w+cAQT/EM ;d8Q %=Q+G3Qu+ ;G)#.ɻ\?6faXwQqT22DrQh8q<{OJyDž.nQ%˸ &2ˤ@Z]dpq4PxL#n6P4-M8Ù r9跾kY|[O WO&΁?QQeҧI"Rwp BbUO_AkW 'qu4"7ħ_ϡBӪ5,7Oc۽@=N}|EjRܼ|cWEa -ki9m[^Uޙq=P9^9 :Qh\1awu(#oU36T(ɺصt\ރ:娞lȓ~y5ۼl_<H>7lva+ 1s{rx 8`MPł- P v~t95Lj uϟѣ[B j6m19(vPss4+wv !R ] )K9O3t U:8%$fc35R(kPbw- Lgh/沙-b/F ) )F۟v9 uS<Ƿ 6u9[>GyTidǞ1$SYRQj@C8ˤ ek,g+DVCrpքF{W!:6qJ͓ةEnqꑙNh[;;N'0?G/cc=pl>Yke,7{Rx,&F9,I*ءPp4^?ynؓ ~$ F h àfMo?[mq nHt2#^9DTcSyڕH?šǰG򈿀fÄ~ǠMxi;J1j=ϢZm[BYS}i:C?p6~po~ 37f.Fpp9NEzQ(zlF0+UNf\-kQR"{W֍f}gʴx -+D1:TD>"uzDѨd9qki3q[ M}y+fq7jV/@xt3~{}t3.%#Ѷz1 p+;i~BW]gkOc@~MWbEF%H]\>ShX]Drϡ ޲xFgb (ȝ84)\? +}7WNdvZtj+tyb;1[Qsl|%ҐL4 -<ٌj=T9T10&RC,6sW3 Q`+):Pŵ3qppBKdwj{HвQi4hdUfWc*KoZL9〚b+P1F>=l#'vőZMy.nOCɧשp:N5qCrrtr+ a?vDZLNqyzݧ^E5Czt8y60"@XR$`:ĝ|h \]!Rb`}aH3+W@J@-xY1͸P>VB/w'W2S6; ̯Z&ƪ#؉f'#w○A^/H  :/!;_U G?+Lr)ӻ0-B9_WၮmNugٱ8Ğ+l[ShEI4Sǽ߻DH=ofxV4(1~1:y.bz##%u֠oT Ţr2NMLe'}q3lɔ"S"we2N>_tOzG_"6 <>ש1y.$wE't`wDžxccOClSg/9pA ӂ`•6)'dXuxѴeʔ!&DRR^1 Vw#N!VZaٲe;_~o;Sxeao7Vn<-E~cˀ/4 V K5q Ƈ@1\c6yl=}x&S` Ի-R9IK8ꀓ+Ґq!_#֦_OHZ!帲4&NH㪫e#+2E6m\o6wNg8t!δT tDaQe"sr,&Hjh:n)`$NHG\t~R]Q;`ɲtx]*h6Ƒ!o1jr2fblk_4'EޓxyajxK2y0Re(JX>f!-/bWвZ)uUBEr\ݡ / ǠWOsU>ϻI{N,Z(l6| Oo_8;%Kcǒ8jCa_}6n1Xd;D M؛uňfJ>n8şƴg"V66!d9[< 9OUkGmؿ{x1[D`H#c5S0V_U}Fߦim5oz u'ȉϢld|;uZ:slj&_» ǻ?/tCsxlH BUZuA>P'͜Z:xR,3ZrǮ]k_߬b^[O x[܉MGvbH*Q+DZx=v$ d/T\ 1ER_B)j?:(-2;ƴ(h ///%s-qzfRBUдik믿#q ܹsƧ~}EkѨQ#<2yDD_7nͿcǎ1L:<̍ōƍ;T%ӦbR;)8Z=2fd&6>gADfDhY(?@0LxėpF 3qqI \),bLOPmԑB98Ƕ3Q2Eh˺bUS4sqfcLw@hO]d TJvA`:Dzx݄A0äX s{3pB  tB$EA593x5lP8w3eʻ,UdŐ×_%cer"uE?RX0Q@)&@f:^bE8\~bB%)΁6̙3W ѣGBu= N%;1qܹ(nŒjbʃ{XݵMr^ȉs:br7ÅVHS3Z<2e!hɧj[4tϙ93\vC,֜`c<žViH~M,-^;8{xxHj׭Ŗs*3G]чm+g`xU4oE}~o+*֨MAC-_  U%pHޱWJq0l}-KD1aGq n_wEAxڨ_)gb \n!&!ե4ipJ)ro8p uުuZPgeX8WLR4 q-0}|{ C uyϙDʘL\dw E fHBBJgꊓ'OƍSrtҡ+WFNln]fIh"euJ*Xpư [ }РA7d `[]7ТE %0|2X\P&e <\yn/ F/Ʈg O9'˕n.AJݓrF?1EKQ*(1\e5.pY_'*ȫKs0&xiIyх"clyI#V]/-BSFEC{r*utC ]KTIVA.a(G\0 &734U@o\{cy~QvY0k G;'Nevut9u]&2f\ci+0@Fĭ<*!}(dRZO8I9{A?GFB#wwNO oZ_ANB* R1f̘~0wL0EUeL"uUՕwm >{[RRSSuV%\FiJ eӸg8cB\:zdcGxĉ@NevjU}sŠS7Z,]l^PUh.Fh|2hA4J#*'y`7^)9 ط%w$;]b\5t~Z1rh(~;е깎1d8D J-ܰn[zt9䘁7Cz[gѦ4!<- JqAtI !wv+ Wy0LL$5GJG|6z46X2)g'iNC]vAOƟ3>DX??Rxx3` ^xiC@XJ1fo8HkYG:7K|def/ "CةZhH'4Hd|5Q5¤:e!c˜ocE6&I_!|9䃅xw-{~\Om)*Zعs'%$Y9re˖E|㩏m $:%%E]+^uE!RyH^q# ^iL+11r-EXXM͏]ŋ/?X{wE RI3|S e:58pwYdE˘)]X1=t0G(p(F Tu sBp3sЂ0GrYbҔ#>:Nv:LØe"J{:*k XxbIGeG`@!q@w=nR&v$_ z)̄InyvlMT]9ip (XPit:#$و?}ܼx(|s#59Nj]qtBU6Ka?W6 "R>]hj8 _&U'$OϮ3τvy5WDzm &^s"SXדJ&ˑ*/iɱ ˊ@h ]崕Öe!s +E5ś`<%j.^(Y`(62]:491Z ͂%#SLQ`v(2@J.ga:ى ,,f趣ۘ~ɲdoL %3G[Ǘ d#?snM=|]er&iɌ˄&7?9ʑ:'՚ɟe[㮏 ;8qg_z}<0Bˮ񢄲).^ȇN\078?_Gѯ W_kZ'3C'.t| l8ZxcLB[[mBapɒ% /vQBQ\GĭV CW[?"<󋳇^ouRLL ||hyβ"cW jnp4EUlfB ^@&9 bBiP~ #`$~S۟vhf|J#H}i1*BmǙ wA6<ֻ]~ѮUؓ#HT/"͒ӟ ,.\q2TtK|N.)Ht[ B}p AHB1(SBQ~4_d'3<ʁVRː{-z!TZUYߕLdwU c@~~0#̀p34rB68*^ΜO~~.7- p.`8jM9L#rOv#Uy4 SGU%\6i+|$K'qHoí4bF+pvgߊShh/x֭8WX}mL&99%TӪ niLhm8$*7>#pzV݁dxAp T59A).$΃+,kX_e%0ow&Qsu:@Ocok\FQ @IDATz"eWa:vo\ÝKTk3*ΚOf(k%0OY}贈'4 +-^/3+bDSTSpKKrg_OM|v(U):u(p˖-be=ܒ: ?c0:N2mf|6X|DL+fѱyȨ@rT|S ^UhO ,ZKS1E eZ$S$T+t€.06F nNti7owu_Y}N.ްA]7uRiDN3x3XqHaya۵d};6ϋ>Sύ)c&Nzh.Gr zUBU9[ ,f|qWi^HFΜGzj >}:yiOSJǩwHֽxU0F+Oyxc8"R$`YA>8x SOtb>~Zt|g6e8{s7ɽ}NF a\b}B1#"Ȱ Č4h%;Xܣ&S0h0B>g*hra6<=2R)5JJ\.c&`(΁#AP#yƯ[2U}Y?ֲ(eb$UTP%J0=u9MAV9 #uڽ\?B ݽ{7dt׷l_Dq.Ӆdm;OYY鈏Kdv7;V&+%1iN(˼<`ǾKj-1zkD^J/+EH?/@o5=%pBwjR8Kk<&vo}BmܸQMrr}K0~x >dW h;B@ 0f+Q^{5U^z!*** 9$:2p#atz]%V[ew5M0(swL.̴,\"L='6>^t+cPH'\0mPQ4q!!Kg3dqwgW.߂ (ឌbu0f 4*KS0o{_AO=L4J[i˂JLE=HNqLg-EW˗dߞkٮ!!>^ , r1!.1y8y-k3};k5 B*EKCx7k3ԝ*ѫ . ~qd/ .) ^~(X\ѐDd]D /uEh8@xh);́@xʪ9ħuAw(UN"*Mov<]Ěl=0{ll۾ +Vľ}0i$6lg o ݚ2.<"d3HT<djR5s1 ;oq38s}R˺5xnI&jw[|6RW7Tq^Q|sJp\8y{ 8ranx J5{˙X: .Pp:I B wyh8mژ'ipzP#2(.iع, y^l኶x<K|dћbj'BCfWHMY#GOg!8OvpEi?"Wi~COCpa%<0 _Oߏ.yj<<'F;rK?^3~BZw0]M$Y/9%ez  F+B+ԄtORi pFfUxfG)@[ @R~غt*} eU< w}G/^S0~\sQwPy| =|wUWF|Qa>$t~q.|""S!99xWOyv> "_Our̤Fvhg).ҳ6ԝ's/ͪD=>K_\wpPt4 9T?ȁ"3@ǠC}n=S45x WַcP( EowM&IaJ5L$%4SxK~hv-0 S:d '8qМU*@x+H.%0+#tt@ҡ˜i2eM F>HOR1my:Fwt]A0&PB38x B|=Q B(|QByZ{"J4*2f+P :[\@=m8Q{v@ }'׾.:{/~l&*2t^Yڡ>eKjJWb ЯB(b' U^ªQq*y?.+!c`ߡw8Ad o>aS6;5%Al 연bqI ȼ(R}"& y~q_(QwW2./9)*X Kc~V! E@L9 #đܵ}3 B,߄6'l=c- ,~ 'b XE%:SaPW7[`N^@h#4_+3#+St&},BY`7b89O(W'`=%޻*'!)NGحrD3}ZY-굫NKI[(i] V%YhL֟:OOy;K_s3e0(΅.=)Fs+d{{uT`j& ?GTS2'Rox`Tl)Z/sk56AsCхN<Ȯ Ô+~_ZFc]F<}|{t.sݯʉ/00pa$_)qriL$l+^;{&\L#.hRUhLܩteCsygcw [ߥ֎r~c Nayme 2]8Ź.qųf`E:5JݘW[Ѥ#Wh= VeXN N:Bv88 p:PYpO`mӏ>-Nx1xUrP1VohD0 #pt,#M!<:p@ԕiӦ)XbBڨ8P,:W\jK¯~—\پzF3?eK߈%Q%qعd NX^1g܀w߅ϩ8|%t8!{xqI^Ã_nxd#eu\ WLa "(?XG0~RĔ} e\R+FM:{VT/aE>;?lWkC<-װ;\}Fo&\P<>7 ]#A|;fѯ> 1yfN+mQzvAX/sd Q=#;% )|6/Oa>8/<3 |3vcfX6}*10.p|c&32Uw _~ĥ`X o8oW7<@jW=4k?޺cߞwD`8NZGc>D}h 0Ϲ4BgJ|7p|O8x4_;CC!6MywbT< }"U jz3\9nzNtiV gbOA9CI<A>^ sZ zR~m<'ςerPE4YAjYT .ǻtFA+XY )ᮭYq($SC36.ayIeyjnʁO>D6^x?“GA*_FZԅ}ɢs05v!ִ YUI7ܕ)K.RW45;mwvh Fd-Z O8vUiӦHV=մ|L/6ܺYj{g;&Sano RxVկAyJe3jV7yq7l$T ZroSQ;8 NĽYx+(_/GRN^IC%.p<:zUgN_S6$ PV@iKҔYxc%<=i2"(nF2θ܉o4LT/ןFiBi0 jz\Tt.aByl茨H1.!wi #٨\c*ĉNW .rØn_T΁GmbǎSI(W.]eZBv_j5ZE".,9*Nf 4.c˫z=X03 KmN`3}\ƺ-'p%邗*2$kZ'*w♡G %MhM(T$\'ϙMwq9!9{1 kI}mb=hX‚e$HANb܋B'ѵ}Y! REѶ0LKT{ ȟ#FlN֡Uu#WፇۣۡӖ\[;"|Z5T}ly^xn~6 6BTGU*Df6]9gp=X~v`h`,.6E<ӻ#}h5jJɢyMPf~m L]ꡚ$X|81-/*D?ydePX㮗D% Y_Nc\r:t(FU%\P6%(Cl>;j3znBGE1oe9?UfAD*9p{djժعsB'f  @VPd]a25e&`ң^/4I8$  dhI'S]RVN3<@K.?? X/dQvk6N^J q;(=G 7^Cሊ6Q~HUDc>)D %IC2iB *DPhsg>.8]KO9njcway L/p.n*.7;kV4` .āPZ=|eh·~QGxx׼ (PpU'NK8y2\dZ/V _`wv\RGD9Xe6_%,j,@u*x;s Ġ݀iK}4ڧN6BZ:L90M- 0nx)Jb+3Gޅh$` Nh,rw`>N.Wӹ|@Yq牱6L9y)ߋ3g/f5Fl]iN{@x?*_J)cu8z)n䭨bfr#oxu4+0u$? Xø0]d=EXѷ:X!߿AQ ݻw[{suJ)>PRs- ~du*qA۱v4e=ߢ|0lhx[e#%=._Nq18(#* ¿x\4dT͠V0HzL|KoQGw]0?'kaСi`{[ 3tK|n:]pJي;HTRYge'Ewb0^*1By1e$_Ɖcw_ 6f* ˛NO:Z9V@s.4RCIƕVw>oKPR}dd$5kf ѐzjCSIGgK㒕F-;P~pߪ?W[ dQDK.U\~uߠ Aqj@F՛T돹o7AIAt&TYO:pl3M>ȾK=TZKN5kL( %•9K'MPxvlq.+>I됁:FCV|Pntgc+','Ƒ3 }:MA:\?m~/? Xn)8Vg[ę[{CK h}7LyA J͙.$N>rDw&a>F߮MԮL3%1ڔ|rU?+*RtRWKHAuYׯwFx]3_=4^9ڊGk;V [nz_[W﩯t˃{aа+1HNvg~gXpߦz2Iπ`K#G oKYO# ^zvz|r %3Y!Kpgux`AOhX0APᖷ8mqzdf~dfNUЖRSI,8d`e dMRuW5T5?4Λן@hOb-瀞8FЃ>U2n{ŗ6.d~NqƠU;b[g^ $EK*3/|,?J7ۆƾ-ݟ uU:Ng&IIE2j9wn7WK#YξA1:j}Wfb?S;&̹ memC;вe"::Zus5>}rW8;wEeU ciq飱bкf#Ƌ%|#.`̍giӺ6+ٟ+h!L4 =6B{W,>-%.ުz*wSgvpˊkGn3rךg6XoL T:t+~0Xm"Ɯi%sURq\PA35򍸇GN 'OւŠGuޚ8poIfMFv*5~ZX;Z腴4I )J/~р )^'Ud|LΣ^_Tu]`T6F$WEAD@zQQl`}goOEl>QP좀X"(U@ @ $ܝݛR";̙s̜3s*]e4X(ШBiC-8tKJl}%rfc+U 1˭V7g)V=_ں8H=| w/W7̟1uutx6/C|+z0nlm377 e1^1BѩzaIx8 $(-+ bċyWq.Q sSRz\Z&<^(çRh +~_x:ԅ8k`EDjs?q) Gp_ !1ΧfOoN}i)`R>,w()lK% +*恪 sK:m\ F]q+'P\^KёbOuq9/?\Hapcoa](y&fZ̐d~=c*#__;4LjM~4U;ɯ9~cP[4CΛՅ&ÅRUNḇrx# Ua_6P#|o,sl}ZN N 4ߕ%{L0Żxj`3C]4{\=H>ѐ́R ڠCC>!6f)~U۠YxX/Tmi9! 2TF r$0wi6!UXR%!R.DF/1U,ۗmk\Tr~?,s)(,-d1\L ^CHaznʒȆ] >z| ߟߴ?ߙWa1NuEa0 /y ?* qGQOS] ';a"q<ˋ].!#$N, G+ $]Ԋck1` Ou>sהGI{ x&'>g9Mz ~eMEMB )yș֡.sQSO~ﮈAuT O2o:}EضNؕҔ7ߥ7-ش7^9uxar \W"o!Yh y2J Jw6BĬ9s1ĹKщG|}q&u"N:vO¦JD7KSo _ڀcg+grβOMd)]H.K߲(4}%]"/<>)S 84J7OW}Oc28\:l=- 4u l^2YG#d^)AB51\\v؊nd(PO|\;/A/)EKiw Ғdee'X^Vz䡼92{vcwn>dJu9xse 1nhJ XXä.a]((*WH=Jb}2sVEyw9Fگ'2~3SCØ( zjjBY% 5 kg)Im˞'s3,]ǏIxא {O=aH2߼:¹󰥪-Y/=lSNcS8ahC\y/@q ,]l\W=xQT5KK*GiYbࣲ@J BO;;%e5⽢;Gqȑa%Lmmp6;e5vN̆T%gL+*& bJj oPu>|b"=`kqТEk1dY=}1/}|Yyо_w܂s(<8]_h2?z)** ( ߵVí d{sva;dރYܵ܊"~!EGzi8% 6Yԥ.{+-_qup޳q!oΝ۱וXwdd{/#\yQ)Mkٖ/S.}G_D ?%Äd>s%N5+a@l|h{cE.[,.\ď9Ѝwa\ AlL@p".ĝnӻg*pjLtE{b@~{S1F$JĈ~ /\NU 3_7`O>}.zRGX\q> وf՗xc0 Ccgؿ{糞˟|>-o\w]Kvm[Q+Q@wуPS4`Ncx dH@\JFwxÁ~J5+h$%K#/†'$.҅/۱"x᮳CP&am:VׅE_۱ h"p~I$zxӎl ʙ_OĦv<X5XɻTG DR{=O5>܁58 k*׌fd NHg7FcF9h`E#I+-NI%J Q\T¾^R.Lr0 Qi=OpQg9G y=[[1xո3w'Kq `xT: /<⌇b+S#3~:1ѽ \7~w޴wOFO Nŷ7>@!h;; >׎8'9=i[O]/N_%zb{qM_pLZr_G _6囖aSp{0ipkdoO2 {۩k)$2p/aL{7Rt&S w@l[%:6+܏~¬+0ި F[_a?q-H 7I#MgspWb#=Z`͎lx!ɇj2"o܍3gbL~^ wH|0s ?xk;09)]V]@M*us5cXd4z]R';30}RNgިx#BH`B< GǠK;IDATH>y䆏fe ?Ϟg&ng˺=z\߅S/ݗ_Ŝ`}8Vmم"8}mh]zSeߥ?ѱ?ㆳ{׷nY<;Fp.!*0haG0rtMrQ-?D?]4j<YuZ;T:b89-OOϜ/؎.~ [I|NƄ ;qX۪хG Wl D 61׆CNZC˷/jݺ!` &"S 6Nƶ\<|ĕ1<yx'3mou`{?㽢4Q˅>NuZ0"9SX L}mc7➗%RR"ߌVآN Zt:W嫰繸 TëtG1XOسs32rծKj^/!uѩ 3sq"22.? jЀޗ;Dz!(') 5l O\X,*b~B}/yy@u)2~kN!VcS:,ނOF;f㧍cOF&V~8)#oC@y>6OEe1nh0"#cv(cf0Fy\:/nBBGӍS^{m<ENv3FBz|Hlс80{ ?cƝQN&lA>_叼&h# /9\n( ǸrL_=n<,{񜁊vQyG,ن'Rl6l'"a.)tV}p~ŷoc"qҥڅo֨&t%䐪r\zˆ~jAGO0aaYEa)bay*_Yu0&gU4Eڠ%NiNNS$ÒΤӢ@@اHt ]EQbws1itt 휊fEɾ-pbO%MgLw\P{TtƜoկ{Bjb$zs1J@{)Qn8nuqA>uRKDR 6ETeqR'z/5 @yUJ[(-[B w#h!lGhZgw,{pj}Kf;.3m.'E ,a6 +Ue!xO&y ,PE XսQ…Qć"K/~ 㧽G,K= eoX \ ?-}L{EyB4X=Ɍ嵹>q:Yc(7 =\)#99=;@ȋ 6еsG{ܬh7(Xt7|1߰on*3p$2YeiaAԐN@Dh:<ۈ?u҈HT'6H{wiE16r.y' hV`;厁y+\!zj1&FpEOXStD:,D ~"`K nS[\VPoS!R> #-rU`LZVo:KNhɎYC5銩R2HCJgE|J9* ÉGEdVMvC5.ئ 0> 5vj; PB'}z Sյ#NwdI:A`o+8%͝ cg- 4 pva|FSNn-, ǵE֍E١:f`'7/Ɣq}X,%S_Ŵ+d(`5\u G('$‴'"#kj,]'B`joouH/sgbS1HVPg<#8j ONl9[WEaJDuSGGQBq0l`{HI/^.r<DcK4 } ?rɮ܉(pVN9/Gˎw1Վ UX։@$-^kuh 2yftbS.ZjPh4t}:5.6W^o- O_qiHgGg[i`aBj+\x%m fko Vb0>5aTT<`5:-ڶʹ^5Dڼ /-pߝףϞ1Lr"y{7o/oW_>s18))jn6LM?}?wMb[W8* e_}wGr:`ƕx詗0rڦ) w܆^Yw98uE\Px$goT =']kw0ѫGg؋vӬmT Mɋj#`ƭL${SS1)nkWiM~" S'U 1__ueNYb8x^Encm!Y( 1ZO;E4Yܬn1ێcљBе <>څ[^D6`U0 I5ꡜ4 Ʀ8 I!3p9Y:H>)?fWOXPߜ>Rf&|?YhrA=gv|v4oۋxOq19W[!&)+ȡIx(]0^AQټ* \d'?ϰ5׎/ލW`9sarwoe6sT1199.\É>'Ţ#(\G3SXr+c-:q[b%/>ʸ$ 1 ~߮u<&uƜcذTABYTLٸrJ7߉׼sJvkKOnh q2fpr]\1rj?lA+i]$#*kY۬-X4VGgzǥ`㼱s03p6@5o܉SVqmT?X(LN[.0-+.mٯ ?Uשws_x,%bqC Hl~ 7[͚5'oT0CRt@6FR* ~I f/u (w҃'[&@cW?ҍ;qaa1[&{$(dQ֋^T:ŵ. rȹyj{Zgl_O0qBz>1//L^OdzDBZe ̭IUNrQ4d:[΅ʆ<O u hȽpN[80VBO e2.%*ug$D) R?' 4흠4ޝ.dPڶ]wG'bF<㈣9D2] exAO']E9ߧy*0)7(`QLmdZ&Y$Hw)Hf^Hu}ߍj1s#OTͻwwn݆r4aJ!R*'i5=U*9xԮG2O:]&֓~% 2~ Nwq"PHt=I uV?_'CDl Z'JII&̑4kVCMT<6<__ eόg%Kh gvr~0=gvIz9#aP\XX&|dMB(;ŸzO= @uq*ڲQE܎* QL21BpxEĩ'Es X`!>Td 2)|^s~7'?d"s;Wcz:JgBg"o[vD0T}QAߌMMx,T A#mp˜ܵ+j'{܍<`U˩D8X+qjWCAO Z}iڡ,mQ蠀aFK*&YNC9O{=9]`/Ư\0 !i=/ Uy8fYU9Ro$~MzrF? !Y5Nޟ=BRKgBBwħ߷+/'J;`^oZ#nP  RdŅEbE͹wϮBa9`ؓe맊1x8 x:iB"]7EQ+{+?S^+pj޽{QXTȏY ~&Hvw mEչns,n)7ryP:+Kq g>qֆn,Me.:LN^M}w]L#,gnRI]^$Br{CI& E7F`H{8A-8<_#+!i`2Ǚ:(`QR@ϿaQ΅(|0Am|p!XUXWoVD!*S\gge"0VNZ"%"I)/ƥSB"n\2y|_2̸~&9Œ upo+  ؂haCQEԈ$8Ɖ(i qNH^n8Y?٥$R|NpP}>ihbM qQۙwt<h9r O%t邅 *P5МL0 rI|cv R\Lo63v#DڣjLOv %"DrR" g#j5@owN4@K- )y/}6V/ߓ|}ZGF/t\(MY@-̙"0h~9_TF5k`.P# 8sGjD<U#@CVB%ѕCVIG mY ($Ϣʶ, )y#ю#YhU桥=Z6{Y6q"@v Oh8&yzBBu~:hG|xQR"Z`g|C rNg+(WDiK׍ZȺ%`ޅXzߣ V-- e Ԡ<\{%WSG2 (HW ֻZ N}pU^7o}f̓>HxNYHRQ '(..VBnXLINΝ;1yzwd`78F۶mԩSQXXvUlx'A[iRRu~dGqKVVECG@nȊjcG}ė_~:9FO2$TSIf:iT҂N٥n{6qmT˗rSut]fxcL3:2kܾO 84qiN304 FDRMd/(p4S@ 2,{ljw&z괛_Mmg Hux"27k7܃ &j:z ,E @ue3ݻw@4D +N;!gZUCL{OL?"*]" ?$JCm;0zH0\Z53b%ǵȑẔ%`$wa8!;L8i8>A3Kn /\cnF.A2^. {,N+*`XhFb(rQ#UQXR؂‘QS`WUq\p$RAhŽ޽ 3oi14wO5ޘjKYB['""<[T#+9' DRd < nq";poFRޠ"vPX ^]´$m(̐ۅr !/Тb7!6Hz%@-lh/NhtdHµ$`}k|ajl * f, ]Pߺ マ+ PU2(.8)'Z~ ܹ:uah˭~t\11vf!+ ?cVgWS+)yN4o^}WY >=w:``vPtN 3[MrsT ~qAט 8V&ۋnZZ0~"FjyaT>楯N:^d|#J_У߹`Xh , 4= ظ(!Q* a~g D^g`ޢ ֵ-J7ESW۟G|D)a>mQ>mm"-ƆoX!uDR*=@mdq=o10 R 2/;a гŀD^~WxZ еMXWp w=.] R3Z3/ń7ͅ+pկƫbgẇT)AЧZVТEPQ Rw-8ۡwWeeeRBN?nށ qR!ʆą[NF/wr>{h i q81w ߹)-rYwAc.,Z`:są஁(n9ѣ_ .@#JTKA~Dpvt?B?#]jg 5e,fiF>YAW4St`: (Jhq` r)C@K85N e=- /#ڄI5<#n۩;f^lI29 {˔iBzg\Go[T:^tyjOCQɱغjʫ*)տPvH\ `P5SzOSUah׽8esUmMAC?j31…#VmLjӖy^Iq%BF;>-EQ xDyw_[]+jiQ)Q@1A ur F#^an5~_ɝA^Oѯ -FLS?6+I"1HS4/pntUΜOEꤹh*7閞I9"`9MxF ð 1)G$g`ƫ p )mcG\%?aP#&ܥxO.ʧ+2z^;מ{2mcbs4f>v)ޭb["txg#: O&ysD|@K(&\9oFij?]Bgp@X4;;SOooƜӆ!2w^u g]{肯PjzY΢ER 2x=""Es DoQ]EHZJpJѠξ A z2 ic餺#3Q`8dYt}z\cVzwў@w߳cv PР?N &Z3j,pa2k* Ǝ\t5ِ],g 8Y1u݂ͣfI6 mxv"5Qkn@T>?&iTLx{!h2j+`QIQA.-N.O%ם < / 9^0t|n m}.6' {=3 F"UlUmXFL $v^{8exto[51U :+[u^CE`( 9k\c0 l)Ga#1۱#-c4 o Hk?} Yih澁NjrLJ aYy/wjj$aO(LROo6L'BnǓO>|'Խz"d5VI[ <#4hyӴMN.Qr+믲m}G/Y‹@e?_&P/Xr ~"})ɵ!uDN.3sKG pgJ2^G '@a*n<*n%k+$R%-Ne(kЌuHh J/~12_ax`p6C$<+uV2(6̳@p x,X h~B 'NS}zq@c*2蠴VE2sL\uUظq#:wb TGlPvْpqa<f7*"uj+,Ꞝ wva7I|8_f;tlAgrd(pd) cF &Pft2`@9]`/a`(%$ E׮=6@dB2:ulL2f٘OJKUQj0PT/~(u0G(8u)%g9J.G}rvmX>p)r8ݦ#]/|Mm6q'v,Wytr'5NXёR! C@@5"_6A7>y(|t"P8tTN-mN՟xa; rVQ1fcNsmn?i~DX/gQiRtk! ؑE-S{_; r|!֕%,iUy~:: mD r(iL6 3^-4(dTȄGc$[ؔ|ϔEe, X/@hQ\\Ux, X( !+* ٕBYen`hɃ$L{`|phPO ёJ78Lql׉g3 =C)vEP 4>__JD:SS#C~ikQᢀBqW.C}4SH deʱ((pDB@ךqdrȔnjQQ`8jtOƣvNk8Uhu!␘L uvcax4!;/}; [2A*k fQpR_PgVY, j .m TZ- }BX=Xob۶RU(b Dة_ꖠӤ Pa#^ ^Ǭz}^}\mN9?ȋ;wF6QJ X X*nâEz)pDzke%X(`Q`Bo`lRL*R*4>2ɿU/6 o.?uM biʐ5H8 gH9/\}ip`J9gBi BY0( YcXHo u .,fQaGay4fJUR'w"w(bK]!v (Aff|1j8ɭqƨa|tN94.|ru*cQiR@Cxf,Z=X΢E@pp0֮]!ǾXf?- XP@F4*;/KUEdȯaJ;s=9O1#;|ᬰE’ ff&FMgQ! ХKwg bY(𷧀%d4Wh v C eXG5XZ[R@?Kv*MK" E"XQ푫UE, X( Z߁EM@d^P{ , X(W( RոBM iQE, X(`QE&Fa*WIENDB`